BASH 225
Wireguard.sh Guest on 1st May 2022 11:01:58 AM
  1. #!/bin/bash
  2.  
  3. # Secure WireGuard server installer for Debian, Ubuntu, CentOS, Fedora and Arch Linux
  4. # https://github.com/angristan/wireguard-install
  5.  
  6. RED='\033[0;31m'
  7. ORANGE='\033[0;33m'
  8. NC='\033[0m'
  9.  
  10. function isRoot() {
  11.         if [ "${EUID}" -ne 0 ]; then
  12.                 echo "You need to run this script as root"
  13.                 exit 1
  14.         fi
  15. }
  16.  
  17. function checkVirt() {
  18.         if [ "$(systemd-detect-virt)" == "openvz" ]; then
  19.                 echo "OpenVZ is not supported"
  20.                 exit 1
  21.         fi
  22.  
  23.         if [ "$(systemd-detect-virt)" == "lxc" ]; then
  24.                 echo "LXC is not supported (yet)."
  25.                 echo "WireGuard can technically run in an LXC container,"
  26.                 echo "but the kernel module has to be installed on the host,"
  27.                 echo "the container has to be run with some specific parameters"
  28.                 echo "and only the tools need to be installed in the container."
  29.                 exit 1
  30.         fi
  31. }
  32.  
  33. function checkOS() {
  34.         # Check OS version
  35.         if [[ -e /etc/debian_version ]]; then
  36.                 source /etc/os-release
  37.                 OS="${ID}" # debian or ubuntu
  38.                 if [[ ${ID} == "debian" || ${ID} == "raspbian" ]]; then
  39.                         if [[ ${VERSION_ID} -ne 10 ]]; then
  40.                                 echo "Your version of Debian (${VERSION_ID}) is not supported. Please use Debian 10 Buster"
  41.                                 exit 1
  42.                         fi
  43.                 fi
  44.         elif [[ -e /etc/fedora-release ]]; then
  45.                 source /etc/os-release
  46.                 OS="${ID}"
  47.         elif [[ -e /etc/centos-release ]]; then
  48.                 source /etc/os-release
  49.                 OS=centos
  50.         elif [[ -e /etc/arch-release ]]; then
  51.                 OS=arch
  52.         else
  53.                 echo "Looks like you aren't running this installer on a Debian, Ubuntu, Fedora, CentOS or Arch Linux system"
  54.                 exit 1
  55.         fi
  56. }
  57.  
  58. function initialCheck() {
  59.         isRoot
  60.         checkVirt
  61.         checkOS
  62. }
  63.  
  64. function installQuestions() {
  65.         echo "Welcome to the WireGuard installer!"
  66.         echo "The git repository is available at: https://github.com/angristan/wireguard-install"
  67.         echo ""
  68.         echo "I need to ask you a few questions before starting the setup."
  69.         echo "You can leave the default options and just press enter if you are ok with them."
  70.         echo ""
  71.  
  72.         # Detect public IPv4 or IPv6 address and pre-fill for the user
  73.         SERVER_PUB_IP=$(ip -4 addr | sed -ne 's|^.* inet \([^/]*\)/.* scope global.*$|\1|p' | head -1)
  74.         if [[ -z ${SERVER_PUB_IP} ]]; then
  75.                 # Detect public IPv6 address
  76.                 SERVER_PUB_IP=$(ip -6 addr | sed -ne 's|^.* inet6 \([^/]*\)/.* scope global.*$|\1|p' | head -1)
  77.         fi
  78.         read -rp "IPv4 or IPv6 public address: " -e -i "${SERVER_PUB_IP}" SERVER_PUB_IP
  79.  
  80.         # Detect public interface and pre-fill for the user
  81.         SERVER_NIC="$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | head -1)"
  82.         until [[ ${SERVER_PUB_NIC} =~ ^[a-zA-Z0-9_]+$ ]]; do
  83.                 read -rp "Public interface: " -e -i "${SERVER_NIC}" SERVER_PUB_NIC
  84.         done
  85.  
  86.         until [[ ${SERVER_WG_NIC} =~ ^[a-zA-Z0-9_]+$ && ${#SERVER_WG_NIC} -lt 16 ]]; do
  87.                 read -rp "WireGuard interface name: " -e -i wg0 SERVER_WG_NIC
  88.         done
  89.  
  90.         until [[ ${SERVER_WG_IPV4} =~ ^([0-9]{1,3}\.){3} ]]; do
  91.                 read -rp "Server's WireGuard IPv4: " -e -i 10.66.66.1 SERVER_WG_IPV4
  92.         done
  93.  
  94.         until [[ ${SERVER_WG_IPV6} =~ ^([a-f0-9]{1,4}:){3,4}: ]]; do
  95.                 read -rp "Server's WireGuard IPv6: " -e -i fd42:42:42::1 SERVER_WG_IPV6
  96.         done
  97.  
  98.         # Generate random number within private ports range
  99.         RANDOM_PORT=$(shuf -i49152-65535 -n1)
  100.         until [[ ${SERVER_PORT} =~ ^[0-9]+$ ]] && [ "${SERVER_PORT}" -ge 1 ] && [ "${SERVER_PORT}" -le 65535 ]; do
  101.                 read -rp "Server's WireGuard port [1-65535]: " -e -i "${RANDOM_PORT}" SERVER_PORT
  102.         done
  103.  
  104.         # Adguard DNS by default
  105.         until [[ ${CLIENT_DNS_1} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do
  106.                 read -rp "First DNS resolver to use for the clients: " -e -i 94.140.14.14 CLIENT_DNS_1
  107.         done
  108.         until [[ ${CLIENT_DNS_2} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do
  109.                 read -rp "Second DNS resolver to use for the clients (optional): " -e -i 94.140.15.15 CLIENT_DNS_2
  110.                 if [[ ${CLIENT_DNS_2} == "" ]]; then
  111.                         CLIENT_DNS_2="${CLIENT_DNS_1}"
  112.                 fi
  113.         done
  114.  
  115.         echo ""
  116.         echo "Okay, that was all I needed. We are ready to setup your WireGuard server now."
  117.         echo "You will be able to generate a client at the end of the installation."
  118.         read -n1 -r -p "Press any key to continue..."
  119. }
  120.  
  121. function installWireGuard() {
  122.         # Run setup questions first
  123.         installQuestions
  124.  
  125.         # Install WireGuard tools and module
  126.         if [[ ${OS} == 'ubuntu' ]]; then
  127.                 apt-get update
  128.                 apt-get install -y wireguard iptables resolvconf qrencode
  129.         elif [[ ${OS} == 'debian' ]]; then
  130.                 if ! grep -rqs "^deb .* buster-backports" /etc/apt/; then
  131.                         echo "deb http://deb.debian.org/debian buster-backports main" >/etc/apt/sources.list.d/backports.list
  132.                         apt-get update
  133.                 fi
  134.                 apt update
  135.                 apt-get install -y iptables resolvconf qrencode
  136.                 apt-get install -y -t buster-backports wireguard
  137.         elif [[ ${OS} == 'fedora' ]]; then
  138.                 if [[ ${VERSION_ID} -lt 32 ]]; then
  139.                         dnf install -y dnf-plugins-core
  140.                         dnf copr enable -y jdoss/wireguard
  141.                         dnf install -y wireguard-dkms
  142.                 fi
  143.                 dnf install -y wireguard-tools iptables qrencode
  144.         elif [[ ${OS} == 'centos' ]]; then
  145.                 yum -y install epel-release elrepo-release
  146.                 if [[ ${VERSION_ID} -eq 7 ]]; then
  147.                         yum -y install yum-plugin-elrepo
  148.                 fi
  149.                 yum -y install kmod-wireguard wireguard-tools iptables qrencode
  150.         elif [[ ${OS} == 'arch' ]]; then
  151.                 pacman -S --needed --noconfirm wireguard-tools qrencode
  152.         fi
  153.  
  154.         # Make sure the directory exists (this does not seem the be the case on fedora)
  155.         mkdir /etc/wireguard >/dev/null 2>&1
  156.  
  157.         chmod 600 -R /etc/wireguard/
  158.  
  159.         SERVER_PRIV_KEY=$(wg genkey)
  160.         SERVER_PUB_KEY=$(echo "${SERVER_PRIV_KEY}" | wg pubkey)
  161.  
  162.         # Save WireGuard settings
  163.         echo "SERVER_PUB_IP=${SERVER_PUB_IP}
  164. SERVER_PUB_NIC=${SERVER_PUB_NIC}
  165. SERVER_WG_NIC=${SERVER_WG_NIC}
  166. SERVER_WG_IPV4=${SERVER_WG_IPV4}
  167. SERVER_WG_IPV6=${SERVER_WG_IPV6}
  168. SERVER_PORT=${SERVER_PORT}
  169. SERVER_PRIV_KEY=${SERVER_PRIV_KEY}
  170. SERVER_PUB_KEY=${SERVER_PUB_KEY}
  171. CLIENT_DNS_1=${CLIENT_DNS_1}
  172. CLIENT_DNS_2=${CLIENT_DNS_2}" >/etc/wireguard/params
  173.  
  174.         # Add server interface
  175.         echo "[Interface]
  176. Address = ${SERVER_WG_IPV4}/24,${SERVER_WG_IPV6}/64
  177. ListenPort = ${SERVER_PORT}
  178. PrivateKey = ${SERVER_PRIV_KEY}" >"/etc/wireguard/${SERVER_WG_NIC}.conf"
  179.  
  180.         if pgrep firewalld; then
  181.                 FIREWALLD_IPV4_ADDRESS=$(echo "${SERVER_WG_IPV4}" | cut -d"." -f1-3)".0"
  182.                 FIREWALLD_IPV6_ADDRESS=$(echo "${SERVER_WG_IPV6}" | sed 's/:[^:]*$/:0/')
  183.                 echo "PostUp = firewall-cmd --add-port ${SERVER_PORT}/udp && firewall-cmd --add-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade' && firewall-cmd --add-rich-rule='rule family=ipv6 source address=${FIREWALLD_IPV6_ADDRESS}/24 masquerade'
  184. PostDown = firewall-cmd --remove-port ${SERVER_PORT}/udp && firewall-cmd --remove-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade' && firewall-cmd --remove-rich-rule='rule family=ipv6 source address=${FIREWALLD_IPV6_ADDRESS}/24 masquerade'" >>"/etc/wireguard/${SERVER_WG_NIC}.conf"
  185.         else
  186.                 echo "PostUp = iptables -A FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE; ip6tables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE
  187. PostDown = iptables -D FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE; ip6tables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE" >>"/etc/wireguard/${SERVER_WG_NIC}.conf"
  188.         fi
  189.  
  190.         # Enable routing on the server
  191.         echo "net.ipv4.ip_forward = 1
  192. net.ipv6.conf.all.forwarding = 1" >/etc/sysctl.d/wg.conf
  193.  
  194.         sysctl --system
  195.  
  196.         systemctl start "wg-quick@${SERVER_WG_NIC}"
  197.         systemctl enable "wg-quick@${SERVER_WG_NIC}"
  198.  
  199.         newClient
  200.         echo "If you want to add more clients, you simply need to run this script another time!"
  201.  
  202.         # Check if WireGuard is running
  203.         systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}"
  204.         WG_RUNNING=$?
  205.  
  206.         # WireGuard might not work if we updated the kernel. Tell the user to reboot
  207.         if [[ ${WG_RUNNING} -ne 0 ]]; then
  208.                 echo -e "\n${RED}WARNING: WireGuard does not seem to be running.${NC}"
  209.                 echo -e "${ORANGE}You can check if WireGuard is running with: systemctl status wg-quick@${SERVER_WG_NIC}${NC}"
  210.                 echo -e "${ORANGE}If you get something like \"Cannot find device ${SERVER_WG_NIC}\", please reboot!${NC}"
  211.         fi
  212. }
  213.  
  214. function newClient() {
  215.         ENDPOINT="${SERVER_PUB_IP}:${SERVER_PORT}"
  216.  
  217.         echo ""
  218.         echo "Tell me a name for the client."
  219.         echo "The name must consist of alphanumeric character. It may also include an underscore or a dash and can't exceed 15 chars."
  220.  
  221.         until [[ ${CLIENT_NAME} =~ ^[a-zA-Z0-9_-]+$ && ${CLIENT_EXISTS} == '0' && ${#CLIENT_NAME} -lt 16 ]]; do
  222.                 read -rp "Client name: " -e CLIENT_NAME
  223.                 CLIENT_EXISTS=$(grep -c -E "^### Client ${CLIENT_NAME}\$" "/etc/wireguard/${SERVER_WG_NIC}.conf")
  224.  
  225.                 if [[ ${CLIENT_EXISTS} == '1' ]]; then
  226.                         echo ""
  227.                         echo "A client with the specified name was already created, please choose another name."
  228.                         echo ""
  229.                 fi
  230.         done
  231.  
  232.         for DOT_IP in {2..254}; do
  233.                 DOT_EXISTS=$(grep -c "${SERVER_WG_IPV4::-1}${DOT_IP}" "/etc/wireguard/${SERVER_WG_NIC}.conf")
  234.                 if [[ ${DOT_EXISTS} == '0' ]]; then
  235.                         break
  236.                 fi
  237.         done
  238.  
  239.         if [[ ${DOT_EXISTS} == '1' ]]; then
  240.                 echo ""
  241.                 echo "The subnet configured supports only 253 clients."
  242.                 exit 1
  243.         fi
  244.  
  245.         BASE_IP=$(echo "$SERVER_WG_IPV4" | awk -F '.' '{ print $1"."$2"."$3 }')
  246.         until [[ ${IPV4_EXISTS} == '0' ]]; do
  247.                 read -rp "Client's WireGuard IPv4: ${BASE_IP}." -e -i "${DOT_IP}" DOT_IP
  248.                 CLIENT_WG_IPV4="${BASE_IP}.${DOT_IP}"
  249.                 IPV4_EXISTS=$(grep -c "$CLIENT_WG_IPV4/24" "/etc/wireguard/${SERVER_WG_NIC}.conf")
  250.  
  251.                 if [[ ${IPV4_EXISTS} == '1' ]]; then
  252.                         echo ""
  253.                         echo "A client with the specified IPv4 was already created, please choose another IPv4."
  254.                         echo ""
  255.                 fi
  256.         done
  257.  
  258.         BASE_IP=$(echo "$SERVER_WG_IPV6" | awk -F '::' '{ print $1 }')
  259.         until [[ ${IPV6_EXISTS} == '0' ]]; do
  260.                 read -rp "Client's WireGuard IPv6: ${BASE_IP}::" -e -i "${DOT_IP}" DOT_IP
  261.                 CLIENT_WG_IPV6="${BASE_IP}::${DOT_IP}"
  262.                 IPV6_EXISTS=$(grep -c "${CLIENT_WG_IPV6}/64" "/etc/wireguard/${SERVER_WG_NIC}.conf")
  263.  
  264.                 if [[ ${IPV6_EXISTS} == '1' ]]; then
  265.                         echo ""
  266.                         echo "A client with the specified IPv6 was already created, please choose another IPv6."
  267.                         echo ""
  268.                 fi
  269.         done
  270.  
  271.         # Generate key pair for the client
  272.         CLIENT_PRIV_KEY=$(wg genkey)
  273.         CLIENT_PUB_KEY=$(echo "${CLIENT_PRIV_KEY}" | wg pubkey)
  274.         CLIENT_PRE_SHARED_KEY=$(wg genpsk)
  275.  
  276.         # Home directory of the user, where the client configuration will be written
  277.         if [ -e "/home/${CLIENT_NAME}" ]; then
  278.                 # if $1 is a user name
  279.                 HOME_DIR="/home/${CLIENT_NAME}"
  280.         elif [ "${SUDO_USER}" ]; then
  281.                 # if not, use SUDO_USER
  282.                 if [ "${SUDO_USER}" == "root" ]; then
  283.                         # If running sudo as root
  284.                         HOME_DIR="/root"
  285.                 else
  286.                         HOME_DIR="/home/${SUDO_USER}"
  287.                 fi
  288.         else
  289.                 # if not SUDO_USER, use /root
  290.                 HOME_DIR="/root"
  291.         fi
  292.  
  293.         # Create client file and add the server as a peer
  294.         echo "[Interface]
  295. PrivateKey = ${CLIENT_PRIV_KEY}
  296. Address = ${CLIENT_WG_IPV4}/32,${CLIENT_WG_IPV6}/128
  297. DNS = ${CLIENT_DNS_1},${CLIENT_DNS_2}
  298.  
  299. [Peer]
  300. PublicKey = ${SERVER_PUB_KEY}
  301. PresharedKey = ${CLIENT_PRE_SHARED_KEY}
  302. Endpoint = ${ENDPOINT}
  303. AllowedIPs = 0.0.0.0/0,::/0" >>"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf"
  304.  
  305.         # Add the client as a peer to the server
  306.         echo -e "\n### Client ${CLIENT_NAME}
  307. [Peer]
  308. PublicKey = ${CLIENT_PUB_KEY}
  309. PresharedKey = ${CLIENT_PRE_SHARED_KEY}
  310. AllowedIPs = ${CLIENT_WG_IPV4}/32,${CLIENT_WG_IPV6}/128" >>"/etc/wireguard/${SERVER_WG_NIC}.conf"
  311.  
  312.         wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}")
  313.  
  314.         echo -e "\nHere is your client config file as a QR Code:"
  315.  
  316.         qrencode -t ansiutf8 -l L <"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf"
  317.  
  318.         echo "It is also available in ${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf"
  319. }
  320.  
  321. function revokeClient() {
  322.         NUMBER_OF_CLIENTS=$(grep -c -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf")
  323.         if [[ ${NUMBER_OF_CLIENTS} == '0' ]]; then
  324.                 echo ""
  325.                 echo "You have no existing clients!"
  326.                 exit 1
  327.         fi
  328.  
  329.         echo ""
  330.         echo "Select the existing client you want to revoke"
  331.         grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | nl -s ') '
  332.         until [[ ${CLIENT_NUMBER} -ge 1 && ${CLIENT_NUMBER} -le ${NUMBER_OF_CLIENTS} ]]; do
  333.                 if [[ ${CLIENT_NUMBER} == '1' ]]; then
  334.                         read -rp "Select one client [1]: " CLIENT_NUMBER
  335.                 else
  336.                         read -rp "Select one client [1-${NUMBER_OF_CLIENTS}]: " CLIENT_NUMBER
  337.                 fi
  338.         done
  339.  
  340.         # match the selected number to a client name
  341.         CLIENT_NAME=$(grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | sed -n "${CLIENT_NUMBER}"p)
  342.  
  343.         # remove [Peer] block matching $CLIENT_NAME
  344.         sed -i "/^### Client ${CLIENT_NAME}\$/,/^$/d" "/etc/wireguard/${SERVER_WG_NIC}.conf"
  345.  
  346.         # remove generated client file
  347.         rm -f "${HOME}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf"
  348.  
  349.         # restart wireguard to apply changes
  350.         wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}")
  351. }
  352.  
  353. function uninstallWg() {
  354.         echo ""
  355.         read -rp "Do you really want to remove WireGuard? [y/n]: " -e -i n REMOVE
  356.         if [[ $REMOVE == 'y' ]]; then
  357.                 checkOS
  358.  
  359.                 systemctl stop "wg-quick@${SERVER_WG_NIC}"
  360.                 systemctl disable "wg-quick@${SERVER_WG_NIC}"
  361.  
  362.                 if [[ ${OS} == 'ubuntu' ]]; then
  363.                         apt-get autoremove --purge -y wireguard qrencode
  364.                 elif [[ ${OS} == 'debian' ]]; then
  365.                         apt-get autoremove --purge -y wireguard qrencode
  366.                 elif [[ ${OS} == 'fedora' ]]; then
  367.                         dnf remove -y wireguard-tools qrencode
  368.                         if [[ ${VERSION_ID} -lt 32 ]]; then
  369.                                 dnf remove -y wireguard-dkms
  370.                                 dnf copr disable -y jdoss/wireguard
  371.                         fi
  372.                         dnf autoremove -y
  373.                 elif [[ ${OS} == 'centos' ]]; then
  374.                         yum -y remove kmod-wireguard wireguard-tools qrencode
  375.                         yum -y autoremove
  376.                 elif [[ ${OS} == 'arch' ]]; then
  377.                         pacman -Rs --noconfirm wireguard-tools qrencode
  378.                 fi
  379.  
  380.                 rm -rf /etc/wireguard
  381.                 rm -f /etc/sysctl.d/wg.conf
  382.  
  383.                 # Reload sysctl
  384.                 sysctl --system
  385.  
  386.                 # Check if WireGuard is running
  387.                 systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}"
  388.                 WG_RUNNING=$?
  389.  
  390.                 if [[ ${WG_RUNNING} -eq 0 ]]; then
  391.                         echo "WireGuard failed to uninstall properly."
  392.                         exit 1
  393.                 else
  394.                         echo "WireGuard uninstalled successfully."
  395.                         exit 0
  396.                 fi
  397.         else
  398.                 echo ""
  399.                 echo "Removal aborted!"
  400.         fi
  401. }
  402.  
  403. function manageMenu() {
  404.         echo "Welcome to WireGuard-install!"
  405.         echo "The git repository is available at: https://github.com/angristan/wireguard-install"
  406.         echo ""
  407.         echo "It looks like WireGuard is already installed."
  408.         echo ""
  409.         echo "What do you want to do?"
  410.         echo "   1) Add a new user"
  411.         echo "   2) Revoke existing user"
  412.         echo "   3) Uninstall WireGuard"
  413.         echo "   4) Exit"
  414.         until [[ ${MENU_OPTION} =~ ^[1-4]$ ]]; do
  415.                 read -rp "Select an option [1-4]: " MENU_OPTION
  416.         done
  417.         case "${MENU_OPTION}" in
  418.         1)
  419.                 newClient
  420.                 ;;
  421.         2)
  422.                 revokeClient
  423.                 ;;
  424.         3)
  425.                 uninstallWg
  426.                 ;;
  427.         4)
  428.                 exit 0
  429.                 ;;
  430.         esac
  431. }
  432.  
  433. # Check for root, virt, OS...
  434. initialCheck
  435.  
  436. # Check if WireGuard is already installed and load params
  437. if [[ -e /etc/wireguard/params ]]; then
  438.         source /etc/wireguard/params
  439.         manageMenu
  440. else
  441.         installWireGuard
  442. fi

paste.retronerd.at ist fuer Quelltexte und generellen Debugging Text.

Login oder Registrieren um zu bearbeiten, loeschen, um deine Pastes zu verfolgen und mehr.

Raw Paste

Login oder Registrieren um diesen Paste zu bearbeiten oder zu forken. Es ist kostenlos.