StarlingX open source release updates
Signed-off-by: Dean Troyer <dtroyer@gmail.com>
This commit is contained in:
parent
2cfd128c20
commit
cfe45dadae
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.swp
|
||||
/cgcs-centos-repo
|
||||
/cgcs-tis-repo
|
||||
/cgcs-3rd-party-repo
|
202
LICENSE
Normal file
202
LICENSE
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
3
addons/.gitignore
vendored
Normal file
3
addons/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/wr-avs
|
||||
/wr-cgcs
|
||||
|
19
build-data/unbuilt_rpm_patterns
Normal file
19
build-data/unbuilt_rpm_patterns
Normal file
@ -0,0 +1,19 @@
|
||||
[-]locale[-]
|
||||
[-]doc[-]
|
||||
[-]dbg[-]
|
||||
vswitch-staticdev
|
||||
guest-scale-agent-staticdev
|
||||
vim-spell
|
||||
openssh-server-sysvinit
|
||||
openstack-neutron-linuxbridge
|
||||
^libcacard-
|
||||
^kernel-bootwrapper
|
||||
^kernel-doc-
|
||||
^kernel-abi-whitelists
|
||||
^kernel-debug-
|
||||
^kernel-kdump
|
||||
^kernel-rt-bootwrapper
|
||||
^kernel-rt-doc-
|
||||
^kernel-rt-abi-whitelists
|
||||
^kernel-rt-debug-
|
||||
^kernel-rt-kdump
|
78
build-tools/Cached_Data.txt
Normal file
78
build-tools/Cached_Data.txt
Normal file
@ -0,0 +1,78 @@
|
||||
Data on an source rpm:
|
||||
|
||||
location:
|
||||
${MY_WORKSPACE}/${BUILD_TYPE}/rpmbuild/SPECS/${SRPM_FILE_NAME}/
|
||||
|
||||
files:
|
||||
*.spec # spec file found in the source rpm
|
||||
|
||||
subdirectories:
|
||||
NAMES/ # Directory contains an emtpy file, where the file name
|
||||
# is the name of the source rpm.
|
||||
|
||||
SERVICES/ # Directory contains zero or more emtpy files, where the
|
||||
# file name is the name of the service provided by one
|
||||
# or more of the rpms.
|
||||
|
||||
BUILDS/ # Directory contains emtpy files, where the file name is
|
||||
# the name of a binary rpm built from the source rpm.
|
||||
|
||||
BUILDS_VR/ # Directory contains emtpy files, where the file name is
|
||||
# the name-verion-release of a binary rpm built from the
|
||||
# source rpm.
|
||||
|
||||
location:
|
||||
${MY_WORKSPACE}/${BUILD_TYPE}/rpmbuild/SOURCES/${SRPM_FILE_NAME}/
|
||||
|
||||
files:
|
||||
BIG # if it exists, it contains one line, the numeric value
|
||||
# extracted from build_srpms.data if the line
|
||||
# BUILD_IS_BIG=### if present.
|
||||
# This is the estimated filesystem size (GB) required to
|
||||
# host a mock build of the package.
|
||||
# Note: not all parallel build environments are the same
|
||||
# size. The smallest build environmnet is 3 GB and this
|
||||
# is sufficient for most packages. Don't bother adding a
|
||||
# BUILD_IS_BIG=### directive unless 3 gb is proven to be
|
||||
# insufficient.
|
||||
|
||||
SLOW # if it exists, it contains one line, the numeric value i
|
||||
# extracted from build_srpms.data if the line
|
||||
# BUILD_IS_SLOW=### if present.
|
||||
# This is the estimated build time (minutes) required to
|
||||
# host perform a mock build of the package.
|
||||
# Note: Currently we only use this value as a boolean.
|
||||
# Non-zero and we try to start the build of this package
|
||||
# earlier rather than later. Build times >= 3 minutes are
|
||||
# worth anotating. Else don't bother adding a
|
||||
# BUILD_IS_SLOW=### directive
|
||||
e.g.
|
||||
|
||||
cd $MY_WORKSPACE/std/rpmbuild/SPECS/openstack-cinder-9.1.1-0.tis.40.src.rpm
|
||||
find .
|
||||
./BUILDS
|
||||
./BUILDS/openstack-cinder
|
||||
./BUILDS/python-cinder
|
||||
./BUILDS/python-cinder-tests
|
||||
./NAMES
|
||||
./NAMES/openstack-cinder
|
||||
./SERVICES
|
||||
./SERVICES/cinder
|
||||
./BUILDS_VR
|
||||
./BUILDS_VR/openstack-cinder-9.1.1-0.tis.40
|
||||
./BUILDS_VR/python-cinder-9.1.1-0.tis.40
|
||||
./BUILDS_VR/python-cinder-tests-9.1.1-0.tis.40
|
||||
./openstack-cinder.spec
|
||||
|
||||
|
||||
e.g.
|
||||
cd $MY_WORKSPACE/std/rpmbuild/SOURCES/kernel-3.10.0-514.16.1.el7.29.tis.src.rpm
|
||||
find .
|
||||
./BIG
|
||||
./SLOW
|
||||
|
||||
cat ./BIG
|
||||
8
|
||||
|
||||
cat ./SLOW
|
||||
12
|
70
build-tools/audit-pkgs
Executable file
70
build-tools/audit-pkgs
Executable file
@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
|
||||
rpm_compare () {
|
||||
local r="$1"
|
||||
local r2="$2"
|
||||
local line
|
||||
local f=$(basename $r)
|
||||
local f2=$(basename $r2)
|
||||
|
||||
rpm -q --dump --nosignature -p $r | awk ' { print $1 "\n" $1 " " $5 " " $6 " " $7 " " $8 " " $9 " " $10 " " $11 } ' > /tmp/dump.new
|
||||
rpm -q --dump --nosignature -p $r2 | awk ' { print $1 "\n" $1 " " $5 " " $6 " " $7 " " $8 " " $9 " " $10 " " $11 } ' > /tmp/dump.old
|
||||
first_line=1
|
||||
diff -y -W 200 --suppress-common-lines /tmp/dump.new /tmp/dump.old | grep '|' |
|
||||
while read -r line; do
|
||||
left=$(echo "$line" | awk -F '|' '{ print $1 }')
|
||||
right=$(echo "$line" | awk -F '|' '{ print $2 }')
|
||||
left_f=$(echo "$left" | awk '{ print $1 }')
|
||||
right_f=$(echo "$right" | awk '{ print $1 }')
|
||||
if [ "$left_f" != "$right_f" ];then
|
||||
continue
|
||||
fi
|
||||
if [ $first_line -eq 1 ]; then
|
||||
echo ""
|
||||
echo "$f vs $f2"
|
||||
first_line=0
|
||||
fi
|
||||
echo "$line"
|
||||
done
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo "======================================================"
|
||||
echo "Auditing built packages vs unpatched upstream packages"
|
||||
echo "======================================================"
|
||||
for r in $(find $MY_WORKSPACE/*/rpmbuild/RPMS -name '*.rpm' | grep -v '.src.rpm' | grep -v debuginfo); do
|
||||
f=$(basename $r)
|
||||
f2=$(echo $f | sed 's#[.]tis[.][0-9]*[.]#.#' | sed 's#[.]tis[.]#.#')
|
||||
r2=$(find $MY_REPO/cgcs-centos-repo/Binary/ -name $f2)
|
||||
if [ "$r2" == "" ]; then
|
||||
# Probably one of our own
|
||||
# echo "Couldn't find '$f2'"
|
||||
continue
|
||||
fi
|
||||
rpm_compare "$r" "$r2"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "============================"
|
||||
echo "Auditing built for conflicts"
|
||||
echo "============================"
|
||||
grep 'conflicts with file from package' -r --binary-files=without-match $MY_WORKSPACE/*/results/ |
|
||||
while read -r line; do
|
||||
w=$(echo "$line" | awk '{ print $8 }')".rpm"
|
||||
w2=$(echo "$line" | awk '{ print $14 }')".rpm"
|
||||
echo "$w $w2"
|
||||
done | sort --unique | sed 's#bash-completion-1:#bash-completion-#' |
|
||||
while read -r line2; do
|
||||
f=$(echo "$line2" | awk '{ print $1 }')
|
||||
f2=$(echo "$line2" | awk '{ print $2 }')
|
||||
r=$(find $MY_REPO/cgcs-centos-repo/Binary/ $MY_WORKSPACE/*/rpmbuild/RPMS -name $f)
|
||||
r2=$(find $MY_REPO/cgcs-centos-repo/Binary/ $MY_WORKSPACE/*/rpmbuild/RPMS -name $f2)
|
||||
# echo ""
|
||||
# echo "$f vs $f2"
|
||||
# echo "$r vs $r2"
|
||||
if [ "$r" != "" ] && [ "$r2" != "" ]; then
|
||||
rpm_compare "$r" "$r2"
|
||||
fi
|
||||
done
|
||||
|
||||
|
86
build-tools/branching/branch_and_tag.sh
Executable file
86
build-tools/branching/branch_and_tag.sh
Executable file
@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The purpose of this script is to create branches and tags that follow a convention
|
||||
# If the desired branch already exists, it is skipped.
|
||||
# If the desired tag already exists, it is skipped.
|
||||
|
||||
OLD_TAG=vCGCS_DEV_0018
|
||||
NEW_TAG=vCGCS_DEV_0019
|
||||
|
||||
OLD_BRANCH=CGCS_DEV_0018
|
||||
NEW_BRANCH=CGCS_DEV_0019
|
||||
|
||||
if [ -z "$MY_REPO" ]; then
|
||||
echo "MY_REPO is unset"
|
||||
exit 1
|
||||
else
|
||||
echo "MY_REPO is set to '$MY_REPO'"
|
||||
fi
|
||||
|
||||
if [ -d "$MY_REPO" ]; then
|
||||
cd $MY_REPO
|
||||
echo "checking out and pulling old branch"
|
||||
wrgit checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: wrgit checkout $OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
wrgit pull
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: wrgit pull"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Could not change to diectory '$MY_REPO'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Finding subgits"
|
||||
SUBGITS=`find . -type d -name ".git" | sed "s%/\.git$%%"`
|
||||
|
||||
# Go through all subgits and create the NEW_BRANCH if it does not already exist
|
||||
# Go through all subgits and create the NEW_TAG if it does not already exist
|
||||
for subgit in $SUBGITS; do
|
||||
echo ""
|
||||
echo ""
|
||||
pushd $subgit > /dev/null
|
||||
git fetch
|
||||
git fetch --tags
|
||||
# check if destination branch already exists
|
||||
echo "$subgit"
|
||||
branch_check=`git branch -a --list $NEW_BRANCH`
|
||||
if [ -z "$branch_check" ]
|
||||
then
|
||||
echo "Creating $NEW_BRANCH"
|
||||
git checkout $OLD_BRANCH
|
||||
git checkout -b $NEW_BRANCH
|
||||
git push origin $NEW_BRANCH:$NEW_BRANCH
|
||||
else
|
||||
echo "$NEW_BRANCH already exists"
|
||||
fi
|
||||
tag_check=`git tag -l $NEW_TAG`
|
||||
if [ -z "$tag_check" ]
|
||||
then
|
||||
echo "Creating $NEW_TAG"
|
||||
# create tag
|
||||
git checkout $NEW_BRANCH
|
||||
git pull origin
|
||||
git tag $NEW_TAG
|
||||
git push origin $NEW_TAG
|
||||
else
|
||||
echo "$NEW_TAG already exists"
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
||||
|
||||
echo "All done. branches and tags are pushed"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
56
build-tools/branching/create_branches_and_tags.sh
Executable file
56
build-tools/branching/create_branches_and_tags.sh
Executable file
@ -0,0 +1,56 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ x"$1" = x ] ; then
|
||||
echo "ERROR: You must specify a name to create branches and tags"
|
||||
exit 1
|
||||
fi
|
||||
branch=$1
|
||||
tag="v$branch"
|
||||
|
||||
|
||||
|
||||
echo "Finding subgits"
|
||||
SUBGITS=`find . -type d -name ".git" | sed "s%/\.git$%%"`
|
||||
|
||||
# Go through all subgits and create the branch and tag if they does not already exist
|
||||
for subgit in $SUBGITS; do
|
||||
echo ""
|
||||
echo ""
|
||||
pushd $subgit > /dev/null
|
||||
|
||||
# check if destination branch already exists
|
||||
echo "$subgit"
|
||||
branch_check=`git branch -a --list $branch`
|
||||
if [ -z "$branch_check" ]
|
||||
then
|
||||
echo "Creating branch $branch"
|
||||
git checkout -b $branch
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git checkout -b $branch"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
# git push origin $branch:$branch
|
||||
else
|
||||
echo "Branch $branch already exists"
|
||||
git checkout $branch
|
||||
fi
|
||||
|
||||
tag_check=`git tag -l $tag`
|
||||
if [ -z "$tag_check" ]
|
||||
then
|
||||
echo "Creating tag $tag"
|
||||
git tag $tag
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git tag $tag"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
# git push origin $tag
|
||||
else
|
||||
echo "Tag $tag already exists"
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
||||
|
36
build-tools/branching/create_tags.sh
Executable file
36
build-tools/branching/create_tags.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ x"$1" = x ] ; then
|
||||
echo "ERROR: You must specify a name to create tags"
|
||||
exit 1
|
||||
fi
|
||||
tag=$1
|
||||
|
||||
|
||||
echo "Finding subgits"
|
||||
SUBGITS=`find . -type d -name ".git" | sed "s%/\.git$%%"`
|
||||
|
||||
# Go through all subgits and create the tag if it does not already exist
|
||||
for subgit in $SUBGITS; do
|
||||
echo ""
|
||||
echo ""
|
||||
pushd $subgit > /dev/null
|
||||
|
||||
tag_check=`git tag -l $tag`
|
||||
if [ -z "$tag_check" ]
|
||||
then
|
||||
echo "Creating tag $tag"
|
||||
git tag $tag
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git tag $tag"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
# git push origin $tag
|
||||
else
|
||||
echo "Tag $tag already exists"
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
||||
|
42
build-tools/branching/push_branches_tags.sh
Executable file
42
build-tools/branching/push_branches_tags.sh
Executable file
@ -0,0 +1,42 @@
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
if [ x"$1" = x ] ; then
|
||||
echo "ERROR: You must specify a name to create branches and tags"
|
||||
exit 1
|
||||
fi
|
||||
branch=$1
|
||||
tag="v$branch"
|
||||
|
||||
|
||||
|
||||
echo "Finding subgits"
|
||||
SUBGITS=`find . -type d -name ".git" | sed "s%/\.git$%%"`
|
||||
|
||||
# Go through all subgits and create the branch and tag if they does not already exist
|
||||
for subgit in $SUBGITS; do
|
||||
echo ""
|
||||
echo ""
|
||||
pushd $subgit > /dev/null
|
||||
|
||||
# check if destination branch already exists
|
||||
echo "$subgit"
|
||||
echo "Pushing branch $branch"
|
||||
git push origin $branch:$branch
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git push origin $branch:$branch"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Pushing tag $tag"
|
||||
git push origin $tag
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git push origin $tag"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
||||
|
29
build-tools/branching/push_tags.sh
Executable file
29
build-tools/branching/push_tags.sh
Executable file
@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ x"$1" = x ] ; then
|
||||
echo "ERROR: You must specify a name to push tags"
|
||||
exit 1
|
||||
fi
|
||||
tag=$1
|
||||
|
||||
|
||||
echo "Finding subgits"
|
||||
SUBGITS=`find . -type d -name ".git" | sed "s%/\.git$%%"`
|
||||
|
||||
# Go through all subgits and create the tag if it does not already exist
|
||||
for subgit in $SUBGITS; do
|
||||
echo ""
|
||||
echo ""
|
||||
pushd $subgit > /dev/null
|
||||
|
||||
echo "Creating tag $tag"
|
||||
git push origin $tag
|
||||
if [ $? != 0 ] ; then
|
||||
echo "ERROR: Could not exec: git push origin $tag"
|
||||
popd > /dev/null
|
||||
exit 1
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
||||
|
338
build-tools/build-guest
Executable file
338
build-tools/build-guest
Executable file
@ -0,0 +1,338 @@
|
||||
#!/bin/env bash
|
||||
|
||||
#
|
||||
# Build the tis-centos-image.img or tis-centos-image-rt.img file
|
||||
#
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
# NOTE: TMP_DIR must end in '/'
|
||||
# NOTE: /tmp/ is now tmpfs like. Can't be trusted across multiple mock commands
|
||||
# TMP_DIR=/tmp/
|
||||
TMP_DIR=/
|
||||
|
||||
# Use RPMs from the std build only, for now
|
||||
export BUILD_TYPE=std
|
||||
export MY_BUILD_DIR_TOP=$MY_BUILD_DIR
|
||||
|
||||
function init_vars {
|
||||
# Output path (current dir unless MY_WORKSPACE defined)
|
||||
OUTPUT_DIR="$PWD/export"
|
||||
if [ ! -z "$MY_WORKSPACE" ] && [ -d "$MY_WORKSPACE" ] ; then
|
||||
OUTPUT_DIR="$MY_WORKSPACE/export"
|
||||
CGCS_REPO_DIR="$MY_WORKSPACE/rpmbuild/RPMS"
|
||||
fi
|
||||
|
||||
if [ -n "$MY_GUEST_DIR" ]; then
|
||||
GUEST_DIR=$MY_GUEST_DIR
|
||||
else
|
||||
GUEST_DIR=$MY_WORKSPACE/guest
|
||||
fi
|
||||
|
||||
MOCK=/usr/bin/mock
|
||||
if [ $VERBOSE -eq 0 ]; then
|
||||
MOCK="$MOCK -q"
|
||||
fi
|
||||
|
||||
# Path to guest configuration
|
||||
GUEST_BUILD_DIR=$DIR/build_guest
|
||||
GUEST_BUILD_CMD=$GUEST_BUILD_DIR/build-guest-image.py
|
||||
if [ $VERBOSE -eq 1 ]; then
|
||||
GUEST_BUILD_CMD="$GUEST_BUILD_CMD -x"
|
||||
fi
|
||||
|
||||
if [ $BUILD_MODE == 'std' ]; then
|
||||
OUTPUT_FILE=$OUTPUT_DIR/tis-centos-guest.img
|
||||
elif [ $BUILD_MODE == 'rt' ]; then
|
||||
OUTPUT_FILE=$OUTPUT_DIR/tis-centos-guest-rt.img
|
||||
else
|
||||
printf " Error -- unknown BUILD_MODE '$BUILD_MODE'\n";
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function check_vars {
|
||||
# Where to store data
|
||||
printf "Finding cgcs-root\n"
|
||||
printf " Checking \$MY_REPO (value \"$MY_REPO\")\n"
|
||||
|
||||
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO
|
||||
printf " Found!\n"
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " No joy -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
||||
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
||||
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " Error -- could not locate cgcs-root repo.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "x$MY_BUILD_CFG" == "x" ];then
|
||||
printf " Error -- reqiure MY_BUILD_CFG to be defined.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
RELEASE_INFO=$INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/middleware/recipes-common/build-info/release-info.inc
|
||||
export PLATFORM_RELEASE=$(source $RELEASE_INFO && echo $PLATFORM_RELEASE)
|
||||
}
|
||||
|
||||
|
||||
function create_rootfs {
|
||||
printf "\nCreating guest file system\n"
|
||||
|
||||
mkdir -p $GUEST_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Could not create $GUEST_DIR\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Place build-time environment variables in mock configuration
|
||||
GUEST_ENV="${MY_BUILD_ENVIRONMENT}-guest"
|
||||
GUEST_CFG=$GUEST_DIR/$MY_BUILD_ENVIRONMENT_FILE
|
||||
|
||||
MY_BUILD_ENVIRONMENT=$GUEST_ENV ${DIR}/modify-build-cfg $GUEST_CFG
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Could not update $GUEST_CFG\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Setup mock directories for the guest
|
||||
if [ -d /localdisk/loadbuild/mock ]; then
|
||||
LNK=/localdisk/loadbuild/mock/$GUEST_ENV
|
||||
if [ ! -L $LNK ]; then
|
||||
ln -s $GUEST_DIR $LNK
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -d /localdisk/loadbuild/mock-cache ]; then
|
||||
mkdir -p $GUEST_DIR/cache
|
||||
LNK=/localdisk/loadbuild/mock-cache/$GUEST_ENV
|
||||
if [ ! -L $LNK ]; then
|
||||
ln -s $GUEST_DIR/cache $LNK
|
||||
fi
|
||||
fi
|
||||
|
||||
# Setup mock chroot environment
|
||||
$MOCK -r $GUEST_CFG --clean && $MOCK -r $GUEST_CFG --init
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to setup guest mock chroot\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Install the RPMs to the root filesystem
|
||||
|
||||
# Note that the "rt" build needs access to both local-std and local-rt repos
|
||||
local EXTRA_REPOS=""
|
||||
|
||||
if [ $BUILD_MODE == 'std' ]; then
|
||||
INC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-install-list.txt)
|
||||
TIS_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/image.inc)
|
||||
elif [ $BUILD_MODE == 'rt' ]; then
|
||||
INC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-install-list-rt.txt)
|
||||
TIS_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/image-rt.inc)
|
||||
EXTRA_REPOS="--enablerepo local-rt"
|
||||
else
|
||||
printf " Error -- unknown BUILD_MODE '$BUILD_MODE'\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
$MOCK -r $GUEST_CFG --install ${INC_RPM_LIST} ${TIS_RPM_LIST} ${EXTRA_REPOS}
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to install RPM packages\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Remove RPMs that are not required in image (pruned package list)
|
||||
# NOTE: these are automatically installed from the mock init not
|
||||
# through dependencies.
|
||||
EXC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-remove-list.txt)
|
||||
|
||||
$MOCK -r $GUEST_CFG --remove ${EXC_RPM_LIST}
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to remove RPM packages\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf " Done\n"
|
||||
}
|
||||
|
||||
|
||||
function update_rootfs {
|
||||
printf "\nCustomizing guest file system\n"
|
||||
|
||||
# Copy over skeleton configuration files
|
||||
for GUEST_ROOTFS in $GUEST_BUILD_DIR/rootfs $GUEST_BUILD_DIR/rootfs-$BUILD_MODE;
|
||||
do
|
||||
for f in $(cd $GUEST_ROOTFS && find . -type f | cut -c3-);
|
||||
do
|
||||
echo "$MOCK -r $GUEST_CFG --copyin $GUEST_ROOTFS/$f $f"
|
||||
$MOCK -r $GUEST_CFG --copyin $GUEST_ROOTFS/$f $f
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to copyin file $f\n";
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# Run the root file system setup script inside the chroot
|
||||
ROOTFS_SETUP=rootfs-setup.sh
|
||||
$MOCK -r $GUEST_CFG --copyin $GUEST_BUILD_DIR/$ROOTFS_SETUP $TMP_DIR && \
|
||||
if [ $BUILD_MODE == 'rt' ]; then
|
||||
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP --rt"
|
||||
elif [ $BUILD_MODE == 'std' ]; then
|
||||
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP --std"
|
||||
else
|
||||
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP"
|
||||
fi
|
||||
$MOCK -r $GUEST_CFG --chroot "$ROOTFS_SETUP_CMD"
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to run guest $ROOTFS_SETUP\n";
|
||||
exit 1
|
||||
fi
|
||||
$MOCK -r $GUEST_CFG --chroot "rm -f $TMP_DIR$ROOTFS_SETUP"
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to delete $ROOTFS_SETUP from guest\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf " Done\n"
|
||||
}
|
||||
|
||||
|
||||
function build_image {
|
||||
# Build the image
|
||||
printf "\nBuilding guest image $OUTPUT_FILE\n"
|
||||
|
||||
mkdir -p $OUTPUT_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Could not create $OUTPUT_DIR\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build guest rootfs archive
|
||||
ROOTFS_SPACE=$((500*1024*1024))
|
||||
ROOTFS_TAR=rootfs.tar
|
||||
ROOTFS_EXCLUDE=rootfs-exclude.txt
|
||||
|
||||
$MOCK -r $GUEST_CFG --copyin $GUEST_BUILD_DIR/$ROOTFS_EXCLUDE $TMP_DIR
|
||||
$MOCK -r $GUEST_CFG --chroot -- tar -cf $TMP_DIR$ROOTFS_TAR -X $TMP_DIR$ROOTFS_EXCLUDE --numeric-owner /
|
||||
$MOCK -r $GUEST_CFG --copyout $TMP_DIR$ROOTFS_TAR $GUEST_DIR
|
||||
$MOCK -r $GUEST_CFG --chroot -- rm -f $TMP_DIR$ROOTFS_TAR
|
||||
|
||||
$GUEST_BUILD_CMD -i $GUEST_DIR/$ROOTFS_TAR -o $OUTPUT_FILE -s $ROOTFS_SPACE
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to build guest image\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf " Done\n"
|
||||
}
|
||||
|
||||
|
||||
function clean_guest {
|
||||
printf "\nCleaning the guest $GUEST_DIR\n"
|
||||
|
||||
if [ ! -e $GUEST_DIR ]; then
|
||||
printf " Done...nothing to do\n";
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Place build-time environment variables in mock configuration
|
||||
GUEST_ENV="${MY_BUILD_ENVIRONMENT}-guest"
|
||||
GUEST_CFG=$GUEST_DIR/$MY_BUILD_ENVIRONMENT_FILE
|
||||
|
||||
if [ ! -e $GUEST_CFG ]; then
|
||||
MY_BUILD_ENVIRONMENT=$GUEST_ENV ${DIR}/modify-build-cfg $GUEST_CFG
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Could not update $GUEST_CFG\n";
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
$MOCK -r $GUEST_CFG --clean
|
||||
$MOCK -r $GUEST_CFG --scrub=cache
|
||||
|
||||
rm -rf $GUEST_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
printf " Error -- Failed to remove guest $GUEST_DIR\n";
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf " Done\n"
|
||||
}
|
||||
|
||||
#############################################
|
||||
# Main code
|
||||
#############################################
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " build-guest [--rt | --std] [--verbose]"
|
||||
echo " build-guest [--help]"
|
||||
echo " build-guest [--clean]"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Default argument values
|
||||
HELP=0
|
||||
CLEAN=0
|
||||
VERBOSE=0
|
||||
BUILD_MODE='std'
|
||||
|
||||
# read the options
|
||||
TEMP=`getopt -o h --long clean --long rt --long std --long verbose -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
while true ; do
|
||||
case "$1" in
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--clean) CLEAN=1 ; shift ;;
|
||||
--verbose) VERBOSE=1 ; shift ;;
|
||||
--rt) BUILD_MODE='rt' ; shift ;;
|
||||
--std) BUILD_MODE='std' ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Internal error!" ; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
(
|
||||
printf "\n*****************************\n"
|
||||
printf "Create Titanium Cloud/CentOS Guest Image\n"
|
||||
printf "*****************************\n\n"
|
||||
|
||||
init_vars
|
||||
check_vars
|
||||
|
||||
if [ $CLEAN -eq 1 ]; then
|
||||
clean_guest
|
||||
exit 0
|
||||
fi
|
||||
|
||||
create_rootfs
|
||||
update_rootfs
|
||||
build_image
|
||||
|
||||
) 2>&1 | stdbuf -o0 awk '{ print strftime("%H:%M:%S"), $0; fflush(); }' ; exit ${PIPESTATUS[0]}
|
94
build-tools/build-img
Executable file
94
build-tools/build-img
Executable file
@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build an IMG file capable of being booted in a virtual environment
|
||||
# The default settings are vda device which the Cumulus environment expects
|
||||
# and controller mode
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " build-img [--cpe] [--dest <filename>] [--part [1 | 2]]"
|
||||
echo " --dest <tis.img>"
|
||||
echo " --cpe Boots in CPE mode. Default is controller mode."
|
||||
echo ""
|
||||
}
|
||||
|
||||
DEST_ISO=bootimage_auto.iso
|
||||
DEST_IMG=tis.img
|
||||
AUTO_MODE=controller
|
||||
HELP=0
|
||||
PART=0
|
||||
|
||||
# read the options
|
||||
TEMP=`getopt -o hp:d: --long help,cpe,part:,dest: -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
while true ; do
|
||||
case "$1" in
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--cpe) AUTO_MODE=cpe; shift ;;
|
||||
-d | --dest) DEST_IMG="$2"; shift; shift ;;
|
||||
-p | --part) PART="$2"; shift; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Internal error!" ; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo PART=$PART
|
||||
|
||||
# Step 1: Build an ISO that autoboots
|
||||
|
||||
# Cumulus default device is vda
|
||||
if [ $PART -ne 2 ]; then
|
||||
build-iso --file bootimage_auto.iso --auto $AUTO_MODE --device vda --cumulus
|
||||
fi
|
||||
|
||||
# Step 2: Convert the ISO to IMG
|
||||
if [ $PART -ne 1 ]; then
|
||||
if [ ! -e "/dev/loop-control" -o ! -e "/dev/kvm" ]; then
|
||||
CMD="cd $MY_WORKSPACE/export; \
|
||||
$MY_REPO/addons/wr-cgcs/layers/cgcs/extras.ND/scripts/install_iso_to_disk_image.sh bootimage_auto.iso $DEST_IMG"
|
||||
|
||||
if [ "$HOSTNAME" == "yow-cgts3-centos7" ]; then
|
||||
echo "Attempting to run kvm_iso_to_img on yow-cgts3-lx"
|
||||
ssh -o StrictHostKeyChecking=no yow-cgts3-lx "$CMD"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to run update-efiboot-image on yow-cgts3-lx"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$HOSTNAME" == "yow-cgts2-centos7" ]; then
|
||||
echo "Attempting to run kvm_iso_to_img on yow-cgts2-lx"
|
||||
ssh -o StrictHostKeyChecking=no yow-cgts2-lx "$CMD"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to run update-efiboot-image on yow-cgts2-lx"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "$MY_WORKSPACE/export/$DEST_IMG" ]; then
|
||||
printf "\n"
|
||||
printf "****************************************************************** \n"
|
||||
printf "No kvm and/or loop device on this machine. To complete the build \n"
|
||||
printf "please copy '$MY_WORKSPACE/export/bootimage_auto.iso' to a machine \n"
|
||||
printf "that supports kvm and loop devices and run ... \n"
|
||||
printf " $MY_REPO/addons/wr-cgcs/layers/cgcs/extras.ND/scripts/install_iso_to_disk_image.sh bootimage_auto.iso $DEST_IMG\n"
|
||||
printf "****************************************************************** \n"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "$MY_WORKSPACE/export/$DEST_IMG" ]; then
|
||||
(
|
||||
cd $MY_WORKSPACE/export
|
||||
$MY_REPO/addons/wr-cgcs/layers/cgcs/extras.ND/scripts/install_iso_to_disk_image.sh bootimage_auto.iso $DEST_IMG
|
||||
exit $?
|
||||
)
|
||||
fi
|
||||
fi
|
||||
|
702
build-tools/build-iso
Executable file
702
build-tools/build-iso
Executable file
@ -0,0 +1,702 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build the export/bootimage.iso file
|
||||
#
|
||||
# This script uses environment variables to determine the source of
|
||||
# packages, and bundles the packages into a bootable .iso
|
||||
#
|
||||
# It starts by building a basic "vanilla CentOS" ISO, and then adds our
|
||||
# packages to it.
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " build-iso [--auto <mode>] [--file <filename>] [--device <device>] [--skip-sign]"
|
||||
echo " --file <bootimage.iso> destination ISO file"
|
||||
echo " --auto <controller|cpe> Modify kickstart to auto-install controller or cpe mode"
|
||||
echo " --device <sda> Use a different boot/rootds device (default is sda)"
|
||||
echo " --skip-sign do not add file signature to RPMs"
|
||||
echo ""
|
||||
}
|
||||
|
||||
MY_YUM_CONF=""
|
||||
|
||||
NPROCS=$(nproc)
|
||||
|
||||
export MOCK=/usr/bin/mock
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
# TEMPORARY: Check for isohybrid now to give a warning about installing pkg
|
||||
if [ ! -f /usr/bin/isohybrid ]; then
|
||||
echo "Missing required utility: /usr/bin/isohybrid"
|
||||
echo "Installation of syslinux is required:"
|
||||
echo " sudo yum install -y syslinux"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
function install_pkg_list {
|
||||
local PKGLIST=$1
|
||||
if [ "x$PKGLIST" == "x" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
OLD_PWD=$PWD
|
||||
|
||||
echo "Installing packages listed in $PKGLIST and dependancies"
|
||||
\rm -f $OUTPUT_DIR/dist/report_deps.txt
|
||||
$CREATEREPO $CGCS_REPO_DIR
|
||||
$CREATEREPO $CGCS_RT_REPO_DIR
|
||||
|
||||
\cp -v $MY_YUM_CONF $OUTPUT_DIR
|
||||
|
||||
\cd $OUTPUT_DIST_DIR/isolinux/Packages
|
||||
$INTERNAL_REPO_ROOT/build-tools/build_iso/cgts_deps.sh --deps=$PKGLIST
|
||||
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Could not install dependencies"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# clean up
|
||||
echo "Removing local-std yum repo $CGCS_REPO_DIR/repodata"
|
||||
echo "Removing local-rt yum repo $CGCS_RT_REPO_DIR/repodata"
|
||||
|
||||
\cd $OLD_PWD
|
||||
}
|
||||
|
||||
# Generate the report of where all packages come from
|
||||
function make_report {
|
||||
local PKGLISTFILES=$@
|
||||
if [ "x$PKGLISTFILES" == "x" ]; then
|
||||
return 1
|
||||
fi
|
||||
echo "MAKING $REPORT_FILE"
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
|
||||
echo "ISO REPORT" > $REPORT_FILE
|
||||
date >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
|
||||
echo " " >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
echo "EXPLICIT INCLUDES" >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
for PKGLIST in $PKGLISTFILES; do
|
||||
while read PKG; do
|
||||
PKG=`echo $PKG | sed "s/#.*//"`;
|
||||
if [ "${PKG}x" != "x" ]; then
|
||||
echo $PKG >> $REPORT_FILE
|
||||
fi
|
||||
done < $PKGLIST
|
||||
done
|
||||
|
||||
echo " " >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
echo " PACKAGES " >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
cat $BUILT_REPORT | sort | uniq >> $REPORT_FILE
|
||||
|
||||
echo " " >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
echo " WARNINGS " >> $REPORT_FILE
|
||||
echo "-----------------" >> $REPORT_FILE
|
||||
|
||||
# Note that the warnings file may have multiple lines for the same
|
||||
# missing dependency. A sort | uniq solves this so we don't duplicate
|
||||
# warnings
|
||||
cat $WARNINGS_REPORT | sort | uniq >> $REPORT_FILE
|
||||
|
||||
echo "ISO REPORT: $REPORT_FILE"
|
||||
}
|
||||
|
||||
function init_vars {
|
||||
#####################################
|
||||
# Input definitions
|
||||
|
||||
# Where all CentOS packages live
|
||||
# Where essential CentOS (minimal install) packages live
|
||||
INTERNAL_REPO_ROOT=
|
||||
# Where our own packages live
|
||||
CGCS_REPO_DIR=$MY_WORKSPACE/std/rpmbuild/RPMS
|
||||
CGCS_RT_REPO_DIR=$MY_WORKSPACE/rt/rpmbuild/RPMS
|
||||
|
||||
MY_YUM_CONF=$(create-yum-conf)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: create-yum-conf failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DISTRO_REPO_DIR=$(for d in $(grep baseurl $MY_YUM_CONF | grep file: | awk -F : '{print $2}' | sed 's:///:/:g'); do if [ -d $d/images ]; then echo $d ;fi; done)
|
||||
|
||||
#####################################
|
||||
# Output definitons
|
||||
|
||||
# where to put stuff (curent dir unless MY_WORKSPACE defined)
|
||||
OUTPUT_DIR="$PWD/export"
|
||||
if [ ! -z "$MY_WORKSPACE" ] && [ -d "$MY_WORKSPACE" ] ; then
|
||||
OUTPUT_DIR="$MY_WORKSPACE/export"
|
||||
CGCS_REPO_DIR="$MY_WORKSPACE/std/rpmbuild/RPMS"
|
||||
CGCS_RT_REPO_DIR="$MY_WORKSPACE/rt/rpmbuild/RPMS"
|
||||
fi
|
||||
|
||||
# Directory in which to populate files to be distributed
|
||||
if [ $CUMULUS -eq 0 ]; then
|
||||
OUTPUT_DIST_DIR=$OUTPUT_DIR/dist
|
||||
else
|
||||
OUTPUT_DIST_DIR=$OUTPUT_DIR/dist-cumulus
|
||||
fi
|
||||
|
||||
# Package disc image
|
||||
OUTPUT_FILE=$OUTPUT_DIR/$DEST_FILE
|
||||
|
||||
# Generate an error if the output file is below this threshold
|
||||
MINIMUM_EXPECTED_SIZE=500000000
|
||||
|
||||
|
||||
# report variables
|
||||
REPORT_FILE=$OUTPUT_DIR/report.txt
|
||||
BUILT_REPORT=$OUTPUT_DIR/local.txt
|
||||
CLOUD_REPORT=$OUTPUT_DIR/cloud.txt
|
||||
CLOUD_COMMON_REPORT=$OUTPUT_DIR/cloudcommon.txt
|
||||
CENTOS_REPORT=$OUTPUT_DIR/centos.txt
|
||||
EPEL_REPORT=$OUTPUT_DIR/epel.txt
|
||||
WARNINGS_REPORT=$OUTPUT_DIR/warnings.txt
|
||||
|
||||
\rm -f $REPORT_FILE
|
||||
\rm -f $BUILT_REPORT
|
||||
\rm -f $CLOUD_REPORT
|
||||
\rm -f $CLOUD_COMMON_REPORT
|
||||
\rm -f $CENTOS_REPORT
|
||||
\rm -f $WARNINGS_REPORT
|
||||
}
|
||||
|
||||
# check input variables
|
||||
function check_vars {
|
||||
# Where to store data
|
||||
printf "Finding cgcs-root\n"
|
||||
printf " Checking \$MY_REPO (value \"$MY_REPO\")\n"
|
||||
|
||||
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO
|
||||
printf " Found!\n"
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " No joy -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
||||
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
||||
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " Error -- could not locate cgcs-root repo.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "\nChecking that we can access $DISTRO_REPO_DIR\n"
|
||||
if [ ! -d "$DISTRO_REPO_DIR" ] ; then
|
||||
printf " Error -- could not access $DISTRO_REPO_DIR\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -e "$DISTRO_REPO_DIR/repodata" ] ; then
|
||||
printf " Error -- $DISTRO_REPO_DIR is there, but does not seem sane\n"
|
||||
fi
|
||||
|
||||
printf "\nOkay, input looks fine...\n\n"
|
||||
printf "Creating output directory $OUTPUT_DIST_DIR\n"
|
||||
if [ $CLEAN_FLAG -eq 1 ]; then
|
||||
echo " Cleaning..."
|
||||
if [ -e $OUTPUT_DIST_DIR ] ; then
|
||||
chmod -R a+w $OUTPUT_DIST_DIR
|
||||
\rm -rf $OUTPUT_DIST_DIR
|
||||
fi
|
||||
if [ -e $OUTPUT_DIST_DIR ] ; then
|
||||
printf "Error: could not remove old $OUTPUT_DIST_DIR\n"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
\mkdir -p $OUTPUT_DIST_DIR
|
||||
if [ ! -d $OUTPUT_DIST_DIR ] ; then
|
||||
printf "Error: could not create $OUTPUT_DIST_DIR\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
RELEASE_INFO=$INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/middleware/recipes-common/build-info/release-info.inc
|
||||
export PLATFORM_RELEASE=$(source $RELEASE_INFO && echo $PLATFORM_RELEASE)
|
||||
|
||||
echo " Done"
|
||||
echo ""
|
||||
}
|
||||
|
||||
function init_output_dir {
|
||||
echo "Creating base output directory in $OUTPUT_DIST_DIR"
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/images
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/ks
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/LiveOS
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/Packages
|
||||
\mkdir -p $OUTPUT_DIST_DIR/utils
|
||||
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/EFI
|
||||
# This directory will contains files required for the PXE network installer
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/pxeboot
|
||||
|
||||
echo " Copying base files"
|
||||
|
||||
# Generate .discinfo file
|
||||
date +%s.%N > $OUTPUT_DIST_DIR/isolinux/.discinfo
|
||||
echo $PLATFORM_RELEASE >> $OUTPUT_DIST_DIR/isolinux/.discinfo
|
||||
echo "x86_64" >> $OUTPUT_DIST_DIR/isolinux/.discinfo
|
||||
|
||||
\cp -L -ru $DISTRO_REPO_DIR/isolinux/* $OUTPUT_DIST_DIR/isolinux/
|
||||
\cp -L -ru $DISTRO_REPO_DIR/images/pxeboot $OUTPUT_DIST_DIR/isolinux/images/
|
||||
|
||||
echo " Installing startup files"
|
||||
|
||||
\cp -L $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/centos.syslinux.cfg $OUTPUT_DIST_DIR/isolinux/syslinux.cfg
|
||||
\cp -L $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/centos.syslinux.cfg $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
sed -i 's/wr_usb_boot/oe_iso_boot/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
|
||||
# Modify the isolinux.cfg to auto install if requested
|
||||
# Option 0 is Controller(serial). Option 2 is CPE serial.
|
||||
if [ "$AUTO_INSTALL" == "controller" ] ; then
|
||||
echo "Modifying ISO to auto-install controller load"
|
||||
perl -p -i -e 's/timeout 0/timeout 1\ndefault 0/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
elif [ "$AUTO_INSTALL" == "cpe" ] ; then
|
||||
echo "Modifying ISO to auto-install CPE (combined load)"
|
||||
perl -p -i -e 's/timeout 0/timeout 1\ndefault 2/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
fi
|
||||
|
||||
# Modify the device if requested
|
||||
if [ ! -z "$DEVICE" ] ; then
|
||||
echo "Modifying ISO to use device $DEVICE"
|
||||
perl -p -i -e "s/device=sda/device=${DEVICE}/g" $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Copy UEFI files
|
||||
\cp -L -ru $DISTRO_REPO_DIR/EFI/* $OUTPUT_DIST_DIR/isolinux/EFI/
|
||||
\cp -L $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/grub.cfg $OUTPUT_DIST_DIR/isolinux/EFI/BOOT/grub.cfg
|
||||
\cp -L $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/pxeboot_grub.cfg $OUTPUT_DIST_DIR/isolinux/pxeboot/pxeboot_grub.cfg
|
||||
|
||||
# Update the efiboot.img (See https://wiki.archlinux.org/index.php/Remastering_the_Install_ISO)
|
||||
# We need to mount the image file, replace the grub.cfg file with the Titanium Cloud one, and unmount.
|
||||
# Script update-efiboot-image will do this. If there is not loop device on the build machine
|
||||
# then this script must be executed manually prior.
|
||||
|
||||
if [ ! -e "/dev/loop-control" -a ! -f "$OUTPUT_DIR/efiboot.img" ]; then
|
||||
CMD="export PROJECT=$PROJECT; \
|
||||
export SRC_BUILD_ENVIRONMENT=$SRC_BUILD_ENVIRONMENT; \
|
||||
export MY_BUILD_ENVIRONMENT=$MY_BUILD_ENVIRONMENT; \
|
||||
export MY_BUILD_ENVIRONMENT_FILE=$MY_BUILD_ENVIRONMENT_FILE; \
|
||||
export MY_BUILD_DIR=$MY_BUILD_DIR; \
|
||||
export MY_WORKSPACE=$MY_WORKSPACE; \
|
||||
export MY_REPO=$MY_REPO; \
|
||||
export MY_BUILD_CFG=$MY_BUILD_CFG; \
|
||||
export MY_MOCK_ROOT=$MY_MOCK_ROOT; \
|
||||
export PATH=$MY_REPO/build-tools:\$PATH; \
|
||||
update-efiboot-image"
|
||||
|
||||
if [ "$HOSTNAME" == "yow-cgts3-centos7" ]; then
|
||||
echo "Attempting to run update-efiboot-image on yow-cgts3-lx"
|
||||
ssh -o StrictHostKeyChecking=no yow-cgts3-lx "$CMD"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to run update-efiboot-image on yow-cgts3-lx"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$HOSTNAME" == "yow-cgts2-centos7" ]; then
|
||||
echo "Attempting to run update-efiboot-image on yow-cgts2-lx"
|
||||
ssh -o StrictHostKeyChecking=no yow-cgts2-lx "$CMD"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to run update-efiboot-image on yow-cgts2-lx"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -e "/dev/loop-control" -a ! -f "$OUTPUT_DIR/efiboot.img" ]; then
|
||||
printf "\n**************************************************************************************************** \n"
|
||||
printf "No loop device on this machine. Please ensure $OUTPUT_DIR/efiboot.img \n"
|
||||
printf "exist prior to executing build-iso by. It can be created by running \n"
|
||||
printf " $INTERNAL_REPO_ROOT/build-tools/update-efiboot-image \n"
|
||||
printf "on a machine that does support a loop device. Please ensure all standard \n"
|
||||
printf "build environment variables are defined (e.g. MY_REPO, MY_WORKSPACE, etc.). \n"
|
||||
printf " \n"
|
||||
printf "e.g. If building on yow-cgts3-centos7, you'll want to run the script on \n"
|
||||
printf " yow-cgts3-lx which shares the same file system, but supports loop devices \n"
|
||||
printf "****************************************************************************************************** \n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$OUTPUT_DIR/efiboot.img" ]; then
|
||||
|
||||
# The script update-efiboot-image was run outside the build-iso script, do nothing.
|
||||
printf " The image file $OUTPUT_DIR/efiboot.img already exist\n"
|
||||
else
|
||||
printf " The image file $OUTPUT_DIR/efiboot.img does not exist \n"
|
||||
if [ ! -f "$INTERNAL_REPO_ROOT/build-tools/update-efiboot-image" ]; then
|
||||
printf "*** Error: script update-efiboot-image does not exist *** \n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run the script
|
||||
$INTERNAL_REPO_ROOT/build-tools/update-efiboot-image
|
||||
RET=$?
|
||||
if [ $RET != 0 ]; then
|
||||
printf "*** Error: update-efiboot-image script returned failure $RET *** \n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
\cp -L $OUTPUT_DIR/efiboot.img $OUTPUT_DIST_DIR/isolinux/images/
|
||||
\rm -f $OUTPUT_DIR/efiboot.img
|
||||
|
||||
# Copy and set up pxeboot setup files
|
||||
\cp $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/pxeboot_setup.sh $OUTPUT_DIST_DIR/isolinux/pxeboot_setup.sh
|
||||
\cp $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/pxeboot.cfg $OUTPUT_DIST_DIR/isolinux/pxeboot/pxeboot.cfg
|
||||
chmod +x $OUTPUT_DIST_DIR/isolinux/pxeboot_setup.sh
|
||||
|
||||
\rm -f $OUTPUT_DIST_DIR/comps.xml
|
||||
\cp -L $INTERNAL_REPO_ROOT/build-tools/build_iso/comps.xml.gz $OUTPUT_DIST_DIR/
|
||||
gunzip $OUTPUT_DIST_DIR/comps.xml.gz
|
||||
|
||||
TMP_DIR=$MY_WORKSPACE/tmp
|
||||
\mkdir -p $TMP_DIR
|
||||
TMPDIR=$TMP_DIR yum clean all -c $MY_YUM_CONF
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
echo " Done"
|
||||
echo ""
|
||||
}
|
||||
|
||||
function final_touches {
|
||||
OLD_PWD=$PWD
|
||||
|
||||
# Update the comps.xml
|
||||
if [ ! -f $OUTPUT_DIST_DIR/comps.xml.bak ]; then
|
||||
\cp $OUTPUT_DIST_DIR/comps.xml $OUTPUT_DIST_DIR/comps.xml.bak
|
||||
fi
|
||||
|
||||
python $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/platform_comps.py \
|
||||
--pkgdir $OUTPUT_DIST_DIR/isolinux/Packages \
|
||||
--groups $OUTPUT_DIST_DIR/comps.xml
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to update comps.xml"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# create the repo
|
||||
\cd $OUTPUT_DIST_DIR/isolinux
|
||||
$CREATEREPO -q -g ../comps.xml .
|
||||
|
||||
# build the ISO
|
||||
printf "Building image $OUTPUT_FILE\n"
|
||||
\cd $OUTPUT_DIST_DIR
|
||||
chmod 664 isolinux/isolinux.bin
|
||||
mkisofs -o $OUTPUT_FILE \
|
||||
-R -D -A 'oe_iso_boot' -V 'oe_iso_boot' \
|
||||
-quiet \
|
||||
-b isolinux.bin -c boot.cat -no-emul-boot \
|
||||
-boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e images/efiboot.img \
|
||||
-no-emul-boot \
|
||||
isolinux/
|
||||
|
||||
isohybrid --uefi $OUTPUT_FILE
|
||||
implantisomd5 $OUTPUT_FILE
|
||||
|
||||
\cd $OLD_PWD
|
||||
}
|
||||
|
||||
function extract_pkg_from_local_repo {
|
||||
local repodir=$1
|
||||
local pkgname=$2
|
||||
|
||||
local pkgfile=$(repoquery --repofrompath local,${repodir} --location -q ${pkgname})
|
||||
if [ -z "${pkgfile}" ]; then
|
||||
echo "Could not find package $pkgname in $repodir"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rpm2cpio ${pkgfile/file://} | cpio -idmv
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to extract files from ${pkgfile/file://}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function extract_installer_files {
|
||||
# Changes to copied files here must also be reflected in patch-iso
|
||||
|
||||
CGCSDIR=$INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs
|
||||
PKGDIR=$OUTPUT_DIST_DIR/isolinux/Packages
|
||||
|
||||
(
|
||||
\cd $OUTPUT_DIR
|
||||
\rm -rf kickstarts extra_cfgs kickstart.work
|
||||
\mkdir kickstarts extra_cfgs kickstart.work
|
||||
|
||||
echo "Retrieving kickstarts..."
|
||||
|
||||
\cd kickstart.work
|
||||
|
||||
extract_pkg_from_local_repo ${CGCS_REPO_DIR} platform-kickstarts
|
||||
extract_pkg_from_local_repo ${CGCS_REPO_DIR} platform-kickstarts-pxeboot
|
||||
extract_pkg_from_local_repo ${CGCS_REPO_DIR} platform-kickstarts-extracfgs
|
||||
|
||||
\cp --preserve=all www/pages/feed/rel-*/*.cfg pxeboot/*.cfg ../kickstarts/ &&
|
||||
\cp --preserve=all extra_cfgs/*.cfg ../extra_cfgs/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to copy extracted kickstarts"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
\cd ..
|
||||
|
||||
# Copy kickstarts to ISO
|
||||
\cp --preserve=all kickstarts/controller_ks.cfg $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
||||
# Modify the kickstart to shutdown instead of reboot if doing an auto install
|
||||
if [ ! -z "$AUTO_INSTALL" ] ; then
|
||||
sed -i 's/^reboot --eject/shutdown/' $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
||||
fi
|
||||
|
||||
\mv kickstarts/pxeboot* $OUTPUT_DIST_DIR/isolinux/pxeboot/
|
||||
\cp --preserve=all kickstarts/* $OUTPUT_DIST_DIR/isolinux
|
||||
|
||||
# Update OAM interface for cumulus auto install
|
||||
if [ $CUMULUS -eq 1 ]; then
|
||||
# Cumulus wants tty1
|
||||
perl -p -i -e 's/console=tty0/console=tty1/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
||||
|
||||
# CUMULUS setup scripts specify ens3 for OAM
|
||||
OAM_IFNAME=ens3
|
||||
|
||||
cat <<EOM >> $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
||||
%post
|
||||
#For cumulus tis on tis automated install
|
||||
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-${OAM_IFNAME}
|
||||
IPADDR=10.10.10.3
|
||||
NETMASK=255.255.255.0
|
||||
BOOTPROTO=static
|
||||
ONBOOT=yes
|
||||
DEVICE=${OAM_IFNAME}
|
||||
MTU=1500
|
||||
GATEWAY=10.10.10.1
|
||||
EOF
|
||||
%end
|
||||
EOM
|
||||
fi
|
||||
|
||||
# For PXE boot network installer
|
||||
|
||||
echo ${OUTPUT_DIST_DIR}/isolinux/Packages
|
||||
|
||||
local WORKDIR=pxe-network-installer.content
|
||||
local ORIG_PWD=$PWD
|
||||
|
||||
\rm -rf $WORKDIR
|
||||
\mkdir $WORKDIR
|
||||
\cd $WORKDIR
|
||||
|
||||
extract_pkg_from_local_repo ${CGCS_REPO_DIR} pxe-network-installer
|
||||
extract_pkg_from_local_repo ${CGCS_REPO_DIR} grub2-efi-pxeboot
|
||||
|
||||
\mkdir -p $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/centos/x86_64-efi
|
||||
|
||||
\cp --preserve=all pxeboot/pxelinux.0 pxeboot/menu.c32 pxeboot/chain.c32 $OUTPUT_DIST_DIR/isolinux/pxeboot &&
|
||||
\cp --preserve=all pxeboot/EFI/centos/x86_64-efi/* $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/centos/x86_64-efi/ &&
|
||||
\cp --preserve=all pxeboot/EFI/grubx64.efi $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Could not copy all files from installer"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
\cp --preserve=all www/pages/feed/rel-*/LiveOS/squashfs.img $OUTPUT_DIST_DIR/isolinux/LiveOS
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Could not copy squashfs from LiveOS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Replace vmlinuz and initrd.img with our own pre-built ones
|
||||
\rm -f \
|
||||
$OUTPUT_DIST_DIR/isolinux/vmlinuz \
|
||||
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/vmlinuz \
|
||||
$OUTPUT_DIST_DIR/isolinux/initrd.img \
|
||||
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/initrd.img
|
||||
\cp --preserve=all pxeboot/rel-*/installer-bzImage_1.0 \
|
||||
$OUTPUT_DIST_DIR/isolinux/vmlinuz &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-bzImage_1.0 \
|
||||
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/vmlinuz &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
||||
$OUTPUT_DIST_DIR/isolinux/initrd.img &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
||||
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/initrd.img
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to copy installer images"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
\cd $ORIG_PWD
|
||||
\rm -rf $WORKDIR
|
||||
)
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function setup_upgrades_files {
|
||||
# Changes to copied files here must also be reflected in patch-iso
|
||||
|
||||
# Copy the upgrade files
|
||||
UPGRADES_DIR="$OUTPUT_DIST_DIR/isolinux/upgrades"
|
||||
\rm -rf $UPGRADES_DIR
|
||||
\mkdir -p $UPGRADES_DIR
|
||||
\cp $INTERNAL_REPO_ROOT/addons/wr-cgcs/layers/cgcs/mwa-beas/bsp-files/upgrades/* $UPGRADES_DIR
|
||||
sed -i "s/xxxSW_VERSIONxxx/${PLATFORM_RELEASE}/g" $UPGRADES_DIR/metadata.xml
|
||||
chmod +x $UPGRADES_DIR/*.sh
|
||||
# Write the version out (used in upgrade scripts - this is the same as SW_VERSION)
|
||||
echo "VERSION=$PLATFORM_RELEASE" > $UPGRADES_DIR/version
|
||||
}
|
||||
|
||||
function sign_iso {
|
||||
# Sign the .iso with the developer private key
|
||||
# Sigining with the formal key is only to be done for customer release
|
||||
# builds
|
||||
local isofilename=$(basename $OUTPUT_DIR/$DEST_FILE)
|
||||
local isofilenoext="${isofilename%.*}"
|
||||
openssl dgst -sha256 -sign ${MY_REPO}/build-tools/signing/dev-private-key.pem -binary -out $OUTPUT_DIR/$isofilenoext.sig $OUTPUT_DIR/$DEST_FILE
|
||||
}
|
||||
|
||||
#############################################
|
||||
# Main code
|
||||
#############################################
|
||||
|
||||
# Check args
|
||||
HELP=0
|
||||
CLEAN_FLAG=1 # TODO -- doesn't yet work without --clean
|
||||
DEST_FILE=bootimage.iso
|
||||
AUTO_FLAG=0
|
||||
AUTO_INSTALL=""
|
||||
CUMULUS=0
|
||||
SIGN_RPM_FILES=1
|
||||
DEVICE=""
|
||||
|
||||
# read the options
|
||||
TEMP=`getopt -o hf:a:d: --long help,file:,auto:,device:,cumulus,clean,skip-sign -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
while true ; do
|
||||
case "$1" in
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--clean) CLEAN_FLAG=1 ; shift ;;
|
||||
--skip-sign) SIGN_RPM_FILES=0 ; shift ;;
|
||||
--cumulus) CUMULUS=1 ; shift ;;
|
||||
-f | --file) DEST_FILE="$2"; shift; shift ;;
|
||||
-d | --device) DEVICE="$2"; shift; shift ;;
|
||||
-a | --auto) AUTO_FLAG=1; AUTO_INSTALL="$2"; shift; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Internal error!" ; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $AUTO_FLAG -eq 1 ]; then
|
||||
if [[ "$AUTO_INSTALL" != "controller" && "$AUTO_INSTALL" != "cpe" ]] ; then
|
||||
echo "Unsupported --auto value: $AUTO_INSTALL"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
(
|
||||
printf "\n*************************\n"
|
||||
printf "Create Titanium Cloud/CentOS Boot CD\n"
|
||||
printf "*************************\n\n"
|
||||
|
||||
# Init variables
|
||||
init_vars
|
||||
check_vars
|
||||
PKGLIST_MINIMAL=$INTERNAL_REPO_ROOT/build-tools/build_iso/minimal_rpm_list.txt
|
||||
PKGLIST_TI=$INTERNAL_REPO_ROOT/build-tools/build_iso/image.inc
|
||||
PKGLIST_DEV=$INTERNAL_REPO_ROOT/build-tools/build_iso/image-dev.inc
|
||||
|
||||
# Create skeleton build dir
|
||||
init_output_dir
|
||||
|
||||
# Create the vanilla DVD
|
||||
echo "Copying vanilla CentOS RPMs"
|
||||
install_pkg_list $PKGLIST_MINIMAL
|
||||
|
||||
# Find all CGCS packages
|
||||
# SAL exit 0
|
||||
echo "Installing Titanium Cloud packages"
|
||||
install_pkg_list $PKGLIST_TI
|
||||
if [ $? -eq 2 ]; then
|
||||
exit 1
|
||||
fi
|
||||
if [ "x${RELEASE_BUILD}" == "x" ]; then
|
||||
echo "Installing Titanium Cloud developer packages"
|
||||
install_pkg_list ${PKGLIST_DEV}
|
||||
if [ $? -eq 2 ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Extract installer files
|
||||
extract_installer_files
|
||||
|
||||
# Upgrades files
|
||||
setup_upgrades_files
|
||||
|
||||
# add file signatures to all rpms
|
||||
if [ $SIGN_RPM_FILES -ne 0 ]; then
|
||||
sign-rpms -d $OUTPUT_DIST_DIR/isolinux/Packages
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "failed to add file signatures to RPMs"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Finalize and build ISO
|
||||
final_touches
|
||||
|
||||
# Sign the ISO
|
||||
sign_iso
|
||||
|
||||
make_report $PKGLIST_MINIMAL $PKGLIST_TI
|
||||
|
||||
# Check sanity
|
||||
FILESIZE=$(wc -c <"$OUTPUT_FILE")
|
||||
if [ $FILESIZE -ge $MINIMUM_EXPECTED_SIZE ]; then
|
||||
printf "Done."
|
||||
printf "Output file: $OUTPUT_FILE\n\n"
|
||||
else
|
||||
printf "Output file $OUTPUT_FILE smaller than expected -- probable error\n\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
) 2>&1 | stdbuf -o0 awk '{ print strftime("%H:%M:%S"), $0; fflush(); }' ; exit ${PIPESTATUS[0]}
|
63
build-tools/build-pkg-srpm
Normal file
63
build-tools/build-pkg-srpm
Normal file
@ -0,0 +1,63 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Available environment
|
||||
# SRC_BASE = absolute path to cgcs-root
|
||||
# AVS_BASE = absolute path to AVS source
|
||||
# CGCS_BASE = absolute path to CGCS source
|
||||
# RPM_BUILD_BASE = Directory where the package .distro directory can be found
|
||||
# SRPM_OUT = Directory into which SRC RPMS are copied in preparation for mock build
|
||||
# RPM_DIR = Directory into which binary RPMs are delivered by mock
|
||||
|
||||
SRC_DIR="/sources"
|
||||
VERSION=$(grep '^Version:' PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//')
|
||||
TAR_NAME=$(grep '^Name:' PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//')
|
||||
CUR_DIR=`pwd`
|
||||
BUILD_DIR=".distro/centos7/rpmbuild"
|
||||
|
||||
mkdir -p $BUILD_DIR/SRPMS
|
||||
|
||||
TAR="$TAR_NAME-$VERSION.tar.gz"
|
||||
TAR_PATH="$BUILD_DIR/SOURCES/$TAR"
|
||||
|
||||
TAR_NEEDED=0
|
||||
if [ -f $TAR_PATH ]; then
|
||||
n=`find . -cnewer $TAR_PATH -and ! -path './.git*' \
|
||||
-and ! -path './build/*' \
|
||||
-and ! -path './.pc/*' \
|
||||
-and ! -path './patches/*' \
|
||||
-and ! -path './.distro/*' \
|
||||
-and ! -path './pbr-*.egg/*' \
|
||||
| wc -l`
|
||||
if [ $n -gt 0 ]; then
|
||||
TAR_NEEDED=1
|
||||
fi
|
||||
else
|
||||
TAR_NEEDED=1
|
||||
fi
|
||||
|
||||
if [ $TAR_NEEDED -gt 0 ]; then
|
||||
tar czvf $TAR_PATH .$SRC_DIR --exclude '.git*' --exclude 'build' --exclude='.pc' --exclude='patches' --exclude='.distro' --exclude='pbr-*.egg' --transform "s,^\.$SRC_DIR,$TAR_NAME-$VERSION,"
|
||||
fi
|
||||
|
||||
for SPEC in `ls $BUILD_DIR/SPECS`; do
|
||||
SPEC_PATH="$BUILD_DIR/SPECS/$SPEC"
|
||||
RELEASE=$(grep '^Release:' $SPEC_PATH | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//')
|
||||
NAME=`echo $SPEC | sed 's/.spec$//'`
|
||||
SRPM="$NAME-$VERSION-$RELEASE.src.rpm"
|
||||
SRPM_PATH="$BUILD_DIR/SRPMS/$SRPM"
|
||||
|
||||
BUILD_NEEDED=0
|
||||
if [ -f $SRPM_PATH ]; then
|
||||
n=`find . -cnewer $SRPM_PATH | wc -l`
|
||||
if [ $n -gt 0 ]; then
|
||||
BUILD_NEEDED=1
|
||||
fi
|
||||
else
|
||||
BUILD_NEEDED=1
|
||||
fi
|
||||
|
||||
if [ $BUILD_NEEDED -gt 0 ]; then
|
||||
rpmbuild -bs $SPEC_PATH --define="%_topdir $CUR_DIR/$BUILD_DIR" --define="_tis_dist .tis"
|
||||
fi
|
||||
done
|
||||
|
34
build-tools/build-pkgs
Executable file
34
build-tools/build-pkgs
Executable file
@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This program is a wrapper around build-pkgs-parallel and build-pkgs-serial
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " Create source and binary rpms:"
|
||||
echo " build-pkgs [--serial] [args]"
|
||||
}
|
||||
|
||||
SERIAL_FLAG=0
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$1" in
|
||||
--serial) SERIAL_FLAG=1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
which mock_tmpfs_umount >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
SERIAL_FLAG=1
|
||||
fi
|
||||
|
||||
if [ $SERIAL_FLAG -eq 1 ]; then
|
||||
echo "build-pkgs-serial $@"
|
||||
build-pkgs-serial "$@"
|
||||
else
|
||||
echo "build-pkgs-parallel $@"
|
||||
build-pkgs-parallel "$@"
|
||||
fi
|
||||
|
370
build-tools/build-pkgs-parallel
Executable file
370
build-tools/build-pkgs-parallel
Executable file
@ -0,0 +1,370 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This program is a wrapper around build-srpms-parallel and build-rpms-parallel
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " Create source and Binary rpms:"
|
||||
echo " Build optimizations (--no-descendants, --no-required, --no-build-info,"
|
||||
echo " --no-autoclean) are not recommended for the first build after a clone/pull,"
|
||||
echo " nor the final build prior to creating an iso or patch, but can be used"
|
||||
echo " for intermediate builds. i.e. while debugging compilation failures."
|
||||
echo " build-pkgs-parallel [--no-descendants] [--no-required] [--no-build-info] [--no-autoclean] [--careful] [--formal] [ list of package names ]"
|
||||
echo ""
|
||||
echo " Delete source rpms, and the directories associated with it's creation:"
|
||||
echo " Note: does not clean an edit environment"
|
||||
echo " build-pkgs-parallel --clean [ list of package names ]"
|
||||
echo ""
|
||||
echo " Extract an src.rpm into a pair of git trees to aid in editing it's contents,"
|
||||
echo " one for source code and one for metadata such as the spec file."
|
||||
echo " If --no-meta-patch is specified, then WRS patches are omitted."
|
||||
echo " build-pkgs-parallel --edit [--no-meta-patch] [ list of package names ]"
|
||||
echo ""
|
||||
echo " Delete an edit environment"
|
||||
echo " build-pkgs-parallel --edit --clean [ list of package names ]"
|
||||
echo ""
|
||||
echo " This help page"
|
||||
echo " build-pkgs-parallel [--help]"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
HELP=0
|
||||
CLEAN_FLAG=0
|
||||
EDIT_FLAG=0
|
||||
STD_BUILD=1
|
||||
RT_BUILD=1
|
||||
INSTALLER_BUILD=0
|
||||
|
||||
# read the options
|
||||
TEMP=$(getopt -o h --long rt,std,installer,edit,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean -n 'build-pkgs-parallel' -- "$@")
|
||||
if [ $? -ne 0 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
EXTRA_ARGS_COMMON=""
|
||||
EXTRA_ARGS_SRPM=""
|
||||
EXTRA_ARGS_RPM=""
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--no-descendants) EXTRA_ARGS_COMMON+=" --no-descendants" ; shift ;;
|
||||
--formal) EXTRA_ARGS_COMMON+=" --formal" ; shift ;;
|
||||
--careful) EXTRA_ARGS_RPM+=" --careful" ; shift ;;
|
||||
--no-required) EXTRA_ARGS_RPM+=" --no-required" ; shift ;;
|
||||
--no-build-info) EXTRA_ARGS_COMMON+=" --no-build-info" ; shift ;;
|
||||
--no-autoclean) EXTRA_ARGS_RPM+=" --no-autoclean" ; shift ;;
|
||||
--no-meta-patch) EXTRA_ARGS_SRPM+=" --no-meta-patch" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--clean) CLEAN_FLAG=1 ; shift ;;
|
||||
--edit) EDIT_FLAG=1 ; EXTRA_ARGS_SRPM+=" --edit"; shift ;;
|
||||
--rt) STD_BUILD=0 ; shift ;;
|
||||
--std) RT_BUILD=0 ; shift ;;
|
||||
--installer) INSTALLER_BUILD=1 ; STD_BUILD=0 ; RT_BUILD=0 ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
function my_exit() {
|
||||
build-rpms-parallel --std --tmpfs-clean
|
||||
build-rpms-parallel --rt --tmpfs-clean
|
||||
}
|
||||
|
||||
function my_sigint() {
|
||||
echo "build-pkgs-parallel sigint"
|
||||
pkill -SIGABRT -P $BASHPID &> /dev/null
|
||||
echo "build-pkgs-parallel waiting"
|
||||
wait
|
||||
echo "build-pkgs-parallel wait complete"
|
||||
|
||||
}
|
||||
|
||||
function my_sighup() {
|
||||
echo "build-pkgs-parallel sighup"
|
||||
pkill -SIGABRT -P $BASHPID &> /dev/null
|
||||
echo "build-pkgs-parallel waiting"
|
||||
wait
|
||||
echo "build-pkgs-parallel wait complete"
|
||||
}
|
||||
|
||||
function my_sigabrt() {
|
||||
echo "build-pkgs-parallel sigabrt"
|
||||
pkill -SIGABRT -P $BASHPID &> /dev/null
|
||||
echo "build-pkgs-parallel waiting"
|
||||
wait
|
||||
echo "build-pkgs-parallel wait complete"
|
||||
}
|
||||
|
||||
function my_sigterm() {
|
||||
echo "build-pkgs-parallel sigterm"
|
||||
pkill -SIGABRT -P $BASHPID &> /dev/null
|
||||
echo "build-pkgs-parallel waiting"
|
||||
wait
|
||||
echo "build-pkgs-parallel wait complete"
|
||||
}
|
||||
|
||||
trap my_exit EXIT
|
||||
trap my_sigint INT
|
||||
trap my_sighup HUP
|
||||
trap my_sigabrt ABRT
|
||||
trap my_sigterm TERM
|
||||
|
||||
TARGETS=" $@ "
|
||||
TARGETS_STD=" "
|
||||
TARGETS_RT=" "
|
||||
TARGETS_INSTALLER=" "
|
||||
TARGETS_MISC=" "
|
||||
|
||||
find_targets () {
|
||||
local centos_pkg_dirs=$1
|
||||
local d=""
|
||||
local d2=""
|
||||
local g=""
|
||||
local x=""
|
||||
local name=""
|
||||
local path=""
|
||||
local RESULT=" "
|
||||
local FOUND=0
|
||||
|
||||
for g in $(find $MY_REPO -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
if [ -f $d/$centos_pkg_dirs ]; then
|
||||
for d2 in $(grep -v '^#' $d/$centos_pkg_dirs); do
|
||||
name=""
|
||||
if [ -f $d/$d2/centos/srpm_path ]; then
|
||||
path=$(cat $d/$d2/centos/srpm_path | head -n 1 | sed "s#^mirror:CentOS/tis-r3-CentOS/mitaka#$MY_REPO/cgcs-centos-repo#" | sed "s#^mirror:#$MY_REPO/cgcs-centos-repo/#" | sed "s#^repo:#$MY_REPO/#" | sed "s#^3rd_party:#$MY_REPO/cgcs-3rd-party-repo/#" | sed "s#^Source/#$MY_REPO/cgcs-centos-repo/Source/#")
|
||||
name=$(rpm -q --qf='%{NAME}' --nosignature -p $path)
|
||||
else
|
||||
path=$(find $d/$d2/centos/ -name '*.spec' | head -n 1)
|
||||
if [[ ( -z "$path" ) && ( -f $d/$d2/centos/spec_path ) ]]; then
|
||||
path=$(find $MY_REPO/$(cat $d/$d2/centos/spec_path) -maxdepth 1 -name '*.spec' | head -n 1)
|
||||
fi
|
||||
if [ "$path" != "" ]; then
|
||||
name=$(spec_find_tag Name "$path" 2>> /dev/null)
|
||||
fi
|
||||
fi
|
||||
if [ "$name" != "" ]; then
|
||||
if [ "$BUILD_TYPE" == "rt" ]; then
|
||||
FOUND=0
|
||||
for x in $TARGETS; do
|
||||
if [ "${x: -3}" == "-rt" ]; then
|
||||
if [ "${name}" == "$x" ] || [ "${name}-rt" == "${x}" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ $FOUND -eq 0 ]; then
|
||||
for x in $TARGETS; do
|
||||
if [ "${name}" == "${x}-rt" ]; then
|
||||
RESULT+="$x-rt "
|
||||
FOUND=1
|
||||
break
|
||||
else
|
||||
if [ "${name}" == "$x" ] || [ "${name}-rt" == "${x}" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
for x in $TARGETS; do
|
||||
if [ "${name}" == "$x" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$RESULT"
|
||||
return 0
|
||||
}
|
||||
|
||||
echo "CLEAN_FLAG=$CLEAN_FLAG"
|
||||
echo "EDIT_FLAG=$EDIT_FLAG"
|
||||
|
||||
if [ "x$TARGETS" != "x " ]; then
|
||||
source $MY_REPO/build-tools/spec-utils
|
||||
TARGETS_STD="$(find_targets centos_pkg_dirs)"
|
||||
|
||||
BUILD_TYPE_SAVE="$BUILD_TYPE"
|
||||
BUILD_TYPE="rt"
|
||||
TARGETS_RT="$(find_targets centos_pkg_dirs_rt)"
|
||||
BUILD_TYPE="$BUILD_TYPE_SAVE"
|
||||
|
||||
echo "TARGETS_STD=$TARGETS_STD"
|
||||
echo "TARGETS_RT=$TARGETS_RT"
|
||||
|
||||
for x in $TARGETS; do
|
||||
if [[ $TARGETS_STD == *" $x "* ]]
|
||||
then
|
||||
echo "found $x" >> /dev/null;
|
||||
else
|
||||
if [[ $TARGETS_RT == *" $x "* ]]
|
||||
then
|
||||
echo "found $x" >> /dev/null;
|
||||
else
|
||||
TARGETS_MISC+="$x "
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "EXTRA_ARGS_COMMON='$EXTRA_ARGS_COMMON'"
|
||||
echo "EXTRA_ARGS_SRPM='$EXTRA_ARGS_SRPM'"
|
||||
echo "EXTRA_ARGS_RPM='$EXTRA_ARGS_RPM'"
|
||||
echo "TARGETS='$TARGETS'"
|
||||
echo "TARGETS_STD='$TARGETS_STD'"
|
||||
echo "TARGETS_RT='$TARGETS_RT'"
|
||||
echo "TARGETS_MISC='$TARGETS_MISC'"
|
||||
|
||||
if [ $CLEAN_FLAG -eq 1 ]; then
|
||||
if [ $STD_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo "$DIR/build-rpms-parallel --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_STD $TARGETS_MISC"
|
||||
$DIR/build-rpms-parallel --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_STD $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
echo "$DIR/build-srpms-parallel --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_STD $TARGETS_MISC"
|
||||
$DIR/build-srpms-parallel --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_STD $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ $RT_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo "$DIR/build-rpms-parallel --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_RT $TARGETS_MISC"
|
||||
$DIR/build-rpms-parallel --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_RT $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
echo "$DIR/build-srpms-parallel --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_RT $TARGETS_MISC"
|
||||
$DIR/build-srpms-parallel --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_RT $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
exit $?
|
||||
fi
|
||||
|
||||
function launch_build()
|
||||
{
|
||||
local build_type=$1
|
||||
shift
|
||||
|
||||
local logfile=$MY_WORKSPACE/build-$build_type.log
|
||||
local rc
|
||||
local targets
|
||||
|
||||
if [ "$build_type" == "std" ]; then
|
||||
targets="$TARGETS_STD $TARGETS_MISC"
|
||||
else
|
||||
if [ "$build_type" == "rt" ]; then
|
||||
targets="$TARGETS_RT $TARGETS_MISC"
|
||||
else
|
||||
if [ "$build_type" == "installer" ]; then
|
||||
targets="$TARGETS_INSTALLER $TARGETS_MISC"
|
||||
else
|
||||
targets="$TARGETS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Launching $build_type build, logging to $logfile"
|
||||
\rm $logfile
|
||||
|
||||
echo -e "\n######## $(date): Launching build-srpms-parallel --$build_type $EXTRA_ARGS $@\n" | tee --append $logfile
|
||||
# No clean flag, call build-srpms-parallel followed by build-rpms-parallel
|
||||
echo "$DIR/build-srpms-parallel --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets" | tee --append $logfile
|
||||
$DIR/build-srpms-parallel --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets 2>&1 | tee --append $logfile
|
||||
rc=${PIPESTATUS[0]}
|
||||
if [ $rc -eq 0 ]; then
|
||||
echo -e "\n######## $(date): build-srpm-parallel --$build_type was successful" | tee --append $logfile
|
||||
else
|
||||
echo -e "\n######## $(date): build-srpm-parallel --$build_type failed with rc=$rc" | tee --append $logfile
|
||||
echo -e "\n$(date): build-srpm-parallel --$build_type failed with rc=$rc"
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo -e "\n######## $(date): Launching build-rpms-parallel --$build_type $EXTRA_ARGS $@\n" | tee --append $logfile
|
||||
echo "$DIR/build-rpms-parallel --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $targets" | tee --append $logfile
|
||||
$DIR/build-rpms-parallel --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $targets 2>&1 | tee --append $logfile
|
||||
rc=${PIPESTATUS[0]}
|
||||
if [ $rc -eq 0 ]; then
|
||||
echo -e "\n######## $(date): build-rpm-parallel --$build_type was successful" | tee --append $logfile
|
||||
else
|
||||
echo -e "\n######## $(date): build-rpm-parallel --$build_type failed with rc=$rc" | tee --append $logfile
|
||||
echo -e "\n$(date): build-rpm-parallel --$build_type failed with rc=$rc"
|
||||
exit $rc
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -e "\n$(date): $build_type complete\n"
|
||||
#exit $rc
|
||||
}
|
||||
|
||||
function progbar()
|
||||
{
|
||||
while :; do
|
||||
for s in / - \\ \|; do
|
||||
printf "\r$s"
|
||||
sleep .5
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
# Create $MY_WORKSPACE if it doesn't exist already
|
||||
mkdir -p $MY_WORKSPACE
|
||||
|
||||
if [ $STD_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
launch_build std
|
||||
else
|
||||
echo "Skipping 'std' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
else
|
||||
echo "Skipping 'std' build"
|
||||
fi
|
||||
if [ $RT_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
launch_build rt
|
||||
else
|
||||
echo "Skipping 'rt' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
else
|
||||
echo "Skipping 'rt' build"
|
||||
fi
|
||||
if [ $INSTALLER_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_INSTALLER" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
launch_build installer
|
||||
else
|
||||
echo "Skipping 'installer' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
else
|
||||
echo "Skipping 'installer' build"
|
||||
fi
|
||||
|
||||
|
||||
echo "All builds were successful"
|
||||
|
||||
exit 0
|
||||
|
379
build-tools/build-pkgs-serial
Executable file
379
build-tools/build-pkgs-serial
Executable file
@ -0,0 +1,379 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This program is a wrapper around build-srpms and build-rpms
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " Create source and Binary rpms:"
|
||||
echo " Build optimizations (--no-descendants, --no-required, --no-build-info,"
|
||||
echo " --no-autoclean) are not recommended for the first build after a clone/pull,"
|
||||
echo " nor the final build prior to creating an iso or patch, but can be used"
|
||||
echo " for intermediate builds. i.e. while debugging compilation failures."
|
||||
echo " build-pkgs [--no-descendants] [--no-required] [--no-build-info] [--no-autoclean] [--careful] [--formal] [ list of package names ]"
|
||||
echo ""
|
||||
echo " Delete source rpms, and the directories associated with it's creation:"
|
||||
echo " Note: does not clean an edit environment"
|
||||
echo " build-pkgs --clean [ list of package names ]"
|
||||
echo ""
|
||||
echo " Extract an src.rpm into a pair of git trees to aid in editing it's contents,"
|
||||
echo " one for source code and one for metadata such as the spec file."
|
||||
echo " If --no-meta-patch is specified, then WRS patches are omitted."
|
||||
echo " build-pkgs --edit [--no-meta-patch] [ list of package names ]"
|
||||
echo ""
|
||||
echo " Delete an edit environment"
|
||||
echo " build-pkgs --edit --clean [ list of package names ]"
|
||||
echo ""
|
||||
echo " This help page"
|
||||
echo " build-pkgs [--help]"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
HELP=0
|
||||
CLEAN_FLAG=0
|
||||
EDIT_FLAG=0
|
||||
STD_BUILD=1
|
||||
RT_BUILD=1
|
||||
INSTALLER_BUILD=0
|
||||
|
||||
# read the options
|
||||
TEMP=`getopt -o h --long serial,rt,std,edit,no-meta-patch,no-descendants,no-required,no-build-info,no-autoclean,formal,careful,help,clean -n 'build-pkgs' -- "$@"`
|
||||
if [ $? -ne 0 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
EXTRA_ARGS_COMMON=""
|
||||
EXTRA_ARGS_SRPM=""
|
||||
EXTRA_ARGS_RPM=""
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--no-descendants) EXTRA_ARGS_COMMON+=" --no-descendants" ; shift ;;
|
||||
--formal) EXTRA_ARGS_COMMON+=" --formal" ; shift ;;
|
||||
--careful) EXTRA_ARGS_RPM+=" --careful" ; shift ;;
|
||||
--no-required) EXTRA_ARGS_RPM+=" --no-required" ; shift ;;
|
||||
--no-build-info) EXTRA_ARGS_COMMON+=" --no-build-info" ; shift ;;
|
||||
--no-autoclean) EXTRA_ARGS_RPM+=" --no-autoclean" ; shift ;;
|
||||
--no-meta-patch) EXTRA_ARGS_SRPM+=" --no-meta-patch" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--clean) CLEAN_FLAG=1 ; shift ;;
|
||||
--edit) EDIT_FLAG=1 ; EXTRA_ARGS_SRPM+=" --edit"; shift ;;
|
||||
--rt) STD_BUILD=0 ; shift ;;
|
||||
--std) RT_BUILD=0 ; shift ;;
|
||||
--installer) INSTALLER_BUILD=1 ; STD_BUILD=0 ; RT_BUILD=0 ; shift ;;
|
||||
--serial) shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TARGETS=" $@ "
|
||||
TARGETS_STD=" "
|
||||
TARGETS_RT=" "
|
||||
TARGETS_INSTALLER=" "
|
||||
TARGETS_MISC=" "
|
||||
|
||||
find_targets () {
|
||||
local centos_pkg_dirs=$1
|
||||
local d=""
|
||||
local d2=""
|
||||
local g=""
|
||||
local x=""
|
||||
local name=""
|
||||
local path=""
|
||||
local RESULT=" "
|
||||
local FOUND=0
|
||||
|
||||
for g in $(find $MY_REPO -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
if [ -f $d/$centos_pkg_dirs ]; then
|
||||
for d2 in $(grep -v '^#' $d/$centos_pkg_dirs); do
|
||||
name=""
|
||||
if [ -f $d/$d2/centos/srpm_path ]; then
|
||||
path=$(cat $d/$d2/centos/srpm_path | head -n 1 | sed "s#^mirror:CentOS/tis-r3-CentOS/mitaka#$MY_REPO/cgcs-centos-repo#" | sed "s#^mirror:#$MY_REPO/cgcs-centos-repo/#" | sed "s#^repo:#$MY_REPO/#" | sed "s#^3rd_party:#$MY_REPO/cgcs-3rd-party-repo/#" | sed "s#^Source/#$MY_REPO/cgcs-centos-repo/Source/#")
|
||||
name=$(rpm -q --qf='%{NAME}' --nosignature -p $path)
|
||||
else
|
||||
path=$(find $d/$d2/centos/ -name '*.spec' | head -n 1)
|
||||
if [[ ( -z "$path" ) && ( -f $d/$d2/centos/spec_path ) ]]; then
|
||||
path=$(find $MY_REPO/$(cat $d/$d2/centos/spec_path) -maxdepth 1 -name '*.spec' | head -n 1)
|
||||
fi
|
||||
if [ "$path" != "" ]; then
|
||||
name=$(spec_find_tag Name "$path" 2>> /dev/null)
|
||||
fi
|
||||
fi
|
||||
if [ "$name" != "" ]; then
|
||||
if [ "$BUILD_TYPE" == "rt" ]; then
|
||||
FOUND=0
|
||||
for x in $TARGETS; do
|
||||
if [ "${x: -3}" == "-rt" ]; then
|
||||
if [ "${name}" == "$x" ] || [ "${name}-rt" == "${x}" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ $FOUND -eq 0 ]; then
|
||||
for x in $TARGETS; do
|
||||
if [ "${name}" == "${x}-rt" ]; then
|
||||
RESULT+="$x-rt "
|
||||
FOUND=1
|
||||
break
|
||||
else
|
||||
if [ "${name}" == "$x" ] || [ "${name}-rt" == "${x}" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
for x in $TARGETS; do
|
||||
if [ "${name}" == "$x" ]; then
|
||||
RESULT+="$x "
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$RESULT"
|
||||
return 0
|
||||
}
|
||||
|
||||
echo "CLEAN_FLAG=$CLEAN_FLAG"
|
||||
echo "EDIT_FLAG=$EDIT_FLAG"
|
||||
|
||||
if [ "x$TARGETS" != "x " ]; then
|
||||
source $MY_REPO/build-tools/spec-utils
|
||||
TARGETS_STD="$(find_targets centos_pkg_dirs)"
|
||||
|
||||
BUILD_TYPE_SAVE="$BUILD_TYPE"
|
||||
BUILD_TYPE="rt"
|
||||
TARGETS_RT="$(find_targets centos_pkg_dirs_rt)"
|
||||
BUILD_TYPE="installer"
|
||||
TARGETS_INSTALLER="$(find_targets centos_pkg_dirs_installer)"
|
||||
BUILD_TYPE="$BUILD_TYPE_SAVE"
|
||||
|
||||
echo "TARGETS_STD=$TARGETS_STD"
|
||||
echo "TARGETS_RT=$TARGETS_RT"
|
||||
echo "TARGETS_INSTALLER=$TARGETS_INSTALLER"
|
||||
|
||||
for x in $TARGETS; do
|
||||
if [[ $TARGETS_STD == *" $x "* ]]
|
||||
then
|
||||
echo "found $x" >> /dev/null;
|
||||
else
|
||||
if [[ $TARGETS_RT == *" $x "* ]]
|
||||
then
|
||||
echo "found $x" >> /dev/null;
|
||||
else
|
||||
if [[ $TARGETS_INSTALLER == *" $x "* ]]
|
||||
then
|
||||
echo "found $x" >> /dev/null;
|
||||
INSTALLER_BUILD=1
|
||||
else
|
||||
TARGETS_MISC+="$x "
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "EXTRA_ARGS_COMMON='$EXTRA_ARGS_COMMON'"
|
||||
echo "EXTRA_ARGS_SRPM='$EXTRA_ARGS_SRPM'"
|
||||
echo "EXTRA_ARGS_RPM='$EXTRA_ARGS_RPM'"
|
||||
echo "TARGETS='$TARGETS'"
|
||||
echo "TARGETS_STD='$TARGETS_STD'"
|
||||
echo "TARGETS_RT='$TARGETS_RT'"
|
||||
echo "TARGETS_INSTALLER='$TARGETS_INSTALLER'"
|
||||
echo "TARGETS_MISC='$TARGETS_MISC'"
|
||||
|
||||
if [ $CLEAN_FLAG -eq 1 ]; then
|
||||
if [ $STD_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo "$DIR/build-rpms-serial --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_STD $TARGETS_MISC"
|
||||
$DIR/build-rpms-serial --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_STD $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
echo "$DIR/build-srpms-serial --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_STD $TARGETS_MISC"
|
||||
$DIR/build-srpms-serial --std --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_STD $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ $RT_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x" ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo "$DIR/build-rpms-serial --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_RT $TARGETS_MISC"
|
||||
$DIR/build-rpms-serial --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_RT $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
echo "$DIR/build-srpms-serial --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_RT $TARGETS_MISC"
|
||||
$DIR/build-srpms-serial --rt --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_RT $TARGETS_MISC || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ $INSTALLER_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x" ] || [ "$TARGETS_INSTALLER" != " " ]; then
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo "$DIR/build-rpms-serial --installer --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_INSTALLER"
|
||||
$DIR/build-rpms-serial --installer --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $TARGETS_INSTALLER || exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_INSTALLER" != " " ]; then
|
||||
echo "$DIR/build-srpms-serial --installer --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_INSTALLER"
|
||||
$DIR/build-srpms-serial --installer --clean $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $TARGETS_INSTALLER || exit 1
|
||||
fi
|
||||
fi
|
||||
exit $?
|
||||
fi
|
||||
|
||||
function launch_build()
|
||||
{
|
||||
local build_type=$1
|
||||
shift
|
||||
|
||||
local logfile=$MY_WORKSPACE/build-$build_type.log
|
||||
local rc
|
||||
local targets
|
||||
|
||||
if [ "$build_type" == "std" ]; then
|
||||
targets="$TARGETS_STD $TARGETS_MISC"
|
||||
else
|
||||
if [ "$build_type" == "rt" ]; then
|
||||
targets="$TARGETS_RT $TARGETS_MISC"
|
||||
else
|
||||
if [ "$build_type" == "installer" ]; then
|
||||
targets="$TARGETS_INSTALLER"
|
||||
else
|
||||
targets="$TARGETS"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Launching $build_type build, logging to $logfile"
|
||||
|
||||
echo -e "\n######## $(date): Launching build-srpms-serial --$build_type $EXTRA_ARGS $@\n" | tee --append $logfile
|
||||
# No clean flag, call build-srpms-serial followed by build-rpms-serial
|
||||
echo "$DIR/build-srpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets" | tee --append $logfile
|
||||
$DIR/build-srpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets 2>&1 | tee --append $logfile
|
||||
rc=${PIPESTATUS[0]}
|
||||
if [ $rc -eq 0 ]; then
|
||||
echo -e "\n######## $(date): build-srpm-serial --$build_type was successful" | tee --append $logfile
|
||||
else
|
||||
echo -e "\n######## $(date): build-srpm-serial --$build_type failed with rc=$rc" | tee --append $logfile
|
||||
echo -e "\n$(date): build-srpm-serial --$build_type failed with rc=$rc"
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
if [ $EDIT_FLAG -ne 1 ]; then
|
||||
echo -e "\n######## $(date): Launching build-rpms-serial --$build_type $EXTRA_ARGS $@\n" | tee --append $logfile
|
||||
echo "$DIR/build-rpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_SRPM $targets" | tee --append $logfile
|
||||
$DIR/build-rpms-serial --$build_type $EXTRA_ARGS_COMMON $EXTRA_ARGS_RPM $targets 2>&1 | tee --append $logfile
|
||||
rc=${PIPESTATUS[0]}
|
||||
if [ $rc -eq 0 ]; then
|
||||
echo -e "\n######## $(date): build-rpm-serial --$build_type was successful" | tee --append $logfile
|
||||
else
|
||||
echo -e "\n######## $(date): build-rpm-serial --$build_type failed with rc=$rc" | tee --append $logfile
|
||||
echo -e "\n$(date): build-rpm-serial --$build_type failed with rc=$rc"
|
||||
exit $rc
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -e "\n$(date): $build_type complete\n"
|
||||
#exit $rc
|
||||
}
|
||||
|
||||
function progbar()
|
||||
{
|
||||
while :; do
|
||||
for s in / - \\ \|; do
|
||||
printf "\r$s"
|
||||
sleep .5
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
# Create $MY_WORKSPACE if it doesn't exist already
|
||||
mkdir -p $MY_WORKSPACE
|
||||
|
||||
if [ $STD_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_STD" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
launch_build std
|
||||
else
|
||||
echo "Skipping 'std' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
else
|
||||
echo "Skipping 'std' build"
|
||||
fi
|
||||
if [ $RT_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_RT" != " " ] || [ "$TARGETS_MISC" != " " ]; then
|
||||
launch_build rt
|
||||
else
|
||||
echo "Skipping 'rt' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
else
|
||||
echo "Skipping 'rt' build"
|
||||
fi
|
||||
if [ $INSTALLER_BUILD -eq 1 ]; then
|
||||
if [ "x$TARGETS" == "x " ] || [ "$TARGETS_INSTALLER" != " " ]; then
|
||||
launch_build installer
|
||||
else
|
||||
echo "Skipping 'installer' build, no valid targets in list: $TARGETS"
|
||||
fi
|
||||
# else
|
||||
# echo "Skipping 'installer' build"
|
||||
fi
|
||||
|
||||
|
||||
#progbar &
|
||||
|
||||
#function killemall() {
|
||||
# for pid in $(jobs -p)
|
||||
# do
|
||||
# pgid=$(echo -n $(ps -o pgid= $pid))
|
||||
# if [ -n "$pgid" ]; then
|
||||
# echo "Killing child progress group: kill -TERM -$pgid"
|
||||
# kill -TERM -$pgid
|
||||
# fi
|
||||
# done
|
||||
# echo "Bad mojo when you ctrl-C, so don't"
|
||||
#}
|
||||
|
||||
#trap killemall INT
|
||||
|
||||
## Wait for builds to complete
|
||||
#wait %1
|
||||
#STD_BUILD_RC=$?
|
||||
|
||||
#wait %2
|
||||
#RT_BUILD_RC=$?
|
||||
|
||||
# Kill the progress bar
|
||||
#kill %3
|
||||
|
||||
#if [ $STD_BUILD_RC -ne 0 -o $RT_BUILD_RC -ne 0 ]; then
|
||||
# echo "One or more builds failed"
|
||||
# exit 1
|
||||
#fi
|
||||
|
||||
echo "All builds were successful"
|
||||
|
||||
exit 0
|
||||
|
1
build-tools/build-pkgs4
Symbolic link
1
build-tools/build-pkgs4
Symbolic link
@ -0,0 +1 @@
|
||||
build-pkgs-parallel
|
34
build-tools/build-rpms
Executable file
34
build-tools/build-rpms
Executable file
@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This program is a wrapper around build-rpms-parallel and build-rpms-serial
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " Create binary rpms:"
|
||||
echo " build-rpms [--serial] [args]"
|
||||
}
|
||||
|
||||
SERIAL_FLAG=0
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$1" in
|
||||
--serial) SERIAL_FLAG=1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
which mock_tmpfs_umount >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
SERIAL_FLAG=1
|
||||
fi
|
||||
|
||||
if [ $SERIAL_FLAG -eq 1 ]; then
|
||||
echo "build-rpms-serial $@"
|
||||
build-rpms-serial "$@"
|
||||
else
|
||||
echo "build-rpms-parallel $@"
|
||||
build-rpms-parallel "$@"
|
||||
fi
|
||||
|
2343
build-tools/build-rpms-parallel
Executable file
2343
build-tools/build-rpms-parallel
Executable file
File diff suppressed because it is too large
Load Diff
1328
build-tools/build-rpms-serial
Executable file
1328
build-tools/build-rpms-serial
Executable file
File diff suppressed because it is too large
Load Diff
1
build-tools/build-rpms4
Symbolic link
1
build-tools/build-rpms4
Symbolic link
@ -0,0 +1 @@
|
||||
build-rpms-parallel
|
70
build-tools/build-sdk
Executable file
70
build-tools/build-sdk
Executable file
@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
|
||||
# We find SDK files in two ways -- one is that any package with an
|
||||
# "-cgts-sdk" component in the filename is deemed to have SDK content
|
||||
# (this works great for packages that produce installable content, as well
|
||||
# as SDK content which is placed in a separate -cgts-sdk package)
|
||||
#
|
||||
# The second way is explicitly name packages that contain SDK content. This
|
||||
# works well for packages which only contain SDK content. The other reason
|
||||
# that calling out packages explcitly may be of use is that some packages
|
||||
# (like restapi-doc) may not be built automatically because they get caught
|
||||
# in the blacklist filter (i.e. we normally don't build restapi-doc because
|
||||
# it contains "doc").
|
||||
|
||||
EXPLICIT_PACKAGES=( \
|
||||
wrs-branding \
|
||||
wrs-heat-templates \
|
||||
install-log-server \
|
||||
restapi-doc \
|
||||
remote-clients \
|
||||
)
|
||||
|
||||
extract_to_sdk () {
|
||||
pushd $SDKTMP
|
||||
rpm2cpio $1 | cpio -id
|
||||
popd
|
||||
}
|
||||
|
||||
SDKDIR=$MY_WORKSPACE/export/cgts-sdk
|
||||
SDKTMP=$MY_WORKSPACE/export/cgts-sdk_tmp
|
||||
SDKTMPFILE=$MY_WORKSPACE/export/sdk_tmp_file
|
||||
|
||||
# These patterns match packages for which we find SDK tarballs
|
||||
PATTERNS=(wrs-branding*.x86_64.rpm \
|
||||
wrs-heat-templates*.x86_64.rpm \
|
||||
*cgts-sdk*.x86_64.rpm \
|
||||
install-log-server*.x86_64.rpm \
|
||||
restapi-doc*.x86_64.rpm \
|
||||
remote-clients*.x86_64.rpm )
|
||||
|
||||
rm -f $SDKTMPFILE
|
||||
|
||||
for pkg in "${EXPLICIT_PACKAGES[@]}"; do
|
||||
ls $MY_WORKSPACE/std/rpmbuild/RPMS/$pkg*.x86_64.rpm > /dev/null
|
||||
if [ $? -eq 2 ]; then # no page found...
|
||||
build-rpms --std $pkg --no-descendants
|
||||
fi
|
||||
done
|
||||
|
||||
for pat in "${PATTERNS[@]}"; do
|
||||
find $MY_WORKSPACE/std/rpmbuild/RPMS/$pat >> $SDKTMPFILE
|
||||
done
|
||||
|
||||
rm -rf $SDKDIR $SDKTMP
|
||||
mkdir -p $SDKDIR
|
||||
mkdir -p $SDKTMP
|
||||
|
||||
# extract the files
|
||||
while read rpm; do
|
||||
extract_to_sdk $rpm
|
||||
done < $SDKTMPFILE
|
||||
|
||||
find $SDKTMP -name "*.tgz" -exec cp -v {} $SDKDIR \;
|
||||
|
||||
rm -f $SDKTMPFILE
|
||||
rm -rf $SDKTMP
|
||||
|
||||
echo ""
|
||||
echo "Done. SDK in $SDKDIR"
|
||||
echo ""
|
34
build-tools/build-srpms
Executable file
34
build-tools/build-srpms
Executable file
@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This program is a wrapper around build-srpms-parallel and build-srpms-serial
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " Create source rpms:"
|
||||
echo " build-srpms [--serial] [args]"
|
||||
}
|
||||
|
||||
SERIAL_FLAG=0
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$1" in
|
||||
--serial) SERIAL_FLAG=1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
which mock_tmpfs_umount >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
SERIAL_FLAG=1
|
||||
fi
|
||||
|
||||
if [ $SERIAL_FLAG -eq 1 ]; then
|
||||
echo "build-srpms-serial $@"
|
||||
build-srpms-serial "$@"
|
||||
else
|
||||
echo "build-srpms-parallel $@"
|
||||
build-srpms-parallel "$@"
|
||||
fi
|
||||
|
1438
build-tools/build-srpms-parallel
Executable file
1438
build-tools/build-srpms-parallel
Executable file
File diff suppressed because it is too large
Load Diff
1161
build-tools/build-srpms-serial
Executable file
1161
build-tools/build-srpms-serial
Executable file
File diff suppressed because it is too large
Load Diff
1
build-tools/build-srpms4
Symbolic link
1
build-tools/build-srpms4
Symbolic link
@ -0,0 +1 @@
|
||||
build-srpms-parallel
|
123
build-tools/build_guest/build-guest-image.py
Executable file
123
build-tools/build_guest/build-guest-image.py
Executable file
@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# Build a bootable guest image from the supplied rootfs archive
|
||||
#
|
||||
|
||||
import getopt
|
||||
import guestfs
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
MBR_FILE='/usr/share/syslinux/mbr.bin'
|
||||
MBR_SIZE=440
|
||||
|
||||
def build_image(inputfile, outputfile, extrasize, trace):
|
||||
g = guestfs.GuestFS(python_return_dict=True)
|
||||
|
||||
# Set the trace flag so that we can see each libguestfs call.
|
||||
if trace:
|
||||
g.set_trace(1)
|
||||
|
||||
# Create a raw-format sparse disk image with padding of size
|
||||
inputsize = os.path.getsize(inputfile)
|
||||
g.disk_create(outputfile, "raw", inputsize + extrasize)
|
||||
|
||||
# Attach the new disk image to libguestfs.
|
||||
g.add_drive_opts(outputfile, format="raw", readonly=0)
|
||||
|
||||
# Run the libguestfs back-end.
|
||||
g.launch()
|
||||
|
||||
# Get the list of devices. Because we only added one drive
|
||||
# above, we expect that this list should contain a single
|
||||
# element.
|
||||
devices = g.list_devices()
|
||||
assert(len(devices) == 1)
|
||||
|
||||
# Partition the disk as one single MBR partition.
|
||||
g.part_disk(devices[0], "mbr")
|
||||
|
||||
# Get the list of partitions. We expect a single element, which
|
||||
# is the partition we have just created.
|
||||
partitions = g.list_partitions()
|
||||
assert(len(partitions) == 1)
|
||||
|
||||
# Create a filesystem on the partition.
|
||||
# NOTE: extlinux does not support 64-bit file systems
|
||||
g.mkfs("ext4", partitions[0], features="^64bit")
|
||||
|
||||
# Now mount the filesystem so that we can add files.
|
||||
g.mount(partitions[0], "/")
|
||||
|
||||
# Upload file system files and directories.
|
||||
g.tar_in(inputfile, "/")
|
||||
|
||||
# Install the boot loader
|
||||
g.extlinux("/boot")
|
||||
|
||||
# Unmount the file systems.
|
||||
g.umount_all();
|
||||
|
||||
# Write the master boot record.
|
||||
with open(MBR_FILE, mode='rb') as mbr:
|
||||
mbr_data = mbr.read()
|
||||
assert(len(mbr_data) == MBR_SIZE)
|
||||
g.pwrite_device(devices[0], mbr_data, 0)
|
||||
|
||||
# Mark the device as bootable.
|
||||
g.part_set_bootable(devices[0], 1, 1)
|
||||
|
||||
# Label the boot disk for root identification
|
||||
g.set_label(partitions[0], "wrs_guest")
|
||||
|
||||
# Shutdown and close guest image
|
||||
g.shutdown()
|
||||
g.close()
|
||||
|
||||
|
||||
def exit_usage(result=0):
|
||||
print('USAGE: -i <input-file> -o <output-file> [-s <extra-bytes>]')
|
||||
sys.exit(result)
|
||||
|
||||
|
||||
def main(argv):
|
||||
inputfile = None
|
||||
outputfile = None
|
||||
extrasize = None
|
||||
trace = False
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv,"hxi:o:s:",
|
||||
["input=", "output=", "size="])
|
||||
except getopt.GetoptError:
|
||||
exit_usage(2)
|
||||
for opt, arg in opts:
|
||||
if opt == '-h':
|
||||
exit_usage()
|
||||
if opt == '-x':
|
||||
trace = True
|
||||
elif opt in ("-i", "--input"):
|
||||
inputfile = arg
|
||||
elif opt in ("-o", "--output"):
|
||||
outputfile = arg
|
||||
elif opt in ("-s", "--size"):
|
||||
extrasize = int(arg)
|
||||
|
||||
if not inputfile:
|
||||
print(stderr, "ERROR: missing input file")
|
||||
exit_usage(-1)
|
||||
|
||||
if not outputfile:
|
||||
print(stderr, "ERROR: missing output file")
|
||||
exit_usage(-1)
|
||||
|
||||
if not extrasize:
|
||||
extrasize = 0
|
||||
|
||||
build_image(inputfile, outputfile, extrasize, trace)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
39
build-tools/build_guest/image-rt.inc
Normal file
39
build-tools/build_guest/image-rt.inc
Normal file
@ -0,0 +1,39 @@
|
||||
# List of CGTS packages to be included/installed in guest image
|
||||
# If these have dependencies, they will be pulled in automatically
|
||||
#
|
||||
build-info
|
||||
|
||||
# custom cloud-init configuration
|
||||
|
||||
# guest extensions
|
||||
guest-scale-agent
|
||||
guest-host-comm
|
||||
guest-client
|
||||
|
||||
# Latest version of the i40e drivers from Intel.
|
||||
kmod-i40e-rt
|
||||
kmod-i40evf-rt
|
||||
|
||||
# Latest version of the ixgbe drivers from Intel.
|
||||
kmod-ixgbe-rt
|
||||
kmod-ixgbevf-rt
|
||||
|
||||
# Configure connectx pro devices to ethernet mode.
|
||||
# This is needed for PT devices
|
||||
# mlx4-config
|
||||
|
||||
# Intel QuickAssist
|
||||
# qat16-guest
|
||||
# qat16-guest-app
|
||||
qat17-rt
|
||||
|
||||
# TPM2 libs to enable vTPM on Guest
|
||||
tss2
|
||||
tpm2-tools
|
||||
kmod-tpm-rt
|
||||
|
||||
# ima plugin for RPM
|
||||
rpm-plugin-systemd-inhibit
|
||||
|
||||
# Add cfn-push-stats for heat demos
|
||||
heat-cfntools
|
44
build-tools/build_guest/image.inc
Normal file
44
build-tools/build_guest/image.inc
Normal file
@ -0,0 +1,44 @@
|
||||
# List of CGTS packages to be included/installed in guest image
|
||||
# If these have dependencies, they will be pulled in automatically
|
||||
#
|
||||
build-info
|
||||
|
||||
# custom cloud-init configuration
|
||||
|
||||
# guest extensions
|
||||
guest-scale-agent
|
||||
guest-host-comm
|
||||
guest-client
|
||||
|
||||
# Latest version of the i40e drivers from Intel.
|
||||
kmod-i40e
|
||||
kmod-i40evf
|
||||
|
||||
# Latest version of the ixgbe drivers from Intel.
|
||||
kmod-ixgbe
|
||||
kmod-ixgbevf
|
||||
|
||||
# Intel QuickAssist
|
||||
# qat16-guest
|
||||
# qat16-guest-app
|
||||
qat17
|
||||
|
||||
# TPM2 libs to enable vTPM on Guest
|
||||
tss2
|
||||
tpm2-tools
|
||||
kmod-tpm
|
||||
|
||||
# This will help us have our automation debug TC failures when pings to VMs fail.
|
||||
qemu-guest-agent
|
||||
|
||||
# ima plugin for rpm
|
||||
rpm-plugin-systemd-inhibit
|
||||
|
||||
# Add debugging tools
|
||||
perf
|
||||
zip
|
||||
unzip
|
||||
traceroute
|
||||
|
||||
# Add cfn-push-stats for heat demos
|
||||
heat-cfntools
|
13
build-tools/build_guest/rootfs-exclude.txt
Normal file
13
build-tools/build_guest/rootfs-exclude.txt
Normal file
@ -0,0 +1,13 @@
|
||||
# exclude special filesystems
|
||||
/builddir
|
||||
/dev/*
|
||||
/proc/*
|
||||
/tmp/*
|
||||
/sys/*
|
||||
/root/rootfs.tar
|
||||
|
||||
# exclude local repo yum configuration
|
||||
/etc/yum/yum.conf
|
||||
|
||||
# omit platform hooks to check install uuid
|
||||
/etc/dhcp/dhclient-enter-hooks
|
7
build-tools/build_guest/rootfs-rt/boot/extlinux.conf
Normal file
7
build-tools/build_guest/rootfs-rt/boot/extlinux.conf
Normal file
@ -0,0 +1,7 @@
|
||||
SERIAL 0 115200
|
||||
|
||||
DEFAULT linux
|
||||
LABEL linux
|
||||
KERNEL vmlinuz
|
||||
INITRD initramfs.img
|
||||
APPEND rw root=LABEL=wrs_guest clocksource=pit console=tty0 console=ttyS0 biosdevname=0 net.ifnames=0 no_timer_check audit=0 cgroup_disable=memory isolcpus=1-3 irqaffinity=0 nmi_watchdog=0 softlockup_panic=0 intel_idle.max_cstate=0 processor.max_cstate=1 idle=poll
|
90
build-tools/build_guest/rootfs-setup.sh
Executable file
90
build-tools/build_guest/rootfs-setup.sh
Executable file
@ -0,0 +1,90 @@
|
||||
#!/bin/bash
|
||||
|
||||
BUILD_MODE=''
|
||||
if [ "$1" == "--rt" ]; then
|
||||
BUILD_MODE="rt"
|
||||
fi
|
||||
if [ "$1" == "--std" ]; then
|
||||
BUILD_MODE="std"
|
||||
fi
|
||||
|
||||
# Setup boot directory for syslinux configuration (/boot/extlinux.conf)
|
||||
ln -s $(ls /boot/vmlinuz-*.x86_64 | head -1) /boot/vmlinuz
|
||||
ln -s $(ls /boot/initramfs-*.x86_64.img | head -1) /boot/initramfs.img
|
||||
|
||||
# Setup root and wrsroot users
|
||||
usermod -p $(openssl passwd -1 root) root
|
||||
useradd -p $(openssl passwd -1 wrsroot) wrsroot
|
||||
|
||||
# Enable SUDO access for wrsroot
|
||||
echo "wrsroot ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
||||
|
||||
# Enable remote root login to permit automated tools to run privileged commands
|
||||
sed -i 's%^#\(PermitRootLogin \)%\1%' /etc/ssh/sshd_config
|
||||
sed -i 's#^\(PermitRootLogin \).*#\1yes#' /etc/ssh/sshd_config
|
||||
|
||||
# Enable password login to permit automated tools to run commands
|
||||
sed -i 's%^#\(PasswordAuthentication \)%\1%' /etc/ssh/sshd_config
|
||||
sed -i 's#^\(PasswordAuthentication \).*#\1yes#' /etc/ssh/sshd_config
|
||||
|
||||
# Disable PAM authentication
|
||||
sed -i 's#^\(UsePAM \).*#\1no#' /etc/ssh/sshd_config
|
||||
|
||||
# Prevent cloud_init for reverting our changes
|
||||
sed -i 's#^\(ssh_pwauth:\).*#\1 1#' /etc/cloud/cloud.cfg
|
||||
sed -i 's#^\(disable_root:\).*#\1 0#' /etc/cloud/cloud.cfg
|
||||
|
||||
# Setup SSHD to mark packets for QoS processing in the host (this seems to
|
||||
# be broken in our version of SSHd so equivalent iptables rules are being
|
||||
# added to compensate.
|
||||
echo "IPQoS cs7" >> /etc/ssh/sshd_config
|
||||
|
||||
# Disable reverse path filtering to permit traffic testing from
|
||||
# foreign routes.
|
||||
sed -i 's#^\(net.ipv4.conf.*.rp_filter=\).*#\10#' /etc/sysctl.conf
|
||||
|
||||
# Change /etc/rc.local to touch a file to indicate that the init has
|
||||
# completed. This is required by the AVS vbenchmark tool so that it knows
|
||||
# that the VM is ready to run. This was added because VM instances take a
|
||||
# long time (2-3 minutes) to resize their filesystem when run on a system with
|
||||
# HDD instead of SSD.
|
||||
chmod +x /etc/rc.d/rc.local
|
||||
echo "touch /var/run/.init-complete" >> /etc/rc.local
|
||||
|
||||
if [ "$BUILD_MODE" == "rt" ]; then
|
||||
# Adjust system tuning knobs during init when using rt kernel (CGTS-7047)
|
||||
echo "echo 1 > /sys/devices/virtual/workqueue/cpumask" >> /etc/rc.local
|
||||
echo "echo 1 > /sys/bus/workqueue/devices/writeback/cpumask" >> /etc/rc.local
|
||||
echo "echo -1 > /proc/sys/kernel/sched_rt_runtime_us" >> /etc/rc.local
|
||||
echo "echo 0 > /proc/sys/kernel/timer_migration" >> /etc/rc.local
|
||||
echo "echo 10 > /proc/sys/vm/stat_interval" >> /etc/rc.local
|
||||
fi
|
||||
|
||||
# Disable audit service by default
|
||||
# With this enabled, it causes system delays when running at maximum
|
||||
# capacity that impacts the traffic processing enough to cause unclean
|
||||
# traffic runs when doing benchmark tests.
|
||||
systemctl disable auditd
|
||||
|
||||
if [ "$BUILD_MODE" == "rt" ]; then
|
||||
# Additional services to disable on rt guest (CGTS-7047)
|
||||
systemctl disable polkit.service
|
||||
systemctl disable tuned.service
|
||||
fi
|
||||
|
||||
# Clean the yum cache. We don't want to maintain it on the guest file system.
|
||||
yum clean all
|
||||
|
||||
# update /etc/rsyslog.conf to have OmitLocalLogging off
|
||||
sed -i 's#OmitLocalLogging on#OmitLocalLogging off#g' /etc/rsyslog.conf
|
||||
|
||||
# select correct kernel and initrd
|
||||
if [ "$BUILD_MODE" == "rt" ]; then
|
||||
PATTERN=$(rpm -q --qf '%{VERSION}-%{RELEASE}' kernel-rt)
|
||||
else
|
||||
PATTERN=$(rpm -q --qf '%{VERSION}-%{RELEASE}' kernel)
|
||||
fi
|
||||
cd /boot
|
||||
rm -f vmlinuz initramfs.img
|
||||
ln -s $(ls -1 vmlinuz-$PATTERN*) vmlinuz
|
||||
ln -s $(ls -1 initramfs-$PATTERN*img) initramfs.img
|
7
build-tools/build_guest/rootfs-std/boot/extlinux.conf
Normal file
7
build-tools/build_guest/rootfs-std/boot/extlinux.conf
Normal file
@ -0,0 +1,7 @@
|
||||
SERIAL 0 115200
|
||||
|
||||
DEFAULT linux
|
||||
LABEL linux
|
||||
KERNEL vmlinuz
|
||||
INITRD initramfs.img
|
||||
APPEND rw root=LABEL=wrs_guest clocksource=pit console=tty0 console=ttyS0 biosdevname=0 net.ifnames=0 no_timer_check
|
@ -0,0 +1,18 @@
|
||||
# Override the datasource list to use only those that are expected (and needed)
|
||||
# to work in our lab environment.
|
||||
#
|
||||
datasource_list:
|
||||
- NoCloud
|
||||
- ConfigDrive
|
||||
- Ec2
|
||||
- None
|
||||
|
||||
# Adjust the Ec2 max_wait to be 30 seconds instead of the default 120 seconds,
|
||||
# and set the list of URLs to be the only one that we expect to work in our lab
|
||||
# environment so that we avoid DNS lookup failures for alternate choices.
|
||||
#
|
||||
datasource:
|
||||
Ec2:
|
||||
timeout: 10
|
||||
max_wait: 30
|
||||
metadata_urls: ['http://169.254.169.254']
|
21
build-tools/build_guest/rootfs/etc/dhcp/dhclient.conf
Normal file
21
build-tools/build_guest/rootfs/etc/dhcp/dhclient.conf
Normal file
@ -0,0 +1,21 @@
|
||||
## Use a CID based on the hardware address for both IPv4 and IPv6. This mostly
|
||||
## useful for IPv6 to ensure that the client is not using a random DUID for the
|
||||
## CID on each reboot.
|
||||
send dhcp6.client-id = concat(00:03:00, hardware);
|
||||
send dhcp-client-identifier = concat(00:03:00, hardware);
|
||||
|
||||
## Defaults for all interfaces
|
||||
request interface-mtu, subnet-mask, broadcast-address, time-offset,
|
||||
classless-static-routes;
|
||||
|
||||
interface "eth0" {
|
||||
## Override for eth0 to add requests for attributes that we only care to
|
||||
## configure for our primary network interface
|
||||
request interface-mtu, subnet-mask, broadcast-address, time-offset,
|
||||
domain-name, domain-name-servers, host-name,
|
||||
classless-static-routes, routers;
|
||||
}
|
||||
|
||||
timeout 15;
|
||||
|
||||
retry 5;
|
12
build-tools/build_guest/rootfs/etc/iptables.rules
Normal file
12
build-tools/build_guest/rootfs/etc/iptables.rules
Normal file
@ -0,0 +1,12 @@
|
||||
*mangle
|
||||
:PREROUTING ACCEPT [0:0]
|
||||
:INPUT ACCEPT [0:0]
|
||||
:FORWARD ACCEPT [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:POSTROUTING ACCEPT [0:0]
|
||||
-A OUTPUT -o eth0 -p tcp --sport 22 -j DSCP --set-dscp-class CS7
|
||||
-A OUTPUT -o eth0 -p tcp --dport 22 -j DSCP --set-dscp-class CS7
|
||||
-A OUTPUT -o eth0 -p udp --sport 67:68 -j DSCP --set-dscp-class CS7
|
||||
-A OUTPUT -o eth0 -p udp --dport 67:68 -j DSCP --set-dscp-class CS7
|
||||
-A OUTPUT -o eth0 -d 169.254.169.254 -j DSCP --set-dscp-class CS7
|
||||
COMMIT
|
@ -0,0 +1 @@
|
||||
blacklist floppy
|
@ -0,0 +1 @@
|
||||
options wrs_avp kthread_cpulist=0-7 kthread_policy=0
|
@ -0,0 +1 @@
|
||||
wrs_avp
|
@ -0,0 +1,8 @@
|
||||
DEVICE=eth0
|
||||
BOOTPROTO=dhcp
|
||||
ONBOOT=yes
|
||||
TYPE=Ethernet
|
||||
USERCTL=yes
|
||||
PEERDNS=yes
|
||||
IPV6INIT=no
|
||||
PERSISTENT_DHCLIENT=1
|
@ -0,0 +1,4 @@
|
||||
# Renames interfaces to be sequential ethX interface names regardless of interface type
|
||||
# This is required to avoid a kernel host patch that starts number at 1000 and to
|
||||
# override slot specific naming for non-kernel interfaces.
|
||||
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", KERNEL=="eth?*" PROGRAM=="/usr/lib/udev/renumber_device", NAME="$result"
|
12
build-tools/build_guest/rootfs/usr/lib/udev/renumber_device
Executable file
12
build-tools/build_guest/rootfs/usr/lib/udev/renumber_device
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# Renames interfaces to be sequential ethX interface names regardless of interface type
|
||||
# This is required to avoid a kernel host patch that starts number at 1000 and to
|
||||
# override slot specific naming for non-kernel interfaces.
|
||||
|
||||
# The ifindex for the first interface that is not 'lo' will be 2.
|
||||
# Therefore adjust the numbering to start at 0 for eth0..ethN naming
|
||||
|
||||
INDEX=$(($IFINDEX-2))
|
||||
echo "eth$INDEX"
|
||||
|
||||
exit 0
|
305
build-tools/build_guest/rpm-install-list-rt.txt
Normal file
305
build-tools/build_guest/rpm-install-list-rt.txt
Normal file
@ -0,0 +1,305 @@
|
||||
# list of standard packages to include in the guest image
|
||||
acl
|
||||
acpid
|
||||
audit
|
||||
audit-libs
|
||||
audit-libs-python
|
||||
authconfig
|
||||
basesystem
|
||||
bash
|
||||
bind-libs-lite
|
||||
bind-license
|
||||
binutils
|
||||
bonnie++
|
||||
bridge-utils
|
||||
btrfs-progs
|
||||
bzip2-libs
|
||||
ca-certificates
|
||||
centos-logos
|
||||
centos-release
|
||||
checkpolicy
|
||||
chkconfig
|
||||
chrony
|
||||
cloud-init
|
||||
cloud-utils-growpart
|
||||
coreutils
|
||||
cpio
|
||||
cracklib
|
||||
cracklib-dicts
|
||||
cronie
|
||||
cronie-anacron
|
||||
crontabs
|
||||
cryptsetup-libs
|
||||
curl
|
||||
cyrus-sasl-lib
|
||||
dbus
|
||||
dbus-glib
|
||||
dbus-libs
|
||||
dbus-python
|
||||
device-mapper
|
||||
device-mapper-libs
|
||||
dhclient
|
||||
dhcp-common
|
||||
dhcp-libs
|
||||
diffutils
|
||||
dmidecode
|
||||
dnsmasq
|
||||
dracut
|
||||
dracut-config-generic
|
||||
dracut-config-rescue
|
||||
dracut-network
|
||||
e2fsprogs
|
||||
e2fsprogs-libs
|
||||
elfutils-libelf
|
||||
elfutils-libs
|
||||
ethtool
|
||||
expat
|
||||
file
|
||||
file-libs
|
||||
filesystem
|
||||
findutils
|
||||
fipscheck
|
||||
fipscheck-lib
|
||||
freetype
|
||||
gawk
|
||||
gdbm
|
||||
gettext
|
||||
gettext-libs
|
||||
glib2
|
||||
glibc
|
||||
glibc-common
|
||||
glib-networking
|
||||
gmp
|
||||
gnupg2
|
||||
gnutls
|
||||
gobject-introspection
|
||||
gpgme
|
||||
grep
|
||||
groff-base
|
||||
grub2
|
||||
grub2-tools
|
||||
grubby
|
||||
gsettings-desktop-schemas
|
||||
gssproxy
|
||||
gzip
|
||||
hardlink
|
||||
hostname
|
||||
info
|
||||
initscripts
|
||||
iperf3
|
||||
iproute
|
||||
iptables
|
||||
iputils
|
||||
irqbalance
|
||||
iwl7265-firmware
|
||||
jansson
|
||||
jbigkit-libs
|
||||
json-c
|
||||
kbd
|
||||
kbd-legacy
|
||||
kbd-misc
|
||||
kernel-rt
|
||||
kernel-rt-tools
|
||||
kernel-rt-tools-libs
|
||||
kexec-tools
|
||||
keyutils
|
||||
keyutils-libs
|
||||
kmod
|
||||
kmod-libs
|
||||
kpartx
|
||||
krb5-libs
|
||||
less
|
||||
libacl
|
||||
libassuan
|
||||
libattr
|
||||
libbasicobjects
|
||||
libblkid
|
||||
libcap
|
||||
libcap-ng
|
||||
libcgroup
|
||||
libcollection
|
||||
libcom_err
|
||||
libcroco
|
||||
libcurl
|
||||
libdaemon
|
||||
libdb
|
||||
libdb-utils
|
||||
libedit
|
||||
libestr
|
||||
libevent
|
||||
libffi
|
||||
libgcc
|
||||
libgcrypt
|
||||
libgomp
|
||||
libgpg-error
|
||||
libgudev1
|
||||
libidn
|
||||
libini_config
|
||||
libjpeg-turbo
|
||||
libmnl
|
||||
libmodman
|
||||
libmount
|
||||
libndp
|
||||
libnetfilter_conntrack
|
||||
libnfnetlink
|
||||
libnfsidmap
|
||||
libnl3
|
||||
libnl3-cli
|
||||
libpath_utils
|
||||
libpcap
|
||||
libpipeline
|
||||
libproxy
|
||||
libpwquality
|
||||
libref_array
|
||||
libselinux
|
||||
libselinux-python
|
||||
libselinux-utils
|
||||
libsemanage
|
||||
libsemanage-python
|
||||
libsepol
|
||||
libsoup
|
||||
libss
|
||||
libssh2
|
||||
libstdc++
|
||||
libsysfs
|
||||
libtalloc
|
||||
libtasn1
|
||||
libteam
|
||||
libtevent
|
||||
libtiff
|
||||
libtirpc
|
||||
libunistring
|
||||
libuser
|
||||
libutempter
|
||||
libuuid
|
||||
libverto
|
||||
libverto-tevent
|
||||
libwebp
|
||||
libxml2
|
||||
libyaml
|
||||
logrotate
|
||||
lua
|
||||
lzo
|
||||
make
|
||||
man-db
|
||||
mariadb-libs
|
||||
microcode_ctl
|
||||
mozjs17
|
||||
ncurses
|
||||
ncurses-base
|
||||
ncurses-libs
|
||||
nettle
|
||||
net-tools
|
||||
newt
|
||||
newt-python
|
||||
nfs-utils
|
||||
nspr
|
||||
nss
|
||||
nss-softokn
|
||||
nss-softokn-freebl
|
||||
nss-sysinit
|
||||
nss-tools
|
||||
nss-util
|
||||
numactl-libs
|
||||
openssh
|
||||
openssh-clients
|
||||
openssh-server
|
||||
openssl
|
||||
openssl-libs
|
||||
os-prober
|
||||
p11-kit
|
||||
p11-kit-trust
|
||||
pam
|
||||
parted
|
||||
passwd
|
||||
pciutils
|
||||
pciutils-libs
|
||||
pcre
|
||||
pinentry
|
||||
pkgconfig
|
||||
policycoreutils
|
||||
policycoreutils-python
|
||||
polkit
|
||||
polkit-pkla-compat
|
||||
popt
|
||||
postfix
|
||||
ppp
|
||||
procps-ng
|
||||
pth
|
||||
pygobject3-base
|
||||
pygpgme
|
||||
pyliblzma
|
||||
python
|
||||
python-backports
|
||||
python-backports-ssl_match_hostname
|
||||
python-chardet
|
||||
python-cheetah
|
||||
python-configobj
|
||||
python-decorator
|
||||
python-iniparse
|
||||
python-IPy
|
||||
python-jsonpatch
|
||||
python-jsonpointer
|
||||
python-kitchen
|
||||
python-libs
|
||||
python-markdown
|
||||
python-perf
|
||||
python-pillow
|
||||
python-prettytable
|
||||
python-pycurl
|
||||
python-pygments
|
||||
python-pyudev
|
||||
python-requests
|
||||
python2-six
|
||||
python-urlgrabber
|
||||
python-urllib3
|
||||
pyxattr
|
||||
PyYAML
|
||||
qrencode-libs
|
||||
quota
|
||||
quota-nls
|
||||
rdma
|
||||
readline
|
||||
rootfiles
|
||||
rpcbind
|
||||
rpm
|
||||
rpm-build-libs
|
||||
rpm-libs
|
||||
rpm-python
|
||||
rsync
|
||||
rsyslog
|
||||
sed
|
||||
rt-setup
|
||||
rtctl
|
||||
shadow-utils
|
||||
shared-mime-info
|
||||
slang
|
||||
snappy
|
||||
sqlite
|
||||
sudo
|
||||
systemd
|
||||
systemd-libs
|
||||
systemd-sysv
|
||||
sysvinit-tools
|
||||
tar
|
||||
tcpdump
|
||||
tcp_wrappers
|
||||
tcp_wrappers-libs
|
||||
teamd
|
||||
trousers
|
||||
tuned
|
||||
tzdata
|
||||
ustr
|
||||
util-linux
|
||||
vim-minimal
|
||||
virt-what
|
||||
wget
|
||||
which
|
||||
wpa_supplicant
|
||||
xz
|
||||
xz-libs
|
||||
yum
|
||||
yum-metadata-parser
|
||||
yum-plugin-fastestmirror
|
||||
yum-utils
|
||||
zlib
|
303
build-tools/build_guest/rpm-install-list.txt
Normal file
303
build-tools/build_guest/rpm-install-list.txt
Normal file
@ -0,0 +1,303 @@
|
||||
# list of standard packages to include in the guest image
|
||||
acl
|
||||
acpid
|
||||
audit
|
||||
audit-libs
|
||||
audit-libs-python
|
||||
authconfig
|
||||
basesystem
|
||||
bash
|
||||
bind-libs-lite
|
||||
bind-license
|
||||
binutils
|
||||
bonnie++
|
||||
bridge-utils
|
||||
btrfs-progs
|
||||
bzip2-libs
|
||||
ca-certificates
|
||||
centos-logos
|
||||
centos-release
|
||||
checkpolicy
|
||||
chkconfig
|
||||
chrony
|
||||
cloud-init
|
||||
cloud-utils-growpart
|
||||
coreutils
|
||||
cpio
|
||||
cracklib
|
||||
cracklib-dicts
|
||||
cronie
|
||||
cronie-anacron
|
||||
crontabs
|
||||
cryptsetup-libs
|
||||
curl
|
||||
cyrus-sasl-lib
|
||||
dbus
|
||||
dbus-glib
|
||||
dbus-libs
|
||||
dbus-python
|
||||
device-mapper
|
||||
device-mapper-libs
|
||||
dhclient
|
||||
dhcp-common
|
||||
dhcp-libs
|
||||
diffutils
|
||||
dmidecode
|
||||
dnsmasq
|
||||
dracut
|
||||
dracut-config-generic
|
||||
dracut-config-rescue
|
||||
dracut-network
|
||||
e2fsprogs
|
||||
e2fsprogs-libs
|
||||
elfutils-libelf
|
||||
elfutils-libs
|
||||
ethtool
|
||||
expat
|
||||
file
|
||||
file-libs
|
||||
filesystem
|
||||
findutils
|
||||
fipscheck
|
||||
fipscheck-lib
|
||||
freetype
|
||||
gawk
|
||||
gdbm
|
||||
gettext
|
||||
gettext-libs
|
||||
glib2
|
||||
glibc
|
||||
glibc-common
|
||||
glib-networking
|
||||
gmp
|
||||
gnupg2
|
||||
gnutls
|
||||
gobject-introspection
|
||||
gpgme
|
||||
grep
|
||||
groff-base
|
||||
grub2
|
||||
grub2-tools
|
||||
grubby
|
||||
gsettings-desktop-schemas
|
||||
gssproxy
|
||||
gzip
|
||||
hardlink
|
||||
hostname
|
||||
info
|
||||
initscripts
|
||||
iperf3
|
||||
iproute
|
||||
iptables
|
||||
iputils
|
||||
irqbalance
|
||||
iwl7265-firmware
|
||||
jansson
|
||||
jbigkit-libs
|
||||
json-c
|
||||
kbd
|
||||
kbd-legacy
|
||||
kbd-misc
|
||||
kernel
|
||||
kernel-tools
|
||||
kernel-tools-libs
|
||||
kexec-tools
|
||||
keyutils
|
||||
keyutils-libs
|
||||
kmod
|
||||
kmod-libs
|
||||
kpartx
|
||||
krb5-libs
|
||||
less
|
||||
libacl
|
||||
libassuan
|
||||
libattr
|
||||
libbasicobjects
|
||||
libblkid
|
||||
libcap
|
||||
libcap-ng
|
||||
libcgroup
|
||||
libcollection
|
||||
libcom_err
|
||||
libcroco
|
||||
libcurl
|
||||
libdaemon
|
||||
libdb
|
||||
libdb-utils
|
||||
libedit
|
||||
libestr
|
||||
libevent
|
||||
libffi
|
||||
libgcc
|
||||
libgcrypt
|
||||
libgomp
|
||||
libgpg-error
|
||||
libgudev1
|
||||
libidn
|
||||
libini_config
|
||||
libjpeg-turbo
|
||||
libmnl
|
||||
libmodman
|
||||
libmount
|
||||
libndp
|
||||
libnetfilter_conntrack
|
||||
libnfnetlink
|
||||
libnfsidmap
|
||||
libnl3
|
||||
libnl3-cli
|
||||
libpath_utils
|
||||
libpcap
|
||||
libpipeline
|
||||
libproxy
|
||||
libpwquality
|
||||
libref_array
|
||||
libselinux
|
||||
libselinux-python
|
||||
libselinux-utils
|
||||
libsemanage
|
||||
libsemanage-python
|
||||
libsepol
|
||||
libsoup
|
||||
libss
|
||||
libssh2
|
||||
libstdc++
|
||||
libsysfs
|
||||
libtalloc
|
||||
libtasn1
|
||||
libteam
|
||||
libtevent
|
||||
libtiff
|
||||
libtirpc
|
||||
libunistring
|
||||
libuser
|
||||
libutempter
|
||||
libuuid
|
||||
libverto
|
||||
libverto-tevent
|
||||
libwebp
|
||||
libxml2
|
||||
libyaml
|
||||
logrotate
|
||||
lua
|
||||
lzo
|
||||
make
|
||||
man-db
|
||||
mariadb-libs
|
||||
microcode_ctl
|
||||
mozjs17
|
||||
ncurses
|
||||
ncurses-base
|
||||
ncurses-libs
|
||||
nettle
|
||||
net-tools
|
||||
newt
|
||||
newt-python
|
||||
nfs-utils
|
||||
nspr
|
||||
nss
|
||||
nss-softokn
|
||||
nss-softokn-freebl
|
||||
nss-sysinit
|
||||
nss-tools
|
||||
nss-util
|
||||
numactl-libs
|
||||
openssh
|
||||
openssh-clients
|
||||
openssh-server
|
||||
openssl
|
||||
openssl-libs
|
||||
os-prober
|
||||
p11-kit
|
||||
p11-kit-trust
|
||||
pam
|
||||
parted
|
||||
passwd
|
||||
pciutils
|
||||
pciutils-libs
|
||||
pcre
|
||||
pinentry
|
||||
pkgconfig
|
||||
policycoreutils
|
||||
policycoreutils-python
|
||||
polkit
|
||||
polkit-pkla-compat
|
||||
popt
|
||||
postfix
|
||||
ppp
|
||||
procps-ng
|
||||
pth
|
||||
pygobject3-base
|
||||
pygpgme
|
||||
pyliblzma
|
||||
python
|
||||
python-backports
|
||||
python-backports-ssl_match_hostname
|
||||
python-chardet
|
||||
python-cheetah
|
||||
python-configobj
|
||||
python-decorator
|
||||
python-iniparse
|
||||
python-IPy
|
||||
python-jsonpatch
|
||||
python-jsonpointer
|
||||
python-kitchen
|
||||
python-libs
|
||||
python-markdown
|
||||
python-perf
|
||||
python-pillow
|
||||
python-prettytable
|
||||
python-pycurl
|
||||
python-pygments
|
||||
python-pyudev
|
||||
python-requests
|
||||
python2-six
|
||||
python-urlgrabber
|
||||
python-urllib3
|
||||
pyxattr
|
||||
PyYAML
|
||||
qrencode-libs
|
||||
quota
|
||||
quota-nls
|
||||
rdma
|
||||
readline
|
||||
rootfiles
|
||||
rpcbind
|
||||
rpm
|
||||
rpm-build-libs
|
||||
rpm-libs
|
||||
rpm-python
|
||||
rsync
|
||||
rsyslog
|
||||
sed
|
||||
setup
|
||||
shadow-utils
|
||||
shared-mime-info
|
||||
slang
|
||||
snappy
|
||||
sqlite
|
||||
sudo
|
||||
systemd
|
||||
systemd-libs
|
||||
systemd-sysv
|
||||
sysvinit-tools
|
||||
tar
|
||||
tcpdump
|
||||
tcp_wrappers
|
||||
tcp_wrappers-libs
|
||||
teamd
|
||||
trousers
|
||||
tzdata
|
||||
ustr
|
||||
util-linux
|
||||
vim-enhanced
|
||||
virt-what
|
||||
wget
|
||||
which
|
||||
wpa_supplicant
|
||||
xz
|
||||
xz-libs
|
||||
yum
|
||||
yum-metadata-parser
|
||||
yum-plugin-fastestmirror
|
||||
yum-utils
|
||||
zlib
|
7
build-tools/build_guest/rpm-remove-list.txt
Normal file
7
build-tools/build_guest/rpm-remove-list.txt
Normal file
@ -0,0 +1,7 @@
|
||||
# list of packages to be excluded from guest image
|
||||
cpp
|
||||
gcc
|
||||
gcc-c++
|
||||
gdb
|
||||
linux-firmware
|
||||
rpm-build
|
40
build-tools/build_iso/anaconda-ks.cfg
Normal file
40
build-tools/build_iso/anaconda-ks.cfg
Normal file
@ -0,0 +1,40 @@
|
||||
#version=DEVEL
|
||||
# System authorization information
|
||||
auth --enableshadow --passalgo=sha512
|
||||
# Use CDROM installation media
|
||||
cdrom
|
||||
# Use graphical install
|
||||
graphical
|
||||
# Run the Setup Agent on first boot
|
||||
firstboot --enable
|
||||
ignoredisk --only-use=sda
|
||||
# Keyboard layouts
|
||||
keyboard --vckeymap=us --xlayouts='us'
|
||||
# System language
|
||||
lang en_US.UTF-8
|
||||
|
||||
# Network information
|
||||
network --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto
|
||||
network --bootproto=static --device=enp0s8 --ip=10.10.10.10 --netmask=255.255.255.0 --ipv6=auto --activate
|
||||
network --device=lo --hostname=localhost.localdomain
|
||||
|
||||
#Root password
|
||||
rootpw --lock
|
||||
# System timezone
|
||||
timezone America/New_York --isUtc
|
||||
user --groups=wheel --name=wrsroot --password=$6$c3gaCcJlh.rp//Yx$/mIjNNoUDS1qZldBL29YSJdsA9ttPA/nXN1CPsIcCmionXC22APT3IoRSd9j5dPiZoviDdQf7YxLsOYdieOQr/ --iscrypted --gecos="wrsroot"
|
||||
# System bootloader configuration
|
||||
bootloader --location=mbr --boot-drive=sda
|
||||
autopart --type=lvm
|
||||
# Partition clearing information
|
||||
clearpart --all --initlabel --drives=sda
|
||||
|
||||
%packages
|
||||
@^minimal
|
||||
@core
|
||||
|
||||
%end
|
||||
|
||||
%addon com_redhat_kdump --disable --reserve-mb='auto'
|
||||
|
||||
%end
|
296
build-tools/build_iso/cgts_deps.sh
Executable file
296
build-tools/build_iso/cgts_deps.sh
Executable file
@ -0,0 +1,296 @@
|
||||
#!/bin/env bash
|
||||
|
||||
# Here's the score, kids. There are a few different places from which we can
|
||||
# get packages. In priority order, they are:
|
||||
#
|
||||
# The CGTS packages we've built ourselves
|
||||
# The CGTS packages that Jenkins has built (coming soon to a script near you)
|
||||
# The CentOS packages in various repos
|
||||
# - Base OS
|
||||
# - OpenStack Repos
|
||||
# EPEL (Extra Packages for Enterprise Linux)
|
||||
#
|
||||
# This script can function in two ways:
|
||||
# If you specify a filename, it assumes the file is a list of packages you
|
||||
# want to install, or dependencies you want to meet. It installs whatever
|
||||
# is in the list into current directory. Failure to find a dependency
|
||||
# results in a return code of 1
|
||||
#
|
||||
# If no file is specified, we generate a file ($DEPLISTFILE) of dependencies
|
||||
# based on current directory
|
||||
#
|
||||
# We then continuously loop through generating new dependencies and installing
|
||||
# them until either all dependencies are met, or we cannot install anymore
|
||||
#
|
||||
# We also log where dependencies were installed from into
|
||||
# export/dist/report_deps.txt
|
||||
#
|
||||
|
||||
# This function generates a simple file of dependencies we're trying to resolve
|
||||
function generate_dep_list {
|
||||
TMP_RPM_DB=$(mktemp -d $(pwd)/tmp_rpm_db_XXXXXX)
|
||||
mkdir -p $TMP_RPM_DB
|
||||
rpm --initdb --dbpath $TMP_RPM_DB
|
||||
rpm --dbpath $TMP_RPM_DB --test -Uvh --replacefiles '*.rpm' >> $DEPDETAILLISTFILE 2>&1
|
||||
rpm --dbpath $TMP_RPM_DB --test -Uvh --replacefiles '*.rpm' 2>&1 \
|
||||
| grep -v "error:" \
|
||||
| grep -v "warning:" \
|
||||
| grep -v "Preparing..." \
|
||||
| sed "s/ is needed by.*$//" | sed "s/ >=.*$//" | sort -u > $DEPLISTFILE
|
||||
\rm -rf $TMP_RPM_DB
|
||||
}
|
||||
|
||||
# Takes a list of requirements (either explcit package name, or capabilities
|
||||
# to provide) and install packages to meet those dependancies
|
||||
#
|
||||
# We take the list of requirements and first try to look them up based on
|
||||
# package name. If we can't find a package with the name of the requirement,
|
||||
# we use --whatprovides to complete the lookup.
|
||||
#
|
||||
# The reason for this initial name-based attempt is that a couple of funky
|
||||
# packages (notably -devel packages) have "Provides:" capabilities which
|
||||
# conflict with named packages. So if explictly say we want "xyz" then we'll
|
||||
# install the "xyz" package, rather than "something-devel" which has "xyz"
|
||||
# capabilities.
|
||||
function install_deps {
|
||||
local DEP_LIST=""
|
||||
local DEP_LIST_FILE="$1"
|
||||
|
||||
# Temporary files are used in a few different ways
|
||||
# Here we essenitally create variable aliases to make it easier to read
|
||||
# the script
|
||||
local UNSORTED_PACKAGES=$TMPFILE
|
||||
local SORTED_PACKAGES=$TMPFILE1
|
||||
local UNRESOLVED_PACKAGES=$TMPFILE2
|
||||
|
||||
rm -f $UNSORTED_PACKAGES
|
||||
|
||||
while read DEP
|
||||
do
|
||||
DEP_LIST="${DEP_LIST} ${DEP}"
|
||||
done < $DEP_LIST_FILE
|
||||
|
||||
echo "Debug: List of deps to resolve: ${DEP_LIST}"
|
||||
|
||||
if [ -z "${DEP_LIST}" ]
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# go through each repo and convert deps to packages based on package name
|
||||
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
|
||||
echo "TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch ${DEP_LIST} --qf='%{name}'"
|
||||
TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --qf='%{name}' ${DEP_LIST} | sed "s/kernel-debug/kernel/g" >> $UNSORTED_PACKAGES
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
done
|
||||
sort $UNSORTED_PACKAGES -u > $SORTED_PACKAGES
|
||||
|
||||
# figure out any dependancies which could not be resolved based on
|
||||
# package name. We use --whatpovides to deal with this
|
||||
#
|
||||
# First, we build a new DEP_LIST based on what was NOT found in
|
||||
# search-by-name attempt
|
||||
sort $DEP_LIST_FILE -u > $TMPFILE
|
||||
comm -2 -3 $TMPFILE $SORTED_PACKAGES > $UNRESOLVED_PACKAGES
|
||||
|
||||
# If there are any requirements not resolved, look up the packages with
|
||||
# --whatprovides
|
||||
if [ -s $UNRESOLVED_PACKAGES ]; then
|
||||
DEP_LIST=""
|
||||
\cp $SORTED_PACKAGES $UNSORTED_PACKAGES
|
||||
while read DEP
|
||||
do
|
||||
DEP_LIST="${DEP_LIST} ${DEP}"
|
||||
done < $UNRESOLVED_PACKAGES
|
||||
|
||||
DEP_LIST=$(echo "$DEP_LIST" | sed 's/^ //g')
|
||||
if [ "$DEP_LIST" != "" ]; then
|
||||
|
||||
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
|
||||
echo "TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --whatprovides ${DEP_LIST} --qf='%{name}'"
|
||||
TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --qf='%{name}' --whatprovides ${DEP_LIST} | sed "s/kernel-debug/kernel/g" >> $UNSORTED_PACKAGES
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
done
|
||||
fi
|
||||
|
||||
sort -u $UNSORTED_PACKAGES > $SORTED_PACKAGES
|
||||
fi
|
||||
|
||||
# clean up
|
||||
\rm -f $UNSORTED_PACKAGES $UNRESOLVED_PACKAGES
|
||||
|
||||
# We now have, in SORTED_PACKAGES, a list of all packages that we need to install
|
||||
# to meet our dependancies
|
||||
DEP_LIST=" "
|
||||
while read DEP
|
||||
do
|
||||
DEP_LIST="${DEP_LIST}${DEP} "
|
||||
done < $SORTED_PACKAGES
|
||||
rm $SORTED_PACKAGES
|
||||
|
||||
# go through each repo and install packages
|
||||
local TARGETS=${DEP_LIST}
|
||||
echo "Debug: Resolved list of deps to install: ${TARGETS}"
|
||||
local UNRESOLVED
|
||||
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
|
||||
UNRESOLVED="$TARGETS"
|
||||
|
||||
if [[ ! -z "${TARGETS// }" ]]; then
|
||||
REPO_PATH=$(cat $YUM | sed -n "/^\[$REPOID\]\$/,\$p" | grep '^baseurl=' | head -n 1 | awk -F 'file://' '{print $2}' | sed 's:/$::')
|
||||
>&2 echo "TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf='%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}'"
|
||||
TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf="%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}" | sort -r -V > $TMPFILE
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
|
||||
while read STR
|
||||
do
|
||||
>&2 echo "STR=$STR"
|
||||
if [ "x$STR" == "x" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
PKG=`echo $STR | cut -d " " -f 1`
|
||||
PKG_FILE=`echo $STR | cut -d " " -f 2`
|
||||
PKG_REL_PATH=`echo $STR | cut -d " " -f 3`
|
||||
PKG_PATH="${REPO_PATH}/${PKG_REL_PATH}"
|
||||
|
||||
>&2 echo "Installing PKG=$PKG PKG_FILE=$PKG_FILE PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH from repo $REPOID"
|
||||
cp $PKG_PATH .
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
>&2 echo " Here's what I have to work with..."
|
||||
>&2 echo " TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $PKG --qf=\"%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}\""
|
||||
>&2 echo " PKG=$PKG PKG_FILE=$PKG_FILE REPO_PATH=$REPO_PATH PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH"
|
||||
fi
|
||||
|
||||
echo $UNRESOLVED | grep $PKG >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "$PKG found in $REPOID as $PKG" >> $BUILT_REPORT
|
||||
echo "$PKG_PATH" >> $BUILT_REPORT
|
||||
UNRESOLVED=$(echo "$UNRESOLVED" | sed "s# $PKG # #g")
|
||||
else
|
||||
echo "$PKG satisfies unknown target in $REPOID" >> $BUILT_REPORT
|
||||
echo " but it doesn't match targets, $UNRESOLVED" >> $BUILT_REPORT
|
||||
echo " path $PKG_PATH" >> $BUILT_REPORT
|
||||
FOUND_UNKNOWN=1
|
||||
fi
|
||||
done < $TMPFILE #<<< "$(TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf=\"%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}\" | sort -r -V)"
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
TARGETS="$UNRESOLVED"
|
||||
fi
|
||||
done
|
||||
>&2 echo "Debug: Packages still unresolved: $UNRESOLVED"
|
||||
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $WARNINGS_REPORT
|
||||
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $BUILT_REPORT
|
||||
>&2 echo ""
|
||||
}
|
||||
|
||||
function check_all_explicit_deps_installed
|
||||
{
|
||||
|
||||
PKGS_TO_CHECK=" "
|
||||
while read PKG_TO_ADD
|
||||
do
|
||||
PKGS_TO_CHECK="$PKGS_TO_CHECK ${PKG_TO_ADD}"
|
||||
done < $DEPLISTFILE
|
||||
rpm -qp $MY_WORKSPACE/export/dist/isolinux/Packages/*.rpm --qf="%{name}\n" --nosignature > $TMPFILE
|
||||
|
||||
while read INSTALLED_PACKAGE
|
||||
do
|
||||
echo $PKGS_TO_CHECK | grep -q "${INSTALLED_PACKAGE}"
|
||||
if [ $? -eq 0 ]; then
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE} //"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE} / /"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE}\$//"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE}\$//"`
|
||||
fi
|
||||
done < $TMPFILE
|
||||
|
||||
if [ -z "$PKGS_TO_CHECK" ]
|
||||
then
|
||||
>&2 echo "All explicitly specified packages resolved!"
|
||||
else
|
||||
>&2 echo "Could not resolve packages: $PKGS_TO_CHECK"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
ATTEMPTED=0
|
||||
DISCOVERED=0
|
||||
OUTPUT_DIR=$MY_WORKSPACE/export
|
||||
TMP_DIR=$MY_WORKSPACE/tmp
|
||||
YUM=$OUTPUT_DIR/yum.conf
|
||||
DEPLISTFILE=$OUTPUT_DIR/deps.txt
|
||||
DEPDETAILLISTFILE=$OUTPUT_DIR/deps_detail.txt
|
||||
|
||||
BUILT_REPORT=$OUTPUT_DIR/local.txt
|
||||
WARNINGS_REPORT=$OUTPUT_DIR/warnings.txt
|
||||
LAST_TEST=$OUTPUT_DIR/last_test.txt
|
||||
TMPFILE=$OUTPUT_DIR/cgts_deps_tmp.txt
|
||||
TMPFILE1=$OUTPUT_DIR/cgts_deps_tmp1.txt
|
||||
TMPFILE2=$OUTPUT_DIR/cgts_deps_tmp2.txt
|
||||
|
||||
touch "$BUILT_REPORT"
|
||||
touch "$WARNINGS_REPORT"
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
case $i in
|
||||
-d=*|--deps=*)
|
||||
DEPS="${i#*=}"
|
||||
shift # past argument=value
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
mkdir -p $TMP_DIR
|
||||
|
||||
rm -f "$DEPDETAILLISTFILE"
|
||||
# FIRST PASS we are being given a list of REQUIRED dependencies
|
||||
if [ "${DEPS}x" != "x" ]; then
|
||||
cat $DEPS | grep -v "^#" | sed '/^\s*$/d' > $DEPLISTFILE
|
||||
install_deps $DEPLISTFILE
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# check that we resolved them all
|
||||
check_all_explicit_deps_installed
|
||||
if [ $? -ne 0 ]; then
|
||||
>&2 echo "Error -- could not install all explicitly listed packages"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ALL_RESOLVED=0
|
||||
|
||||
while [ $ALL_RESOLVED -eq 0 ]; do
|
||||
cp $DEPLISTFILE $DEPLISTFILE.old
|
||||
generate_dep_list
|
||||
if [ ! -s $DEPLISTFILE ]; then
|
||||
# no more dependencies!
|
||||
ALL_RESOLVED=1
|
||||
else
|
||||
DIFFLINES=`diff $DEPLISTFILE.old $DEPLISTFILE | wc -l`
|
||||
if [ $DIFFLINES -eq 0 ]; then
|
||||
>&2 echo "Warning: Infinite loop detected in dependency resolution. See $DEPLISTFILE for details -- exiting"
|
||||
>&2 echo "These RPMS had problems (likely version conflicts)"
|
||||
>&2 cat $DEPLISTFILE
|
||||
|
||||
echo "Warning: Infinite loop detected in dependency resolution See $DEPLISTFILE for details -- exiting" >> $WARNINGS_REPORT
|
||||
echo "These RPMS had problems (likely version conflicts)" >> $WARNINGS_REPORT
|
||||
cat $DEPLISTFILE >> $WARNINGS_REPORT
|
||||
|
||||
date > $LAST_TEST
|
||||
|
||||
rm -f $DEPLISTFILE.old
|
||||
exit 1 # nothing fixed
|
||||
fi
|
||||
install_deps $DEPLISTFILE
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
BIN
build-tools/build_iso/comps.xml.gz
Normal file
BIN
build-tools/build_iso/comps.xml.gz
Normal file
Binary file not shown.
122
build-tools/build_iso/gather_packages.pl
Executable file
122
build-tools/build_iso/gather_packages.pl
Executable file
@ -0,0 +1,122 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# Copy/pasted from http://www.smorgasbork.com/content/gather_packages.txt
|
||||
# As referenced by http://www.smorgasbork.com/2012/01/04/building-a-custom-centos-7-kickstart-disc-part-2/
|
||||
|
||||
use XML::Simple;
|
||||
|
||||
my ($comps_file, $rpm_src_path, $rpm_dst_path, $arch, @extra_groups_and_packages) = @ARGV;
|
||||
|
||||
if (!-e $comps_file)
|
||||
{
|
||||
print_usage ("Can't find '$comps_file'");
|
||||
}
|
||||
if (!-e $rpm_src_path)
|
||||
{
|
||||
print_usage ("RPM source path '$rpm_src_path' does not exist");
|
||||
}
|
||||
if (!-e $rpm_dst_path)
|
||||
{
|
||||
print_usage ("RPM destination path '$rpm_dst_path' does not exist");
|
||||
}
|
||||
if (!$arch)
|
||||
{
|
||||
print_usage ("Architecture not specified");
|
||||
}
|
||||
|
||||
#### we always gather core and base; note that for CentOS 7, we also need
|
||||
#### to include the grub2 package, or installation will fail
|
||||
@desired_groups = ('core', 'base', 'grub2');
|
||||
foreach (@extra_groups_and_packages)
|
||||
{
|
||||
push (@desired_groups, $_);
|
||||
}
|
||||
|
||||
$regex = '^(' . join ('|', @desired_groups) . ')$';
|
||||
|
||||
print "reading $comps_file...\n";
|
||||
print "getting RPMs from $rpm_src_path...\n";
|
||||
|
||||
$xml = new XML::Simple;
|
||||
$comps = $xml->XMLin($comps_file);
|
||||
|
||||
$cmd = "rm $rpm_dst_path/*";
|
||||
print "$cmd\n";
|
||||
`$cmd`;
|
||||
|
||||
%copied_groups = {};
|
||||
%copied_packages = {};
|
||||
|
||||
foreach $group (@{$comps->{group}})
|
||||
{
|
||||
$id = $group->{id};
|
||||
if ($id !~ m#$regex#)
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
print "#### group \@$id\n";
|
||||
$packagelist = $group->{packagelist};
|
||||
foreach $pr (@{$packagelist->{packagereq}})
|
||||
{
|
||||
if ($pr->{type} eq 'optional' || $pr->{type} eq 'conditional')
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
$cmd = "cp $rpm_src_path/" . $pr->{content} . "-[0-9]*.$arch.rpm"
|
||||
. " $rpm_src_path/" . $pr->{content} . "-[0-9]*.noarch.rpm $rpm_dst_path";
|
||||
print "$cmd\n";
|
||||
`$cmd 2>&1`;
|
||||
|
||||
$copied_packages{$pr->{content}} = 1;
|
||||
}
|
||||
|
||||
$copied_groups{$group} = 1;
|
||||
}
|
||||
|
||||
#### assume that any strings that weren't matched in the comps file's group list
|
||||
#### are actually packages
|
||||
|
||||
foreach $group (@desired_groups)
|
||||
{
|
||||
if ($copied_groups{$group})
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
$cmd = "cp $rpm_src_path/" . $group . "-[0-9]*.$arch.rpm"
|
||||
. " $rpm_src_path/" . $group . "-[0-9]*.noarch.rpm $rpm_dst_path";
|
||||
print "$cmd\n";
|
||||
`$cmd 2>&1`;
|
||||
}
|
||||
|
||||
sub print_usage
|
||||
{
|
||||
my ($msg) = @_;
|
||||
|
||||
($msg) && print "$msg\n\n";
|
||||
|
||||
print <<__TEXT__;
|
||||
|
||||
parse_comps.pl comps_file rpm_src_path arch [xtra_grps_and_pkgs]
|
||||
|
||||
comps_file the full path to the comps.xml file (as provided
|
||||
in the original distro
|
||||
|
||||
rpm_src_path the full path to the directory of all RPMs from
|
||||
the distro
|
||||
|
||||
rpm_dst_path the full path to the directory where you want
|
||||
to save the RPMs for your kickstart
|
||||
|
||||
arch the target system architecture (e.g. x86_64)
|
||||
|
||||
xtra_grps_and_pkgs a list of extra groups and packages, separated by spaces
|
||||
|
||||
|
||||
__TEXT__
|
||||
|
||||
exit;
|
||||
}
|
||||
|
4
build-tools/build_iso/image-dev.inc
Normal file
4
build-tools/build_iso/image-dev.inc
Normal file
@ -0,0 +1,4 @@
|
||||
# The following packages will not be included in the customer ISO
|
||||
#
|
||||
# They are exceptional packages only to be included in developer builds
|
||||
enable-dev-patch
|
364
build-tools/build_iso/image.inc
Normal file
364
build-tools/build_iso/image.inc
Normal file
@ -0,0 +1,364 @@
|
||||
# List of CGTS packages to be included/installed in ISO
|
||||
# If these have dependencies, they will be pulled in automatically
|
||||
#
|
||||
acpid
|
||||
audit
|
||||
build-info
|
||||
bash
|
||||
ceph-manager
|
||||
cgcs-patch-agent
|
||||
cgcs-patch-controller
|
||||
cgts-mtce-compute
|
||||
cgts-mtce-control
|
||||
cgts-mtce-storage
|
||||
computeconfig
|
||||
computeconfig-standalone
|
||||
computeconfig-subfunction
|
||||
compute-huge
|
||||
dnsmasq
|
||||
dnsmasq-utils
|
||||
dpkg
|
||||
filesystem-scripts
|
||||
fm-api
|
||||
gdb
|
||||
grub2
|
||||
grub2-efi
|
||||
grub2-efi-modules
|
||||
grub2-tools
|
||||
haproxy
|
||||
io-monitor
|
||||
iperf3
|
||||
isomd5sum
|
||||
iscsi-initiator-utils
|
||||
iscsi-initiator-utils-iscsiuio
|
||||
kmod-drbd
|
||||
libevent
|
||||
libtrap-handler
|
||||
libvirt-docs
|
||||
libvirt-python
|
||||
logrotate
|
||||
lshell
|
||||
net-snmp-libs
|
||||
net-snmp-python
|
||||
net-snmp-utils
|
||||
nfv
|
||||
nfv-common
|
||||
nfv-plugins
|
||||
nfv-tools
|
||||
nfv-vim
|
||||
nfv-client
|
||||
nova-utils
|
||||
ntpdate
|
||||
openldap
|
||||
openldap-clients
|
||||
openldap-servers
|
||||
openssh
|
||||
openssh-clients
|
||||
openssh-server
|
||||
openstack-ras
|
||||
pam
|
||||
parted
|
||||
platform-util
|
||||
platform-util-noncontroller
|
||||
python-cephclient
|
||||
python-keyring
|
||||
qemu-kvm-tools-ev
|
||||
rsync
|
||||
sm-client
|
||||
sm-tools
|
||||
snmp-ext
|
||||
storageconfig
|
||||
sysinv
|
||||
sysinv-agent
|
||||
tsconfig
|
||||
tboot
|
||||
rabbitmq-server
|
||||
cgts-client
|
||||
python-django-horizon
|
||||
libvirt
|
||||
libvirt-client
|
||||
libvirt-daemon
|
||||
libvirt-daemon-config-network
|
||||
libvirt-daemon-config-nwfilter
|
||||
libvirt-daemon-driver-lxc
|
||||
libvirt-daemon-driver-network
|
||||
libvirt-daemon-driver-nodedev
|
||||
libvirt-daemon-driver-nwfilter
|
||||
libvirt-daemon-driver-qemu
|
||||
libvirt-daemon-driver-secret
|
||||
libvirt-daemon-driver-storage
|
||||
nova-api-proxy
|
||||
configutilities
|
||||
controllerconfig
|
||||
fm-common
|
||||
fm-mgr
|
||||
logmgmt
|
||||
cgts-mtce-common
|
||||
cgts-mtce-common-pmon
|
||||
cgts-mtce-common-rmon
|
||||
cgts-mtce-common-hostw
|
||||
cgts-mtce-common-hwmon
|
||||
cgts-mtce-common-guestAgent
|
||||
cgts-mtce-common-guestServer
|
||||
cgcs-patch
|
||||
patch-alarm
|
||||
# patch-boot-args is not ported to centos yet
|
||||
wrs-ssl
|
||||
tss2
|
||||
tpm2-tools
|
||||
tpm2-openssl-engine
|
||||
libtpms
|
||||
swtpm
|
||||
swtpm-tools
|
||||
swtpm-cuse
|
||||
monitor-tools
|
||||
python2-aodhclient
|
||||
openstack-aodh-api
|
||||
openstack-aodh-evaluator
|
||||
openstack-aodh-expirer
|
||||
openstack-aodh-listener
|
||||
openstack-aodh-notifier
|
||||
python-ceilometer
|
||||
#openstack-ceilometer-alarm provided in openstack-aodh-compat package
|
||||
openstack-aodh-compat
|
||||
openstack-ceilometer-api
|
||||
openstack-ceilometer-collector
|
||||
openstack-ceilometer-common
|
||||
openstack-ceilometer-ipmi
|
||||
openstack-ceilometer-notification
|
||||
openstack-ceilometer-polling
|
||||
openstack-cinder
|
||||
openstack-glance
|
||||
openstack-heat-api
|
||||
openstack-heat-api-cfn
|
||||
openstack-heat-api-cloudwatch
|
||||
openstack-heat-common
|
||||
openstack-heat-engine
|
||||
openstack-ironic-api
|
||||
openstack-ironic-common
|
||||
openstack-ironic-conductor
|
||||
python2-ironicclient
|
||||
# doc generation turned off in Mitaka by default
|
||||
#python-django-horizon-doc
|
||||
openstack-keystone
|
||||
openstack-murano-api
|
||||
openstack-murano-cf-api
|
||||
openstack-murano-common
|
||||
openstack-murano-doc
|
||||
openstack-murano-engine
|
||||
openstack-murano-ui
|
||||
openstack-murano-ui-doc
|
||||
python2-muranoclient
|
||||
python-muranoclient-doc
|
||||
openstack-magnum-api
|
||||
openstack-magnum-common
|
||||
openstack-magnum-conductor
|
||||
openstack-magnum-doc
|
||||
openstack-magnum-ui
|
||||
python2-magnumclient
|
||||
python-magnum
|
||||
python-magnumclient-doc
|
||||
python-magnumclient-tests
|
||||
python-magnum-tests
|
||||
openstack-neutron
|
||||
openstack-neutron-common
|
||||
openstack-neutron-sriov-nic-agent
|
||||
openstack-neutron-ml2
|
||||
openstack-neutron-openvswitch
|
||||
python-neutron
|
||||
openstack-nova-api
|
||||
openstack-nova-cells
|
||||
openstack-nova-cert
|
||||
openstack-nova-common
|
||||
openstack-nova-compute
|
||||
openstack-nova-conductor
|
||||
openstack-nova-console
|
||||
openstack-nova-network
|
||||
openstack-nova-novncproxy
|
||||
# openstack-nova-objectstore removed in Mitaka
|
||||
#openstack-nova-objectstore
|
||||
openstack-nova-scheduler
|
||||
openstack-nova-serialproxy
|
||||
openstack-nova-spicehtml5proxy
|
||||
openstack-nova-placement-api
|
||||
python-nova
|
||||
python2-novaclient
|
||||
python2-openstackclient
|
||||
python2-oslo-log
|
||||
python2-django-openstack-auth
|
||||
python2-six
|
||||
#base-files is not yet ported to CENTOS
|
||||
cgcs-users
|
||||
namespace-utils
|
||||
nss-pam-ldapd
|
||||
# thin-provisioning-tools is not yet ported to CENTOS
|
||||
# cluster-resource-agents is not yet ported to CENTOS
|
||||
dhcp
|
||||
nfs-utils
|
||||
initscripts
|
||||
# note -- the "systemd" package provides udev
|
||||
systemd
|
||||
# udev-extraconf is not yet ported to CENTOS
|
||||
# cdrkit is only available as a src.rpm
|
||||
python-d2to1
|
||||
# eucatools is not yet ported to CENTOS
|
||||
facter
|
||||
hiera
|
||||
# libaugesas-ruby is not yet ported to CENTOS
|
||||
nfscheck
|
||||
python2-pecan
|
||||
# pseudo not available
|
||||
# ps-byte-compile is not yet ported to CENTOS
|
||||
python
|
||||
python-configobj
|
||||
python-pep8
|
||||
# python-pyflakes is not yet ported to CENTOS
|
||||
python2-rsa
|
||||
# python-xmlrpclib is not yet ported to CENTOS
|
||||
ruby-shadow
|
||||
swig
|
||||
syslinux
|
||||
iotop
|
||||
iptables
|
||||
iptables-services
|
||||
iptables-utils
|
||||
ldapscripts
|
||||
lighttpd
|
||||
lighttpd-fastcgi
|
||||
lighttpd-mod_geoip
|
||||
lighttpd-mod_mysql_vhost
|
||||
novnc
|
||||
ntp
|
||||
ntp-perl
|
||||
procps-ng
|
||||
python-daemon
|
||||
python2-gunicorn
|
||||
python-pyudev
|
||||
python-smartpm
|
||||
# shadow is not yet ported to CENTOS
|
||||
shadow-utils
|
||||
syslog-ng
|
||||
syslog-ng-libdbi
|
||||
drbd
|
||||
drbd-bash-completion
|
||||
# drbd-debuginfo
|
||||
drbd-heartbeat
|
||||
# drbd-kernel-debuginfo
|
||||
drbd-pacemaker
|
||||
drbd-udev
|
||||
drbd-utils
|
||||
# drbd-tools is not yet ported to CENTOS
|
||||
# nfv-docs should not be included
|
||||
# nfv-tests should not be included
|
||||
curl
|
||||
lvm2
|
||||
# tgt is ported, but not yet added here
|
||||
sm
|
||||
sm-common
|
||||
sm-common-libs
|
||||
sm-db
|
||||
sm-api
|
||||
sm-eru
|
||||
time
|
||||
puppet
|
||||
puppet-manifests
|
||||
openstack-dashboard
|
||||
# openstack-dashboard-theme TODO: fix build-iso
|
||||
dhclient
|
||||
postgresql
|
||||
postgresql-server
|
||||
postgresql-contrib
|
||||
python-psycopg2
|
||||
setup
|
||||
targetcli
|
||||
sudo
|
||||
pxe-network-installer
|
||||
strace
|
||||
resource-agents
|
||||
lldpd
|
||||
wget
|
||||
bind-utils
|
||||
selinux-policy
|
||||
pm-utils
|
||||
centos-release
|
||||
tcpdump
|
||||
config-gate
|
||||
config-gate-compute
|
||||
sysstat
|
||||
smartmontools
|
||||
collector
|
||||
io-scheduler
|
||||
fm-doc
|
||||
vm-topology
|
||||
python2-wsme
|
||||
ceph
|
||||
ceph-common
|
||||
ceph-fuse
|
||||
ceph-radosgw
|
||||
libcephfs1
|
||||
python-ceph-compat
|
||||
python-cephfs
|
||||
socat
|
||||
irqbalance
|
||||
kmod-e1000e
|
||||
kmod-i40e
|
||||
kmod-ixgbe
|
||||
kmod-ixgbevf
|
||||
kmod-tpm
|
||||
kmod-integrity
|
||||
vim-enhanced
|
||||
wrs-heat-templates
|
||||
# heat-contrib-nova-flavor is now included with openstack-heat
|
||||
tis-extensions
|
||||
tis-extensions-controller
|
||||
qat17
|
||||
mlx4-config
|
||||
host-guest-comm
|
||||
guest-scale-helper
|
||||
python-networking-odl
|
||||
qemu-kvm-ev
|
||||
qemu-img-ev
|
||||
# for realtime kernel
|
||||
kernel-rt
|
||||
kernel-rt-kvm
|
||||
kmod-e1000e-rt
|
||||
kmod-i40e-rt
|
||||
kmod-ixgbe-rt
|
||||
kmod-tpm-rt
|
||||
kmod-integrity-rt
|
||||
rtctl
|
||||
rt-setup
|
||||
qat17-rt
|
||||
kernel-rt-tools
|
||||
# For low-latency compute
|
||||
kmod-drbd-rt
|
||||
snmp-audittrail
|
||||
OVMF
|
||||
# neutron bgp
|
||||
python2-networking-bgpvpn
|
||||
python-networking-bgpvpn-dashboard
|
||||
python-networking-bgpvpn-heat
|
||||
python2-neutron-dynamic-routing
|
||||
python2-ryu
|
||||
python-ryu-common
|
||||
openvswitch
|
||||
python2-networking-sfc
|
||||
openstack-panko-api
|
||||
openstack-panko-common
|
||||
python-panko
|
||||
python2-pankoclient
|
||||
# distributed cloud
|
||||
distributedcloud-dcmanager
|
||||
distributedcloud-client-dcmanagerclient
|
||||
distributedcloud-dcorch
|
||||
# ima plugin for RPM
|
||||
rpm-plugin-systemd-inhibit
|
||||
platform-kickstarts
|
||||
python-lefthandclient
|
||||
python-3parclient
|
||||
|
||||
# Add debugging tools
|
||||
perf
|
||||
zip
|
||||
unzip
|
||||
traceroute
|
125
build-tools/build_iso/isolinux.cfg
Normal file
125
build-tools/build_iso/isolinux.cfg
Normal file
@ -0,0 +1,125 @@
|
||||
default vesamenu.c32
|
||||
timeout 600
|
||||
|
||||
display boot.msg
|
||||
|
||||
# Clear the screen when exiting the menu, instead of leaving the menu displayed.
|
||||
# For vesamenu, this means the graphical background is still displayed without
|
||||
# the menu itself for as long as the screen remains in graphics mode.
|
||||
menu clear
|
||||
menu background splash.png
|
||||
menu title CentOS 7
|
||||
menu vshift 8
|
||||
menu rows 18
|
||||
menu margin 8
|
||||
#menu hidden
|
||||
menu helpmsgrow 15
|
||||
menu tabmsgrow 13
|
||||
|
||||
# Border Area
|
||||
menu color border * #00000000 #00000000 none
|
||||
|
||||
# Selected item
|
||||
menu color sel 0 #ffffffff #00000000 none
|
||||
|
||||
# Title bar
|
||||
menu color title 0 #ff7ba3d0 #00000000 none
|
||||
|
||||
# Press [Tab] message
|
||||
menu color tabmsg 0 #ff3a6496 #00000000 none
|
||||
|
||||
# Unselected menu item
|
||||
menu color unsel 0 #84b8ffff #00000000 none
|
||||
|
||||
# Selected hotkey
|
||||
menu color hotsel 0 #84b8ffff #00000000 none
|
||||
|
||||
# Unselected hotkey
|
||||
menu color hotkey 0 #ffffffff #00000000 none
|
||||
|
||||
# Help text
|
||||
menu color help 0 #ffffffff #00000000 none
|
||||
|
||||
# A scrollbar of some type? Not sure.
|
||||
menu color scrollbar 0 #ffffffff #ff355594 none
|
||||
|
||||
# Timeout msg
|
||||
menu color timeout 0 #ffffffff #00000000 none
|
||||
menu color timeout_msg 0 #ffffffff #00000000 none
|
||||
|
||||
# Command prompt text
|
||||
menu color cmdmark 0 #84b8ffff #00000000 none
|
||||
menu color cmdline 0 #ffffffff #00000000 none
|
||||
|
||||
# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.
|
||||
|
||||
menu tabmsg Press Tab for full configuration options on menu items.
|
||||
|
||||
menu separator # insert an empty line
|
||||
menu separator # insert an empty line
|
||||
|
||||
label tis
|
||||
menu label ^Install Titanium Cloud
|
||||
menu default
|
||||
kernel vmlinuz
|
||||
append initrd=initrd.img inst.ks=cdrom:/dev/cdrom:/ks/ks.cfg
|
||||
|
||||
label linux
|
||||
menu label ^Install CentOS 7
|
||||
kernel vmlinuz
|
||||
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
|
||||
|
||||
label check
|
||||
menu label Test this ^media & install CentOS 7
|
||||
kernel vmlinuz
|
||||
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
|
||||
|
||||
menu separator # insert an empty line
|
||||
|
||||
# utilities submenu
|
||||
menu begin ^Troubleshooting
|
||||
menu title Troubleshooting
|
||||
|
||||
label vesa
|
||||
menu indent count 5
|
||||
menu label Install CentOS 7 in ^basic graphics mode
|
||||
text help
|
||||
Try this option out if you're having trouble installing
|
||||
CentOS 7.
|
||||
endtext
|
||||
kernel vmlinuz
|
||||
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet
|
||||
|
||||
label rescue
|
||||
menu indent count 5
|
||||
menu label ^Rescue a CentOS system
|
||||
text help
|
||||
If the system will not boot, this lets you access files
|
||||
and edit config files to try to get it booting again.
|
||||
endtext
|
||||
kernel vmlinuz
|
||||
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet
|
||||
|
||||
label memtest
|
||||
menu label Run a ^memory test
|
||||
text help
|
||||
If your system is having issues, a problem with your
|
||||
system's memory may be the cause. Use this utility to
|
||||
see if the memory is working correctly.
|
||||
endtext
|
||||
kernel memtest
|
||||
|
||||
menu separator # insert an empty line
|
||||
|
||||
label local
|
||||
menu label Boot from ^local drive
|
||||
localboot 0xffff
|
||||
|
||||
menu separator # insert an empty line
|
||||
menu separator # insert an empty line
|
||||
|
||||
label returntomain
|
||||
menu label Return to ^main menu
|
||||
menu exit
|
||||
|
||||
menu end
|
36
build-tools/build_iso/ks.cfg
Normal file
36
build-tools/build_iso/ks.cfg
Normal file
@ -0,0 +1,36 @@
|
||||
install
|
||||
text
|
||||
lang en_US.UTF-8
|
||||
keyboard us
|
||||
reboot --eject
|
||||
firstboot --enable
|
||||
auth --enableshadow --passalgo=sha512
|
||||
|
||||
# Network information
|
||||
network --bootproto=dhcp --device=enp0s3 --onboot=on --ipv6=auto --activate
|
||||
network --bootproto=static --device=enp0s8 --ip=10.10.10.12 --netmask=255.255.255.0 --ipv6=auto --activate
|
||||
network --device=lo --hostname=localhost.localdomain
|
||||
|
||||
rootpw --lock
|
||||
timezone America/New_York --isUtc
|
||||
user --groups=wheel --name=wrsroot --password=$6$c3gaCcJlh.rp//Yx$/mIjNNoUDS1qZldBL29YSJdsA9ttPA/nXN1CPsIcCmionXC22APT3IoRSd9j5dPiZoviDdQf7YxLsOYdieOQr/ --iscrypted --gecos="wrsroot"
|
||||
|
||||
# System bootloader configuration
|
||||
#bootloader --location=mbr --boot-drive=sda
|
||||
|
||||
autopart --type=lvm
|
||||
# Partition clearing information
|
||||
clearpart --all --initlabel --drives=sda
|
||||
|
||||
cdrom
|
||||
#repo --name=base --baseurl=http://mirror.cogentco.com/pub/linux/centos/7/os/x86_64/
|
||||
#url --url="http://mirror.cogentco.com/pub/linux/centos/7/os/x86_64/"
|
||||
|
||||
%packages --nobase --ignoremissing
|
||||
@^minimal
|
||||
@core
|
||||
kexec-tools
|
||||
net-tools
|
||||
# CGTS packages
|
||||
# end CGTS packages
|
||||
%end
|
258
build-tools/build_iso/minimal_rpm_list.txt
Normal file
258
build-tools/build_iso/minimal_rpm_list.txt
Normal file
@ -0,0 +1,258 @@
|
||||
acl
|
||||
alsa-lib
|
||||
audit
|
||||
audit-libs
|
||||
authconfig
|
||||
basesystem
|
||||
bind-libs-lite
|
||||
bind-license
|
||||
binutils
|
||||
biosdevname
|
||||
btrfs-progs
|
||||
bzip2-libs
|
||||
ca-certificates
|
||||
centos-logos
|
||||
chkconfig
|
||||
coreutils
|
||||
cpio
|
||||
cracklib
|
||||
cracklib-dicts
|
||||
cronie
|
||||
cronie-anacron
|
||||
crontabs
|
||||
cryptsetup
|
||||
cryptsetup-libs
|
||||
curl
|
||||
cyrus-sasl-lib
|
||||
dbus
|
||||
dbus-glib
|
||||
dbus-libs
|
||||
dbus-python
|
||||
device-mapper
|
||||
device-mapper-event
|
||||
device-mapper-event-libs
|
||||
device-mapper-libs
|
||||
device-mapper-multipath
|
||||
device-mapper-multipath-libs
|
||||
device-mapper-persistent-data
|
||||
diffutils
|
||||
dmidecode
|
||||
dosfstools
|
||||
dracut
|
||||
dracut-config-rescue
|
||||
dracut-network
|
||||
e2fsprogs
|
||||
e2fsprogs-libs
|
||||
ebtables
|
||||
efibootmgr
|
||||
efivar-libs
|
||||
elfutils-libelf
|
||||
elfutils-libs
|
||||
ethtool
|
||||
expat
|
||||
file
|
||||
file-libs
|
||||
filesystem
|
||||
findutils
|
||||
fipscheck
|
||||
fipscheck-lib
|
||||
firewalld
|
||||
freetype
|
||||
gawk
|
||||
gdbm
|
||||
gettext
|
||||
gettext-libs
|
||||
glib2
|
||||
glibc
|
||||
glibc-common
|
||||
glib-networking
|
||||
gmp
|
||||
gnupg2
|
||||
gnutls
|
||||
gobject-introspection
|
||||
gpgme
|
||||
grep
|
||||
groff-base
|
||||
grub2
|
||||
grub2-efi
|
||||
grub2-tools
|
||||
grubby
|
||||
gsettings-desktop-schemas
|
||||
gzip
|
||||
hardlink
|
||||
hostname
|
||||
hwdata
|
||||
info
|
||||
iproute
|
||||
iprutils
|
||||
iputils
|
||||
jansson
|
||||
json-c
|
||||
kbd
|
||||
kbd-legacy
|
||||
kbd-misc
|
||||
kernel-tools
|
||||
kernel-tools-libs
|
||||
kexec-tools
|
||||
keyutils-libs
|
||||
kmod
|
||||
kmod-libs
|
||||
kpartx
|
||||
krb5-libs
|
||||
less
|
||||
libacl
|
||||
libaio
|
||||
libassuan
|
||||
libattr
|
||||
libblkid
|
||||
libcap
|
||||
libcap-ng
|
||||
libcom_err
|
||||
libconfig
|
||||
libcroco
|
||||
libcurl
|
||||
libdaemon
|
||||
libdb
|
||||
libdb-utils
|
||||
libdrm
|
||||
libedit
|
||||
libestr
|
||||
libffi
|
||||
libgcc
|
||||
libgcrypt
|
||||
libgomp
|
||||
libgpg-error
|
||||
libgudev1
|
||||
libidn
|
||||
libmnl
|
||||
libmodman
|
||||
libmount
|
||||
libndp
|
||||
libnetfilter_conntrack
|
||||
libnfnetlink
|
||||
libnl
|
||||
libnl3
|
||||
libnl3-cli
|
||||
libpcap
|
||||
libpciaccess
|
||||
libpipeline
|
||||
libproxy
|
||||
libpwquality
|
||||
libreport-filesystem
|
||||
libselinux
|
||||
libselinux-python
|
||||
libselinux-utils
|
||||
libsemanage
|
||||
libsepol
|
||||
libss
|
||||
libssh2
|
||||
libstdc++
|
||||
libsysfs
|
||||
libtasn1
|
||||
libteam
|
||||
libunistring
|
||||
libuser
|
||||
libutempter
|
||||
libuuid
|
||||
libverto
|
||||
libxml2
|
||||
libxslt
|
||||
linux-firmware
|
||||
lldpad
|
||||
lsscsi
|
||||
lua
|
||||
lvm2
|
||||
lvm2-libs
|
||||
lzo
|
||||
make
|
||||
man-db
|
||||
mariadb-libs
|
||||
mdadm
|
||||
microcode_ctl
|
||||
mokutil
|
||||
mozjs17
|
||||
ncurses
|
||||
ncurses-base
|
||||
ncurses-libs
|
||||
nettle
|
||||
newt
|
||||
newt-python
|
||||
nspr
|
||||
nss
|
||||
nss-softokn
|
||||
nss-softokn-freebl
|
||||
nss-sysinit
|
||||
nss-tools
|
||||
nss-util
|
||||
numactl-libs
|
||||
openscap
|
||||
openscap-scanner
|
||||
openssl
|
||||
openssl-libs
|
||||
os-prober
|
||||
p11-kit
|
||||
p11-kit-trust
|
||||
passwd
|
||||
pciutils-libs
|
||||
pcre
|
||||
pinentry
|
||||
pkgconfig
|
||||
policycoreutils
|
||||
popt
|
||||
procps-ng
|
||||
pth
|
||||
pygobject3-base
|
||||
pygpgme
|
||||
pyliblzma
|
||||
python
|
||||
python-backports
|
||||
python-backports-ssl_match_hostname
|
||||
python-configobj
|
||||
python-decorator
|
||||
python-iniparse
|
||||
python-libs
|
||||
python-perf
|
||||
python-pycurl
|
||||
python-pyudev
|
||||
python2-setuptools
|
||||
python-slip
|
||||
python-slip-dbus
|
||||
python-urlgrabber
|
||||
pyxattr
|
||||
qrencode-libs
|
||||
rdma
|
||||
readline
|
||||
rootfiles
|
||||
rpm
|
||||
rpm-build-libs
|
||||
rpm-libs
|
||||
rpm-python
|
||||
sed
|
||||
shared-mime-info
|
||||
shim
|
||||
shim-unsigned
|
||||
slang
|
||||
snappy
|
||||
sqlite
|
||||
systemd
|
||||
systemd-libs
|
||||
systemd-sysv
|
||||
sysvinit-tools
|
||||
tar
|
||||
tcp_wrappers-libs
|
||||
teamd
|
||||
time
|
||||
trousers
|
||||
tzdata
|
||||
ustr
|
||||
util-linux
|
||||
virt-what
|
||||
which
|
||||
xfsprogs
|
||||
xml-common
|
||||
xz
|
||||
xz-libs
|
||||
zlib
|
||||
lksctp-tools
|
||||
boost-thread
|
||||
boost-system
|
2
build-tools/build_iso/openstack_kilo.txt
Normal file
2
build-tools/build_iso/openstack_kilo.txt
Normal file
@ -0,0 +1,2 @@
|
||||
# Files copied in from /import/mirrors/CentOS/7.2.1511/cloud/x86_64/openstack-kilo
|
||||
|
112
build-tools/build_minimal_iso/README
Normal file
112
build-tools/build_minimal_iso/README
Normal file
@ -0,0 +1,112 @@
|
||||
This document describes how to generate a DVD image (.iso) which installs
|
||||
a minimal CentOS installation where the entirety of the installed system is
|
||||
build from the provided source.
|
||||
|
||||
There are three parts to this document:
|
||||
How to build binary RPMs from source RPMS
|
||||
How to build the install disk from the binary RPMS
|
||||
How to install the minimal system
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
How to build the binary RPMs from the source RPMS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
(note - building the binary RPMs is expected to take a long time, ~ 15 hours
|
||||
on a typical system)
|
||||
|
||||
The source RPMs in the "srcs" subdirectory are compiled in an environment
|
||||
called "mock" which builds each package in a chroot jail to ensure the output
|
||||
is not influenced by the build system. Mock is controlled by a config file.
|
||||
The example srcs/build.cfg is provided as a starting point, however it does
|
||||
to be adjusted for your build environment. In particular, the paths and repo
|
||||
locations need to be configured for your system. It is highly recommended that
|
||||
a local mirror of the CentOS repos be used for speed. The example config file
|
||||
is configured to use an localhost http mirror of the CentOS repos.
|
||||
|
||||
To build the binary RPMs from the source RPMs change to the "srcs" subdirectory
|
||||
and execute the "build.sh" script.
|
||||
|
||||
# cd srcs
|
||||
# ./build.sh
|
||||
|
||||
This will use build.cfg and mock to compile every source RPM listed in list.txt.
|
||||
The output binary RPMs will be in srcs/results. There will also be success.txt
|
||||
and fail.txt files which list any RPMs that failed to build. Debugging why RPMs
|
||||
fail to build is beyond the scope of this document, however be aware that RPMs
|
||||
often fail in the "check" phase of the build (i.e. the package compiled fine
|
||||
but tests failed). Notably, the python package may fail due to a "test_nis"
|
||||
failure, and the "attr" and "e2fsprogs" packages may or may not fail depending
|
||||
on the host file system used for compilation. These failures may or may not be
|
||||
false positives (for example, the mock environment does not have NIS configured
|
||||
which is why python's test_nis reports a failure -- the code is actually fine,
|
||||
we just can't run the test in the mock environment).
|
||||
|
||||
To disable the check phase, add the line
|
||||
|
||||
config_opts['rpmbuild_opts'] = '--nocheck'
|
||||
|
||||
to build.cfg. You can then run build.sh again with list.txt containing
|
||||
packages which failed:
|
||||
|
||||
# cp list.txt list.txt.orig
|
||||
# cp fail.txt list.txt
|
||||
# ./build.sh
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
How to build the install disk from the binary RPMS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Once srcs/results is populated with binary RPMs, an installation disk can be
|
||||
built. Edit the yum.conf file and place an (arbitrary) path for yum log and
|
||||
cache locations, and make sure that the repository path points to srcs/results.
|
||||
Run the build_centos.sh script to build the installation DVD:
|
||||
|
||||
# ./build_centos.sh
|
||||
|
||||
Scroll up the output to the top of the "Spawning worker" messages. You should
|
||||
observe a line indicating that there are no remaining unresolved dependencies:
|
||||
|
||||
...
|
||||
Installing PKG=dhcp-common PKG_FILE=dhcp-common-4.2.5-42.el7.centos.tis.1.x86_64.rpm PKG_REL_PATH=dhcp-common-4.2.5-42.el7.centos.tis.1.x86_64.rpm PKG_PATH=/localdisk/loadbuild/jmckenna/centos/srcs/results/dhcp-common-4.2.5-42.el7.centos.tis.1.x86_64.rpm from repo local-std
|
||||
dhcp-common
|
||||
Debug: Packages still unresolved:
|
||||
|
||||
Spawning worker 0 with 4 pkgs
|
||||
Spawning worker 1 with 4 pkgs
|
||||
Spawning worker 2 with 4 pkgs
|
||||
...
|
||||
|
||||
This is your confirmation that all required pacakges were found and installed
|
||||
on the ISO. You should also now see a new file called "centosIso.iso":
|
||||
|
||||
# ls -l centosIso.iso
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
How to install the minimal system
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
The centosIso.iso file can be burned to a DVD or booted in a virtual
|
||||
environment. It is configured to self-install on boot. After installation,
|
||||
a user with sudo access must be created manually. The system can then be
|
||||
booted.
|
||||
|
||||
Power the system on with the DVD inserted. A system install will take place
|
||||
(takes approximately 2 minutes). The system will then report an error and
|
||||
ask you if you wish to report a bug, debug, or quit. Hit control-alt-F2 to
|
||||
switch to a terminal window. Enter the following commands to change to the
|
||||
installed system root, and create a (wrsroot) with sudo access:
|
||||
|
||||
cd /mnt/sysimage
|
||||
chroot .
|
||||
groupadd -r wrs
|
||||
groupadd -f -g 345 wrs_protected
|
||||
useradd -m -g wrs -G root,wrs_protected,wheel -d /home/wrsroot -p cBglipPpsKwBQ -s /bin/sh wrsroot
|
||||
exit
|
||||
|
||||
Change back to the main window with control-alt-F1.
|
||||
Hit 3 <enter> (the "Quit" option). The system will reboot (make sure you eject
|
||||
the DVD or use your BIOS to boot from hard disk rather than DVD; the installer
|
||||
will re-run if the DVD boots again).
|
||||
|
||||
You can log into the system as user "wrsroot" with password "wrsroot".
|
||||
|
5
build-tools/build_minimal_iso/README.2
Normal file
5
build-tools/build_minimal_iso/README.2
Normal file
@ -0,0 +1,5 @@
|
||||
The files in this directory are to be used as described at
|
||||
http://twiki.wrs.com/PBUeng/DeliveryExtras#Minimal_CentOS_install
|
||||
|
||||
They include the scripts (and customer README) for building a minimual
|
||||
CentOS ISO from our modified sources.
|
108
build-tools/build_minimal_iso/build.cfg
Normal file
108
build-tools/build_minimal_iso/build.cfg
Normal file
@ -0,0 +1,108 @@
|
||||
config_opts['root'] = 'jmckenna-centos/mock'
|
||||
config_opts['target_arch'] = 'x86_64'
|
||||
config_opts['legal_host_arches'] = ('x86_64',)
|
||||
config_opts['chroot_setup_cmd'] = 'install @buildsys-build'
|
||||
config_opts['dist'] = 'el7' # only useful for --resultdir variable subst
|
||||
config_opts['releasever'] = '7'
|
||||
|
||||
config_opts['yum.conf'] = """
|
||||
[main]
|
||||
keepcache=1
|
||||
debuglevel=2
|
||||
reposdir=/dev/null
|
||||
logfile=/var/log/yum.log
|
||||
retries=20
|
||||
obsoletes=1
|
||||
gpgcheck=0
|
||||
assumeyes=1
|
||||
syslog_ident=mock
|
||||
syslog_device=
|
||||
|
||||
# repos
|
||||
[my-build]
|
||||
name=my-build
|
||||
baseurl=http://127.0.0.1:8088/localdisk/loadbuild/centos/src/results
|
||||
enabled=1
|
||||
skip_if_unavailable=1
|
||||
metadata_expire=0
|
||||
|
||||
[base]
|
||||
name=CentOS-$releasever - Base
|
||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
|
||||
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
|
||||
baseurl=http://127.0.0.1:8088/CentOS/7.2.1511/os/$basearch/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
|
||||
#released updates
|
||||
[updates]
|
||||
name=CentOS-$releasever - Updates
|
||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
|
||||
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
|
||||
baseurl=http://127.0.0.1:8088/CentOS/7.2.1511/updates/$basearch/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
|
||||
#additional packages that may be useful
|
||||
[extras]
|
||||
name=CentOS-$releasever - Extras
|
||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
|
||||
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
|
||||
baseurl=http://127.0.0.1:8088/CentOS/7.2.1511/extras/$basearch/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
|
||||
#additional packages that extend functionality of existing packages
|
||||
[centosplus]
|
||||
name=CentOS-$releasever - Plus
|
||||
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
|
||||
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
|
||||
baseurl=http://127.0.0.1:8088/CentOS/7.2.1511/centosplus/$basearch/
|
||||
gpgcheck=1
|
||||
enabled=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
|
||||
[epel]
|
||||
name=Extra Packages for Enterprise Linux 7 - $basearch
|
||||
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
|
||||
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
|
||||
failovermethod=priority
|
||||
enabled=1
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
|
||||
|
||||
[epel-debuginfo]
|
||||
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
|
||||
baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
|
||||
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
|
||||
failovermethod=priority
|
||||
enabled=0
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
|
||||
gpgcheck=1
|
||||
|
||||
[epel-source]
|
||||
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
|
||||
baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
|
||||
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
|
||||
failovermethod=priority
|
||||
enabled=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
|
||||
gpgcheck=1
|
||||
|
||||
|
||||
"""
|
||||
config_opts['environment']['BUILD_BY'] = 'jmckenna'
|
||||
config_opts['environment']['BUILD_DATE'] = '2016-10-31 14:27:28 -0400'
|
||||
config_opts['environment']['REPO'] = '/localdisk/designer/jmckenna/dev0019/cgcs-root'
|
||||
config_opts['environment']['WRS_GIT_BRANCH'] = 'CGCS_DEV_0019'
|
||||
config_opts['environment']['CGCS_GIT_BRANCH'] = 'CGCS_DEV_0019'
|
||||
config_opts['macros']['%_no_cgcs_license_check'] = '1'
|
||||
config_opts['macros']['%_tis_build_type'] = 'std'
|
||||
config_opts['chroot_setup_cmd'] = 'install @buildsys-build pigz lbzip2 yum shadow-utils rpm-build lbzip2 gcc glibc-headers make gcc-c++ java-devel'
|
||||
config_opts['macros']['%__gzip'] = '/usr/bin/pigz'
|
||||
config_opts['macros']['%__bzip2'] = '/usr/bin/lbzip2'
|
||||
config_opts['macros']['%_patch_confdir'] = '%{_sysconfdir}/patching'
|
||||
config_opts['macros']['%_patch_scripts'] = '%{_patch_confdir}/patch-scripts'
|
||||
config_opts['macros']['%_runtime_patch_scripts'] = '/run/patching/patch-scripts'
|
||||
config_opts['macros']['%_tis_dist'] = '.tis'
|
||||
#config_opts['rpmbuild_opts'] = '--nocheck'
|
45
build-tools/build_minimal_iso/build.sh
Executable file
45
build-tools/build_minimal_iso/build.sh
Executable file
@ -0,0 +1,45 @@
|
||||
#!/bin/sh
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
# If a file listed in list.txt is missing, this function attempts to find the
|
||||
# RPM and copy it to the local directory. This should not be required normally
|
||||
# and is only used when collecting the source RPMs initially.
|
||||
function findSrc {
|
||||
local lookingFor=$1
|
||||
find $MY_REPO/cgcs-centos-repo/Source -name $lookingFor | xargs -I '{}' cp '{}' .
|
||||
find $MY_REPO/cgcs-tis-repo/Source -name $lookingFor | xargs -I '{}' cp '{}' .
|
||||
find $MY_WORKSPACE/std/rpmbuild/SRPMS -name $lookingFor | xargs -I '{}' cp '{}' .
|
||||
}
|
||||
|
||||
rm -f success.txt
|
||||
rm -f fail.txt
|
||||
rm -f missing.txt
|
||||
mkdir -p results
|
||||
infile=list.txt
|
||||
|
||||
while read p; do
|
||||
|
||||
if [ ! -f "$p" ]; then
|
||||
findSrc $p
|
||||
if [ ! -f "$p" ]; then
|
||||
echo "couldn't find" >> missing.txt
|
||||
echo "couldn't find $p" >> missing.txt
|
||||
continue
|
||||
fi
|
||||
echo "found $p"
|
||||
fi
|
||||
|
||||
mock -r build.cfg $p --resultdir=results --no-clean
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "$p" >> success.txt
|
||||
cd results
|
||||
$CREATEREPO .
|
||||
cd ..
|
||||
else
|
||||
echo "$p" >> fail.txt
|
||||
fi
|
||||
done < $infile
|
62
build-tools/build_minimal_iso/build_centos.sh
Executable file
62
build-tools/build_minimal_iso/build_centos.sh
Executable file
@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build a basic CentOS system
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
function final_touches {
|
||||
# create the repo
|
||||
cd ${ROOTDIR}/${DEST}/isolinux
|
||||
$CREATEREPO -g ../comps.xml .
|
||||
|
||||
# build the ISO
|
||||
printf "Building image $OUTPUT_FILE\n"
|
||||
cd ${ROOTDIR}/${DEST}
|
||||
chmod 664 isolinux/isolinux.bin
|
||||
mkisofs -o $OUTPUT_FILE \
|
||||
-R -D -A 'oe_iso_boot' -V 'oe_iso_boot' \
|
||||
-b isolinux.bin -c boot.cat -no-emul-boot \
|
||||
-boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e images/efiboot.img \
|
||||
-no-emul-boot \
|
||||
isolinux/
|
||||
|
||||
isohybrid --uefi $OUTPUT_FILE
|
||||
implantisomd5 $OUTPUT_FILE
|
||||
|
||||
cd $ROOTDIR
|
||||
}
|
||||
|
||||
function setup_disk {
|
||||
tar xJf emptyInstaller.tar.xz
|
||||
mkdir ${DEST}/isolinux/Packages
|
||||
}
|
||||
|
||||
function install_packages {
|
||||
cd ${DEST}/isolinux/Packages
|
||||
ROOT=${ROOTDIR} ../../../cgts_deps.sh --deps=../../../${MINIMAL}
|
||||
cd ${ROOTDIR}
|
||||
}
|
||||
|
||||
|
||||
ROOTDIR=$PWD
|
||||
INSTALLER_SRC=basicDisk
|
||||
DEST=newDisk
|
||||
PKGS_DIR=all_rpms
|
||||
MINIMAL=minimal_rpm_list.txt
|
||||
OUTPUT_FILE=${ROOTDIR}/centosIso.iso
|
||||
|
||||
# Make a basic install disk (no packages, at this point)
|
||||
rm -rf ${DEST}
|
||||
setup_disk
|
||||
|
||||
# install the packages (initially from minimal list, then resolve deps)
|
||||
install_packages
|
||||
|
||||
# build the .iso
|
||||
final_touches
|
||||
|
222
build-tools/build_minimal_iso/cgts_deps.sh
Executable file
222
build-tools/build_minimal_iso/cgts_deps.sh
Executable file
@ -0,0 +1,222 @@
|
||||
#!/bin/env bash
|
||||
function generate_dep_list {
|
||||
TMP_RPM_DB=$(mktemp -d $(pwd)/tmp_rpm_db_XXXXXX)
|
||||
mkdir -p $TMP_RPM_DB
|
||||
rpm --initdb --dbpath $TMP_RPM_DB
|
||||
rpm --dbpath $TMP_RPM_DB --test -Uvh --replacefiles '*.rpm' >> $DEPDETAILLISTFILE 2>&1
|
||||
rpm --dbpath $TMP_RPM_DB --test -Uvh --replacefiles '*.rpm' 2>&1 \
|
||||
| grep -v "error:" \
|
||||
| grep -v "warning:" \
|
||||
| grep -v "Preparing..." \
|
||||
| sed "s/ is needed by.*$//" | sed "s/ >=.*$//" | sort -u > $DEPLISTFILE
|
||||
rm -rf $TMP_RPM_DB
|
||||
}
|
||||
|
||||
function install_deps {
|
||||
local DEP_LIST=""
|
||||
local DEP_LIST_FILE="$1"
|
||||
|
||||
rm -f $TMPFILE
|
||||
|
||||
while read DEP
|
||||
do
|
||||
DEP_LIST="${DEP_LIST} ${DEP}"
|
||||
done < $DEP_LIST_FILE
|
||||
|
||||
echo "Debug: List of deps to resolve: ${DEP_LIST}"
|
||||
|
||||
if [ -z "${DEP_LIST}" ]
|
||||
then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# go through each repo and convert deps to packages
|
||||
|
||||
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
|
||||
echo "TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --whatprovides ${DEP_LIST} --qf='%{name}'"
|
||||
TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --qf='%{name}' --whatprovides ${DEP_LIST} | sed "s/kernel-debug/kernel/g" >> $TMPFILE
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
done
|
||||
sort $TMPFILE -u > $TMPFILE1
|
||||
rm $TMPFILE
|
||||
|
||||
DEP_LIST=""
|
||||
while read DEP
|
||||
do
|
||||
DEP_LIST="${DEP_LIST} ${DEP}"
|
||||
done < $TMPFILE1
|
||||
rm $TMPFILE1
|
||||
|
||||
# next go through each repo and install packages
|
||||
local TARGETS=${DEP_LIST}
|
||||
echo "Debug: Resolved list of deps to install: ${TARGETS}"
|
||||
local UNRESOLVED
|
||||
for REPOID in `grep '^[[].*[]]$' $YUM | grep -v '[[]main[]]' | awk -F '[][]' '{print $2 }'`; do
|
||||
UNRESOLVED=" $TARGETS "
|
||||
|
||||
if [[ ! -z "${TARGETS// }" ]]; then
|
||||
REPO_PATH=$(cat $YUM | sed -n "/^\[$REPOID\]\$/,\$p" | grep '^baseurl=' | head -n 1 | awk -F 'file://' '{print $2}' | sed 's:/$::')
|
||||
>&2 echo "TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf='%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}'"
|
||||
TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf="%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}" | sort -r -V >> $TMPFILE
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
|
||||
while read STR
|
||||
do
|
||||
>&2 echo "STR=$STR"
|
||||
if [ "x$STR" == "x" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
PKG=`echo $STR | cut -d " " -f 1`
|
||||
PKG_FILE=`echo $STR | cut -d " " -f 2`
|
||||
PKG_REL_PATH=`echo $STR | cut -d " " -f 3`
|
||||
PKG_PATH="${REPO_PATH}/${PKG_REL_PATH}"
|
||||
|
||||
>&2 echo "Installing PKG=$PKG PKG_FILE=$PKG_FILE PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH from repo $REPOID"
|
||||
cp $PKG_PATH .
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
>&2 echo " Here's what I have to work with..."
|
||||
>&2 echo " TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $PKG --qf=\"%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}\""
|
||||
>&2 echo " PKG=$PKG PKG_FILE=$PKG_FILE REPO_PATH=$REPO_PATH PKG_REL_PATH=$PKG_REL_PATH PKG_PATH=$PKG_PATH"
|
||||
fi
|
||||
|
||||
echo $UNRESOLVED | grep $PKG
|
||||
echo $UNRESOLVED | grep $PKG >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "$PKG found in $REPOID as $PKG" >> $BUILT_REPORT
|
||||
echo "$PKG_PATH" >> $BUILT_REPORT
|
||||
UNRESOLVED=$(echo "$UNRESOLVED" | sed "s# $PKG # #g")
|
||||
else
|
||||
echo "$PKG satisfies unknown target in $REPOID" >> $BUILT_REPORT
|
||||
echo " but it doesn't match targets, $UNRESOLVED" >> $BUILT_REPORT
|
||||
echo " path $PKG_PATH" >> $BUILT_REPORT
|
||||
FOUND_UNKNOWN=1
|
||||
fi
|
||||
done < $TMPFILE #<<< "$(TMPDIR=$TMP_DIR repoquery -c $YUM --repoid=$REPOID --arch=x86_64,noarch --resolve $TARGETS --qf=\"%{name} %{name}-%{version}-%{release}.%{arch}.rpm %{relativepath}\" | sort -r -V)"
|
||||
\rm -rf $TMP_DIR/yum-$USER-*
|
||||
TARGETS="$UNRESOLVED"
|
||||
fi
|
||||
done
|
||||
>&2 echo "Debug: Packages still unresolved: $UNRESOLVED"
|
||||
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $WARNINGS_REPORT
|
||||
echo "Debug: Packages still unresolved: $UNRESOLVED" >> $BUILT_REPORT
|
||||
>&2 echo ""
|
||||
}
|
||||
|
||||
function check_all_explicit_deps_installed
|
||||
{
|
||||
|
||||
PKGS_TO_CHECK=" "
|
||||
while read PKG_TO_ADD
|
||||
do
|
||||
PKGS_TO_CHECK="$PKGS_TO_CHECK ${PKG_TO_ADD}"
|
||||
done < $DEPLISTFILE
|
||||
rpm -qp ${INSTALLDIR}/*.rpm --qf="%{name}\n" > $TMPFILE
|
||||
|
||||
echo "checking... $PKGS_TO_CHECK vs ${INSTALLED_PACKAGE}"
|
||||
|
||||
while read INSTALLED_PACKAGE
|
||||
do
|
||||
echo $PKGS_TO_CHECK | grep -q "${INSTALLED_PACKAGE}"
|
||||
if [ $? -eq 0 ]; then
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE} //"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE} / /"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/ ${INSTALLED_PACKAGE}\$//"`
|
||||
PKGS_TO_CHECK=`echo $PKGS_TO_CHECK | sed "s/^${INSTALLED_PACKAGE}\$//"`
|
||||
fi
|
||||
done < $TMPFILE
|
||||
|
||||
if [ -z "$PKGS_TO_CHECK" ]
|
||||
then
|
||||
>&2 echo "All explicitly specified packages resolved!"
|
||||
else
|
||||
>&2 echo "Could not resolve packages: $PKGS_TO_CHECK"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
if [ "x${ROOT}" == "x" ]; then
|
||||
ROOT=/localdisk/loadbuild/centos
|
||||
fi
|
||||
|
||||
ATTEMPTED=0
|
||||
DISCOVERED=0
|
||||
OUTPUT_DIR=${ROOT}/newDisk
|
||||
YUM=${ROOT}/yum.conf
|
||||
TMP_DIR=${ROOT}/tmp
|
||||
DEPLISTFILE=${ROOT}/deps.txt
|
||||
DEPDETAILLISTFILE=${ROOT}/deps_detail.txt
|
||||
INSTALLDIR=${ROOT}/newDisk/isolinux/Packages
|
||||
|
||||
BUILT_REPORT=${ROOT}/local.txt
|
||||
WARNINGS_REPORT=${ROOT}/warnings.txt
|
||||
LAST_TEST=${ROOT}/last_test.txt
|
||||
TMPFILE=${ROOT}/cgts_deps_tmp.txt
|
||||
TMPFILE1=${ROOT}/cgts_deps_tmp1.txt
|
||||
|
||||
touch "$BUILT_REPORT"
|
||||
touch "$WARNINGS_REPORT"
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
case $i in
|
||||
-d=*|--deps=*)
|
||||
DEPS="${i#*=}"
|
||||
shift # past argument=value
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
mkdir -p $TMP_DIR
|
||||
|
||||
rm -f "$DEPDETAILLISTFILE"
|
||||
# FIRST PASS we are being given a list of REQUIRED dependencies
|
||||
if [ "${DEPS}x" != "x" ]; then
|
||||
cat $DEPS | grep -v "^#" > $DEPLISTFILE
|
||||
install_deps $DEPLISTFILE
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# check that we resolved them all
|
||||
check_all_explicit_deps_installed
|
||||
if [ $? -ne 0 ]; then
|
||||
>&2 echo "Error -- could not install all explicitly listed packages"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ALL_RESOLVED=0
|
||||
|
||||
while [ $ALL_RESOLVED -eq 0 ]; do
|
||||
cp $DEPLISTFILE $DEPLISTFILE.old
|
||||
generate_dep_list
|
||||
if [ ! -s $DEPLISTFILE ]; then
|
||||
# no more dependencies!
|
||||
ALL_RESOLVED=1
|
||||
else
|
||||
DIFFLINES=`diff $DEPLISTFILE.old $DEPLISTFILE | wc -l`
|
||||
if [ $DIFFLINES -eq 0 ]; then
|
||||
>&2 echo "Warning: Infinite loop detected in dependency resolution. See $DEPLISTFILE for details -- exiting"
|
||||
>&2 echo "These RPMS had problems (likely version conflicts)"
|
||||
>&2 cat $DEPLISTFILE
|
||||
|
||||
echo "Warning: Infinite loop detected in dependency resolution See $DEPLISTFILE for details -- exiting" >> $WARNINGS_REPORT
|
||||
echo "These RPMS had problems (likely version conflicts)" >> $WARNINGS_REPORT
|
||||
cat $DEPLISTFILE >> $WARNINGS_REPORT
|
||||
|
||||
date > $LAST_TEST
|
||||
|
||||
rm -f $DEPLISTFILE.old
|
||||
exit 1 # nothing fixed
|
||||
fi
|
||||
install_deps $DEPLISTFILE
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
22
build-tools/build_minimal_iso/yum.conf
Normal file
22
build-tools/build_minimal_iso/yum.conf
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
[main]
|
||||
cachedir=/localdisk/loadbuild/jmckenna/centos/yum/cache
|
||||
keepcache=1
|
||||
debuglevel=2
|
||||
reposdir=/dev/null
|
||||
logfile=/localdisk/loadbuild/jmckenna/centos/yum/yum.log
|
||||
retries=20
|
||||
obsoletes=1
|
||||
gpgcheck=0
|
||||
assumeyes=1
|
||||
syslog_ident=mock
|
||||
syslog_device=
|
||||
|
||||
# repos
|
||||
[local-std]
|
||||
name=local-std
|
||||
baseurl=file:///localdisk/loadbuild/jmckenna/centos/srcs/results
|
||||
enabled=1
|
||||
skip_if_unavailable=1
|
||||
metadata_expire=0
|
||||
|
BIN
build-tools/certificates/TiBoot.crt
Normal file
BIN
build-tools/certificates/TiBoot.crt
Normal file
Binary file not shown.
67
build-tools/classify
Normal file
67
build-tools/classify
Normal file
@ -0,0 +1,67 @@
|
||||
classify () {
|
||||
local pkg_dir="$1"
|
||||
|
||||
if [ -f $pkg_dir/centos/srpm_path ]; then
|
||||
# echo "srpm + patch: $(basename $(cat $pkg_dir/centos/srpm_path | head -n 1))"
|
||||
echo "srpm + patches"
|
||||
elif [ -f $pkg_dir/centos/*.spec ]; then
|
||||
if [ -f $pkg_dir/centos/build_srpm ]; then
|
||||
# echo "spec + custom_script: $pkg_dir"
|
||||
echo "spec + custom_script"
|
||||
elif [ -f $pkg_dir/centos/build_srpm.data ]; then
|
||||
local ALLOW_EMPTY_RPM=""
|
||||
local COPY_LIST=""
|
||||
local SRC_DIR=""
|
||||
local PKG_BASE="$pkg_dir"
|
||||
source $pkg_dir/centos/build_srpm.data
|
||||
|
||||
if [ "" != "$SRC_DIR" ] ; then
|
||||
# echo "spec + src_dir: $pkg_dir/$SRC_DIR"
|
||||
echo "spec + src_dir"
|
||||
elif [ "" != "$COPY_LIST" ] ; then
|
||||
local TARBALL=""
|
||||
for f in $COPY_LIST; do
|
||||
case $f in
|
||||
*.tar.gz) TARBALL=$f ;;
|
||||
*.tgz) TARBALL=$f ;;
|
||||
*.tar.bz2) TARBALL=$f ;;
|
||||
*.tar.xz) TARBALL=$f ;;
|
||||
*.tar) TARBALL=$f ;;
|
||||
esac
|
||||
done
|
||||
if [ "" != "$TARBALL" ]; then
|
||||
# echo "spec + tarball: $pkg_dir/$TARBALL"
|
||||
echo "spec + tarball"
|
||||
else
|
||||
# echo "spec + files: $pkg_dir"
|
||||
echo "spec + files"
|
||||
fi
|
||||
elif [ "$ALLOW_EMPTY_RPM" == "true" ] ; then
|
||||
# echo "spec + empty: $pkg_dir"
|
||||
echo "spec + empty"
|
||||
else
|
||||
# echo "spec + build_srpm.data + unknown: $pkg_dir"
|
||||
# cat $pkg_dir/centos/build_srpm.data
|
||||
echo "spec + build_srpm.data + unknown"
|
||||
fi
|
||||
else
|
||||
# echo "spec + unknown: $pkg_dir"
|
||||
echo "spec + unknown"
|
||||
fi
|
||||
else
|
||||
# echo "unknown: $pkg_dir"
|
||||
echo "unknown"
|
||||
fi
|
||||
}
|
||||
|
||||
# for g in $(find $MY_REPO -type d -name .git); do
|
||||
# d=$(dirname $g)
|
||||
# c="$d/centos_pkg_dirs"
|
||||
# if [ -f $c ]; then
|
||||
# for d2 in $(cat $c); do
|
||||
# pkg_dir="$d/$d2"
|
||||
# echo "$(classify $pkg_dir): $pkg_dir"
|
||||
# done
|
||||
# fi
|
||||
# done
|
||||
|
54
build-tools/create-cgcs-centos-repo
Executable file
54
build-tools/create-cgcs-centos-repo
Executable file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEST_DIR="$MY_REPO/cgcs-centos-repo"
|
||||
ORIGIN="$DEST_DIR/origin"
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
if [ ! -f $ORIGIN ]; then
|
||||
echo "ERROR: file not found '$ORIGIN'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
ORIGIN_DIR=$(cat $MY_REPO/cgcs-centos-repo/origin | grep -v '^#' | head -n 1)
|
||||
|
||||
if [ ! -d $ORIGIN_DIR ]; then
|
||||
echo "ERROR: directory not found '$ORIGIN_DIR'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo "ORIGIN_DIR=$ORIGIN_DIR"
|
||||
for d in $(find $ORIGIN_DIR -type d | tail -n +2); do
|
||||
RELATIVE_DIR=$(echo $d | sed "s#^$ORIGIN_DIR/##")
|
||||
if [ -d $DEST_DIR/$RELATIVE_DIR ]; then
|
||||
rm -rf $DEST_DIR/$RELATIVE_DIR/*
|
||||
fi
|
||||
mkdir -p $DEST_DIR/$RELATIVE_DIR
|
||||
done
|
||||
|
||||
for d in $(find $ORIGIN_DIR -type d | tail -n +2); do
|
||||
for f in $(find $d -maxdepth 1 -type f); do
|
||||
RELATIVE_FILE=$(echo $f | sed "s#^$ORIGIN_DIR/##")
|
||||
if [ -e "$DEST_DIR/$RELATIVE_FILE" ]; then
|
||||
rm -f "$DEST_DIR/$RELATIVE_FILE"
|
||||
fi
|
||||
|
||||
ln -s $f "$DEST_DIR/$RELATIVE_FILE"
|
||||
done
|
||||
done
|
||||
|
||||
for d in `find -L $DEST_DIR -type d -name repodata`; do
|
||||
(cd $d/..
|
||||
cp -L -f repodata/*comps*xml comps.xml
|
||||
rm -rf repodata
|
||||
if [ -f comps.xml ]; then
|
||||
$CREATEREPO -g comps.xml --workers $(cat /usr/bin/nproc) $(pwd)
|
||||
else
|
||||
$CREATEREPO --workers $(cat /usr/bin/nproc) $(pwd)
|
||||
fi
|
||||
)
|
||||
done
|
||||
|
55
build-tools/create-cgcs-tis-repo
Executable file
55
build-tools/create-cgcs-tis-repo
Executable file
@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEST_DIR="$MY_REPO/cgcs-tis-repo"
|
||||
ORIGIN="$DEST_DIR/origin"
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -f $ORIGIN ]; then
|
||||
echo "ERROR: file not found '$ORIGIN'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
ORIGIN_DIR=$(cat $MY_REPO/cgcs-tis-repo/origin | grep -v '^#' | head -n 1)
|
||||
|
||||
if [ ! -d $ORIGIN_DIR ]; then
|
||||
echo "ERROR: directory not found '$ORIGIN_DIR'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo "ORIGIN_DIR=$ORIGIN_DIR"
|
||||
for d in $(find $ORIGIN_DIR -type d | tail -n +2); do
|
||||
RELATIVE_DIR=$(echo $d | sed "s#^$ORIGIN_DIR/##")
|
||||
if [ -d $DEST_DIR/$RELATIVE_DIR ]; then
|
||||
rm -rf $DEST_DIR/$RELATIVE_DIR/*
|
||||
fi
|
||||
echo "mkdir -p $RELATIVE_DIR"
|
||||
mkdir -p $DEST_DIR/$RELATIVE_DIR
|
||||
done
|
||||
|
||||
for d in $(find $ORIGIN_DIR -type d | tail -n +2); do
|
||||
for f in $(find $d -maxdepth 1 -type f); do
|
||||
RELATIVE_FILE=$(echo $f | sed "s#^$ORIGIN_DIR/##")
|
||||
if [ -e "$DEST_DIR/$RELATIVE_FILE" ]; then
|
||||
rm -f "$DEST_DIR/$RELATIVE_FILE"
|
||||
fi
|
||||
|
||||
ln -s $f "$DEST_DIR/$RELATIVE_FILE"
|
||||
done
|
||||
done
|
||||
|
||||
for d in `find -L $DEST_DIR -type d -name repodata`; do
|
||||
(cd $d/..
|
||||
rm -rf repodata
|
||||
if [ -f comps.xml ]; then
|
||||
$CREATEREPO -g comps.xml `pwd`
|
||||
else
|
||||
$CREATEREPO `pwd`
|
||||
fi
|
||||
)
|
||||
done
|
||||
|
59
build-tools/create-yum-conf
Executable file
59
build-tools/create-yum-conf
Executable file
@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$MY_WORKSPACE" == "" ]; then
|
||||
echo "ERROR: MY_WORKSPACE not defined"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [ "$MY_REPO" == "" ]; then
|
||||
echo "ERROR: MY_REPO not defined"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [ "$MY_BUILD_ENVIRONMENT" == "" ]; then
|
||||
echo "ERROR: MY_BUILD_ENVIRONMENT not defined"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [ "$MY_BUILD_DIR" == "" ]; then
|
||||
echo "ERROR: MY_BUILD_DIR not defined"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
MY_YUM_CONF="$MY_WORKSPACE/yum.conf"
|
||||
MOCK_CFG_PROTO="$MY_REPO/cgcs-centos-repo/mock.cfg.proto"
|
||||
YUM_DIR="$MY_WORKSPACE/yum"
|
||||
YUM_CACHE="$YUM_DIR/cache"
|
||||
|
||||
if [ -f "$MOCK_CFG_PROTO" ]; then
|
||||
if [ -f "$MY_YUM_CONF" ]; then
|
||||
N=$(find $MOCK_CFG_PROTO $MY_REPO/build-tools/create-yum-conf -cnewer $MY_YUM_CONF | wc -l)
|
||||
if [ $N -gt 0 ]; then
|
||||
# New inputs, remove to force regeneration of yum.conf
|
||||
\rm -f "$MY_YUM_CONF"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f "$MY_YUM_CONF" ]; then
|
||||
if [ -f "$MOCK_CFG_PROTO" ]; then
|
||||
mock_cfg_to_yum_conf.py "$MOCK_CFG_PROTO" > "$MY_YUM_CONF"
|
||||
sed -i "s%\[main\]%&\ncachedir=$YUM_CACHE%" "$MY_YUM_CONF"
|
||||
sed -i "s%logfile=.*%logfile=$YUM_DIR/yum.log%" "$MY_YUM_CONF"
|
||||
sed -i "s%LOCAL_BASE%file://%g" "$MY_YUM_CONF"
|
||||
sed -i "s%MIRROR_BASE%file:///import/mirrors%g" "$MY_YUM_CONF"
|
||||
sed -i "s%BUILD_ENV%$MY_BUILD_ENVIRONMENT%g" "$MY_YUM_CONF"
|
||||
sed -i "s%/MY_BUILD_DIR%$MY_BUILD_DIR%g" "$MY_YUM_CONF"
|
||||
sed -i "s%/MY_REPO_DIR%$MY_REPO%g" "$MY_YUM_CONF"
|
||||
else
|
||||
echo "ERROR: Could not find yum.conf or MOCK_CFG_PROTO"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -d "$YUM_CACHE" ]; then
|
||||
mkdir -p "$YUM_CACHE"
|
||||
fi
|
||||
|
||||
echo "$MY_YUM_CONF"
|
||||
exit 0
|
674
build-tools/create_dependancy_cache.py
Executable file
674
build-tools/create_dependancy_cache.py
Executable file
@ -0,0 +1,674 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
import fnmatch
|
||||
import os
|
||||
import gzip
|
||||
import getopt
|
||||
import sys
|
||||
import string
|
||||
|
||||
|
||||
ns = { 'root': 'http://linux.duke.edu/metadata/common',
|
||||
'filelists': 'http://linux.duke.edu/metadata/filelists',
|
||||
'rpm': 'http://linux.duke.edu/metadata/rpm' }
|
||||
|
||||
build_types=['std', 'rt']
|
||||
rpm_types=['RPM', 'SRPM']
|
||||
default_arch = 'x86_64'
|
||||
default_arch_list = [ 'x86_64', 'noarch' ]
|
||||
default_arch_by_type = {'RPM': [ 'x86_64', 'noarch' ],
|
||||
'SRPM': [ 'src' ]
|
||||
}
|
||||
|
||||
repodata_dir="/export/jenkins/mirrors"
|
||||
if not os.path.isdir(repodata_dir):
|
||||
repodata_dir="/import/mirrors"
|
||||
if not os.path.isdir(repodata_dir):
|
||||
print("ERROR: directory not found %s" % repodata_dir)
|
||||
sys.exit(1)
|
||||
|
||||
publish_cache_dir="%s/cgcs-tis-repo/dependancy-cache" % os.environ['MY_REPO']
|
||||
centos_repo_dir="%s/cgcs-centos-repo" % os.environ['MY_REPO']
|
||||
third_party_repo_dir="%s/cgcs-3rd-party-repo" % os.environ['MY_REPO']
|
||||
tis_repo_dir="%s/cgcs-tis-repo" % os.environ['MY_REPO']
|
||||
workspace_repo_dirs={}
|
||||
for rt in rpm_types:
|
||||
workspace_repo_dirs[rt]={}
|
||||
for bt in build_types:
|
||||
workspace_repo_dirs[rt][bt]="%s/%s/rpmbuild/%sS" % (os.environ['MY_WORKSPACE'], bt, rt)
|
||||
|
||||
if not os.path.isdir(os.environ['MY_REPO']):
|
||||
print("ERROR: directory not found MY_REPO=%s" % os.environ['MY_REPO'])
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(centos_repo_dir):
|
||||
print("ERROR: directory not found %s" % centos_repo_dir)
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(third_party_repo_dir):
|
||||
print("ERROR: directory not found %s" % third_party_repo_dir)
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(tis_repo_dir):
|
||||
print("ERROR: directory not found %s" % tis_repo_dir)
|
||||
sys.exit(1)
|
||||
|
||||
# bin_rpm_mirror_roots = ["%s/fedora/epel/7" % repodata_dir,
|
||||
# "%s/CentOS/7.2.1511" % repodata_dir,
|
||||
# "%s/CentOS/tis-r3/" % repodata_dir ]
|
||||
|
||||
# src_rpm_mirror_roots = ["%s/fedora/dl.fedoraproject.org/pub/epel/7/SRPMS" % repodata_dir,
|
||||
# "%s/CentOS/vault.centos.org/7.2.1511" % repodata_dir,
|
||||
# "%s/CentOS/tis-r3/Source" % repodata_dir ]
|
||||
|
||||
bin_rpm_mirror_roots = ["%s/Binary" % centos_repo_dir,
|
||||
"%s/Binary" % third_party_repo_dir ]
|
||||
|
||||
src_rpm_mirror_roots = ["%s/Source" % centos_repo_dir,
|
||||
"%s/Source" % third_party_repo_dir ]
|
||||
|
||||
for bt in build_types:
|
||||
bin_rpm_mirror_roots.append(workspace_repo_dirs['RPM'][bt])
|
||||
src_rpm_mirror_roots.append(workspace_repo_dirs['SRPM'][bt])
|
||||
|
||||
short_options=''
|
||||
long_options=[ 'cache_dir=' ]
|
||||
|
||||
options, remainder = getopt.getopt(sys.argv[1:], short_options, long_options)
|
||||
|
||||
for opt, arg in options:
|
||||
if opt in ('--cache_dir'):
|
||||
publish_cache_dir = arg
|
||||
|
||||
if not os.path.isdir(publish_cache_dir):
|
||||
print("ERROR: directory not found %s" % publish_cache_dir)
|
||||
sys.exit(1)
|
||||
|
||||
# The Main data structure
|
||||
pkg_data={}
|
||||
|
||||
for rpm_type in rpm_types:
|
||||
pkg_data[rpm_type]={}
|
||||
|
||||
# map provided_name -> pkg_name
|
||||
pkg_data[rpm_type]['providers']={}
|
||||
|
||||
# map pkg_name -> required_names ... could be a pkg, capability or file
|
||||
pkg_data[rpm_type]['requires']={}
|
||||
|
||||
# map file_name -> pkg_name
|
||||
pkg_data[rpm_type]['file_owners']={}
|
||||
|
||||
# map pkg_name -> file_name
|
||||
pkg_data[rpm_type]['files']={}
|
||||
|
||||
# map pkg_name -> required_pkg_names ... only pkg names, and only direct requirement
|
||||
pkg_data[rpm_type]['pkg_direct_requires']={}
|
||||
|
||||
# map pkg_name -> required_pkg_names ... only pkg names, but this is the transitive list of all requirements
|
||||
pkg_data[rpm_type]['pkg_transitive_requires']={}
|
||||
|
||||
# map pkg_name -> descendant_pkgs ... only packages the directly require this package
|
||||
pkg_data[rpm_type]['pkg_direct_descendants']={}
|
||||
|
||||
# map pkg_name -> descendant_pkgs ... packages that have a transitive requiremant on this package
|
||||
pkg_data[rpm_type]['pkg_transitive_descendants']={}
|
||||
|
||||
# Map package name to a source rpm file name
|
||||
pkg_data[rpm_type]['sourcerpm']={}
|
||||
pkg_data[rpm_type]['binrpm']={}
|
||||
|
||||
# Map file name to package name
|
||||
pkg_data[rpm_type]['fn_to_name']={}
|
||||
|
||||
pkg_data['SRPM']['pkg_direct_requires_rpm']={}
|
||||
pkg_data['SRPM']['pkg_transitive_requires_rpm']={}
|
||||
|
||||
|
||||
# Return a list of file paths, starting in 'dir', matching 'pattern'
|
||||
# dir= directory to search under
|
||||
# pattern= search for file or directory matching pattern, wildcards allowed
|
||||
# recursive_depth= how many levels of directory before giving up
|
||||
def file_search(dir, pattern, recursive_depth=0):
|
||||
match_list = []
|
||||
new_depth = recursive_depth - 1
|
||||
# print "file_search(%s,%s,%s)" % (dir, pattern, recursive_depth)
|
||||
for file in os.listdir(dir):
|
||||
path = "%s/%s" % (dir, file)
|
||||
if fnmatch.fnmatch(file, pattern):
|
||||
print path
|
||||
match_list.append(path)
|
||||
elif (recursive_depth > 0) and os.path.isdir(path):
|
||||
sub_list = []
|
||||
sub_list = file_search(path, pattern, recursive_depth=new_depth)
|
||||
match_list.extend(sub_list)
|
||||
return match_list
|
||||
|
||||
# Return the list of .../repodate/*primary.xml.gz files
|
||||
# rpm_type= 'RPM' or 'SRPM'
|
||||
# arch= e.g. x86_64, only relevant of rpm_type=='RPM'
|
||||
def get_repo_primary_data_list(rpm_type='RPM', arch_list=default_arch_list):
|
||||
rpm_repo_roots = []
|
||||
rpm_repodata_roots = []
|
||||
repodata_list = []
|
||||
|
||||
if rpm_type == 'RPM':
|
||||
for d in bin_rpm_mirror_roots:
|
||||
sub_list = file_search(d, 'repodata', 25)
|
||||
rpm_repodata_roots.extend(sub_list)
|
||||
elif rpm_type == 'SRPM':
|
||||
for d in src_rpm_mirror_roots:
|
||||
sub_list = file_search(d, 'repodata', 5)
|
||||
rpm_repodata_roots.extend(sub_list)
|
||||
else:
|
||||
print "invalid rpm_type '%s', valid types are %s" % (rpm_type, str(rpm_types))
|
||||
return repodata_list
|
||||
|
||||
for d in rpm_repodata_roots:
|
||||
sub_list = file_search(d, '*primary.xml.gz', 2)
|
||||
repodata_list.extend(sub_list)
|
||||
|
||||
return repodata_list
|
||||
|
||||
|
||||
# Return the list of .../repodate/*filelists.xml.gz files
|
||||
# rpm_type= 'RPM' or 'SRPM'
|
||||
# arch= e.g. x86_64, only relevant of rpm_type=='RPM'
|
||||
def get_repo_filelists_data_list(rpm_type='RPM', arch_list=default_arch_list):
|
||||
rpm_repo_roots = []
|
||||
rpm_repodata_roots = []
|
||||
repodata_list = []
|
||||
|
||||
if rpm_type == 'RPM':
|
||||
for d in bin_rpm_mirror_roots:
|
||||
sub_list = file_search(d, 'repodata', 25)
|
||||
rpm_repodata_roots.extend(sub_list)
|
||||
elif rpm_type == 'SRPM':
|
||||
for d in src_rpm_mirror_roots:
|
||||
sub_list = file_search(d, 'repodata', 5)
|
||||
rpm_repodata_roots.extend(sub_list)
|
||||
else:
|
||||
print "invalid rpm_type '%s', valid types are %s" % (rpm_type, str(rpm_types))
|
||||
return repodata_list
|
||||
|
||||
for d in rpm_repodata_roots:
|
||||
sub_list = file_search(d, '*filelists.xml.gz', 2)
|
||||
repodata_list.extend(sub_list)
|
||||
|
||||
return repodata_list
|
||||
|
||||
|
||||
|
||||
# Process a list of repodata files (*filelists.xml.gz) and extract package data.
|
||||
# Data is saved to the global 'pkg_data'.
|
||||
def read_data_from_repodata_filelists_list(repodata_list, rpm_type='RPM', arch=default_arch):
|
||||
for repodata_path in repodata_list:
|
||||
read_data_from_filelists_xml_gz(repodata_path, rpm_type=rpm_type, arch=arch)
|
||||
|
||||
# Process a single repodata file (*filelists.xml.gz) and extract package data.
|
||||
# Data is saved to the global 'pkg_data'.
|
||||
def read_data_from_filelists_xml_gz(repodata_path, rpm_type='RPM', arch=default_arch):
|
||||
# print "repodata_path=%s" % repodata_path
|
||||
infile = gzip.open(repodata_path)
|
||||
root = ET.parse(infile).getroot()
|
||||
for pkg in root.findall('filelists:package', ns):
|
||||
name=pkg.get('name')
|
||||
pkg_arch=pkg.get('arch')
|
||||
|
||||
version=""
|
||||
release=""
|
||||
|
||||
if arch is not None:
|
||||
if pkg_arch is None:
|
||||
continue
|
||||
if pkg_arch != arch:
|
||||
continue
|
||||
|
||||
v=pkg.find('filelists:version', ns)
|
||||
if v is not None:
|
||||
version=v.get('ver')
|
||||
release=v.get('rel')
|
||||
else:
|
||||
print "%s: %s.%s has no 'filelists:version'" % (repodata_path, name, pkg_arch)
|
||||
|
||||
# print "%s %s %s %s " % (name, pkg_arch, version, release)
|
||||
|
||||
for f in pkg.findall('filelists:file', ns):
|
||||
fn=f.text
|
||||
# print " fn=%s -> plg=%s" % (fn, name)
|
||||
if not name in pkg_data[rpm_type]['files']:
|
||||
pkg_data[rpm_type]['files'][name]=[]
|
||||
pkg_data[rpm_type]['files'][name].append(fn)
|
||||
if not fn in pkg_data[rpm_type]['file_owners']:
|
||||
pkg_data[rpm_type]['file_owners'][fn]=[]
|
||||
pkg_data[rpm_type]['file_owners'][fn]=name
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Process a list of repodata files (*primary.xml.gz) and extract package data.
|
||||
# Data is saved to the global 'pkg_data'.
|
||||
def read_data_from_repodata_primary_list(repodata_list, rpm_type='RPM', arch=default_arch):
|
||||
for repodata_path in repodata_list:
|
||||
read_data_from_primary_xml_gz(repodata_path, rpm_type=rpm_type, arch=arch)
|
||||
|
||||
# Process a single repodata file (*primary.xml.gz) and extract package data.
|
||||
# Data is saved to the global 'pkg_data'.
|
||||
def read_data_from_primary_xml_gz(repodata_path, rpm_type='RPM', arch=default_arch):
|
||||
# print "repodata_path=%s" % repodata_path
|
||||
infile = gzip.open(repodata_path)
|
||||
root = ET.parse(infile).getroot()
|
||||
for pkg in root.findall('root:package', ns):
|
||||
name=pkg.find('root:name', ns).text
|
||||
pkg_arch=pkg.find('root:arch', ns).text
|
||||
version=""
|
||||
release=""
|
||||
license=""
|
||||
sourcerpm=""
|
||||
|
||||
if arch is not None:
|
||||
if pkg_arch is None:
|
||||
continue
|
||||
if pkg_arch != arch:
|
||||
continue
|
||||
|
||||
pkg_data[rpm_type]['providers'][name]=name
|
||||
pkg_data[rpm_type]['files'][name]=[]
|
||||
pkg_data[rpm_type]['requires'][name] = []
|
||||
pkg_data[rpm_type]['requires'][name].append(name)
|
||||
|
||||
url=pkg.find('root:url', ns).text
|
||||
v=pkg.find('root:version', ns)
|
||||
if v is not None:
|
||||
version=v.get('ver')
|
||||
release=v.get('rel')
|
||||
else:
|
||||
print "%s: %s.%s has no 'root:version'" % (repodata_path, name, pkg_arch)
|
||||
|
||||
fn="%s-%s-%s.%s.rpm" % (name, version, release, arch)
|
||||
pkg_data[rpm_type]['fn_to_name'][fn]=name
|
||||
|
||||
# SAL print "%s %s %s %s " % (name, pkg_arch, version, release)
|
||||
print "%s %s %s %s " % (name, pkg_arch, version, release)
|
||||
f=pkg.find('root:format', ns)
|
||||
if f is not None:
|
||||
license=f.find('rpm:license', ns).text
|
||||
sourcerpm=f.find('rpm:sourcerpm', ns).text
|
||||
if sourcerpm != "":
|
||||
pkg_data[rpm_type]['sourcerpm'][name] = sourcerpm
|
||||
# SAL print "--- requires ---"
|
||||
print "--- requires ---"
|
||||
r=f.find('rpm:requires', ns)
|
||||
if r is not None:
|
||||
for rr in r.findall('rpm:entry', ns):
|
||||
required_name=rr.get('name')
|
||||
# SAL print " %s" % required_name
|
||||
print " %s" % required_name
|
||||
pkg_data[rpm_type]['requires'][name].append(required_name)
|
||||
else:
|
||||
print "%s: %s.%s has no 'rpm:requires'" % (repodata_path, name, pkg_arch)
|
||||
# print "--- provides ---"
|
||||
p=f.find('rpm:provides', ns)
|
||||
if p is not None:
|
||||
for pp in p.findall('rpm:entry', ns):
|
||||
provided_name=pp.get('name')
|
||||
# print " %s" % provided_name
|
||||
if name == "kernel-rt" and provided_name in pkg_data[rpm_type]['providers'] and pkg_data[rpm_type]['providers'][provided_name] == "kernel":
|
||||
continue
|
||||
if name.startswith('kernel-rt'):
|
||||
alt_name=string.replace(name, 'kernel-rt', 'kernel')
|
||||
if provided_name in pkg_data[rpm_type]['providers'] and pkg_data[rpm_type]['providers'][provided_name] == alt_name:
|
||||
continue
|
||||
pkg_data[rpm_type]['providers'][provided_name]=name
|
||||
else:
|
||||
print "%s: %s.%s has no 'rpm:provides'" % (repodata_path, name, pkg_arch)
|
||||
# print "--- files ---"
|
||||
for fn in f.findall('root:file', ns):
|
||||
file_name=fn.text
|
||||
# print " %s" % file_name
|
||||
pkg_data[rpm_type]['files'][name].append(file_name)
|
||||
if name == "kernel-rt" and file_name in pkg_data[rpm_type]['file_owners'] and pkg_data[rpm_type]['file_owners'][file_name] == "kernel":
|
||||
continue
|
||||
if name.startswith('kernel-rt'):
|
||||
alt_name=string.replace(name, 'kernel-rt', 'kernel')
|
||||
if provided_name in pkg_data[rpm_type]['file_owners'] and pkg_data[rpm_type]['file_owners'][file_name] == alt_name:
|
||||
continue
|
||||
pkg_data[rpm_type]['file_owners'][file_name]=name
|
||||
else:
|
||||
print "%s: %s.%s has no 'root:format'" % (repodata_path, name, pkg_arch)
|
||||
# print "%s %s %s %s %s" % (name, pkg_arch, version, release, license)
|
||||
infile.close
|
||||
|
||||
def calulate_all_direct_requires_and_descendants(rpm_type='RPM'):
|
||||
# print "calulate_all_direct_requires_and_descendants rpm_type=%s" % rpm_type
|
||||
for name in pkg_data[rpm_type]['requires']:
|
||||
calulate_pkg_direct_requires_and_descendants(name, rpm_type=rpm_type)
|
||||
|
||||
def calulate_pkg_direct_requires_and_descendants(name, rpm_type='RPM'):
|
||||
print "SAL: %s needs:" % name
|
||||
if not rpm_type in pkg_data:
|
||||
print "Error: unknown rpm_type '%s'" % rpm_type
|
||||
return
|
||||
|
||||
if not name in pkg_data[rpm_type]['requires']:
|
||||
print "Note: No requires data for '%s'" % name
|
||||
return
|
||||
|
||||
for req in pkg_data[rpm_type]['requires'][name]:
|
||||
pro = '???'
|
||||
if rpm_type == 'RPM':
|
||||
if req in pkg_data[rpm_type]['providers']:
|
||||
pro = pkg_data[rpm_type]['providers'][req]
|
||||
elif req in pkg_data[rpm_type]['file_owners']:
|
||||
pro = pkg_data[rpm_type]['file_owners'][req]
|
||||
else:
|
||||
pro = '???'
|
||||
print "package %s has unresolved requirement '%s'" % (name, req)
|
||||
else:
|
||||
# i.e. rpm_type == 'SRPM'
|
||||
rpm_pro = '???'
|
||||
if req in pkg_data['RPM']['providers']:
|
||||
rpm_pro = pkg_data['RPM']['providers'][req]
|
||||
elif req in pkg_data['RPM']['file_owners']:
|
||||
rpm_pro = pkg_data['RPM']['file_owners'][req]
|
||||
else:
|
||||
rpm_pro = '???'
|
||||
print "package %s has unresolved requirement '%s'" % (name, req)
|
||||
|
||||
if rpm_pro is not None and rpm_pro != '???':
|
||||
if not name in pkg_data[rpm_type]['pkg_direct_requires_rpm']:
|
||||
pkg_data[rpm_type]['pkg_direct_requires_rpm'][name] = []
|
||||
if not rpm_pro in pkg_data[rpm_type]['pkg_direct_requires_rpm'][name]:
|
||||
pkg_data[rpm_type]['pkg_direct_requires_rpm'][name].append(rpm_pro)
|
||||
|
||||
if rpm_pro in pkg_data['RPM']['sourcerpm']:
|
||||
fn = pkg_data['RPM']['sourcerpm'][rpm_pro]
|
||||
if fn in pkg_data['SRPM']['fn_to_name']:
|
||||
pro = pkg_data['SRPM']['fn_to_name'][fn]
|
||||
else:
|
||||
pro = '???'
|
||||
print "package %s requires srpm file name %s" % (name,fn)
|
||||
else:
|
||||
pro = '???'
|
||||
print "package %s requires rpm %s, but that rpm has no known srpm" % (name,rpm_pro)
|
||||
|
||||
if pro is not None and pro != '???':
|
||||
if not name in pkg_data[rpm_type]['pkg_direct_requires']:
|
||||
pkg_data[rpm_type]['pkg_direct_requires'][name] = []
|
||||
if not pro in pkg_data[rpm_type]['pkg_direct_requires'][name]:
|
||||
pkg_data[rpm_type]['pkg_direct_requires'][name].append(pro)
|
||||
if not pro in pkg_data[rpm_type]['pkg_direct_descendants']:
|
||||
pkg_data[rpm_type]['pkg_direct_descendants'][pro] = []
|
||||
if not name in pkg_data[rpm_type]['pkg_direct_descendants'][pro]:
|
||||
pkg_data[rpm_type]['pkg_direct_descendants'][pro].append(name)
|
||||
|
||||
print "SAL: %s -> %s" % (req, pro)
|
||||
|
||||
|
||||
|
||||
def calulate_all_transitive_requires(rpm_type='RPM'):
|
||||
for name in pkg_data[rpm_type]['pkg_direct_requires']:
|
||||
calulate_pkg_transitive_requires(name, rpm_type=rpm_type)
|
||||
|
||||
def calulate_pkg_transitive_requires(name, rpm_type='RPM'):
|
||||
if not rpm_type in pkg_data:
|
||||
print "Error: unknown rpm_type '%s'" % rpm_type
|
||||
return
|
||||
|
||||
if not name in pkg_data[rpm_type]['pkg_direct_requires']:
|
||||
print "Note: No direct_requires data for '%s'" % name
|
||||
return
|
||||
|
||||
pkg_data[rpm_type]['pkg_transitive_requires'][name]=[]
|
||||
if rpm_type != 'RPM':
|
||||
pkg_data[rpm_type]['pkg_transitive_requires_rpm'][name]=[]
|
||||
unresolved = []
|
||||
unresolved.append(name)
|
||||
|
||||
while unresolved:
|
||||
n = unresolved.pop(0)
|
||||
# print "%s: remove %s" % (name, n)
|
||||
if rpm_type == 'RPM':
|
||||
direct_requires='pkg_direct_requires'
|
||||
transitive_requires='pkg_transitive_requires'
|
||||
else:
|
||||
direct_requires='pkg_direct_requires_rpm'
|
||||
transitive_requires='pkg_transitive_requires_rpm'
|
||||
if n in pkg_data[rpm_type][direct_requires]:
|
||||
for r in pkg_data[rpm_type][direct_requires][n]:
|
||||
if r != name:
|
||||
if not r in pkg_data[rpm_type][transitive_requires][name]:
|
||||
pkg_data[rpm_type][transitive_requires][name].append(r)
|
||||
if r in pkg_data['RPM']['pkg_transitive_requires']:
|
||||
for r2 in pkg_data['RPM']['pkg_transitive_requires'][r]:
|
||||
if r2 != name:
|
||||
if not r2 in pkg_data[rpm_type][transitive_requires][name]:
|
||||
pkg_data[rpm_type][transitive_requires][name].append(r2)
|
||||
else:
|
||||
if rpm_type == 'RPM':
|
||||
unresolved.append(r)
|
||||
else:
|
||||
print "WARNING: calulate_pkg_transitive_requires: can't append rpm to SRPM list, name=%s, r=%s" % (name, r)
|
||||
# print "%s: add %s" % (name, r)
|
||||
if rpm_type != 'RPM':
|
||||
for r in pkg_data[rpm_type]['pkg_transitive_requires_rpm'][name]:
|
||||
if r in pkg_data['RPM']['sourcerpm']:
|
||||
fn = pkg_data['RPM']['sourcerpm'][r]
|
||||
if fn in pkg_data['SRPM']['fn_to_name']:
|
||||
s = pkg_data['SRPM']['fn_to_name'][fn]
|
||||
pkg_data[rpm_type]['pkg_transitive_requires'][name].append(s)
|
||||
else:
|
||||
print "package %s requires srpm file name %s, but srpm name is not known" % (name, fn)
|
||||
else:
|
||||
print "package %s requires rpm %s, but that rpm has no known srpm" % (name, r)
|
||||
|
||||
def calulate_all_transitive_descendants(rpm_type='RPM'):
|
||||
for name in pkg_data[rpm_type]['pkg_direct_descendants']:
|
||||
calulate_pkg_transitive_descendants(name, rpm_type=rpm_type)
|
||||
|
||||
def calulate_pkg_transitive_descendants(name, rpm_type='RPM'):
|
||||
if not rpm_type in pkg_data:
|
||||
print "Error: unknown rpm_type '%s'" % rpm_type
|
||||
return
|
||||
|
||||
if not name in pkg_data[rpm_type]['pkg_direct_descendants']:
|
||||
print "Note: No direct_requires data for '%s'" % name
|
||||
return
|
||||
|
||||
pkg_data[rpm_type]['pkg_transitive_descendants'][name]=[]
|
||||
unresolved = []
|
||||
unresolved.append(name)
|
||||
|
||||
while unresolved:
|
||||
n = unresolved.pop(0)
|
||||
# print "%s: remove %s" % (name, n)
|
||||
if n in pkg_data[rpm_type]['pkg_direct_descendants']:
|
||||
for r in pkg_data[rpm_type]['pkg_direct_descendants'][n]:
|
||||
if r != name:
|
||||
if not r in pkg_data[rpm_type]['pkg_transitive_descendants'][name]:
|
||||
pkg_data[rpm_type]['pkg_transitive_descendants'][name].append(r)
|
||||
if r in pkg_data[rpm_type]['pkg_transitive_descendants']:
|
||||
for n2 in pkg_data[rpm_type]['pkg_transitive_descendants'][r]:
|
||||
if n2 != name:
|
||||
if not n2 in pkg_data[rpm_type]['pkg_transitive_descendants'][name]:
|
||||
pkg_data[rpm_type]['pkg_transitive_descendants'][name].append(n2)
|
||||
else:
|
||||
unresolved.append(r)
|
||||
# print "%s: add %s" % (name, r)
|
||||
|
||||
def create_dest_rpm_data():
|
||||
for name in sorted(pkg_data['RPM']['sourcerpm']):
|
||||
fn=pkg_data['RPM']['sourcerpm'][name]
|
||||
if fn in pkg_data['SRPM']['fn_to_name']:
|
||||
sname = pkg_data['SRPM']['fn_to_name'][fn]
|
||||
if not sname in pkg_data['SRPM']['binrpm']:
|
||||
pkg_data['SRPM']['binrpm'][sname]=[]
|
||||
pkg_data['SRPM']['binrpm'][sname].append(name)
|
||||
|
||||
def create_cache(cache_dir):
|
||||
for rpm_type in rpm_types:
|
||||
print ""
|
||||
print "==== %s ====" % rpm_type
|
||||
print ""
|
||||
rpm_repodata_primary_list = get_repo_primary_data_list(rpm_type=rpm_type, arch_list=default_arch_by_type[rpm_type])
|
||||
for arch in default_arch_by_type[rpm_type]:
|
||||
read_data_from_repodata_primary_list(rpm_repodata_primary_list, rpm_type=rpm_type, arch=arch)
|
||||
rpm_repodata_filelists_list = get_repo_filelists_data_list(rpm_type=rpm_type, arch_list=default_arch_by_type[rpm_type])
|
||||
for arch in default_arch_by_type[rpm_type]:
|
||||
read_data_from_repodata_filelists_list(rpm_repodata_filelists_list, rpm_type=rpm_type, arch=arch)
|
||||
calulate_all_direct_requires_and_descendants(rpm_type=rpm_type)
|
||||
calulate_all_transitive_requires(rpm_type=rpm_type)
|
||||
calulate_all_transitive_descendants(rpm_type=rpm_type)
|
||||
|
||||
cache_name="%s/%s-direct-requires" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_direct_requires']):
|
||||
print "%s needs %s" % (name, pkg_data[rpm_type]['pkg_direct_requires'][name])
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_direct_requires'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
cache_name="%s/%s-direct-descendants" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_direct_descendants']):
|
||||
print "%s informs %s" % (name, pkg_data[rpm_type]['pkg_direct_descendants'][name])
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_direct_descendants'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
cache_name="%s/%s-transitive-requires" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_transitive_requires']):
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_transitive_requires'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
cache_name="%s/%s-transitive-descendants" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_transitive_descendants']):
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_transitive_descendants'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
if rpm_type != 'RPM':
|
||||
cache_name="%s/%s-direct-requires-rpm" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_direct_requires_rpm']):
|
||||
print "%s needs rpm %s" % (name, pkg_data[rpm_type]['pkg_direct_requires_rpm'][name])
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_direct_requires_rpm'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
cache_name="%s/%s-transitive-requires-rpm" % (cache_dir, rpm_type)
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data[rpm_type]['pkg_transitive_requires_rpm']):
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for req in sorted(pkg_data[rpm_type]['pkg_transitive_requires_rpm'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % req)
|
||||
else:
|
||||
f.write(",%s" % req)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
cache_name="%s/rpm-to-srpm" % cache_dir
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data['RPM']['sourcerpm']):
|
||||
f.write("%s;" % name)
|
||||
fn=pkg_data['RPM']['sourcerpm'][name]
|
||||
if fn in pkg_data['SRPM']['fn_to_name']:
|
||||
sname = pkg_data['SRPM']['fn_to_name'][fn]
|
||||
f.write("%s" % sname)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
create_dest_rpm_data()
|
||||
cache_name="%s/srpm-to-rpm" % cache_dir
|
||||
f=open(cache_name, "w")
|
||||
for name in sorted(pkg_data['SRPM']['binrpm']):
|
||||
f.write("%s;" % name)
|
||||
first=True
|
||||
for bname in sorted(pkg_data['SRPM']['binrpm'][name]):
|
||||
if first:
|
||||
first=False
|
||||
f.write("%s" % bname)
|
||||
else:
|
||||
f.write(",%s" % bname)
|
||||
f.write("\n")
|
||||
f.close()
|
||||
|
||||
|
||||
|
||||
def test():
|
||||
for rpm_type in rpm_types:
|
||||
print ""
|
||||
print "==== %s ====" % rpm_type
|
||||
print ""
|
||||
rpm_repodata_primary_list = get_repo_primary_data_list(rpm_type=rpm_type, arch_list=default_arch_by_type[rpm_type])
|
||||
for arch in default_arch_by_type[rpm_type]:
|
||||
read_data_from_repodata_primary_list(rpm_repodata_primary_list, rpm_type=rpm_type, arch=arch)
|
||||
rpm_repodata_filelists_list = get_repo_filelists_data_list(rpm_type=rpm_type, arch_list=default_arch_by_type[rpm_type])
|
||||
for arch in default_arch_by_type[rpm_type]:
|
||||
read_data_from_repodata_filelists_list(rpm_repodata_filelists_list, rpm_type=rpm_type, arch=arch)
|
||||
calulate_all_direct_requires_and_descendants(rpm_type=rpm_type)
|
||||
calulate_all_transitive_requires(rpm_type=rpm_type)
|
||||
calulate_all_transitive_descendants(rpm_type=rpm_type)
|
||||
|
||||
for name in pkg_data[rpm_type]['pkg_direct_requires']:
|
||||
print "%s needs %s" % (name, pkg_data[rpm_type]['pkg_direct_requires'][name])
|
||||
|
||||
for name in pkg_data[rpm_type]['pkg_direct_descendants']:
|
||||
print "%s informs %s" % (name, pkg_data[rpm_type]['pkg_direct_descendants'][name])
|
||||
|
||||
for name in pkg_data[rpm_type]['pkg_transitive_requires']:
|
||||
print "%s needs %s" % (name, pkg_data[rpm_type]['pkg_transitive_requires'][name])
|
||||
print ""
|
||||
|
||||
for name in pkg_data[rpm_type]['pkg_transitive_descendants']:
|
||||
print "%s informs %s" % (name, pkg_data[rpm_type]['pkg_transitive_descendants'][name])
|
||||
print ""
|
||||
|
||||
|
||||
if os.path.isdir(publish_cache_dir):
|
||||
create_cache(publish_cache_dir)
|
||||
else:
|
||||
print "ERROR: Directory not found '%s" % publish_cache_dir
|
264
build-tools/default_build_srpm
Executable file
264
build-tools/default_build_srpm
Executable file
@ -0,0 +1,264 @@
|
||||
#!/bin/bash
|
||||
# set -x
|
||||
|
||||
source "$SRC_BASE/build-tools/spec-utils"
|
||||
source "$SRC_BASE/build-tools/srpm-utils"
|
||||
|
||||
CUR_DIR=`pwd`
|
||||
BUILD_DIR="$RPMBUILD_BASE"
|
||||
|
||||
if [ "x$DATA" == "x" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): Environment variable 'DATA' not defined."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
srpm_source_build_data $DATA
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): Failed to source build data from $DATA"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "x$VERSION" == "x" ]; then
|
||||
for SPEC in `find $SPECS_BASE -name '*.spec' | sort -V`; do
|
||||
SPEC_PATH="$SPEC"
|
||||
|
||||
VERSION_DERIVED=`spec_evaluate '%{version}' "$SPEC_PATH" 2>> /dev/null`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): '%{version}' not found in '$PKG_BASE/$SPEC_PATH'"
|
||||
VERSION_DERIVED=""
|
||||
fi
|
||||
|
||||
if [ "x$VERSION_DERIVED" != "x" ]; then
|
||||
if [ "x$VERSION" == "x" ]; then
|
||||
VERSION=$VERSION_DERIVED
|
||||
else
|
||||
if [ "x$SRC_DIR" != "x" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): multiple spec files found, can't set VERSION automatically"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "x$VERSION" == "x" ]; then
|
||||
if [ -f $SRC_DIR/PKG-INFO ]; then
|
||||
VERSION=$(grep '^Version:' $SRC_DIR/PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//')
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$VERSION" != "x" ]; then
|
||||
echo "Derived VERSION=$VERSION"
|
||||
else
|
||||
echo "ERROR: default_build_srpm (${LINENO}): Failed to derive a good VERSION from SPEC file, and none provided."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$TAR_NAME" == "x" ]; then
|
||||
for SPEC in `find $SPECS_BASE -name '*.spec' | sort -V`; do
|
||||
SPEC_PATH="$SPEC"
|
||||
|
||||
SERVICE=`spec_find_global service "$SPEC_PATH" 2>> /dev/null`
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "x$TAR_NAME" == "x" ]; then
|
||||
TAR_NAME=$SERVICE
|
||||
else
|
||||
if [ "x$SRC_DIR" != "x" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): multiple spec files found, can't set TAR_NAME automatically"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
NAME=`spec_find_tag Name "$SPEC_PATH" 2>> /dev/null`
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "x$TAR_NAME" == "x" ]; then
|
||||
TAR_NAME=$NAME
|
||||
else
|
||||
if [ "x$SRC_DIR" != "x" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): multiple spec files found, can't set TAR_NAME automatically"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "WARNING: default_build_srpm (${LINENO}): 'Name' not found in '$SPEC_PATH'"
|
||||
NAME=""
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "x$TAR_NAME" == "x" ]; then
|
||||
if [ -f $SRC_DIR/PKG-INFO ]; then
|
||||
TAR_NAME=$(grep '^Name:' $SRC_DIR/PKG-INFO | awk -F ': ' '{print $2}' | sed -e 's/^[[:space:]]*//')
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$TAR_NAME" != "x" ]; then
|
||||
echo "Derived TAR_NAME=$TAR_NAME"
|
||||
else
|
||||
echo "ERROR: default_build_srpm (${LINENO}): Failed to derive a good TAR_NAME from SPEC file, and none provided."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$TAR" == "x" ]; then
|
||||
TAR="$TAR_NAME-$VERSION.tar.gz"
|
||||
fi
|
||||
|
||||
SOURCE_PATH="$BUILD_DIR/SOURCES"
|
||||
TAR_PATH="$SOURCE_PATH/$TAR"
|
||||
STAGING=""
|
||||
|
||||
if [ "x$COPY_LIST_TO_TAR" != "x" ] || [ "x$EXCLUDE_LIST_FROM_TAR" != "x" ]; then
|
||||
STAGING="$BUILD_DIR/staging"
|
||||
mkdir -p $STAGING
|
||||
fi
|
||||
|
||||
mkdir -p "$BUILD_DIR/SRPMS"
|
||||
mkdir -p "$SOURCE_PATH"
|
||||
|
||||
if [ "x$SRC_DIR" == "x" -a "x$COPY_LIST" == "x" -a "$ALLOW_EMPTY_RPM" != "true" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): '$PWD/$DATA' failed to provide at least one of 'SRC_DIR' or 'COPY_LIST'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "x$SRC_DIR" != "x" ]; then
|
||||
if [ ! -d "$SRC_DIR" ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): directory not found: '$SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$COPY_LIST" != "x" ]; then
|
||||
echo "COPY_LIST: $COPY_LIST"
|
||||
for p in $COPY_LIST; do
|
||||
# echo "COPY_LIST: $p"
|
||||
\cp -L -u -r -v $p $SOURCE_PATH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): COPY_LIST: file not found: '$p'"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "x$STAGING" != "x" ]; then
|
||||
\cp -L -u -r -v $SRC_DIR $STAGING
|
||||
echo "COPY_LIST_TO_TAR: $COPY_LIST_TO_TAR"
|
||||
for p in $COPY_LIST_TO_TAR; do
|
||||
# echo "COPY_LIST_TO_TAR: $p"
|
||||
\cp -L -u -r -v $p $STAGING/$SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): COPY_LIST_TO_TAR: file not found: '$p'"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo "EXCLUDE_LIST_FROM_TAR: $EXCLUDE_LIST_FROM_TAR"
|
||||
for p in $EXCLUDE_LIST_FROM_TAR; do
|
||||
# echo "EXCLUDE_LIST_FROM_TAR: $p"
|
||||
echo "rm -rf $STAGING/$SRC_DIR/$p"
|
||||
\rm -rf $STAGING/$SRC_DIR/$p
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): EXCLUDE_LIST_FROM_TAR: could not remove file: '$p'"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
fi
|
||||
|
||||
TRANSFORM=`echo "$SRC_DIR" | sed 's/^\./\\./' | sed 's:^/::'`
|
||||
|
||||
if [ "x$STAGING" != "x" ]; then
|
||||
pushd $STAGING
|
||||
fi
|
||||
|
||||
TAR_NEEDED=0
|
||||
if [ "x$SRC_DIR" != "x" ]; then
|
||||
echo "SRC_DIR=$SRC_DIR"
|
||||
if [ -f $TAR_PATH ]; then
|
||||
n=`find . -cnewer $TAR_PATH -and ! -path './.git*' \
|
||||
-and ! -path './build/*' \
|
||||
-and ! -path './.pc/*' \
|
||||
-and ! -path './patches/*' \
|
||||
-and ! -path "./$DISTRO/*" \
|
||||
-and ! -path './pbr-*.egg/*' \
|
||||
| wc -l`
|
||||
if [ $n -gt 0 ]; then
|
||||
TAR_NEEDED=1
|
||||
fi
|
||||
else
|
||||
TAR_NEEDED=1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $TAR_NEEDED -gt 0 ]; then
|
||||
echo "Creating tar file: $TAR_PATH ..."
|
||||
tar czf $TAR_PATH $SRC_DIR --exclude '.git*' --exclude 'build' --exclude='.pc' --exclude='patches' --exclude="$SRC_DIR/$DISTRO" --exclude='pbr-*.egg' --transform "s,^$TRANSFORM,$TAR_NAME-$VERSION,"
|
||||
if [ $? -ne 0 ]; then
|
||||
if [ "x$STAGING" != "x" ]; then
|
||||
popd
|
||||
fi
|
||||
|
||||
echo "ERROR: default_build_srpm (${LINENO}): failed to create tar file, cmd: tar czf $TAR_PATH $SRC_DIR --exclude '.git*' --exclude 'build' --exclude='.pc' --exclude='patches' --exclude="$SRC_DIR/$DISTRO" --exclude='pbr-*.egg' --transform \"s,^$TRANSFORM,$TAR_NAME-$VERSION,\""
|
||||
exit 1
|
||||
fi
|
||||
echo "Created tar file: $TAR_PATH"
|
||||
else
|
||||
echo "Tar file not needed."
|
||||
fi
|
||||
|
||||
if [ "x$STAGING" != "x" ]; then
|
||||
popd
|
||||
fi
|
||||
|
||||
if [ ! -d $BUILD_DIR/SPECS ]; then
|
||||
echo "Spec directory '$BUILD_DIR/SPECS' does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $(ls -1 $BUILD_DIR/SPECS/*.spec | wc -l) -eq 0 ]; then
|
||||
echo "No spec files found in spec directory '$BUILD_DIR/SPECS'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for SPEC in `ls -1 $BUILD_DIR/SPECS`; do
|
||||
SPEC_PATH="$BUILD_DIR/SPECS/$SPEC"
|
||||
RELEASE=`spec_find_tag Release "$SPEC_PATH" 2>> /dev/null`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): 'Release' not found in '$SPEC_PATH'"
|
||||
fi
|
||||
NAME=`spec_find_tag Name "$SPEC_PATH" 2>> /dev/null`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: default_build_srpm (${LINENO}): 'Name' not found in '$SPEC_PATH'"
|
||||
fi
|
||||
SRPM="$NAME-$VERSION-$RELEASE.src.rpm"
|
||||
SRPM_PATH="$BUILD_DIR/SRPMS/$SRPM"
|
||||
|
||||
spec_validate_tis_release $SPEC_PATH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "TIS Validation of $SPEC_PATH failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BUILD_NEEDED=0
|
||||
if [ -f $SRPM_PATH ]; then
|
||||
n=`find . -cnewer $SRPM_PATH | wc -l`
|
||||
if [ $n -gt 0 ]; then
|
||||
BUILD_NEEDED=1
|
||||
fi
|
||||
else
|
||||
BUILD_NEEDED=1
|
||||
fi
|
||||
|
||||
if [ $BUILD_NEEDED -gt 0 ]; then
|
||||
echo "SPEC file: $SPEC_PATH"
|
||||
echo "SRPM build directory: $BUILD_DIR"
|
||||
echo "TIS_PATCH_VER: $TIS_PATCH_VER"
|
||||
|
||||
sed -i -e "1 i%define _tis_build_type $BUILD_TYPE" $SPEC_PATH
|
||||
sed -i -e "1 i%define tis_patch_ver $TIS_PATCH_VER" $SPEC_PATH
|
||||
rpmbuild -bs $SPEC_PATH --define="%_topdir $BUILD_DIR" --undefine=dist --define="_tis_dist .tis"
|
||||
else
|
||||
echo "SRPM build not needed"
|
||||
fi
|
||||
done
|
||||
|
||||
|
59
build-tools/find_klm
Executable file
59
build-tools/find_klm
Executable file
@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
|
||||
for r in $(find $MY_WORKSPACE/*/rpmbuild/RPMS -name '*.rpm'); do
|
||||
f=$(basename $r)
|
||||
find $MY_WORKSPACE/export/dist/isolinux/Packages | grep $f >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
n=$(rpm -q --qf='%{NAME}\n' -p $r)
|
||||
d=$(dirname $r)
|
||||
# echo "f=$f"
|
||||
for f in $(rpm -q -p -l $r | grep '[.]ko$' | head -n 1); do
|
||||
FOUND=0
|
||||
s=$(rpm -q --info -p $r | grep 'Source RPM :' | awk -F: '{print $2}' | tr -d '[[:space:]]')
|
||||
NAME=$(rpm -q --qf='%{NAME}\n' -p $d/$s)
|
||||
# echo "NAME=$NAME"
|
||||
for s2 in $(find $MY_WORKSPACE/*/rpmbuild/SRPMS -name "$NAME-[0-9]*.src.rpm"); do
|
||||
NAME2=$(rpm -q --qf='%{NAME}\n' -p $s2)
|
||||
# echo "NAME2=$NAME2"
|
||||
if [ "${NAME}" == "${NAME2}" ]; then
|
||||
echo $NAME | grep '[-]rt' >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo $NAME
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
# SIMPLE_NAME=$(echo $NAME | sed 's#-kmod##' | sed 's#-kernel##' | sed 's#^kernel$#linux#' | sed 's#^kernel-rt$#linux-rt#')
|
||||
SIMPLE_NAME=$(echo $NAME | sed 's#^kernel$#linux#' | sed 's#^kernel-rt$#linux-rt#')
|
||||
# echo "SIMPLE_NAME=$SIMPLE_NAME"
|
||||
grep "[/]$SIMPLE_NAME$" $(for g in $(find $MY_REPO -type d -name .git); do d=$(dirname $g); find $d -name 'centos_pkg_dirs*'; done) >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo $NAME
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
SIMPLE_NAME=$(echo $NAME | sed 's#-rt$##' )
|
||||
# echo "SIMPLE_NAME=$SIMPLE_NAME"
|
||||
grep "[/]$SIMPLE_NAME$" $(for g in $(find $MY_REPO -type d -name .git); do d=$(dirname $g); find $d -name 'centos_pkg_dirs*'; done) >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo $SIMPLE_NAME
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
SIMPLE_NAME2=$(echo $SIMPLE_NAME | sed 's#-kmod##' )
|
||||
# echo "SIMPLE_NAME2=$SIMPLE_NAME2"
|
||||
grep "[/-]$SIMPLE_NAME2$" $(for g in $(find $MY_REPO -type d -name .git); do d=$(dirname $g); find $d -name 'centos_pkg_dirs*'; done) >> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
echo $SIMPLE_NAME
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ $FOUND -eq 1 ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
# done
|
||||
done | sort --unique
|
54
build-tools/find_patched_srpms_needing_upgrade
Executable file
54
build-tools/find_patched_srpms_needing_upgrade
Executable file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
for f in `find $MY_REPO -name srpm_path`; do
|
||||
orig_line=`cat $f`
|
||||
first=`echo $orig_line | awk -F : '{print $1}'`
|
||||
orig_path="/import/mirrors/$orig_line"
|
||||
if [ "$first" == "mirror" ]; then
|
||||
orig_path="/import/mirrors/"$(echo $orig_line | awk -F : '{print $2}');
|
||||
fi
|
||||
if [ "$first" == "repo" ]; then
|
||||
orig_path="$MY_REPO/"$(echo $orig_line | awk -F : '{print $2}')
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ ! -f $orig_path ]; then
|
||||
echo "ERROR: bad srpm path: '$orig_path' derived from '$f'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
orig_dir=$(dirname $orig_path)
|
||||
repodata_dir=$orig_dir/repodata
|
||||
if [ ! -d $repodata_dir ]; then
|
||||
repodata_dir=$orig_dir/../repodata
|
||||
if [ ! -d $repodata_dir ]; then
|
||||
repodata_dir=$orig_dir/../../repodata
|
||||
if [ ! -d $repodata_dir ]; then
|
||||
echo "ERROR: couldn't find repodata for '$orig_path'"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# echo "'$orig_path' -> '$repodata_dir'"
|
||||
name=$(rpm -q --queryformat '%{NAME}\n' -p $orig_path 2>> /dev/null)
|
||||
version=$(rpm -q --queryformat '%{VERSION}\n' -p $orig_path 2>> /dev/null)
|
||||
release=$(rpm -q --queryformat '%{RELEASE}\n' -p $orig_path 2>> /dev/null)
|
||||
orig_name=$(basename $orig_path)
|
||||
best_name="$orig_name"
|
||||
for n in `find $orig_dir -name $name-*`; do
|
||||
if [ "$n" != "$orig_path" ]; then
|
||||
new_name=$(rpm -q --queryformat '%{NAME}\n' -p $n)
|
||||
if [ "$name" == "$new_name" ]; then
|
||||
rpmdev-vercmp $(basename $n) $best_name >> /dev/null
|
||||
if [ $? -eq 11 ]; then
|
||||
best_name=$(basename $n)
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ "$best_name" != "$orig_name" ]; then
|
||||
echo "$f: $orig_name ==> $best_name"
|
||||
fi
|
||||
done
|
||||
|
517
build-tools/ip_report.py
Executable file
517
build-tools/ip_report.py
Executable file
@ -0,0 +1,517 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import csv
|
||||
import os
|
||||
import rpm
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import getopt
|
||||
|
||||
|
||||
class BinPackage(object):
|
||||
def __init__(self, path, ts):
|
||||
fdno = os.open(path, os.O_RDONLY)
|
||||
hdr = ts.hdrFromFdno(path)
|
||||
os.close(fdno)
|
||||
|
||||
self.source = hdr[rpm.RPMTAG_SOURCERPM]
|
||||
self.desc = hdr[rpm.RPMTAG_DESCRIPTION].replace('\n', ' ')
|
||||
self.dirname = os.path.dirname(path)
|
||||
self.filename = os.path.basename(path)
|
||||
self.path = path
|
||||
self.kernel_module = False
|
||||
self.name = hdr[rpm.RPMTAG_NAME]
|
||||
|
||||
# Does the package contain kernel modules?
|
||||
for filename in hdr[rpm.RPMTAG_BASENAMES]:
|
||||
assert isinstance(filename, basestring)
|
||||
if filename.endswith('.ko'):
|
||||
self.kernel_module = True
|
||||
break
|
||||
|
||||
|
||||
class SrcPackage(object):
|
||||
def __init__(self, path=None):
|
||||
self.bin_pkg = None
|
||||
self.original_src = None
|
||||
self.sha = 'SHA'
|
||||
if path is None:
|
||||
self.filename = None
|
||||
self.path = None
|
||||
else:
|
||||
self.filename = os.path.basename(path)
|
||||
self.path = path
|
||||
ts = rpm.TransactionSet()
|
||||
ts.setVSFlags(rpm._RPMVSF_NODIGESTS | rpm._RPMVSF_NOSIGNATURES)
|
||||
fdno = os.open(self.path, os.O_RDONLY)
|
||||
hdr = ts.hdrFromFdno(self.path)
|
||||
os.close(fdno)
|
||||
self.desc = hdr[rpm.RPMTAG_DESCRIPTION].replace('\n', ' ')
|
||||
self.version = hdr[rpm.RPMTAG_VERSION] + '-' + hdr[rpm.RPMTAG_RELEASE]
|
||||
self.licences = hdr[rpm.RPMTAG_LICENSE]
|
||||
self.name = hdr[rpm.RPMTAG_NAME]
|
||||
self.url = hdr[rpm.RPMTAG_URL]
|
||||
|
||||
self.modified = None
|
||||
self.kernel_module = False
|
||||
self.disclosed_by = 'Jason McKenna'
|
||||
self.shipped_as = 'Binary'
|
||||
self.origin = 'Unknown'
|
||||
self.notes = ''
|
||||
self.wrs = False
|
||||
|
||||
def __lt__(self, other):
|
||||
me = self.name.lower()
|
||||
them = other.name.lower()
|
||||
if me == them:
|
||||
return self.name < other.name
|
||||
else:
|
||||
return me < them
|
||||
|
||||
|
||||
class IPReport(object):
|
||||
__KNOWN_PATHS = [
|
||||
# CentOS 7.4
|
||||
['/import/mirrors/CentOS/7.4.1708/os/Source/SPackages',
|
||||
'http://vault.centos.org/7.4.1708/os/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.4.1708/updates/Source/SPackages',
|
||||
'http://vault.centos.org/7.4.1708/updates/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.4.1708/cloud/Source/openstack-newton/common',
|
||||
'http://vault.centos.org/7.4.1708/cloud/Source/openstack-newton/common'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.4.1708/cloud/Source/openstack-newton',
|
||||
'http://vault.centos.org/7.4.1708/cloud/Source/openstack-newton'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.4.1708/cloud/Source/openstack-mitaka/common',
|
||||
'http://vault.centos.org/7.4.1708/cloud/Source/openstack-mitaka/common'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.4.1708/cloud/Source/openstack-mitaka',
|
||||
'http://vault.centos.org/7.4.1708/cloud/Source/openstack-mitaka'],
|
||||
['/import/mirrors/CentOS/7.4.1708/extras/Source/SPackages',
|
||||
'http://vault.centos.org/7.4.1708/extras/Source/SPackages'],
|
||||
# CentOS 7.3
|
||||
['/import/mirrors/CentOS/7.3.1611/os/Source/SPackages',
|
||||
'http://vault.centos.org/7.3.1611/os/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.3.1611/updates/Source/SPackages',
|
||||
'http://vault.centos.org/7.3.1611/updates/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.3.1611/cloud/Source/openstack-newton/common',
|
||||
'http://vault.centos.org/7.3.1611/cloud/Source/openstack-newton/common'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.3.1611/cloud/Source/openstack-newton',
|
||||
'http://vault.centos.org/7.3.1611/cloud/Source/openstack-newton'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.3.1611/cloud/Source/openstack-mitaka/common',
|
||||
'http://vault.centos.org/7.3.1611/cloud/Source/openstack-mitaka/common'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.3.1611/cloud/Source/openstack-mitaka',
|
||||
'http://vault.centos.org/7.3.1611/cloud/Source/openstack-mitaka'],
|
||||
['/import/mirrors/CentOS/7.3.1611/extras/Source/SPackages',
|
||||
'http://vault.centos.org/7.3.1611/extras/Source/SPackages'],
|
||||
# CentOS 7.2
|
||||
['/import/mirrors/CentOS/7.2.1511/os/Source/SPackages', 'http://vault.centos.org/7.2.1511/os/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.2.1511/updates/Source/SPackages',
|
||||
'http://vault.centos.org/7.2.1511/updates/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.2.1511/cloud/Source/openstack-mitaka/common',
|
||||
'http://vault.centos.org/7.2.1511/cloud/Source/openstack-mitaka/common'],
|
||||
['/import/mirrors/CentOS/vault.centos.org/7.2.1511/cloud/Source/openstack-mitaka',
|
||||
'http://vault.centos.org/7.2.1511/cloud/Source/openstack-mitaka'],
|
||||
['/import/mirrors/CentOS/7.2.1511/extras/Source/SPackages',
|
||||
'http://vault.centos.org/7.2.1511/extras/Source/SPackages'],
|
||||
['/import/mirrors/CentOS/tis-r4-CentOS/newton/Source', 'Unknown'],
|
||||
['/import/mirrors/CentOS/tis-r4-CentOS/tis-r4-3rd-Party', 'Unknown']
|
||||
|
||||
]
|
||||
|
||||
def __init__(self, workspace=None, repo=None):
|
||||
self.workspace = None
|
||||
self.repo = None
|
||||
self.shipped_binaries = list()
|
||||
self.built_binaries = list()
|
||||
self.check_env()
|
||||
if workspace is not None:
|
||||
self.workspace = workspace
|
||||
if repo is not None:
|
||||
self.repo = repo
|
||||
|
||||
# Generate a list of binaries that we shipped
|
||||
for filename in os.listdir(self.workspace + '/export/dist/isolinux/Packages'):
|
||||
if filename.endswith('rpm'):
|
||||
self.shipped_binaries.append(filename)
|
||||
|
||||
# Generate a list of binaries that we built ourselves
|
||||
for build in ['rt', 'std']:
|
||||
for filename in os.listdir(self.workspace + '/' + build + '/rpmbuild/RPMS/'):
|
||||
if filename.endswith('rpm'):
|
||||
self.built_binaries.append(filename)
|
||||
|
||||
print ('Looking up packages for which we have source...')
|
||||
self.original_src_pkgs = dict()
|
||||
self.build_original_src_pkgs()
|
||||
print ('Looking up packages we built...')
|
||||
self.built_src_pkgs = dict()
|
||||
self.build_built_src_pkgs()
|
||||
print ('Looking up packages we built...')
|
||||
self.hardcoded_lookup_dict = dict()
|
||||
self.build_hardcoded_lookup_dict()
|
||||
|
||||
def build_hardcoded_lookup_dict(self):
|
||||
with open(self.repo + '/build-tools/source_lookup.txt', 'r') as lookup_file:
|
||||
for line in lookup_file:
|
||||
line = line.rstrip()
|
||||
words = line.split()
|
||||
if (words is not None) and (len(words) >= 2):
|
||||
self.hardcoded_lookup_dict[words[1]] = (words[0], False)
|
||||
|
||||
with open(self.repo + '/build-tools/wrs_orig.txt', 'r') as lookup_file:
|
||||
for line in lookup_file:
|
||||
line = line.rstrip()
|
||||
words = line.split()
|
||||
if (words is not None) and (len(words) >= 1):
|
||||
self.hardcoded_lookup_dict[words[0]] = ('No download', True)
|
||||
|
||||
@staticmethod
|
||||
def path_to_origin(filepath):
|
||||
for path in IPReport.__KNOWN_PATHS:
|
||||
if filepath.startswith(path[0]) and (not path[1].lower().startswith('unknown')):
|
||||
return path[1] + '/' + os.path.basename(filepath)
|
||||
return 'Unknown'
|
||||
|
||||
def hardcoded_lookup(self, package_name):
|
||||
if package_name in self.hardcoded_lookup_dict.keys():
|
||||
return self.hardcoded_lookup_dict[package_name]
|
||||
return None, False
|
||||
|
||||
def check_env(self):
|
||||
if 'MY_WORKSPACE' in os.environ:
|
||||
self.workspace = os.environ['MY_WORKSPACE']
|
||||
else:
|
||||
print 'Could not find $MY_WORKSPACE'
|
||||
raise IOError('Could not fine $MY_WORKSPACE')
|
||||
|
||||
if 'MY_REPO' in os.environ:
|
||||
self.repo = os.environ['MY_REPO']
|
||||
else:
|
||||
print 'Could not find $MY_REPO'
|
||||
raise IOError('Could not fine $MY_REPO')
|
||||
|
||||
def do_bin_pkgs(self):
|
||||
print ('Gathering binary package information')
|
||||
self.read_bin_pkgs()
|
||||
|
||||
def read_bin_pkgs(self):
|
||||
self.bin_pkgs = list()
|
||||
ts = rpm.TransactionSet()
|
||||
ts.setVSFlags(rpm._RPMVSF_NODIGESTS | rpm._RPMVSF_NOSIGNATURES)
|
||||
for filename in self.shipped_binaries:
|
||||
if filename.endswith('rpm'):
|
||||
bin_pkg = BinPackage(self.workspace + '/export/dist/isolinux/Packages/' + filename, ts)
|
||||
self.bin_pkgs.append(bin_pkg)
|
||||
|
||||
def do_src_report(self, copy_packages=False, do_wrs=True, delta_file=None, output_path=None, strip_unchanged=False):
|
||||
self.bin_to_src()
|
||||
self.src_pkgs.sort()
|
||||
|
||||
if delta_file is not None:
|
||||
self.delta(delta_file)
|
||||
|
||||
if output_path is None:
|
||||
output_path = self.workspace + '/export/ip_report'
|
||||
|
||||
# Create output dir (if required)
|
||||
if not os.path.exists(output_path):
|
||||
os.makedirs(output_path)
|
||||
|
||||
# Create paths for RPMs (if required)
|
||||
if copy_packages:
|
||||
if not os.path.exists(output_path + '/non_wrs'):
|
||||
shutil.rmtree(output_path + '/non_wrs', True)
|
||||
os.makedirs(output_path + '/non_wrs')
|
||||
if do_wrs:
|
||||
shutil.rmtree(output_path + '/wrs', True)
|
||||
os.makedirs(output_path + '/wrs')
|
||||
|
||||
with open(output_path + '/srcreport.csv', 'wb') as src_report_file:
|
||||
src_report_writer = csv.writer(src_report_file)
|
||||
|
||||
# Write header row
|
||||
src_report_writer.writerow(
|
||||
['Package File', 'File Name', 'Package Name', 'Version', 'SHA1', 'Disclosed By',
|
||||
'Description', 'Part Of (Runtime, Host, Both)', 'Modified (Yes, No)', 'Hardware Interfacing (Yes, No)',
|
||||
'License(s) Found', 'Package Download URL', 'Kernel module', 'Notes'])
|
||||
|
||||
for src_pkg in self.src_pkgs:
|
||||
if src_pkg.modified:
|
||||
modified_string = 'Yes'
|
||||
else:
|
||||
modified_string = 'No'
|
||||
if src_pkg.kernel_module:
|
||||
kmod_string = 'Yes'
|
||||
else:
|
||||
kmod_string = 'No'
|
||||
|
||||
# Copy the pacakge and get the SHA
|
||||
if copy_packages:
|
||||
if src_pkg.wrs is False:
|
||||
shutil.copyfile(src_pkg.path, output_path + '/non_wrs/' + src_pkg.filename)
|
||||
shasumout = subprocess.check_output(
|
||||
['shasum', output_path + '/non_wrs/' + src_pkg.filename]).split()[0]
|
||||
src_pkg.sha = shasumout
|
||||
if strip_unchanged and (src_pkg.notes.lower().startswith('unchanged')):
|
||||
os.remove(output_path + '/non_wrs/' + src_pkg.filename)
|
||||
else:
|
||||
if do_wrs:
|
||||
shutil.copyfile(src_pkg.path, output_path + '/wrs/' + src_pkg.filename)
|
||||
shasumout = subprocess.check_output(
|
||||
['shasum', output_path + '/wrs/' + src_pkg.filename]).split()[0]
|
||||
src_pkg.sha = shasumout
|
||||
if strip_unchanged and (src_pkg.notes.lower().startswith('unchanged')):
|
||||
os.remove(output_path + '/wrs/' + src_pkg.filename)
|
||||
|
||||
if do_wrs or (src_pkg.wrs is False):
|
||||
src_report_writer.writerow(
|
||||
[src_pkg.filename, src_pkg.name, src_pkg.version, src_pkg.sha, src_pkg.disclosed_by,
|
||||
src_pkg.desc, 'Runtime', src_pkg.shipped_as, modified_string, 'No', src_pkg.licences,
|
||||
src_pkg.origin, kmod_string, src_pkg.notes])
|
||||
if 'unknown' in src_pkg.origin.lower():
|
||||
print (
|
||||
'Warning: Could not determine origin of ' + src_pkg.name + '. Please investigate/populate manually')
|
||||
|
||||
def bin_to_src(self):
|
||||
self.src_pkgs = list()
|
||||
src_pkg_names = list()
|
||||
for bin_pkg in self.bin_pkgs:
|
||||
if src_pkg_names.__contains__(bin_pkg.source):
|
||||
if bin_pkg.kernel_module:
|
||||
for src_pkg in self.src_pkgs:
|
||||
if src_pkg.filename == bin_pkg.source:
|
||||
src_pkg.kernel_module = True
|
||||
break
|
||||
|
||||
continue
|
||||
|
||||
# if we reach here, then the source package is not yet in our db.
|
||||
# we first search for the source package in the built-rpms
|
||||
if 'shim-signed' in bin_pkg.source:
|
||||
for tmp in self.built_src_pkgs:
|
||||
if 'shim-signed' in tmp:
|
||||
print ('shim-signed hack -- ' + bin_pkg.source + ' to ' + tmp)
|
||||
bin_pkg.source = tmp
|
||||
break
|
||||
if 'shim-unsigned' in bin_pkg.source:
|
||||
for tmp in self.built_src_pkgs:
|
||||
if 'shim-0' in tmp:
|
||||
print ('shim-unsigned hack -- ' + bin_pkg.source + ' to ' + tmp)
|
||||
bin_pkg.source = tmp
|
||||
break
|
||||
if 'grub2-efi-pxeboot' in bin_pkg.source:
|
||||
for tmp in self.built_src_pkgs:
|
||||
if 'grub2-2' in tmp:
|
||||
print ('grub2-efi-pxeboot hack -- ' + bin_pkg.source + ' to ' + tmp)
|
||||
bin_pkg.source = tmp
|
||||
break
|
||||
|
||||
if bin_pkg.source in self.built_src_pkgs:
|
||||
src_pkg = self.built_src_pkgs[bin_pkg.source]
|
||||
src_pkg.modified = True
|
||||
|
||||
# First guess, we see if there's an original source with the source package name
|
||||
# (this is 99% of the cases)
|
||||
src_pkg_orig_name = src_pkg.name
|
||||
if src_pkg_orig_name in self.original_src_pkgs:
|
||||
src_pkg.original_src = self.original_src_pkgs[src_pkg_orig_name]
|
||||
src_pkg.origin = src_pkg.original_src.origin
|
||||
|
||||
else:
|
||||
src_pkg_path = self.locate_in_mirror(bin_pkg.source)
|
||||
if not os.path.isabs(src_pkg_path):
|
||||
continue
|
||||
src_pkg = SrcPackage(src_pkg_path)
|
||||
src_pkg.origin = IPReport.path_to_origin(src_pkg_path)
|
||||
src_pkg.modified = False
|
||||
|
||||
if bin_pkg.kernel_module:
|
||||
src_pkg.kernel_module = True
|
||||
|
||||
src_pkg_names.append(bin_pkg.source)
|
||||
self.src_pkgs.append(src_pkg)
|
||||
|
||||
if src_pkg.origin.lower() == 'unknown':
|
||||
if 'windriver' in src_pkg.licences.lower():
|
||||
src_pkg.origin = 'No download'
|
||||
else:
|
||||
if src_pkg.url is not None:
|
||||
src_pkg.origin = src_pkg.url
|
||||
|
||||
if 'unknown' in src_pkg.origin.lower():
|
||||
(orig, is_wrs) = self.hardcoded_lookup(src_pkg.name)
|
||||
if orig is not None:
|
||||
src_pkg.origin = orig
|
||||
src_pkg.wrs = is_wrs
|
||||
|
||||
if (src_pkg.origin.lower() == 'no download') and ('windriver' in src_pkg.licences.lower()):
|
||||
src_pkg.wrs = True
|
||||
|
||||
def locate_in_mirror(self, filename):
|
||||
""" takes an RPM filename and finds the full path of the file """
|
||||
|
||||
fullpath = None
|
||||
|
||||
filename = filename.replace('mirror:', self.repo + '/cgcs-centos-repo/')
|
||||
filename = filename.replace('repo:', self.repo + '/')
|
||||
filename = filename.replace('3rd_party:', self.repo + '/cgcs-3rd-party-repo/')
|
||||
|
||||
# At this point, filename could be a complete path (incl symlink), or just a filename
|
||||
best_guess = filename
|
||||
filename = os.path.basename(filename)
|
||||
|
||||
for path in IPReport.__KNOWN_PATHS:
|
||||
if os.path.exists(path[0] + '/' + filename):
|
||||
fullpath = path[0] + '/' + filename
|
||||
break
|
||||
|
||||
if fullpath is not None:
|
||||
return fullpath
|
||||
else:
|
||||
return best_guess
|
||||
|
||||
def build_original_src_pkgs(self):
|
||||
for root, dirs, files in os.walk(self.repo):
|
||||
for name in files:
|
||||
if name == 'srpm_path':
|
||||
with open(os.path.join(root, 'srpm_path'), 'r') as srpm_path_file:
|
||||
original_srpm_file = srpm_path_file.readline().rstrip()
|
||||
original_src_pkg_path = self.locate_in_mirror(original_srpm_file)
|
||||
original_src_pkg = SrcPackage(original_src_pkg_path)
|
||||
original_src_pkg.origin = IPReport.path_to_origin(original_src_pkg_path)
|
||||
self.original_src_pkgs[original_src_pkg.name] = original_src_pkg
|
||||
|
||||
def build_built_src_pkgs(self):
|
||||
""" Create a dict of any source package that we built ourselves """
|
||||
for build in ['std', 'rt']:
|
||||
for root, dirs, files in os.walk(self.workspace + '/' + build + '/rpmbuild/SRPMS'):
|
||||
for name in files:
|
||||
if name.endswith('.src.rpm'):
|
||||
built_src_pkg = SrcPackage(os.path.join(root, name))
|
||||
self.built_src_pkgs[built_src_pkg.filename] = built_src_pkg
|
||||
|
||||
def delta(self, orig_report):
|
||||
if orig_report is None:
|
||||
return
|
||||
delta_src_pkgs = self.read_last_report(orig_report)
|
||||
|
||||
for pkg in self.src_pkgs:
|
||||
if pkg.name in delta_src_pkgs:
|
||||
old_pkg = delta_src_pkgs[pkg.name]
|
||||
if old_pkg.version == pkg.version:
|
||||
pkg.notes = 'Unchanged'
|
||||
else:
|
||||
pkg.notes = 'New version'
|
||||
else:
|
||||
pkg.notes = 'New package'
|
||||
|
||||
def read_last_report(self, orig_report):
|
||||
orig_pkg_dict = dict()
|
||||
with open(orig_report, 'rb') as orig_report_file:
|
||||
orig_report_reader = csv.reader(orig_report_file)
|
||||
doneHeader = False
|
||||
for row in orig_report_reader:
|
||||
if (not doneHeader) and ('package file name' in row[0].lower()):
|
||||
doneHeader = True
|
||||
continue
|
||||
doneHeader = True
|
||||
orig_pkg = SrcPackage()
|
||||
orig_pkg.filename = row[0]
|
||||
orig_pkg.name = row[1]
|
||||
orig_pkg.version = row[2]
|
||||
# sha = row[3]
|
||||
orig_pkg.disclosed_by = row[4]
|
||||
orig_pkg.desc = row[5]
|
||||
# runtime = row[6]
|
||||
orig_pkg.shipped_as = row[7]
|
||||
if row[8].lower is 'yes':
|
||||
orig_pkg.modified = True
|
||||
else:
|
||||
orig_pkg.modifed = False
|
||||
# hardware interfacing = row[9]
|
||||
orig_pkg.licences = row[10]
|
||||
orig_pkg.origin = row[11]
|
||||
if row[12].lower is 'yes':
|
||||
orig_pkg.kernel_module = True
|
||||
else:
|
||||
orig_pkg.kernel_module = False
|
||||
orig_pkg_dict[orig_pkg.name] = orig_pkg
|
||||
|
||||
return orig_pkg_dict
|
||||
|
||||
|
||||
def main(argv):
|
||||
# handle command line arguments
|
||||
# -h/--help -- help
|
||||
# -n/--no-copy -- do not copy files (saves time)
|
||||
# -d/--delta= -- compare with an ealier report
|
||||
# -o/--output= -- output report/binaries to specified path
|
||||
# -w/--workspace= -- use specified workspace instead of $WORKSPACE
|
||||
# -r/--repo= -- use sepeciied repo instead of $MY_REPO
|
||||
# -s -- strip (remove) unchanged packages from copy out directory
|
||||
|
||||
try:
|
||||
opts, args = getopt.getopt(argv, "hnd:o:w:r:s",
|
||||
["delta=", "help", "no-copy", "workspace=", "repo=", "output=", "--strip"])
|
||||
except getopt.GetoptError:
|
||||
# todo - output help
|
||||
sys.exit(2)
|
||||
delta_file = None
|
||||
do_copy = True
|
||||
workspace = None
|
||||
repo = None
|
||||
output_path = None
|
||||
strip_unchanged = False
|
||||
|
||||
for opt, arg in opts:
|
||||
if opt in ('-h', '--help'):
|
||||
print 'usage:'
|
||||
print ' ip_report.py [options]'
|
||||
print ' Creates and IP report in $MY_WORKSPACE/export/ip_report '
|
||||
print ' Source RPMs (both Wind River and non WR) are placed in subdirs within that path'
|
||||
print ''
|
||||
print 'Options:'
|
||||
print ' -h/--help - this help'
|
||||
print ' -d <file>/--delta=<file> - create "notes" field, comparing report with a previous report'
|
||||
print ' -n/--no-copy - do not copy files into subdirs (this is faster, but means you'
|
||||
print ' don\'t get SHA sums for files)'
|
||||
print ' -w <path>/--workspace=<path> - use the specified path as workspace, instead of $MY_WORKSPACE'
|
||||
print ' -r <path>/--repo=<path> - use the specified path as repo, instead of $MY_REPO'
|
||||
print ' -o <path>/--output=<path> - output to specified path (instead of $MY_WORKSPACE/export/ip_report)'
|
||||
print ' -s/--strip - strip (remove) unchanged files if copied'
|
||||
exit()
|
||||
elif opt in ('-d', '--delta'):
|
||||
delta_file = os.path.normpath(arg)
|
||||
delta_file = os.path.expanduser(delta_file)
|
||||
if not os.path.exists(delta_file):
|
||||
print 'Cannot locate ' + delta_file
|
||||
exit(1)
|
||||
elif opt in ('-w', '--workspace'):
|
||||
workspace = os.path.normpath(arg)
|
||||
workspace = os.path.expanduser(workspace)
|
||||
elif opt in ('-r', '--repo'):
|
||||
repo = os.path.normpath(arg)
|
||||
repo = os.path.expanduser(repo)
|
||||
elif opt in ('-o', '--output'):
|
||||
output_path = os.path.normpath(arg)
|
||||
output_path = os.path.expanduser(output_path)
|
||||
elif opt in ('-n', '--no-copy'):
|
||||
do_copy = False
|
||||
elif opt in ('-s', '--strip-unchanged'):
|
||||
strip_unchanged = True
|
||||
|
||||
print ('Doing IP report')
|
||||
if delta_file is not None:
|
||||
print 'Delta from ' + delta_file
|
||||
else:
|
||||
print 'No delta specified'
|
||||
ip_report = IPReport(workspace=workspace, repo=repo)
|
||||
|
||||
ip_report.do_bin_pkgs()
|
||||
ip_report.do_src_report(copy_packages=do_copy,
|
||||
delta_file=delta_file,
|
||||
output_path=output_path,
|
||||
strip_unchanged=strip_unchanged)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv[1:])
|
244
build-tools/make-installer-images.sh
Executable file
244
build-tools/make-installer-images.sh
Executable file
@ -0,0 +1,244 @@
|
||||
#!/bin/bash -e
|
||||
## this script is called by "update-pxe-network-installer" and run in "sudo"
|
||||
## created by Yong Hu (yong.hu@intel.com), 05/24/2018
|
||||
|
||||
function clean_rootfs() {
|
||||
rootfs_dir=$1
|
||||
echo "--> remove old files in original rootfs"
|
||||
conf="$(ls ${rootfs_dir}/etc/ld.so.conf.d/kernel-*.conf)"
|
||||
echo "conf basename = $(basename $conf)"
|
||||
old_version="tbd"
|
||||
if [ -f $conf ];then
|
||||
old_version="$(echo $(basename $conf) | rev | cut -d'.' -f2- | rev | cut -d'-' -f2-)"
|
||||
fi
|
||||
echo "old version is $old_version"
|
||||
# remove old files in original initrd.img
|
||||
# do this in chroot to avoid accidentialy wrong operations on host root
|
||||
chroot $rootfs_dir /bin/bash -x <<EOF
|
||||
rm -rf ./boot/ ./etc/modules-load.d/
|
||||
if [ -n $old_version ] && [ -f ./etc/ld.so.conf.d/kernel-${old_version}.conf ]; then
|
||||
rm -rf ./etc/ld.so.conf.d/kernel-${old_version}.conf
|
||||
rm -rf ./lib/modules/${old_version}
|
||||
fi
|
||||
if [ -d ./usr/lib64/python2.7/site-packages/pyanaconda/ ];then
|
||||
rm -rf usr/lib64/python2.7/site-packages/pyanaconda/
|
||||
fi
|
||||
if [ -d ./usr/lib64/python2.7/site-packages/rpm/ ];then
|
||||
rm -rf usr/lib64/python2.7/site-packages/rpm/
|
||||
fi
|
||||
#find old .pyo files and delete them
|
||||
all_pyo="`find ./usr/lib64/python2.7/site-packages/pyanaconda/ usr/lib64/python2.7/site-packages/rpm/ -name *.pyo`"
|
||||
if [ -n $all ]; then
|
||||
for pyo in $all_pyo;do
|
||||
rm -f $pyo
|
||||
done
|
||||
fi
|
||||
exit
|
||||
EOF
|
||||
#back to previous folder
|
||||
}
|
||||
|
||||
|
||||
echo "This script makes new initrd.img, vmlinuz and squashfs.img."
|
||||
echo "NOTE: it has to be executed with *root*!"
|
||||
|
||||
if [ $# -lt 2 ];then
|
||||
echo "$0 <work_dir> <kernel_mode>"
|
||||
echo "kernel_mode: std or rt"
|
||||
exit -1;
|
||||
fi
|
||||
|
||||
work_dir=$1
|
||||
mode=$2
|
||||
output_dir=$work_dir/output
|
||||
if [ ! -d $output_dir ];then mkdir -p $output_dir; fi
|
||||
|
||||
if [ "$mode" != "std" ] && [ "$mode" != "rt" ]; then
|
||||
echo "ERROR: wrong kernel mode, must be std or rt"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
timestamp=$(date +%F_%H%M)
|
||||
|
||||
echo "---------------- start to make new initrd.img and vmlinuz -------------"
|
||||
ORIG_INITRD=$work_dir/orig/initrd.img
|
||||
if [ ! -f $ORIG_INITRD ];then
|
||||
echo "ERROR: $ORIG_INITRD does NOT exist!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
kernel_rpms_dir=$work_dir/kernel-rpms
|
||||
if [ ! -d $kernel_rpms_dir ];then
|
||||
echo "ERROR: $kernel_rpms_dir does NOT exist!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
initrd_root=$work_dir/initrd.work
|
||||
if [ -d $initrd_root ];then
|
||||
rm -rf $initrd_root
|
||||
fi
|
||||
mkdir -p $initrd_root
|
||||
|
||||
cd $initrd_root
|
||||
# uncompress initrd.img
|
||||
echo "--> uncompress original initrd.img"
|
||||
/usr/bin/xzcat $ORIG_INITRD | cpio -i
|
||||
|
||||
echo "--> clean up $initrd_root"
|
||||
clean_rootfs $initrd_root
|
||||
|
||||
echo "--> extract files from new kernel and its modular rpms to initrd root"
|
||||
for kf in $kernel_rpms_dir/$mode/*.rpm ; do rpm2cpio $kf | cpio -idu; done
|
||||
|
||||
# by now new kernel and its modules exist!
|
||||
# find new kernel in /boot/
|
||||
echo "--> get new kernel image: vmlinuz"
|
||||
new_kernel="$(ls ./boot/vmlinuz-*)"
|
||||
echo $new_kernel
|
||||
if [ -f $new_kernel ];then
|
||||
#copy out the new kernel
|
||||
if [ $mode == "std" ];then
|
||||
if [ -f $output_dir/new-vmlinuz ]; then
|
||||
mv -f $output_dir/new-vmlinuz $output_dir/vmlinuz-bakcup-$timestamp
|
||||
fi
|
||||
cp -f $new_kernel $output_dir/new-vmlinuz
|
||||
else
|
||||
if [ -f $output_dir/new-vmlinuz-rt ]; then
|
||||
mv -f $output_dir/new-vmlinuz-rt $output_dir/vmlinuz-rt-bakcup-$timestamp
|
||||
fi
|
||||
cp -f $new_kernel $output_dir/new-vmlinuz-rt
|
||||
fi
|
||||
kernel_name=$(basename $new_kernel)
|
||||
new_ver=$(echo $kernel_name | cut -d'-' -f2-)
|
||||
echo $new_ver
|
||||
else
|
||||
echo "ERROR: new kernel is NOT found!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo "-->check module dependencies in new initrd.img in chroot context"
|
||||
chroot $initrd_root /bin/bash -x <<EOF
|
||||
/usr/sbin/depmod -aeF "/boot/System.map-$new_ver" "$new_ver"
|
||||
if [ $? == 0 ]; then echo "module dependencies are satisfied!" ; fi
|
||||
## Remove the bisodevname package!
|
||||
rm -f ./usr/lib/udev/rules.d/71-biosdevname.rules ./usr/sbin/biosdevname
|
||||
exit
|
||||
EOF
|
||||
|
||||
echo "--> Rebuild the initrd"
|
||||
if [ -f $output_dir/new-initrd.img ]; then
|
||||
mv -f $output_dir/new-initrd.img $output_dir/initrd.img-bakcup-$timestamp
|
||||
fi
|
||||
find . | cpio -o -H newc | xz --check=crc32 --x86 --lzma2=dict=512KiB > $output_dir/new-initrd.img
|
||||
if [ $? != 0 ];then
|
||||
echo "ERROR: failed to create new initrd.img"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
cd $work_dir
|
||||
|
||||
if [ -f $output_dir/new-initrd.img ];then
|
||||
ls -l $output_dir/new-initrd.img
|
||||
else
|
||||
echo "ERROR: new-initrd.img is not generated!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
if [ -f $output_dir/new-vmlinuz ];then
|
||||
ls -l $output_dir/new-vmlinuz
|
||||
else
|
||||
echo "ERROR: new-vmlinuz is not generated!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo "---------------- start to make new squashfs.img -------------"
|
||||
ORIG_SQUASHFS=$work_dir/orig/squashfs.img
|
||||
if [ ! -f $ORIG_SQUASHFS ];then
|
||||
echo "ERROR: $ORIG_SQUASHFS does NOT exist!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
rootfs_rpms_dir=$work_dir/rootfs-rpms
|
||||
if [ ! -d $rootfs_rpms_dir ];then
|
||||
echo "ERROR: $rootfs_rpms_dir does NOT exist!"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# make squashfs.mnt and ready and umounted
|
||||
if [ ! -d $work_dir/squashfs.mnt ];then
|
||||
mkdir -p $work_dir/squashfs.mnt
|
||||
else
|
||||
# in case it was mounted previously
|
||||
mnt_path=$(mount | grep "squashfs.mnt" | cut -d' ' -f3-3)
|
||||
if [ x"$mnt_path" != "x" ] && [ "$(basename $mnt_path)" == "squashfs.mnt" ];then
|
||||
umount $work_dir/squashfs.mnt
|
||||
fi
|
||||
fi
|
||||
|
||||
# make squashfs.work ready and umounted
|
||||
squashfs_root="$work_dir/squashfs.work"
|
||||
# Now mount the rootfs.img file:
|
||||
if [ ! -d $squashfs_root ];then
|
||||
mkdir -p $squashfs_root
|
||||
else
|
||||
# in case it was mounted previously
|
||||
mnt_path=$(mount | grep "$(basename $squashfs_root)" | cut -d' ' -f3-3)
|
||||
if [ x"$mnt_path" != "x" ] && [ "$(basename $mnt_path)" == "$(basename $squashfs_root)" ];then
|
||||
umount $squashfs_root
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $ORIG_SQUASHFS
|
||||
mount -o loop -t squashfs $ORIG_SQUASHFS $work_dir/squashfs.mnt
|
||||
|
||||
if [ ! -d ./LiveOS ];then mkdir -p ./LiveOS ; fi
|
||||
|
||||
echo "--> copy rootfs.img from original squashfs.img to LiveOS folder"
|
||||
cp -f ./squashfs.mnt/LiveOS/rootfs.img ./LiveOS/.
|
||||
|
||||
echo "--> done to copy rootfs.img, umount squashfs.mnt"
|
||||
umount ./squashfs.mnt
|
||||
|
||||
echo "--> mount rootfs.img into $squashfs_root"
|
||||
mount -o loop LiveOS/rootfs.img $squashfs_root
|
||||
|
||||
echo "--> clean up ./squashfs-rootfs from original squashfs.img in chroot context"
|
||||
clean_rootfs $squashfs_root
|
||||
|
||||
cd $squashfs_root
|
||||
echo "--> extract files from rootfs-rpms to squashfs root"
|
||||
for ff in $rootfs_rpms_dir/*.rpm ; do rpm2cpio $ff | cpio -idu; done
|
||||
|
||||
echo "--> extract files from kernel and its modular rpms to squashfs root"
|
||||
for kf in $kernel_rpms_dir/$mode/*.rpm ; do rpm2cpio $kf | cpio -idu; done
|
||||
|
||||
echo "-->check module dependencies in new squashfs.img in chroot context"
|
||||
#we are using the same new kernel-xxx.rpm, so the $new_ver is the same
|
||||
chroot $squashfs_root /bin/bash -x <<EOF
|
||||
/usr/sbin/depmod -aeF "/boot/System.map-$new_ver" "$new_ver"
|
||||
if [ $? == 0 ]; then echo "module dependencies are satisfied!" ; fi
|
||||
## Remove the bisodevname package!
|
||||
rm -f ./usr/lib/udev/rules.d/71-biosdevname.rules ./usr/sbin/biosdevname
|
||||
exit
|
||||
EOF
|
||||
|
||||
# come back to the original work dir
|
||||
cd $work_dir
|
||||
|
||||
echo "--> unmount $squashfs_root"
|
||||
umount $squashfs_root
|
||||
#rename the old version
|
||||
if [ -f $output_dir/new-squashfs.img ]; then
|
||||
mv -f $output_dir/new-squashfs.img $output_dir/squashfs.img-backup-$timestamp
|
||||
fi
|
||||
|
||||
echo "--> make the new squashfs image"
|
||||
mksquashfs LiveOS $output_dir/new-squashfs.img -keep-as-directory -comp xz -b 1M
|
||||
if [ $? == 0 ];then
|
||||
ls -l $output_dir/new-squashfs.img
|
||||
else
|
||||
echo "ERROR: failed to make a new squashfs.img"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo "--> done successfully!"
|
229
build-tools/mirror_rebase/copy_external_mirror_to_tis_mirror
Normal file
229
build-tools/mirror_rebase/copy_external_mirror_to_tis_mirror
Normal file
@ -0,0 +1,229 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$USER" != "jenkins" ]; then
|
||||
echo "ERROR: only jenkins should run this"
|
||||
return 1
|
||||
fi
|
||||
|
||||
CENTOS_BASE_VERSION=7.2.1511
|
||||
EPEL_BASE_VERSION=7
|
||||
BIN_ARCH=x86_64
|
||||
|
||||
BIN_DIRS="/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/updates/x86_64
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/cloud/x86_64/openstack-mitaka
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/os/x86_64
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/extras/x86_64
|
||||
/export/jenkins/mirrors/fedora/epel/$EPEL_BASE_VERSION/x86_64
|
||||
"
|
||||
SRC_DIRS="/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/updates/Source
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/cloud/Source/openstack-mitaka
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/os/Source
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/extras/Source
|
||||
/export/jenkins/mirrors/fedora/dl.fedoraproject.org/pub/epel/$EPEL_BASE_VERSION/SRPMS
|
||||
"
|
||||
TESTING_BIN_DIRS="/export/jenkins/mirrors/fedora/epel/testing/7/x86_64
|
||||
"
|
||||
TESTING_SRC_DIRS="/export/jenkins/mirrors/dl.fedoraproject.org/pub/epel/testing/7/SRPMS
|
||||
"
|
||||
|
||||
BIN_ARCH=x86_64
|
||||
|
||||
NEW_DIR="/export/jenkins/mirrors/CentOS/tis-r3-CentOS/mitaka"
|
||||
BACKUP_DIR="/export/jenkins/mirrors/CentOS/tis-r3-CentOS/mitaka.old"
|
||||
|
||||
CREATEREPO=$(which createrepo_c)
|
||||
if [ $? -ne 0 ]; then
|
||||
CREATEREPO="createrepo"
|
||||
fi
|
||||
|
||||
if [ -d $BACKUP_DIR ]; then
|
||||
rm -rf $BACKUP_DIR
|
||||
fi
|
||||
cp -r $NEW_DIR $BACKUP_DIR
|
||||
|
||||
BIN_DEST="$NEW_DIR/Binary"
|
||||
SRC_DEST="$NEW_DIR/Source"
|
||||
LOG_DEST="$NEW_DIR/Data"
|
||||
DATA_DEST="$NEW_DIR/Data"
|
||||
|
||||
mkdir -p $BIN_DEST $SRC_DEST $LOG_DEST
|
||||
|
||||
WHITE_LIST_FILE="$DATA_DIR/white_list.txt"
|
||||
BLACK_LIST_FILE="$DATA_DIR/black_list.txt"
|
||||
OBSOLETE_LOG="$LOG_DEST/obsolete.log"
|
||||
NO_SOURCERPM_LOG="$LOG_DEST/no_sourcerpm.log"
|
||||
SOURCERPM_NOT_FOUND_LOG="$LOG_DEST/sourcerpm_not_found.log"
|
||||
BIN_COPY_LOG="$LOG_DEST/bin_copy.log"
|
||||
SRC_COPY_LOG="$LOG_DEST/src_copy.log"
|
||||
NO_INSTALLED_COPY="$LOG_DEST/installed_copy.log"
|
||||
BLACKLISTED_LOG="$LOG_DEST/blacklisted.log"
|
||||
WHITELISTED_LOG="$LOG_DEST/whitelisted.log"
|
||||
|
||||
rm -f $OBSOLETE_LOG $NO_SOURCERPM_LOG $SOURCERPM_NOT_FOUND_LOG $BIN_COPY_LOG $SRC_COPY_LOG $NO_INSTALLED_COPY $BLACKLISTED_LOG $WHITELISTED_LOG
|
||||
|
||||
LAST_INSTALLED_NAME=""
|
||||
LAST_NAME=""
|
||||
NAME=""
|
||||
|
||||
# The following is similar to a find for *.rpm files,
|
||||
# but we transform the path into <name_and_version>#<filename>#<directory_name> .
|
||||
# Then do a reverse 'version' sort, so that the newest version
|
||||
# of the rpm appears first, no matter what directory it originates from.
|
||||
for dat in $((for bd in `echo $BIN_DIRS`; do
|
||||
for br in $(find $bd/ -name '*.rpm' ); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done
|
||||
done) | sort -r -V)
|
||||
do
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
br="$d/$b"
|
||||
echo $br
|
||||
|
||||
MATCH=$(grep "^$b" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $BLACKLISTED_LOG
|
||||
continue
|
||||
fi
|
||||
|
||||
SOURCERPM=$(rpm -q --queryformat='%{SOURCERPM}' -p $br --nosignature)
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
MATCH=$(grep "^$SOURCERPM" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $BLACKLISTED_LOG
|
||||
echo "$SOURCERPM" >> $BLACKLISTED_LOG
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
ARCH=$(rpm -q --queryformat='%{ARCH}' -p $br --nosignature)
|
||||
LAST_NAME="$NAME"
|
||||
NAME=$(rpm -q --queryformat='%{NAME}' -p $br --nosignature)
|
||||
if [ "$NAME" != "$LAST_NAME" ] && [ "$LAST_NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
echo "$LAST_NAME" >> $NO_INSTALLED_COPY
|
||||
fi
|
||||
if [ "$ARCH" == "$BIN_ARCH" ] || [ "$ARCH" == "noarch" ]; then
|
||||
if [ "$NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
bs=$(find $SRC_DIRS -name $SOURCERPM | head -n 1)
|
||||
if [ "x$bs" != "x" ]; then
|
||||
mkdir -p $BIN_DEST/$ARCH
|
||||
if [ ! -f $BIN_DEST/$ARCH/$b ]; then
|
||||
cp -v $br $BIN_DEST/$ARCH/
|
||||
echo "$br" >> $BIN_COPY_LOG
|
||||
fi
|
||||
if [ ! -f $SRC_DEST/$SOURCERPM ]; then
|
||||
cp -v $bs $SRC_DEST/
|
||||
echo "$bs" >> $SRC_COPY_LOG
|
||||
fi
|
||||
LAST_INSTALLED_NAME=$NAME
|
||||
else
|
||||
echo "$SOURCERPM not found"
|
||||
echo "$br" >> $SOURCERPM_NOT_FOUND_LOG
|
||||
fi
|
||||
else
|
||||
echo "no SOURCERPM for $br"
|
||||
echo "$br" >> $NO_SOURCERPM_LOG
|
||||
fi
|
||||
else
|
||||
echo "$br is obsolete"
|
||||
echo "$br" >> $OBSOLETE_LOG
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
for dat in $((for bd in $(echo $BIN_DIRS; echo $TESTING_BIN_DIRS); do
|
||||
for br in $(find $bd/ -name '*.rpm'); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done
|
||||
done) | sort -r -V)
|
||||
do
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
br="$d/$b"
|
||||
echo $br
|
||||
|
||||
MATCH=$(grep "^$b" $WHITE_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $WHITELISTED_LOG
|
||||
else
|
||||
continue
|
||||
fi
|
||||
|
||||
SOURCERPM=$(rpm -q --queryformat='%{SOURCERPM}' -p $br --nosignature)
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
grep "^$SOURCERPM" $WHITE_LIST_FILE >> /dev/null || true
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "$bs" >> $WHITELISTED_LOG
|
||||
echo "$SOURCERPM" >> $WHITELISTED_LOG
|
||||
else
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
ARCH=$(rpm -q --queryformat='%{ARCH}' -p $br --nosignature)
|
||||
LAST_NAME="$NAME"
|
||||
NAME=$(rpm -q --queryformat='%{NAME}' -p $br --nosignature)
|
||||
if [ "$NAME" != "$LAST_NAME" ] && [ "$LAST_NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
echo "$LAST_NAME" >> $NO_INSTALLED_COPY
|
||||
fi
|
||||
if [ "$ARCH" == "$BIN_ARCH" ] || [ "$ARCH" == "noarch" ]; then
|
||||
if [ "$NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
bs=$(find $SRC_DIRS $TESTING_SRC_DIRS -name $SOURCERPM | head -n 1)
|
||||
if [ "x$bs" != "x" ]; then
|
||||
mkdir -p $BIN_DEST/$ARCH
|
||||
if [ ! -f $BIN_DEST/$ARCH/$b ]; then
|
||||
cp -v $br $BIN_DEST/$ARCH/
|
||||
echo "$br" >> $BIN_COPY_LOG
|
||||
fi
|
||||
if [ ! -f $SRC_DEST/$SOURCERPM ]; then
|
||||
cp -v $bs $SRC_DEST/
|
||||
echo "$bs" >> $SRC_COPY_LOG
|
||||
fi
|
||||
LAST_INSTALLED_NAME=$NAME
|
||||
else
|
||||
echo "$SOURCERPM not found"
|
||||
echo "$br" >> $SOURCERPM_NOT_FOUND_LOG
|
||||
fi
|
||||
else
|
||||
echo "no SOURCERPM for $br"
|
||||
echo "$br" >> $NO_SOURCERPM_LOG
|
||||
fi
|
||||
else
|
||||
echo "$br is obsolete"
|
||||
echo "$br" >> $OBSOLETE_LOG
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
repodata_update () {
|
||||
DIR=${1}
|
||||
(
|
||||
cd $DIR
|
||||
for d in `find -L . -type d -name repodata`; do
|
||||
(cd $d/..
|
||||
for c in $(find repodata -name '*comps*xml'); do
|
||||
mv -f $c comps.xml
|
||||
done
|
||||
rm -rf repodata
|
||||
if [ -f comps.xml ]; then
|
||||
$CREATEREPO -g comps.xml --workers $(cat /usr/bin/nproc) $(pwd)
|
||||
else
|
||||
$CREATEREPO --workers $(cat /usr/bin/nproc) $(pwd)
|
||||
fi
|
||||
)
|
||||
done
|
||||
)
|
||||
return 0
|
||||
}
|
||||
|
||||
repodata_update $SRC_DEST
|
||||
repodata_update $BIN_DEST
|
216
build-tools/mirror_rebase/copy_external_mirror_to_tis_mirror.old
Executable file
216
build-tools/mirror_rebase/copy_external_mirror_to_tis_mirror.old
Executable file
@ -0,0 +1,216 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$USER" != "jenkins" ]; then
|
||||
echo "ERROR: only jenkins should run this"
|
||||
return 1
|
||||
fi
|
||||
|
||||
CENTOS_BASE_VERSION=7.2.1511
|
||||
EPEL_BASE_VERSION=7
|
||||
BIN_ARCH=x86_64
|
||||
|
||||
BIN_DIRS="/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/updates/x86_64
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/cloud/x86_64/openstack-mitaka
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/os/x86_64
|
||||
/export/jenkins/mirrors/CentOS/$CENTOS_BASE_VERSION/extras/x86_64
|
||||
/export/jenkins/mirrors/fedora/epel/$EPEL_BASE_VERSION/x86_64
|
||||
"
|
||||
SRC_DIRS="/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/updates/Source
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/cloud/Source/openstack-mitaka
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/os/Source
|
||||
/export/jenkins/mirrors/CentOS/vault.centos.org/$CENTOS_BASE_VERSION/extras/Source
|
||||
/export/jenkins/mirrors/fedora/dl.fedoraproject.org/pub/epel/$EPEL_BASE_VERSION/SRPMS
|
||||
"
|
||||
TESTING_BIN_DIRS="/export/jenkins/mirrors/fedora/epel/testing/7/x86_64
|
||||
"
|
||||
TESTING_SRC_DIRS="/export/jenkins/mirrors/dl.fedoraproject.org/pub/epel/testing/7/SRPMS
|
||||
"
|
||||
|
||||
ORIG_DIR="/export/jenkins/mirrors/CentOS/tis-r3-CentOS/mitaka"
|
||||
NEW_DIR="/export/jenkins/mirrors/CentOS/tis-r3-CentOS/mitaka-2"
|
||||
cp -r $ORIG_DIR $NEW_DIR
|
||||
|
||||
BIN_DEST="$NEW_DIR/Binary"
|
||||
SRC_DEST="$NEW_DIR/Source"
|
||||
LOG_DEST="$NEW_DIR/Data"
|
||||
DATA_DEST="$NEW_DIR/Data"
|
||||
|
||||
rm -rf $LOG_DEST
|
||||
mkdir -p $BIN_DEST $SRC_DEST $LOG_DEST
|
||||
|
||||
WHITE_LIST_FILE="$DATA_DIR/white_list.txt"
|
||||
BLACK_LIST_FILE="$DATA_DIR/black_list.txt"
|
||||
OBSOLETE_LOG="$LOG_DEST/obsolete.log"
|
||||
NO_SOURCERPM_LOG="$LOG_DEST/no_sourcerpm.log"
|
||||
SOURCERPM_NOT_FOUND_LOG="$LOG_DEST/sourcerpm_not_found.log"
|
||||
BIN_COPY_LOG="$LOG_DEST/bin_copy.log"
|
||||
SRC_COPY_LOG="$LOG_DEST/src_copy.log"
|
||||
NO_INSTALLED_COPY="$LOG_DEST/installed_copy.log"
|
||||
BLACKLISTED_LOG="$LOG_DEST/blacklisted.log"
|
||||
WHITELISTED_LOG="$LOG_DEST/whitelisted.log"
|
||||
|
||||
rm -f $OBSOLETE_LOG $NO_SOURCERPM_LOG $SOURCERPM_NOT_FOUND_LOG $BIN_COPY_LOG $SRC_COPY_LOG $NO_INSTALLED_COPY $BLACKLISTED_LOG $WHITELISTED_LOG
|
||||
|
||||
LAST_INSTALLED_NAME=""
|
||||
LAST_NAME=""
|
||||
NAME=""
|
||||
|
||||
# The following is similar to a find for *.rpm files,
|
||||
# but we transform the path into <name_and_version>#<filename>#<directory_name> .
|
||||
# Then do a reverse 'version' sort, so that the newest version
|
||||
# of the rpm appears first, no matter what directory it originates from.
|
||||
for dat in $((for bd in `echo $BIN_DIRS`; do
|
||||
for br in $(find $bd/ -name '*.rpm' ); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done
|
||||
done) | sort -r -V)
|
||||
do
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
br="$d/$b"
|
||||
echo $br
|
||||
|
||||
MATCH=$(grep "^$b" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $BLACKLISTED_LOG
|
||||
continue
|
||||
fi
|
||||
|
||||
SOURCERPM=$(rpm -q --queryformat='%{SOURCERPM}' -p $br --nosignature)
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
MATCH=$(grep "^$SOURCERPM" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $BLACKLISTED_LOG
|
||||
echo "$SOURCERPM" >> $BLACKLISTED_LOG
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
ARCH=$(rpm -q --queryformat='%{ARCH}' -p $br --nosignature)
|
||||
LAST_NAME="$NAME"
|
||||
NAME=$(rpm -q --queryformat='%{NAME}' -p $br --nosignature)
|
||||
if [ "$NAME" != "$LAST_NAME" ] && [ "$LAST_NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
echo "$LAST_NAME" >> $NO_INSTALLED_COPY
|
||||
fi
|
||||
if [ "$ARCH" == "$BIN_ARCH" ] || [ "$ARCH" == "noarch" ]; then
|
||||
if [ "$NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
bs=$(find $SRC_DIRS -name $SOURCERPM | head -n 1)
|
||||
if [ "x$bs" != "x" ]; then
|
||||
mkdir -p $BIN_DEST/$ARCH
|
||||
if [ ! -f $BIN_DEST/$ARCH/$b ]; then
|
||||
cp -v $br $BIN_DEST/$ARCH/
|
||||
echo "$br" >> $BIN_COPY_LOG
|
||||
fi
|
||||
if [ ! -f $SRC_DEST/$SOURCERPM ]; then
|
||||
cp -v $bs $SRC_DEST/
|
||||
echo "$bs" >> $SRC_COPY_LOG
|
||||
fi
|
||||
LAST_INSTALLED_NAME=$NAME
|
||||
else
|
||||
echo "$SOURCERPM not found"
|
||||
echo "$br" >> $SOURCERPM_NOT_FOUND_LOG
|
||||
fi
|
||||
else
|
||||
echo "no SOURCERPM for $br"
|
||||
echo "$br" >> $NO_SOURCERPM_LOG
|
||||
fi
|
||||
else
|
||||
echo "$br is obsolete"
|
||||
echo "$br" >> $OBSOLETE_LOG
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
for dat in $((for bd in $(echo $BIN_DIRS; echo $TESTING_BIN_DIRS); do
|
||||
for br in $(find $bd/ -name '*.rpm'); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done
|
||||
done) | sort -r -V)
|
||||
do
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
br="$d/$b"
|
||||
echo $br
|
||||
|
||||
MATCH=$(grep "^$b" $WHITE_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "$bs" >> $WHITELISTED_LOG
|
||||
else
|
||||
continue
|
||||
fi
|
||||
|
||||
SOURCERPM=$(rpm -q --queryformat='%{SOURCERPM}' -p $br --nosignature)
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
grep "^$SOURCERPM" $WHITE_LIST_FILE >> /dev/null || true
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "$bs" >> $WHITELISTED_LOG
|
||||
echo "$SOURCERPM" >> $WHITELISTED_LOG
|
||||
else
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
ARCH=$(rpm -q --queryformat='%{ARCH}' -p $br --nosignature)
|
||||
LAST_NAME="$NAME"
|
||||
NAME=$(rpm -q --queryformat='%{NAME}' -p $br --nosignature)
|
||||
if [ "$NAME" != "$LAST_NAME" ] && [ "$LAST_NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
echo "$LAST_NAME" >> $NO_INSTALLED_COPY
|
||||
fi
|
||||
if [ "$ARCH" == "$BIN_ARCH" ] || [ "$ARCH" == "noarch" ]; then
|
||||
if [ "$NAME" != "$LAST_INSTALLED_NAME" ]; then
|
||||
if [ "x$SOURCERPM" != "x" ]; then
|
||||
bs=$(find $SRC_DIRS $TESTING_SRC_DIRS -name $SOURCERPM | head -n 1)
|
||||
if [ "x$bs" != "x" ]; then
|
||||
mkdir -p $BIN_DEST/$ARCH
|
||||
if [ ! -f $BIN_DEST/$ARCH/$b ]; then
|
||||
cp -v $br $BIN_DEST/$ARCH/
|
||||
echo "$br" >> $BIN_COPY_LOG
|
||||
fi
|
||||
if [ ! -f $SRC_DEST/$SOURCERPM ]; then
|
||||
cp -v $bs $SRC_DEST/
|
||||
echo "$bs" >> $SRC_COPY_LOG
|
||||
fi
|
||||
LAST_INSTALLED_NAME=$NAME
|
||||
else
|
||||
echo "$SOURCERPM not found"
|
||||
echo "$br" >> $SOURCERPM_NOT_FOUND_LOG
|
||||
fi
|
||||
else
|
||||
echo "no SOURCERPM for $br"
|
||||
echo "$br" >> $NO_SOURCERPM_LOG
|
||||
fi
|
||||
else
|
||||
echo "$br is obsolete"
|
||||
echo "$br" >> $OBSOLETE_LOG
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
TMP_DIR=$(mktemp -d /tmp/copy_external_mirror_to_tis_mirror_XXXXXX)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to create temporary directory"
|
||||
return 1
|
||||
fi
|
||||
|
||||
(cd $ORIG_DIR; find . | sort -V > $TMP_DIR/pre)
|
||||
(cd $NEW_DIR; find . | sort -V > $TMP_DIR/post)
|
||||
echo "Listing deletions"
|
||||
diff $TMP_DIR/pre $TMP_DIR/post | grep -v '^< ./Data/' | grep '^<'
|
||||
if [ $? -eq 0 ]; then
|
||||
echo
|
||||
echo "Cowardly refusing to alter $ORIG_DIR due to deletions: please see $NEW_DIR"
|
||||
return 1
|
||||
fi
|
||||
|
||||
mv -f $ORIG_DIR $ORIG_DIR.old
|
||||
mv -f $NEW_DIR $ORIG_DIR
|
||||
rm -rf $TMP_DIR
|
||||
return 0
|
225
build-tools/mirror_rebase/link_cgcs_centos_repo
Executable file
225
build-tools/mirror_rebase/link_cgcs_centos_repo
Executable file
@ -0,0 +1,225 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# This step updates Binary links, and adds Source links
|
||||
#
|
||||
|
||||
MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
BIN_ROOT=$MIRROR_ROOT/Binary
|
||||
SRC_ROOT=$MIRROR_ROOT/Source
|
||||
BLACK_LIST_FILE=$MIRROR_ROOT/Data/black_list.txt
|
||||
WHITE_LIST_FILE=$MIRROR_ROOT/Data/white_list.txt
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 'ERROR: failed to cd to $MY_REPO/cgcs-centos-repo'
|
||||
return 1
|
||||
fi
|
||||
|
||||
names=' '
|
||||
snames=' '
|
||||
|
||||
do_work () {
|
||||
dat=${1}
|
||||
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
r="$d/$b"
|
||||
|
||||
DEBUG_INFO=0
|
||||
MATCH=$(echo $b | grep '[-]debuginfo-')
|
||||
if [ "$MATCH" != "" ]; then
|
||||
DEBUG_INFO=1
|
||||
fi
|
||||
|
||||
MATCH=$(grep "^$b" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "NOTE: '$b' is black listed"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ $DEBUG_INFO -eq 1 ]; then
|
||||
sb=$(rpm -q --info --nosignature -p $r | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
if [ "x$sb" == "x" ]; then
|
||||
echo "ERROR: no source rpm listed for '$b'"
|
||||
continue
|
||||
fi
|
||||
s=$(find Source -name "$sb")
|
||||
if [ "x$s" == "x" ]; then
|
||||
echo "NOTE: no source rpm '$sb' found for '$b'"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
name=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $r)
|
||||
|
||||
MATCH=$(grep "^$b" $WHITE_LIST_FILE || true)
|
||||
if [ "$MATCH" == "" ]; then
|
||||
# Not white listed, check for python2 alternative
|
||||
# python-rpm-macros-3-6.1 is a notable case white_list case...
|
||||
# We need BOTH python-rpm-macros-3-6.1 and python2-rpm-macros-3-6.1
|
||||
# so substituting python-rpm-macros-3-6.1 with python2-rpm-macros-3-6.1 is an error
|
||||
|
||||
altname=$(echo $name | sed 's#^python-#python2-#')
|
||||
if [ "$altname" != "$name" ]; then
|
||||
# look for python2 alternative
|
||||
sb=$(rpm -q --info --nosignature -p $r | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
|
||||
if [ "x$sb" != "x" ]; then
|
||||
MATCH=$(grep "^$sb" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "NOTE: '$sb' is black listed, so '$b' is ignored"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
for dat2 in $(for br in $(find $BIN_ROOT -name "$altname-*.rpm" | grep -v '.src.rpm$' | grep -v '[-]debuginfo-'); do
|
||||
ddd=$(dirname $br)
|
||||
bbb=$(basename $br)
|
||||
sss=$(echo $bbb | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$sss#$bbb#$ddd"
|
||||
done | sort -r -V)
|
||||
do
|
||||
b2=$(echo "$dat2" | awk -F '#' '{ print $2 }')
|
||||
d2=$(echo "$dat2" | awk -F '#' '{ print $3 }')
|
||||
r2="$d2/$b2"
|
||||
name2=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $r2)
|
||||
if [ "$name2" != "$altname" ]; then
|
||||
continue
|
||||
fi
|
||||
sb2=$(rpm -q --info --nosignature -p $r2 | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
# if [ "$sb" == "$sb2" ]; then
|
||||
# continue
|
||||
# fi
|
||||
|
||||
sbs=$(echo $sb | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
sbs2=$(echo $sb2 | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
newer=$((echo $sbs; echo $sbs2) | sort -r -V | head -n 1)
|
||||
if [ "$sbs" != "$sbs2" ]; then
|
||||
if [ "$newer" == "$sbs2" ]; then
|
||||
# swap alternate for original
|
||||
for link in $(find Binary -name $b); do
|
||||
echo "SUGGEST: rm $link"
|
||||
git rm -f $link
|
||||
done
|
||||
|
||||
r=$r2
|
||||
name=$name2
|
||||
b=$b2
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "$names" | grep " $name " >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
sb=$(rpm -q --info --nosignature -p $r | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
if [ "x$sb" == "x" ]; then
|
||||
echo "ERROR: no source rpm listed for '$b'"
|
||||
continue
|
||||
fi
|
||||
s=$(find $SRC_ROOT -name "$sb")
|
||||
if [ "x$s" == "x" ]; then
|
||||
echo "ERROR: no source rpm '$sb' found for '$b'"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "x$sb" != "x" ]; then
|
||||
MATCH=$(grep "^$sb" $BLACK_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
echo "NOTE: '$sb' is black listed, so '$b' is ignored"
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
sname=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $s)
|
||||
|
||||
lb=$(find Binary -name "$b")
|
||||
if [ "x$lb" == "x" ]; then
|
||||
echo "MISSING: '$b'"
|
||||
link=$(echo $r | sed "s#^$MIRROR_ROOT/##")
|
||||
echo "SUGGEST: ln -s $r $link"
|
||||
ln -s $r $link
|
||||
git add $link
|
||||
else
|
||||
echo "OK: '$b'"
|
||||
fi
|
||||
|
||||
for r2 in $(find Binary -name "$name-*.rpm"); do
|
||||
b2=$(basename $r2)
|
||||
if [ "$b" != "$b2" ]; then
|
||||
name2=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $r2)
|
||||
if [ "$name" == "$name2" ]; then
|
||||
MATCH=$(grep "^$b2" $WHITE_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
link=$(echo $r2 | sed "s#^$MIRROR_ROOT/##")
|
||||
echo "SUGGEST: rm $link"
|
||||
git rm -f $link
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $DEBUG_INFO -eq 0 ]; then
|
||||
# Not a debuginfo therefore we can pull in new src.rpm
|
||||
names="${names}${name} "
|
||||
lsb=$(find Source -name "$sb")
|
||||
if [ "x$lsb" == "x" ]; then
|
||||
echo "MISSING: '$sb'"
|
||||
link=$(echo $s | sed "s#^$MIRROR_ROOT/##")
|
||||
echo "SUGGEST: ln -s $s $link"
|
||||
ln -s $s $link
|
||||
git add $link
|
||||
else
|
||||
echo "OK: '$sb'"
|
||||
fi
|
||||
|
||||
echo "$names" | grep " $name " >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
for s2 in $(find Source -name "$sname-*.rpm"); do
|
||||
sb2=$(basename $s2)
|
||||
if [ "$sb" != "$sb2" ]; then
|
||||
sname2=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $s2)
|
||||
if [ "$sname" == "$sname2" ]; then
|
||||
MATCH=$(grep "^$sb2" $WHITE_LIST_FILE || true)
|
||||
if [ "$MATCH" != "" ]; then
|
||||
link=$(echo $s2 | sed "s#^$MIRROR_ROOT/##")
|
||||
echo "SUGGEST: rm $link"
|
||||
git rm -f $link
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
snames="${snames}${sname} "
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
for dat in $(for br in $(find $BIN_ROOT -name '*.rpm' | grep -v '.src.rpm$' | grep -v '[-]debuginfo-'); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done | sort -r -V)
|
||||
do
|
||||
do_work ${dat}
|
||||
done
|
||||
|
||||
for dat in $(for br in $(find $BIN_ROOT -name '*.rpm' | grep -v '.src.rpm$' | grep '[-]debuginfo-'); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done | sort -r -V)
|
||||
do
|
||||
do_work ${dat}
|
||||
done
|
82
build-tools/mirror_rebase/link_cgcs_centos_repo_2
Executable file
82
build-tools/mirror_rebase/link_cgcs_centos_repo_2
Executable file
@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# This step removes obsolete or broken Source links
|
||||
#
|
||||
|
||||
MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
BIN_ROOT=$MIRROR_ROOT/Binary
|
||||
SRC_ROOT=$MIRROR_ROOT/Source
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 'ERROR: failed to cd to $MY_REPO/cgcs-centos-repo'
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
# Clean broken and obsolete srpm links
|
||||
snames=" "
|
||||
for dat in $(for br in $(find Source -name '*.src.rpm'); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done | sort -r -V)
|
||||
do
|
||||
sb=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
s="$d/$sb"
|
||||
|
||||
if [ ! -f $s ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
link=$(readlink $s)
|
||||
if [ ! -f $link ]; then
|
||||
echo "ERROR: '$sb' link to non-existant file '$link'"
|
||||
echo "SUGGEST: rm $s"
|
||||
git rm -f $s
|
||||
continue
|
||||
fi
|
||||
|
||||
echo $link | grep "$MIRROR_ROOT" >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: '$sb' links to unexpected file '$link'"
|
||||
echo "SUGGEST: rm $s"
|
||||
git rm -f $s
|
||||
continue
|
||||
fi
|
||||
|
||||
sname=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $s)
|
||||
echo "$snames" | grep " $sname " >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
if [ "x$sname" != "x" ]; then
|
||||
for s2 in $(find Source -name "$sname-*.src.rpm"); do
|
||||
sb2=$(basename $s2)
|
||||
if [ "$sb" != "$sb2" ]; then
|
||||
sname2=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $s2)
|
||||
if [ "$sname" == "$sname2" ]; then
|
||||
link=$(echo $s2 | sed "s#^$MIRROR_ROOT/##")
|
||||
echo "SUGGEST: rm $link, due to $sb"
|
||||
git rm -f $link
|
||||
|
||||
for r3 in $(find Binary -name "$sname-*.rpm"); do
|
||||
sb3=$(rpm -q --info --nosignature -p $r3 | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
if [ "$sb3" == "$sb2" ]; then
|
||||
echo "SUGGEST: rm $r3, due to $sb2"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
snames="${snames}${sname} "
|
||||
fi
|
||||
done
|
||||
|
40
build-tools/mirror_rebase/link_cgcs_centos_repo_3
Executable file
40
build-tools/mirror_rebase/link_cgcs_centos_repo_3
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# This step removes broken Binary links
|
||||
#
|
||||
|
||||
MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 'ERROR: failed to cd to $MY_REPO/cgcs-centos-repo'
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Clean broken rpm links
|
||||
for r in $(find Binary -name '*.rpm' | grep -v '.src.rpm$' | sort -r -V); do
|
||||
b=$(basename $r)
|
||||
|
||||
link=$(readlink $r)
|
||||
if [ ! -f $link ]; then
|
||||
echo "ERROR: '$b' link to non-existant file '$link'"
|
||||
echo "SUGGEST: rm $r"
|
||||
git rm -f $r
|
||||
continue
|
||||
fi
|
||||
|
||||
echo $link | grep "$MIRROR_ROOT" >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: '$b' links to unexpected file '$link'"
|
||||
echo "SUGGEST: rm $r"
|
||||
git rm -f $r
|
||||
continue
|
||||
fi
|
||||
done
|
||||
|
176
build-tools/mirror_rebase/link_cgcs_centos_repo_4
Executable file
176
build-tools/mirror_rebase/link_cgcs_centos_repo_4
Executable file
@ -0,0 +1,176 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# This step removes obsolete Binary links
|
||||
#
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
BIN_ROOT=$MIRROR_ROOT/Binary
|
||||
SRC_ROOT=$MIRROR_ROOT/Source
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 'ERROR: failed to cd to $MY_REPO/cgcs-centos-repo'
|
||||
return 1
|
||||
fi
|
||||
|
||||
for dat in $(for br in $(find Binary -name '*.rpm' | grep -v '.src.rpm$' ); do
|
||||
d=$(dirname $br)
|
||||
b=$(basename $br)
|
||||
s=$(echo $b | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$s#$b#$d"
|
||||
done | sort -r -V)
|
||||
do
|
||||
b=$(echo "$dat" | awk -F '#' '{ print $2 }')
|
||||
d=$(echo "$dat" | awk -F '#' '{ print $3 }')
|
||||
r="$d/$b"
|
||||
name=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $r)
|
||||
|
||||
link=$(readlink $r)
|
||||
sb=$(rpm -q --info --nosignature -p $r | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
if [ "x$sb" == "x" ]; then
|
||||
echo "ERROR: no source rpm listed for '$b'"
|
||||
continue
|
||||
fi
|
||||
s=$(find Source -name "$sb")
|
||||
if [ "x$s" == "x" ]; then
|
||||
DELETED=0
|
||||
altname=$(echo $name | sed 's#^python-#python2-#')
|
||||
if [ "$altname" != "$name" ]; then
|
||||
# look for python2 alternative
|
||||
|
||||
for dat2 in $(for br in $(find $BIN_ROOT -name "$altname-*.rpm" | grep -v '.src.rpm$' | grep -v '[-]debuginfo-'); do
|
||||
ddd=$(dirname $br)
|
||||
bbb=$(basename $br)
|
||||
sss=$(echo $bbb | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
echo "$sss#$bbb#$ddd"
|
||||
done | sort -r -V)
|
||||
do
|
||||
b2=$(echo "$dat2" | awk -F '#' '{ print $2 }')
|
||||
d2=$(echo "$dat2" | awk -F '#' '{ print $3 }')
|
||||
r2="$d2/$b2"
|
||||
|
||||
name2=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $r2)
|
||||
if [ "$name2" != "$altname" ]; then
|
||||
continue
|
||||
fi
|
||||
sb2=$(rpm -q --info --nosignature -p $r2 | grep '^Source RPM : ' | sed 's#^Source RPM : ##')
|
||||
if [ "$sb" == "$sb2" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
sbs=$(echo $sb | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
sbs2=$(echo $sb2 | sed -e 's#.centos.#.#' -e 's#.el7.#.#' -e 's#.el7_##' -e 's#.rpm$##' -e 's#.src$##' -e 's#.noarch$##' -e 's#.x86_64$##')
|
||||
newer=$((echo $sbs; echo $sbs2) | sort -r -V | head -n 1)
|
||||
if [ "$sbs" != "$sbs2" ]; then
|
||||
if [ "$newer" == "$sbs2" ]; then
|
||||
# swap alternate for original
|
||||
echo "SUGGEST: rm $r"
|
||||
git rm -f $r
|
||||
|
||||
DELETED=1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $DELETED -eq 0 ]; then
|
||||
echo "ERROR: no source rpm '$sb' found for '$b'"
|
||||
echo "SUGGEST: rm $r"
|
||||
git rm -f $r
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
#
|
||||
# The following would delete all binary rpms that Titanium Cloud would otherwise compile.
|
||||
# However for bootstrapping the build there are some packages that we must have...
|
||||
# e.g. bash, kernel-headers, ....
|
||||
# So we will need something smarter than to just delete everything.
|
||||
#
|
||||
# TMP_DIR=$(mktemp -d /tmp/link_cgcs_centos_repo_XXXXXX)
|
||||
#
|
||||
# BUILT_SRPMS_FILE=$TMP_DIR/built_srpms_file
|
||||
#
|
||||
# for r in $(for c in $(find $MY_REPO -type d -name centos); do
|
||||
# for sp in $(find $c -name srpm_path); do
|
||||
# echo "$sp: $(cat $sp)"
|
||||
# done
|
||||
# done | grep 'mirror:' | awk -F ' ' '{ print $2 }') ; do
|
||||
# b=$(basename $r)
|
||||
# s=$(find $MY_REPO/cgcs-centos-repo/Source/ -name $b)
|
||||
# n=$(rpm -q --qf '%{NAME}' --nosignature -p $s)
|
||||
# echo "$n:$b" >> $BUILT_SRPMS_FILE
|
||||
# done
|
||||
#
|
||||
# cd $MY_REPO/cgcs-centos-repo
|
||||
#
|
||||
# for r in $(find Binary -name '*.rpm'); do
|
||||
# b=$(basename $r)
|
||||
# sb=$(rpm -q --info --nosignature -p $r | grep '^Source RPM :' | sed 's#^Source RPM : ##')
|
||||
# if [ "x$sb" != "x" ]; then
|
||||
# s=$(find Source/ -name $sb)
|
||||
# if [ "x$s" != "x" ]; then
|
||||
# n=$(rpm -q --qf '%{NAME}' --nosignature -p $s)
|
||||
# grep "^$n:" $BUILT_SRPMS_FILE
|
||||
# if [ $? -eq 0 ]; then
|
||||
# git rm -f $r
|
||||
# fi
|
||||
# fi
|
||||
# fi
|
||||
# done
|
||||
#
|
||||
# \rm $BUILT_SRPMS_FILE
|
||||
# rmdir $TMP_DIR
|
||||
|
||||
TMP_DIR=$(mktemp -d /tmp/link_cgcs_centos_repo_XXXXXX)
|
||||
EXCLUDE_LIST=$TMP_DIR/exclude_list
|
||||
|
||||
# List od packages we compile from scratch, not from centos srpm, goes to $EXCLUDE_LIST
|
||||
for g in $(find $MY_REPO -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
for cpd in $(find $d -maxdepth 1 -name 'centos_pkg_dir*'); do
|
||||
(
|
||||
cd $d
|
||||
for pd in $(cat $cpd); do
|
||||
(
|
||||
cd $pd/centos
|
||||
if [ -f srpm_path ]; then
|
||||
continue
|
||||
fi
|
||||
for spec in $(find . -name '*.spec'); do
|
||||
n=$(spec_find_tag 'name' $spec '/tmp/' '0' 2> /dev/null)
|
||||
echo "$spec: $n"
|
||||
echo $n >> $EXCLUDE_LIST
|
||||
done
|
||||
)
|
||||
done
|
||||
)
|
||||
done
|
||||
done
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
for r in $(find Binary -name '*.rpm'); do
|
||||
s=$(rpm -q --info --nosignature -p $r | grep '^Source RPM' | sed 's#^Source RPM ..##')
|
||||
n=$(rpm -q --nosignature --qf '%{NAME}' -p $(find Source -name $s) )
|
||||
grep "^$n$" $EXCLUDE_LIST
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "rm $r"
|
||||
git rm $r
|
||||
fi
|
||||
done
|
||||
|
||||
\rm -r $TMP_DIR
|
||||
|
||||
echo "REMINDER: inspect changes in $MY_REPO/cgcs-centos-repo and commit with ..."
|
||||
echo ' TIMESTAMP=$(date +"%Y-%m-%d")'
|
||||
echo ' git commit -m "JENKINS: repo update $TIMESTAMP"'
|
||||
|
||||
|
94
build-tools/mirror_rebase/link_cgcs_centos_repo_5
Executable file
94
build-tools/mirror_rebase/link_cgcs_centos_repo_5
Executable file
@ -0,0 +1,94 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# Search for tis patched centos src.rpm's that have been upversioned
|
||||
#
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
# OLD_MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/mitaka
|
||||
OLD_MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
# MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
OLD_THIRD_MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/tis-r4-3rd-Party
|
||||
# THIRD_MIRROR_ROOT=/import/mirrors/CentOS/tis-r5-CentOS/tis-r4-3rd-Party
|
||||
# BIN_ROOT=$MIRROR_ROOT/Binary
|
||||
# SRC_ROOT=$MIRROR_ROOT/Source
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
|
||||
REPO_DOWNLOADS_ROOT="$MY_REPO"
|
||||
NEW_MIRROR_ROOT="$MY_REPO/cgcs-centos-repo"
|
||||
THIRD_PARTY_ROOT="$MY_REPO/cgcs-3rd-party-repo"
|
||||
|
||||
|
||||
if [ -f $UPVERSION_LOG ]; then
|
||||
rm -f $UPVERSION_LOG
|
||||
fi
|
||||
|
||||
cd $MY_REPO
|
||||
|
||||
for g in $(find $MY_REPO -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
for pf in $(find $d -maxdepth 1 -name 'centos_pkg_dirs*'); do
|
||||
if [ -f $pf ]; then
|
||||
for p in $(cat $pf); do
|
||||
pkg_dir="$d/$p"
|
||||
sf="$pkg_dir/centos/srpm_path"
|
||||
if [ -f $sf ]; then
|
||||
for s in $(grep '^[^#]' $sf); do
|
||||
ORIG_SRPM_PATH=""
|
||||
# absolute path source rpms
|
||||
echo "$s" | grep "^/" >/dev/null && ORIG_SRPM_PATH=$s
|
||||
|
||||
if [ "${ORIG_SRPM_PATH}x" == "x" ]; then
|
||||
# handle repo: definitions
|
||||
echo "$s" | grep "^repo:" >/dev/null && ORIG_SRPM_PATH=$(echo $s | sed "s%^repo:%$REPO_DOWNLOADS_ROOT/%")
|
||||
fi
|
||||
|
||||
if [ "${ORIG_SRPM_PATH}x" == "x" ]; then
|
||||
# handle 3rd_party: definitions
|
||||
echo "$s" | grep "^3rd_party:" >/dev/null && ORIG_SRPM_PATH=$(echo $s | sed "s%^3rd_party:%$THIRD_PARTY_ROOT/%")
|
||||
fi
|
||||
|
||||
if [ "${ORIG_SRPM_PATH}x" == "x" ]; then
|
||||
# handle mirror: definitions
|
||||
# SAL TEMPORARY echo "$s" | grep "^mirror:" >/dev/null && ORIG_SRPM_PATH=`echo $s | sed "s%^mirror:%$MIRROR_ROOT/%"`
|
||||
echo "$s" | grep "^mirror:" >/dev/null && ORIG_SRPM_PATH=$(echo $s | sed "s%^mirror:%$NEW_MIRROR_ROOT/%" | sed "s#CentOS/tis-r4-CentOS/kilo/##" | sed "s#CentOS/tis-r4-CentOS/mitaka/##" | sed "s#CentOS/tis-r4-CentOS/newton/##")
|
||||
fi
|
||||
|
||||
if [ "${ORIG_SRPM_PATH}x" == "x" ]; then
|
||||
# we haven't found a valid prefix yet, so assume it's a legacy
|
||||
# file (mirror: interpretation)
|
||||
ORIG_SRPM_PATH="$NEW_MIRROR_ROOT/$s"
|
||||
fi
|
||||
|
||||
if [ ! -f $ORIG_SRPM_PATH ]; then
|
||||
b=$(basename "$ORIG_SRPM_PATH")
|
||||
old_srpm=$(find $OLD_MIRROR_ROOT $OLD_THIRD_MIRROR_ROOT -name $b | head -n 1)
|
||||
old_name=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $old_srpm)
|
||||
if [ "$old_name" == "" ]; then
|
||||
echo "FAILED to find name for '$b', ORIG_SRPM_PATH='$ORIG_SRPM_PATH'"
|
||||
exit 1
|
||||
fi
|
||||
NEW_SRPM_PATH=""
|
||||
for new_srpm in $(find $NEW_MIRROR_ROOT/Source $THIRD_PARTY_ROOT/Source -name "$old_name-[0-9]*.src.rpm"); do
|
||||
new_name=$(rpm -q --nosignature --queryformat '%{NAME}\n' -p $new_srpm)
|
||||
if [ "$new_name" == "$old_name" ]; then
|
||||
NEW_SRPM_PATH=$new_srpm
|
||||
break
|
||||
fi
|
||||
done
|
||||
nb=$(basename $NEW_SRPM_PATH)
|
||||
echo "FIX: '$sf' : '$b' -> '$nb'"
|
||||
echo "$old_name#$sf#$s#$b#$nb" >> $UPVERSION_LOG
|
||||
fi
|
||||
|
||||
done
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
91
build-tools/mirror_rebase/link_cgcs_centos_repo_6
Executable file
91
build-tools/mirror_rebase/link_cgcs_centos_repo_6
Executable file
@ -0,0 +1,91 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# start an edit session for packages to be upgraded - pre upgrade version
|
||||
#
|
||||
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
if [ "x$WORKING_BRANCH" == "x" ]; then
|
||||
WORKING_BRANCH=CGCS_DEV_0029_rebase_7_4
|
||||
fi
|
||||
|
||||
if [ ! -f $UPVERSION_LOG ]; then
|
||||
echo "ERROR: Can't find UPVERSION_LOG at '$UPVERSION_LOG'"
|
||||
fi
|
||||
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO/cgcs-3rd-party-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$(pwd)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout HEAD^
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$(pwd)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout HEAD^
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
|
||||
if [ "$name" == "kernel" ]; then
|
||||
build-pkgs --std --edit --clean $name
|
||||
elif [ "$name" == "kernel-rt" ]; then
|
||||
build-pkgs --rt --edit --clean $name
|
||||
else
|
||||
build-pkgs --edit --clean $name
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit --clean $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
|
||||
if [ "$name" == "kernel" ]; then
|
||||
build-pkgs --std --edit $name
|
||||
elif [ "$name" == "kernel-rt" ]; then
|
||||
build-pkgs --rt --edit $name
|
||||
else
|
||||
build-pkgs --edit $name
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<="
|
||||
done
|
||||
|
||||
cd $MY_REPO/cgcs-3rd-party-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed build-pkgs --edit for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
84
build-tools/mirror_rebase/link_cgcs_centos_repo_7
Executable file
84
build-tools/mirror_rebase/link_cgcs_centos_repo_7
Executable file
@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# Update srpm_path for packages to be upgraded
|
||||
#
|
||||
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
if [ "x$ORIGIN_BRANCH" == "x" ]; then
|
||||
ORIGIN_BRANCH=CGCS_DEV_0029
|
||||
fi
|
||||
if [ "x$WORKING_BRANCH" == "x" ]; then
|
||||
WORKING_BRANCH=CGCS_DEV_0029_rebase_7_4
|
||||
fi
|
||||
|
||||
if [ ! -f $UPVERSION_LOG ]; then
|
||||
echo "ERROR: Can't find UPVERSION_LOG at '$UPVERSION_LOG'"
|
||||
fi
|
||||
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO
|
||||
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
(
|
||||
cd $(dirname $srpm_path)
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [ "$CURRENT_BRANCH" != "$WORKING_BRANCH" ]; then
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
git checkout $ORIGIN_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$ORIGIN_BRANCH' in directory '$(pwd)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout -b $WORKING_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to 'git checkout -b $WORKING_BRANCH' from '$(pwd)'"
|
||||
exit 1
|
||||
else
|
||||
echo "created branch '$WORKING_BRANCH' at '$(pwd)'"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
sed -i "s#$old_src_rpm#$new_src_rpm#" $srpm_path
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: sed failed '$old_src_rpm' -> '$new_src_rpm'"
|
||||
exit 1
|
||||
else
|
||||
echo "updated $srpm_path: '$old_src_rpm' -> '$new_src_rpm'"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed while working on package '$name' at '$srpm_path'"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
for d in $(for dat in $(cat $UPVERSION_LOG); do srpm_path=$(echo $dat | awk -F '#' '{print $2}'); ( cd $(dirname $srpm_path); git rev-parse --show-toplevel ); done | sort --unique); do
|
||||
(
|
||||
cd $d
|
||||
echo "cd $d"
|
||||
for f in $(git status --porcelain | grep 'srpm_path$' | awk '{print $2}'); do
|
||||
echo "git add $f";
|
||||
done
|
||||
echo "git commit -m 'srpm_path updates for centos rebase'"
|
||||
)
|
||||
done
|
||||
echo ""
|
65
build-tools/mirror_rebase/link_cgcs_centos_repo_8
Executable file
65
build-tools/mirror_rebase/link_cgcs_centos_repo_8
Executable file
@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# Start an edit session for packages to be upgraded - post upgrade version
|
||||
#
|
||||
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
if [ "x$WORKING_BRANCH" == "x" ]; then
|
||||
WORKING_BRANCH=CGCS_DEV_0029_rebase_7_4
|
||||
fi
|
||||
|
||||
if [ ! -f $UPVERSION_LOG ]; then
|
||||
echo "ERROR: Can't find UPVERSION_LOG at '$UPVERSION_LOG'"
|
||||
fi
|
||||
|
||||
|
||||
# Restore new symlinks
|
||||
cd $MY_REPO/cgcs-3rd-party-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-3rd-party-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-centos-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
|
||||
if [ "$name" == "kernel" ]; then
|
||||
build-pkgs --std --edit $name --no-meta-patch
|
||||
elif [ "$name" == "kernel-rt" ]; then
|
||||
build-pkgs --rt --edit $name --no-meta-patch
|
||||
else
|
||||
build-pkgs --edit $name --no-meta-patch
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<="
|
||||
done
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed build-pkgs --edit for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
346
build-tools/mirror_rebase/link_cgcs_centos_repo_9
Executable file
346
build-tools/mirror_rebase/link_cgcs_centos_repo_9
Executable file
@ -0,0 +1,346 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r5-CentOS/newton
|
||||
#
|
||||
# Search for tis patched centos src.rpm's that have been upversioned
|
||||
#
|
||||
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
if [ "x$WORKING_BRANCH" == "x" ]; then
|
||||
WORKING_BRANCH=CGCS_DEV_0029_rebase_7_4
|
||||
fi
|
||||
|
||||
if [ ! -f $UPVERSION_LOG ]; then
|
||||
echo "ERROR: Can't find UPVERSION_LOG at '$UPVERSION_LOG'"
|
||||
fi
|
||||
|
||||
if [ "$DISPLAY" == "" ]; then
|
||||
echo "ERROR: X-Windows 'DISPLAY' variable not set. This script needs to open pop-up windows."
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# restore new symlinks
|
||||
cd $MY_REPO/cgcs-3rd-party-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-3rd-party-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-centos-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILED=""
|
||||
build_types="std rt"
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
(
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
PKG_DIR=$(dirname $(dirname $srpm_path))
|
||||
OLD_BRANCH=$(echo $old_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
NEW_BRANCH=$(echo $new_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
|
||||
WORK_META_DIR=""
|
||||
for dd in $build_types; do
|
||||
WORK_META_DIR=$MY_WORKSPACE/$dd/srpm_work/$name/rpmbuild
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
if [ -d $WORK_META_DIR ]; then
|
||||
break;
|
||||
else
|
||||
WORK_META_DIR=""
|
||||
fi
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# WORK_SRC_DIR=$(dirname $(find $MY_WORKSPACE/srpm_work/$name/gits/ -type d -name .git))
|
||||
NEW_WORK_SRC_DIR=""
|
||||
OLD_WORK_SRC_DIR=""
|
||||
for dd in $build_types; do
|
||||
for g in $(find $MY_WORKSPACE/$dd/srpm_work/$name/gits/ -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
if [ -d $d ]; then
|
||||
cd $d;
|
||||
git tag | grep pre_wrs_ >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
git checkout $OLD_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
OLD_WORK_SRC_DIR=$d
|
||||
fi
|
||||
git checkout $NEW_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
NEW_WORK_SRC_DIR=$d
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
echo "PKG_DIR=$PKG_DIR"
|
||||
echo "OLD_BRANCH=$OLD_BRANCH"
|
||||
echo "NEW_BRANCH=$NEW_BRANCH"
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
echo "OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
echo "NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
echo ""
|
||||
|
||||
(
|
||||
cd $WORK_META_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to WORK_META_DIR=$WORK_META_DIR"
|
||||
exit 1
|
||||
fi
|
||||
echo "--- old meta git log (oldest to newest) ---"
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit ; echo "") | sed '/^$/d' | tac
|
||||
PATCH_COMMIT_LIST=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
echo "--- new meta git log (oldest to newest) ---"
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit ; echo "") | sed '/^$/d' | tac
|
||||
REFERENCE_COMMIT=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git --no-pager show "$COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
N=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*" | wc -l)
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*")
|
||||
echo "cp -f $PATCH_FILE $PATCH_DEST"
|
||||
\cp -f $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: copy failed $WORK_META_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$WORK_META_DIR/$PATCH_FILE' derived from commit $COMMIT, and to be copied to '$PKG_DIR/centos/meta_patches'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
(
|
||||
echo "--- old git log (oldest to newest) ---"
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH in directory '$OLD_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit; echo "") | sed '/^$/d' | tac
|
||||
PATCH_COMMIT_LIST=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit; echo "") | sed '/^$/d' | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
|
||||
echo "--- new git log (oldest to newest) ---"
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH in directory '$NEW_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit; echo "") | sed '/^$/d' | tac
|
||||
REFERENCE_COMMIT=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
if [ "$OLD_WORK_SRC_DIR" == "$NEW_WORK_SRC_DIR" ]; then
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git --no-pager show "$COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
else
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
PATCH_LIST=$(git format-patch -n pre_wrs_$OLD_BRANCH)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=pre_wrs_$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
echo "=== Apply $PATCH_FILE ==="
|
||||
cat $OLD_WORK_SRC_DIR/$PATCH_FILE
|
||||
cat $OLD_WORK_SRC_DIR/$PATCH_FILE | patch -p1
|
||||
if [ $? -ne 0 ]; then
|
||||
for REJECT in $(find . -name '*.rej'); do
|
||||
FILE_NAME=$(echo $REJECT | sed 's#.rej$##')
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
gitk $FILE_NAME &
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ -f $FILE_NAME ] && [ -f $FILE_NAME.orig ]; then
|
||||
\cp -f $FILE_NAME.orig $FILE_NAME
|
||||
xterm -e "vi $FILE_NAME $REJECT"
|
||||
rm -f $REJECT
|
||||
rm -f $FILE_NAME.orig
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
git add --all
|
||||
MSG=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
git commit -m "WRS: $MSG"
|
||||
done
|
||||
|
||||
fi
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch[0-9]*-//' | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
PKG_PATCH_DIR="$PKG_DIR/centos/patches"
|
||||
N=0
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
if [ $N -ne 1 ]; then
|
||||
PKG_PATCH_DIR="$PKG_DIR"
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
fi
|
||||
echo "N=$N"
|
||||
echo "PKG_PATCH_DIR=$PKG_PATCH_DIR"
|
||||
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]')
|
||||
echo "meld $PATCH_FILE -> $PATCH_DEST"
|
||||
meld $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: meld failed $WORK_SRC_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$OLD_WORK_SRC_DIR/$PATCH_FILE', and to be copied to '$PKG_PATCH_DIR'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
)
|
||||
|
||||
|
||||
done
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
for d in $(for dat in $(cat $UPVERSION_LOG); do srpm_path=$(echo $dat | awk -F '#' '{print $2}'); ( cd $(dirname $srpm_path); git rev-parse --show-toplevel ); done | sort --unique); do
|
||||
(
|
||||
cd $d
|
||||
echo "cd $d"
|
||||
for f in $(git status --porcelain | awk '{print $2}'); do
|
||||
echo "git add $f";
|
||||
done
|
||||
if [ "$PATCH_ID" == "" ]; then
|
||||
echo "git commit -m 'rebased patches'"
|
||||
else
|
||||
echo "git commit -m 'rebased patches'"
|
||||
fi
|
||||
)
|
||||
done
|
||||
echo ""
|
||||
|
||||
|
330
build-tools/mirror_rebase/tarball_upgrade
Executable file
330
build-tools/mirror_rebase/tarball_upgrade
Executable file
@ -0,0 +1,330 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Part of the monthly mirror update
|
||||
#
|
||||
# Update symlinks in cgcs-centos-repo to point to the latest version of packages in /import/mirrors/CentOS/tis-r4-CentOS/newton
|
||||
#
|
||||
# Search for tis patched centos src.rpm's that have been upversioned
|
||||
#
|
||||
|
||||
UPVERSION_LOG=$MY_WORKSPACE/upversion.log
|
||||
if [ "x$WORKING_BRANCH" == "x" ]; then
|
||||
WORKING_BRANCH=CGCS_DEV_0026_may_rebase
|
||||
fi
|
||||
|
||||
if [ ! -f $UPVERSION_LOG ]; then
|
||||
echo "ERROR: Can't find UPVERSION_LOG at '$UPVERSION_LOG'"
|
||||
fi
|
||||
|
||||
if [ "$DISPLAY" == "" ]; then
|
||||
echo "ERROR: X-Windows 'DISPLAY' variable not set. This script needs to open pop-up windows."
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# restore new symlinks
|
||||
cd $MY_REPO/cgcs-3rd-party-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-3rd-party-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-centos-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILED=""
|
||||
build_types="std rt"
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
(
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
PKG_DIR=$(dirname $(dirname $srpm_path))
|
||||
OLD_BRANCH=$(echo $old_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
NEW_BRANCH=$(echo $new_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
|
||||
WORK_META_DIR=""
|
||||
for dd in $build_types; do
|
||||
WORK_META_DIR=$MY_WORKSPACE/$dd/srpm_work/$name/rpmbuild
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
if [ -d $WORK_META_DIR ]; then
|
||||
break;
|
||||
else
|
||||
WORK_META_DIR=""
|
||||
fi
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# WORK_SRC_DIR=$(dirname $(find $MY_WORKSPACE/srpm_work/$name/gits/ -type d -name .git))
|
||||
NEW_WORK_SRC_DIR=""
|
||||
OLD_WORK_SRC_DIR=""
|
||||
for dd in $build_types; do
|
||||
for g in $(find $MY_WORKSPACE/$dd/srpm_work/$name/gits/ -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
if [ -d $d ]; then
|
||||
cd $d;
|
||||
git tag | grep pre_wrs_ >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
git checkout $OLD_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
OLD_WORK_SRC_DIR=$d
|
||||
fi
|
||||
git checkout $NEW_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
NEW_WORK_SRC_DIR=$d
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
echo "PKG_DIR=$PKG_DIR"
|
||||
echo "OLD_BRANCH=$OLD_BRANCH"
|
||||
echo "NEW_BRANCH=$NEW_BRANCH"
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
echo "OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
echo "NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
echo ""
|
||||
|
||||
(
|
||||
cd $WORK_META_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to WORK_META_DIR=$WORK_META_DIR"
|
||||
exit 1
|
||||
fi
|
||||
echo "--- old meta git log (oldest to newest) ---"
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit ; echo "") | sed '/^$/d' | tac
|
||||
PATCH_COMMIT_LIST=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
echo "--- new meta git log (oldest to newest) ---"
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit ; echo "") | sed '/^$/d' | tac
|
||||
REFERENCE_COMMIT=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git --no-pager show "$COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
N=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*" | wc -l)
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*")
|
||||
echo "cp -f $PATCH_FILE $PATCH_DEST"
|
||||
\cp -f $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: copy failed $WORK_META_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$WORK_META_DIR/$PATCH_FILE' derived from commit $COMMIT, and to be copied to '$PKG_DIR/centos/meta_patches'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
(
|
||||
echo "--- old git log (oldest to newest) ---"
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH in directory '$OLD_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit; echo "") | sed '/^$/d' | tac
|
||||
PATCH_COMMIT_LIST=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit; echo "") | sed '/^$/d' | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
|
||||
echo "--- new git log (oldest to newest) ---"
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH in directory '$NEW_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
(git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit; echo "") | sed '/^$/d' | tac
|
||||
REFERENCE_COMMIT=$((git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit ; echo "") | sed '/^$/d' | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
if [ "$OLD_WORK_SRC_DIR" == "$NEW_WORK_SRC_DIR" ]; then
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git --no-pager show "$COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
else
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
PATCH_LIST=$(git format-patch -n pre_wrs_$OLD_BRANCH)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=pre_wrs_$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
echo "=== Apply $PATCH_FILE ==="
|
||||
cat $OLD_WORK_SRC_DIR/$PATCH_FILE
|
||||
cat $OLD_WORK_SRC_DIR/$PATCH_FILE | patch -p1
|
||||
if [ $? -ne 0 ]; then
|
||||
for REJECT in $(find . -name '*.rej'); do
|
||||
FILE_NAME=$(echo $REJECT | sed 's#.rej$##')
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
gitk $FILE_NAME &
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ -f $FILE_NAME ] && [ -f $FILE_NAME.orig ]; then
|
||||
\cp -f $FILE_NAME.orig $FILE_NAME
|
||||
xterm -e "vi $FILE_NAME $REJECT"
|
||||
rm -f $REJECT
|
||||
rm -f $FILE_NAME.orig
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
git add --all
|
||||
MSG=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
git commit -m "WRS: $MSG"
|
||||
done
|
||||
|
||||
fi
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch[0-9]*-//' | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
PKG_PATCH_DIR="$PKG_DIR/centos/patches"
|
||||
N=0
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
if [ $N -ne 1 ]; then
|
||||
PKG_PATCH_DIR="$PKG_DIR"
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
fi
|
||||
echo "N=$N"
|
||||
echo "PKG_PATCH_DIR=$PKG_PATCH_DIR"
|
||||
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]')
|
||||
echo "meld $PATCH_FILE -> $PATCH_DEST"
|
||||
meld $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: meld failed $WORK_SRC_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$OLD_WORK_SRC_DIR/$PATCH_FILE', and to be copied to '$PKG_PATCH_DIR'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
)
|
||||
|
||||
|
||||
done
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
|
31
build-tools/mk/_sign_pkgs.mk
Normal file
31
build-tools/mk/_sign_pkgs.mk
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
#
|
||||
# this makefile is used by the build-iso process to add file signature to all rpms
|
||||
#
|
||||
# it requires a private key, passed as the variable KEY
|
||||
|
||||
PKGS_LIST := $(wildcard *.rpm)
|
||||
|
||||
# we need to skip the signature of some packages that
|
||||
# might be installed in file systems that do not support extended attributes
|
||||
# in the case of shim- and grub2-efi-, the UEFI configuration installs them in a VFAT file system
|
||||
PKGS_TO_SKIP := $(wildcard grub2-efi-[0-9]*.x86_64.rpm shim-[0-9]*.x86_64.rpm)
|
||||
|
||||
PKGS_TO_SIGN = $(filter-out $(PKGS_TO_SKIP),$(PKGS_LIST))
|
||||
|
||||
define _pkg_sign_tmpl
|
||||
|
||||
_sign_$1 :
|
||||
@ rpmsign --signfiles --fskpath=$(KEY) $1
|
||||
@ chown mockbuild $1
|
||||
@ chgrp users $1
|
||||
|
||||
sign : _sign_$1
|
||||
|
||||
endef
|
||||
|
||||
sign :
|
||||
@echo signed all packages
|
||||
|
||||
$(foreach file,$(PKGS_TO_SIGN),$(eval $(call _pkg_sign_tmpl,$(file))))
|
||||
|
9
build-tools/mock_cfg_to_yum_conf.py
Executable file
9
build-tools/mock_cfg_to_yum_conf.py
Executable file
@ -0,0 +1,9 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
|
||||
FN=sys.argv[1]
|
||||
variables={}
|
||||
variables['config_opts']={}
|
||||
execfile( FN, variables )
|
||||
print variables['config_opts']['yum.conf']
|
1207
build-tools/mockchain-parallel
Executable file
1207
build-tools/mockchain-parallel
Executable file
File diff suppressed because it is too large
Load Diff
130
build-tools/modify-build-cfg
Executable file
130
build-tools/modify-build-cfg
Executable file
@ -0,0 +1,130 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script modifies a mock configuration file (typically $MY_BUILD_CFG)
|
||||
# to add build time environment variables to the mock environment (things
|
||||
# like what branch we're building on, etc).
|
||||
#
|
||||
# For reasons of security, the host environment variables cannot normally be
|
||||
# passed through to the mock environment, so this scripts sets the variables
|
||||
# to literal values.
|
||||
#
|
||||
# usage: modify-build-cfg [file.cfg]
|
||||
#
|
||||
|
||||
MOCK_CFG_PROTO="$MY_REPO/cgcs-centos-repo/mock.cfg.proto"
|
||||
if [ ! -f "$MOCK_CFG_PROTO" ]; then
|
||||
echo "ERROR: Couldn't find mock config prototype at '$MOCK_CFG_PROTO'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${1}x" == "x" ]; then
|
||||
FILE=$MY_BUILD_CFG
|
||||
else
|
||||
FILE=$1
|
||||
fi
|
||||
|
||||
if [ -f $MOCK_CFG_PROTO ]; then
|
||||
if [ -f $FILE ]; then
|
||||
NEWER=$(find "$MOCK_CFG_PROTO" -newer "$FILE")
|
||||
if [ "x$NEWER" != "x" ]; then
|
||||
\rm -f -v "$FILE"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -f $FILE ]; then
|
||||
if [ -z $MY_BUILD_ENVIRONMENT ] || [ -z $MY_BUILD_DIR ] || [ -z $MY_REPO ]; then
|
||||
echo "Can't create $FILE without MY_BUILD_ENVIRONMENT, MY_BUILD_DIR and MY_REPO environment variables"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Recreating $FILE"
|
||||
\cp -f -v "$MOCK_CFG_PROTO" "$FILE"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Couldn't find config file '$FILE', nor construct it from '$MOCK_CFG_PROTO'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sed -i "s%LOCAL_BASE%http://127.0.0.1:8088%g" "$FILE"
|
||||
sed -i "s%MIRROR_BASE%http://127.0.0.1:8088%g" "$FILE"
|
||||
sed -i "s%BUILD_ENV%$MY_BUILD_ENVIRONMENT%g" "$FILE"
|
||||
sed -i "s%/MY_BUILD_DIR%$MY_BUILD_DIR_TOP%g" "$FILE"
|
||||
sed -i "s%/MY_REPO_DIR%$MY_REPO%g" "$FILE"
|
||||
|
||||
# Disable all local-* repos for the build-types other than the current one
|
||||
for bt in std rt; do
|
||||
if [ "$bt" != "$BUILD_TYPE" ]; then
|
||||
# Use the range of lines starting with pattern [local-$bt] until the next line starting with []
|
||||
sed -i "/^\[local-$bt\]/,/^\[/ s/enabled=1/enabled=0/" $FILE
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add environment variables to mock config if they don't exist
|
||||
grep -q "config_opts\['environment'\]\['BUILD_BY'\]" $FILE || \
|
||||
echo "config_opts['environment']['BUILD_BY']" >> $FILE
|
||||
|
||||
grep -q "config_opts\['environment'\]\['BUILD_DATE'\]" $FILE || \
|
||||
echo "config_opts['environment']['BUILD_DATE']" >> $FILE
|
||||
|
||||
grep -q "config_opts\['environment'\]\['REPO'\]" $FILE || \
|
||||
echo "config_opts['environment']['REPO']" >> $FILE
|
||||
|
||||
grep -q "config_opts\['environment'\]\['WRS_GIT_BRANCH'\]" $FILE || \
|
||||
echo "config_opts['environment']['WRS_GIT_BRANCH']" >> $FILE
|
||||
|
||||
grep -q "config_opts\['environment'\]\['CGCS_GIT_BRANCH'\]" $FILE || \
|
||||
echo "config_opts['environment']['CGCS_GIT_BRANCH']" >> $FILE
|
||||
|
||||
if [ -z $FORMAL_BUILD ]; then
|
||||
grep -q "config_opts\['macros'\]\['%_no_cgcs_license_check'\] = '1'" $FILE || \
|
||||
echo "config_opts['macros']['%_no_cgcs_license_check'] = '1'" >> $FILE
|
||||
else
|
||||
sed -i "/config_opts\['macros'\]\['%_no_cgcs_license_check'\] = '1'/d" $FILE
|
||||
fi
|
||||
|
||||
grep -q "config_opts\['macros'\]\['%_tis_build_type'\] = '$BUILD_TYPE'" $FILE || \
|
||||
echo "config_opts['macros']['%_tis_build_type'] = '$BUILD_TYPE'" >> $FILE
|
||||
|
||||
if [ -f /usr/lib64/nosync/nosync.so ]; then
|
||||
grep -q "config_opts\['nosync'\] = True" $FILE || \
|
||||
echo "config_opts['nosync'] = True" >> $FILE
|
||||
fi
|
||||
|
||||
grep -q "config_opts\['chroot_setup_cmd'\] = 'install @buildsys-build pigz lbzip2 yum'" $FILE || \
|
||||
echo "config_opts['chroot_setup_cmd'] = 'install @buildsys-build pigz lbzip2 yum'" >> $FILE
|
||||
|
||||
#
|
||||
# Read macros from tis.macros to add to the build config file,
|
||||
# for use in RPM spec files
|
||||
#
|
||||
RPM_MACROS=$MY_REPO/build-tools/tis.macros
|
||||
sed 's/#.*//' $RPM_MACROS | grep '=' | while IFS='=' read name value; do
|
||||
# Check if the entry already exists. If so, go to next line
|
||||
grep -q "^config_opts\['macros'\]\['${name}'\] = '${value}'$" $FILE && continue
|
||||
|
||||
# Update or add the entry
|
||||
grep -q "^config_opts\['macros'\]\['${name}'\]" $FILE
|
||||
if [ $? -eq 0 ]; then
|
||||
sed -i -r "s#^(config_opts\['macros'\]\['${name}'\]).*#\1 = '${value}'#" $FILE
|
||||
else
|
||||
echo "config_opts['macros']['${name}'] = '${value}'" >> $FILE
|
||||
fi
|
||||
done
|
||||
|
||||
# okay, now we have lines for each env var. Generate the correct values
|
||||
|
||||
BUILD_DATE=`date "+%F %T %z"`
|
||||
CGCS_GIT_BRANCH=`cd $MY_REPO/addons/wr-cgcs/layers/cgcs/; git rev-parse --abbrev-ref HEAD`
|
||||
WRS_GIT_BRANCH=`cd $MY_REPO; git rev-parse --abbrev-ref HEAD`
|
||||
REPO=$MY_REPO
|
||||
|
||||
# Finally, our good friend sed will place the values in the mock config file
|
||||
sed -i \
|
||||
-e "s#config_opts\['environment'\]\['BUILD_BY'\].*#config_opts\['environment'\]\['BUILD_BY'\] = '$USER'#" \
|
||||
-e "s#config_opts\['environment'\]\['BUILD_DATE'\].*#config_opts\['environment'\]\['BUILD_DATE'\] = '$BUILD_DATE'#" \
|
||||
-e "s#config_opts\['environment'\]\['REPO'\].*#config_opts\['environment'\]\['REPO'\] = '$REPO'#" \
|
||||
-e "s#config_opts\['environment'\]\['WRS_GIT_BRANCH'\].*#config_opts\['environment'\]\['WRS_GIT_BRANCH'\] = '$WRS_GIT_BRANCH'#" \
|
||||
-e "s#config_opts\['environment'\]\['CGCS_GIT_BRANCH'\].*#config_opts\['environment'\]\['CGCS_GIT_BRANCH'\] = '$CGCS_GIT_BRANCH'#" \
|
||||
$FILE
|
320
build-tools/patch-iso
Executable file
320
build-tools/patch-iso
Executable file
@ -0,0 +1,320 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Utility for adding patches to an unpatched ISO
|
||||
#
|
||||
|
||||
if [ -z "${MY_REPO}" ]; then
|
||||
echo "Required environment variable MY_REPO is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SETUP_PATCH_REPO=${MY_REPO}/addons/wr-cgcs/layers/cgcs/extras.ND/scripts/setup_patch_repo.sh
|
||||
if [ ! -x ${SETUP_PATCH_REPO} ]; then
|
||||
echo "Cannot find or execute ${SETUP_PATCH_REPO}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
REPO_UPGRADES_DIR=${MY_REPO}/addons/wr-cgcs/layers/cgcs/common-bsp/files/upgrades
|
||||
RELEASE_INFO=${MY_REPO}/addons/wr-cgcs/layers/cgcs/middleware/recipes-common/build-info/release-info.inc
|
||||
PLATFORM_RELEASE=$(source $RELEASE_INFO && echo $PLATFORM_RELEASE)
|
||||
|
||||
function usage() {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " $(basename $0) -i <input bootimage.iso> -o <output bootimage.iso> [ -u ] <patch> ..."
|
||||
echo " -i <file>: Specify input ISO file"
|
||||
echo " -o <file>: Specify output ISO file"
|
||||
echo " -u : Update with upgrades files from ${REPO_UPGRADES_DIR}"
|
||||
echo ""
|
||||
}
|
||||
|
||||
function extract_pkg_from_patch_repo() {
|
||||
local repodir=${BUILDDIR}/patches
|
||||
local pkgname=$1
|
||||
|
||||
local pkgfile=$(repoquery --repofrompath local,${repodir} --location -q ${pkgname})
|
||||
if [ -z "${pkgfile}" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
rpm2cpio ${pkgfile/file://} | cpio -idmv
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to extract $pkgname files from ${pkgfile/file://}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
declare INPUT_ISO=
|
||||
declare OUTPUT_ISO=
|
||||
declare ORIG_PWD=$PWD
|
||||
declare DO_UPGRADES=1
|
||||
|
||||
while getopts "i:o:u" opt; do
|
||||
case $opt in
|
||||
i)
|
||||
INPUT_ISO=$OPTARG
|
||||
;;
|
||||
o)
|
||||
OUTPUT_ISO=$OPTARG
|
||||
;;
|
||||
u)
|
||||
DO_UPGRADES=0
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$INPUT_ISO" -o -z "$OUTPUT_ISO" ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f ${INPUT_ISO} ]; then
|
||||
echo "Input file does not exist: ${INPUT_ISO}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f ${OUTPUT_ISO} ]; then
|
||||
echo "Output file already exists: ${OUTPUT_ISO}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
shift $((OPTIND-1))
|
||||
|
||||
if [ $# -le 0 ]; then
|
||||
usage
|
||||
exit
|
||||
fi
|
||||
|
||||
for pf in $@; do
|
||||
if [ ! -f $pf ]; then
|
||||
echo "Patch file $pf does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! $pf =~ \.patch$ ]]; then
|
||||
echo "Specified file $pf does not have .patch extension"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
declare MNTDIR=
|
||||
declare BUILDDIR=
|
||||
declare WORKDIR=
|
||||
|
||||
function cleanup() {
|
||||
if [ -n "$MNTDIR" -a -d "$MNTDIR" ]; then
|
||||
guestunmount $MNTDIR
|
||||
\rmdir $MNTDIR
|
||||
fi
|
||||
|
||||
if [ -n "$BUILDDIR" -a -d "$BUILDDIR" ]; then
|
||||
\rm -rf $BUILDDIR
|
||||
fi
|
||||
|
||||
if [ -n "$WORKDIR" -a -d "$WORKDIR" ]; then
|
||||
\rm -rf $WORKDIR
|
||||
fi
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
MNTDIR=$(mktemp -d -p $PWD patchiso_mnt_XXXXXX)
|
||||
if [ -z "${MNTDIR}" -o ! -d ${MNTDIR} ]; then
|
||||
echo "Failed to create mntdir. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
BUILDDIR=$(mktemp -d -p $PWD patchiso_build_XXXXXX)
|
||||
if [ -z "${BUILDDIR}" -o ! -d ${BUILDDIR} ]; then
|
||||
echo "Failed to create builddir. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
# Mount the ISO
|
||||
guestmount -a ${INPUT_ISO} -m /dev/sda1 --ro ${MNTDIR}
|
||||
rc=$?
|
||||
if [ $rc -ne 0 ]; then
|
||||
echo "Call to guestmount failed with rc=$rc. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
rsync -a ${MNTDIR}/ ${BUILDDIR}/
|
||||
rc=$?
|
||||
if [ $rc -ne 0 ]; then
|
||||
echo "Call to rsync ISO content. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
guestunmount ${MNTDIR}
|
||||
\rmdir ${MNTDIR}
|
||||
|
||||
# Setup the patch repo
|
||||
${SETUP_PATCH_REPO} -o ${BUILDDIR}/patches $@
|
||||
rc=$?
|
||||
if [ $rc -ne 0 ]; then
|
||||
echo "Call to $(basename ${SETUP_PATCH_REPO}) failed with rc=$rc. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
# Look for components that need modification
|
||||
#extract_pkg_from_patch_repo
|
||||
WORKDIR=$(mktemp -d -p $PWD patchiso_work_XXXXXX)
|
||||
if [ -z "${WORKDIR}" -o ! -d ${WORKDIR} ]; then
|
||||
echo "Failed to create workdir. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
\cd ${WORKDIR}
|
||||
\mkdir extract
|
||||
\cd extract
|
||||
|
||||
# Changes to copied files here must also be reflected in build-iso
|
||||
|
||||
extract_pkg_from_patch_repo platform-kickstarts
|
||||
if [ $? -eq 0 ]; then
|
||||
# Replace files
|
||||
\rm -f ${BUILDDIR}/*ks.cfg &&
|
||||
\cp --preserve=all www/pages/feed/rel-*/*.cfg ${BUILDDIR}/ &&
|
||||
\cp --preserve=all ${BUILDDIR}/controller_ks.cfg ${BUILDDIR}/ks.cfg
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to copy extracted kickstarts"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
\cd ${WORKDIR}
|
||||
\rm -rf extract
|
||||
|
||||
\mkdir extract
|
||||
\cd extract
|
||||
extract_pkg_from_patch_repo platform-kickstarts-pxeboot
|
||||
if [ $? -eq 0 ]; then
|
||||
# Replace files
|
||||
\rm -f ${BUILDDIR}/pxeboot/pxeboot_controller.cfg \
|
||||
${BUILDDIR}/pxeboot/pxeboot_smallsystem.cfg \
|
||||
${BUILDDIR}/pxeboot/pxeboot_smallsystem_lowlatency.cfg &&
|
||||
\cp --preserve=all pxeboot/* ${BUILDDIR}/pxeboot/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to copy extracted pxeboot kickstarts"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
\cd ${WORKDIR}
|
||||
\rm -rf extract
|
||||
|
||||
\mkdir extract
|
||||
\cd extract
|
||||
extract_pkg_from_patch_repo pxe-network-installer
|
||||
if [ $? -eq 0 ]; then
|
||||
# Replace files
|
||||
\rm -f ${BUILDDIR}/pxeboot/pxelinux.0 \
|
||||
${BUILDDIR}/pxeboot/menu.c32 \
|
||||
${BUILDDIR}/pxeboot/chain.c32 &&
|
||||
\cp --preserve=all pxeboot/pxelinux.0 pxeboot/menu.c32 pxeboot/chain.c32 ${BUILDDIR}/pxeboot/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Could not copy all files from installer"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for f in pxeboot/EFI/centos/x86_64-efi/*; do
|
||||
\rm -f ${BUILDDIR}/${f}
|
||||
done
|
||||
\cp --preserve=all pxeboot/EFI/centos/x86_64-efi/* ${BUILDDIR}/pxeboot/EFI/centos/x86_64-efi/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Could not copy all files from installer"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
\rm -f ${BUILDDIR}/LiveOS/squashfs.img &&
|
||||
\cp --preserve=all www/pages/feed/rel-*/LiveOS/squashfs.img ${BUILDDIR}/LiveOS/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Could not copy squashfs from LiveOS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Replace vmlinuz and initrd.img with our own pre-built ones
|
||||
\rm -f \
|
||||
${BUILDDIR}/vmlinuz \
|
||||
${BUILDDIR}/images/pxeboot/vmlinuz \
|
||||
${BUILDDIR}/initrd.img \
|
||||
${BUILDDIR}/images/pxeboot/initrd.img &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-bzImage_1.0 \
|
||||
${BUILDDIR}/vmlinuz &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-bzImage_1.0 \
|
||||
${BUILDDIR}/images/pxeboot/vmlinuz &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
||||
${BUILDDIR}/initrd.img &&
|
||||
\cp --preserve=all pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
||||
${BUILDDIR}/images/pxeboot/initrd.img
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to copy installer images"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
\cd ${WORKDIR}
|
||||
\rm -rf extract
|
||||
|
||||
\mkdir extract
|
||||
\cd extract
|
||||
extract_pkg_from_patch_repo grub2-efi-pxeboot
|
||||
if [ $? -eq 0 ]; then
|
||||
# Replace files
|
||||
\rm -f ${BUILDDIR}/pxeboot/EFI/grubx64.efi &&
|
||||
\cp --preserve=all pxeboot/EFI/grubx64.efi ${BUILDDIR}/pxeboot/EFI/
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to copy grub2-efi-pxeboot files"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
\cd ${WORKDIR}
|
||||
\rm -rf extract
|
||||
|
||||
\cd ${ORIG_PWD}
|
||||
|
||||
if [ ${DO_UPGRADES} -eq 0 ]; then
|
||||
# Changes to copied files here must also be reflected in build-iso
|
||||
|
||||
echo "Updating upgrade support files"
|
||||
ISO_UPGRADES_DIR="${BUILDDIR}/upgrades"
|
||||
\rm -rf ${ISO_UPGRADES_DIR}
|
||||
\mkdir ${ISO_UPGRADES_DIR}
|
||||
\cp ${REPO_UPGRADES_DIR}/* ${ISO_UPGRADES_DIR}
|
||||
sed -i "s/xxxSW_VERSIONxxx/${PLATFORM_RELEASE}/g" ${ISO_UPGRADES_DIR}/metadata.xml
|
||||
chmod +x ${ISO_UPGRADES_DIR}/*.sh
|
||||
# Write the version out (used in upgrade scripts - this is the same as SW_VERSION)
|
||||
echo "VERSION=$PLATFORM_RELEASE" > ${ISO_UPGRADES_DIR}/version
|
||||
fi
|
||||
|
||||
# Rebuild the ISO
|
||||
mkisofs -o ${OUTPUT_ISO} \
|
||||
-R -D -A 'oe_iso_boot' -V 'oe_iso_boot' \
|
||||
-quiet \
|
||||
-b isolinux.bin -c boot.cat -no-emul-boot \
|
||||
-boot-load-size 4 -boot-info-table \
|
||||
-eltorito-alt-boot \
|
||||
-e images/efiboot.img \
|
||||
-no-emul-boot \
|
||||
${BUILDDIR}
|
||||
|
||||
isohybrid --uefi ${OUTPUT_ISO}
|
||||
implantisomd5 ${OUTPUT_ISO}
|
||||
|
||||
# Sign the .iso with the developer private key
|
||||
# Signing with the formal key is only to be done for customer release
|
||||
# and is a manual step afterwards, as with the GA ISO
|
||||
openssl dgst -sha256 \
|
||||
-sign ${MY_REPO}/build-tools/signing/dev-private-key.pem \
|
||||
-binary \
|
||||
-out ${OUTPUT_ISO/%.iso/.sig} \
|
||||
${OUTPUT_ISO}
|
||||
rc=$?
|
||||
if [ $rc -ne 0 ]; then
|
||||
echo "Call to $(basename ${SETUP_PATCH_REPO}) failed with rc=$rc. Aborting..."
|
||||
exit $rc
|
||||
fi
|
||||
|
||||
echo "Patched ISO: ${OUTPUT_ISO}"
|
||||
|
130
build-tools/patch_rebase_1
Executable file
130
build-tools/patch_rebase_1
Executable file
@ -0,0 +1,130 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Start an edit session for packages to be upgraded - pre upgrade version
|
||||
#
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Step 1: Start an edit session for packages to be upgraded - pre upgrade version"
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " patch_rebase_1 [--origin_branch <branch>] [--working_branch <branch>] [--upversion_data <file>]"
|
||||
echo ""
|
||||
echo "Assumes cgcs-centos-repo already has a working_branch commit that sets the new symlinks."
|
||||
echo ""
|
||||
echo "The upversion_data file has data on all the src.rpm being updated in the format:"
|
||||
echo " export UPVERSION_DATA=$MY_WORKSPACE/upversion.log"
|
||||
echo " PKG=lighttpd"
|
||||
echo " OLD_SRC_RPM=lighttpd-1.4.41-1.el7.src.rpm"
|
||||
echo " NEW_SRC_RPM=lighttpd-1.4.41-2.el7.src.rpm"
|
||||
echo " SRPM_PATH=$MY_REPO/addons/wr-cgcs/layers/cgcs/recipes-extended/lighttpd/centos/srpm_path"
|
||||
echo " echo \"\$PKG#\$SRPM_PATH##\$OLD_SRC_RPM#\$NEW_SRC_RPM\" > UPVERSION_DATA"
|
||||
echo ""
|
||||
}
|
||||
|
||||
TEMP=`getopt -o h --long origin_branch:,working_branch:,upversion_data:,help -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
ORIGIN_BRANCH=""
|
||||
WORKING_BRANCH=""
|
||||
UPVERSION_LOG=""
|
||||
HELP=0
|
||||
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--origin_branch) shift ; ORIGIN_BRANCH="$1" ; shift ;;
|
||||
--working_branch) shift ; WORKING_BRANCH="$1" ; shift ;;
|
||||
--upversion_data) shift ; UPVERSION_LOG="$1" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
UPVERSION_LOG=$UPVERSION_DATA
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
echo "ERROR: please specify location of upversion data"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$UPVERSION_LOG" ]; then
|
||||
echo "File not found: '$UPVERSION_LOG'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$PATCH_SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_PATCH_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a origin branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$WORKING_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a working branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$(pwd)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout HEAD^
|
||||
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
|
||||
build-pkgs --edit --clean $name
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit --clean $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
|
||||
build-pkgs --edit $name
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<="
|
||||
done
|
||||
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed build-pkgs --edit for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
148
build-tools/patch_rebase_2
Executable file
148
build-tools/patch_rebase_2
Executable file
@ -0,0 +1,148 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Update srpm_path for packages to be upgraded
|
||||
#
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Step 2: Update srpm_path for packages to be upgraded"
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " patch_rebase_2 [--origin_branch <branch>] [--working_branch <branch>] [--upversion_data <file>]"
|
||||
echo ""
|
||||
echo "Assumes cgcs-centos-repo already has a working_branch commit that sets the new symlinks."
|
||||
echo ""
|
||||
echo "The upversion_data file has data on all the src.rpm being updated in the format:"
|
||||
echo " export UPVERSION_DATA=$MY_WORKSPACE/upversion.log"
|
||||
echo " PKG=lighttpd"
|
||||
echo " OLD_SRC_RPM=lighttpd-1.4.41-1.el7.src.rpm"
|
||||
echo " NEW_SRC_RPM=lighttpd-1.4.41-2.el7.src.rpm"
|
||||
echo " SRPM_PATH=$MY_REPO/addons/wr-cgcs/layers/cgcs/recipes-extended/lighttpd/centos/srpm_path"
|
||||
echo " echo \"\$PKG#\$SRPM_PATH##\$OLD_SRC_RPM#\$NEW_SRC_RPM\" > UPVERSION_DATA"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
TEMP=`getopt -o h --long origin_branch:,working_branch:,upversion_data:,help -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
ORIGIN_BRANCH=""
|
||||
WORKING_BRANCH=""
|
||||
UPVERSION_LOG=""
|
||||
HELP=0
|
||||
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--origin_branch) shift ; ORIGIN_BRANCH="$1" ; shift ;;
|
||||
--working_branch) shift ; WORKING_BRANCH="$1" ; shift ;;
|
||||
--upversion_data) shift ; UPVERSION_LOG="$1" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
UPVERSION_LOG=$UPVERSION_DATA
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
echo "ERROR: please specify location of upversion data"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$UPVERSION_LOG" ]; then
|
||||
echo "File not found: '$UPVERSION_LOG'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$PATCH_SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_PATCH_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a origin branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$WORKING_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a working branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO
|
||||
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
(
|
||||
cd $(dirname $srpm_path)
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
if [ "$CURRENT_BRANCH" != "$WORKING_BRANCH" ]; then
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
git checkout $ORIGIN_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$ORIGIN_BRANCH' in directory '$(pwd)'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout -b $WORKING_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to 'git checkout -b $WORKING_BRANCH' from '$(pwd)'"
|
||||
exit 1
|
||||
else
|
||||
echo "created branch '$WORKING_BRANCH' at '$(pwd)'"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
sed -i "s#$old_src_rpm#$new_src_rpm#" $srpm_path
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: sed failed '$old_src_rpm' -> '$new_src_rpm'"
|
||||
exit 1
|
||||
else
|
||||
echo "updated $srpm_path: '$old_src_rpm' -> '$new_src_rpm'"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed while working on package '$name' at '$srpm_path'"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
for d in $(for dat in $(cat $UPVERSION_LOG); do srpm_path=$(echo $dat | awk -F '#' '{print $2}'); ( cd $(dirname $srpm_path); git rev-parse --show-toplevel ); done | sort --unique); do
|
||||
(
|
||||
cd $d
|
||||
echo "cd $d"
|
||||
for f in $(git status --porcelain | grep 'srpm_path$' | awk '{print $2}'); do
|
||||
echo "git add $f";
|
||||
done
|
||||
echo "git commit -m 'srpm_path updates for patch $PATCH_ID'"
|
||||
)
|
||||
done
|
||||
echo ""
|
119
build-tools/patch_rebase_3
Executable file
119
build-tools/patch_rebase_3
Executable file
@ -0,0 +1,119 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Start an edit session for packages to be upgraded - post upgrade version
|
||||
#
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Step 3: Start an edit session for packages to be upgraded - post upgrade version"
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " patch_rebase_3 [--origin_branch <branch>] [--working_branch <branch>] [--upversion_data <file>]"
|
||||
echo ""
|
||||
echo "Assumes cgcs-centos-repo already has a working_branch commit that sets the new symlinks."
|
||||
echo ""
|
||||
echo "The upversion_data file has data on all the src.rpm being updated in the format:"
|
||||
echo " export UPVERSION_DATA=$MY_WORKSPACE/upversion.log"
|
||||
echo " PKG=lighttpd"
|
||||
echo " OLD_SRC_RPM=lighttpd-1.4.41-1.el7.src.rpm"
|
||||
echo " NEW_SRC_RPM=lighttpd-1.4.41-2.el7.src.rpm"
|
||||
echo " SRPM_PATH=$MY_REPO/addons/wr-cgcs/layers/cgcs/recipes-extended/lighttpd/centos/srpm_path"
|
||||
echo " echo \"\$PKG#\$SRPM_PATH##\$OLD_SRC_RPM#\$NEW_SRC_RPM\" > UPVERSION_DATA"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
TEMP=`getopt -o h --long origin_branch:,working_branch:,upversion_data:,help -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
ORIGIN_BRANCH=""
|
||||
WORKING_BRANCH=""
|
||||
UPVERSION_LOG=""
|
||||
HELP=0
|
||||
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--origin_branch) shift ; ORIGIN_BRANCH="$1" ; shift ;;
|
||||
--working_branch) shift ; WORKING_BRANCH="$1" ; shift ;;
|
||||
--upversion_data) shift ; UPVERSION_LOG="$1" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
UPVERSION_LOG=$UPVERSION_DATA
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
echo "ERROR: please specify location of upversion data"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$UPVERSION_LOG" ]; then
|
||||
echo "File not found: '$UPVERSION_LOG'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$PATCH_SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_PATCH_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a origin branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$WORKING_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a working branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-centos-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILED=""
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
|
||||
build-pkgs --edit $name --no-meta-patch
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed cmd 'build-pkgs --edit $name'"
|
||||
FAILED="$name $FAILED"
|
||||
break
|
||||
fi
|
||||
echo "$? <=<=<=<=<=<=<=<=<=<=<=<=<=<=<=<="
|
||||
done
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed build-pkgs --edit for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
403
build-tools/patch_rebase_4
Executable file
403
build-tools/patch_rebase_4
Executable file
@ -0,0 +1,403 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Migrate Titanium Cloud patches to the new package version
|
||||
#
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Step 4: Migrate Titanium Cloud patches to the new package version"
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " patch_rebase_4 [--origin_branch <branch>] [--working_branch <branch>] [--upversion_data <file>]"
|
||||
echo ""
|
||||
echo "Assumes cgcs-centos-repo already has a working_branch commit that sets the new symlinks."
|
||||
echo ""
|
||||
echo "The upversion_data file has data on all the src.rpm being updated in the format:"
|
||||
echo " export UPVERSION_DATA=$MY_WORKSPACE/upversion.log"
|
||||
echo " PKG=lighttpd"
|
||||
echo " OLD_SRC_RPM=lighttpd-1.4.41-1.el7.src.rpm"
|
||||
echo " NEW_SRC_RPM=lighttpd-1.4.41-2.el7.src.rpm"
|
||||
echo " SRPM_PATH=$MY_REPO/addons/wr-cgcs/layers/cgcs/recipes-extended/lighttpd/centos/srpm_path"
|
||||
echo " echo \"\$PKG#\$SRPM_PATH##\$OLD_SRC_RPM#\$NEW_SRC_RPM\" > UPVERSION_DATA"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
TEMP=`getopt -o h --long origin_branch:,working_branch:,upversion_data:,help -n 'test.sh' -- "$@"`
|
||||
eval set -- "$TEMP"
|
||||
|
||||
ORIGIN_BRANCH=""
|
||||
WORKING_BRANCH=""
|
||||
UPVERSION_LOG=""
|
||||
HELP=0
|
||||
|
||||
while true ; do
|
||||
case "$1" in
|
||||
--origin_branch) shift ; ORIGIN_BRANCH="$1" ; shift ;;
|
||||
--working_branch) shift ; WORKING_BRANCH="$1" ; shift ;;
|
||||
--upversion_data) shift ; UPVERSION_LOG="$1" ; shift ;;
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
UPVERSION_LOG=$UPVERSION_DATA
|
||||
fi
|
||||
|
||||
if [ "$UPVERSION_LOG" == "" ]; then
|
||||
echo "ERROR: please specify location of upversion data"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$UPVERSION_LOG" ]; then
|
||||
echo "File not found: '$UPVERSION_LOG'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$PATCH_SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_PATCH_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ] && [ "$WORKING_BRANCH" == "" ]; then
|
||||
ORIGIN_BRANCH=$SOURCE_BRANCH
|
||||
WORKING_BRANCH=$MY_BRANCH
|
||||
fi
|
||||
|
||||
if [ "$ORIGIN_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a origin branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$WORKING_BRANCH" == "" ]; then
|
||||
echo "ERROR: please specify a working branch"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$DISPLAY" == "" ]; then
|
||||
echo "ERROR: X-Windows 'DISPLAY' variable not set. This script needs to open pop-up windows."
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# One step back to see the old symlinks
|
||||
cd $MY_REPO/cgcs-centos-repo
|
||||
git checkout $WORKING_BRANCH
|
||||
if [ $? != 0 ]; then
|
||||
echo "ERROR: Can't checkout branch '$WORKING_BRANCH' in directory '$MY_REPO/cgcs-centos-repo'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FAILED=""
|
||||
build_types="std rt"
|
||||
for dat in $(cat $UPVERSION_LOG); do
|
||||
(
|
||||
name=$(echo $dat | awk -F '#' '{print $1}')
|
||||
srpm_path=$(echo $dat | awk -F '#' '{print $2}')
|
||||
old_src_rpm=$(echo $dat | awk -F '#' '{print $4}')
|
||||
new_src_rpm=$(echo $dat | awk -F '#' '{print $5}')
|
||||
|
||||
PKG_DIR=$(dirname $(dirname $srpm_path))
|
||||
OLD_BRANCH=$(echo $old_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
NEW_BRANCH=$(echo $new_src_rpm | sed 's#[.]src[.]rpm$##')
|
||||
|
||||
WORK_META_DIR=""
|
||||
for dd in $build_types; do
|
||||
WORK_META_DIR=$MY_WORKSPACE/$dd/srpm_work/$name/rpmbuild
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
if [ -d $WORK_META_DIR ]; then
|
||||
break;
|
||||
else
|
||||
WORK_META_DIR=""
|
||||
fi
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# WORK_SRC_DIR=$(dirname $(find $MY_WORKSPACE/srpm_work/$name/gits/ -type d -name .git))
|
||||
NEW_WORK_SRC_DIR=""
|
||||
OLD_WORK_SRC_DIR=""
|
||||
for dd in $build_types; do
|
||||
for g in $(find $MY_WORKSPACE/$dd/srpm_work/$name/gits/ -type d -name .git); do
|
||||
d=$(dirname $g)
|
||||
if [ -d $d ]; then
|
||||
cd $d;
|
||||
git tag | grep pre_wrs_ >> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
git checkout $OLD_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
OLD_WORK_SRC_DIR=$d
|
||||
fi
|
||||
git checkout $NEW_BRANCH 2>> /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
NEW_WORK_SRC_DIR=$d
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if [ "$WORK_META_DIR" == "" ]; then
|
||||
echo "ERROR: failed to find srpm_work directory for '$name'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$name $old_src_rpm $new_src_rpm"
|
||||
echo "PKG_DIR=$PKG_DIR"
|
||||
echo "OLD_BRANCH=$OLD_BRANCH"
|
||||
echo "NEW_BRANCH=$NEW_BRANCH"
|
||||
echo "WORK_META_DIR=$WORK_META_DIR"
|
||||
echo "OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
echo "NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
echo ""
|
||||
|
||||
(
|
||||
cd $WORK_META_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to WORK_META_DIR=$WORK_META_DIR"
|
||||
exit 1
|
||||
fi
|
||||
echo "--- old meta git log (oldest to newest) ---"
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit | tac
|
||||
PATCH_COMMIT_LIST=$(git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
echo "--- new meta git log (oldest to newest) ---"
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit | tac
|
||||
REFERENCE_COMMIT=$(git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
N=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*" | wc -l)
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_DIR/centos/meta_patches" -name "$PATCH_TARGET*")
|
||||
echo "cp -f $PATCH_FILE $PATCH_DEST"
|
||||
\cp -f $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: copy failed $WORK_META_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$WORK_META_DIR/$PATCH_FILE' derived from commit $COMMIT, and to be copied to '$PKG_DIR/centos/meta_patches'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
(
|
||||
echo "--- old git log (oldest to newest) ---"
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to OLD_WORK_SRC_DIR=$OLD_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $OLD_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout OLD_BRANCH=$OLD_BRANCH in directory '$OLD_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit | tac
|
||||
PATCH_COMMIT_LIST=$(git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit | tac | grep WRS: | grep -v 'WRS: COPY_LIST content' | awk '{ print $2 }')
|
||||
|
||||
echo "--- new git log (oldest to newest) ---"
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to cd to NEW_WORK_SRC_DIR=$NEW_WORK_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git checkout $NEW_BRANCH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git checkout NEW_BRANCH=$NEW_BRANCH in directory '$NEW_WORK_SRC_DIR'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit | tac
|
||||
REFERENCE_COMMIT=$(git log --graph --pretty=format:'%h -%d %s (%ci) <%an>' --abbrev-commit | head -n 1 | awk '{ print $2 }')
|
||||
echo ""
|
||||
|
||||
if [ "$OLD_WORK_SRC_DIR" == "$NEW_WORK_SRC_DIR" ]; then
|
||||
for COMMIT in ${PATCH_COMMIT_LIST}; do
|
||||
echo "git cherry-pick $COMMIT"
|
||||
git cherry-pick "$COMMIT"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "WARNING: 'git cherry-pick $COMMIT' found merge conflicts. Please fix these files"
|
||||
git status --porcelain | grep '^UU ' | awk '{ print $2}'
|
||||
echo "pwd=$(pwd)"
|
||||
# gitk &
|
||||
echo "git mergetool --no-prompt"
|
||||
git mergetool --no-prompt
|
||||
# for FILE_NAME in $(git status --porcelain | grep '^UU ' | awk '{ print $2}'); do
|
||||
# xterm -e "vi $FILE_NAME -c '/[<=>][<=>][<=>][<=>]'"
|
||||
# if [ $? -ne 0 ]; then
|
||||
# echo "ERROR: problem launching editor on "
|
||||
# exit 1
|
||||
# fi
|
||||
# done
|
||||
echo "git cherry-pick --continue"
|
||||
git cherry-pick --continue
|
||||
fi
|
||||
done
|
||||
else
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
PATCH_LIST=$(git format-patch -n pre_wrs_$OLD_BRANCH)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=pre_wrs_$OLD_BRANCH"
|
||||
exit 1
|
||||
fi
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
cat $OLD_WORK_SRC_DIR/$PATCH_FILE | patch -p1
|
||||
if [ $? -ne 0 ]; then
|
||||
for REJECT in $(find . -name '*.rej'); do
|
||||
FILE_NAME=$(echo $REJECT | sed 's#.rej$##')
|
||||
cd $OLD_WORK_SRC_DIR
|
||||
gitk $FILE_NAME &
|
||||
cd $NEW_WORK_SRC_DIR
|
||||
if [ -f $FILE_NAME ] && [ -f $FILE_NAME.orig ]; then
|
||||
\cp -f $FILE_NAME.orig $FILE_NAME
|
||||
xterm -e "vi $FILE_NAME $REJECT"
|
||||
rm -f $REJECT
|
||||
rm -f $FILE_NAME.orig
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
git add --all
|
||||
MSG=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-//' | sed 's/.patch$//')
|
||||
git commit -m "WRS: $MSG"
|
||||
done
|
||||
|
||||
fi
|
||||
|
||||
PATCH_LIST=$(git format-patch -n $REFERENCE_COMMIT)
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: failed to git format-patch -n REFERENCE_COMMIT=$REFERENCE_COMMIT"
|
||||
exit 1
|
||||
fi
|
||||
for PATCH_FILE in ${PATCH_LIST}; do
|
||||
PATCH_TARGET=$(echo $PATCH_FILE | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch[0-9]*-//' | sed 's/^[0-9][0-9][0-9][0-9]-WRS-Patch//' | sed 's/.patch$//')
|
||||
echo "$PATCH_FILE -> $PATCH_TARGET"
|
||||
PKG_PATCH_DIR="$PKG_DIR/centos/patches"
|
||||
N=0
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
if [ $N -ne 1 ]; then
|
||||
PKG_PATCH_DIR="$PKG_DIR"
|
||||
if [ -d "$PKG_PATCH_DIR" ]; then
|
||||
N=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]' | wc -l)
|
||||
fi
|
||||
fi
|
||||
echo "N=$N"
|
||||
echo "PKG_PATCH_DIR=$PKG_PATCH_DIR"
|
||||
|
||||
if [ $N -eq 1 ]; then
|
||||
PATCH_DEST=$(find "$PKG_PATCH_DIR" -name "$PATCH_TARGET*" | grep -v '[/]meta_patches[/]')
|
||||
echo "meld $PATCH_FILE -> $PATCH_DEST"
|
||||
meld $PATCH_FILE $PATCH_DEST
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: meld failed $WORK_SRC_DIR/$PATCH_FILE -> $PATCH_DEST"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR: Don't know what destination file name to use for patch '$OLD_WORK_SRC_DIR/$PATCH_FILE', and to be copied to '$PKG_PATCH_DIR'"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED=$name
|
||||
break
|
||||
fi
|
||||
|
||||
)
|
||||
|
||||
|
||||
done
|
||||
|
||||
if [ "$FAILED" != "" ]; then
|
||||
echo "Failed for ... $FAILED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
for d in $(for dat in $(cat $UPVERSION_LOG); do srpm_path=$(echo $dat | awk -F '#' '{print $2}'); ( cd $(dirname $srpm_path); git rev-parse --show-toplevel ); done | sort --unique); do
|
||||
(
|
||||
cd $d
|
||||
echo "cd $d"
|
||||
for f in $(git status --porcelain | awk '{print $2}'); do
|
||||
echo "git add $f";
|
||||
done
|
||||
if [ "$PATCH_ID" == "" ]; then
|
||||
echo "git commit -m 'rebased patches'"
|
||||
else
|
||||
echo "git commit -m 'rebased patches for patch $PATCH_ID'"
|
||||
fi
|
||||
)
|
||||
done
|
||||
echo ""
|
||||
|
||||
|
506
build-tools/sign-build
Executable file
506
build-tools/sign-build
Executable file
@ -0,0 +1,506 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script calls into an external signing server to perform signing of some
|
||||
# packages in the system. The old packages (which are typically generated by
|
||||
# the build system and signed by placeholder keys) are overwritten by the new
|
||||
# packages.
|
||||
#
|
||||
# Three types of packages are signed:
|
||||
# kernels (both std and lowlatency, aka "rt", kernels)
|
||||
# grub
|
||||
# shim
|
||||
#
|
||||
# Kernels and grub are generated by producing (under the normal build system)
|
||||
# two packages -- a package containing the unsigned binaries, and a package
|
||||
# containing binaries signed with temporary keys. All the "accessories" (files,
|
||||
# scripts, etc) are included in the package containing the signed-with-temp-keys
|
||||
# files. The signing server will take both packages, sign the unsigned
|
||||
# binaries, and replace the files in the signed package with the newly signed
|
||||
# ones.
|
||||
#
|
||||
# Typical flow/artifacts
|
||||
# kernel.src.rpm -> produces kernel.rpm and kernel-unsigned.rpm
|
||||
# kernel.rpm -> initially contains binaries signed with a temporary key
|
||||
# -> contains all files used by the kernel
|
||||
# -> can be installed and used in a system (it just won't
|
||||
# secure boot since the key is just a temp key)
|
||||
# kernel-unsigned.rpm -> contains just unsigned kernel binaries
|
||||
#
|
||||
# The signing server will take both packages, sign the binaries in
|
||||
# kernel-unsigned.rpm with our private key, and replace the binaries in
|
||||
# kernel.rpm with the new binaries. The kernel.rpm can then be replaced by the
|
||||
# version generated by the signing server.
|
||||
#
|
||||
# Shim is a bit of a different beast.
|
||||
#
|
||||
# There are two source packages - shim and shim-signed. Frustratingly, "shim"
|
||||
# source produces a "shim-unsigned" binary output. "shim-signed" produces a
|
||||
# "shim" binary output.
|
||||
#
|
||||
# The "shim-signed" source RPM doesn't contain source code -- it just contains
|
||||
# instructions to take the "shim-unsigned" binaries, sign them, and package the
|
||||
# output. We've modified the shim-signed RPM to (rather than sign with a temp
|
||||
# key) use "presigned" binaries from shim-unsigned if the files exist. (It will
|
||||
# still use a temp key of no presigned files are found, which is how the build
|
||||
# system normally runs).
|
||||
#
|
||||
# The signing server will unpack the shim-unsigned package, sign the binaries
|
||||
# (as "presigned") and repack the package.
|
||||
#
|
||||
# A rebuild of shim-signed by the build server is then required.
|
||||
#
|
||||
# Thanks for bearing with me in the convoluted discussion, above.
|
||||
|
||||
|
||||
# Script flow:
|
||||
# - call signing server to sign kernels (if they exist and are new, as with
|
||||
# other RPMs)
|
||||
# - replace old kernel packages with newly signed ones
|
||||
# - call signing server to sign grub (and replace old version with the newly
|
||||
# signed one)
|
||||
# - call signing server to sign shim-unsigned (replace old version)
|
||||
# - rebuild shim-signed
|
||||
# - update our repos to advertize all newly replaced packages
|
||||
|
||||
# check_if_pkg_needs_signing <path/to/filename.rpm>
|
||||
#
|
||||
# Checks to see if a given package needs to be signed. We maintain a list of
|
||||
# MD5 sums for RPMs we have signed. Thus, we can easily see if we've already
|
||||
# signed a package.
|
||||
#
|
||||
# Returns 1 if the package does need signing, or 0 if package does not
|
||||
#
|
||||
# This function expects the package specified to exist.
|
||||
function check_if_pkg_needs_signing
|
||||
{
|
||||
local PKG_TO_CHECK=$1
|
||||
|
||||
if [ ! -e ${SIGNED_PKG_DB} ]; then
|
||||
# We haven't signed anything before, so this package needs signing
|
||||
return 1
|
||||
fi
|
||||
|
||||
local SIGNED_PKG_MD5=`grep ${PKG_TO_CHECK} ${SIGNED_PKG_DB} | cut -d ' ' -f 1`
|
||||
if [ "x${SIGNED_PKG_MD5}" == "x" ]; then
|
||||
# We have no record of having signed the package -- needs signing
|
||||
return 1
|
||||
fi
|
||||
|
||||
local CURRENT_MD5=`md5sum ${PKG_TO_CHECK} | cut -d ' ' -f 1`
|
||||
if [ "${CURRENT_MD5}" != "${SIGNED_PKG_MD5}" ]; then
|
||||
# The package has been regenerated since we last signed it -- needs
|
||||
# signing again
|
||||
return 1
|
||||
fi
|
||||
|
||||
# The package md5 sum matches the md5sum of the package when it was last
|
||||
# signed.
|
||||
return 0
|
||||
}
|
||||
|
||||
# update_signed_pkg_list <path/to/filename.rpm>
|
||||
#
|
||||
# Updated our list of signed packages with the md5 sum of a recently signed
|
||||
# package.
|
||||
#
|
||||
# This function expects the package to exist.
|
||||
function update_signed_pkg_list
|
||||
{
|
||||
local PKG_TO_ADD=$1
|
||||
|
||||
if [ ! -e ${SIGNED_PKG_DB} ]; then
|
||||
touch ${SIGNED_PKG_DB}
|
||||
fi
|
||||
|
||||
# remove current entry for package
|
||||
local TMPFILE=`mktemp`
|
||||
grep -v $(basename ${PKG_TO_ADD}) ${SIGNED_PKG_DB} > ${TMPFILE}
|
||||
mv ${TMPFILE} ${SIGNED_PKG_DB}
|
||||
|
||||
# add MD5 for package to the package list
|
||||
md5sum ${PKG_TO_ADD} >> ${SIGNED_PKG_DB}
|
||||
}
|
||||
|
||||
|
||||
# update_repo <std|rt>
|
||||
#
|
||||
# Updates either the standard or rt repo with latest packages
|
||||
# Checks that you specified a repo, and that the path exists.
|
||||
#
|
||||
# There are actually now two places we need to update -- the
|
||||
# rpmbuild/RPMS/ path, as well as the results/.../ path
|
||||
function update_repo
|
||||
{
|
||||
local BUILD_TYPE=$1
|
||||
local EXTRA_PARAMS=""
|
||||
local RETCODE=0
|
||||
local repopath=""
|
||||
|
||||
if [ "x$BUILD_TYPE" == "x" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ "x$MY_BUILD_ENVIRONMENT_TOP" == "x" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
for repopath in "$MY_WORKSPACE/$BUILD_TYPE/rpmbuild/RPMS" "$MY_WORKSPACE/$BUILD_TYPE/results/${MY_BUILD_ENVIRONMENT_TOP}-$BUILD_TYPE"; do
|
||||
if [ ! -d "$repopath" ]; then
|
||||
echo "Error - cannot find path $repopath"
|
||||
return 1
|
||||
fi
|
||||
|
||||
cd $repopath
|
||||
if [ -f comps.xml ]; then
|
||||
EXTRA_PARAMS="-g comps.xml"
|
||||
fi
|
||||
createrepo --update $EXTRA_PARAMS . > /dev/null
|
||||
RETCODE=$?
|
||||
cd - > /dev/null
|
||||
if [ 0$RETCODE -ne 0 ]; then
|
||||
return $RETCODE
|
||||
fi
|
||||
done
|
||||
|
||||
return $RETCODE
|
||||
}
|
||||
|
||||
# sign_shims - find and sign any shim package that we need to
|
||||
#
|
||||
function sign_shims
|
||||
{
|
||||
SHIM=`find $MY_WORKSPACE/std/rpmbuild/RPMS -name "shim-unsigned-*.$ARCH.rpm" | grep -v debuginfo`
|
||||
if [ "x${SHIM}" == "x" ]; then
|
||||
echo "Warning -- cannot find shim package to sign"
|
||||
return 0
|
||||
fi
|
||||
sign shim $SHIM
|
||||
|
||||
return $?
|
||||
}
|
||||
|
||||
# sign_grubs - find and sign any grub package that we need to.
|
||||
# Grub (and kernel) are initially signed with temporary keys, so
|
||||
# we need to upload both the complete package, as well as the
|
||||
# unsigned binaries
|
||||
#
|
||||
function sign_grubs
|
||||
{
|
||||
GRUB=`find $MY_WORKSPACE/std/rpmbuild/RPMS -name "grub2-efi-[1-9]*.$ARCH.rpm"`
|
||||
UNSIGNED_GRUB=`find $MY_WORKSPACE/std/rpmbuild/RPMS -name "grub2-efi-unsigned*.$ARCH.rpm"`
|
||||
if [ "x${GRUB}" == "x" ]; then
|
||||
echo "Warning -- cannot find GRUB package to sign"
|
||||
return 0
|
||||
fi
|
||||
if [ "x${UNSIGNED_GRUB}" == "x" ]; then
|
||||
echo "Warning -- cannot find unsigned GRUB package to sign"
|
||||
return 0
|
||||
fi
|
||||
|
||||
sign grub2 $GRUB $UNSIGNED_GRUB
|
||||
return $?
|
||||
}
|
||||
|
||||
# sign_kernels - find and sign any kernel package that we need to.
|
||||
#
|
||||
function sign_kernels
|
||||
{
|
||||
sign_kernel "std" ""
|
||||
sign_kernel "rt" "-rt"
|
||||
}
|
||||
|
||||
# sign_kernel - find and sign kernel package if we need to.
|
||||
# Kernels (and grub) are initially signed with temporary keys, so
|
||||
# we need to upload both the complete package, as well as the
|
||||
# unsigned binaries
|
||||
function sign_kernel
|
||||
{
|
||||
local KERNEL_PATH=$1
|
||||
local KERNEL_EXTRA=$2
|
||||
KERNEL=`find $MY_WORKSPACE/${KERNEL_PATH}/rpmbuild/RPMS -name "kernel${KERNEL_EXTRA}-[1-9]*.$ARCH.rpm"`
|
||||
UNSIGNED_KERNEL=`find $MY_WORKSPACE/${KERNEL_PATH}/rpmbuild/RPMS -name "kernel${KERNEL_EXTRA}-unsigned-[1-9]*.$ARCH.rpm"`
|
||||
if [ "x${KERNEL}" == "x" ]; then
|
||||
echo "Warning -- cannot find kernel package to sign in ${KERNEL_PATH}"
|
||||
return 0
|
||||
fi
|
||||
if [ "x${UNSIGNED_KERNEL}" == "x" ]; then
|
||||
echo "Warning -- cannot find unsigned kernel package to sign in ${KERNEL_PATH}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
sign kernel $KERNEL $UNSIGNED_KERNEL
|
||||
if [ $? -ne 0 ]; then
|
||||
return $?
|
||||
fi
|
||||
}
|
||||
|
||||
# rebuild_pkgs - rebuild any packages that need to be updated from the newly
|
||||
# signed binaries
|
||||
#
|
||||
function rebuild_pkgs
|
||||
{
|
||||
local LOGFILE="$MY_WORKSPACE/export/signed-rebuild.log"
|
||||
local PKGS_TO_REBUILD=${REBUILD_LIST}
|
||||
|
||||
if [ "x${PKGS_TO_REBUILD}" == "x" ]; then
|
||||
# No rebuilds required, return cleanly
|
||||
return 0
|
||||
fi
|
||||
|
||||
# If we reach this point, then we have one or more packages to be rebuilt
|
||||
|
||||
# first, update the repo so it is aware of the "latest" binaries
|
||||
update_repo std
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not update signed packages -- could not update repo"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Performing rebuild of packages: $PKGS_TO_REBUILD"
|
||||
FORMAL_BUILD=0 build-pkgs --no-descendants --no-build-info --no-required --careful $PKGS_TO_REBUILD > $LOGFILE 2>&1
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not rebuild packages: $PKGS_TO_REBUILD -- see $LOGFILE for details"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Done"
|
||||
return 0
|
||||
}
|
||||
|
||||
# sign <type_of_pkg> <pkg> [pkg_containing_unsigned_bins]
|
||||
#
|
||||
# This routine uploads a package to the signing server, instructs the signing
|
||||
# signing server to do its' magic, and downloads the updated (signed) package
|
||||
# from the signing server.
|
||||
#
|
||||
# Accessing the signing server -- the signing server cannot just be logged
|
||||
# into by anyone. A small number of users (Jason McKenna, Scott Little, Greg
|
||||
# Waines, etc) have permission to log in as themselves. In addition, there is
|
||||
# a user "signing" who is unique to the server. The "jenkins" user on our
|
||||
# build servers has permission to login/upload files as "signing" due to Jenkins'
|
||||
# private SSH key being added to the signing user's list of keys. This means
|
||||
# that Jenkins can upload and run commands on the server as "signing".
|
||||
#
|
||||
# In addition to uploading files as signing, the signing user has permissions to
|
||||
# run a single command (/opt/signing/sign.sh) as a sudo root user. The signing
|
||||
# user does not have access to modify the script or to run any other commands as
|
||||
# root. The sign.sh script will take inputs (the files that jenkins has
|
||||
# uploaded), verify the contents, sign the images against private keys, and
|
||||
# output a new .rpm contianing the signed version of the files. Assuming all
|
||||
# is successful, the filename of the signed output file is returned, and the
|
||||
# jenkins user can then use that filename to download the file (the "signing"
|
||||
# user does not have access to remove or modify the file once it's created).
|
||||
#
|
||||
# All operations done on the signing server are logged in muliple places, and
|
||||
# the output RPM artifacts are timestamped to ensure that they are not
|
||||
# overwritten by subsequent calls to sign.sh.
|
||||
#
|
||||
# kernel and grub package types require you to specify/upload the unsigned
|
||||
# packages as well as the normal binary
|
||||
function sign
|
||||
{
|
||||
local TYPE=$1
|
||||
local FILE=$2
|
||||
local UNSIGNED=$3
|
||||
local UNSIGNED_OPTION=""
|
||||
local TMPFILE=`mktemp /tmp/sign.XXXXXXXX`
|
||||
|
||||
# Don't sign if we've already signed it
|
||||
check_if_pkg_needs_signing ${FILE}
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Not signing ${FILE} as we previously signed it"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Signing $FILE"
|
||||
|
||||
# upload the original package
|
||||
scp -q $FILE $SIGNING_USER@$SIGNING_SERVER:$UPLOAD_PATH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to upload file $FILE"
|
||||
\rm -f $TMPFILE
|
||||
return 1
|
||||
fi
|
||||
|
||||
# upload the unsigned package (if specified)
|
||||
if [ "x$UNSIGNED" != "x" ]; then
|
||||
scp -q $UNSIGNED $SIGNING_USER@$SIGNING_SERVER:$UPLOAD_PATH
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to upload file $UNSIGNED"
|
||||
\rm -f $TMPFILE
|
||||
return 1
|
||||
fi
|
||||
UNSIGNED=$(basename $UNSIGNED)
|
||||
UNSIGNED_OPTION="-u $UPLOAD_PATH/$UNSIGNED"
|
||||
fi
|
||||
|
||||
# Call the magic script on the signing server. Note that the user
|
||||
# ($SIGNING_USER) has sudo permissions but only to invoke this one script.
|
||||
# The signing user cannot make other sudo calls.
|
||||
#
|
||||
# We place output in $TMPFILE to extract the output file name later
|
||||
#
|
||||
ssh $SIGNING_USER@$SIGNING_SERVER sudo $SIGNING_SCRIPT -i $UPLOAD_PATH/$(basename $FILE) $UNSIGNED_OPTION -t $TYPE > $TMPFILE 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Signing of $FILE failed"
|
||||
\rm -f $TMPFILE
|
||||
return 1
|
||||
fi
|
||||
|
||||
# The signing server script will output the name by which the newly signed
|
||||
# RPM can be found. This will be a unique filename (based on the unique
|
||||
# upload directory generated by the "-r" option above).
|
||||
#
|
||||
# The reason for this is so that we can archive all output files
|
||||
# and examine them later without them being overwriten. File paths are
|
||||
# typically of the form
|
||||
#
|
||||
# /export/signed_images/XXXXXXX_grub2-efi-2.02-0.44.el7.centos.tis.3.x86_64.rpm
|
||||
#
|
||||
# Extract the output name, and copy the RPM back into our system
|
||||
# (Note that we overwrite our original version of the RPM)
|
||||
#
|
||||
# Note that some packages (like grub) may produce multiple output RPMs (i.e.
|
||||
# multiple lines list output files.
|
||||
OUTPUT=`grep "Output written:" $TMPFILE | sed "s/Output written: //"`
|
||||
|
||||
# Check that we got something
|
||||
if [ "x$OUTPUT" == "x" ]; then
|
||||
echo "Could not determine output file -- check logs on signing server for errors"
|
||||
\cp $TMPFILE $MY_WORKSPACE/export/signing.log
|
||||
\rm -f $TMPFILE
|
||||
return 1
|
||||
fi
|
||||
|
||||
# The signing script can return multiple output files, if appropriate for
|
||||
# the input RPM source type. Copy each output RPM to our repo
|
||||
# Note that after we download the file we extract the base package name
|
||||
# from the RPM to find the name of the file that it *should* be named
|
||||
#
|
||||
# example:
|
||||
# we'd download "Zrqyeuzw_kernel-3.10.0-514.2.2.el7.20.tis.x86_64.rpm"
|
||||
# we'd figure out that the RPM name should be "kernel"
|
||||
# we look for "kernel" in the RPM filename, and rename
|
||||
# "Zrqyeuzw_kernel-3.10.0-514.2.2.el7.20.tis.x86_64.rpm" to
|
||||
# "kernel-3.10.0-514.2.2.el7.20.tis.x86_64.rpm"
|
||||
while read OUTPUT_FILE; do
|
||||
|
||||
# Download the file from the signing server
|
||||
local DOWNLOAD_FILENAME=$(basename $OUTPUT_FILE)
|
||||
scp -q $SIGNING_USER@$SIGNING_SERVER:$OUTPUT_FILE $(dirname $FILE)
|
||||
if [ $? -ne 0 ]; then
|
||||
\rm -f $TMPFILE
|
||||
echo "Copying file from signing server failed"
|
||||
return 1
|
||||
fi
|
||||
echo "Successfully retrieved $OUTPUT_FILE"
|
||||
|
||||
# figure out what the file should be named (strip away leading chars)
|
||||
local RPM_NAME=`rpm -qp $(dirname $FILE)/$DOWNLOAD_FILENAME --qf="%{name}"`
|
||||
local CORRECT_OUTPUT_FILE_NAME=`echo $DOWNLOAD_FILENAME | sed "s/^.*$RPM_NAME/$RPM_NAME/"`
|
||||
|
||||
# rename the file
|
||||
\mv -f $(dirname $FILE)/$DOWNLOAD_FILENAME $(dirname $FILE)/$CORRECT_OUTPUT_FILE_NAME
|
||||
|
||||
# replace the version of the file in results
|
||||
#
|
||||
# Potential hiccup in future -- this code currenty replaces any output file in EITHER
|
||||
# std or rt results which matches the filename we just downloaded from the signing.
|
||||
# server. This means there could be an issue where we sign something-ver-rel.arch.rpm
|
||||
# but we expect different versions of that RPM in std and in rt. Currently, we do not
|
||||
# have any RPMs which have that problem (all produced RPMs in rt have the "-rt" suffix
|
||||
# let along any "signed" rpms) but it's something of which to be aware.
|
||||
#
|
||||
# Also, note that we do not expect multiple RPMs in each repo to have the same filename.
|
||||
# We use "head -n 1" to handle that, but again it shouldn't happen.
|
||||
#
|
||||
for buildtype in std rt; do
|
||||
x=`find $MY_WORKSPACE/$buildtype/results/${MY_BUILD_ENVIRONMENT_TOP}-$buildtype -name $CORRECT_OUTPUT_FILE_NAME | head -n 1`
|
||||
if [ ! -z "$x" ]; then
|
||||
cp $(dirname $FILE)/$CORRECT_OUTPUT_FILE_NAME $x
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Have signed file $(dirname $FILE)/$CORRECT_OUTPUT_FILE_NAME"
|
||||
done <<< "$OUTPUT"
|
||||
|
||||
\rm -f $TMPFILE
|
||||
|
||||
# If we just signed a shim package, flag that shim needs to be rebuilt
|
||||
if [ "${TYPE}" == "shim" ]; then
|
||||
REBUILD_LIST="${REBUILD_LIST} shim-signed"
|
||||
fi
|
||||
|
||||
echo "Done"
|
||||
update_signed_pkg_list ${FILE}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Main script
|
||||
|
||||
if [ "x$MY_WORKSPACE" == "x" ]; then
|
||||
echo "Environment not set up -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ARCH="x86_64"
|
||||
SIGNING_SERVER=yow-tiks01
|
||||
SIGNING_USER=signing
|
||||
SIGNING_SCRIPT=/opt/signing/sign.sh
|
||||
UPLOAD_PATH=`ssh $SIGNING_USER@$SIGNING_SERVER sudo $SIGNING_SCRIPT -r`
|
||||
SIGNED_PKG_DB=${MY_WORKSPACE}/signed_pkg_list.txt
|
||||
REBUILD_LIST=""
|
||||
MY_BUILD_ENVIRONMENT_TOP=${MY_BUILD_ENVIRONMENT_TOP:-$MY_BUILD_ENVIRONMENT}
|
||||
|
||||
# Check that we were able to request a unique path for uploads
|
||||
echo $UPLOAD_PATH | grep -q "^Upload:"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to get upload path -- abort"
|
||||
exit 1
|
||||
fi
|
||||
UPLOAD_PATH=`echo $UPLOAD_PATH | sed "s%^Upload: %%"`
|
||||
|
||||
sign_kernels
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to sign kernels -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sign_shims
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to sign shims -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sign_grubs
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to sign grubs -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
update_repo std
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to update std repo -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rebuild_pkgs
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to update builds with signed dependancies -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
update_repo std
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to update std repo -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
update_repo rt
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to update rt repo -- abort"
|
||||
exit 1
|
||||
fi
|
||||
|
258
build-tools/sign-rpms
Executable file
258
build-tools/sign-rpms
Executable file
@ -0,0 +1,258 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Add file signature to RPMs
|
||||
#
|
||||
# This script will add file signature to rpms in a given directory.
|
||||
# The directory containing the RPMs must be passed as a parameter. There is no default location.
|
||||
#
|
||||
#
|
||||
|
||||
usage () {
|
||||
echo ""
|
||||
echo "Usage: "
|
||||
echo " sign-rpms -d|--pkg-dir <directory>"
|
||||
echo " -d --pkg-dir <directory> directory contain the RPMs to sign"
|
||||
echo " -h|--help this message"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# number of processors. The process will use all available processors by default.
|
||||
NPROCS=$(nproc)
|
||||
|
||||
export MOCK=/usr/bin/mock
|
||||
|
||||
# check input variables
|
||||
function check_vars {
|
||||
# need access to repo, which should normally be defined as MY_REPO in the env
|
||||
|
||||
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " unable to use \$MY_REPO (value \"$MY_REPO\")\n"
|
||||
printf " -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
||||
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
||||
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
||||
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
||||
printf " Found!\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
||||
printf " Error -- could not locate cgcs-root repo.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$MY_BUILD_ENVIRONMENT" ] ; then
|
||||
printf " Error -- missing environment variable MY_BUILD_ENVIRONMENT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$MY_BUILD_DIR" ] ; then
|
||||
printf " Error -- missing environment variable MY_BUILD_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
#
|
||||
# this function will add IMA file signatures to all rpms in the Packages directory
|
||||
#
|
||||
# the process will copy the signing key and a makefile in the mock env under /tmp
|
||||
# it will also mount the Packages directory under /mnt/Packages
|
||||
# then mock will be invoked to sign the packages
|
||||
#
|
||||
# This process is using mock because the build servers do not have the same rpm / rpmsign version
|
||||
#
|
||||
|
||||
|
||||
function sign_packages {
|
||||
OLD_PWD=$PWD
|
||||
|
||||
_MOCK_PKG_DIR=/mnt/Packages
|
||||
_IMA_PRIV_KEY=ima_signing_key.priv
|
||||
_KEY_DIR=$MY_REPO/build-tools/signing
|
||||
_MOCK_KEY_DIR=/mnt/keys
|
||||
_SIGN_MAKEFILE=_sign_pkgs.mk
|
||||
_MK_DIR=$MY_REPO/build-tools/mk
|
||||
_MOCK_MK_DIR=/mnt/mk
|
||||
|
||||
# mock confgiuration file
|
||||
_MOCK_CFG=$MY_BUILD_DIR/${MY_BUILD_ENVIRONMENT}-sign.cfg
|
||||
|
||||
# recreate configuration file
|
||||
rm $_MOCK_CFG
|
||||
export BUILD_TYPE=std
|
||||
export MY_BUILD_DIR_TOP=$MY_BUILD_DIR
|
||||
modify-build-cfg $_MOCK_CFG
|
||||
# and customize
|
||||
echo "config_opts['chroot_setup_cmd'] = 'install shadow-utils make rpm-sign'" >> $_MOCK_CFG
|
||||
echo "config_opts['root'] = 'mock-sign'" >> $_MOCK_CFG
|
||||
echo "config_opts['basedir'] = '${MY_WORKSPACE}'" >> $_MOCK_CFG
|
||||
echo "config_opts['cache_topdir'] = '${MY_WORKSPACE}/mock-cache'" >> $_MOCK_CFG
|
||||
|
||||
echo "Signing packages in $_PKG_DIR with $NPROCS threads"
|
||||
echo "using development key $_KEY_DIR/$_IMA_PRIV_KEY"
|
||||
|
||||
printf "Initializing mock environment\n"
|
||||
|
||||
# invoke make in mock to sign packages.
|
||||
# this call will also create and initialize the mock env
|
||||
eval $MOCK -q -r $_MOCK_CFG \'--plugin-option=bind_mount:dirs=[\(\"$_PKG_DIR\", \"$_MOCK_PKG_DIR\"\),\(\"$_MK_DIR\",\"$_MOCK_MK_DIR\"\),\(\"$_KEY_DIR\",\"$_MOCK_KEY_DIR\"\)]\' --shell \"cd $_MOCK_PKG_DIR\; make -j $NPROCS -f $_MOCK_MK_DIR/$_SIGN_MAKEFILE KEY=$_MOCK_KEY_DIR/$_IMA_PRIV_KEY\"
|
||||
|
||||
retval=$?
|
||||
|
||||
printf "Cleaning mock environment\n"
|
||||
$MOCK -q -r $_MOCK_CFG --scrub=all
|
||||
|
||||
if [ $retval -ne 0 ] ; then
|
||||
echo "failed to add file signatures to RPMs in mock environment."
|
||||
return $retval
|
||||
fi
|
||||
|
||||
cd $OLD_PWD
|
||||
|
||||
}
|
||||
|
||||
function _copy_and_sign {
|
||||
|
||||
# upload rpms to server
|
||||
scp $_PKG_DIR/*.rpm $SIGNING_USER@$SIGNING_SERVER:$_UPLOAD_DIR
|
||||
retval=$?
|
||||
if [ $retval -ne 0 ] ; then
|
||||
echo "ERROR: failed to copy RPM files to signing server."
|
||||
return $retval
|
||||
fi
|
||||
|
||||
# get server to sign packages.
|
||||
ssh $SIGNING_USER@$SIGNING_SERVER -- sudo $SIGNING_SERVER_SCRIPT -s -d $sub
|
||||
retval=$?
|
||||
if [ $retval -ne 0 ] ; then
|
||||
echo "ERROR: failed to sign RPM files."
|
||||
return $retval
|
||||
fi
|
||||
|
||||
# download results back. This overwrites the original files.
|
||||
scp $SIGNING_USER@$SIGNING_SERVER:$_UPLOAD_DIR/*.rpm $_PKG_DIR
|
||||
retval=$?
|
||||
if [ $retval -ne 0 ] ; then
|
||||
echo "ERROR: failed to copy signed RPM files back from signing server."
|
||||
return $retval
|
||||
fi
|
||||
|
||||
return $retval
|
||||
|
||||
}
|
||||
|
||||
|
||||
function sign_packages_on_server {
|
||||
|
||||
retval=0
|
||||
|
||||
# obtain temporary diretory to upload RPMs on signing server
|
||||
_UPLOAD_DIR=`ssh $SIGNING_USER@$SIGNING_SERVER -- sudo $SIGNING_SERVER_SCRIPT -r`
|
||||
|
||||
retval=$?
|
||||
if [ $retval -ne 0 ] ; then
|
||||
echo "failed to obtain upload directory from signing server."
|
||||
return $retval
|
||||
fi
|
||||
|
||||
# extract base chroot dir and rpm dir within chroot
|
||||
read base com sub <<< $_UPLOAD_DIR
|
||||
|
||||
# this is the upload temp dir, outside of chroot env
|
||||
_UPLOAD_DIR=$base$sub
|
||||
|
||||
_copy_and_sign
|
||||
retval=$?
|
||||
|
||||
# cleanup
|
||||
ssh $SIGNING_USER@$SIGNING_SERVER rm $_UPLOAD_DIR/*.rpm
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Warning : failed to remove rpms from temporary upload directory."
|
||||
fi
|
||||
ssh $SIGNING_USER@$SIGNING_SERVER rmdir $_UPLOAD_DIR
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Warning : failed to remove temporary upload directory."
|
||||
fi
|
||||
|
||||
return $retval
|
||||
}
|
||||
|
||||
|
||||
|
||||
#############################################
|
||||
# Main code
|
||||
#############################################
|
||||
|
||||
# Check args
|
||||
HELP=0
|
||||
SIGNING_SERVER=yow-tiks01
|
||||
SIGNING_USER=signing
|
||||
SIGNING_SERVER_SCRIPT=/opt/signing/sign_rpms_18.03.sh
|
||||
|
||||
# return value
|
||||
retval=0
|
||||
|
||||
# read the options
|
||||
TEMP=`getopt -o hd: --long help,pkg-dir: -n 'test.sh' -- "$@"`
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Invalid parameters - exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
eval set -- "$TEMP"
|
||||
|
||||
# extract options and their arguments into variables.
|
||||
while true ; do
|
||||
case "$1" in
|
||||
-h|--help) HELP=1 ; shift ;;
|
||||
-d|--pkg-dir) _PKG_DIR="$2"; shift; shift ;;
|
||||
--) shift ; break ;;
|
||||
*) echo "Internal error : unexpected parameter $2" ; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ $HELP -eq 1 ]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# package directory must be defined
|
||||
if [ -z "$_PKG_DIR" ]; then
|
||||
echo "Need package directory. Use -d/--pkg-dir option"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ... and must exist
|
||||
if [ ! -d "$_PKG_DIR" ]; then
|
||||
echo "Package directory $_PKG_DIR does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Init variables
|
||||
check_vars
|
||||
|
||||
echo signing $_PKG_DIR
|
||||
|
||||
# sign all rpms
|
||||
if [ "$USER" == "jenkins" ]; then
|
||||
sign_packages_on_server
|
||||
retval=$?
|
||||
else
|
||||
sign_packages
|
||||
retval=$?
|
||||
fi
|
||||
|
||||
exit $retval
|
||||
|
62
build-tools/sign_iso_formal.sh
Executable file
62
build-tools/sign_iso_formal.sh
Executable file
@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script makes a request to the signing server to sign a .iso with the
|
||||
# formal key. It will only work for users authorized to access the signing
|
||||
# server. The detached signature is placed in the same path as the .iso as
|
||||
# the file bootimage.sig
|
||||
#
|
||||
# Script written to be quite simple
|
||||
|
||||
if [ "x$1" == "x" ]; then
|
||||
echo "You must specify an ISO file to sign"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ISO_FILE_PATH=$1
|
||||
ISO_FILE_NAME=$(basename ${ISO_FILE_PATH})
|
||||
ISO_FILE_ROOT=$(dirname ${ISO_FILE_PATH})
|
||||
ISO_FILE_NOEXT="${ISO_FILE_NAME%.*}"
|
||||
SIGNING_SERVER="signing@yow-tiks01"
|
||||
GET_UPLOAD_PATH="sudo /opt/signing/sign.sh -r"
|
||||
REQUEST_SIGN="sudo /opt/signing/sign_iso.sh"
|
||||
SIGNATURE_FILE="$ISO_FILE_NOEXT.sig"
|
||||
|
||||
# Make a request for an upload path
|
||||
# Output is a path where we can upload stuff, of the form
|
||||
# "Upload: /tmp/sign_upload.5jR11pS0"
|
||||
UPLOAD_PATH=`ssh ${SIGNING_SERVER} ${GET_UPLOAD_PATH}`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not get upload path. Do you have permissions on the signing server?"
|
||||
exit 1
|
||||
fi
|
||||
UPLOAD_PATH=`echo ${UPLOAD_PATH} | cut -d ' ' -f 2`
|
||||
|
||||
echo "Uploading file"
|
||||
scp -q ${ISO_FILE_PATH} ${SIGNING_SERVER}:${UPLOAD_PATH}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not upload ISO"
|
||||
exit 1
|
||||
fi
|
||||
echo "File uploaded to signing server -- signing"
|
||||
|
||||
# Make the signing request.
|
||||
# Output is path of detached signature
|
||||
RESULT=`ssh ${SIGNING_SERVER} ${REQUEST_SIGN} ${UPLOAD_PATH}/${ISO_FILE_NAME}`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not perform signing -- output $RESULT"
|
||||
ssh ${SIGNING_SERVER} rm -f ${UPLOAD_PATH}/${ISO_FILE_NAME}
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Signing complete. Downloading detached signature"
|
||||
scp -q ${SIGNING_SERVER}:${RESULT} ${ISO_FILE_ROOT}/${SIGNATURE_FILE}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not download newly signed file"
|
||||
ssh ${SIGNING_SERVER} rm -f ${UPLOAD_PATH}/${ISO_FILE_NAME}
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up (ISOs are big)
|
||||
ssh ${SIGNING_SERVER} rm -f ${UPLOAD_PATH}/${ISO_FILE_NAME}
|
||||
|
||||
echo "${ISO_FILE_ROOT}/${SIGNATURE_FILE} detached signature"
|
51
build-tools/sign_patch_formal.sh
Executable file
51
build-tools/sign_patch_formal.sh
Executable file
@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script makes a request to the signing server to sign a .patch with the
|
||||
# formal key. It will only work for users authorized to access the signing
|
||||
# server.
|
||||
#
|
||||
# Script written to be quite simple
|
||||
|
||||
if [ "x$1" == "x" ]; then
|
||||
echo "You must specify a patch file to sign"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PATCH_FILE_PATH=$1
|
||||
PATCH_FILE_NAME=$(basename ${PATCH_FILE_PATH})
|
||||
SIGNING_SERVER="signing@yow-tiks01"
|
||||
GET_UPLOAD_PATH="sudo /opt/signing/sign.sh -r"
|
||||
REQUEST_SIGN="sudo /opt/signing/sign_patch.sh"
|
||||
|
||||
# Make a request for an upload path
|
||||
# Output is a path where we can upload stuff, of the form
|
||||
# "Upload: /tmp/sign_upload.5jR11pS0"
|
||||
UPLOAD_PATH=`ssh ${SIGNING_SERVER} ${GET_UPLOAD_PATH}`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not get upload path. Do you have permissions on the signing server?"
|
||||
exit 1
|
||||
fi
|
||||
UPLOAD_PATH=`echo ${UPLOAD_PATH} | cut -d ' ' -f 2`
|
||||
|
||||
scp -q ${PATCH_FILE_PATH} ${SIGNING_SERVER}:${UPLOAD_PATH}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could upload patch"
|
||||
exit 1
|
||||
fi
|
||||
echo "File uploaded to signing server"
|
||||
|
||||
# Make the signing request.
|
||||
# Output is path of newly signed file
|
||||
RESULT=`ssh ${SIGNING_SERVER} ${REQUEST_SIGN} ${UPLOAD_PATH}/${PATCH_FILE_NAME}`
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not perform signing -- output $RESULT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Signing complete. Downloading"
|
||||
scp -q ${SIGNING_SERVER}:${RESULT} ${PATCH_FILE_PATH}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Could not download newly signed file"
|
||||
exit 1
|
||||
fi
|
||||
echo "${PATCH_FILE_PATH} now signed with formal key"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user