Moving tinyipa to IPA-B from IPA
Task: 30071 Story: 2005114 Change-Id: Ic0694e120163efaa623b6bff9f58963460c1577e
This commit is contained in:
parent
5c6ce6d77d
commit
5cdadc54ee
13
tinyipa/.gitignore
vendored
Normal file
13
tinyipa/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
*.gz
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
tinyipabuild
|
||||||
|
tinyipafinal
|
||||||
|
*.vmlinuz
|
||||||
|
vmlinuz64
|
||||||
|
*.sha256
|
||||||
|
*.iso
|
||||||
|
*.tcz*
|
||||||
|
squashfs-root
|
||||||
|
syslinux*
|
||||||
|
newiso
|
45
tinyipa/Makefile
Normal file
45
tinyipa/Makefile
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
.PHONY: default all dependencies build finalise addssh iso clean clean_build clean_iso
|
||||||
|
default: dependencies build finalise instance-images
|
||||||
|
|
||||||
|
all: dependencies build finalise iso instance-images
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
./install-deps.sh
|
||||||
|
|
||||||
|
build:
|
||||||
|
./build-tinyipa.sh
|
||||||
|
|
||||||
|
finalise:
|
||||||
|
./finalise-tinyipa.sh
|
||||||
|
|
||||||
|
addssh:
|
||||||
|
./add-ssh-tinyipa.sh
|
||||||
|
|
||||||
|
iso:
|
||||||
|
./build-iso.sh
|
||||||
|
|
||||||
|
instance-images:
|
||||||
|
./build-instance-images.sh
|
||||||
|
|
||||||
|
clean: clean_build clean_iso
|
||||||
|
|
||||||
|
clean_build:
|
||||||
|
sudo -v
|
||||||
|
sudo rm -rf tinyipabuild
|
||||||
|
sudo rm -rf tinyipafinal
|
||||||
|
sudo rm -rf tinyipaaddssh
|
||||||
|
rm -f *tinyipa*.vmlinuz
|
||||||
|
rm -f *tinyipa*.gz
|
||||||
|
rm -f *tinyipa*.sha256
|
||||||
|
rm -f build_files/corepure64.gz
|
||||||
|
rm -f build_files/vmlinuz64
|
||||||
|
rm -f build_files/*.tcz
|
||||||
|
rm -f build_files/*.tcz.*
|
||||||
|
rm -f tiny-instance-part*.img
|
||||||
|
rm -f tiny-instance-uec*.tar.gz
|
||||||
|
|
||||||
|
clean_iso:
|
||||||
|
rm -rf newiso
|
||||||
|
rm -f build_files/syslinux-4.06.tar.gz
|
||||||
|
rm -rf build_files/syslinux-4.06
|
||||||
|
rm -f tinyipa.iso
|
146
tinyipa/README.rst
Normal file
146
tinyipa/README.rst
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
=============================
|
||||||
|
Tiny Core Ironic Python Agent
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Build script requirements
|
||||||
|
-------------------------
|
||||||
|
For the main build script:
|
||||||
|
|
||||||
|
* wget
|
||||||
|
* pip
|
||||||
|
* unzip
|
||||||
|
* sudo
|
||||||
|
* awk
|
||||||
|
* mksquashfs
|
||||||
|
|
||||||
|
For building an ISO you'll also need:
|
||||||
|
|
||||||
|
* genisoimage
|
||||||
|
|
||||||
|
Instructions:
|
||||||
|
-------------
|
||||||
|
To create a new ramdisk, run::
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
or::
|
||||||
|
|
||||||
|
./build-tinyipa.sh && ./finalise-tinyipa.sh
|
||||||
|
|
||||||
|
This will create two new files once completed:
|
||||||
|
|
||||||
|
* tinyipa.vmlinuz
|
||||||
|
* tinyipa.gz
|
||||||
|
|
||||||
|
These are your two files to upload to glance for use with Ironic.
|
||||||
|
|
||||||
|
Building an ISO from a previous make run:
|
||||||
|
-----------------------------------------
|
||||||
|
Once you've built tinyipa it is possible to pack it into an ISO if required. To
|
||||||
|
create a bootable ISO, run::
|
||||||
|
|
||||||
|
make iso
|
||||||
|
|
||||||
|
or::
|
||||||
|
|
||||||
|
./build-iso.sh
|
||||||
|
|
||||||
|
This will create one new file once completed:
|
||||||
|
|
||||||
|
* tinyipa.iso
|
||||||
|
|
||||||
|
To build a fresh ramdisk and build an iso from it:
|
||||||
|
--------------------------------------------------
|
||||||
|
Run::
|
||||||
|
|
||||||
|
make all
|
||||||
|
|
||||||
|
To clean up the whole build environment run:
|
||||||
|
--------------------------------------------
|
||||||
|
Run::
|
||||||
|
|
||||||
|
make clean
|
||||||
|
|
||||||
|
For cleaning up just the iso or just the ramdisk build::
|
||||||
|
|
||||||
|
make clean_iso
|
||||||
|
|
||||||
|
or::
|
||||||
|
|
||||||
|
make clean_build
|
||||||
|
|
||||||
|
Advanced options
|
||||||
|
----------------
|
||||||
|
|
||||||
|
(De)Optimizing the image
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If you want the build script to preinstall everything into the ramdisk,
|
||||||
|
instead of loading some things at runtime (this results in a slightly bigger
|
||||||
|
ramdisk), before running make or build-tinyipa.sh run::
|
||||||
|
|
||||||
|
export BUILD_AND_INSTALL_TINYIPA=true
|
||||||
|
|
||||||
|
By default, building TinyIPA will compile most of the Python code to
|
||||||
|
optimized ``*.pyo`` files, completely remove most of ``*.py`` and ``*.pyc``
|
||||||
|
files, and run ironic-python-agent with ``PYTHONOPTIMIZE=1``
|
||||||
|
to save space on the ramdisk.
|
||||||
|
If instead you want a normal Python experience inside the image,
|
||||||
|
for example for debugging/hacking on IPA in a running ramdisk,
|
||||||
|
before running make or build-tinyipa.sh run::
|
||||||
|
|
||||||
|
export PYOPTIMIZE_TINYIPA=false
|
||||||
|
|
||||||
|
|
||||||
|
Enabling/disabling SSH access to the ramdisk
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
By default tinyipa will be built with OpenSSH server installed but no
|
||||||
|
public SSH keys authorized to access it.
|
||||||
|
|
||||||
|
If you want to enable SSH access to the image, set ``AUTHORIZE_SSH`` variable
|
||||||
|
in your shell before building the tinyipa::
|
||||||
|
|
||||||
|
export AUTHORIZE_SSH=true
|
||||||
|
|
||||||
|
By default it will use public RSA or DSA keys of the user running the build.
|
||||||
|
To provide other public SSH key, export path to it in your shell before
|
||||||
|
building tinyipa as follows::
|
||||||
|
|
||||||
|
export SSH_PUBLIC_KEY=<full-path-to-public-key>
|
||||||
|
|
||||||
|
If you want to disable SSH altogether, set ``INSTALL_SSH`` variable in your
|
||||||
|
shell to ``false`` before building the tinyipa::
|
||||||
|
|
||||||
|
export INSTALL_SSH=false
|
||||||
|
|
||||||
|
You can also rebuild an already built tinyipa image by using ``addssh`` make
|
||||||
|
tagret::
|
||||||
|
|
||||||
|
make addssh
|
||||||
|
|
||||||
|
This will fetch the pre-built tinyipa image from "tarballs.openstack.org"
|
||||||
|
using the version specified as ``BRANCH_NAME`` shell variable as described
|
||||||
|
above, or it may use an already downloaded ramdisk image if path to it is set
|
||||||
|
as ``TINYIPA_RAMDISK_FILE`` shell variable before running this make target.
|
||||||
|
It will install and configure OpenSSH if needed and add public SSH keys for
|
||||||
|
``tc`` user using the same ``SSH_PUBLIC_KEY`` shell variable as described
|
||||||
|
above.
|
||||||
|
|
||||||
|
Enabling biosdevname in the ramdisk
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If you want to collect BIOS given names of NICs in the inventory, set
|
||||||
|
``TINYIPA_REQUIRE_BIOSDEVNAME`` variable in your shell before building the
|
||||||
|
tinyipa::
|
||||||
|
|
||||||
|
export TINYIPA_REQUIRE_BIOSDEVNAME=true
|
||||||
|
|
||||||
|
Using ironic-lib from source
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
`ironic-lib <https://opendev.org/openstack/ironic-lib>`_ contains
|
||||||
|
important parts of the provisioning logic. If you need to build an IPA image
|
||||||
|
with your local checkout of `ironic-lib`, export the following variable::
|
||||||
|
|
||||||
|
export IRONIC_LIB_SOURCE=/absolute/path/to/ironic-lib/checkout
|
139
tinyipa/add-ssh-tinyipa.sh
Executable file
139
tinyipa/add-ssh-tinyipa.sh
Executable file
@ -0,0 +1,139 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Rebuild upstream pre-built tinyipa it to be usable with ansible-deploy.
|
||||||
|
#
|
||||||
|
# Downloads the pre-built tinyipa ramdisk from tarballs.openstack.org or
|
||||||
|
# rebuilds a ramdisk under path set as TINYIPA_RAMDISK_FILE shell var.
|
||||||
|
|
||||||
|
# During rebuild this script installs and configures OpenSSH server if needed
|
||||||
|
# and makes required changes for Ansible + Python to work in compiled/optimized
|
||||||
|
# Python environment.
|
||||||
|
#
|
||||||
|
# By default, id_rsa or id_dsa keys of the user performing the build
|
||||||
|
# are baked into the image as authorized_keys for 'tc' user.
|
||||||
|
# To supply different public ssh key, befor running this script set
|
||||||
|
# SSH_PUBLIC_KEY environment variable to point to absolute path to the key.
|
||||||
|
#
|
||||||
|
# This script produces "ansible-<tinyipa-ramdisk-name>" ramdisk that can serve
|
||||||
|
# as ramdisk for both ansible-deploy driver and agent-based Ironic drivers,
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
REBUILDDIR="$WORKDIR/tinyipaaddssh"
|
||||||
|
DST_DIR=$REBUILDDIR
|
||||||
|
source ${WORKDIR}/common.sh
|
||||||
|
|
||||||
|
TINYCORE_MIRROR_URL=${TINYCORE_MIRROR_URL:-}
|
||||||
|
BRANCH_PATH=${BRANCH_PATH:-master}
|
||||||
|
TINYIPA_RAMDISK_FILE=${TINYIPA_RAMDISK_FILE:-}
|
||||||
|
|
||||||
|
SSH_PUBLIC_KEY=${SSH_PUBLIC_KEY:-}
|
||||||
|
|
||||||
|
function validate_params {
|
||||||
|
echo "Validating location of public SSH key"
|
||||||
|
if [ -n "$SSH_PUBLIC_KEY" ]; then
|
||||||
|
if [ -r "$SSH_PUBLIC_KEY" ]; then
|
||||||
|
_found_ssh_key="$SSH_PUBLIC_KEY"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
for fmt in rsa dsa; do
|
||||||
|
if [ -r "$HOME/.ssh/id_$fmt.pub" ]; then
|
||||||
|
_found_ssh_key="$HOME/.ssh/id_$fmt.pub"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z $_found_ssh_key ]; then
|
||||||
|
echo "Failed to find neither provided nor default SSH key"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_tinyipa {
|
||||||
|
if [ -z $TINYIPA_RAMDISK_FILE ]; then
|
||||||
|
mkdir -p $WORKDIR/build_files/cache
|
||||||
|
cd $WORKDIR/build_files/cache
|
||||||
|
wget -N https://tarballs.openstack.org/ironic-python-agent/tinyipa/files/tinyipa${BRANCH_EXT}.gz
|
||||||
|
TINYIPA_RAMDISK_FILE="$WORKDIR/build_files/cache/tinyipa${BRANCH_EXT}.gz"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function unpack_ramdisk {
|
||||||
|
|
||||||
|
if [ -d "$REBUILDDIR" ]; then
|
||||||
|
sudo rm -rf "$REBUILDDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$REBUILDDIR"
|
||||||
|
|
||||||
|
# Extract rootfs from .gz file
|
||||||
|
( cd "$REBUILDDIR" && zcat "$TINYIPA_RAMDISK_FILE" | sudo cpio -i -H newc -d )
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_ssh {
|
||||||
|
if [ ! -f "$REBUILDDIR/usr/local/etc/ssh/sshd_config" ]; then
|
||||||
|
# tinyipa was built without SSH server installed
|
||||||
|
# Install and configure bare minimum for SSH access
|
||||||
|
$TC_CHROOT_CMD tce-load -wic openssh
|
||||||
|
# Configure OpenSSH
|
||||||
|
$CHROOT_CMD cp /usr/local/etc/ssh/sshd_config.orig /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "PasswordAuthentication no" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
# Generate and configure host keys - RSA, DSA, Ed25519
|
||||||
|
# NOTE(pas-ha) ECDSA host key will still be re-generated fresh on every image boot
|
||||||
|
$CHROOT_CMD ssh-keygen -q -t rsa -N "" -f /usr/local/etc/ssh/ssh_host_rsa_key
|
||||||
|
$CHROOT_CMD ssh-keygen -q -t dsa -N "" -f /usr/local/etc/ssh/ssh_host_dsa_key
|
||||||
|
$CHROOT_CMD ssh-keygen -q -t ed25519 -N "" -f /usr/local/etc/ssh/ssh_host_ed25519_key
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_rsa_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_dsa_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_ed25519_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
fi
|
||||||
|
|
||||||
|
# setup new user SSH keys anyway
|
||||||
|
$CHROOT_CMD mkdir -p /home/tc
|
||||||
|
$CHROOT_CMD chown -R tc.staff /home/tc
|
||||||
|
$TC_CHROOT_CMD mkdir -p /home/tc/.ssh
|
||||||
|
cat $_found_ssh_key | $TC_CHROOT_CMD tee /home/tc/.ssh/authorized_keys
|
||||||
|
$CHROOT_CMD chown tc.staff /home/tc/.ssh/authorized_keys
|
||||||
|
$TC_CHROOT_CMD chmod 600 /home/tc/.ssh/authorized_keys
|
||||||
|
}
|
||||||
|
|
||||||
|
function fix_python_optimize {
|
||||||
|
if grep -q "PYTHONOPTIMIZE=1" "$REBUILDDIR/opt/bootlocal.sh"; then
|
||||||
|
# tinyipa was built with optimized Python environment, apply fixes
|
||||||
|
echo "PYTHONOPTIMIZE=1" | $TC_CHROOT_CMD tee -a /home/tc/.ssh/environment
|
||||||
|
echo "PermitUserEnvironment yes" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo 'Defaults env_keep += "PYTHONOPTIMIZE"' | $CHROOT_CMD tee -a /etc/sudoers
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function rebuild_ramdisk {
|
||||||
|
# Rebuild build directory into gz file
|
||||||
|
ansible_basename="ansible-$(basename $TINYIPA_RAMDISK_FILE)"
|
||||||
|
( cd "$REBUILDDIR" && sudo find | sudo cpio -o -H newc | gzip -9 > "$WORKDIR/${ansible_basename}" )
|
||||||
|
# Output file created by this script and its size
|
||||||
|
cd "$WORKDIR"
|
||||||
|
echo "Produced files:"
|
||||||
|
du -h "${ansible_basename}"
|
||||||
|
}
|
||||||
|
|
||||||
|
sudo -v
|
||||||
|
|
||||||
|
|
||||||
|
validate_params
|
||||||
|
get_tinyipa
|
||||||
|
unpack_ramdisk
|
||||||
|
setup_tce "$DST_DIR"
|
||||||
|
|
||||||
|
# NOTE (pas-ha) default tinyipa is built without SSH access, enable it here
|
||||||
|
install_ssh
|
||||||
|
# NOTE(pas-ha) default tinyipa is built with PYOPTIMIZE_TINYIPA=true and
|
||||||
|
# for Ansible+python to work we need to ensure that PYTHONOPTIMIZE=1 is
|
||||||
|
# set for all sessions from 'tc' user including those that are escalated
|
||||||
|
# with 'sudo' afterwards
|
||||||
|
fix_python_optimize
|
||||||
|
|
||||||
|
cleanup_tce "$DST_DIR"
|
||||||
|
rebuild_ramdisk
|
36
tinyipa/build-instance-images.sh
Executable file
36
tinyipa/build-instance-images.sh
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
DST_DIR=$(mktemp -d)
|
||||||
|
source ${WORKDIR}/common.sh
|
||||||
|
PARTIMG="$WORKDIR/tiny-instance-part${BRANCH_EXT}.img"
|
||||||
|
UECFILE="$WORKDIR/tiny-instance-uec${BRANCH_EXT}.tar.gz"
|
||||||
|
fs_type='ext4'
|
||||||
|
|
||||||
|
sudo rm -rf $PARTIMG $UECFILE
|
||||||
|
sudo truncate --size=150M $PARTIMG
|
||||||
|
|
||||||
|
sudo mkfs."${fs_type}" -F "$PARTIMG" -L "root"
|
||||||
|
sudo mount -o loop "$PARTIMG" "$DST_DIR/"
|
||||||
|
|
||||||
|
# Extract rootfs from .gz file
|
||||||
|
( cd "$DST_DIR" && zcat $WORKDIR/build_files/corepure64.gz | sudo cpio -i -H newc -d )
|
||||||
|
|
||||||
|
setup_tce $DST_DIR
|
||||||
|
|
||||||
|
$TC_CHROOT_CMD tce-load -wci grub2-multi.tcz
|
||||||
|
|
||||||
|
cleanup_tce $DST_DIR
|
||||||
|
sudo umount $DST_DIR/
|
||||||
|
|
||||||
|
pushd $DST_DIR/
|
||||||
|
cp $WORKDIR/tinyipa${BRANCH_EXT}.gz $DST_DIR/tinyipa-initrd
|
||||||
|
cp $WORKDIR/tinyipa${BRANCH_EXT}.vmlinuz $DST_DIR/tinyipa-vmlinuz
|
||||||
|
cp $PARTIMG $DST_DIR/
|
||||||
|
|
||||||
|
tar -czf $UECFILE ./
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
sudo rm -rf $DST_DIR
|
16
tinyipa/build-iso.sh
Executable file
16
tinyipa/build-iso.sh
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
|
||||||
|
cd $WORKDIR/build_files
|
||||||
|
wget -N https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.06.tar.gz && tar zxf syslinux-4.06.tar.gz
|
||||||
|
|
||||||
|
cd $WORKDIR
|
||||||
|
rm -rf newiso
|
||||||
|
mkdir -p newiso/boot/isolinux
|
||||||
|
cp build_files/syslinux-4.06/core/isolinux.bin newiso/boot/isolinux/.
|
||||||
|
cp build_files/isolinux.cfg newiso/boot/isolinux/.
|
||||||
|
cp tinyipa.gz newiso/boot/corepure64.gz
|
||||||
|
cp tinyipa.vmlinuz newiso/boot/vmlinuz64
|
||||||
|
genisoimage -l -r -J -R -V TC-custom -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o tinyipa.iso newiso
|
198
tinyipa/build-tinyipa.sh
Executable file
198
tinyipa/build-tinyipa.sh
Executable file
@ -0,0 +1,198 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
source ${WORKDIR}/tc-mirror.sh
|
||||||
|
BUILDDIR="$WORKDIR/tinyipabuild"
|
||||||
|
BUILD_AND_INSTALL_TINYIPA=${BUILD_AND_INSTALL_TINYIPA:-false}
|
||||||
|
TINYCORE_MIRROR_URL=${TINYCORE_MIRROR_URL:-}
|
||||||
|
TINYIPA_REQUIRE_BIOSDEVNAME=${TINYIPA_REQUIRE_BIOSDEVNAME:-false}
|
||||||
|
TINYIPA_REQUIRE_IPMITOOL=${TINYIPA_REQUIRE_IPMITOOL:-true}
|
||||||
|
IRONIC_LIB_SOURCE=${IRONIC_LIB_SOURCE:-}
|
||||||
|
USE_PYTHON3=${USE_PYTHON3:-True}
|
||||||
|
|
||||||
|
CHROOT_PATH="/tmp/overides:/usr/local/sbin:/usr/local/bin:/apps/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
CHROOT_CMD="sudo chroot $BUILDDIR /usr/bin/env -i PATH=$CHROOT_PATH http_proxy=$http_proxy https_proxy=$https_proxy no_proxy=$no_proxy"
|
||||||
|
|
||||||
|
TC=1001
|
||||||
|
STAFF=50
|
||||||
|
|
||||||
|
# NOTE(moshele): Git < 1.7.10 requires a separate checkout, see LP #1590912
|
||||||
|
function clone_and_checkout {
|
||||||
|
git clone $1 $2 --depth=1 --branch $3; cd $2; git checkout $3; cd -
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Building tinyipa:"
|
||||||
|
|
||||||
|
# Ensure we have an extended sudo to prevent the need to enter a password over
|
||||||
|
# and over again.
|
||||||
|
sudo -v
|
||||||
|
|
||||||
|
# If an old build directory exists remove it
|
||||||
|
if [ -d "$BUILDDIR" ]; then
|
||||||
|
sudo rm -rf "$BUILDDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
##############################################
|
||||||
|
# Download and Cache Tiny Core Files
|
||||||
|
##############################################
|
||||||
|
|
||||||
|
# Find a working TC mirror if none is explicitly provided
|
||||||
|
choose_tc_mirror
|
||||||
|
|
||||||
|
cd $WORKDIR/build_files
|
||||||
|
wget -N $TINYCORE_MIRROR_URL/8.x/x86_64/release/distribution_files/corepure64.gz
|
||||||
|
wget -N $TINYCORE_MIRROR_URL/8.x/x86_64/release/distribution_files/vmlinuz64
|
||||||
|
cd $WORKDIR
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Build Required Python Dependecies in a Build Directory
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# Make directory for building in
|
||||||
|
mkdir "$BUILDDIR"
|
||||||
|
|
||||||
|
# Extract rootfs from .gz file
|
||||||
|
( cd "$BUILDDIR" && zcat $WORKDIR/build_files/corepure64.gz | sudo cpio -i -H newc -d )
|
||||||
|
|
||||||
|
# Configure mirror
|
||||||
|
sudo sh -c "echo $TINYCORE_MIRROR_URL > $BUILDDIR/opt/tcemirror"
|
||||||
|
|
||||||
|
# Download TGT, Qemu-utils, Biosdevname and IPMItool source
|
||||||
|
clone_and_checkout "https://github.com/fujita/tgt.git" "${BUILDDIR}/tmp/tgt" "v1.0.62"
|
||||||
|
clone_and_checkout "https://github.com/qemu/qemu.git" "${BUILDDIR}/tmp/qemu" "v2.5.0"
|
||||||
|
clone_and_checkout "https://github.com/lyonel/lshw.git" "${BUILDDIR}/tmp/lshw" "B.02.18"
|
||||||
|
if $TINYIPA_REQUIRE_BIOSDEVNAME; then
|
||||||
|
wget -N -O - https://linux.dell.com/biosdevname/biosdevname-0.7.2/biosdevname-0.7.2.tar.gz | tar -xz -C "${BUILDDIR}/tmp" -f -
|
||||||
|
fi
|
||||||
|
if $TINYIPA_REQUIRE_IPMITOOL; then
|
||||||
|
wget -N -O - https://github.com/ipmitool/ipmitool/archive/IPMITOOL_1_8_18.tar.gz | tar -xz -C "${BUILDDIR}/tmp" -f -
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create directory for python local mirror
|
||||||
|
mkdir -p "$BUILDDIR/tmp/localpip"
|
||||||
|
|
||||||
|
# Download IPA and requirements
|
||||||
|
IPA_SOURCE_DIR=${IPA_SOURCE_DIR:-/opt/stack/ironic-python-agent}
|
||||||
|
cd $IPA_SOURCE_DIR
|
||||||
|
rm -rf *.egg-info
|
||||||
|
pwd
|
||||||
|
python setup.py sdist --dist-dir "$BUILDDIR/tmp/localpip" --quiet
|
||||||
|
ls $BUILDDIR/tmp/localpip || true
|
||||||
|
cp requirements.txt $BUILDDIR/tmp/ipa-requirements.txt
|
||||||
|
|
||||||
|
if [ -n "$IRONIC_LIB_SOURCE" ]; then
|
||||||
|
pushd $IRONIC_LIB_SOURCE
|
||||||
|
rm -rf *.egg-info
|
||||||
|
python setup.py sdist --dist-dir "$BUILDDIR/tmp/localpip" --quiet
|
||||||
|
cp requirements.txt $BUILDDIR/tmp/ironic-lib-requirements.txt
|
||||||
|
popd
|
||||||
|
fi
|
||||||
|
|
||||||
|
imagebuild/common/generate_upper_constraints.sh upper-constraints.txt
|
||||||
|
if [ -n "$IRONIC_LIB_SOURCE" ]; then
|
||||||
|
sed -i '/ironic-lib/d' upper-constraints.txt $BUILDDIR/tmp/ipa-requirements.txt
|
||||||
|
fi
|
||||||
|
cp upper-constraints.txt $BUILDDIR/tmp/upper-constraints.txt
|
||||||
|
echo Using upper-constraints:
|
||||||
|
cat upper-constraints.txt
|
||||||
|
cd $WORKDIR
|
||||||
|
|
||||||
|
sudo cp /etc/resolv.conf $BUILDDIR/etc/resolv.conf
|
||||||
|
|
||||||
|
trap "sudo umount $BUILDDIR/proc; sudo umount $BUILDDIR/dev/pts" EXIT
|
||||||
|
sudo mount --bind /proc $BUILDDIR/proc
|
||||||
|
sudo mount --bind /dev/pts $BUILDDIR/dev/pts
|
||||||
|
|
||||||
|
if [ -d /opt/stack/new ]; then
|
||||||
|
CI_DIR=/opt/stack/new
|
||||||
|
elif [ -d /opt/stack ]; then
|
||||||
|
CI_DIR=/opt/stack
|
||||||
|
else
|
||||||
|
CI_DIR=
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$CI_DIR" ]; then
|
||||||
|
# Running in CI environment, make checkouts available
|
||||||
|
$CHROOT_CMD mkdir -p $CI_DIR
|
||||||
|
for project in $(ls $CI_DIR); do
|
||||||
|
if grep -q "$project" $BUILDDIR/tmp/upper-constraints.txt &&
|
||||||
|
[ -d "$CI_DIR/$project/.git" ]; then
|
||||||
|
sudo cp -R "$CI_DIR/$project" $BUILDDIR/$CI_DIR/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
$CHROOT_CMD mkdir /etc/sysconfig/tcedir
|
||||||
|
$CHROOT_CMD chmod a+rwx /etc/sysconfig/tcedir
|
||||||
|
$CHROOT_CMD touch /etc/sysconfig/tcuser
|
||||||
|
$CHROOT_CMD chmod a+rwx /etc/sysconfig/tcuser
|
||||||
|
|
||||||
|
mkdir $BUILDDIR/tmp/overides
|
||||||
|
cp $WORKDIR/build_files/fakeuname $BUILDDIR/tmp/overides/uname
|
||||||
|
|
||||||
|
PY_REQS="buildreqs_python2.lst"
|
||||||
|
if [[ $USE_PYTHON3 == "True" ]]; then
|
||||||
|
PY_REQS="buildreqs_python3.lst"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
sudo chroot --userspec=$TC:$STAFF $BUILDDIR /usr/bin/env -i PATH=$CHROOT_PATH http_proxy=$http_proxy https_proxy=$https_proxy no_proxy=$no_proxy tce-load -wci $line
|
||||||
|
done < <(paste $WORKDIR/build_files/$PY_REQS $WORKDIR/build_files/buildreqs.lst)
|
||||||
|
|
||||||
|
PIP_COMMAND="pip"
|
||||||
|
TINYIPA_PYTHON_EXE="python"
|
||||||
|
if [[ $USE_PYTHON3 == "True" ]]; then
|
||||||
|
PIP_COMMAND="pip3"
|
||||||
|
TINYIPA_PYTHON_EXE="python3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build python wheels
|
||||||
|
$CHROOT_CMD ${TINYIPA_PYTHON_EXE} -m ensurepip
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} install --upgrade pip wheel
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} install pbr
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} wheel -c /tmp/upper-constraints.txt --wheel-dir /tmp/wheels -r /tmp/ipa-requirements.txt
|
||||||
|
if [ -n "$IRONIC_LIB_SOURCE" ]; then
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} wheel -c /tmp/upper-constraints.txt --wheel-dir /tmp/wheels -r /tmp/ironic-lib-requirements.txt
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} wheel -c /tmp/upper-constraints.txt --no-index --pre --wheel-dir /tmp/wheels --find-links=/tmp/localpip --find-links=/tmp/wheels ironic-lib
|
||||||
|
fi
|
||||||
|
$CHROOT_CMD ${PIP_COMMAND} wheel -c /tmp/upper-constraints.txt --no-index --pre --wheel-dir /tmp/wheels --find-links=/tmp/localpip --find-links=/tmp/wheels ironic-python-agent
|
||||||
|
echo Resulting wheels:
|
||||||
|
ls -1 $BUILDDIR/tmp/wheels
|
||||||
|
|
||||||
|
# Build tgt
|
||||||
|
rm -rf $WORKDIR/build_files/tgt.tcz
|
||||||
|
$CHROOT_CMD /bin/sh -c "cd /tmp/tgt && make && make install-programs install-conf install-scripts DESTDIR=/tmp/tgt-installed"
|
||||||
|
find $BUILDDIR/tmp/tgt-installed/ -type f -executable | xargs file | awk -F ':' '/ELF/ {print $1}' | sudo xargs strip
|
||||||
|
cd $WORKDIR/build_files && mksquashfs $BUILDDIR/tmp/tgt-installed tgt.tcz && md5sum tgt.tcz > tgt.tcz.md5.txt
|
||||||
|
|
||||||
|
# Build qemu-utils
|
||||||
|
rm -rf $WORKDIR/build_files/qemu-utils.tcz
|
||||||
|
$CHROOT_CMD /bin/sh -c "cd /tmp/qemu && ./configure --disable-system --disable-user --disable-linux-user --disable-bsd-user --disable-guest-agent --disable-blobs && make && make install DESTDIR=/tmp/qemu-utils"
|
||||||
|
find $BUILDDIR/tmp/qemu-utils/ -type f -executable | xargs file | awk -F ':' '/ELF/ {print $1}' | sudo xargs strip
|
||||||
|
cd $WORKDIR/build_files && mksquashfs $BUILDDIR/tmp/qemu-utils qemu-utils.tcz && md5sum qemu-utils.tcz > qemu-utils.tcz.md5.txt
|
||||||
|
# Create qemu-utils.tcz.dep
|
||||||
|
echo "glib2.tcz" > qemu-utils.tcz.dep
|
||||||
|
|
||||||
|
# Build lshw
|
||||||
|
rm -rf $WORKDIR/build_files/lshw.tcz
|
||||||
|
# NOTE(mjturek): We touch src/lshw.1 and clear src/po/Makefile to avoid building the man pages, as they aren't used and require large dependencies to build.
|
||||||
|
$CHROOT_CMD /bin/sh -c "cd /tmp/lshw && touch src/lshw.1 && echo install: > src/po/Makefile && make && make install DESTDIR=/tmp/lshw-installed"
|
||||||
|
find $BUILDDIR/tmp/lshw-installed/ -type f -executable | xargs file | awk -F ':' '/ELF/ {print $1}' | sudo xargs strip
|
||||||
|
cd $WORKDIR/build_files && mksquashfs $BUILDDIR/tmp/lshw-installed lshw.tcz && md5sum lshw.tcz > lshw.tcz.md5.txt
|
||||||
|
|
||||||
|
# Build biosdevname
|
||||||
|
if $TINYIPA_REQUIRE_BIOSDEVNAME; then
|
||||||
|
rm -rf $WORKDIR/build_files/biosdevname.tcz
|
||||||
|
$CHROOT_CMD /bin/sh -c "cd /tmp/biosdevname-* && ./configure && make && make install DESTDIR=/tmp/biosdevname-installed"
|
||||||
|
find $BUILDDIR/tmp/biosdevname-installed/ -type f -executable | xargs file | awk -F ':' '/ELF/ {print $1}' | sudo xargs strip
|
||||||
|
cd $WORKDIR/build_files && mksquashfs $BUILDDIR/tmp/biosdevname-installed biosdevname.tcz && md5sum biosdevname.tcz > biosdevname.tcz.md5.txt
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $TINYIPA_REQUIRE_IPMITOOL; then
|
||||||
|
rm -rf $WORKDIR/build_files/ipmitool.tcz
|
||||||
|
# NOTE(TheJulia): Explicitly add the libtool path since /usr/local/ is not in path from the chroot.
|
||||||
|
$CHROOT_CMD /bin/sh -c "cd /tmp/ipmitool-* && env LIBTOOL='/usr/local/bin/libtool' ./bootstrap && ./configure && make && make install DESTDIR=/tmp/ipmitool"
|
||||||
|
find $BUILDDIR/tmp/ipmitool/ -type f -executable | xargs file | awk -F ':' '/ELF/ {print $1}' | sudo xargs strip
|
||||||
|
cd $WORKDIR/build_files && mksquashfs $BUILDDIR/tmp/ipmitool ipmitool.tcz && md5sum ipmitool.tcz > ipmitool.tcz.md5.txt
|
||||||
|
fi
|
74
tinyipa/build_files/bootlocal.sh
Executable file
74
tinyipa/build_files/bootlocal.sh
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# put other system startup commands here
|
||||||
|
|
||||||
|
#exec > /tmp/installlogs 2>&1
|
||||||
|
set -x
|
||||||
|
|
||||||
|
echo "Starting bootlocal script:"
|
||||||
|
date
|
||||||
|
|
||||||
|
export HOME=/root
|
||||||
|
|
||||||
|
# Start SSHd
|
||||||
|
if [ -f /usr/local/etc/init.d/openssh ]; then
|
||||||
|
echo "Starting OpenSSH server:"
|
||||||
|
/usr/local/etc/init.d/openssh start
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Maybe save some RAM?
|
||||||
|
#rm -rf /tmp/builtin
|
||||||
|
|
||||||
|
# Install IPA and dependecies
|
||||||
|
if ! type "ironic-python-agent" > /dev/null ; then
|
||||||
|
PIP_COMMAND="pip"
|
||||||
|
if hash pip3 2>/dev/null; then
|
||||||
|
PIP_COMMAND="pip3"
|
||||||
|
fi
|
||||||
|
$PIP_COMMAND install --no-index --find-links=file:///tmp/wheelhouse ironic_python_agent
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create ipa-rescue-config directory for rescue password
|
||||||
|
sudo mkdir -p /etc/ipa-rescue-config
|
||||||
|
|
||||||
|
export PYTHONOPTIMIZE=1
|
||||||
|
|
||||||
|
# Run IPA
|
||||||
|
echo "Starting Ironic Python Agent:"
|
||||||
|
date
|
||||||
|
ironic-python-agent 2>&1 | tee /var/log/ironic-python-agent.log
|
||||||
|
|
||||||
|
|
||||||
|
create_rescue_user() {
|
||||||
|
crypted_pass=$(cat /etc/ipa-rescue-config/ipa-rescue-password)
|
||||||
|
sudo adduser rescue -D -G root # no useradd
|
||||||
|
echo "rescue:$crypted_pass" | sudo chpasswd -e
|
||||||
|
sudo sh -c "echo \"rescue ALL=(ALL) NOPASSWD: ALL\" >> /etc/sudoers" # no suooers.d in tiny core.
|
||||||
|
|
||||||
|
# Restart sshd with allowing password authentication
|
||||||
|
sudo sed -i -e 's/^PasswordAuthentication no/PasswordAuthentication yes/' /usr/local/etc/ssh/sshd_config
|
||||||
|
sudo /usr/local/etc/init.d/openssh restart
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup DHCP network
|
||||||
|
configure_dhcp_network() {
|
||||||
|
for pidfile in `ls /var/run/udhcpc/*.pid`; do
|
||||||
|
kill `cat $pidfile`
|
||||||
|
done
|
||||||
|
|
||||||
|
# NOTE(TheJulia): We may need to add a short wait here as
|
||||||
|
# network interface plugging actions may not be asynchronous.
|
||||||
|
echo "Sleeping 30 sec as network interface is being updated"
|
||||||
|
sleep 30
|
||||||
|
INTERFACES=$(ip -o link |grep "LOWER_UP"|cut -f2 -d" "|sed 's/://'|grep -v "lo")
|
||||||
|
for interface in $INTERFACES; do
|
||||||
|
pidfile="/var/run/udhcpc/${interface}.pid"
|
||||||
|
/sbin/udhcpc -b -p ${pidfile} -i ${interface} -s /opt/udhcpc.script >> /var/log/udhcpc.log 2>&1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -f /etc/ipa-rescue-config/ipa-rescue-password ]; then
|
||||||
|
create_rescue_user || exit 0
|
||||||
|
configure_dhcp_network || exit 0
|
||||||
|
else
|
||||||
|
echo "IPA has exited. No rescue password file was defined."
|
||||||
|
fi
|
25
tinyipa/build_files/buildreqs.lst
Normal file
25
tinyipa/build_files/buildreqs.lst
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
autoconf.tcz
|
||||||
|
autogen-dev.tcz
|
||||||
|
autogen.tcz
|
||||||
|
automake.tcz
|
||||||
|
bash.tcz
|
||||||
|
binutils.tcz
|
||||||
|
compiletc.tcz
|
||||||
|
coreutils.tcz
|
||||||
|
dmidecode.tcz
|
||||||
|
gdisk.tcz
|
||||||
|
git.tcz
|
||||||
|
glib2-dev.tcz
|
||||||
|
hdparm.tcz
|
||||||
|
libpci-dev.tcz
|
||||||
|
libtool-dev.tcz
|
||||||
|
libtool.tcz
|
||||||
|
parted.tcz
|
||||||
|
pciutils.tcz
|
||||||
|
pixman-dev.tcz
|
||||||
|
pkg-config.tcz
|
||||||
|
raid-dm-4.8.17-tinycore64.tcz
|
||||||
|
scsi-4.8.17-tinycore64.tcz
|
||||||
|
udev-lib.tcz
|
||||||
|
util-linux.tcz
|
||||||
|
zlib_base-dev.tcz
|
2
tinyipa/build_files/buildreqs_python2.lst
Normal file
2
tinyipa/build_files/buildreqs_python2.lst
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
python.tcz
|
||||||
|
python-dev.tcz
|
2
tinyipa/build_files/buildreqs_python3.lst
Normal file
2
tinyipa/build_files/buildreqs_python3.lst
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
python3.6.tcz
|
||||||
|
python3.6-dev.tcz
|
21
tinyipa/build_files/dhcp.sh
Normal file
21
tinyipa/build_files/dhcp.sh
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# The DHCP portion is now separated out, in order to not slow the boot down
|
||||||
|
# only to wait for slow network cards
|
||||||
|
. /etc/init.d/tc-functions
|
||||||
|
|
||||||
|
# This waits until all devices have registered
|
||||||
|
/sbin/udevadm settle --timeout=%UDEV_SETTLE_TIMEOUT%
|
||||||
|
|
||||||
|
NETDEVICES="$(awk -F: '/eth.:|tr.:/{print $1}' /proc/net/dev 2>/dev/null)"
|
||||||
|
echo "$0: Discovered network devices: $NETDEVICES"
|
||||||
|
for DEVICE in $NETDEVICES; do
|
||||||
|
ifconfig $DEVICE | grep -q "inet addr"
|
||||||
|
if [ "$?" != 0 ]; then
|
||||||
|
echo -e "\nNetwork device $DEVICE detected, DHCP broadcasting for IP."
|
||||||
|
trap 2 3 11
|
||||||
|
/sbin/udhcpc -b -i $DEVICE -x hostname:$(/bin/hostname) -p /var/run/udhcpc.$DEVICE.pid 2>&1 &
|
||||||
|
trap "" 2 3 11
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
110
tinyipa/build_files/fakeuname
Executable file
110
tinyipa/build_files/fakeuname
Executable file
@ -0,0 +1,110 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
S="Linux"
|
||||||
|
N="box"
|
||||||
|
R="4.8.17-tinycore64"
|
||||||
|
P="unknown"
|
||||||
|
V="#2017 SMP"
|
||||||
|
M="x86_64"
|
||||||
|
I="unknown"
|
||||||
|
O="GNU/Linux"
|
||||||
|
|
||||||
|
OPT_A=false
|
||||||
|
OPT_S=false
|
||||||
|
OPT_N=false
|
||||||
|
OPT_R=false
|
||||||
|
OPT_P=false
|
||||||
|
OPT_V=false
|
||||||
|
OPT_M=false
|
||||||
|
OPT_I=false
|
||||||
|
OPT_O=false
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "-ASNRPVMIO"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
case $1 in
|
||||||
|
-a)
|
||||||
|
OPT_A=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-s)
|
||||||
|
OPT_S=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-n)
|
||||||
|
OPT_N=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-r)
|
||||||
|
OPT_R=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-p)
|
||||||
|
OPT_P=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-v)
|
||||||
|
OPT_V=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-m)
|
||||||
|
OPT_M=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-i)
|
||||||
|
OPT_I=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-o)
|
||||||
|
OPT_O=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-rs)
|
||||||
|
OPT_R=true
|
||||||
|
OPT_S=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ ! -z "$1" ]; then
|
||||||
|
echo "uname -asnrpvmio"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if $OPT_A; then
|
||||||
|
echo "$S $N $R $V $M $O"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
string=''
|
||||||
|
if $OPT_S; then
|
||||||
|
string="$string $S"
|
||||||
|
fi
|
||||||
|
if $OPT_N; then
|
||||||
|
string="$string $N"
|
||||||
|
fi
|
||||||
|
if $OPT_R; then
|
||||||
|
string="$string $R"
|
||||||
|
fi
|
||||||
|
if $OPT_P; then
|
||||||
|
string="$string $P"
|
||||||
|
fi
|
||||||
|
if $OPT_V; then
|
||||||
|
string="$string $V"
|
||||||
|
fi
|
||||||
|
if $OPT_M; then
|
||||||
|
string="$string $M"
|
||||||
|
fi
|
||||||
|
if $OPT_I; then
|
||||||
|
string="$string $I"
|
||||||
|
fi
|
||||||
|
if $OPT_O; then
|
||||||
|
string="$string $O"
|
||||||
|
fi
|
||||||
|
echo $string
|
16
tinyipa/build_files/finalreqs.lst
Normal file
16
tinyipa/build_files/finalreqs.lst
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
bash.tcz
|
||||||
|
coreutils.tcz
|
||||||
|
dmidecode.tcz
|
||||||
|
gdisk.tcz
|
||||||
|
hdparm.tcz
|
||||||
|
iproute2.tcz
|
||||||
|
parted.tcz
|
||||||
|
popt.tcz
|
||||||
|
pciutils.tcz
|
||||||
|
raid-dm-4.8.17-tinycore64.tcz
|
||||||
|
scsi-4.8.17-tinycore64.tcz
|
||||||
|
udev-lib.tcz
|
||||||
|
util-linux.tcz
|
||||||
|
glib2.tcz
|
||||||
|
iproute2.tcz
|
||||||
|
smartmontools.tcz
|
1
tinyipa/build_files/finalreqs_python2.lst
Normal file
1
tinyipa/build_files/finalreqs_python2.lst
Normal file
@ -0,0 +1 @@
|
|||||||
|
python.tcz
|
2
tinyipa/build_files/finalreqs_python3.lst
Normal file
2
tinyipa/build_files/finalreqs_python3.lst
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
python3.6.tcz
|
||||||
|
expat2.tcz
|
9
tinyipa/build_files/isolinux.cfg
Executable file
9
tinyipa/build_files/isolinux.cfg
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
display boot.msg
|
||||||
|
default corepure64
|
||||||
|
|
||||||
|
label corepure64
|
||||||
|
kernel /boot/vmlinuz64
|
||||||
|
initrd /boot/corepure64.gz
|
||||||
|
append loglevel=3 syslog showapps
|
||||||
|
|
||||||
|
implicit 0
|
56
tinyipa/common.sh
Executable file
56
tinyipa/common.sh
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
source ${WORKDIR}/tc-mirror.sh
|
||||||
|
|
||||||
|
# Allow an extension to be added to the generated files by specifying
|
||||||
|
# $BRANCH_PATH e.g. export BRANCH_PATH=master results in tinyipa-master.gz etc
|
||||||
|
BRANCH_EXT=''
|
||||||
|
if [ -n "$BRANCH_PATH" ]; then
|
||||||
|
BRANCH_EXT="-$BRANCH_PATH"
|
||||||
|
fi
|
||||||
|
export BRANCH_EXT
|
||||||
|
|
||||||
|
TC=1001
|
||||||
|
STAFF=50
|
||||||
|
|
||||||
|
CHROOT_PATH="/tmp/overides:/usr/local/sbin:/usr/local/bin:/apps/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
CHROOT_CMD="sudo chroot $DST_DIR /usr/bin/env -i PATH=$CHROOT_PATH http_proxy=$http_proxy https_proxy=$https_proxy no_proxy=$no_proxy"
|
||||||
|
TC_CHROOT_CMD="sudo chroot --userspec=$TC:$STAFF $DST_DIR /usr/bin/env -i PATH=$CHROOT_PATH http_proxy=$http_proxy https_proxy=$https_proxy no_proxy=$no_proxy"
|
||||||
|
|
||||||
|
function setup_tce {
|
||||||
|
# Setup resolv.conf, add mirrors, mount proc
|
||||||
|
local dst_dir="$1"
|
||||||
|
|
||||||
|
# Find a working TC mirror if none is explicitly provided
|
||||||
|
choose_tc_mirror
|
||||||
|
|
||||||
|
sudo cp $dst_dir/etc/resolv.conf $dst_dir/etc/resolv.conf.old
|
||||||
|
sudo cp /etc/resolv.conf $dst_dir/etc/resolv.conf
|
||||||
|
|
||||||
|
sudo cp -a $dst_dir/opt/tcemirror $dst_dir/opt/tcemirror.old
|
||||||
|
sudo sh -c "echo $TINYCORE_MIRROR_URL > $dst_dir/opt/tcemirror"
|
||||||
|
|
||||||
|
mkdir -p $dst_dir/tmp/builtin/optional
|
||||||
|
$CHROOT_CMD chown -R tc.staff /tmp/builtin
|
||||||
|
$CHROOT_CMD chmod -R a+w /tmp/builtin
|
||||||
|
$CHROOT_CMD ln -sf /tmp/builtin /etc/sysconfig/tcedir
|
||||||
|
echo "tc" | $CHROOT_CMD tee -a /etc/sysconfig/tcuser
|
||||||
|
|
||||||
|
# Mount /proc for chroot commands
|
||||||
|
sudo mount --bind /proc $dst_dir/proc
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup_tce {
|
||||||
|
local dst_dir="$1"
|
||||||
|
|
||||||
|
# Unmount /proc and clean up everything
|
||||||
|
sudo umount $dst_dir/proc
|
||||||
|
sudo rm -rf $dst_dir/tmp/builtin
|
||||||
|
sudo rm -rf $dst_dir/tmp/tcloop
|
||||||
|
sudo rm -rf $dst_dir/usr/local/tce.installed
|
||||||
|
sudo mv $dst_dir/opt/tcemirror.old $dst_dir/opt/tcemirror
|
||||||
|
sudo mv $dst_dir/etc/resolv.conf.old $dst_dir/etc/resolv.conf
|
||||||
|
sudo rm $dst_dir/etc/sysconfig/tcuser
|
||||||
|
sudo rm $dst_dir/etc/sysconfig/tcedir
|
||||||
|
}
|
246
tinyipa/finalise-tinyipa.sh
Executable file
246
tinyipa/finalise-tinyipa.sh
Executable file
@ -0,0 +1,246 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
WORKDIR=$(readlink -f $0 | xargs dirname)
|
||||||
|
FINALDIR="$WORKDIR/tinyipafinal"
|
||||||
|
DST_DIR=$FINALDIR
|
||||||
|
source ${WORKDIR}/common.sh
|
||||||
|
|
||||||
|
BUILDDIR="$WORKDIR/tinyipabuild"
|
||||||
|
BUILD_AND_INSTALL_TINYIPA=${BUILD_AND_INSTALL_TINYIPA:-true}
|
||||||
|
TINYCORE_MIRROR_URL=${TINYCORE_MIRROR_URL:-}
|
||||||
|
ENABLE_SSH=${ENABLE_SSH:-false}
|
||||||
|
INSTALL_SSH=${INSTALL_SSH:-true}
|
||||||
|
AUTHORIZE_SSH=${ENABLE_SSH:-false}
|
||||||
|
|
||||||
|
if $ENABLE_SSH; then
|
||||||
|
echo "WARNING: using ENABLE_SSH is deprecated, use INSTALL_SSH and AUTHORIZE_SSH variables instead"
|
||||||
|
INSTALL_SSH=true
|
||||||
|
AUTHORIZE_SSH=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
SSH_PUBLIC_KEY=${SSH_PUBLIC_KEY:-}
|
||||||
|
PYOPTIMIZE_TINYIPA=${PYOPTIMIZE_TINYIPA:-true}
|
||||||
|
TINYIPA_REQUIRE_BIOSDEVNAME=${TINYIPA_REQUIRE_BIOSDEVNAME:-false}
|
||||||
|
TINYIPA_REQUIRE_IPMITOOL=${TINYIPA_REQUIRE_IPMITOOL:-true}
|
||||||
|
TINYIPA_UDEV_SETTLE_TIMEOUT=${TINYIPA_UDEV_SETTLE_TIMEOUT:-20}
|
||||||
|
USE_PYTHON3=${USE_PYTHON3:-True}
|
||||||
|
|
||||||
|
|
||||||
|
echo "Finalising tinyipa:"
|
||||||
|
|
||||||
|
if $AUTHORIZE_SSH ; then
|
||||||
|
echo "Validating location of public SSH key"
|
||||||
|
if [ -n "$SSH_PUBLIC_KEY" ]; then
|
||||||
|
if [ -f "$SSH_PUBLIC_KEY" ]; then
|
||||||
|
_found_ssh_key="$SSH_PUBLIC_KEY"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
for fmt in rsa dsa; do
|
||||||
|
if [ -f "$HOME/.ssh/id_$fmt.pub" ]; then
|
||||||
|
_found_ssh_key="$HOME/.ssh/id_$fmt.pub"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z $_found_ssh_key ]; then
|
||||||
|
echo "Failed to find neither provided nor default SSH key"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo -v
|
||||||
|
|
||||||
|
if [ -d "$FINALDIR" ]; then
|
||||||
|
sudo rm -rf "$FINALDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir "$FINALDIR"
|
||||||
|
|
||||||
|
# Extract rootfs from .gz file
|
||||||
|
( cd "$FINALDIR" && zcat $WORKDIR/build_files/corepure64.gz | sudo cpio -i -H newc -d )
|
||||||
|
|
||||||
|
# Setup Final Dir
|
||||||
|
setup_tce "$DST_DIR"
|
||||||
|
|
||||||
|
# Modify ldconfig for x86-64
|
||||||
|
$CHROOT_CMD cp /sbin/ldconfig /sbin/ldconfigold
|
||||||
|
printf '#!/bin/sh\n/sbin/ldconfigold $@ | sed -r "s/libc6|ELF/libc6,x86-64/"' | $CHROOT_CMD tee -a /sbin/ldconfignew
|
||||||
|
$CHROOT_CMD cp /sbin/ldconfignew /sbin/ldconfig
|
||||||
|
$CHROOT_CMD chmod u+x /sbin/ldconfig
|
||||||
|
|
||||||
|
# Copy python wheels from build to final dir
|
||||||
|
cp -Rp "$BUILDDIR/tmp/wheels" "$FINALDIR/tmp/wheelhouse"
|
||||||
|
|
||||||
|
cp $WORKDIR/build_files/tgt.* $FINALDIR/tmp/builtin/optional
|
||||||
|
cp $WORKDIR/build_files/qemu-utils.* $FINALDIR/tmp/builtin/optional
|
||||||
|
cp $WORKDIR/build_files/lshw.* $FINALDIR/tmp/builtin/optional
|
||||||
|
|
||||||
|
if $TINYIPA_REQUIRE_BIOSDEVNAME; then
|
||||||
|
cp $WORKDIR/build_files/biosdevname.* $FINALDIR/tmp/builtin/optional
|
||||||
|
fi
|
||||||
|
if $TINYIPA_REQUIRE_IPMITOOL; then
|
||||||
|
cp $WORKDIR/build_files/ipmitool.* $FINALDIR/tmp/builtin/optional
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir $FINALDIR/tmp/overides
|
||||||
|
cp $WORKDIR/build_files/fakeuname $FINALDIR/tmp/overides/uname
|
||||||
|
|
||||||
|
PY_REQS="finalreqs_python2.lst"
|
||||||
|
if [[ $USE_PYTHON3 == "True" ]]; then
|
||||||
|
PY_REQS="finalreqs_python3.lst"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while read line; do
|
||||||
|
$TC_CHROOT_CMD tce-load -wic $line
|
||||||
|
done < <(paste $WORKDIR/build_files/finalreqs.lst $WORKDIR/build_files/$PY_REQS)
|
||||||
|
|
||||||
|
if $INSTALL_SSH ; then
|
||||||
|
# Install and configure bare minimum for SSH access
|
||||||
|
$TC_CHROOT_CMD tce-load -wic openssh
|
||||||
|
# Configure OpenSSH
|
||||||
|
$CHROOT_CMD cp /usr/local/etc/ssh/sshd_config.orig /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "PasswordAuthentication no" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
# Generate and configure host keys - RSA, DSA, Ed25519
|
||||||
|
# NOTE(pas-ha) ECDSA host key will still be re-generated fresh on every image boot
|
||||||
|
$CHROOT_CMD ssh-keygen -t rsa -N "" -f /usr/local/etc/ssh/ssh_host_rsa_key
|
||||||
|
$CHROOT_CMD ssh-keygen -t dsa -N "" -f /usr/local/etc/ssh/ssh_host_dsa_key
|
||||||
|
$CHROOT_CMD ssh-keygen -t ed25519 -N "" -f /usr/local/etc/ssh/ssh_host_ed25519_key
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_rsa_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_dsa_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo "HostKey /usr/local/etc/ssh/ssh_host_ed25519_key" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
|
||||||
|
# setup user and SSH keys
|
||||||
|
if $AUTHORIZE_SSH; then
|
||||||
|
$CHROOT_CMD mkdir -p /home/tc
|
||||||
|
$CHROOT_CMD chown -R tc.staff /home/tc
|
||||||
|
$TC_CHROOT_CMD mkdir -p /home/tc/.ssh
|
||||||
|
cat $_found_ssh_key | $TC_CHROOT_CMD tee /home/tc/.ssh/authorized_keys
|
||||||
|
$CHROOT_CMD chown tc.staff /home/tc/.ssh/authorized_keys
|
||||||
|
$TC_CHROOT_CMD chmod 600 /home/tc/.ssh/authorized_keys
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
$TC_CHROOT_CMD tce-load -ic /tmp/builtin/optional/tgt.tcz
|
||||||
|
$TC_CHROOT_CMD tce-load -ic /tmp/builtin/optional/qemu-utils.tcz
|
||||||
|
$TC_CHROOT_CMD tce-load -ic /tmp/builtin/optional/lshw.tcz
|
||||||
|
if $TINYIPA_REQUIRE_BIOSDEVNAME; then
|
||||||
|
$TC_CHROOT_CMD tce-load -ic /tmp/builtin/optional/biosdevname.tcz
|
||||||
|
fi
|
||||||
|
if $TINYIPA_REQUIRE_IPMITOOL; then
|
||||||
|
$TC_CHROOT_CMD tce-load -ic /tmp/builtin/optional/ipmitool.tcz
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure tinyipa picks up installed kernel modules
|
||||||
|
$CHROOT_CMD depmod -a `$WORKDIR/build_files/fakeuname -r`
|
||||||
|
|
||||||
|
PIP_COMMAND="pip"
|
||||||
|
TINYIPA_PYTHON_EXE="python"
|
||||||
|
if [[ $USE_PYTHON3 == "True" ]]; then
|
||||||
|
PIP_COMMAND="pip3"
|
||||||
|
TINYIPA_PYTHON_EXE="python3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install pip
|
||||||
|
$CHROOT_CMD ${TINYIPA_PYTHON_EXE} -m ensurepip --upgrade
|
||||||
|
|
||||||
|
# If flag is set install python now
|
||||||
|
if $BUILD_AND_INSTALL_TINYIPA ; then
|
||||||
|
$CHROOT_CMD $PIP_COMMAND install --no-index --find-links=file:///tmp/wheelhouse --pre ironic_python_agent
|
||||||
|
rm -rf $FINALDIR/tmp/wheelhouse
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Unmount /proc and clean up everything
|
||||||
|
cleanup_tce "$DST_DIR"
|
||||||
|
|
||||||
|
# Copy bootlocal.sh to opt
|
||||||
|
sudo cp "$WORKDIR/build_files/bootlocal.sh" "$FINALDIR/opt/."
|
||||||
|
|
||||||
|
# Copy udhcpc.script to opt
|
||||||
|
sudo cp "$WORKDIR/udhcpc.script" "$FINALDIR/opt/"
|
||||||
|
|
||||||
|
# Replace etc/init.d/dhcp.sh
|
||||||
|
sudo cp "$WORKDIR/build_files/dhcp.sh" "$FINALDIR/etc/init.d/dhcp.sh"
|
||||||
|
sudo sed -i "s/%UDEV_SETTLE_TIMEOUT%/$TINYIPA_UDEV_SETTLE_TIMEOUT/" "$FINALDIR/etc/init.d/dhcp.sh"
|
||||||
|
|
||||||
|
# Disable ZSwap
|
||||||
|
sudo sed -i '/# Main/a NOZSWAP=1' "$FINALDIR/etc/init.d/tc-config"
|
||||||
|
# sudo cp $WORKDIR/build_files/tc-config $FINALDIR/etc/init.d/tc-config
|
||||||
|
|
||||||
|
if $PYOPTIMIZE_TINYIPA; then
|
||||||
|
# Precompile all python
|
||||||
|
if [[ $USE_PYTHON3 == "True" ]]; then
|
||||||
|
set +e
|
||||||
|
$CHROOT_CMD /bin/bash -c "python3 -OO -m compileall /usr/local/lib/python3.6"
|
||||||
|
set -e
|
||||||
|
find $FINALDIR/usr/local/lib/python3.6 -name "*.py" -not -path "*ironic_python_agent/api/config.py" | sudo xargs --no-run-if-empty rm
|
||||||
|
find $FINALDIR/usr/local/lib/python3.6 -name "*.pyc" ! -name "*opt-2*" | sudo xargs --no-run-if-empty rm
|
||||||
|
sudo find $FINALDIR/usr/local/lib/python3.6 -type d -name __pycache__ -exec sh -c 'cd "$1"; for f in *; do mv -i "$f" .. ; done' find-sh {} \;
|
||||||
|
find $FINALDIR/usr/local/lib/python3.6 -name "*.cpython-36.opt-2*" | sed 'p;s/\.cpython-36\.opt-2//' | sudo xargs -n2 --no-run-if-empty mv
|
||||||
|
fi
|
||||||
|
set +e
|
||||||
|
$CHROOT_CMD /bin/bash -c "python -OO -m compileall /usr/local/lib/python2.7"
|
||||||
|
set -e
|
||||||
|
find $FINALDIR/usr/local/lib/python2.7 -name "*.py" -not -path "*ironic_python_agent/api/config.py" | sudo xargs --no-run-if-empty rm
|
||||||
|
find $FINALDIR/usr/local/lib/python2.7 -name "*.pyc" | sudo xargs --no-run-if-empty rm
|
||||||
|
if $INSTALL_SSH && $AUTHORIZE_SSH ; then
|
||||||
|
# NOTE(pas-ha) for Ansible+Python to work we need to ensure that
|
||||||
|
# PYTHONOPTIMIZE=1 is set for all sessions from 'tc' user including
|
||||||
|
# those that are elevated with 'sudo' afterwards
|
||||||
|
echo "PYTHONOPTIMIZE=1" | $TC_CHROOT_CMD tee -a /home/tc/.ssh/environment
|
||||||
|
echo "PermitUserEnvironment yes" | $CHROOT_CMD tee -a /usr/local/etc/ssh/sshd_config
|
||||||
|
echo 'Defaults env_keep += "PYTHONOPTIMIZE"' | $CHROOT_CMD tee -a /etc/sudoers
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
sudo sed -i "s/PYTHONOPTIMIZE=1/PYTHONOPTIMIZE=0/" "$FINALDIR/opt/bootlocal.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Delete unnecessary Babel .dat files
|
||||||
|
find $FINALDIR -path "*babel/locale-data/*.dat" -not -path "*en_US*" | sudo xargs --no-run-if-empty rm
|
||||||
|
|
||||||
|
# NOTE(pas-ha) Apparently on TinyCore Ansible's 'command' module is
|
||||||
|
# not searching for executables in the '/usr/local/(s)bin' paths.
|
||||||
|
# Thus we symlink everything from there to '/usr/(s)bin' which is being searched,
|
||||||
|
# so that 'command' module picks full utilities installed by 'util-linux'
|
||||||
|
# instead of built-in simplified BusyBox ones.
|
||||||
|
set +x
|
||||||
|
echo "Symlink all from /usr/local/sbin to /usr/sbin"
|
||||||
|
pushd "$FINALDIR/usr/local/sbin"
|
||||||
|
for target in *; do
|
||||||
|
if [ ! -f "$FINALDIR/usr/sbin/$target" ]; then
|
||||||
|
$CHROOT_CMD ln -s "/usr/local/sbin/$target" "/usr/sbin/$target"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
echo "Symlink all from /usr/local/bin to /usr/bin"
|
||||||
|
# this also includes symlinking Python to the place expected by Ansible
|
||||||
|
pushd "$FINALDIR/usr/local/bin"
|
||||||
|
for target in *; do
|
||||||
|
if [ ! -f "$FINALDIR/usr/bin/$target" ]; then
|
||||||
|
$CHROOT_CMD ln -s "/usr/local/bin/$target" "/usr/bin/$target"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# Rebuild build directory into gz file
|
||||||
|
( cd "$FINALDIR" && sudo find | sudo cpio -o -H newc | gzip -9 > "$WORKDIR/tinyipa${BRANCH_EXT}.gz" )
|
||||||
|
|
||||||
|
# Copy vmlinuz to new name
|
||||||
|
cp "$WORKDIR/build_files/vmlinuz64" "$WORKDIR/tinyipa${BRANCH_EXT}.vmlinuz"
|
||||||
|
|
||||||
|
# Create tar.gz containing tinyipa files
|
||||||
|
tar czf tinyipa${BRANCH_EXT}.tar.gz tinyipa${BRANCH_EXT}.gz tinyipa${BRANCH_EXT}.vmlinuz
|
||||||
|
|
||||||
|
# Create sha256 files which will be uploaded by the publish jobs along with
|
||||||
|
# the tinyipa ones in order to provide a way to verify the integrity of the tinyipa
|
||||||
|
# builds.
|
||||||
|
for f in tinyipa${BRANCH_EXT}.{gz,tar.gz,vmlinuz}; do
|
||||||
|
sha256sum $f > $f.sha256
|
||||||
|
done
|
||||||
|
|
||||||
|
# Output files with sizes created by this script
|
||||||
|
echo "Produced files:"
|
||||||
|
du -h tinyipa${BRANCH_EXT}.gz tinyipa${BRANCH_EXT}.tar.gz tinyipa${BRANCH_EXT}.vmlinuz
|
||||||
|
echo "Checksums: " tinyipa${BRANCH_EXT}.*sha256
|
23
tinyipa/install-deps.sh
Executable file
23
tinyipa/install-deps.sh
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
COMMON_PACKAGES="wget python-pip unzip sudo gawk"
|
||||||
|
APT_PACKAGES="${COMMON_PACKAGES} squashfs-tools"
|
||||||
|
YUM_PACKAGES="${COMMON_PACKAGES} squashfs-tools"
|
||||||
|
ZYPPER_PACKAGES="${COMMON_PACKAGES} squashfs"
|
||||||
|
|
||||||
|
echo "Installing dependencies:"
|
||||||
|
|
||||||
|
# first zypper in case zypper-aptitude is installed
|
||||||
|
if [ -x "/usr/bin/zypper" ]; then
|
||||||
|
sudo -E zypper -n install -l ${ZYPPER_PACKAGES}
|
||||||
|
elif [ -x "/usr/bin/apt-get" ]; then
|
||||||
|
sudo -E apt-get update
|
||||||
|
sudo -E apt-get install -y ${APT_PACKAGES}
|
||||||
|
elif [ -x "/usr/bin/dnf" ]; then
|
||||||
|
sudo -E dnf install -y ${YUM_PACKAGES}
|
||||||
|
elif [ -x "/usr/bin/yum" ]; then
|
||||||
|
sudo -E yum install -y ${YUM_PACKAGES}
|
||||||
|
else
|
||||||
|
echo "No supported package manager installed on system. Supported: apt, yum, dnf, zypper"
|
||||||
|
exit 1
|
||||||
|
fi
|
53
tinyipa/tc-mirror.sh
Normal file
53
tinyipa/tc-mirror.sh
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
#NOTE(pas-ha)
|
||||||
|
# The first URL is the official TC repo,
|
||||||
|
# the rest of the list is taken from
|
||||||
|
# http://wiki.tinycorelinux.net/wiki:mirrors
|
||||||
|
# as of time of this writing.
|
||||||
|
# Only HTTP mirrors were considered with the following ordering
|
||||||
|
# - those that were unavailable are moved to the bottom of the list
|
||||||
|
# - those that already responded with 404 are moved to the very bottom
|
||||||
|
|
||||||
|
# List generated on 12-Dec-2016
|
||||||
|
TC_MIRRORS="http://repo.tinycorelinux.net
|
||||||
|
http://distro.ibiblio.org/tinycorelinux
|
||||||
|
http://mirror.cedia.org.ec/tinycorelinux
|
||||||
|
http://mirror.epn.edu.ec/tinycorelinux
|
||||||
|
http://mirrors.163.com/tinycorelinux
|
||||||
|
http://kambing.ui.ac.id/tinycorelinux
|
||||||
|
http://ftp.nluug.nl/os/Linux/distr/tinycorelinux
|
||||||
|
http://ftp.vim.org/os/Linux/distr/tinycorelinux
|
||||||
|
http://www.gtlib.gatech.edu/pub/tinycore
|
||||||
|
http://tinycore.mirror.uber.com.au
|
||||||
|
http://l4u-00.jinr.ru/LinuxArchive/Ftp/tinycorelinux"
|
||||||
|
|
||||||
|
function probe_url {
|
||||||
|
wget -q --spider --tries 1 --timeout 10 "$1" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
function choose_tc_mirror {
|
||||||
|
if [ -z ${TINYCORE_MIRROR_URL} ]; then
|
||||||
|
for url in ${TC_MIRRORS}; do
|
||||||
|
echo "Checking Tiny Core Linux mirror ${url}"
|
||||||
|
if probe_url ${url} ; then
|
||||||
|
echo "Check succeeded: ${url} is responding."
|
||||||
|
TINYCORE_MIRROR_URL=${url}
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "Check failed: ${url} is not responding"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z ${TINYCORE_MIRROR_URL} ]; then
|
||||||
|
echo "Failed to find working Tiny Core Linux mirror"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Probing provided Tiny Core Linux mirror ${TINYCORE_MIRROR_URL}"
|
||||||
|
if probe_url ${TINYCORE_MIRROR_URL} ; then
|
||||||
|
echo "Check succeeded: ${TINYCORE_MIRROR_URL} is responding."
|
||||||
|
else
|
||||||
|
echo "Check failed: ${TINYCORE_MIRROR_URL} is not responding"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
44
tinyipa/udhcpc.script
Executable file
44
tinyipa/udhcpc.script
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
|
||||||
|
|
||||||
|
# file created to be used for static network configuration as well
|
||||||
|
|
||||||
|
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
|
||||||
|
|
||||||
|
RESOLV_CONF="/etc/resolv.conf"
|
||||||
|
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
|
||||||
|
[ -n "$subnet" ] && NETMASK="netmask $subnet"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
deconfig)
|
||||||
|
/sbin/ifconfig $interface 0.0.0.0
|
||||||
|
;;
|
||||||
|
|
||||||
|
renew|bound)
|
||||||
|
/sbin/ifconfig $interface up
|
||||||
|
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
|
||||||
|
|
||||||
|
if [ -n "$router" ] ; then
|
||||||
|
echo "deleting routers"
|
||||||
|
while route del default gw 0.0.0.0 dev $interface ; do
|
||||||
|
:
|
||||||
|
done
|
||||||
|
|
||||||
|
metric=0
|
||||||
|
for i in $router ; do
|
||||||
|
route add default gw $i dev $interface metric $((metric++))
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n > $RESOLV_CONF
|
||||||
|
[ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
|
||||||
|
for i in $dns ; do
|
||||||
|
echo adding dns $i
|
||||||
|
echo nameserver $i >> $RESOLV_CONF
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user