def _check_pid(pid_file: str, log_lvl=logger.TRACE) -> int: try: logger.log(log_lvl, f'Read PID file {pid_file}') pid = FileHelper.read_file_by_line(pid_file) pid = int(pid) if pid and pid > 0 and SystemHelper.is_pid_exists(pid): return pid except Exception as _: FileHelper.rm(pid_file) return 0
def remove(self, svc_opts: UnixServiceOpts, force: bool = False): service_fqn = self.to_service_fqn(svc_opts.service_dir, svc_opts.service_name) self.stop(svc_opts.service_name) self.disable(svc_opts.service_name) if force and FileHelper.is_exists(service_fqn): logger.info(f'Remove System service [{svc_opts.service_name}]...') FileHelper.rm(service_fqn) SystemHelper.exec_command("systemctl daemon-reload", silent=True, log_lvl=logger.INFO)
def reset_hook(self, vpn_nameserver_hook_conf: Path): logger.info(f'Reset VPN DNS config file...') if FileHelper.is_writable(vpn_nameserver_hook_conf): FileHelper.write_file(vpn_nameserver_hook_conf, mode=0o644, content='') FileHelper.create_symlink(vpn_nameserver_hook_conf, self._dnsmasq_vpn_hook_cfg, force=True) else: FileHelper.rm(self._dnsmasq_vpn_hook_cfg)
def restore_config(self, backup_dir: Path, keep_backup: bool): logger.info( f'Restore VPN configuration [{backup_dir}] to [{self.opts.vpn_dir}]...' ) FileHelper.copy(backup_dir.joinpath(self.opts.VPN_CONFIG_FILE), self.opts.config_file, force=True) FileHelper.copy(backup_dir.joinpath(self.opts.RUNTIME_FOLDER), self.opts.runtime_dir, force=True) FileHelper.rm(backup_dir, force=not keep_backup)
def restore_config(self, vpn_service: str, keep_dnsmasq=True): if not keep_dnsmasq: logger.debug( f'Remove dnsmasq vpn hook config [{self._dnsmasq_vpn_hook_cfg}]' ) FileHelper.rm(self._dnsmasq_vpn_hook_cfg) logger.debug( f'Remove dnsmasq vpn config [{self._dnsmasq_vpn_cfg(vpn_service)}]' ) FileHelper.rm(self._dnsmasq_vpn_cfg(vpn_service)) if self._resolver: self._resolver.restore_config(vpn_service, keep_dnsmasq)
def cleanup_config(self, vpn_service: str, keep_dnsmasq=True): if self.is_connman(): return resolver = self._resolver() if keep_dnsmasq: resolver.reset_hook(self.vpn_hook_cfg) elif FileHelper.is_readable(self.origin_resolv_cfg): logger.info(f'Restore System DNS config file...') FileHelper.backup(self.origin_resolv_cfg, DNSResolver.DNS_SYSTEM_FILE) FileHelper.rm(self.vpn_resolv_cfg) resolver.restore_config(vpn_service, keep_dnsmasq) resolver.restart(_all=not keep_dnsmasq, keep_dnsmasq=keep_dnsmasq)
def do_uninstall(self, keep_vpn: bool = True, keep_dnsmasq: bool = True, service_opts: UnixServiceOpts = None, log_lvl: int = logger.INFO): vpn_service = self._standard_service_opt(service_opts).service_name logger.info(f'Uninstall VPN service [{vpn_service}]...') self.do_delete([a.account for a in self.storage.list()], force_stop=True, log_lvl=log_lvl) if not keep_vpn: logger.log(log_lvl, f'Remove VPN Client [{self.opts.vpn_dir}]...') self.device.ip_resolver.remove_hook(vpn_service) self.opts.remove_env() FileHelper.rm(self.opts.vpn_dir) self.device.dns_resolver.cleanup_config(vpn_service, keep_dnsmasq=keep_dnsmasq)
def remove_hook(self, service_name: str): exit_hook_file = self._to_hook_file(service_name) logger.log(self.log_lvl, f'Remove DHCP client VPN hook[{exit_hook_file}]...') FileHelper.rm(exit_hook_file, force=True)
def _common_remove_dnsmasq(self, vpn_service: str, keep_dnsmasq: bool): if not keep_dnsmasq: cfg = self.config.to_fqn_cfg(self.DNSMASQ_TUNED_CFG) logger.debug( f'Remove [dnsmasq] and [{vpn_service}] plugin[{cfg}]...') FileHelper.rm(cfg)
def cleanup(self): FileHelper.rm(self._pid_files())
def remove_env(): FileHelper.rm(VpnDirectory.PROFILE_D_ENV)