Cleanup and improvements
This commit is contained in:
11
tools/render
Executable file
11
tools/render
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
ROOT=$(git rev-parse --show-toplevel)
|
||||
RENDERED=${ROOT}/rendered
|
||||
TEMPLATES=${ROOT}/templates
|
||||
|
||||
${ROOT}/tools/merge ./nodes > ${RENDERED}/nodes.json
|
||||
|
||||
gomplate --input-dir ${TEMPLATES} --output-dir ${RENDERED} \
|
||||
-d nodes=file://${RENDERED}/nodes.json \
|
||||
-d config=${ROOT}/config.yaml \
|
||||
71
tools/tftpd
Executable file
71
tools/tftpd
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
ROOT=$(git rev-parse --show-toplevel)
|
||||
|
||||
IPXE_VERSION=b41bda4413bf286d7b7a449bc05e1531da1eec2e
|
||||
IPXE_BIN=(bin/ipxe.pxe bin-x86_64-efi/ipxe.efi)
|
||||
|
||||
IPXE_DIR=${ROOT}/.ipxe/ipxe-${IPXE_VERSION}
|
||||
|
||||
function download_ipxe() {
|
||||
base_dir=$(dirname ${IPXE_DIR})
|
||||
# Download the iPXE source if needed
|
||||
if [ ! -d "${IPXE_DIR}" ]; then
|
||||
mkdir -p "${base_dir}"
|
||||
curl -L https://github.com/ipxe/ipxe/archive/${IPXE_VERSION}.tar.gz | tar -xz -C "${base_dir}"
|
||||
fi
|
||||
}
|
||||
|
||||
function patch_ipxe() {
|
||||
# Apply patches to iPXE source
|
||||
cd "${IPXE_DIR}/src"
|
||||
sed -i 's/^#undef[\t ]DOWNLOAD_PROTO_HTTPS.*$/#define DOWNLOAD_PROTO_HTTPS/g' config/general.h
|
||||
|
||||
cat > embed.ipxe << EOF
|
||||
#!ipxe
|
||||
|
||||
dhcp
|
||||
chain boot.ipxe || shell
|
||||
EOF
|
||||
|
||||
cd - > /dev/null
|
||||
}
|
||||
|
||||
function build_ipxe() {
|
||||
cd "${IPXE_DIR}/src"
|
||||
for bin in "${IPXE_BIN[@]}"; do
|
||||
path=${IPXE_DIR}/src/${bin}
|
||||
if [ ! -f "${path}" ]; then
|
||||
make -j$(nproc) ${bin} EMBED=embed.ipxe
|
||||
fi
|
||||
done
|
||||
cd - > /dev/null
|
||||
}
|
||||
|
||||
function render() {
|
||||
${ROOT}/tools/render
|
||||
}
|
||||
|
||||
function host_tftp() {
|
||||
TFTP_DIR=$(mktemp --tmpdir -d tftp.XXX)
|
||||
chmod 755 ${TFTP_DIR}
|
||||
function cleanup() {
|
||||
rm -rf ${TFTP_DIR}
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
cp ${ROOT}/rendered/boot.ipxe ${TFTP_DIR}
|
||||
for bin in "${IPXE_BIN[@]}"; do
|
||||
path=${IPXE_DIR}/src/${bin}
|
||||
cp ${path} ${TFTP_DIR}
|
||||
done
|
||||
|
||||
echo "Starting tftpd"
|
||||
sudo in.tftpd --verbosity 100 --permissive -L --secure ${TFTP_DIR}
|
||||
}
|
||||
|
||||
download_ipxe
|
||||
patch_ipxe
|
||||
build_ipxe
|
||||
render
|
||||
host_tftp
|
||||
154
tools/vm
Executable file
154
tools/vm
Executable file
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
ROOT=$(git rev-parse --show-toplevel)
|
||||
|
||||
VM_NAME="talos-vm"
|
||||
VCPUS="2"
|
||||
RAM_MB="2048"
|
||||
DISK_GB="10"
|
||||
NETWORK=talos
|
||||
CONNECTION="qemu:///system"
|
||||
|
||||
function define_network() {
|
||||
config_file=$(mktemp)
|
||||
cat > ${config_file} << EOF
|
||||
<network>
|
||||
<name>${NETWORK}</name>
|
||||
<bridge name="talos0" stp="on" delay="0"/>
|
||||
<forward mode='nat'>
|
||||
<nat/>
|
||||
</forward>
|
||||
<ip address="192.168.1.1" netmask="255.255.255.0">
|
||||
<dhcp>
|
||||
<range start="192.168.1.2" end="192.168.1.254"/>
|
||||
<bootp file='ipxe.pxe'/>
|
||||
</dhcp>
|
||||
</ip>
|
||||
</network>
|
||||
EOF
|
||||
|
||||
function cleanup() {
|
||||
rm ${config_file}
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
if [[ $(virsh --connect="${CONNECTION}" net-list --all | grep -c "${NETWORK}") == "0" ]]; then
|
||||
virsh --connect="${CONNECTION}" net-define "${config_file}"
|
||||
virsh --connect="${CONNECTION}" net-start "${NETWORK}"
|
||||
virsh --connect="${CONNECTION}" net-autostart "${NETWORK}"
|
||||
fi
|
||||
|
||||
trap - EXIT
|
||||
cleanup
|
||||
}
|
||||
|
||||
|
||||
function create() {
|
||||
define_network
|
||||
|
||||
if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") == "0" ]]; then
|
||||
virt-install --connect="${CONNECTION}" --name="${VM_NAME}" --vcpus="${VCPUS}" --memory="${RAM_MB}" \
|
||||
--os-variant="linux2022" \
|
||||
--disk="size=${DISK_GB}" \
|
||||
--pxe \
|
||||
--sysinfo system.serial=${VM_NAME} \
|
||||
--network network="${NETWORK}"
|
||||
else
|
||||
echo -n "VM already exists, start it with:
|
||||
${0} start
|
||||
"
|
||||
exit -1
|
||||
fi
|
||||
}
|
||||
|
||||
function start() {
|
||||
if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") > "0" ]]; then
|
||||
virsh --connect="${CONNECTION}" start ${VM_NAME}
|
||||
virt-viewer --connect="${CONNECTION}" ${VM_NAME}
|
||||
else
|
||||
echo -n "VM doest not exists yet, create it with:
|
||||
${0} create
|
||||
"
|
||||
exit -1
|
||||
fi
|
||||
}
|
||||
|
||||
function connect() {
|
||||
if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then
|
||||
virt-viewer --connect="${CONNECTION}" ${VM_NAME}
|
||||
else
|
||||
echo "VM is not running"
|
||||
exit -1
|
||||
fi
|
||||
}
|
||||
|
||||
function stop() {
|
||||
if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then
|
||||
virsh --connect="${CONNECTION}" shutdown ${VM_NAME}
|
||||
WAIT=240
|
||||
for i in $(seq 0 1 ${WAIT}); do
|
||||
echo -en "\rWaiting for VM to shutdown... (${i}/${WAIT})"
|
||||
|
||||
if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") == "0" ]]; then
|
||||
echo -e "\nVM successfully shutdown"
|
||||
exit
|
||||
fi
|
||||
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo -e "\nDestroying VM"
|
||||
virsh --connect="${CONNECTION}" destroy ${VM_NAME}
|
||||
else
|
||||
echo "VM is not running"
|
||||
exit -1
|
||||
fi
|
||||
}
|
||||
|
||||
function delete() {
|
||||
if [[ $(virsh --connect="${CONNECTION}" list --all | grep -c "${VM_NAME}") > "0" ]]; then
|
||||
if [[ $(virsh --connect="${CONNECTION}" list | grep -c "${VM_NAME}") > "0" ]]; then
|
||||
virsh --connect="${CONNECTION}" destroy "${VM_NAME}"
|
||||
fi
|
||||
virsh --connect="${CONNECTION}" undefine "${VM_NAME}" --remove-all-storage
|
||||
else
|
||||
echo "VM doest not exists"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
if [[ $(virsh --connect="${CONNECTION}" net-list --all | grep -c "${NETWORK}") > "0" ]]; then
|
||||
virsh --connect="${CONNECTION}" net-destroy "${NETWORK}"
|
||||
virsh --connect="${CONNECTION}" net-undefine "${NETWORK}"
|
||||
fi
|
||||
}
|
||||
|
||||
function help() {
|
||||
echo -n "Available commands:
|
||||
start
|
||||
stop
|
||||
remove
|
||||
connect
|
||||
"
|
||||
}
|
||||
|
||||
COMMAND=${1:-}
|
||||
case ${COMMAND} in
|
||||
create)
|
||||
create Create the vm and perform first install
|
||||
;;
|
||||
start)
|
||||
start Start the vm
|
||||
;;
|
||||
stop)
|
||||
stop Stop the vm
|
||||
;;
|
||||
delete)
|
||||
delete Delete the vm
|
||||
;;
|
||||
connect)
|
||||
connect Connect to an already running vm
|
||||
;;
|
||||
*)
|
||||
help
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user