Files
df/tree/.local/nu/tailscale.nu
2025-06-29 17:48:09 +02:00

71 lines
1.6 KiB
Plaintext

# Get networking info about tailscale peers
def "tailscale peer" [
hostname?: string
get_field?: cell-path
]: nothing -> any {
let get_field = ($get_field | default ([] | into cell-path))
let status = (^tailscale status --json | from json)
let peers = ($status | get Peer)
if $peers == null {
return null
}
let peers = ($peers | transpose key fields | flatten fields)
let peers = ($peers | each { |peer|
let ipv4 = $peer.TailscaleIPs | where { |ip| "." in $ip } | first
let ipv6 = $peer.TailscaleIPs | where { |ip| ":" in $ip } | first
{
host: $peer.HostName,
ipv4: $ipv4,
ipv6: $ipv6,
online: $peer.Online,
active: $peer.Active,
rx: ($peer.RxBytes | into filesize),
tx: ($peer.TxBytes | into filesize),
}
})
if $hostname == null {
return $peers
}
let peers = ($peers | where host == $hostname)
if ($peers | is-empty) {
return null
}
$peers | first | get $get_field
}
# SSH to a tailscale peer
def "tailscale ssh" [
user_hostname: string
...ssh_flags: string
]: nothing -> any {
let hostname = ($user_hostname | parse -r "([^@]*@)?(?<hostname>.*)" | get 0.hostname)
ssh -o $"HostName (tailscale peer $hostname | get ipv6)" $user_hostname ...$ssh_flags
}
# SCP to a tailscale peer
def "tailscale scp" [
from: string
to: string
...ssh_flags: string
]: nothing -> any {
let options = (
[$from, $to] |
parse -r "([^@]*@)?(?<hostname>.*):(?<path>.*)" |
each { |it| $"HostName (tailscale peer $it.hostname | get ipv6)" } |
each { |option| ["-o", $option] } |
flatten
)
scp ...$options $from $to ...$ssh_flags
}