#!/bin/sh # Instalador de soporte remoto de traut.org.ar # # wget -O- soporte.traut.org.ar|sh # # Instala upterm (versión fija, verificada con sha256) y el comando soporte-traut. # No abre ninguna sesión: para eso se corre aparte: soporte-traut # Se puede volver a correr para actualizar (es lo que hace soporte-traut --actualizar). # # Todo está dentro de main(), que se llama en la última línea: si la descarga # se corta a la mitad, no se ejecuta nada. main() { set -e VERSION=0.41.1 SERVIDOR=soporte.traut.org.ar URL=https://github.com/owenthereal/upterm/releases/download/v$VERSION CLAVE_SERVIDOR="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF2MBbxe2K3UQw+WRnpQPsEnoghd+XEcS6/UUwDs4JGy" if [ "$(id -u)" = 0 ]; then SUDO= elif command -v sudo >/dev/null 2>&1; then SUDO=sudo else echo "Hace falta ser root. Entrá como root (por ejemplo con: su -) y volvé a correr:" echo " wget -O- $SERVIDOR|sh" exit 1 fi if ! command -v dpkg >/dev/null 2>&1; then echo "Este instalador es para Debian, Ubuntu y derivados." exit 1 fi case "$(dpkg --print-architecture)" in amd64) PAQ=amd64; SHA=2f675cf8db1bc4ac8f016a374d0a9ae7974fb314e154ccc3d8c0c356981d5d93 ;; arm64) PAQ=arm64; SHA=6d2c41f86657d8b621f8e7fd5816b7ecdc755331ef9803c724d81919cafca8ca ;; i386) PAQ=386; SHA=502c8f79e8c445a63baf47df83e0b73e2d9a01700d947b87090a5a654e9f3e98 ;; armhf) PAQ=armv6; SHA=e4eba87aa24c9158de2dd80958bf4682a9ad40ecf3c83a95728422dfc6197804 ;; *) echo "Arquitectura no soportada: $(dpkg --print-architecture)" exit 1 ;; esac ANTERIOR=$(upterm version 2>/dev/null | sed -n 's/^Upterm version //p') if [ "$ANTERIOR" = "$VERSION" ]; then echo "upterm $VERSION ya está instalado." else TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT DEB="$TMP/upterm_linux_$PAQ.deb" echo "Bajando upterm $VERSION ($PAQ)..." if command -v wget >/dev/null 2>&1; then wget -q -O "$DEB" "$URL/upterm_linux_$PAQ.deb" else curl -fsSL -o "$DEB" "$URL/upterm_linux_$PAQ.deb" fi echo "$SHA $DEB" | sha256sum -c --quiet - || { echo "El paquete bajado no coincide con el esperado. No se instala nada." exit 1 } chmod 755 "$TMP"; chmod 644 "$DEB" # que apt (_apt) lo pueda leer echo "Instalando upterm..." $SUDO env DEBIAN_FRONTEND=noninteractive apt-get install -y -qq "$DEB" >/dev/null fi # known_hosts y wrapper: se escriben a un .nuevo y se renombran encima (atómico). # Así un soporte-traut que se esté ejecutando sigue leyendo su archivo viejo intacto, # y si esto se corta a la mitad nunca queda un archivo escrito a medias. $SUDO mkdir -p /usr/local/share/soporte-traut printf '@cert-authority %s %s\n@cert-authority [%s]:443 %s\n' \ "$SERVIDOR" "$CLAVE_SERVIDOR" "$SERVIDOR" "$CLAVE_SERVIDOR" | $SUDO tee /usr/local/share/soporte-traut/known_hosts.nuevo >/dev/null $SUDO chmod 644 /usr/local/share/soporte-traut/known_hosts.nuevo $SUDO mv -f /usr/local/share/soporte-traut/known_hosts.nuevo /usr/local/share/soporte-traut/known_hosts wrapper | $SUDO tee /usr/local/bin/soporte-traut.nuevo >/dev/null $SUDO chmod 755 /usr/local/bin/soporte-traut.nuevo $SUDO mv -f /usr/local/bin/soporte-traut.nuevo /usr/local/bin/soporte-traut echo if [ -n "$ANTERIOR" ] && [ "$ANTERIOR" != "$VERSION" ]; then echo "Listo, se actualizó upterm de $ANTERIOR a $VERSION." else echo "Listo." fi echo "Para abrir una sesión de soporte, escribí: soporte-traut" } # El comando soporte-traut. Va entre comillas simples: no se expande nada al instalarlo. wrapper() { cat <<'FIN_WRAPPER' #!/bin/sh # soporte-traut: soporte remoto por upterm a través de soporte.traut.org.ar # Instalado por: wget -O- soporte.traut.org.ar|sh # # soporte-traut abre una sesión de soporte # soporte-traut --actualizar actualiza upterm y este comando # soporte-traut --desinstalar saca todo lo que instaló el instalador SERVIDOR=soporte.traut.org.ar KNOWN_HOSTS=/usr/local/share/soporte-traut/known_hosts bajar() { if command -v wget >/dev/null 2>&1; then wget -q -T 10 -O- "$1" else curl -fsS --max-time 10 "$1" fi } case "$1" in --actualizar) # exec: este proceso se reemplaza por el instalador y no vuelve a leer este archivo, # que el instalador va a reemplazar. exec sh -c ' if command -v wget >/dev/null 2>&1; then s=$(wget -q -O- https://soporte.traut.org.ar) else s=$(curl -fsSL https://soporte.traut.org.ar) fi || { echo "No se pudo bajar el instalador de soporte.traut.org.ar"; exit 1; } printf "%s\n" "$s" | sh' ;; --desinstalar) set -e if [ "$(id -u)" = 0 ]; then SUDO=; else SUDO=sudo; fi $SUDO env DEBIAN_FRONTEND=noninteractive apt-get remove -y -qq upterm >/dev/null $SUDO rm -rf /usr/local/share/soporte-traut $SUDO rm -f /usr/local/bin/soporte-traut echo "Listo, se desinstaló upterm y soporte-traut." exit 0 ;; esac # ¿Hay una versión nueva? Sólo se toma en serio si la respuesta tiene forma de versión; # si no se puede consultar, se sigue y que upterm diga lo que tenga que decir. NUEVA=$(bajar "https://$SERVIDOR/version" 2>/dev/null | head -n 1) INSTALADA=$(upterm version 2>/dev/null | sed -n 's/^Upterm version //p') if echo "$NUEVA" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$' && [ "$NUEVA" != "$INSTALADA" ]; then echo "Hay una versión nueva ($NUEVA; tenés ${INSTALADA:-ninguna})." echo "Antes de seguir, actualizá con: soporte-traut --actualizar" exit 1 fi echo echo " Se va a abrir una sesión de soporte remoto." echo " Quien entre a la sesión va a poder ver y usar esta terminal con tus permisos." echo " Abrila sólo si confiás en esa persona." echo echo " Pasale a quien te da soporte la línea que dice \"Join:\"." echo " Para cerrar la sesión en cualquier momento, escribí: exit" echo exec upterm host --server "wss://$SERVIDOR" --known-hosts "$KNOWN_HOSTS" "$@" FIN_WRAPPER } main "$@"