From 8ebf3270d9153c53995bbcd2b46b52470768913e Mon Sep 17 00:00:00 2001 From: John Pappas Date: Thu, 22 Oct 2026 09:33:00 -0600 Subject: [PATCH 1/8] Pull in fixes from bad demo --- kickstart.sh | 57 ++++++++++++++++++++++++++++++++++++++++------------ mkiso.sh | 41 +++++++++++++++++++++++++++++++++++++ upload.sh | 32 +++++++++++++++++------------ 3 files changed, 104 insertions(+), 26 deletions(-) create mode 100755 mkiso.sh diff --git a/kickstart.sh b/kickstart.sh index 5b29c81..c206cb3 100755 --- a/kickstart.sh +++ b/kickstart.sh @@ -3,23 +3,54 @@ set -euo pipefail PYTHON="${PYTHON:-python3.12}" VENV="${VENV:-.venv}" -WHEELHOUSE="${WHEELHOUSE:-pypi}" -if [[ ${LOCK+x} ]]; then - echo "LOCK is set." - REQFILE="${REQFILE:-requirements-lock.txt}" -else - REQFILE="${REQFILE:-requirements.txt}" -fi +command -v "${PYTHON}" >/dev/null 2>&1 || { + echo "ERROR: Python interpreter not found: ${PYTHON}" >&2 + exit 1 +} -CA_BUNDLE="${CA_BUNDLE:-/etc/ssl/certs/ca-certificates.crt}" -export TWINE_CA_BUNDLE="${CA_BUNDLE}" +if [[ -z "${WHEELHOUSE:-}" ]]; then + PYTHON_SERIES=$( + "${PYTHON}" -c \ + 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' + ) -command -v "${PYTHON}" >/dev/null 2>&1 || { - echo "ERROR: ${PYTHON} is not installed." >&2 + shopt -s nullglob + matches=( "pypi-${PYTHON_SERIES}."* ) + shopt -u nullglob + + case "${#matches[@]}" in + 0) + echo "ERROR: No pypi-${PYTHON_SERIES}.* directory found." >&2 + exit 1 + ;; + 1) + WHEELHOUSE="${matches[0]}" + ;; + *) + echo "ERROR: Multiple matching wheelhouses found:" >&2 + printf ' %s\n' "${matches[@]}" >&2 + echo "Set WHEELHOUSE explicitly to select one." >&2 + exit 1 + ;; + esac +fi + +[[ -d "${WHEELHOUSE}" ]] || { + echo "ERROR: Wheelhouse is not a directory: ${WHEELHOUSE}" >&2 exit 1 } +echo "Using Python: $("${PYTHON}" --version 2>&1)" +echo "Using wheelhouse: ${WHEELHOUSE}" + +if [[ ${LOCK+x} ]]; then + echo "LOCK is set." + REQFILE="${REQFILE:-requirements-lock.txt}" +else + REQFILE="${REQFILE:-requirements-dev.txt}" +fi + [[ -d "${WHEELHOUSE}" ]] || { echo "ERROR: Wheelhouse not found: ${WHEELHOUSE}" >&2 exit 1 @@ -41,13 +72,13 @@ echo "Python environment:" echo echo "Installing packages from ${WHEELHOUSE}..." if [[ ${LOCK+x} ]]; then - "${VENV}/bin/python" -m pip install \ + "${VENV}/bin/python" -m pip install \ --no-index \ --find-links "${WHEELHOUSE}" \ --require-hashes \ --requirement "${REQFILE}" else - "${VENV}/bin/python" -m pip install \ + "${VENV}/bin/python" -m pip install \ --no-index \ --find-links "${WHEELHOUSE}" \ --requirement "${REQFILE}" diff --git a/mkiso.sh b/mkiso.sh new file mode 100755 index 0000000..7a61606 --- /dev/null +++ b/mkiso.sh @@ -0,0 +1,41 @@ +#!/bin/bash +set -e +if [ $1 ]; then + ROOTDIR=$1 + echo -e "\n$ROOTDIR" +else + echo -e "\nUsage Instructions:" + echo -e "\t $0 directory" + echo -e "\nUsing default + ROOTDIR=${basename $PWD} + echo -e "\n$ROOTDIR" +fi + +if [ -n $DATE ]; then + DATE=`date '+%Y%m%d-%H%M'` +fi + +echo "Run Collection Script for $ROOTDIR.txt" +./collect.sh $ROOTDIR.txt + +echo "Copy README to ISO" +cp -v README.md $ROOTDIR/ + +echo "Make ISO" +echo -e "\nMaking ISO of $1" +mkisofs -J -R -v -T -l \ + -V $ROOTDIR-$DATE \ + -A $ROOTDIR-$DATE \ + -o $ROOTDIR-$DATE.iso \ + $ROOTDIR + +echo "Implant MD5 sum into iso" +implantisomd5 $ROOTDIR-$DATE.iso + +echo "Generate Hash" +sha256sum -b $ROOTDIR-$DATE.iso >>\ + $ROOTDIR-$DATE.iso.sha +cat $ROOTDIR-$DATE.iso.sha + +echo "Show ISO & Hash" +ls -Alht *.iso* \ No newline at end of file diff --git a/upload.sh b/upload.sh index f0aacf6..ced6ff5 100755 --- a/upload.sh +++ b/upload.sh @@ -5,7 +5,12 @@ set -euo pipefail : "${NEXUS_USER:?}" : "${NEXUS_PASSWORD:?}" -CA_BUNDLE="${CA_BUNDLE:-/etc/ssl/certs/ca-certificates.crt}" +if [[ ${CA_BUNDLE+x} ]]; then + echo "CA_BUNDLE is set: ${CA_BUNDLE}" +else + CA_BUNDLE="${CA_BUNDLE:-/etc/ssl/cert.pem}" + echo "Using CA_BUNDLE: ${CA_BUNDLE}" +fi command -v twine >/dev/null || { echo "ERROR: twine not found" @@ -18,16 +23,17 @@ REPORT="upload.log" : > "${REPORT}" [[ -r "${CA_BUNDLE}" ]] || { - echo "ERROR: CA bundle is not readable: ${CA_BUNDLE}" >&2 - exit 1 + echo "ERROR: CA bundle is not readable: ${CA_BUNDLE}" >&2 + exit 1 } -export TWINE_CA_BUNDLE="${CA_BUNDLE}" +export TWINE_CERT="${CA_BUNDLE}" +export REQUESTS_CA_BUNDLE="${CA_BUNDLE}" echo -en "\nFinding files to upload: " -find pypi \ - -type f \ - \( -name "*.whl" -o -name "*.tar.gz" -o -name "*.zip" \) \ - | sort > upload.lst +find pypi-* \ +-type f \ +\( -name "*.whl" -o -name "*.tar.gz" -o -name "*.zip" \) \ +| sort > upload.lst TOTAL=$(wc -l < upload.lst) echo "Done. Found ${TOTAL} files." @@ -35,11 +41,11 @@ echo -e "\nUploading files:" while IFS= read -r FILE do if twine upload \ - --repository-url "${NEXUS_URL}" \ - --username "${NEXUS_USER}" \ - --password "${NEXUS_PASSWORD}" \ - "${FILE}" \ - >> "${REPORT}" 2>&1 + --repository-url "${NEXUS_URL}" \ + --username "${NEXUS_USER}" \ + --password "${NEXUS_PASSWORD}" \ + "${FILE}" \ + >> "${REPORT}" 2>&1 then echo "SUCCESS: ${FILE}" | tee -a "${REPORT}" else From d9aac9ec70940ec83344d1aba8da1bb0dfc4d093 Mon Sep 17 00:00:00 2001 From: John Pappas Date: Thu, 22 Oct 2026 09:54:53 -0600 Subject: [PATCH 2/8] Remove ubuntu as the driver of Python version --- .github/workflows/branch.yml | 8 +++----- .github/workflows/main.yml | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index e6fc452..e387bf2 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -54,24 +54,22 @@ jobs: python_versions=$(curl --fail --silent --show-error \ https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json) - os_version=$(. /etc/os-release; echo "$VERSION_ID") get_version() { local version version=$(echo "$python_versions" \ - | jq -r --arg series "$1" --arg os_version "$os_version" ' + | jq -r --arg series "$1" ' .[] | select(.stable == true) | select(.version | startswith($series + ".")) | select(any(.files[]; - .platform == "linux" and .platform_version == $os_version - and .arch == "x64")) + .platform == "linux" and .arch == "x64")) | .version ' \ | sort -V \ | tail -1) || return 1 if [[ -z "$version" ]]; then - echo "No stable Python $1 x64 build available for Ubuntu $os_version" >&2 + echo "No stable Python $1 x64 build available" >&2 return 1 fi echo "$version" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index be5a847..d7854b7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,24 +54,22 @@ jobs: python_versions=$(curl --fail --silent --show-error \ https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json) - os_version=$(. /etc/os-release; echo "$VERSION_ID") get_version() { local version version=$(echo "$python_versions" \ - | jq -r --arg series "$1" --arg os_version "$os_version" ' + | jq -r --arg series "$1" ' .[] | select(.stable == true) | select(.version | startswith($series + ".")) | select(any(.files[]; - .platform == "linux" and .platform_version == $os_version - and .arch == "x64")) + .platform == "linux" and .arch == "x64")) | .version ' \ | sort -V \ | tail -1) || return 1 if [[ -z "$version" ]]; then - echo "No stable Python $1 x64 build available for Ubuntu $os_version" >&2 + echo "No stable Python $1 x64 build available" >&2 return 1 fi echo "$version" From b8b549663b52c158e0e0878664f2b3aa90e9ddcd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Oct 2026 16:01:04 +0000 Subject: [PATCH 3/8] Pin Python collection jobs to compatible Ubuntu 24.04 runners Co-authored-by: pappasjfed <163186936+pappasjfed@users.noreply.github.com> --- .github/workflows/branch.yml | 4 +-- .github/workflows/main.yml | 4 +-- README.md | 8 +++--- .../update_python_runtimes.cpython-312.pyc | Bin 0 -> 5323 bytes .../test_collection_versions.cpython-312.pyc | Bin 0 -> 7411 bytes ...est_update_python_runtimes.cpython-312.pyc | Bin 0 -> 6520 bytes tests/test_collection_versions.py | 25 +++++++++++------- 7 files changed, 25 insertions(+), 16 deletions(-) create mode 100644 scripts/__pycache__/update_python_runtimes.cpython-312.pyc create mode 100644 tests/__pycache__/test_collection_versions.cpython-312.pyc create mode 100644 tests/__pycache__/test_update_python_runtimes.cpython-312.pyc diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index e387bf2..8359aac 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -110,7 +110,7 @@ jobs: cat $GITHUB_OUTPUT Collect: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ Setup ] permissions: @@ -217,7 +217,7 @@ jobs: if-no-files-found: error SecurityScan: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ Setup, Collect ] permissions: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d7854b7..31a97ea 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -110,7 +110,7 @@ jobs: cat $GITHUB_OUTPUT Collect: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ Setup ] permissions: @@ -217,7 +217,7 @@ jobs: if-no-files-found: error SecurityScan: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [ Setup, Collect ] permissions: diff --git a/README.md b/README.md index a35a22b..493cbcf 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,11 @@ Use `upload.sh` on the highside to setup the venv to enable uploading ## Python runtime versions -Collection jobs select the latest stable x64 Python build for the runner's Ubuntu -version from the `actions/python-versions` manifest used by `setup-python`, rather -than assuming every python.org release has an available Actions build. +Collection jobs select the latest stable Linux x64 Python build from the +`actions/python-versions` manifest used by `setup-python`, rather than assuming +every python.org release has an available Actions build. Collection and security +scan jobs use Ubuntu 24.04 so Python 3.9 remains available; moving these jobs to a +newer runner requires checking build availability for every collected series. Both collection workflows read `python-runtimes.json`. Its `source_versions` list selects the Python source archives; `windows_versions` independently selects diff --git a/scripts/__pycache__/update_python_runtimes.cpython-312.pyc b/scripts/__pycache__/update_python_runtimes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d3c1e99225e1c8ce9b4e7ddd7856ce762b7a677 GIT binary patch literal 5323 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_collection_versions.cpython-312.pyc b/tests/__pycache__/test_collection_versions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..067a2a7c9ffd84880451f86f188b627b914ed9a0 GIT binary patch literal 7411 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 Date: Thu, 22 Oct 2026 16:03:16 +0000 Subject: [PATCH 4/8] Exclude generated Python bytecode from repository Co-authored-by: pappasjfed <163186936+pappasjfed@users.noreply.github.com> --- .gitignore | 2 ++ .../update_python_runtimes.cpython-312.pyc | Bin 5323 -> 0 bytes .../test_collection_versions.cpython-312.pyc | Bin 7411 -> 0 bytes .../test_update_python_runtimes.cpython-312.pyc | Bin 6520 -> 0 bytes 4 files changed, 2 insertions(+) delete mode 100644 scripts/__pycache__/update_python_runtimes.cpython-312.pyc delete mode 100644 tests/__pycache__/test_collection_versions.cpython-312.pyc delete mode 100644 tests/__pycache__/test_update_python_runtimes.cpython-312.pyc diff --git a/.gitignore b/.gitignore index 637ee79..4b29572 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,11 @@ dist/ pypi*/ pypi coverage/ +__pycache__/ docs/ # Ignore Files +*.pyc *.tgz *.tar.gz *.gz diff --git a/scripts/__pycache__/update_python_runtimes.cpython-312.pyc b/scripts/__pycache__/update_python_runtimes.cpython-312.pyc deleted file mode 100644 index 6d3c1e99225e1c8ce9b4e7ddd7856ce762b7a677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5323 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 diff --git a/tests/__pycache__/test_collection_versions.cpython-312.pyc b/tests/__pycache__/test_collection_versions.cpython-312.pyc deleted file mode 100644 index 067a2a7c9ffd84880451f86f188b627b914ed9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7411 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 Date: Thu, 22 Oct 2026 09:57:39 -0600 Subject: [PATCH 5/8] WIP: Vagrantfile --- Vagrantfile | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 Vagrantfile diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..b0145c8 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,125 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "oraclelinux/9-btrfs" + config.vm.box_url = "https://oracle.github.io/vagrant-projects/boxes/oraclelinux/9-btrfs.json" + config.vm.hostname = "Node-Collector" + + config.ssh.key_type = :ecdsa521 # Requires Vagrant 2.4.1 + + ############################################################################ + # Provider-specific configuration # + ############################################################################ + config.vm.provider "virtualbox" do |vb| + # Set Name + vb.name = "Node Collector - OEL9" + + # Display the VirtualBox GUI when booting the machine + vb.gui = false + + # Set up VM options + vb.customize ["modifyvm", :id, "--vm-process-priority", "normal"] + vb.customize ["modifyvm", :id, "--graphiccontroller", "vmsvga"] + vb.customize ["modifyvm", :id, "--vram", "160"] + vb.customize ["modifyvm", :id, "--clipboard-mode", "bidirectional"] + vb.customize ["modifyvm", :id, "--draganddrop", "bidirectional"] + vb.customize ["modifyvm", :id, "--usbxhci", "on"] + vb.customize ["modifyvm", :id, "--audioin", "on"] + vb.customize ["modifyvm", :id, "--audiocontroller", "hda"] + vb.customize ["modifyvm", :id, "--vrde", "off"] + end + + ############################################################################ + # File copy provisioners # + ############################################################################ + config.vm.provision "file", source: "~/.ssh", destination: ".ssh" + config.vm.provision "file", source: "~/.gitconfig", destination: ".gitconfig" + + ############################################################################ + # Shell script provisioner # + ############################################################################ + config.vm.provision "shell", inline: <<-'SHELL' + ############################################################################ + # Add Software # + ############################################################################ + # Add EPEL + echo -e "\nInstalling additional repos\n" + dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm + curl -fsSL https://cli.github.com/packages/rpm/gh-cli.repo >\ + "/etc/yum.repos.d/github-cli.repo" + echo + /usr/bin/crb enable + + # Software Update + echo -e "\nInstalling Updates\n" + dnf update -y + + # Install Container/Additional Software + echo -e "\nInstalling additional software\n" + dnf install -y podman skopeo podman-docker tmux tree \ + git git-lfs gh rsync mkisofs isomd5sum \ + python3.12 python3.12-venv python3.12-pip + + # Setup Rootless Podman + echo -e "\nSetting up rootless podman" + sysctl user.max_user_namespaces=15000 + sed -i 's/user.max_user_namespaces=0/user.max_user_namespaces=15000/i' /etc/sysctl.conf + usermod --add-subuids 200000-201000 --add-subgids 200000-201000 vagrant + groupadd -r docker + usermod -aG docker vagrant + touch /etc/containers/nodocker + + # Import .ssh to vagrant user + echo -e "\nSetting up vagrant user .ssh" + cp -v /root/.gitconfig /home/vagrant/ + git config --global http.sslBackend openssl + cat /home/vagrant/.ssh/id*.pub >> /home/vagrant/.ssh/authorized_keys + cat /root/.ssh/id*.pub >> /root/.ssh/authorized_keys + chown -R vagrant:vagrant /home/vagrant + chmod -R 600 /home/vagrant/.ssh + chmod 700 /home/vagrant/.ssh + + echo -e "\nDone Updating. Rebooting.\n" + SHELL + + # Reboot to enable updates + config.vm.provision 'shell', reboot: true + + # Enable FIPS + config.vm.provision "shell", inline: <<-'SHELL' + echo -e "\nEnabling FIPS\n" + fips-mode-setup --enable + SHELL + + # Reboot to enable FIPS + config.vm.provision 'shell', reboot: true + + # Run Local routine to set up environment + config.vm.provision "shell", privileged: false, + env: { + GITHUB_TOKEN:ENV['GITHUB_TOKEN'] + }, inline: <<-'SHELL' + echo -e "\nRunning user provisioning\n" + if [[ -z "$GITHUB_TOKEN" ]]; then + echo "GITHUB_TOKEN undefined. Will Prompt authentication via browser" + gh auth login + else + echo "GITHUB_TOKEN detected. Respecting token." + fi + export DATE=`date '+%Y%m%d-%H%M'` + + ./setup.sh + ./collect.sh + # ./mkiso.sh + + SHELL + +end From 27059b59af725c704a20483ba1ec99364ede7a25 Mon Sep 17 00:00:00 2001 From: John Pappas <163186936+pappasjfed@users.noreply.github.com> Date: Thu, 22 Oct 2026 13:46:22 -0600 Subject: [PATCH 6/8] Fix password variable name in upload script to be consistent --- upload.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/upload.sh b/upload.sh index ced6ff5..81db90f 100755 --- a/upload.sh +++ b/upload.sh @@ -43,7 +43,7 @@ do if twine upload \ --repository-url "${NEXUS_URL}" \ --username "${NEXUS_USER}" \ - --password "${NEXUS_PASSWORD}" \ + --password "${NEXUS_PASS}" \ "${FILE}" \ >> "${REPORT}" 2>&1 then @@ -68,4 +68,4 @@ echo -e "\nUpload complete. See ${REPORT} for details." if [ "${FAILED}" -gt 0 ]; then exit 1 -fi \ No newline at end of file +fi From 6a84295e29b5c613589ea02d6c7120e876c02caa Mon Sep 17 00:00:00 2001 From: John Pappas <163186936+pappasjfed@users.noreply.github.com> Date: Thu, 22 Oct 2026 13:47:01 -0600 Subject: [PATCH 7/8] Update requirements-dev.txt to include gcovr --- requirements-dev.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ce39f9c..6987758 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -13,4 +13,5 @@ reprotest twine virtualenv wheel -ruff \ No newline at end of file +ruff +gcovr From 479bc3e42f0ad0c97340d8a3afda3e031767c164 Mon Sep 17 00:00:00 2001 From: John Pappas <163186936+pappasjfed@users.noreply.github.com> Date: Thu, 22 Oct 2026 13:53:50 -0600 Subject: [PATCH 8/8] Add step to copy shell scripts to ISO Added a step to copy shell scripts to the ISO directory. --- .github/workflows/branch.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 8359aac..34733ad 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -522,16 +522,19 @@ jobs: - name: Copy Markdowns to ISO run: cp -v *.md ISO/ + - name: Copy scripts to ISO + run: cp -v *.sh ISO/ + + - name: Copy package manifests to ISO + run: | + cp -v requirements*.txt ISO/ + - name: Move evidence to ISO/evidence run: | mkdir -p ISO/evidence mv -v ISO/*report* ISO/evidence/ mv -v ISO/*sbom* ISO/evidence/ - - name: Copy package manifests to ISO - run: | - cp -v requirements*.txt ISO/ - - name: Package source repository into ISO run: | echo -e "\nPackaging source repository"