This commit is contained in:
Kris Lamoureux 2022-12-01 23:37:39 -05:00
parent 852af156a3
commit f2c557715d

View File

@ -1,67 +1,140 @@
#!/bin/bash #!/bin/bash
#########################
#### USER EDITABLE ######
#########################
# You should hardcode the base URL for your raw repository files. Set the value
# of REPO_RAW_URL to your fork, replacing the `authorized_keys` file with your own.
# i.e., "https://raw.githubusercontent.com/<GH_USER>/<GH_REPO>/<GH_BRANCH>"
REPO_RAW_URL="https://git.krislamo.org/kris/bootstrap/raw/branch/main"
AUTH_KEY_FILE="/authorized_keys"
# Optional debianzfs install script, accessed with -z
DEBIANZFS="https://git.krislamo.org/kris/debianzfs/raw/branch/main/debianzfs.sh"
DEBIANZFS_BIN="/usr/local/bin/debianzfs"
##############################
######## STOP EDITING ########
##############################
# Root required # Root required
if [ $EUID -ne 0 ]; then if [ $EUID -ne 0 ]; then
echo "You must run this script as root" echo "You must run this script as root"
exit 1 exit 1
fi fi
# Get current date, hostname, create a temporary directory, # Clean environment
# and set the location to the remote repository unset BOOT_CYCLE
unset CDROM_REMOVE
unset ENABLE_SSH
unset GATEWAY_IP
unset NEW_HOSTNAME
unset IP
unset REPO
unset SSH_INSTALL
unset UPDATE_SYSTEM
unset ZFSINSTALL
unset DATE
unset CUR_HOSTNAME
# Options
while getopts ':bceg:h:i:r:suz' OPTION; do
case "$OPTION" in
b) BOOT_CYCLE=1;;
c) CDROM_REMOVE=1;;
e) ENABLE_SSH=1;;
g) GATEWAY_IP="$OPTARG";;
h) NEW_HOSTNAME="$OPTARG";;
i) IP="$OPTARG";;
r) REPO="$OPTARG";;
s) SSH_INSTALL=1;;
u) UPDATE_SYSTEM=1;;
z) ZFSINSTALL=1;;
?)
echo "ERROR: Option not recognized"
exit 1;;
esac
done
# Allow override but use default repo if not set
[ -z "$REPO" ] && REPO="$REPO_RAW_URL"
# Get current date and hostname
DATE=$(date '+%Y%m%d') DATE=$(date '+%Y%m%d')
TMP_DIR=$(mktemp -d)
CUR_HOSTNAME=$(hostname) CUR_HOSTNAME=$(hostname)
GIT_LOC="https://github.com/krislamo/bootstrap.git"
# Get user input for hostname and IP # Remove CD sources from sources list
echo "Enter name server's new hostname:" if [ "$CDROM_REMOVE" -eq 1 ]; then
read NEW_HOSTNAME echo "NOTICE: Backing up /etc/apt/sources.list => /etc/apt/sources.list.$DATE"
sed -i."$DATE" '/deb cdrom/d' /etc/apt/sources.list
echo "Enter a static IP address (e.g. 192.168.1.2/24):"
read STATIC_IP
if [ ! -z "$STATIC_IP" ]; then
echo "Enter the gateway IP (default: 192.168.1.1):"
read GATEWAY_IP
[ -z "$GATEWAY_IP" ] && GATEWAY_IP="192.168.1.1"
echo "Gateway set to $GATEWAY_IP"
fi fi
# Remove CD sources # Upgrade system software
cp /etc/apt/sources.list /etc/apt/sources.list.$DATE if [ "$UPDATE_SYSTEM" -eq 1 ]; then
sed -i '/deb cdrom/d' /etc/apt/sources.list echo "NOTICE: Upgrading system"
apt-get update
# Upgrade software apt-get upgrade -y
apt-get update -y fi
apt-get upgrade -y
# Install git, clone this repo, and navigate to it
apt-get install git -y
cd $TMP_DIR
git clone $GIT_LOC
cd bootstrap
# Install personal SSH keys under root and install the OpenSSH server # Install personal SSH keys under root and install the OpenSSH server
mkdir -p /root/.ssh/ if [ "$SSH_INSTALL" -eq 1 ]; then
cp --update authorized_keys /root/.ssh/authorized_keys # Does authorized_keys file already exist?
apt-get install openssh-server -y if [ -f /root/.ssh/authorized_keys ]; then
echo "ERROR: /root/.ssh/authorized_keys file already exists"
exit 1
fi
# If STATIC_IP is set, backup interfaces and configure static IP echo "NOTICE: Installing root's authorized_keys and the OpenSSH server"
if [ ! -z "$STATIC_IP" ]; then mkdir -p /root/.ssh/
cp /etc/network/interfaces /etc/network/interfaces.$DATE chmod 700 /root/.ssh/
sed -i "s/dhcp/static/g" /etc/network/interfaces wget "${REPO}${AUTH_KEY_FILE}" -O /root/.ssh/authorized_keys
if ! grep -q "address" /etc/network/interfaces; then chmod 644 /root/.ssh/authorized_keys
echo " address $STATIC_IP" >> /etc/network/interfaces apt-get install openssh-server -y
echo " gateway $GATEWAY_IP" >> /etc/network/interfaces
if [ "$ENABLE_SSH" -eq 1 ]; then
echo "NOTICE: Enabling the OpenSSH server"
systemctl start ssh
fi fi
fi fi
# If IP is set, backup interfaces and configure static IP
if [ -n "$IP" ]; then
if [ -z "$GATEWAY_IP" ]; then
echo "ERROR: IP set without a GATEWAY address. See option -g"
exit 1
fi
echo "NOTICE: Backing up network interfaces file and installing a new static one"
sed -i."$DATE" "s/dhcp/static/g" /etc/network/interfaces
if ! grep -q "address" /etc/network/interfaces; then
echo " address $IP" >> /etc/network/interfaces
echo " gateway $GATEWAY_IP" >> /etc/network/interfaces
else
echo "ERROR: Address already set"
exit 1
fi
fi
# Download DebianZFS script
if [ "$ZFSINSTALL" -eq 1 ]; then
echo "NOTICE: Installing DebianZFS installation script"
wget "$DEBIANZFS" -O "$DEBIANZFS_BIN"
chmod u+x "$DEBIANZFS_BIN"
fi
# If NEW_HOSTNAME is set, configure new hostname and backup /etc/hosts # If NEW_HOSTNAME is set, configure new hostname and backup /etc/hosts
if [ ! -z "$NEW_HOSTNAME" ]; then if [ -n "$NEW_HOSTNAME" ]; then
hostnamectl set-hostname $NEW_HOSTNAME hostnamectl set-hostname "$NEW_HOSTNAME"
cp /etc/hosts /etc/hosts.$DATE echo "NOTICE: Backing up /etc/hosts and setting new hostname to '$NEW_HOSTNAME'"
sed -i "s/$CUR_HOSTNAME/$NEW_HOSTNAME/g" /etc/hosts sed -i."$DATE" "s/$CUR_HOSTNAME/$NEW_HOSTNAME/g" /etc/hosts
read -p "Press [enter] to restart this machine" fi
# Restart
if [ "$BOOT_CYCLE" -eq 1 ]; then
echo "NOTICE: Restarting the machine in 10 seconds..."
sleep 9
echo "NOTICE: Restarting!"
sleep 1
systemctl reboot systemctl reboot
fi fi