init
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# ~/.bashrc
|
||||
|
||||
echo "command: mount_volume <volume>"
|
||||
echo "alias: set_prod"
|
||||
|
||||
export hosts_file="/app/hosts.dev"
|
||||
export host_vars_dir="/app/host_vars/"
|
||||
|
||||
export PS1="\[\e[32m\]\h:\w\$\[\e[0m\] "
|
||||
df -h .
|
||||
|
||||
set_prod() {
|
||||
export hosts_file="/app/hosts.all"
|
||||
export host_vars_dir="/app/host_vars/vault/"
|
||||
echo "LIVE MODE ENABLED !!! "
|
||||
}
|
||||
clear
|
||||
@@ -0,0 +1,45 @@
|
||||
FROM alpine:latest
|
||||
|
||||
RUN apk add --no-cache \
|
||||
bash \
|
||||
git \
|
||||
neovim \
|
||||
python3 \
|
||||
py3-pip \
|
||||
py3-virtualenv \
|
||||
openssh \
|
||||
cryptsetup \
|
||||
util-linux \
|
||||
pssh \
|
||||
mc \
|
||||
e2fsprogs \
|
||||
screen \
|
||||
rsync \
|
||||
sshfs \
|
||||
device-mapper \
|
||||
borgbackup
|
||||
|
||||
|
||||
WORKDIR /root
|
||||
|
||||
RUN ln -sf /usr/bin/nvim /usr/bin/vim
|
||||
|
||||
COPY known_hosts /root/.ssh/
|
||||
COPY config /root/.ssh/
|
||||
|
||||
RUN ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N "" && \
|
||||
chmod 600 /root/.ssh/id_rsa && \
|
||||
chmod 600 /root/.ssh/config
|
||||
|
||||
COPY rex /usr/bin/
|
||||
COPY template /usr/bin/
|
||||
COPY create_volume /usr/bin/
|
||||
COPY mount_volume /usr/bin/
|
||||
|
||||
COPY .bashrc /root/.bashrc
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
CMD ["bash"]
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#Host dev
|
||||
# Hostname dev
|
||||
# User oliver
|
||||
# Port 2222
|
||||
|
||||
Host dev
|
||||
Hostname dev
|
||||
User 4server
|
||||
Port 2222
|
||||
IdentityFile /app/host_vars/dev/dev
|
||||
|
||||
Host manchester
|
||||
Hostname 192.168.9.20
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/manchester/manchester
|
||||
|
||||
Host boston
|
||||
Hostname 192.168.9.16
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/boston/boston
|
||||
|
||||
Host mumbai
|
||||
Hostname 192.168.9.17
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/mumbai/mumbai
|
||||
|
||||
Host meppel
|
||||
Hostname 192.168.9.21
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/meppel/meppel
|
||||
|
||||
Host sydney
|
||||
Hostname 192.168.9.22
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/sydney/sydney
|
||||
|
||||
Host saopaulo
|
||||
Hostname 192.168.9.11
|
||||
User 4server
|
||||
IdentityFile /app/host_vars/saopaulo/saopaulo
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <volume_filename>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE="/data/$1"
|
||||
MAPPER_NAME="encrypted_volume"
|
||||
MOUNT_POINT="/mnt/${MAPPER_NAME}"
|
||||
dd if=/dev/zero of="$FILE" bs=1M count=10
|
||||
|
||||
|
||||
echo "Setting up LUKS on $FILE..."
|
||||
cryptsetup luksFormat "$FILE"
|
||||
cryptsetup close "$MAPPER_NAME" || true
|
||||
|
||||
cryptsetup open "$FILE" "$MAPPER_NAME"
|
||||
|
||||
mkfs.ext4 /dev/mapper/"$MAPPER_NAME"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Usage: $0 <local_file> <remote_absolute_path>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LOCAL_FILE="$1"
|
||||
REMOTE_PATH="$2"
|
||||
|
||||
if [ ! -f "$LOCAL_FILE" ]; then
|
||||
echo "Error: Local file '$LOCAL_FILE' not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$hosts_file" ]; then
|
||||
echo "Error: Hosts file '$hosts_file' not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Push the file content using tee with doas
|
||||
echo "Pushing $LOCAL_FILE to $REMOTE_PATH on all hosts in $hosts_file"
|
||||
pssh -h "$hosts_file" -l "$USER" -i "doas tee \"$REMOTE_PATH\" > /dev/null" < "$LOCAL_FILE"
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
192.168.9.17 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINmL6mEsSSpEWVICaXSFOd/Z1i6S5zn+B2q/ZKlqLocb
|
||||
192.168.9.17 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDhrtXNi+1udDp34CDDmMWNqUTfsn7F6XVv4xtGSmaUbREt0A56RIqo6EMegLSN+9J2z+x85ZxxNRoQc2kAamB9/6v4poDyMJKhqDJ4qimyboOSPI1FqAojmeSCGXmSU6bk5lYDKbkQsINeaGiQ86inv8Rgar4EV834Sp1HEGUZBksn7+xPL4MkmMWfcykrELgU8dnsJYiRJKWxU2d4UTWorBWtcICg1SJndB2QBncYT3dOEl+283HDBnKU6w2o7OhP+Tz+vTyVxtqZ7QF9Z/e7et9zFXnjsTopnkCVBFt8/esKPmgesiY+j0COx9aaMD6Ks2ssa8UqYHybmHwO8o5vfvcCR3ofZhhkGRnAXijd1D6bK3uXJR13PYnlPjiNQA0Lvf2YrOMDBDmRk5j8zQRHXe7oygmYz49z+lrR83VBIFVJkTt/GELQJ6kjQdSHdRinL54sVPl407cdmzBdwenY6vBCcN2UIDu4ohubqr0QH//PaXbtj4pEEExzurdq99U=
|
||||
192.168.9.17 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJPErwjui8jQC3Tkql+G6PsDd16pe7wm2vEhs/qYaEGSM+L7lW7XiXVMPhpCd4UrRVFFibjyfZsxGCv8LmctqIs=
|
||||
192.168.9.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG9kTGcpJCCoUDyPmhWx9hWTLhXr1SqpYFSW50l1zFsa
|
||||
192.168.9.20 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCoTci1WePcd1dFfZbS6C6utZ0ni9aGuvTc1YpORg1fnEF8IZEB9FzEb4vGIEMqyYZq9HsVXJdcBTbDMtAqYlx3IqIMRsS8zFnnlqM+u0OKgt4WLRDfvKY3eGNilm3gplNBwdnh0dHafRy+CSHMvC/fcnkjFFfj8nQ8rdOoE/qPd1gH6l0+mcGWpvH78dK3eU03M964aAxzrBqUhU3y6lYSinI0EZHf6mniOSVBJ27ulImisb+z14row2HgPvjnIbp89QOP9b7b0lzVQ5VdmikAMVtsbKARyZi7Tn1ZrTZqGBx5SnuGKxG0Wl3gLBAL5pTHV7XrmCUJOkUdnoTNCxjsV6Qo6SBiKHYqwJPGry4MbT2bOdFIkw5YVJKEU+Q6txMy1axcZ2ACtcWRiUaMHoVsfbFiQv/Llgc7fsmD8NCMNArD80N4YTD95Di+Ch8FZ0Cf5sfV/6NnvER2hivr+9+Q84UVwA1RyhGrPPS9emMixIod5UgtzO9vmJcpJrmiCLk=
|
||||
192.168.9.20 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLBKg3hH/hdu4o51Ubg831HsUEedZp0VNAtpmY5QN9RTOJJaYxUJBo3ZbyrLMEWCvVTAT4nfwUAJhaf78l8Lk60=
|
||||
192.168.9.16 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKSSlK1dlG8Qszv7sy0DAuNu3bsH7c1eTfFOL3OcsAyE
|
||||
192.168.9.16 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCXNdN2lYWg9k3r5B9QISWCAWvAzzDj/aO5EeYPimDcz383Qliq0xW+FjJvgw2fY/Aoljwd6pGY3pJPN1aM3i4Qxt22S6emsFkGm89/GOdEu9ZkB+ln0fL8uPJTdjQklkhGb8YIF4aD8OMkMNXn7Ale+TiJJuWWmh7UAQITM5EqX1Wq+uAM/2ixpKo3dQU8L6pzeGi5yQUzHB3eyckSnFjCrSS/hW6lsKyhoaSYn+cAiuhbWEwP4lv9um6Cl2rLZYcysJTTs1DP7gJL3eyytnQ83R8MEX5/qY2zSVFCaNPguF7hlC7MgdR90naqlzm40XzYXHloDIg92+kGZGdR6jcKy7QasHuQLeXXJEk63jl64IJwRJPNnrVGszEDwIz0nBzVX/Yot2R/uAjhJRdR5d9tlZbMILkng6I/BVdJhqnJzuBottZpfu0qaBakIecDbLiJeU+AbAQffzWesyAmlHaLLLCHgwLdNaVjCltx6/RebF8HRRO82sdRE8Js6dSAXZ0=
|
||||
192.168.9.16 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLpXVmQVbrhdfbrTHINQ2lZCxLxgrWbIDoNoxRR7EuqI5qNr2LQhqmTVZpNUIvj7PhdGPN4hry9jMfC39Dwa7Eo=
|
||||
|
||||
192.168.9.11 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFbAGYglyMYT/IfX9G4n9GhbPf+8T7TyVin/DfP3eKgb
|
||||
192.168.9.11 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCthnkPJKC1Ij/Fc4fTRubcV8xDSKJ4UrlUYgZ+lO2AZYKhefVZOaDkizqWbjf9c4dqAAEX1lqgDwr3UwEw6hukLLhherCU6tn3Q/nmOQsbKrEGG+kJXnzCi1jYsH4UNQB8Xl18eaLhGZosqCfEVK3LHw2/nMsxLfbrw61qf9Z7/haQOJU2M2W9X3U/yEk4sOCoxguJIoNJ0JZB+X3xO2TXKLCKuaWpckbmHAVuL0c4u0ZfYqF3lCxWLj/iI5SKD/YqajohaVBaoJkmtIkLuuSSFe5gJb22htMgKXoQ0TcxxAvTnHwa92sVSMx7Lp1zQ5RGzN+Dw99FL4HyR4KDPlmVpGPZbNp0LnnggQ0SBmT6F3KarNZLzSW6w2foBkl9XjTEBUjb5cHXK8jq7nEUK26TgirngSAFg7y44NWta6whRX0+/wCanlvgQ1BNYGf4vcw5P+Q8MoGOdepF7b8gQiUn/KhtmnQem/Q1//xDt9MOJkmjBemG9KIso/gqtJkHeps=
|
||||
192.168.9.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDc6J024++J25z2ZMXQ3Vim+mLVIVs+cZngv8DmtEDfrT/Ptl7+F2IqXRNcZuq1YTjEZO8eQg27iIemPoPT3xa8=
|
||||
192.168.9.21 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMFuf87ngDaF8D0kzVzzB953ji6ptg/V9t+WPac+DAjO
|
||||
192.168.9.21 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDtexcutExMflSRPJOwGPuZx49c+ZUMoElNPNntXONOuVZ8jM+zzA/4s+HCj+RWdHMnarLcNJjwRZRq7JWruqmr1EN9eNmvu13cLCKZr6Ape1gt8VmMhvQ9nA7eMx3UdvnWgXjLCfJy+BKh2XVAneM5lOSPMcyQlcACrLQVkse9EKhxhV5nEjXKYxSNetIPK9PxglXznpC8IpuWlXnDH2R8vDhdvBmBFTKOjN5Wa+GrMfElWeQOjyCpNcMVYohvV87VN6FxHQTADFTm2CKy/W7pnM8rI55ZbBIMfvLyhpM+vtFh1sJlIZSFnn+ytMUImNEAgBDI3fCpwZ99zeLViGhQJlBkdCUI+JJK9XJjpcOMNydeWh142RGU6juPuSLOZPqKNc3BpZYgPY0vMDgDWgT9AcYup3rAJ/UnUnhsxiT2h/gx7+t/j9xg01BQF5S6mezaueuavHCh9MvAzXiJXR8zanhl/Hh9BKgIAFrZh71CzP/PYG33BKCe9DXA09aJrf8=
|
||||
192.168.9.22 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMO5VhveQe76kEOdVqrdoTwW1fNzmgDzZNBznFEC4ohtXes0VMtJR02lhc+55XTIUX+EDxBtAh8U+kJpFeLetMU=
|
||||
192.168.9.21 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGlzLZWNjSaDuDd4e66LoBizY5j+QCsifIIxkvX4CrzP/AqAgWDEEgT+pAXBFkNJlBR6TDFJ0bIdwZTbcq8/72E=
|
||||
Executable
+25
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <volume_filename>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILE="/data/$1"
|
||||
MAPPER_NAME="encrypted_volume"
|
||||
MOUNT_POINT="/mnt/${MAPPER_NAME}"
|
||||
|
||||
|
||||
cryptsetup close "$MAPPER_NAME" || true
|
||||
cryptsetup open "$FILE" "$MAPPER_NAME"
|
||||
|
||||
mkdir -p "$MOUNT_POINT"
|
||||
|
||||
if ! mountpoint -q "$MOUNT_POINT"; then
|
||||
mount /dev/mapper/"$MAPPER_NAME" "$MOUNT_POINT"
|
||||
echo "Mounted /dev/mapper/$MAPPER_NAME at $MOUNT_POINT"
|
||||
else
|
||||
echo "$MOUNT_POINT is already mounted."
|
||||
fi
|
||||
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
cmd="$*"
|
||||
|
||||
echo "Running on hosts: $cmd"
|
||||
|
||||
pssh -h /app/host_vars/hosts -t 0 "$cmd"
|
||||
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Usage: $0 <localfile> <remotefile>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
host_vars_dir="/app/host_vars"
|
||||
|
||||
keys=(NEBULA_CA API_KEY HOSTNAME NEBULA_CRT NEBULA_KEY SSH_PRIVATE SSH_PUBLIC)
|
||||
|
||||
NEBULA_CA=$(<"$host_vars_dir/ca.crt")
|
||||
|
||||
localfile="$1"
|
||||
remotefile="$2"
|
||||
remotetmp_base="/var/tmp/4server"
|
||||
|
||||
# Read hosts from file descriptor 3 to prevent ssh from consuming stdin
|
||||
while read -r host <&3; do
|
||||
host_env_file="$host_vars_dir/$host/$host.env"
|
||||
|
||||
if [ ! -f "$host_env_file" ]; then
|
||||
echo "Warning: env file for host '$host' not found at $host_env_file. Skipping."
|
||||
continue
|
||||
fi
|
||||
|
||||
# Load host environment variables (supports multi-line)
|
||||
set -a
|
||||
source "$host_env_file"
|
||||
set +a
|
||||
|
||||
NEBULA_KEY=$(<"$host_vars_dir/$host/$host.key")
|
||||
NEBULA_CRT=$(<"$host_vars_dir/$host/$host.crt")
|
||||
|
||||
SSH_PRIVATE=$(<"$host_vars_dir/$host/$host")
|
||||
SSH_PUBLIC=$(<"$host_vars_dir/$host/$host.pub")
|
||||
|
||||
content=$(<"$localfile")
|
||||
|
||||
for key in "${keys[@]}"; do
|
||||
value="${!key}" # indirect reference
|
||||
# Replace placeholder {{KEY}} with value using Bash's parameter expansion
|
||||
content="${content//\{\{$key\}\}/$value}"
|
||||
done
|
||||
|
||||
# Copy content to remote temporary file
|
||||
remotetmp="${remotetmp_base}_${host}"
|
||||
echo "Copying to $host:$remotefile"
|
||||
echo "$content" | ssh "$host" "cat > '$remotetmp'"
|
||||
|
||||
# Move temporary file to final location with doas
|
||||
ssh "$host" "doas mv '$remotetmp' '$remotefile'"
|
||||
|
||||
done 3< /app/host_vars/hosts
|
||||
|
||||
Reference in New Issue
Block a user