├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── ProxmoxLauncher ├── composer.json └── readme.md /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/domingoruiz/Proxmox-Launcher/ac0da8448f256a39899c8032f7fc134864839cb7/.gitignore -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | v1.0 2 | ------ 3 | 4 | - Versión inicial de Proxmox Launcher 5 | - Añadir y eliminar conexiones Proxmox 6 | - Modo invitado -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 Domingo Ruiz Arroyo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /ProxmoxLauncher: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ############################################################################ 4 | ## Proxmox Launcher 1.0 5 | ## Utilidad para el acceso a máquinas virtuales Proxmox 6 | ## 7 | ## Domingo Ruiz Arroyo 8 | ## https://github.com/domingoruiz/Proxmox-Launcher 9 | ## 2020 10 | ############################################################################ 11 | 12 | ## 13 | ## Operaciones de la aplicación 14 | ## 15 | 16 | # Pantalla de inicio. Desde aquí se podran elegir las distintas operaciones de la app 17 | function pantalla_inicio() { 18 | #Creamos la carpeta de la app 19 | if [ -d "${HOME}/.PROXMOX_LAUNCHER" ] 20 | then 21 | cd "${HOME}/.PROXMOX_LAUNCHER" 22 | else 23 | mkdir "${HOME}/.PROXMOX_LAUNCHER" 24 | cd "${HOME}/.PROXMOX_LAUNCHER" 25 | fi 26 | 27 | #Montamos el menu de inicio 28 | items=$(get_credenciales) 29 | 30 | CHOICE=$( 31 | whiptail --title "Proxmox Launcher" --menu "Proxmox Launcher es una utilidad para acceder a máquinas virtuales Proxmox de una forma rápida y sencilla." 25 80 12 \ 32 | ${items} \ 33 | "@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" \ 34 | "1" "Añadir nueva conexión" \ 35 | "2" "Eliminar conexión" \ 36 | "3" "Modo Invitado" \ 37 | "@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" \ 38 | "4" "Acerca de" \ 39 | "5" "Salir" 3>&2 2>&1 1>&3 40 | ) 41 | 42 | exitstatus=$? 43 | [[ "$exitstatus" = 1 ]] && exit; 44 | 45 | 46 | #Procesamos según la opción elegida 47 | case $CHOICE in 48 | "@@@@@@@@@@@@@@@") 49 | pantalla_inicio 50 | ;; 51 | 1) 52 | añadir_conexion 53 | ;; 54 | 2) 55 | eliminar_conexion 56 | ;; 57 | 3) 58 | modo_invitado 59 | ;; 60 | 4) 61 | acerca_de 62 | ;; 63 | 5) 64 | exit 65 | ;; 66 | *) 67 | # Nos conectamos según las credenciales elegidas y elegimos VM 68 | i=0 69 | result=() 70 | while IFS= read -r line 71 | do 72 | result[i]=$line 73 | i=${i}+1 74 | done < "${HOME}/.PROXMOX_LAUNCHER/${CHOICE}" 75 | 76 | NOMBRE="${result[0]}" 77 | SERVER="${result[1]}" 78 | USERNAME="${result[2]}" 79 | PASSWORD="${result[3]}" 80 | REALM="${result[4]}" 81 | 82 | vms=$(get_vms) 83 | 84 | NODE_VMID=$(whiptail --title "Proxmox Launcher" --menu "Seleccione la máquina que desea visualizar. En caso de que este apagada se encendera." 25 80 12 --cancel-button Cancel --ok-button Select ${vms} 3>&1 1>&2 2>&3) 85 | exitstatus=$? 86 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 87 | 88 | # Una vez elegida la encendemos y nos conectamos. 89 | IFS='-' read -r -a NODE_VMID <<< "$NODE_VMID" 90 | 91 | NODE=${NODE_VMID[0]} 92 | NODE="${NODE%%\.*}" 93 | 94 | DATA="$(curl -f -s -S -k --data-urlencode "username=$USERNAME@$REALM" --data-urlencode "password=$PASSWORD" "https://$SERVER:8006/api2/json/access/ticket")" 95 | 96 | TICKET="${DATA//\"/}" 97 | TICKET="${TICKET##*ticket:}" 98 | TICKET="${TICKET%%,*}" 99 | TICKET="${TICKET%%\}*}" 100 | 101 | CSRF="${DATA//\"/}" 102 | CSRF="${CSRF##*CSRFPreventionToken:}" 103 | CSRF="${CSRF%%,*}" 104 | CSRF="${CSRF%%\}*}" 105 | 106 | curl -f -s -S -k -X POST -b "PVEAuthCookie=$TICKET" -H "CSRFPreventionToken: $CSRF" "https://$SERVER:8006/api2/json/nodes/${NODE}/qemu/${NODE_VMID[1]}/status/start" > /dev/null 107 | sleep 3 108 | curl -f -s -S -k -X POST -b "PVEAuthCookie=$TICKET" -H "CSRFPreventionToken: $CSRF" -d "proxy=$SERVER" "https://$SERVER:8006/api2/spiceconfig/nodes/${NODE}/qemu/${NODE_VMID[1]}/spiceproxy" > /tmp/spiceproxy 109 | 110 | remote-viewer /tmp/spiceproxy &> /dev/null & 111 | 112 | pantalla_inicio 113 | ;; 114 | esac 115 | } 116 | 117 | # Añadir conexión. Permite añadir una nueva conexión al sistema. 118 | function añadir_conexion() { 119 | # Recogemos los datos de conexión 120 | formulario_credenciales 121 | 122 | Nombre=$(echo "$Nombre" | tr -d '[[:space:]]') 123 | 124 | echo "${Nombre}" >> "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" 125 | echo "${URL}" >> "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" 126 | echo "${Username}" >> "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" 127 | echo "${Password}" >> "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" 128 | echo "${Realm}" >> "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" 129 | 130 | #Mensaje exito 131 | whiptail \ 132 | --title "Proxmox Launcher" \ 133 | --msgbox "Conexión probada correctamente. Se ha guardado en base de datos. Pulse OK para volver al menu." 8 45 134 | 135 | pantalla_inicio 136 | } 137 | 138 | # Eliminar conexión. Permite eliminar unas credenciales Proxmox del sistema. 139 | function eliminar_conexion() { 140 | #Listamos todas las conexiones 141 | cd "${HOME}/.PROXMOX_LAUNCHER/" 142 | 143 | items=$(get_credenciales) 144 | 145 | CHOICE=$( 146 | whiptail --title "Proxmox Launcher" --menu "Elige la conexión a eliminar" 25 80 12 \ 147 | ${items} 3>&2 2>&1 1>&3 148 | ) 149 | exitstatus=$? 150 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 151 | 152 | #Eliminamos la conexión elegida 153 | rm "${HOME}/.PROXMOX_LAUNCHER/${CHOICE}" 154 | 155 | #Mensaje exito 156 | whiptail \ 157 | --title "Proxmox Launcher" \ 158 | --msgbox "Conexión eliminada correctamente. Pulse OK para volver al menu." 8 45 159 | 160 | pantalla_inicio 161 | } 162 | 163 | # Modo invitado. Permite conectarse a una máquina virtual Proxmox sin tener que almacenar sus credenciales en el sistema. 164 | function modo_invitado() { 165 | # Recogemos los datos de conexión 166 | formulario_credenciales 167 | 168 | # Buscamos las VM de ese usuario 169 | i=0 170 | result=() 171 | while IFS= read -r line 172 | do 173 | result[i]=$line 174 | i=${i}+1 175 | done < "${HOME}/.PROXMOX_LAUNCHER/${CHOICE}" 176 | 177 | NOMBRE="${Nombre}" 178 | SERVER="${URL}" 179 | USERNAME="${Username}" 180 | PASSWORD="${Password}" 181 | REALM="${Realm}" 182 | 183 | vms=$(get_vms) 184 | 185 | NODE_VMID=$(whiptail --title "Proxmox Launcher" --menu "Seleccione la máquina que desea visualizar" 25 80 12 --cancel-button Cancel --ok-button Select ${vms} 3>&1 1>&2 2>&3) 186 | exitstatus=$? 187 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 188 | 189 | # Nos conectamos a la VM elegida 190 | IFS='-' read -r -a NODE_VMID <<< "$NODE_VMID" 191 | 192 | NODE=${NODE_VMID[0]} 193 | NODE="${NODE%%\.*}" 194 | 195 | DATA="$(curl -f -s -S -k --data-urlencode "username=$USERNAME@$REALM" --data-urlencode "password=$PASSWORD" "https://$SERVER:8006/api2/json/access/ticket")" 196 | 197 | TICKET="${DATA//\"/}" 198 | TICKET="${TICKET##*ticket:}" 199 | TICKET="${TICKET%%,*}" 200 | TICKET="${TICKET%%\}*}" 201 | 202 | CSRF="${DATA//\"/}" 203 | CSRF="${CSRF##*CSRFPreventionToken:}" 204 | CSRF="${CSRF%%,*}" 205 | CSRF="${CSRF%%\}*}" 206 | 207 | curl -f -s -S -k -X POST -b "PVEAuthCookie=$TICKET" -H "CSRFPreventionToken: $CSRF" "https://$SERVER:8006/api2/json/nodes/${NODE}/qemu/${NODE_VMID[1]}/status/start" > /dev/null 208 | sleep 3 209 | curl -f -s -S -k -X POST -b "PVEAuthCookie=$TICKET" -H "CSRFPreventionToken: $CSRF" "https://$SERVER:8006/api2/spiceconfig/nodes/${NODE}/qemu/${NODE_VMID[1]}/spiceproxy" -d "proxy=$SERVER" > /tmp/spiceproxy 210 | 211 | remote-viewer /tmp/spiceproxy &> /dev/null & 212 | 213 | pantalla_inicio 214 | } 215 | 216 | # Pantalla Acerca De. Aporta información sobre la APP y su desarrollador. 217 | function acerca_de() { 218 | whiptail \ 219 | --title "Proxmox Launcher" \ 220 | --msgbox " 221 | Proxmox Launcher 1.0 222 | 223 | Herramienta Open-Source desarrollada por 224 | Domingo Ruiz Arroyo 225 | 226 | Disponible para su descarga y uso en 227 | Github: https://github.com/domingoruiz/Proxmox-Launcher" 15 80 228 | 229 | pantalla_inicio 230 | } 231 | 232 | ## 233 | ## Funciones auxiliares 234 | ## 235 | 236 | # Esta función devuelve todas las credenciales Proxmox que estan almacenadas en el equipo 237 | function get_credenciales() { 238 | cd "${HOME}/.PROXMOX_LAUNCHER/" 239 | 240 | a=1 241 | for i in $(ls -C1) 242 | do 243 | i=$(basename "$i") 244 | echo -n "${i} '${i}' " 245 | a=$((a + 1)) 246 | done 247 | } 248 | 249 | # Esta función devuelve todas las VM de un usuario Proxmox 250 | function get_vms() { 251 | TOKEN=`curl -s -k -d "username=$USERNAME@$REALM&password=$PASSWORD" https://$SERVER:8006/api2/json/access/ticket | jq -r .data.ticket` 252 | 253 | NODES=`curl -s -k https://$SERVER:8006/api2/json/nodes -b "PVEAuthCookie=$TOKEN" | jq -r '.data[].node'` 254 | for NODE in `echo $NODES`; do 255 | curl -s -k https://$SERVER:8006/api2/json/nodes/$NODE/qemu -b "PVEAuthCookie=$TOKEN" > /tmp/proxvm-qemu.json 256 | 257 | for VMID in `cat /tmp/proxvm-qemu.json | jq -r '.data[].vmid'`; do 258 | JSON=`cat /tmp/proxvm-qemu.json | jq -r ".data[] | select(.vmid | tonumber | contains($VMID))"` 259 | NAME=`echo $JSON | jq -r .name` 260 | VMID=`echo $JSON | jq -r .vmid` 261 | curl -s -k https://$SERVER:8006/api2/json/nodes/$NODE/qemu/$VMID/config -b "PVEAuthCookie=$TOKEN" > /tmp/proxvm-$VMID.json 262 | TEMPLATE=`cat /tmp/proxvm-$VMID.json | jq -r .data.template` 263 | 264 | if [ "${TEMPLATE}" != 1 ]; 265 | then 266 | echo -n "${NODE}-${VMID} '${NAME}' " 267 | fi 268 | done 269 | done 270 | } 271 | 272 | # Formulario para recoger los datos de conexión a Proxmox 273 | function formulario_credenciales() { 274 | Nombre=$(whiptail --title "Proxmox Launcher" --inputbox "Nombre de la nueva conexión" 10 60 "" 3>&1 1>&2 2>&3) 275 | 276 | exitstatus=$? 277 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 278 | 279 | while [ -z "$Nombre" ]; do 280 | whiptail \ 281 | --title "Proxmox Launcher" \ 282 | --msgbox "Nombre no puede estar vacio" 8 45 283 | 284 | Nombre=$(whiptail --title "Proxmox Launcher" --inputbox "Nombre de la nueva conexión" 10 60 "" 3>&1 1>&2 2>&3) 285 | 286 | exitstatus=$? 287 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 288 | done 289 | 290 | while [ -f "${HOME}/.PROXMOX_LAUNCHER/${Nombre}" ]; do 291 | whiptail \ 292 | --title "Proxmox Launcher" \ 293 | --msgbox "Nombre de conexión ya existente" 8 45 294 | 295 | Nombre=$(whiptail --title "Proxmox Launcher" --inputbox "Nombre de la nueva conexión" 10 60 "" 3>&1 1>&2 2>&3) 296 | exitstatus=$? 297 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 298 | done 299 | 300 | URL=$(whiptail --title "Proxmox Launcher" --inputbox "IP del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 301 | exitstatus=$? 302 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 303 | 304 | while [ -z "$URL" ]; do 305 | whiptail \ 306 | --title "Proxmox Launcher" \ 307 | --msgbox "IP no puede estar vacia" 8 45 308 | 309 | URL=$(whiptail --title "Proxmox Launcher" --inputbox "URL del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 310 | exitstatus=$? 311 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 312 | done 313 | 314 | Username=$(whiptail --title "Proxmox Launcher" --inputbox "Usuario del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 315 | exitstatus=$? 316 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 317 | 318 | while [ -z "$Username" ]; do 319 | whiptail \ 320 | --title "Proxmox Launcher" \ 321 | --msgbox "Usuario no puede estar vacio" 8 45 322 | 323 | Username=$(whiptail --title "Proxmox Launcher" --inputbox "Usuario del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 324 | exitstatus=$? 325 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 326 | done 327 | 328 | Password=$(whiptail --title "Proxmox Launcher" --passwordbox "Contraseña del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 329 | exitstatus=$? 330 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 331 | 332 | while [ -z "$Password" ]; do 333 | whiptail \ 334 | --title "Proxmox Launcher" \ 335 | --msgbox "Contraseña no puede estar vacia" 8 45 336 | 337 | Password=$(whiptail --title "Proxmox Launcher" --inputbox "Contraseña del servidor Proxmox" 10 60 "" 3>&1 1>&2 2>&3) 338 | exitstatus=$? 339 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 340 | done 341 | 342 | Realm=$( 343 | whiptail --title "Proxmox Launcher" --menu "Sistema de autentificación a usar" 25 80 12 \ 344 | "pam" "Linux PAM standard authentication" \ 345 | "pve" "Proxmox VE Authentication Server" 3>&2 2>&1 1>&3 346 | ) 347 | exitstatus=$? 348 | [[ "$exitstatus" = 1 ]] && pantalla_inicio; 349 | } 350 | 351 | ## 352 | ## Ejecutamos la app 353 | ## 354 | pantalla_inicio 355 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "domingoruiz/proxmoxlauncher", 3 | "type": "app", 4 | "description": "Utilidad para acceder rápidamente a máquinas virtuales Proxmox.", 5 | "keywords": ["Proxmox", "API", "KVM", "OpenVZ", "Virtualization"], 6 | "homepage": "https://github.com/domingoruiz/Proxmox-Launcher", 7 | "license": "MIT", 8 | 9 | "authors": [ 10 | { 11 | "name": "Domingo Ruiz Arroyo", 12 | "email": "ordenadordomi@gmail.com", 13 | "role": "Developer" 14 | } 15 | ], 16 | 17 | "support": { 18 | "issues": "https://github.com/domingoruiz/Proxmox-Launcher/issues", 19 | "source": "https://github.com/domingoruiz/Proxmox-Launcher" 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Proxmox Launcher 2 | 3 | Proxmox Launcher es una utilidad que nos permitira acceder de una forma rápida y sencilla a todas las máquinas virtuales de nuestros distintos servidores Proxmox sin tener que pasar por la interfaz web ni escribir las credenciales cada vez que se le de uso. 4 | 5 | ## Requisitos previos a la instalación 6 | Para instalar esta aplicación debemos comprobar que tenemos los siguientes componentes instalados en nuestra máquina Linux: 7 | - virt-viewer 8 | - jq 9 | - curl 10 | - whiptail 11 | 12 | Los cuales podemos instalar en Debian/Ubuntu con el siguiente comando: 13 | ```bash 14 | apt-get install virt-viewer jq curl whiptail 15 | ``` 16 | O en sistemas RHEL con este otro comando: 17 | ```bash 18 | yum install virt-viewer jq curl whiptail 19 | ``` 20 | ## Instalación 21 | 22 | Descargamos y colocamos el script Proxmox_Launcher en un lugar que nos sea cómodo, le damos permiso de ejecución y estará listo para ser usado. 23 | 24 | ```bash 25 | git clone https://github.com/domingoruiz/Proxmox-Launcher.git 26 | mv Proxmox-Launcher/ProxmoxLauncher /usr/bin/ 27 | chmod +x /usr/bin/ProxmoxLauncher 28 | ``` 29 | 30 | ## Uso 31 | 32 | Ejecutamos en terminal o a través de un acceso directo el comando Proxmox-Launcher y automáticamente se nos abrirá la aplicación dentro de la terminal. 33 | 34 | ```bash 35 | ProxmoxLauncher 36 | ``` 37 | 38 | ## Desarrollo 39 | Aplicación desarrollada por Domingo Ruiz Arroyo 40 | 41 | ## Licencia 42 | 43 | 44 | Este proyecto se publica bajo la licencia MIT. Consulte el archivo [LICENSE](../master/LICENSE) para obtener más detalles. 45 | --------------------------------------------------------------------------------