list all external IPs

This commit is contained in:
ed 2019-06-12 23:55:13 +00:00
parent 48a68942a3
commit a95b627a7e
2 changed files with 71 additions and 13 deletions

View file

@ -2,6 +2,7 @@
# coding: utf-8 # coding: utf-8
from __future__ import print_function, unicode_literals from __future__ import print_function, unicode_literals
import re
import sys import sys
import time import time
import socket import socket
@ -10,6 +11,7 @@ from datetime import datetime, timedelta
import calendar import calendar
from .__init__ import PY2, WINDOWS from .__init__ import PY2, WINDOWS
from .util import chkcmd
class TcpSrv(object): class TcpSrv(object):
@ -26,18 +28,18 @@ class TcpSrv(object):
self.next_day = 0 self.next_day = 0
ip = "127.0.0.1" ip = "127.0.0.1"
if self.args.i != ip: if self.args.i == ip:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) eps = {ip: "local only"}
try: else:
s.connect(("10.255.255.255", 1)) eps = self.detect_interfaces(self.args.i)
ip = s.getsockname()[0]
except (OSError, socket.error) as ex:
if ex.errno != 101:
raise
s.close() for ip, desc in sorted(eps.items(), key=lambda x: x[1]):
self.log(
self.log("root", "available @ http://{0}:{1}/".format(ip, self.args.p)) "root",
"available @ http://{}:{}/ (\033[33m{}\033[0m)".format(
ip, self.args.p, desc
),
)
self.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@ -127,3 +129,42 @@ class TcpSrv(object):
with self.log_mutex: with self.log_mutex:
ts = datetime.utcfromtimestamp(now).strftime("%H:%M:%S") ts = datetime.utcfromtimestamp(now).strftime("%H:%M:%S")
print("\033[36m{} \033[33m{:21} \033[0m{}".format(ts, src, msg)) print("\033[36m{} \033[33m{:21} \033[0m{}".format(ts, src, msg))
def detect_interfaces(self, ext_ip):
eps = {}
# get all ips and their interfaces
try:
ip_addr, _ = chkcmd("ip", "addr")
except:
ip_addr = None
if ip_addr:
r = re.compile("^\s+inet ([^ ]+)/.* (.*)")
for ln in ip_addr.split("\n"):
try:
ip, dev = r.match(ln.rstrip()).groups()
if ext_ip in ["0.0.0.0", ip]:
eps[ip] = dev
except:
pass
# get ip with default route
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(("10.255.255.255", 1))
ip = s.getsockname()[0]
except (OSError, socket.error) as ex:
if ex.errno != 101:
raise
s.close()
if ext_ip in ["0.0.0.0", ip]:
desc = "\033[32mexternal"
try:
eps[ip] += ", " + desc
except:
eps[ip] = desc
return eps

View file

@ -5,6 +5,7 @@ from __future__ import print_function, unicode_literals
import re import re
import sys import sys
import hashlib import hashlib
import subprocess as sp # nosec
from .__init__ import PY2 from .__init__ import PY2
@ -304,7 +305,7 @@ def quotep(txt):
btxt = fsenc(txt) btxt = fsenc(txt)
quot1 = quote(btxt, safe=b"/") quot1 = quote(btxt, safe=b"/")
if not PY2: if not PY2:
quot1 = quot1.encode('ascii') quot1 = quot1.encode("ascii")
quot2 = quot1.replace(b" ", b"+") quot2 = quot1.replace(b" ", b"+")
return fsdec(quot2) return fsdec(quot2)
@ -378,5 +379,21 @@ def unescape_cookie(orig):
return ret return ret
def runcmd(*argv):
p = sp.Popen(argv, stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = p.communicate()
stdout = stdout.decode("utf-8")
stderr = stderr.decode("utf-8")
return [p.returncode, stdout, stderr]
def chkcmd(*argv):
ok, sout, serr = runcmd(*argv)
if ok != 0:
raise Exception(serr)
return sout, serr
class Pebkac(Exception): class Pebkac(Exception):
pass pass