#! /bin/sh # # usage: vcp COMMAND [COMMAND_ARGS...] # # To get a list of all available commands and their type, run vcp helpCommands # # helpCommands : TODO _netcup_vcp_cmd_helpCommands() { sed -n 's/^# \([^ ]\+ : .*\)/\1/p' "$0" | sort } # login : TODO _netcup_vcp_cmd_login() { _netcup_vcp_post Login \ -L \ -d username="$netcup_vcp_username" \ -d password="$netcup_vcp_password" \ -d doLogin=Login } # kvmInformation : VServerID -> TODO _netcup_vcp_cmd_kvmInformation() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMGeneral \ -q section=kvmInformation \ -q selectedVServerId="$1" text=$(w3m -T text/html -dump -cols 4096 "$_netcup_vcp_content_cache") vsname=$(echo "$text" | sed -n 's/^vServer-Name\s*\(\S\+\).*/\1/p') \ state=$(echo "$text" | sed -n 's/^Status\s*\(\S\+\).*/\1/p') \ boot_device=$(echo "$text" | sed -n 's/^Startlaufwerk\s*\(\S\+\).*/\1/p') \ attached_iso=$(echo "$text" | sed -n 's/^Momentan eingelegt:\s*\(\S\+\).*/\1/p') \ net1_mac=$(echo "$text" | grep '^1\s' | awk '{print$2}') \ net1_ipv4=$(echo "$text" | grep '^1\s' | awk '{print$3}') \ net1_ipv6=$(echo "$text" | grep '^1\s' | awk '{print$4}') \ ftp_host=$(echo "$text" | sed -n 's/^Hostname:\s*\(\S\+\).*/\1/p') \ ftp_user=$(echo "$text" | sed -n 's/^Benutzername:\s*\(\S\+\).*/\1/p') \ ftp_pass=$(echo "$text" | sed -n 's/^Passwort:\s*\(\S\+\).*/\1/p') \ jq -n '{ vsname: env.vsname, state: { gestartet: "online", gestoppt: "offline" }[env.state], boot_device: env.boot_device, attached_iso: (if env.attached_iso == "n/a" then null else env.attached_iso end), network: [ { mac: env.net1_mac, ipv4: env.net1_ipv4, ipv6: env.net1_ipv6 } ], ftp: { host: env.ftp_host, pass: env.ftp_pass, user: env.ftp_user } }' } # attachCdrom : VServerID, ImageName -> TODO _netcup_vcp_cmd_attachCdrom() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMCdrom \ -q section=vServerKVMCdromFTP \ -q selectedVServerId="$1" \ -d attachCdrom='attach CD' \ -d vcpLoginPassword="$netcup_vcp_password" \ -d imageName="$2" } # detachCdrom : VServerID -> TODO _netcup_vcp_cmd_detachCdrom() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMCdrom \ -q section=vServerKVMCdromFTP \ -q selectedVServerId="$1" \ -d detachCdrom= } # getLogEntries : VServerID -> TODO _netcup_vcp_cmd_getLogEntries() { _netcup_vcp_post VServers \ -q page=page_log \ -q selectedVServerId="$1" \ -d getLogEntries=true \ -d paging_maxResults=10 \ -d paging_pageSelected=1 } # controlAction : VServerID, ControlAction -> TODO # ControlAction ∈ { STOP, REBOOT, RESET, POWEROFF, SUSPEND, SAVE, START } _netcup_vcp_cmd_controlAction() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMControl \ -q selectedVServerId="$1" \ -q action="$2" } # setBootOrder : VServerID, CSV (ListOf BootDevice) -> TODO # BootDevice ∈ { cdrom, hd, network } _netcup_vcp_cmd_setBootOrder() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMGeneral \ -q section=bootOrder \ -q selectedVServerId="$1" \ -d bootOrder="$2" } _netcup_vcp_cmd_ipv4support() { _netcup_vcp_post VServersKVM \ -q page=vServerKVMGeneral \ -q section=ipv4support \ -q selectedVServerId="$1" } # listVServerIds : TODO _netcup_vcp_cmd_listVServerIds() { _netcup_vcp_parse_vserver_ids } _netcup_vcp_parse_site_key() { sed -n 's/.*site_key\s*=\s*"\([0-9A-Za-z]\+\)";.*/\1/p;T;q' "$_netcup_vcp_content_cache" } _netcup_vcp_parse_vserver_ids() { sed -n 's/.*\&2 return 1 else . "$_netcup_vcp_secrets_file" fi } _netcup_vcp_post() {( endpoint= query=site_key=$(_netcup_vcp_parse_site_key) data= flags= while test $# -gt 0; do case $1 in -L) flags=${flags:+$flags }$1 shift ;; -q) query=${query:+$query&}$2 shift 2 ;; -d) data=${data:+$data&}$2 shift 2 ;; -*) printf 'unknown option %q\n' "$1" >&2 exit 1 ;; *) if test -n "$endpoint"; then printf 'unexpected argument %q\n' "$1" >&2 exit 2 fi endpoint=/$1 shift 1 ;; esac done url=https://www.vservercontrolpanel.de/$endpoint?$query echo "$data" | exec curl \ -d @- \ -b "$_netcup_vcp_cookie_jar" \ -c "$_netcup_vcp_cookie_jar" \ -o "$_netcup_vcp_content_cache" \ -sS \ $flags \ "$url" )} _netcup_vcp_main() {( set -efu _netcup_vcp_loadSecrets _netcup_vcp_cmd_"$@" )} case ${netcup_vpc_run-true} in true) _netcup_vcp_main "$@" ;; esac