Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58f9e05d93 | ||
|
|
1ec981aea7 | ||
|
|
2a90286a7c | ||
|
|
12d25d09b2 | ||
|
|
a039fae1a4 |
@@ -132,8 +132,8 @@ def main():
|
|||||||
)
|
)
|
||||||
# fmt: off
|
# fmt: off
|
||||||
ap.add_argument("-c", metavar="PATH", type=str, action="append", help="add config file")
|
ap.add_argument("-c", metavar="PATH", type=str, action="append", help="add config file")
|
||||||
ap.add_argument("-i", metavar="IP", type=str, default="0.0.0.0", help="ip to bind")
|
ap.add_argument("-i", metavar="IP", type=str, default="0.0.0.0", help="ip to bind (comma-sep.)")
|
||||||
ap.add_argument("-p", metavar="PORT", type=int, default=3923, help="port to bind")
|
ap.add_argument("-p", metavar="PORT", type=str, default="3923", help="ports to bind (comma/range)")
|
||||||
ap.add_argument("-nc", metavar="NUM", type=int, default=64, help="max num clients")
|
ap.add_argument("-nc", metavar="NUM", type=int, default=64, help="max num clients")
|
||||||
ap.add_argument("-j", metavar="CORES", type=int, default=1, help="max num cpu cores")
|
ap.add_argument("-j", metavar="CORES", type=int, default=1, help="max num cpu cores")
|
||||||
ap.add_argument("-a", metavar="ACCT", type=str, action="append", help="add account")
|
ap.add_argument("-a", metavar="ACCT", type=str, action="append", help="add account")
|
||||||
@@ -151,6 +151,16 @@ def main():
|
|||||||
al = ap.parse_args()
|
al = ap.parse_args()
|
||||||
# fmt: on
|
# fmt: on
|
||||||
|
|
||||||
|
al.i = al.i.split(",")
|
||||||
|
try:
|
||||||
|
if "-" in al.p:
|
||||||
|
lo, hi = [int(x) for x in al.p.split("-")]
|
||||||
|
al.p = list(range(lo, hi + 1))
|
||||||
|
else:
|
||||||
|
al.p = [int(x) for x in al.p.split(",")]
|
||||||
|
except:
|
||||||
|
raise Exception("invalid value for -p")
|
||||||
|
|
||||||
SvcHub(al).run()
|
SvcHub(al).run()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
VERSION = (0, 7, 2)
|
VERSION = (0, 7, 3)
|
||||||
CODENAME = "keeping track"
|
CODENAME = "keeping track"
|
||||||
BUILD_DT = (2021, 1, 29)
|
BUILD_DT = (2021, 2, 3)
|
||||||
|
|
||||||
S_VERSION = ".".join(map(str, VERSION))
|
S_VERSION = ".".join(map(str, VERSION))
|
||||||
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
|
S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
|
||||||
|
|||||||
@@ -130,11 +130,10 @@ class VFS(object):
|
|||||||
class AuthSrv(object):
|
class AuthSrv(object):
|
||||||
"""verifies users against given paths"""
|
"""verifies users against given paths"""
|
||||||
|
|
||||||
def __init__(self, args, log_func):
|
def __init__(self, args, log_func, warn_anonwrite=True):
|
||||||
self.log_func = log_func
|
|
||||||
self.args = args
|
self.args = args
|
||||||
|
self.log_func = log_func
|
||||||
self.warn_anonwrite = True
|
self.warn_anonwrite = warn_anonwrite
|
||||||
|
|
||||||
if WINDOWS:
|
if WINDOWS:
|
||||||
self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):(.*)$")
|
self.re_vol = re.compile(r"^([a-zA-Z]:[\\/][^:]*|[^:]*):([^:]*):(.*)$")
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class MpWorker(object):
|
|||||||
if PY2:
|
if PY2:
|
||||||
sck = pickle.loads(sck) # nosec
|
sck = pickle.loads(sck) # nosec
|
||||||
|
|
||||||
self.log("%s %s" % addr, "-" * 4 + "C-qpop")
|
self.log("%s %s" % addr, "\033[1;30m|%sC-qpop\033[0m" % ("-" * 4,))
|
||||||
self.httpsrv.accept(sck, addr)
|
self.httpsrv.accept(sck, addr)
|
||||||
|
|
||||||
with self.mutex:
|
with self.mutex:
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class BrokerThr(object):
|
|||||||
def put(self, want_retval, dest, *args):
|
def put(self, want_retval, dest, *args):
|
||||||
if dest == "httpconn":
|
if dest == "httpconn":
|
||||||
sck, addr = args
|
sck, addr = args
|
||||||
self.log("%s %s" % addr, "-" * 4 + "C-qpop")
|
self.log("%s %s" % addr, "\033[1;30m|%sC-qpop\033[0m" % ("-" * 4,))
|
||||||
self.httpsrv.accept(sck, addr)
|
self.httpsrv.accept(sck, addr)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -797,6 +797,8 @@ class HttpCli(object):
|
|||||||
editions[ext or "plain"] = [fs_path, st.st_size]
|
editions[ext or "plain"] = [fs_path, st.st_size]
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
if not self.vpath.startswith(".cpr/"):
|
||||||
|
break
|
||||||
|
|
||||||
if not editions:
|
if not editions:
|
||||||
raise Pebkac(404)
|
raise Pebkac(404)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class HttpSrv(object):
|
|||||||
|
|
||||||
def accept(self, sck, addr):
|
def accept(self, sck, addr):
|
||||||
"""takes an incoming tcp connection and creates a thread to handle it"""
|
"""takes an incoming tcp connection and creates a thread to handle it"""
|
||||||
self.log("%s %s" % addr, "-" * 5 + "C-cthr")
|
self.log("%s %s" % addr, "\033[1;30m|%sC-cthr\033[0m" % ("-" * 5,))
|
||||||
thr = threading.Thread(target=self.thr_client, args=(sck, addr))
|
thr = threading.Thread(target=self.thr_client, args=(sck, addr))
|
||||||
thr.daemon = True
|
thr.daemon = True
|
||||||
thr.start()
|
thr.start()
|
||||||
@@ -66,11 +66,11 @@ class HttpSrv(object):
|
|||||||
thr.start()
|
thr.start()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.log("%s %s" % addr, "-" * 6 + "C-crun")
|
self.log("%s %s" % addr, "\033[1;30m|%sC-crun\033[0m" % ("-" * 6,))
|
||||||
cli.run()
|
cli.run()
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self.log("%s %s" % addr, "-" * 7 + "C-done")
|
self.log("%s %s" % addr, "\033[1;30m|%sC-cdone\033[0m" % ("-" * 7,))
|
||||||
try:
|
try:
|
||||||
sck.shutdown(socket.SHUT_RDWR)
|
sck.shutdown(socket.SHUT_RDWR)
|
||||||
sck.close()
|
sck.close()
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class SvcHub(object):
|
|||||||
self.up2k = Up2k(self)
|
self.up2k = Up2k(self)
|
||||||
|
|
||||||
if self.args.e2d and self.args.e2s:
|
if self.args.e2d and self.args.e2s:
|
||||||
auth = AuthSrv(self.args, self.log)
|
auth = AuthSrv(self.args, self.log, False)
|
||||||
self.up2k.build_indexes(auth.all_writable)
|
self.up2k.build_indexes(auth.all_writable)
|
||||||
|
|
||||||
# decide which worker impl to use
|
# decide which worker impl to use
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from __future__ import print_function, unicode_literals
|
|||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
|
import select
|
||||||
|
|
||||||
from .util import chkcmd, Counter
|
from .util import chkcmd, Counter
|
||||||
|
|
||||||
@@ -23,56 +24,75 @@ class TcpSrv(object):
|
|||||||
|
|
||||||
ip = "127.0.0.1"
|
ip = "127.0.0.1"
|
||||||
eps = {ip: "local only"}
|
eps = {ip: "local only"}
|
||||||
if self.args.i != ip:
|
nonlocals = [x for x in self.args.i if x != ip]
|
||||||
eps = self.detect_interfaces(self.args.i) or {self.args.i: "external"}
|
if nonlocals:
|
||||||
|
eps = self.detect_interfaces(self.args.i)
|
||||||
|
if not eps:
|
||||||
|
for x in nonlocals:
|
||||||
|
eps[x] = "external"
|
||||||
|
|
||||||
for ip, desc in sorted(eps.items(), key=lambda x: x[1]):
|
for ip, desc in sorted(eps.items(), key=lambda x: x[1]):
|
||||||
self.log(
|
for port in sorted(self.args.p):
|
||||||
"tcpsrv",
|
self.log(
|
||||||
"available @ http://{}:{}/ (\033[33m{}\033[0m)".format(
|
"tcpsrv",
|
||||||
ip, self.args.p, desc
|
"available @ http://{}:{}/ (\033[33m{}\033[0m)".format(
|
||||||
),
|
ip, port, desc
|
||||||
)
|
),
|
||||||
|
)
|
||||||
|
|
||||||
self.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.srv = []
|
||||||
self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
for ip in self.args.i:
|
||||||
self.srv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
for port in self.args.p:
|
||||||
|
self.srv.append(self._listen(ip, port))
|
||||||
|
|
||||||
|
def _listen(self, ip, port):
|
||||||
|
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
srv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||||
try:
|
try:
|
||||||
self.srv.bind((self.args.i, self.args.p))
|
srv.bind((ip, port))
|
||||||
|
return srv
|
||||||
except (OSError, socket.error) as ex:
|
except (OSError, socket.error) as ex:
|
||||||
if ex.errno == 98:
|
if ex.errno == 98:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"\033[1;31mport {} is busy on interface {}\033[0m".format(
|
"\033[1;31mport {} is busy on interface {}\033[0m".format(port, ip)
|
||||||
self.args.p, self.args.i
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if ex.errno == 99:
|
if ex.errno == 99:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"\033[1;31minterface {} does not exist\033[0m".format(self.args.i)
|
"\033[1;31minterface {} does not exist\033[0m".format(ip)
|
||||||
)
|
)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.srv.listen(self.args.nc)
|
for srv in self.srv:
|
||||||
|
srv.listen(self.args.nc)
|
||||||
self.log("tcpsrv", "listening @ {0}:{1}".format(self.args.i, self.args.p))
|
ip, port = srv.getsockname()
|
||||||
|
self.log("tcpsrv", "listening @ {0}:{1}".format(ip, port))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
self.log("tcpsrv", "-" * 1 + "C-ncli")
|
self.log("tcpsrv", "\033[1;30m|%sC-ncli\033[0m" % ("-" * 1,))
|
||||||
if self.num_clients.v >= self.args.nc:
|
if self.num_clients.v >= self.args.nc:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
self.log("tcpsrv", "-" * 2 + "C-acc1")
|
self.log("tcpsrv", "\033[1;30m|%sC-acc1\033[0m" % ("-" * 2,))
|
||||||
sck, addr = self.srv.accept()
|
ready, _, _ = select.select(self.srv, [], [])
|
||||||
self.log("%s %s" % addr, "-" * 3 + "C-acc2")
|
for srv in ready:
|
||||||
self.num_clients.add()
|
sck, addr = srv.accept()
|
||||||
self.hub.broker.put(False, "httpconn", sck, addr)
|
sip, sport = srv.getsockname()
|
||||||
|
self.log(
|
||||||
|
"%s %s" % addr,
|
||||||
|
"\033[1;30m|{}C-acc2 \033[0;36m{} \033[3{}m{}".format(
|
||||||
|
"-" * 3, sip, sport % 8, sport
|
||||||
|
),
|
||||||
|
)
|
||||||
|
self.num_clients.add()
|
||||||
|
self.hub.broker.put(False, "httpconn", sck, addr)
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
self.log("tcpsrv", "ok bye")
|
self.log("tcpsrv", "ok bye")
|
||||||
|
|
||||||
def detect_interfaces(self, listen_ip):
|
def detect_interfaces(self, listen_ips):
|
||||||
eps = {}
|
eps = {}
|
||||||
|
|
||||||
# get all ips and their interfaces
|
# get all ips and their interfaces
|
||||||
@@ -86,8 +106,9 @@ class TcpSrv(object):
|
|||||||
for ln in ip_addr.split("\n"):
|
for ln in ip_addr.split("\n"):
|
||||||
try:
|
try:
|
||||||
ip, dev = r.match(ln.rstrip()).groups()
|
ip, dev = r.match(ln.rstrip()).groups()
|
||||||
if listen_ip in ["0.0.0.0", ip]:
|
for lip in listen_ips:
|
||||||
eps[ip] = dev
|
if lip in ["0.0.0.0", ip]:
|
||||||
|
eps[ip] = dev
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -114,11 +135,12 @@ class TcpSrv(object):
|
|||||||
|
|
||||||
s.close()
|
s.close()
|
||||||
|
|
||||||
if default_route and listen_ip in ["0.0.0.0", default_route]:
|
for lip in listen_ips:
|
||||||
desc = "\033[32mexternal"
|
if default_route and lip in ["0.0.0.0", default_route]:
|
||||||
try:
|
desc = "\033[32mexternal"
|
||||||
eps[default_route] += ", " + desc
|
try:
|
||||||
except:
|
eps[default_route] += ", " + desc
|
||||||
eps[default_route] = desc
|
except:
|
||||||
|
eps[default_route] = desc
|
||||||
|
|
||||||
return eps
|
return eps
|
||||||
|
|||||||
Reference in New Issue
Block a user