install.sh 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #!/bin/sh
  2. set -e
  3. set -o noglob
  4. github_version() {
  5. set +e
  6. curl -s https://api.github.com/repos/mudler/edgevpn/releases/latest | \
  7. grep tag_name | \
  8. awk '{ print $2 }' | \
  9. sed -e 's/\"//g' -e 's/,//g' || echo "v0.8.5"
  10. set -e
  11. }
  12. DOWNLOADER=${DOWNLOADER:-curl}
  13. VERSION=${VERSION:-$(github_version)}
  14. info()
  15. {
  16. echo '[INFO] ' "$@"
  17. }
  18. warn()
  19. {
  20. echo '[WARN] ' "$@" >&2
  21. }
  22. fatal()
  23. {
  24. echo '[ERROR] ' "$@" >&2
  25. exit 1
  26. }
  27. detect_arch() {
  28. if [ -z "$ARCH" ]; then
  29. ARCH=$(uname -m)
  30. fi
  31. case $ARCH in
  32. i386)
  33. ARCH=i386
  34. ;;
  35. amd64|x86_64)
  36. ARCH=x86_64
  37. ;;
  38. arm64|aarch64)
  39. ARCH=arm64
  40. ;;
  41. arm*)
  42. ARCH=armv6
  43. ;;
  44. *)
  45. fatal "Unsupported architecture $ARCH"
  46. esac
  47. }
  48. detect_platform() {
  49. if [ -z "$OS" ]; then
  50. OS=$(uname -o)
  51. fi
  52. case $OS in
  53. *Linux)
  54. OS=Linux
  55. ;;
  56. *)
  57. fatal "Unsupported platform $OS"
  58. esac
  59. }
  60. verify_env() {
  61. detect_arch
  62. detect_platform
  63. if [ -x /sbin/openrc-run ]; then
  64. HAS_OPENRC=true
  65. fi
  66. if [ -x /bin/systemctl ] || type systemctl > /dev/null 2>&1; then
  67. HAS_SYSTEMD=true
  68. fi
  69. SUDO=sudo
  70. if [ $(id -u) -eq 0 ]; then
  71. SUDO=
  72. fi
  73. if [ -n "${INSTALL_BIN_DIR}" ]; then
  74. BIN_DIR=${INSTALL_BIN_DIR}
  75. else
  76. BIN_DIR=/usr/local/bin
  77. if ! $SUDO sh -c "touch ${BIN_DIR}/ro-test && rm -rf ${BIN_DIR}/ro-test"; then
  78. if [ -d /opt/bin ]; then
  79. BIN_DIR=/opt/bin
  80. fi
  81. fi
  82. fi
  83. }
  84. setup_service() {
  85. if [ -n "${INSTALL_SYSTEMD_DIR}" ]; then
  86. SYSTEMD_DIR="${INSTALL_SYSTEMD_DIR}"
  87. else
  88. SYSTEMD_DIR=/etc/systemd/system
  89. fi
  90. if [ "${HAS_SYSTEMD}" = true ]; then
  91. FILE_SERVICE=${SYSTEMD_DIR}/[email protected]
  92. $SUDO tee $FILE_SERVICE >/dev/null << EOF
  93. [Unit]
  94. Description=EdgeVPN Daemon
  95. After=network.target
  96. [Service]
  97. EnvironmentFile=/etc/systemd/system.conf.d/edgevpn-%i.env
  98. LimitNOFILE=49152
  99. ExecStartPre=-/bin/sh -c "sysctl -w net.core.rmem_max=2500000"
  100. ExecStart=$BIN_DIR/edgevpn
  101. Restart=always
  102. [Install]
  103. WantedBy=multi-user.target
  104. EOF
  105. elif [ "${HAS_OPENRC}" = true ]; then
  106. $SUDO tee /etc/init.d/edgevpn >/dev/null << EOF
  107. #!/sbin/openrc-run
  108. depend() {
  109. after network-online
  110. }
  111. supervisor=supervise-daemon
  112. name=edgevpn
  113. command="${BIN_DIR}/edgevpn"
  114. command_args="$(escape_dq "edgevpn")
  115. >>${LOG_FILE} 2>&1"
  116. output_log=${LOG_FILE}
  117. error_log=${LOG_FILE}
  118. pidfile="/var/run/edgevpn.pid"
  119. respawn_delay=5
  120. respawn_max=0
  121. set -o allexport
  122. if [ -f /etc/environment ]; then source /etc/environment; fi
  123. if [ -f /etc/edgevpn.env ]; then source /etc/edgevpn.env; fi
  124. set +o allexport
  125. EOF
  126. fi
  127. }
  128. download() {
  129. [ $# -eq 2 ] || fatal 'download needs exactly 2 arguments'
  130. case $DOWNLOADER in
  131. curl)
  132. curl -o $1 -sfL $2
  133. ;;
  134. wget)
  135. wget -qO $1 $2
  136. ;;
  137. *)
  138. fatal "Incorrect executable '$DOWNLOADER'"
  139. ;;
  140. esac
  141. # Abort if download command failed
  142. [ $? -eq 0 ] || fatal 'Download failed'
  143. }
  144. install() {
  145. info "Arch: $ARCH. OS: $OS Version: $VERSION (\$VERSION)"
  146. TMP_DIR=$(mktemp -d -t edgevpn-install.XXXXXXXXXX)
  147. download $TMP_DIR/out.tar.gz https://github.com/mudler/edgevpn/releases/download/$VERSION/edgevpn-$VERSION-$OS-$ARCH.tar.gz
  148. # TODO verify w/ checksum
  149. tar xvf $TMP_DIR/out.tar.gz -C $TMP_DIR
  150. $SUDO cp -rf $TMP_DIR/edgevpn $BIN_DIR/
  151. # TODO trap
  152. rm -rf $TMP_DIR
  153. # TODO setup env files for a network connection
  154. }
  155. verify_env
  156. setup_service
  157. install