edit:add-var vpn~ {|@argv| use flag use re use str use framagit.org/benjamin.vaudour/elv-lib/mods/map var shortcuts = [ &ca= ca.kaosx.ovh &fr= fr.kaosx.ovh &lu= luence-wg &cli= luence-client &fdn= fdn-openvpn ] var next = [ &ca.kaosx.ovh= fr.kaosx.ovh &fr.kaosx.ovh= luence-wg &luence-wg= luence-client &luence-client= fdn-openvpn ] fn -start {|name| e:nmcli connection up $name > /dev/null } fn -stop {|name| e:nmcli connection down $name > /dev/null } fn -list {|&active=$false| var @args = connection show if $active { set @args = $@args --active } e:nmcli $@args | re:awk {|_ @name uuid tpe dev| var name = (str:join ' ' $name) if (has-value $shortcuts $name) { put [ &name= $name &type= $tpe &active= (not-eq $dev --) ] } } } fn -name {|name| map:value-of &default=$name $shortcuts $name } fn -exists {|name| has-value [ (-list | each {|c| put $c[name] }) ] (-name $name) } fn -is-active {|name| has-value [ (-list &active=$true | each {|c| put $c[name] }) ] (-name $name) } fn -next {|| var @active = (-list &active=$true) var n = ca.kaosx.ovh if (> (count $active) 0) { set n = (map:value-of &default=$n $next $active[0][name]) } put $n } fn help {|@rest| echo 'Usage: vpn [] [...]' echo 'Actions disponibles:' echo ' - list [(-a|--active)]' echo ' - start ' echo ' - stop []' } fn list {|@rest| var flags _ = (flag:parse-getopt $rest [ [&short=a &long=active &arg-optional=$true] ]) var active = (> (count $flags) 0) var @connections = (-list &active=$active) if (== (count $connections) 0) { echo (styled 'Aucun VPN' yellow) } else { each {|c| if $c[active] { printf "%s (%s)\n" (styled $c[name] green bold) $c[type] } else { printf "%s (%s)\n" $c[name] $c[type] } } $connections } } fn stop {|@rest| if (== (count $rest) 0) { var @actives = (-list &active=$true | each {|c| put $c[name] }) if (== (count $actives) 0) { echo (styled 'Aucun VPN actif' yellow) } else { stop $@actives } } else { each {|n| var n = (-name $n) if (not (-is-active $n)) { echo (styled (printf '%s non actif' $n) yellow) } else { if ?(-stop $n) { printf "%s %s\n" (styled $n bold) (styled désactivé bold red) } else { echo (styled (printf 'Arrêt de %s échoué' $n) red) } } } $rest } } fn start {|name| var name = (-name $name) if (-is-active $name) { echo (styled (printf '%s est déjà actif' $name) yellow) } elif (not (-exists $name)) { echo (styled (printf '%s inconnu' $name) yellow) } else { var @actives = (-list &active=$true | each {|c| put $c[name] }) if (> (count $actives) 0) { stop $@actives } if ?(-start $name) { printf "%s %s\n" (styled $name bold) (styled activé bold green) } else { echo (styled (printf 'Démarrage de %s échoué' $name) red) } } } fn next {|@name| if (== (count $name) 0) { start (-next) } else { start $name[0] } } var actions = [ &help= $help~ &list= $list~ &start= $start~ &stop= $stop~ ] var action = $next~ if (and (> (count $argv) 0) (has-key $actions $argv[0])) { set action argv = $actions[$argv[0]] $argv[1..] } $action $@argv }