diff --git a/py/client.py b/py/client.py index b59a311..22291d9 100755 --- a/py/client.py +++ b/py/client.py @@ -26,59 +26,66 @@ def conctruct_json(ban_list: Iterable[ipaddress.IPv4Address] | Iterable[ipaddres return json.dumps(json_map) -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("-b","--ban",nargs="+",type=str, - help="ban ip's") - parser.add_argument("-u", "--uban", nargs="+", type=str, - help="unban ip's") - args = parser.parse_args() +def recv_all(conn: socket.socket) -> bytes: + chunks = [] + + while True: + data = conn.recv(4096) + + if not data: + break + chunks.append(data) + return b"".join(chunks) + +def req_list(client: socket.socket): + client.sendall(b"list") + client.shutdown(socket.SHUT_WR) + daemon_responce = recv_all(client).decode() + out_dict = json.loads(daemon_responce) + print(json.dumps(out_dict, indent=2)) + +def req_action(sock_path:socket.socket, args): conflicts_ban_uban = False if args.ban != None and args.uban != None: conflicts_ban_uban = not (set(args.ban).isdisjoint(args.uban)) if conflicts_ban_uban: print("--ban and --uban must not contain common element(s)") exit(1) + if args.ban != None: ip_to_ban = [ipaddress.IPv4Address(ip) for ip in args.ban] else: ip_to_ban = [] + if args.uban != None: ip_to_uban = [ipaddress.IPv4Address(ip) for ip in args.uban] else: ip_to_uban = [] + request = "action\n" + conctruct_json(ip_to_ban, ip_to_uban) socket_path = "/run/ipban/ipban.sock" - client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - client.connect(socket_path) - - req = """action -{ - "ban": { - "1.2.3.4": { - "remark": "Cloudflare's web", - "reason": "bot" - }, - "8.8.8.8": { - "remark": "", - "reason": "" - } - }, - "uban": { - "1.4.4.6": { - "reason": "Misstake" - }, - "1.0.0.1": { - "reason": "DNS" - } - } -} -""" - req = request - client.sendall(req.encode()) + client.sendall(request.encode()) client.shutdown(socket.SHUT_WR) print(client.recv(4096).decode()) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-b","--ban",nargs="+",type=str,metavar="ip", + help="ban ip's") + parser.add_argument("-u", "--uban", nargs="+", type=str,metavar="ip", + help="unban ip's") + parser.add_argument("-l", "--list", action="store_true") + args = parser.parse_args() + + + socket_path = "/run/ipban/ipban.sock" + client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + client.connect(socket_path) + if args.ban != None and args.uban != None: + req_action(client,args) + if args.list: + req_list(client) diff --git a/py/daemon.py b/py/daemon.py index 6098c5b..efbc80f 100755 --- a/py/daemon.py +++ b/py/daemon.py @@ -143,8 +143,20 @@ def action(sql_conn: sqlite3.Connection, conn: socket.socket, data: str): conn.sendall(b"ok") def list_ips(sql_conn: sqlite3.Connection, conn: socket.socket, data: str): + ban_t_name="banned" data = data[data.find('\n')+1:] #strip req_type - + rows = sql_conn.execute(f"SELECT ban_time,ip,remark,reason FROM {ban_t_name}").fetchall() + response_json = {} + print(rows) + for row in rows: + response_json[row[1]] = { + "ban_time": row[0], + "ban_remark": row[2], + "ban_reason": row[3] + } + response = json.dumps(response_json) + conn.sendall(response.encode()) + conn.shutdown(socket.SHUT_WR) def recv_all(conn: socket.socket) -> bytes: chunks = []