install.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. if [[ $EUID -ne 0 ]]; then echo 'Run as root' >&2; exit 1; fi
  4. src=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
  5. command -v apt-get >/dev/null || { echo 'Debian apt-get required' >&2; exit 1; }
  6. archive="";build="";policy_created=false
  7. cleanup(){
  8. if [[ -n $archive ]];then rm -f "$archive";fi
  9. if [[ -n $build ]];then rm -rf "$build";fi
  10. if [[ $policy_created == true ]];then rm -f /usr/sbin/policy-rc.d;fi
  11. }
  12. trap cleanup EXIT
  13. install -d -m 0700 /var/lib/debtik/update
  14. exec 9>/var/lib/debtik/update/lock
  15. flock -n 9 || { echo 'An update or installation is already running' >&2;exit 1; }
  16. if [[ ! -e /usr/sbin/policy-rc.d && ! -L /usr/sbin/policy-rc.d ]];then
  17. printf '#!/bin/sh\nexit 101\n' > /usr/sbin/policy-rc.d
  18. chmod 0755 /usr/sbin/policy-rc.d
  19. policy_created=true
  20. fi
  21. export DEBIAN_FRONTEND=noninteractive
  22. apt-get update
  23. apt-get install -y --no-install-recommends ca-certificates curl git tar iproute2 bridge-utils iptables ipset conntrack wireguard-tools keepalived pptp-linux bird2 dnsmasq isc-dhcp-client ppp pppoe charon-systemd strongswan-swanctl libcharon-extra-plugins xl2tpd iputils-ping iputils-tracepath traceroute procps openssl certbot python3 util-linux
  24. required=$(awk '$1=="toolchain" {sub(/^go/,"",$2);print $2}' "$src/go.mod")
  25. if [[ -z $required ]]; then required=$(awk '$1=="go" {print $2}' "$src/go.mod"); fi
  26. if ! command -v go >/dev/null || [[ $(printf '%s\n%s\n' "$required" "$(go version | awk '{sub(/^go/,"",$3);print $3}')" | sort -V | head -n1) != "$required" ]]; then
  27. case $(uname -m) in x86_64) arch=amd64;; aarch64) arch=arm64;; *) echo 'Unsupported CPU' >&2; exit 1;; esac
  28. archive=$(mktemp)
  29. curl --fail --location --retry 3 "https://go.dev/dl/go${required}.linux-${arch}.tar.gz" -o "$archive"
  30. install -d /opt/debtik
  31. rm -rf /opt/debtik/go
  32. tar -C /opt/debtik -xzf "$archive"
  33. rm -f "$archive"
  34. export PATH=/opt/debtik/go/bin:$PATH
  35. fi
  36. cd "$src"
  37. build=$(mktemp -d)
  38. commit=$(git rev-parse HEAD 2>/dev/null || printf unknown)
  39. CGO_ENABLED=0 go build -trimpath -ldflags "-X proxmox-router/internal/api.BuildCommit=$commit" -o "$build/proxmox-router" ./cmd/server
  40. CGO_ENABLED=0 go build -trimpath -o "$build/debtik-cli" ./cmd/debtik-cli
  41. install -d -m 0700 /etc/proxmox-router
  42. install -d -m 0700 /var/lib/debtik/update
  43. install -d -m 0755 /usr/local/libexec
  44. install -m 0750 scripts/debtik-update /usr/local/libexec/debtik-update
  45. install -m 0750 scripts/release-version.py /usr/local/libexec/debtik-release-version
  46. install -d -m 0755 /etc/network/interfaces.d
  47. for name in proxmox-router debtik-cli; do
  48. if [[ -f /usr/local/bin/$name ]]; then cp -p "/usr/local/bin/$name" "/usr/local/bin/$name.previous"; fi
  49. install -m 0755 "$build/$name" "/usr/local/bin/$name.next"
  50. mv -f "/usr/local/bin/$name.next" "/usr/local/bin/$name"
  51. done
  52. if [[ -f /etc/network/interfaces ]] && ! grep -Eq '^source[[:space:]]+/etc/network/interfaces\.d/\*' /etc/network/interfaces; then printf '\nsource /etc/network/interfaces.d/*\n' >> /etc/network/interfaces; fi
  53. install -m 0644 systemd/proxmox-router.service /etc/systemd/system/proxmox-router.service
  54. systemctl daemon-reload
  55. systemctl enable proxmox-router.service
  56. systemctl restart proxmox-router.service
  57. systemctl is-active --quiet proxmox-router.service
  58. if [[ $commit =~ ^[a-f0-9]{40}$ ]]; then printf '%s\n' "$commit" > /var/lib/debtik/update/installed_commit; fi
  59. install -m 0600 VERSION /var/lib/debtik/update/installed_version
  60. echo 'DebTik installed: http://<host>/ and debtik-cli'