-
Notifications
You must be signed in to change notification settings - Fork 95
/
shared-state-get_candidates_neigh
executable file
·85 lines (65 loc) · 2.59 KB
/
shared-state-get_candidates_neigh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/sh
<< COPYRIGHT
LibreMesh
Copyright (C) 2019-2023 Gioacchino Mazzurco <gio@altermundi.net>
Copyright (C) 2023 Asociación Civil Altermundi <info@altermundi.net>
SPDX-License-Identifier: AGPL-3.0-only
COPYRIGHT
get_uptime()
{
awk '{print $1}' /proc/uptime | awk -F. '{print $1}'
}
cacheFile="/tmp/shared-state-get_candidates_neigh.cache"
lastRunFile="/tmp/shared-state-get_candidates_neigh.lastrun"
lastRun=$(if [ -s $lastRunFile ]; then echo $(cat $lastRunFile); else echo -9999; fi)
currUptime="$(get_uptime)"
[ "$(($currUptime - $lastRun))" -lt "30" ] &&
{
cat "$cacheFile"
exit 0
}
batmanNonMeshCandidateAddresses="$(
for iface in $(ls /sys/class/net/) ; do
ls /sys/class/net/${iface}/upper_bat? &> /dev/null || continue
echo "${iface}" | grep -E "mesh|adhoc" &> /dev/null && continue
#[Doc] ping6 from busybox doesn't support float intervals iputils-ping does
ping -i 0.1 -c 2 ff02::1%${iface} 2> /dev/null | \
awk '{if ($3 == "from") print substr($4, 1, length($4)-1)'"\"%${iface}\""'}'
done | sort -u -r)"
babelCandidateAddresses="$([ -e /var/etc/babeld.conf ] &&
for iface in $(grep interface /var/etc/babeld.conf | awk '{print $2}'); do
ping -i 0.1 -c 2 ff02::1%${iface} 2> /dev/null | \
awk '{if ($3 == "from") print substr($4, 1, length($4)-1)'"\"%${iface}\""'}'
done | sort -u -r)"
wifi_get_macs="
wireless = require('lime.wireless')
iwinfo = require('iwinfo')
utils = require('lime.utils')
for _, ifc in ipairs(wireless.mesh_ifaces()) do
for mac, sta in pairs(iwinfo.nl80211.assoclist(ifc)) do
if sta.inactive < 5000 then
print(utils.mac2ipv6linklocal(mac) .. '%' .. ifc)
end
end
end
"
wirelessCandidateAddresses=$(echo "$wifi_get_macs" | lua - | sort -u -r)
candidateAddresses="$batmanNonMeshCandidateAddresses
$babelCandidateAddresses
$wirelessCandidateAddresses
$(ping -i 0.1 -c 2 ff02::1%br-lan | \
awk '{if ($3 == "from" && substr($7,6)+0 < 2) print substr($4, 1, length($4)-1)"%br-lan" }' | sort -u)"
for ownAddr in $(ip -6 address show | awk '{if ($1 == "inet6") print $2}' | awk -F/ '{print $1}') ; do
candidateAddresses="$(echo "$candidateAddresses" | grep -v "^$ownAddr%.*$")"
done
#[Doc] Deduplicate addresses visible from muliple interfaces
for cAddr in $(echo "$candidateAddresses"); do
cIp="$(echo "$cAddr" | awk -F% '{print $1}')"
cIface="$(echo "$cAddr" | awk -F% '{print $2}')"
#[Doc] Use ${cIp}%${cIface} instead of $cAddr to avoid duplicate interface with
#[Doc] newer iputils-ping
candidateAddresses="${cIp}%${cIface}
$(echo "$candidateAddresses" | grep -v "$cIp")"
done
echo "$candidateAddresses" | grep -v "^$" | tee "$cacheFile"
get_uptime > "$lastRunFile"