Compare commits

...

11 Commits

32 changed files with 872 additions and 108 deletions

View File

@ -44,7 +44,26 @@ For OpenBSD images with cloud-init support, this project uses: [hcartiaux's open
1. Configure the [variables](env_scripts/common.sh) file (`env_scripts/common.sh`). 1. Configure the [variables](env_scripts/common.sh) file (`env_scripts/common.sh`).
It is recommended to place this directory in your home folder to avoid libvirt permission issues. It is recommended to place this directory in your home folder to avoid libvirt permission issues.
2. Run the installation script: install.sh 2. Run the installation script: `install.sh`
## Networking
Two networks are installed when you run `install.sh`:
| Name | Type |DCHP Range |Default route |Host device |
| ----- | -------- |-------------|----------------|--------------|
| vmnetwork | NAT |192.168.100.100 - 254| 192.168.100.1| virb1|
| host-only | Isolated Network |-|-| -|
**Table 1:** Default Available Networks
You can network names changing on [env_scripts/common.sh](env_scripts/common.sh)
```
VM_NETWORK_HOSTONLY="host-only"
VM_USERNAME="user"
```
You can create a VM with isolated network but an extra interface with NAT network if added, because when guest is initialized, it get updated and some packages are installed (dependend on linux-user-metadata). You can delete NAT interface after VM guest is initialized.
### AppArmor exception (if needed) ### AppArmor exception (if needed)
@ -67,8 +86,8 @@ sudo virsh --connect qemu:///session net-define /dev/stdin << EOF
</network> </network>
EOF EOF
``` --> ``` -->
## Examples ## Command Usage
### Command usage ### Command help
```shell ```shell
NAME NAME
./vm_manage.sh ./vm_manage.sh
@ -78,6 +97,7 @@ USAGE
./vm_manage.sh delete NAME ./vm_manage.sh delete NAME
./vm_manage.sh info NAME ./vm_manage.sh info NAME
./vm_manage.sh connect NAME ./vm_manage.sh connect NAME
./vm_manage.sh install NAME
./vm_manage.sh list ./vm_manage.sh list
ACTIONS ACTIONS
@ -86,6 +106,7 @@ ACTIONS
list List all defined virtual machines list List all defined virtual machines
info Show information about a virtual machine info Show information about a virtual machine
connect Connect to the console of a virtual machine connect Connect to the console of a virtual machine
install Install specific software into an existing VM
OPTIONS OPTIONS
-h Show this help message -h Show this help message
@ -149,6 +170,24 @@ Domain 'ubuntuTest' has been undefined
VM 'ubuntuTest' removed successfully. VM 'ubuntuTest' removed successfully.
``` ```
## Install software on VM
`./vm_manage.sh install VM_NAME`
Example:
```shell
./vm_manage.sh install Debian
Select software to install:
--------------
1. Docker
2. Podman
3. Gitlab CE
4. Gitlab Runner
Enter your choice [1-4]:
```
## TODO ## TODO
- Maybe add more BSD flavours guests support - Maybe add more BSD flavours guests support

View File

@ -1,16 +1,22 @@
#!/bin/env bash #!/bin/env bash
LIBVIRT_NET_MODEL="virtio" DISTRO=""
LIBVIRT_NET_OPTION="network=$VM_NETWORK,model=$LIBVIRT_NET_MODEL"
OS_JSON_FILE="files/os_options.json"
#VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/.local/share/libvirt"} #VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/.local/share/libvirt"}
#VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/var/lib/libvirt"} #VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/var/lib/libvirt"}
VM_BASE_DIR="${HOME}/vms" VM_BASE_DIR="${HOME}/vms"
VM_BASE_IMAGES="base" VM_BASE_IMAGES="base"
VM_DISK_EXTENSION="img" VM_DISK_EXTENSION="img"
VM_NETWORK_NAT="vmnetwork"
VM_NETWORK_HOSTONLY="host-only"
VM_NETWORK_TYPE="nat"
VM_USERNAME="user" VM_USERNAME="user"
VM_SOFT="";
VM_IMAGE_PATH="${VM_BASE_DIR}/images/$1.img" VM_IMAGE_PATH="${VM_BASE_DIR}/images/$1.img"
CI_IMAGE_PATH="${VM_BASE_DIR}/images/$1-cidata.iso" CI_IMAGE_PATH="${VM_BASE_DIR}/images/$1-cidata.iso"
VM_NETWORK="vmnetwork" LIBVIRT_NET_MODEL="virtio"
REPO_BRANCH="main" LIBVIRT_NET_OPTION="network=${VM_NETWORK_NAT},model=${LIBVIRT_NET_MODEL}"
REPO_SOURCE="https://raw.githubusercontent.com/vgenguita/kvm-cloudimage/refs/heads/${REPO_BRANCH}/env_scripts/" OS_JSON_FILE="files/os_options.json"
OS_JSON_FILE_INSTALL="files/software.json"
# REPO_BRANCH="main"
# REPO_SOURCE="https://raw.githubusercontent.com/vgenguita/kvm-cloudimage/refs/heads/${REPO_BRANCH}/env_scripts/"

View File

@ -7,6 +7,76 @@ pause()
echo "" echo ""
} }
# Printe messages
print_info() {
echo -e "\e[1;34m[INFO]\e[0m $1"
}
print_success() {
echo -e "\e[1;32m[OK]\e[0m $1"
}
print_error() {
echo -e "\e[1;31m[ERROR]\e[0m $1"
}
# Detectar distribución
detect_distro()
{
if [ -f /etc/os-release ]; then
. /etc/os-release
DISTRO=$ID
# elif [ -f /etc/centos-release ] || [ -f /etc/fedora-release ]; then
# if grep -q "Fedora" /etc/fedora-release; then
# DISTRO="fedora"
# else
# DISTRO="centos"
# fi
else
print_error "No se pudo detectar la distribución."
exit 1
fi
}
install_debian_ubuntu() {
print_info "Updating packages..."
sudo apt update || { print_error "Error updating packages."; exit 1; }
print_info "Installing libvirt"
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils|| {
print_error "Error installing packages."
exit 1
}
# Habilitar e iniciar el servicio
sudo systemctl enable libvirtd || sudo systemctl enable libvirt-bin
sudo systemctl start libvirtd || sudo systemctl start libvirt-bin
}
install_arch() {
print_info "Updating packages..."
sudo pacman -Syu --noconfirm || { print_error "Error updating packages."; exit 1; }
print_info "Installing libvirt."
sudo pacman -S --noconfirm qemu libvirt virt-manager dnsmasq iptables bridge-utils|| {
print_error "Error installing packages."
exit 1
}
}
install_fedora() {
print_info "Updating packages..."
sudo dnf upgrade -y|| { print_error "Error updating packages."; exit 1; }
print_info "Installing libvirt."
sudo sudo dnf install -y @virtualization qemu libvirt bridge-utils|| {
print_error "Error installing packages."
exit 1
}
}
check_host_os() check_host_os()
{ {
local HOST_OS=$(cat /etc/os-release | grep -v VERSION_ID |grep "ID=" | awk -F'=' '{print $2}') local HOST_OS=$(cat /etc/os-release | grep -v VERSION_ID |grep "ID=" | awk -F'=' '{print $2}')
@ -17,6 +87,13 @@ check_host_os()
fi fi
} }
chown_image_permissions(){
if [[ "${DISTRO}" == "fedora" ]]; then
USER_GROUP="$USER:qemu"
else
USER_GROUP="$USER:libvirt-qemu"
fi
}
generate_openbsd_image() generate_openbsd_image()
{ {
@ -32,7 +109,7 @@ generate_openbsd_image()
-b -b
if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}"; then if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}"; then
mv images/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION} mv images/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
sudo chown -R $USER:libvirt-qemu "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}" sudo chown -R ${USER_GROUP} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
cd ${CURRENT_PATH} cd ${CURRENT_PATH}
rm -r openbsd-cloud-image rm -r openbsd-cloud-image
else else
@ -98,11 +175,12 @@ show_vm_menu() {
compare_checksum() compare_checksum()
{ {
CHECKSUM_TMP_FOLDER=$(mktemp) CHECKSUM_TMP_FOLDER=$(mktemp)
curl -L -o "${CHECKSUM_TMP_FOLDER}" \
wget -L \
--user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
-O "${CHECKSUM_TMP_FOLDER}" \
"${VM_CHECKSUMS_URL}" "${VM_CHECKSUMS_URL}"
# wget --recursive \
# --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
# -O "${CHECKSUM_TMP_FOLDER}" \
# "${VM_CHECKSUMS_URL}"
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
if [[ "${VM_BASE_IMAGE}" == *"zfs"* ]]; then if [[ "${VM_BASE_IMAGE}" == *"zfs"* ]]; then
@ -111,15 +189,28 @@ compare_checksum()
VM_BASE_IMAGE_CHECKSUM=$(grep "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT" "${CHECKSUM_TMP_FOLDER}" | grep "ufs.qcow2.xz" | awk '{print $4}') VM_BASE_IMAGE_CHECKSUM=$(grep "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT" "${CHECKSUM_TMP_FOLDER}" | grep "ufs.qcow2.xz" | awk '{print $4}')
fi fi
else else
VM_BASE_IMAGE_CHECKSUM=$(grep "$VM_BASE_IMAGE_NAME.${VM_BASE_IMAGE_EXTENSION}" "${CHECKSUM_TMP_FOLDER}" | awk '{print $1}') #Fedora things
if [[ "${VM_OS_VARIANT}" == "fedora41" ]]; then
VM_BASE_IMAGE_CHECKSUM=$(grep "${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}" "${CHECKSUM_TMP_FOLDER}" | grep -v \# | awk '{print $4}')
else
VM_BASE_IMAGE_CHECKSUM=$(grep "${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}" "${CHECKSUM_TMP_FOLDER}" | awk '{print $1}')
fi
fi fi
if [[ "${VM_CHECKSUMS_URL}" == *"SHA256"* || "${VM_CHECKSUMS_URL}" == *"sha256"* ]]; then if [[ "${VM_CHECKSUMS_URL}" == *"SHA256"* || "${VM_CHECKSUMS_URL}" == *"sha256"* ]]; then
HASH_CMD="sha256sum" HASH_CMD="sha256sum"
elif [[ "${VM_CHECKSUMS_URL}" == *"SHA512"* ]]; then elif [[ "${VM_CHECKSUMS_URL}" == *"SHA512"* ]]; then
HASH_CMD="sha512sum" HASH_CMD="sha512sum"
#Fedora things
else else
echo "ERROR: Unknown checksum type in URL: $CHECKSUM_URL" if grep -qi "SHA256" "${CHECKSUM_TMP_FOLDER}"; then
exit 1 HASH_CMD="sha256sum"
elif grep -qi "SHA512" "${CHECKSUM_TMP_FOLDER}"; then
HASH_CMD="sha512sum"
else
echo "ERROR: Cannot determinate checksum type on ${CHECKSUM_TMP_FOLDER}"
exit 1
fi
fi fi
BASE_FILE_CHECKSUM=$(${HASH_CMD} ${VM_BASE_IMAGE_LOCATION} | awk '{print $1}') BASE_FILE_CHECKSUM=$(${HASH_CMD} ${VM_BASE_IMAGE_LOCATION} | awk '{print $1}')
if [ "${BASE_FILE_CHECKSUM}" = "${VM_BASE_IMAGE_CHECKSUM}" ]; then if [ "${BASE_FILE_CHECKSUM}" = "${VM_BASE_IMAGE_CHECKSUM}" ]; then
@ -140,7 +231,7 @@ vm_list()
vm_net_get_mac() vm_net_get_mac()
{ {
local VM=$1 local VM=$1
MAC_VM=$(virsh domiflist "$VM" | awk '{ print $5 }' | tail -2 | head -1) MAC_VM=$(virsh domiflist "${VM}" | grep "${VM_NETWORK_NAT}"| awk '{ print $5 }' | tail -2 | head -1)
echo $MAC_VM echo $MAC_VM
} }
## Get VM ip (only on NAT) ## Get VM ip (only on NAT)
@ -202,10 +293,10 @@ vm_net_bridge_set_ip()
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${CURRENT_IP} "bash -s" -- < ../vm_example_scripts/apply_netplan.sh ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${CURRENT_IP} "bash -s" -- < ../vm_example_scripts/apply_netplan.sh
} }
vm_net_set_bridge_mode() vm_net_set_network_type()
{ {
if [[ -n $VM_BRIDGE_INT ]]; then if [[ "${VM_NETWORK_TYPE}" == "bridge" ]]; then
LIBVIRT_NET_OPTION="model=virtio,bridge=${VM_BRIDGE_INT}" LIBVIRT_NET_OPTION="model=virtio,bridge=${VM_BRIDGE_INT}"
fi fi
} }
## Connect to an existent VM using ssh ## Connect to an existent VM using ssh
@ -257,10 +348,14 @@ vm_download_base_image()
fi fi
VM_BASE_IMAGE_LOCATION="${VM_BASE_DIR}/${VM_BASE_IMAGES}/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}" VM_BASE_IMAGE_LOCATION="${VM_BASE_DIR}/${VM_BASE_IMAGES}/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}"
if ! test -f "${VM_BASE_IMAGE_LOCATION}"; then if ! test -f "${VM_BASE_IMAGE_LOCATION}"; then
wget -L \ # wget \
--user-agent="Mozilla/5.0 (X11; Linux x86_64)" \ # --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
-O "${VM_BASE_IMAGE_LOCATION}" \ # -O "${VM_BASE_IMAGE_LOCATION}" \
${VM_BASE_IMAGE_URL} # ${VM_BASE_IMAGE_URL}
curl -L ${VM_BASE_IMAGE_URL} \
-o ${VM_BASE_IMAGE_LOCATION} \
fi fi
} }
@ -282,7 +377,7 @@ vm_create_guest_image()
qemu-img resize \ qemu-img resize \
"${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}" \ "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}" \
"${VM_DISK_SIZE}G" "${VM_DISK_SIZE}G"
sudo chown -R $USER:libvirt-qemu "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}" sudo chown -R ${USER_GROUP} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
else else
echo "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION} already exists. Delete VM with "delete" option" echo "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION} already exists. Delete VM with "delete" option"
exit 1 exit 1
@ -426,6 +521,10 @@ vm_guest_install()
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --os-variant=${VM_OS_VARIANT}" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --os-variant=${VM_OS_VARIANT}"
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio"
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --network ${LIBVIRT_NET_OPTION}" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --network ${LIBVIRT_NET_OPTION}"
if [[ "${VM_NETWORK_TYPE}" == "isolated" ]]; then
LIBVIRT_NET_OPTION="network=${VM_NETWORK_HOSTONLY},model=${LIBVIRT_NET_MODEL}"
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --network ${LIBVIRT_NET_OPTION}"
fi
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --autostart" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --autostart"
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --import --noautoconsole" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --import --noautoconsole"
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --cloud-init user-data=${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data,meta-data=$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data" VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --cloud-init user-data=${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data,meta-data=$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data"
@ -436,10 +535,132 @@ vm_guest_install()
eval virt-install $VM_INSTALL_OPTS eval virt-install $VM_INSTALL_OPTS
virsh dumpxml "${VM_HOSTNAME}" > "${VM_BASE_DIR}/xml/${VM_HOSTNAME}.xml" virsh dumpxml "${VM_HOSTNAME}" > "${VM_BASE_DIR}/xml/${VM_HOSTNAME}.xml"
clear #clear
echo "VM ${VM_HOSTNAME} Created!" echo "VM ${VM_HOSTNAME} Created!"
echo "NOTE: It may take some time for the virtual machine to be available if it is a BSD flavor. You can check the status of the virtual machine with the following command:" echo "NOTE: It may take some time for the virtual machine to be available if it is a BSD flavor. You can check the status of the virtual machine with the following command:"
echo "root pass is(only for BSD flavour): ${VM_USER_PASS}" echo "root pass is(only for BSD flavour): ${VM_USER_PASS}"
echo "user pass is: ${VM_USER_PASS}" echo "user pass is: ${VM_USER_PASS}"
echo "virsh console ${VM_HOSTNAME} --safe" echo "virsh console ${VM_HOSTNAME} --safe"
} }
vm_get_guest_info()
{
# Obtener el ID del sistema operativo
# Obtener el ID del sistema operativo
OS_ID=$(grep -o 'id="[^"]*"' "$1" | tr -d '"' | awk '{print $1}')
# Eliminar el protocolo y el dominio del ID
OS_ID=$(echo "$OS_ID" | cut -d '/' -f 2-)
#echo $OS_ID
# Convertir la URL a un nombre de distribución y versión
VM_DISTRO=$(echo "$OS_ID" | awk -F '/' '{print $3}')
VM_VERSION=$(echo "$OS_ID" | awk -F '/' '{print $4}')
}
show_software_menu() {
# Display dynamic OS selection menu
echo "Select software to install:"
echo "--------------"
# Array to store valid IDs for validation
VALID_IDS=()
while IFS= read -r entry; do
DECODED=$(echo "$entry" | base64 --decode)
ID=$(echo "$DECODED" | jq -r '.id')
NAME=$(echo "$DECODED" | jq -r '.show_name')
printf "%2s. %s\n" "$ID" "$NAME"
VALID_IDS+=("$ID")
done < <(jq -r '.software[] | @base64' "$OS_JSON_FILE_INSTALL")
# Calculate max ID for range validation
ID_MAX=$(jq -r '[.software[].id] | max' "$OS_JSON_FILE_INSTALL")
ID_MIN=$(jq -r '[.software[].id] | min' "$OS_JSON_FILE_INSTALL")
# Read user input
read -r -p "Enter your choice [${ID_MIN}-${ID_MAX}]: " CHOICE
# Validate input: must be a number and within range
if ! [[ "$CHOICE" =~ ^[0-9]+$ ]]; then
echo "Error: Please enter a valid number." >&2
exit 1
fi
if (( CHOICE < ID_MIN || CHOICE > ID_MAX )); then
echo "Error: Please enter a number between ${ID_MIN} and ${ID_MAX}." >&2
exit 1
fi
# Get selected OS variant
SELECTED=$(jq -r ".software[] | select(.id == ${CHOICE})" "$OS_JSON_FILE_INSTALL")
if [ -z "$SELECTED" ]; then
echo "Error: Invalid selection." >&2
exit 1
fi
# Export variables in uppercase
VM_SOFT=$(echo "$SELECTED" | jq -r '.name')
}
vm_install_utils()
{
local VM=$1
local SCRIPT=''
local VM_DISTRO=''
local VM_VERSION=''
local VM_IP=$(vm_net_get_ip "$VM")
vm_get_guest_info ${VM_BASE_DIR}/xml/${VM}.xml
case ${VM_SOFT} in
docker)
if [[ "$VM_DISTRO" == "debian" ]]; then
SCRIPT='vm_example_scripts/docker_debian.sh'
elif [[ "$VM_DISTRO" == "ubuntu" ]]; then
SCRIPT='vm_example_scripts/docker_ubuntu.sh'
elif [[ "$VM_DISTRO" == "fedora" ]]; then
SCRIPT='vm_example_scripts/docker_fedora.sh'
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
echo "Automated installation for Docker on ${VM_DISTRO} is not available."
echo "It's better to use Pidman instead"
exit 1
fi
;;
podman)
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
SCRIPT='vm_example_scripts/podman_deb.sh'
elif [[ "$VM_DISTRO" == "fedora" ]]; then
SCRIPT='vm_example_scripts/podman_fedora.sh'
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
SCRIPT='vm_example_scripts/podman_freebsd.sh'
fi
;;
gitlab_ce)
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
SCRIPT='vm_example_scripts/gitlab_ce_deb.sh'
elif [[ "$VM_DISTRO" == "fedora" || "$VM_DISTRO" == "freebsd" ]]; then
#SCRIPT='vm_example_scripts/gitlab_ce_fedora.sh'
echo "Automated installation for Gitlab CE on ${VM_DISTRO} is not available by the moment."
exit 1
fi
;;
gitlab_runner)
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
SCRIPT='vm_example_scripts/gitlab_runner_deb.sh'
elif [[ "$VM_DISTRO" == "fedora" ]]; then
SCRIPT='vm_example_scripts/gitlab_runner_fedora.sh'
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
SCRIPT='vm_example_scripts/gitlab_runner_freebsd.sh'
fi
;;
*)
echo "Unknown action: ${ACTION}" >&2
usage
;;
esac
#Exec script
#bash ${SCRIPT}
if [[ "$VM_DISTRO" == "freebsd" ]]; then
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${VM_IP} "sudo sh -s" - < ${SCRIPT}
else
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${VM_IP} "sudo bash -s" - < ${SCRIPT}
fi
}

View File

@ -32,5 +32,5 @@ write_files:
append: true append: true
runcmd: runcmd:
- sysrc qemu_guest_agent_enable=YES - sysrc qemu_guest_agent_enable=YES
- sysrc ifconfig_vtnet0="DHCP" - sysrc ifconfig_vtnet0="DHCP -tso4 -tso6 -lro -vlanhwtso"
- sysrc ifconfig_DEFAULT="" - sysrc ifconfig_DEFAULT=""

View File

@ -0,0 +1,5 @@
<network>
<name>YOURNETWORK</name>
<bridge name='YOURNETWORK' stp='on' delay='0'/>
<!-- <domain name='hostonly.local'/> -->
</network>

View File

@ -2,12 +2,12 @@
"os_variants": [ "os_variants": [
{ {
"id": 1, "id": 1,
"name": "Debian 12", "name": "Debian Stable",
"variant": "debian13", "variant": "debian13",
"os_type": "GNULinux", "os_type": "GNULinux",
"url": "https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2", "url": "http://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2",
"origin_image_name": "debian-12-generic-amd64.qcow2", "origin_image_name": "debian-13-generic-amd64.qcow2",
"md5sum": "https://cdimage.debian.org/images/cloud/bookworm/latest/SHA512SUMS", "md5sum": "http://cloud.debian.org/images/cloud/trixie/latest/SHA512SUMS",
"boot_type": "bios" "boot_type": "bios"
}, },
{ {
@ -73,6 +73,16 @@
} , } ,
{ {
"id": 8, "id": 8,
"name": "Fedora CLoud",
"os_type": "GNULinux",
"variant": "fedora41",
"url": " https://download.fedoraproject.org/pub/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
"origin_image_name": "Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
"md5sum": "https://fedora.mirrorservice.org/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-42-1.1-x86_64-CHECKSUM",
"boot_type": "bios"
} ,
{
"id": 9,
"name": "FreeBSD 14.3 UFS", "name": "FreeBSD 14.3 UFS",
"os_type": "BSD", "os_type": "BSD",
"variant": "freebsd14.2", "variant": "freebsd14.2",
@ -81,7 +91,7 @@
"md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512" "md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512"
} , } ,
{ {
"id": 9, "id": 10,
"name": "FreeBSD 14.3 ZFS", "name": "FreeBSD 14.3 ZFS",
"os_type": "BSD", "os_type": "BSD",
"variant": "freebsd14.2", "variant": "freebsd14.2",
@ -90,7 +100,7 @@
"md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512" "md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512"
} , } ,
{ {
"id": 10, "id": 11,
"name": "OpenBSD 7.7 generic", "name": "OpenBSD 7.7 generic",
"os_type": "BSD", "os_type": "BSD",
"variant": "openbsd7.6", "variant": "openbsd7.6",

24
files/software.json Normal file
View File

@ -0,0 +1,24 @@
{
"software": [
{
"id": 1,
"show_name": "Docker",
"name": "docker"
},
{
"id": 2,
"show_name": "Podman",
"name": "podman"
},
{
"id": 3,
"show_name": "Gitlab CE",
"name": "gitlab_ce"
},
{
"id": 4,
"show_name": "Gitlab Runner",
"name": "gitlab_runner"
}
]
}

View File

@ -2,12 +2,43 @@
#Define variable names on env_scripts/common.sh #Define variable names on env_scripts/common.sh
#VM_NETWORK= #VM_NETWORK=
#VM_BASE_DIR= #VM_BASE_DIR=
#Install dependencies - TODO #Install dependencies
source env_scripts/common.sh source env_scripts/common.sh
source env_scripts/functions.sh
detect_distro
case $DISTRO in
ubuntu|debian)
install_debian_ubuntu
;;
arch)
install_arch
;;
fedora)
install_fedora
;;
*)
print_error "Distribution not supported: $DISTRO"
print_info "Supported: Ubuntu, Debian, Arch, Fedora"
exit 1
;;
esac
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG kvm $(whoami)
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
mkdir -p "${VM_BASE_DIR}"/{images,xml,init,base,ssh} mkdir -p "${VM_BASE_DIR}"/{images,xml,init,base,ssh}
cp files/network.xml ${VM_BASE_DIR}/xml/network.xml #Isolated network
sed -i "s/YOURNETWORK/${VM_NETWORK}/g" ${VM_BASE_DIR}/xml/network.xml cp files/network-host-only.xml ${VM_BASE_DIR}/xml/network-host-only.xml
virsh net-define ${VM_BASE_DIR}/xml/network.xml sed -i "s/YOURNETWORK/${VM_NETWORK_HOSTONLY}/g" ${VM_BASE_DIR}/xml/network-host-only.xml
virsh net-autostart ${VM_NETWORK} virsh net-define ${VM_BASE_DIR}/xml/network-host-only.xml
virsh net-start ${VM_NETWORK} virsh net-autostart ${VM_NETWORK_HOSTONLY}
virsh net-start ${VM_NETWORK_HOSTONLY}
#NAT
cp files/network-nat.xml ${VM_BASE_DIR}/xml/network-nat.xml
sed -i "s/YOURNETWORK/${VM_NETWORK_NAT}/g" ${VM_BASE_DIR}/xml/network-nat.xml
virsh net-define ${VM_BASE_DIR}/xml/network-nat.xml
virsh net-autostart ${VM_NETWORK_NAT}
virsh net-start ${VM_NETWORK_NAT}
newgrp libvirt

View File

@ -1,3 +1,3 @@
#!/bin/bash #!/usr/bin/env bash
sudo mv /home/user/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml sudo mv /home/user/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml
sudo netplan apply sudo netplan apply

View File

@ -0,0 +1,150 @@
#!/bin/sh -
#VARIABLES
# === Security and initialization ===
IFS=' ' # Reset IFS to prevent parsing attacks
# === Default values ===
ENABLE_DNS="yes"
ENABLE_DHCP="no"
ENABLE_PXE="no"
DNSMASQ_DCONF_DIR="/usr/local/etc/dnsmasq.conf.d"
DNSMASQ_CONFIG_FILE="/usr/local/etc/dnsmasq.conf"
LOCAL_NETWORK="192.168.1"
LOCAL_NETWORK_GATEWAY="${LOCAL_NETWORK}.1"
LOCAL_NETWORK_RANGE="${LOCAL_NETWORK}.0/24"
LOCAL_NETWORK_DHCP_FIRST_IP="50"
LOCAL_NETWORK_DHCP_LAST_IP="254"
LOCAL_NETWORK_NETMASK="255.255.255.0"
LOCAL_NETWORK_DHCP_LEASE="12h"
LOCAL_DOMAIN="pozal.lan"
#FUNCTIONS
# === Function: print header ===
print_header()
{
printf '%s\n' "================================"
printf '%s\n' " Dnsmasq Service Enabler"
printf '%s\n' "================================"
}
# === Function: ask yes/no ===
ask_yes_no()
{
# Usage: ask_yes_no "Question?" default(y/n)
prompt="$1"
default="$2"
while true; do
printf '%s ' "${prompt} (y/n) [${default}]: "
read -r response
case "${response:-${default}}" in
[Yy]|[Yy][Ss])
echo "yes"
return 0
;;
[Nn]|[Nn][Oo])
echo "no"
return 0
;;
*)
printf '%s\n' "Please answer yes or no."
;;
esac
done
}
change_config()
{
REPLACEMENTS_FILE=$1
if [ ! -f "${DNSMASQ_CONFIG_FILE}" ]; then
echo "Error: Config file '${DNSMASQ_CONFIG_FILE}' not found." >&2
exit 1
fi
if [ ! -r "${REPLACEMENTS_FILE}" ]; then
echo "Error: Replacements file '${REPLACEMENTS_FILE}' not found or not readable." >&2
exit 1
fi
cp "${DNSMASQ_CONFIG_FILE}" "${DNSMASQ_CONFIG_FILE}.bak" || {
echo "Error: Failed to create backup." >&2
exit 1
}
while IFS='@@@' read -r old new || [ -n "${old}" ]; do
# Saltar líneas vacías o comentarios
case "${old}" in
""|\#*) continue ;;
esac
# Aplicar sustitución con sed (usando | como delimitador)
if ! sed -i '' "s|${old}|${new}|g" "${DNSMASQ_CONFIG_FILE}"; then
echo "Error: Failed to replace '${old}' with '${new}'." >&2
exit 1
fi
echo "Replaced: '${old}' -> '${new}'"
done < "${REPLACEMENTS_FILE}"
echo "All replacements applied successfully."
}
change_dnsmasq_config()
{
if [ "${ENABLE_DNS}" = "yes" ]; then
enable_dns
fi
if [ "${ENABLE_DHCP}" = "yes" ]; then
enable_dhcp
fi
if [ "${ENABLE_PXE}" = "yes" ]; then
enable_pxe
fi
}
enable_dns()
{
change_config vm_template_files/dnsmasq_conf_dns
echo "dhcp-option=6,\"${JAIL_IP_ADDRESS},1.1.1.1\"" >> "${DNSMASQ_CONFIG_FILE}"
DNSMASQ_LISTS="vm_template_files/dnsmasq_lists.txt"
while IFS='@@@' read -r url file|| [ -n "${url}" ]; do
# Saltar líneas vacías o comentarios
case "${url}" in
""|\#*) continue ;;
esac
curl -L -o "${file}" \
"${{url}}"
done < "${DNSMASQ_LISTS}"
}
enable_dhcp()
{
change_config vm_template_files/dnsmasq_conf_dhcp
}
enable_pxe()
{
#change_config vm_template_files/dnsmasq_conf_pxe
echo "dhcp-option=66,\"0.0.0.0\"" >> "${DNSMASQ_CONFIG_FILE}"
}
#MAIN
#Install package
pkg install dnsmasq
#Apply config
# === Main ===
print_header
# Ask for each service
ENABLE_DHCP="$(ask_yes_no "Enable DHCP server" "n")"
ENABLE_PXE="$(ask_yes_no "Enable PXE boot server" "n")"
change_dnsmasq_config
sysrc dnsmasq_enable="YES"
sysrc dnsmasq_conf="/usr/local/etc/dnsmasq.conf"

View File

@ -1,20 +1,36 @@
#!/bin/sh #!/usr/bin/env bash
#SOURCE: https://docs.docker.com/engine/install/debian/ # SOURCE: https://docs.docker.com/engine/install/debian/
# https://docs.docker.com/engine/install/linux-postinstall/ # https://docs.docker.com/engine/install/linux-postinstall/
export DEBIAN_FRONTEND=noninteractive
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done # Exit on error, undefined vars, and pipe failures
# Add Docker's official GPG key: set -euo pipefail
sudo apt-get update
sudo apt-get -y install ca-certificates curl gnupg export DEBIAN_FRONTEND=noninteractive
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # Remove old conflicting packages
sudo chmod a+r /etc/apt/keyrings/docker.gpg for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
# Add the repository to Apt sources: apt-get remove -y "$pkg" 2>/dev/null || true
echo \ done
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ # Add Docker's official GPG key
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update
sudo apt-get update apt-get -y install ca-certificates curl gnupg
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin install -m 0755 -d /etc/apt/keyrings
sudo usermod -aG docker $USER curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources
# shellcheck disable=SC2027,SC2046 # We handle word splitting safely here
# shellcheck source=/dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update and install Docker
apt-get update
apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Add user to docker group
usermod -aG docker "${USER}"
# Refresh group membership (optional, user may need to log out)
newgrp docker newgrp docker

View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
#SOURCE: https://docs.docker.com/engine/install/fedora/
# https://docs.docker.com/engine/install/linux-postinstall/
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
dnf -y remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
dnf -y install dnf-plugins-core
dnf-3 config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
usermod -aG docker "$USER"
echo "To use docker execute :"
echo "newgrp docker"

View File

@ -1,18 +1,50 @@
#!/bin/bash #!/usr/bin/env bash
export DEBIAN_FRONTEND=noninteractive # SOURCE: https://docs.docker.com/engine/install/ubuntu/
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done # https://docs.docker.com/engine/install/linux-postinstall/
# Add Docker's official GPG key:
sudo apt-get update # Exit on error, undefined vars, and pipe failures
sudo apt-get install -y ca-certificates curl set -euo pipefail
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc export DEBIAN_FRONTEND=noninteractive
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources: # Remove old or conflicting packages
echo \ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ apt-get remove -y "$pkg" 2>/dev/null || true
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ done
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update # Install prerequisites
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin apt-get update
sudo usermod -aG docker $USER apt-get install -y ca-certificates curl gnupg
newgrp docker
# Create keyrings directory and add Docker GPG key
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# Add Docker repository
# shellcheck source=/dev/null
. /etc/os-release
ARCH=$(dpkg --print-architecture)
CODENAME="$VERSION_CODENAME"
echo "deb [arch=$ARCH signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $CODENAME stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update and install Docker
apt-get update
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
# Add user to docker group
usermod -aG docker "$USER"
# Refresh group membership
echo "Docker installation completed."
echo "To use Docker without sudo, run:"
echo " newgrp docker"
echo "Or log out and back"

View File

@ -1,13 +1,17 @@
#!/bin/sh #!/usr/bin/env bash
#SOURCE: https://about.gitlab.com/install/#debian #SOURCE: https://about.gitlab.com/install/#debian
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
NET_DEVICE='enp1s0' NET_DEVICE='enp1s0'
GITLAB_URL=$(ip -o -4 addr list ${NET_DEVICE} | awk '{print $4}' | cut -d/ -f1) GITLAB_URL=$(ip -o -4 addr list ${NET_DEVICE} | awk '{print $4}' | cut -d/ -f1)
#Base dependencies #Base dependencies
sudo apt-get update apt-get update
sudo apt-get install -y curl openssh-server ca-certificates perl apt-get install -y curl openssh-server ca-certificates perl
#OPTIONAL: postfix #OPTIONAL: postfix
#sudo apt-get install -y postfix #apt-get install -y postfix
#Add gitlab repo #Add gitlab repo
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
sudo EXTERNAL_URL="${GITLAB_URL}" apt-get install gitlab-ee EXTERNAL_URL="${GITLAB_URL}" apt-get install gitlab-ee

View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
#Source: https://docs.gitlab.com/install/package/almalinux/?tab=Community+Edition
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
NET_DEVICE='enp1s0'
GITLAB_URL=$(ip -o -4 addr list ${NET_DEVICE} | awk '{print $4}' | cut -d/ -f1)
#Enable sshd. enabled on cloud-image by default
#systemctl enable --now sshd
#Set firewall rules
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
systemctl reload firewalld
#Add repo
curl "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh" | bash
#Install Gitlab CE
EXTERNAL_URL="${GITLAB_URL}" dnf install gitlab-ce

View File

@ -1,12 +0,0 @@
#!/bin/sh
#SOURCE: https://about.gitlab.com/install/#debian
export DEBIAN_FRONTEND=noninteractive
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-gitlab-runner.pref
Explanation: Prefer GitLab provided packages over the Debian native ones
Package: gitlab-runner
Pin: origin packages.gitlab.com
Pin-Priority: 1001
EOF
sudo apt-get update
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
sudo apt-get -y install gitlab-runner

View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
#SOURCE: https://about.gitlab.com/install/#debian
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
# cat <<EOF | tee /etc/apt/preferences.d/pin-gitlab-runner.pref
# Explanation: Prefer GitLab provided packages over the Debian native ones
# Package: gitlab-runner
# Pin: origin packages.gitlab.com
# Pin-Priority: 1001
# EOF
apt-get update
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
apt-get -y install gitlab-runner

View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
#SOURCE: https://docs.gitlab.com/runner/install/
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
sudo dnf -Y install gitlab-runner

View File

@ -0,0 +1,60 @@
#!/usr/bin/env sh
#SOURCE: https://docs.gitlab.com/runner/install/
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
#Creating gitlab user
sudo pw group add -n gitlab-runner
sudo pw user add -n gitlab-runner -g gitlab-runner -s /bin/sh
sudo mkdir /home/gitlab-runner
sudo chown gitlab-runner:gitlab-runner /home/gitlab-runner
#Downloading binary and giving permissions
sudo fetch -o /usr/local/bin/gitlab-runner https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/binaries/gitlab-runner-freebsd-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
#Creating logfile and giving permissions
sudo touch /var/log/gitlab_runner.log && sudo chown gitlab-runner:gitlab-runner /var/log/gitlab_runner.log
#Creating rc service
mkdir -p /usr/local/etc/rc.d
sudo sh -c 'cat > /usr/local/etc/rc.d/gitlab_runner' << "EOF"
#!/bin/sh
# PROVIDE: gitlab_runner
# REQUIRE: DAEMON NETWORKING
# BEFORE:
# KEYWORD:
. /etc/rc.subr
name="gitlab_runner"
rcvar="gitlab_runner_enable"
user="gitlab-runner"
user_home="/home/gitlab-runner"
command="/usr/local/bin/gitlab-runner"
command_args="run"
pidfile="/var/run/${name}.pid"
start_cmd="gitlab_runner_start"
gitlab_runner_start()
{
export USER=${user}
export HOME=${user_home}
if checkyesno ${rcvar}; then
cd ${user_home}
/usr/sbin/daemon -u ${user} -p ${pidfile} ${command} ${command_args} > /var/log/gitlab_runner.log 2>&1
fi
}
load_rc_config $name
run_rc_command $1
EOF
sudo chmod +x /usr/local/etc/rc.d/gitlab_runner
echo "Now register a runner and then:"
echo "sudo sysrc gitlab_runner_enable=YES"
echo "sudo service gitlab_runner start"

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
HAPROXY_URL="https://github.com/haproxytech/kubernetes-ingress/releases/download/v1.10.11/haproxy-ingress-controller_1.10.11_Linux_x86_64.tar.gz" HAPROXY_URL="https://github.com/haproxytech/kubernetes-ingress/releases/download/v1.10.11/haproxy-ingress-controller_1.10.11_Linux_x86_64.tar.gz"
# Install HAProxy # Install HAProxy
apt update apt update

0
vm_example_scripts/init_freebsd.sh Normal file → Executable file
View File

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
helm repo add jenkins https://charts.jenkins.io helm repo add jenkins https://charts.jenkins.io
helm repo update helm repo update
kubectl create namespace jenkins kubectl create namespace jenkins

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"} VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
VM_USER="user" VM_USER="user"
VM=$1 VM=$1

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
apt-get update
apt-get -y install podman buildah

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Exit on error, undefined vars, and pipe failures
set -euo pipefail
dnf update
dnf -y install podman buildah

View File

@ -0,0 +1,62 @@
#!/usr/bin/env sh
# Source: https://podman.io/docs/installation#installing-on-freebsd-140
# Variables
LINE='fdesc /dev/fd fdescfs rw 0 0'
FSTAB="/etc/fstab"
FD_MOUNTPOINT="/dev/fd"
FSTYPE="fdescfs"
SERVICE_NAME='linux'
# Enable Linux compatibility
sysrc linux_enable=YES
# Start the service if not running
if ! service "${SERVICE_NAME}" status >/dev/null 2>&1; then
if ! service "${SERVICE_NAME}" start; then
echo "Error: Cannot start ${SERVICE_NAME}." >&2
exit 1
fi
echo "Service ${SERVICE_NAME} started"
fi
# Add fdescfs to /etc/fstab if not present
if ! grep -q 'fdesc[[:space:]]\+/dev/fd[[:space:]]\+fdescfs[[:space:]]\+rw[[:space:]]\+0[[:space:]]\+0' "$FSTAB"; then
printf '%s\n' "$LINE" | tee -a "$FSTAB" > /dev/null
fi
# Install and enable Podman
pkg install -y podman-suite
service podman enable
# Mount fdescfs if not already mounted
if ! mount | grep -w "${FD_MOUNTPOINT}" | grep -q "$FSTYPE"; then
mount -t fdescfs fdesc /dev/fd
fi
# Configure pf firewall
cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf
sed -i '' 's/ix0/vtnet0/g' /etc/pf.conf
# Enable pf at boot
if ! grep -q 'pf_load="YES"' "/boot/loader.conf"; then
echo 'pf_load="YES"' | tee -a /boot/loader.conf > /dev/null
fi
# Load pf module and enable local filtering
kldload pf
sysctl net.pf.filter_local=1
if ! grep -q 'net.pf.filter_local=1' "/etc/sysctl.conf.local"; then
echo 'net.pf.filter_local=1' | tee -a /etc/sysctl.conf.local > /dev/null
fi
service pf enable
service pf restart
# Configure storage backend
if pgrep -x zfskern >/dev/null 2>&1; then
zfs create -o mountpoint=/var/db/containers zroot/containers
else
sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf
fi

View File

@ -18,6 +18,7 @@ USAGE
$0 delete NAME $0 delete NAME
$0 info NAME $0 info NAME
$0 connect NAME $0 connect NAME
$0 install NAME
$0 list $0 list
ACTIONS ACTIONS
@ -26,11 +27,13 @@ ACTIONS
list List all defined virtual machines list List all defined virtual machines
info Show information about a virtual machine info Show information about a virtual machine
connect Connect to the console of a virtual machine connect Connect to the console of a virtual machine
install Install specific software into an existing VM
OPTIONS OPTIONS
-h Show this help message -h Show this help message
-n NAME Host name (required) -n NAME Host name (required)
-b BRIDGE Bridge interface name -b BRIDGE Bridge interface name
-H Host Only Network
-r RAM RAM in MB (default: ${VM_MEM_SIZE}) -r RAM RAM in MB (default: ${VM_MEM_SIZE})
-c VCPUS Number of VCPUs (default: ${VM_VCPUS}) -c VCPUS Number of VCPUs (default: ${VM_VCPUS})
-s DISK Disk size in GB (default: ${VM_DISK_SIZE}) -s DISK Disk size in GB (default: ${VM_DISK_SIZE})
@ -57,8 +60,8 @@ case "${ACTION}" in
# Parse options for create command # Parse options for create command
VERBOSE=false VERBOSE=false
NAME_SET=false NAME_SET=false
source env_scripts/common.sh
while getopts ":hn:b:r:c:s:v" opt; do while getopts ":hn:b:Hr:c:s:v" opt; do
case "${opt}" in case "${opt}" in
h) h)
usage usage
@ -68,8 +71,12 @@ case "${ACTION}" in
NAME_SET=true NAME_SET=true
;; ;;
b) b)
BRIDGE_INTERFACE="${OPTARG}" VM_BRIDGE_INT="${OPTARG}"
VM_NETWORK_TYPE="bridge"
;; ;;
H)
VM_NETWORK_TYPE="isolated"
;;
r) r)
VM_MEM_SIZE="${OPTARG}" VM_MEM_SIZE="${OPTARG}"
;; ;;
@ -98,9 +105,10 @@ case "${ACTION}" in
echo "Error: The -n option is required for create action." >&2 echo "Error: The -n option is required for create action." >&2
usage usage
fi fi
source env_scripts/common.sh
detect_distro
#Check network type #Check network type
vm_net_set_bridge_mode vm_net_set_network_type
#Check host os for guest debian type #Check host os for guest debian type
check_host_os check_host_os
#Read os_options.json and generate guests menu #Read os_options.json and generate guests menu
@ -108,6 +116,8 @@ case "${ACTION}" in
show_vm_menu show_vm_menu
#Set guest type based on check_host_os #Set guest type based on check_host_os
vm_set_guest_type vm_set_guest_type
#set image permissions
chown_image_permissions
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then
generate_openbsd_image generate_openbsd_image
else else
@ -144,7 +154,11 @@ case "${ACTION}" in
vm_connect ${VM_HOSTNAME} vm_connect ${VM_HOSTNAME}
fi fi
;; ;;
install)
VM_HOSTNAME="$1"
show_software_menu
vm_install_utils $VM_HOSTNAME
;;
list) list)
vm_list vm_list
;; ;;

View File

@ -0,0 +1,3 @@
#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h@@@dhcp-range=${LOCAL_NETWORK}.${LOCAL_NETWORK_DHCP_FIRST_IP},${LOCAL_NETWORK_DHCP_LAST_IP},${LOCAL_NETWORK_DHCP_LEASE}
#dhcp-option=121,192.168.1.0/24,1.2.3.4,10.0.0.0/8,5.6.7.8@@@dhcp-option=121,${LOCAL_NETWORK_RANGE},${LOCAL_NETWORK_GATEWAY}
#dhcp-option=3,1.2.3.4@@@dhcp-option=3,${LOCAL_NETWORK_GATEWAY}

View File

@ -0,0 +1,11 @@
#interface=@@@interface=${INTERFACE}
#domain-needed@@@domain-needed
#bogus-priv@@@bogus-priv
#local=/localnet/@@@local=/local/
#listen-address=@@@listen-adress=${JAIL_IP_ADDRESS}
#bind-interfaces@@@bind-interfaces
#no-hosts@@@no-hosts
#cache-size=150@@@cache-size=1000
#conf-dir=/etc/dnsmasq.d/,*.conf@@@conf-dir=/usr/local/etc/dnsmasq.conf.d/,*.conf
#conf-file=/usr/local/share/dnsmasq/trust-anchors.conf@@@conf-file=/usr/local/share/dnsmasq/trust-anchors.conf
#dnssec@@@dnssec

View File

@ -0,0 +1,3 @@
#enable-tftp@@@enable-tftp
#tftp-root=/var/ftpd@@@tftp-root=/var/lib/tftp
#dhcp-boot=pxelinux.0@@@dhcp-boot=netboot.xyz.kpxe

View File

@ -0,0 +1,3 @@
https://blocklistproject.github.io/Lists/dnsmasq-version/ads-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/01-ads-dnsmasq.conf
https://blocklistproject.github.io/Lists/dnsmasq-version/facebook-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/02-facebook-dnsmasq.conf
https://blocklistproject.github.io/Lists/dnsmasq-version/tracking-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/03-tracking-dnsmasq.conf