elvish_config/aliases/ipof.elv

103 lines
2.7 KiB
Plaintext
Raw Normal View History

2021-12-11 21:09:02 +00:00
edit:add-var ipof~ {|@argv|
use re
2021-08-24 18:45:25 +00:00
use str
use framagit.org/benjamin.vaudour/elv-lib/mods/common
use framagit.org/benjamin.vaudour/elv-lib/mods/ip
use framagit.org/benjamin.vaudour/elv-lib/mods/list
use framagit.org/benjamin.vaudour/elv-lib/mods/num
2021-08-24 18:45:25 +00:00
2021-12-11 21:09:02 +00:00
fn sort-ip {|e1 e2|
var check = {|e| common:cexec (ip:is-ipv4 $e) 0 { common:cond (ip:is-ipv6 $e) 1 2 }}
var i1 = ($check $e1)
var i2 = ($check $e2)
if (or (!= $i1 $i2) (== $i1 2)) {
compare $i1 $i2
2021-08-24 18:45:25 +00:00
} elif (== $i1 1) {
ip:comp6 $e1 $e2
2021-08-24 18:45:25 +00:00
} else {
ip:comp4 $e1 $e2
2021-08-24 18:45:25 +00:00
}
}
2021-12-11 21:09:02 +00:00
fn dnssolve {|d|
var result = [
2021-08-24 18:45:25 +00:00
&ips=[&]
&resolvers=''
&txt=''
]
2021-12-11 21:09:02 +00:00
e:dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -resolve (idn -a $d) | peach {|l|
2021-09-01 13:55:25 +00:00
var ll = $l
var idx = (num:++ (str:index $ll :))
var value = (str:trim-space $ll[$idx..])
2021-09-01 13:55:25 +00:00
if (or (str:has-prefix $ll 'IPv4 addresses') (str:has-prefix $ll 'IPv6 addresses')) {
2021-12-11 21:09:02 +00:00
str:split ', ' $value | peach {|e|
2021-08-28 08:58:07 +00:00
var ee = $e
if (ip:is-ip $ee) {
2021-10-13 18:43:40 +00:00
set result[ips][$ee] = $nil
2021-08-24 18:45:25 +00:00
}
}
2021-09-01 13:55:25 +00:00
} elif (str:has-prefix $ll 'TXT records') {
2021-10-13 18:43:40 +00:00
set result[txt] = $value
2021-09-01 13:55:25 +00:00
} elif (str:has-prefix $ll 'Resolver') {
2021-10-13 18:43:40 +00:00
set result[resolvers] = $value
2021-09-01 13:55:25 +00:00
} elif (str:has-prefix $ll 'Name servers') {
2021-10-13 18:43:40 +00:00
set result[remote] = (not-eq $value 'name does not exist')
2021-08-24 18:45:25 +00:00
}
}
put $result
}
var hosts = [&]
2021-12-11 21:09:02 +00:00
cat /etc/hosts | peach {|l|
2021-08-28 08:58:07 +00:00
var ll = (str:trim-space $l)
if (and (not-eq $ll '') (not-eq $ll[0] '#')) {
put $ll
2021-08-24 18:45:25 +00:00
}
} | re:awk {|_ ip @domains|
2021-12-11 21:09:02 +00:00
peach {|d|
2021-08-28 08:58:07 +00:00
var dd = $d
if (has-key $hosts $dd) {
2021-10-13 18:43:40 +00:00
set hosts[$dd][$ip] = $nil
2021-08-24 18:45:25 +00:00
} else {
2021-10-13 18:43:40 +00:00
set hosts[$dd] = [&$ip=$nil]
2021-08-24 18:45:25 +00:00
}
} $domains
}
var remote = [&]
2021-12-11 21:09:02 +00:00
peach {|d|
2021-08-28 08:58:07 +00:00
var dd = $d
var solve = (dnssolve $dd)
if (> (count $solve[ips]) 0) {
2021-10-13 18:43:40 +00:00
set remote[$dd] = $solve
2021-08-24 18:45:25 +00:00
}
} $argv
2021-12-11 21:09:02 +00:00
each {|d|
var exists = $false
echo (styled (printf "Resolving '%s'…\n" $d) bright-green)
2021-08-24 18:45:25 +00:00
if (has-key $hosts $d) {
2021-10-13 18:43:40 +00:00
set exists = $true
2021-08-24 18:45:25 +00:00
echo (styled ' local:' bright-yellow)
keys $hosts[$d] | list:sort $sort-ip~ | each {|ip|
printf " - %s\n" $ip
2021-08-24 18:45:25 +00:00
}
}
if (and (has-key $remote $d) $remote[$d][remote]) {
2021-10-13 18:43:40 +00:00
set exists = $true
var info = $remote[$d]
2021-08-24 18:45:25 +00:00
echo (styled ' remote:' bright-yellow)
echo ' IPs:'
keys $info[ips] | list:sort $sort-ip~ | each {|ip|
printf " - %s\n" $ip
2021-08-24 18:45:25 +00:00
}
printf " Resolvers: %s\n" $info[resolvers]
printf " TXT records: %s\n" $info[txt]
2021-08-24 18:45:25 +00:00
}
if (not $exists) {
echo (styled 'No info found' bright-red)
}
echo
} $argv
}