def handle_client_handshake(self, protocol, addr): identification = protocol.identification if not self.profile.is_id_exist(identification): return name = self.profile.get_name_by_id(identification) traffic_remain = self.profile.get_traffic_remain_by_id(identification) if traffic_remain <= 0: LOGGER.info( "Controller recv client but traffic <= 0, name: %s, traffic_remain: %s" % (name, traffic_remain)) return LOGGER.info("Controller recv client, name: %s, traffic_remain: %s" % (name, traffic_remain)) server = self.id_to_server.get(identification) if server: LOGGER.info( "Controller get registered client with tun_name: %s, tun_ip: %s, dst_ip: %s" % (server.tun.name, server.tun.tun_ip, server.tun.dst_ip)) server.client_addr = addr protocol = Protocol() protocol.cmd = CMD_SERVER_HANDSHAKE protocol.tun_ip_raw = self.ip_str_to_raw(server.tun.tun_ip) protocol.dst_ip_raw = self.ip_str_to_raw(server.tun.dst_ip) self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr) else: tun_ip = self.alloc_ip() dst_ip = self.alloc_ip() tun_name = self.alloc_tun_name() if not tun_ip or not dst_ip or not tun_name: LOGGER.error( "Controller tun_ip or dst_ip or tun_name cannot be alloced" ) self.free_ip(tun_ip) self.free_ip(dst_ip) self.free_tun_name(tun_name) return server = Server(tun_name, tun_ip, dst_ip, addr, traffic_remain, self.client_send_data_callback) server.run() LOGGER.info( "controller get unregistered client with tun_name: %s, tun_ip: %s, dst_ip: %s" % (tun_name, tun_ip, dst_ip)) self.id_to_server[identification] = server protocol = Protocol() protocol.cmd = CMD_SERVER_HANDSHAKE protocol.tun_ip_raw = self.ip_str_to_raw(tun_ip) protocol.dst_ip_raw = self.ip_str_to_raw(dst_ip) self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr)
def client_send_data_callback(self, data, addr): protocol = Protocol() protocol.cmd = CMD_SERVER_DATA protocol.data = data self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr)