#!/usr/bin/env bash set -e -o pipefail export PATH=$PATH:/usr/local/bin:/usr/sbin:/usr/bin # determine machine architecture arch=$(uname -m) case $arch in "x86_64") machine_arch="amd64" ;; "i686"|"i386") machine_arch="386" ;; "aarch64"|"arm64"|"armv8") machine_arch="arm64" ;; "armv7l") machine_arch="arm" ;; *) echo "Unknown machine architecture: $arch" exit 1 ;; esac # install farmer if [ -z "$UNINSTALL" ]; then if [ ! -f /usr/local/bin/grlx-farmer ]; then curl -f -L -s "https://artifacts.grlx.dev/linux/${machine_arch}/v0.0.13/farmer" > /usr/local/bin/grlx-farmer chmod +x /usr/local/bin/grlx-farmer fi # install systemd service cat << EOF > /etc/systemd/system/grlx-farmer.service [Unit] Description=grlx farmer Documentation=https://docs.grlx.dev After=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/grlx-farmer Restart=always RestartSec=30 User=farmer Group=farmer [Install] WantedBy=multi-user.target EOF # configure farmer if it's not already configured if [ ! -f /etc/grlx/farmer ]; then # install gum if it's not already installed for interactive config if ! command -v gum >/dev/null 2>&1; then tempdir="" if command -v mktemp >/dev/null 2>&1; then tempdir=$(mktemp -d) else tempdir="/tmp/grlx-farmer-gum" mkdir -p "$tempdir" fi trap 'rm -r "$tempdir"' EXIT case $machine_arch in "386") curl -f -L -s "https://github.com/charmbracelet/gum/releases/download/v0.11.0/gum_0.11.0_Linux_i386.tar.gz" > "$tempdir/gum.tar.gz" ;; "amd64") curl -f -L -s "https://github.com/charmbracelet/gum/releases/download/v0.11.0/gum_0.11.0_Linux_x86_64.tar.gz" > "$tempdir/gum.tar.gz" ;; "arm64") curl -f -L -s "https://github.com/charmbracelet/gum/releases/download/v0.11.0/gum_0.11.0_Linux_arm64.tar.gz" > "$tempdir/gum.tar.gz" ;; "arm") curl -f -L -s "https://github.com/charmbracelet/gum/releases/download/v0.11.0/gum_0.11.0_Linux_arm.tar.gz" > "$tempdir/gum.tar.gz" ;; esac tar -C "$tempdir" -xzf "$tempdir/gum.tar.gz" mv "$tempdir/gum" /usr/local/bin/gum chmod +x /usr/local/bin/gum fi mkdir -p /etc/grlx if [ -z "$FARMERINTERFACE" ]; then FARMERINTERFACE=$(gum input --value="localhost" --prompt="Choose an interface for the farmer: > ") fi if [ -z "$FARMERAPIPORT" ]; then FARMERAPIPORT=$(gum input --value=5405 --prompt="Choose a port for the farmer API: > ") fi if [ -z "$FARMERBUSPORT" ]; then FARMERBUSPORT=$(gum input --value=5406 --prompt="Choose a port for the farmer bus: > ") fi if [ -z "$FARMERORGANIZATION" ]; then FARMERORGANIZATION=$(gum input --value="Your Organization" --prompt="Choose an organization name for the farmer: > ") fi if [ -z "$ADMIN_PUBKEYS" ]; then ADMIN_PUBKEYS=() while true; do ADMIN_PUBKEYS+=($(gum input --width=57 --placeholder="ABC25HBCYNHYMIFTN372NCKASUQPJCTBA66GLKXFYM3QGRP42IC5BYYF" --prompt="Enter an admin public key (generated by 'grlx auth pubkey'): > ")) if ! gum confirm "Add another admin public key?"; then break fi done fi if [ -z "$CERT_HOSTS" ]; then CERT_HOSTS=() while true; do CERT_HOSTS+=($(gum input --placeholder="mydomain.com" --prompt="Enter a domain or IP to generate a certificate for: > ")) if ! gum confirm "Add another domain or IP?"; then break fi done fi cat << EOF > /etc/grlx/farmer certhosts: $(for host in "${CERT_HOSTS[@]}"; do echo " - $host"; done) certificatevalidtime: 8760h0m0s configroot: /etc/grlx/ farmerapiport: "$FARMERAPIPORT" farmerbusport: "$FARMERBUSPORT" farmerinterface: $FARMERINTERFACE farmerpki: /etc/grlx/pki/farmer/ keyfile: /etc/grlx/pki/farmer/tls-key.pem nkeyfarmerprivfile: /etc/grlx/pki/farmer/farmer.nkey nkeyfarmerpubfile: /etc/grlx/pki/farmer/farmer.nkey.pub organization: $FARMERORGANIZATION rootca: /etc/grlx/pki/farmer/tls-rootca.pem rootcapriv: /etc/grlx/pki/farmer/tls-rootca-key.pem pubkeys: admin: $(for key in "${ADMIN_PUBKEYS[@]}"; do echo " - $key"; done) EOF fi PATH=$PATH:/usr/sbin:/usr/bin useradd -r -s /usr/sbin/nologin farmer >/dev/null || true chown -R farmer:farmer /etc/grlx chmod 700 /etc/grlx # Create the job cache mkdir -p /var/cache/grlx chown farmer:farmer /var/cache/grlx mkdir -p /srv/grlx/ # Add the recipe serve location chown farmer:farmer /srv/grlx/ systemctl daemon-reload systemctl enable --now grlx-farmer else systemctl disable --now grlx-farmer rm -f /usr/local/bin/gum rm -f /etc/systemd/system/grlx-farmer.service rm -f /usr/local/bin/grlx-farmer rm -rf /etc/grlx rm -rf /srv/grlx rm -rf /var/cache/grlx userdel farmer fi