def adapt_dnsmasq(self, origin_resolv_conf: Path, vpn_service: str) -> Optional[Path]: content = FileHelper.read_file_by_line(self.config.main_cfg) resolv = TextHelper.awk(next( iter(TextHelper.grep(content, r'dnsmasq_resolv=.+')), None), sep='=', pos=1) return Path(resolv or self.config.runtime_resolv)
def query_sessions(self) -> dict: sessions = self.exec_command('SessionList') row = zip(TextHelper.grep(sessions, r'Session Name.+'), TextHelper.grep(sessions, r'User Name.+')) return { v.get('session_name'): self._lookup_session(v) for v in self._parse_row(row, { 0: 'session_name', 1: 'user_name' }) }
def _query_mac_table(self): mac_table = self.exec_command('MacTable') row = zip(TextHelper.grep(mac_table, r'Session Name.+'), TextHelper.grep(mac_table, r'MAC Address.+\|.+')) return { v['mac']: v for v in self._parse_row(row, { 0: 'session_name', 1: 'mac' }) }
def _query_dhcp_table(self): dhcp_table = self.exec_command('DhcpTable') row = zip(TextHelper.grep(dhcp_table, r'MAC Address.+'), TextHelper.grep(dhcp_table, r'Allocated IP.+'), TextHelper.grep(dhcp_table, r'Client Host Name.+')) return { v['mac']: v for v in self._parse_row(row, { 0: 'mac', 1: 'vpn_ip', 2: 'hostname' }) }
def _lookup_session(self, user_session: dict) -> Optional[UserSession]: if user_session.get('user_name', None) == UserSession.NAT_SESSION_USER: return None session = self.exec_command( f'SessionGet {user_session.get("session_name")}') row = zip( TextHelper.grep(session, r'Client IP Address[^(\n]+\|.+'), TextHelper.grep(session, r'Client Host Name[^(\n]+\|.+'), TextHelper.grep(session, r'Client IP Address.+\(Reported\).+\|.+'), TextHelper.grep(session, r'Client Host Name.+\(Reported\).+\|.+')) extra = next( self._parse_row( row, { 0: 'public_ip', 1: 'public_hostname', 2: 'local_ip', 3: 'local_hostname' }), None) if not extra: return None return UserSession(**{**user_session, **extra})
def get_vpn_status(self, vpn_acc: str) -> dict: if not vpn_acc: return {'connected': False} try: ss = self.exec_command('AccountStatusGet', params=vpn_acc, silent=True, log_lvl=logger.DEBUG) ss_msg = TextHelper.awk(next( iter(TextHelper.grep(ss, r'Session Status.+')), None), sep='|', pos=1).strip() return { 'connected': ss_msg == 'Connection Completed (Session Established)', 'msg': ss_msg } except Exception as err: logger.debug( f'Something wrong when getting VPN status. Error[{err}]') return {'connected': False}
def _parse_row(row: Iterator[Tuple], columns: dict) -> Iterator[dict]: return map( lambda each: { columns[idx]: TextHelper.awk(r, sep='|', pos=1) for idx, r in enumerate(each) }, row)
def _parse_entry_value(self, idx: int, row: str): value = TextHelper.awk(row, sep='|', pos=1) return self.decode_host_name(value) if idx == 2 else value
def _optimize_command_result(self, output): r = TextHelper.grep(output, r'VPN Client>.+((?:\n.+)+)') return ''.join(r).replace('The command completed successfully.', '').strip()
def read_env(): content = FileHelper.read_file_by_line(VpnDirectory.PROFILE_D_ENV) env = TextHelper.awk(next(iter(TextHelper.grep(content, rf'{AppEnv.VPN_HOME_ENV}=.+', flags=re.VERBOSE)), None), sep='=', pos=1) return None if not env else env.replace('"', "")
def __do_encrypt(value, algorithm="sha256", enabled_base64=False): hash_algorithm = hashes.MD5() if algorithm == "md5" else hashes.SHA1() if algorithm == "sha1" else hashes.SHA256() digest = hashes.Hash(hash_algorithm, crypto_default_backend()) digest.update(value.encode("utf-8")) encrypt = digest.finalize() return TextHelper.encode_base64(encrypt) if enabled_base64 else encrypt.hex()