kindle (4760B)
1 #!/bin/sh 2 3 set -eu 4 5 # --- CONFIGURAÇÕES DE SUB-REDE --- 6 KINDLE_NET_1="10.0.0" 7 KINDLE_NET_2="192.168.18" 8 # --------------------------------- 9 10 KINDLE_PORT="2222" 11 KINDLE_USER="root" 12 KINDLE_REMOTE_PATH="/" 13 MOUNT_POINT="${HOME}/.local/share/koreader" 14 SSH_KEY="${HOME}/.ssh/kindle_rsa" 15 LOGFILE="/tmp/kindle-mount.log" 16 17 if [ -t 1 ]; then 18 R='\033[0;31m' G='\033[0;32m' Y='\033[0;33m' B='\033[0;34m' N='\033[0m' 19 else 20 R='' G='' Y='' B='' N='' 21 fi 22 23 log() { printf "${B}[*]${N} %s\n" "$*" | tee -a "$LOGFILE"; } 24 ok() { printf "${G}[✔]${N} %s\n" "$*" | tee -a "$LOGFILE"; } 25 warn() { printf "${Y}[!]${N} %s\n" "$*" | tee -a "$LOGFILE"; } 26 die() { printf "${R}[✘]${N} %s\n" "$*" | tee -a "$LOGFILE"; exit 1; } 27 28 MY_UID=$(id -u) 29 MY_GID=$(id -g) 30 31 check_deps() { 32 MISSING="" 33 command -v sshfs >/dev/null 2>&1 || MISSING="$MISSING sshfs" 34 apk info -e fuse >/dev/null 2>&1 || MISSING="$MISSING fuse" 35 36 if [ -n "$MISSING" ]; then 37 log "Instalando dependências:$MISSING" 38 doas apk add $MISSING >/dev/null 2>&1 || die "Falha ao instalar pacotes." 39 fi 40 41 for cmd in sshfs fusermount3 doas; do 42 command -v "$cmd" >/dev/null 2>&1 || die "Dependência ausente: '$cmd'" 43 done 44 } 45 46 is_mounted() { 47 grep -qs " ${MOUNT_POINT} fuse.sshfs " /proc/mounts 48 } 49 50 setup_fuse() { 51 if ! grep -q "^user_allow_other" /etc/fuse.conf 2>/dev/null; then 52 log "Habilitando 'user_allow_other' em /etc/fuse.conf..." 53 doas sh -c "echo 'user_allow_other' >> /etc/fuse.conf" \ 54 || die "Falha ao editar /etc/fuse.conf." 55 fi 56 if ! lsmod | grep -q "^fuse "; then 57 log "Carregando módulo FUSE..." 58 doas modprobe fuse || die "Falha ao carregar o módulo FUSE." 59 fi 60 } 61 62 do_umount() { 63 if is_mounted; then 64 log "Desmontando ${MOUNT_POINT}..." 65 fusermount3 -u "$MOUNT_POINT" \ 66 || doas umount -l "$MOUNT_POINT" \ 67 || die "Não foi possível desmontar." 68 ok "Kindle desmontado com sucesso." 69 else 70 warn "Kindle não está montado." 71 fi 72 } 73 74 discover_ip() { 75 printf "[*] Últimos dígitos do IP do Kindle (ex: 108): " 76 read -r LAST 77 78 if [ -z "$LAST" ]; then 79 die "Os dígitos do IP não podem ser vazios." 80 fi 81 82 # Monta os dois IPs possíveis baseados no que você digitou 83 TRY_IP_1="${KINDLE_NET_1}.${LAST}" 84 TRY_IP_2="${KINDLE_NET_2}.${LAST}" 85 86 # 1. Testa a primeira sub-rede 87 log "Verificando conectividade com Opção 1 (${TRY_IP_1}:${KINDLE_PORT})..." 88 if nc -z -w 2 "$TRY_IP_1" "$KINDLE_PORT" >/dev/null 2>&1; then 89 KINDLE_IP="$TRY_IP_1" 90 return 0 91 fi 92 93 # 2. Testa a segunda sub-rede 94 log "Opção 1 offline. Verificando Opção 2 (${TRY_IP_2}:${KINDLE_PORT})..." 95 if nc -z -w 2 "$TRY_IP_2" "$KINDLE_PORT" >/dev/null 2>&1; then 96 KINDLE_IP="$TRY_IP_2" 97 return 0 98 fi 99 100 # 3. Se nenhum responder, avisa mas tenta o primeiro mesmo assim (estilo o script original) 101 warn "Nenhuma das sub-redes respondeu na porta ${KINDLE_PORT}." 102 warn "Tentando forçar a montagem na Opção 1: ${TRY_IP_1}..." 103 KINDLE_IP="$TRY_IP_1" 104 } 105 106 do_mount() { 107 setup_fuse 108 mkdir -p "$MOUNT_POINT" 109 110 if is_mounted; then 111 warn "Kindle já está montado. Use 'umount' para desmontar." 112 exit 0 113 fi 114 115 KINDLE_IP="" 116 discover_ip 117 118 SSH_OPTS="" 119 if [ -f "$SSH_KEY" ]; then 120 SSH_OPTS="-o IdentityFile=${SSH_KEY}" 121 log "Usando chave SSH: ${SSH_KEY}" 122 else 123 warn "Chave SSH não encontrada — será solicitada senha." 124 fi 125 126 log "Montando Kindle (${KINDLE_IP}) em ${MOUNT_POINT}..." 127 128 # shellcheck disable=SC2086 129 sshfs "${KINDLE_USER}@${KINDLE_IP}:${KINDLE_REMOTE_PATH}" "$MOUNT_POINT" \ 130 -p "$KINDLE_PORT" \ 131 -o allow_other \ 132 -o uid="$MY_UID" \ 133 -o gid="$MY_GID" \ 134 -o reconnect \ 135 -o ServerAliveInterval=15 \ 136 -o ServerAliveCountMax=3 \ 137 -o follow_symlinks \ 138 -o StrictHostKeyChecking=accept-new \ 139 -o compression=yes \ 140 -o cache=yes \ 141 -o kernel_cache \ 142 $SSH_OPTS \ 143 || die "Falha na montagem. Consulte: ${LOGFILE}" 144 145 ok "Kindle montado em: ${MOUNT_POINT}" 146 } 147 148 do_status() { 149 printf "${B}[i]${N} Mount point : %s\n" "$MOUNT_POINT" 150 if is_mounted; then 151 ok "Status : MONTADO" 152 df -h "$MOUNT_POINT" 2>/dev/null | tail -1 | awk '{printf " Uso: %s de %s (%s livre)\n", $3, $2, $4}' 153 else 154 warn "Status : NÃO montado" 155 fi 156 } 157 158 check_deps 159 160 ACTION="${1:-mount}" 161 162 case "$ACTION" in 163 mount) do_mount ;; 164 umount) do_umount ;; 165 status) do_status ;; 166 toggle) is_mounted && do_umount || do_mount ;; 167 *) die "Uso: $0 [mount|umount|status|toggle]" ;; 168 esac