diff --git a/node.lua b/node.lua index 494b1d9..6bc9b5c 100644 --- a/node.lua +++ b/node.lua @@ -22,8 +22,10 @@ font = resource.load_font("vera.ttf") local v = { network = "", - ethip = "", - wlanip = "", + ethipv4 = "", + ethipv6 = "", + wlanipv4 = "", + wlanipv6 = "", gw = "" } @@ -80,9 +82,13 @@ function node.render() -- right side: IP addresses y = y_start - font:write(x_right, y, "Eth: " .. v.ethip, fontsize, 1,1,1,1) - + font:write(x_right, y, "Eth: " .. v.ethipv4, fontsize, 1,1,1,1) y = y + offset - font:write(x_right, y, "WiFi: " .. v.wlanip, fontsize, 1,1,1,1) + font:write(x_right, y, v.ethipv6, fontsize, 1,1,1,1) + + y = y + offset + font:write(x_right, y, "WiFi: " .. v.wlanipv4, fontsize, 1,1,1,1) + y = y + offset + font:write(x_right, y, v.wlanipv6, fontsize, 1,1,1,1) end diff --git a/service b/service index 7cb2d04..6634862 100644 --- a/service +++ b/service @@ -60,6 +60,24 @@ def get_ipv4(ifname): return None +def get_ipv6(ifname): + try: + s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + info = fcntl.ioctl(s.fileno(), 0x8915, + struct.pack('256s', ifname[:15])) + ip = socket.inet_ntoa(info[20:24]) + + mask = struct.unpack('>I', fcntl.ioctl( + s.fileno(), 0x891b, struct.pack('256s', ifname))[20:24])[0] + # Remember: not everything has to be performance optimal :-) + mask = bin(mask)[2:].count('1') + return "%s/%d" % (ip, mask) + except IOError: + return "" + except: + return None + + def check_network(): return os.path.exists('/sd/config/network') and "static" or "dhcp" @@ -80,8 +98,10 @@ def check_internet(): tests = [ - (1, "ethip", partial(get_ipv4, "eth0")), - (1, "wlanip", partial(get_ipv4, "wlan0")), + (1, "ethipv4", partial(get_ipv4, "eth0")), + (1, "ethipv6", partial(get_ipv6, "eth0")), + (1, "wlanipv4", partial(get_ipv4, "wlan0")), + (1, "wlanipv6", partial(get_ipv6, "wlan0")), (1, "gw", get_default_gateway), (10, "online", check_internet), (5, "network", check_network),