Skip to main content

用于 OpenVPN 管理界面的 Python API。

项目描述

OpenVPN 管理接口 Python API

构建状态 派皮

概括

用于与 OpenVPN 管理界面交互的 Python API。目前正在进行一项工作,因此缺乏对客户端管理界面和事件的支持。

对于从 OpenVPN 服务器管理界面中提取指标和状态非常有用。

这个项目的灵感来自于 Marcus Furlong 创建openvpn-monitor的工作。它还使用Jiangge Zhang 的openvpn-status来解析OpenVPNstatus命令的输出,因为当一个优秀的解决方案已经存在时,重新发明轮子是没有意义的。

可以在 GitHub 上找到发行说明。

要求

该项目需要 Python >= 3.6。

其他套餐:

安装

通过 PyPI

pip install openvpn-api

通过源

git clone https://github.com/Jamie-/openvpn-api.git
cd openvpn-api
python setup.py install

用法

介绍

VPN为您的管理接口连接创建一个对象。

import openvpn_api.VPN
v = openvpn_api.VPN('localhost', 7505)

然后您可以自己管理连接和断开连接

v.connect()
# Do some stuff, e.g.
print(v.release)
v.disconnect()

如果连接成功,v.connect()将返回True。但是,如果连接失败v.connect()将引发openvpn_api.errors.ConnectError异常,并说明连接失败的原因。

或者使用连接上下文管理器

with v.connection():
    # Do some stuff, e.g.
    print(v.release)

初始化一个 VPN 对象后,我们可以查询它的细节。

我们可以获得与管理界面通信的地址

>>> v.mgmt_address
'localhost:7505'

并查看这是通过 TCP/IP 还是 Unix 套接字

>>> v.type
'ip'

或者

>>> v.type
'socket'

这些由VPNType类表示为VPNType.IPVPNType.UNIX_SOCKET

>>> v.type
'ip'
>>> v.type == openvpn_api.VPNType.IP
True

守护进程交互

获取有关您连接的 OpenVPN 服务信息的所有属性都是有状态的。第一次调用其中一个方法时,它会缓存所需的信息,因此以后的调用速度非常快。缓存的信息不太可能经常更改,这与我们还可以获取的可能非常频繁更改的状态和指标不同。

我们可以获取我们正在使用的 OpenVPN 版本的发布字符串

>>> v.release
'OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep  5 2018'

或者只是版本号

>>> v.version
'2.4.4'

我们可以通过查看作为 State 对象返回的状态来获取有关服务的更多信息

>>> s = v.state
>>> s
<models.state.State object at 0x7f5eb549a630>

所有这 3 个属性缓存的状态也可以被清除,并将在下次调用时重新填充

v.clear_cache()

守护进程状态

State 对象包含以下内容:

守护进程的当前模式,clientserver

>>> s.mode
'server'

守护程序启动的日期和时间

>>> s.up_since
datetime.datetime(2019, 6, 5, 23, 3, 21)

守护进程的当前状态

>>> s.state_name
'CONNECTED'

可以是以下任何一种:

  • CONNECTING- OpenVPN 的初始状态。
  • WAIT- (仅限客户端)等待服务器的初始响应。
  • AUTH- (仅限客户端)与服务器进行身份验证。
  • GET_CONFIG- (仅限客户端)从服务器下载配置选项。
  • ASSIGN_IP- 为虚拟网络接口分配 IP 地址。
  • ADD_ROUTES- 向系统添加路线。
  • CONNECTED- 初始化序列完成。
  • RECONNECTING- 发生了重新启动。
  • EXITING- 优雅退出正在进行中。
  • RESOLVE-(仅限客户端)DNS 查找
  • TCP_CONNECT- (仅限客户端)连接到 TCP 服务器

描述性字符串 - 从 OpenVPN 文档中不清楚这是什么,通常SUCCESS或断开连接的原因,如果状态是RECONNECTINGEXITING

>>> s.desc_string
'SUCCESS'

守护程序的本地虚拟(VPN 内部)地址,以 a 形式返回,netaddr.IPAddress以便于排序,它可以很容易地转换为字符串str()

>>> s.local_virtual_v4_addr
IPAddress('10.0.0.1')
>>> str(s.local_virtual_v4_addr)
'10.0.0.1'

如果守护进程处于客户端模式,则remote_addrremote_port将填充远程服务器的地址和端口

>>> s.remote_addr
'1.2.3.4'
>>> s.remote_port
1194

如果守护进程处于服务器模式,则local_addrlocal_port将填充暴露服务器的地址和端口

>>> s.local_addr
'5.6.7.8'
>>> s.local_port
1194

如果守护程序使用 IPv6 代替 IPv4 或除 IPv4 之外,那么还有一个字段用于本地虚拟(VPN 内部)v6 地址

>>> s.local_virtual_v6_addr
'2001:db8:85a3::8a2e:370:7334'

守护进程状态

守护进程状态由openvpn_status现有 Python 库从管理界面解析,用于解析 OpenVPN 状态响应的输出。可以在它的 GitHub 存储库中找到其代码:https ://github.com/tonyseek/openvpn-status

因此,当我们从 OpenVPN 守护程序获取状态时,它将使用他们的模型返回。有关更多信息,请参阅他们的文档:https ://openvpn-status.readthedocs.io/en/latest/api.html

与 VPN 状态不同,状态不是有状态的,因为它的输出很可能在调用之间发生变化。每次请求状态时,都会向管理界面查询最新数据。

一个简单的例子:

>>> status = v.get_status()
>>> status
<openvpn_status.models.Status object at 0x7f5eb54a2d68>
>>> status.client_list
OrderedDict([('1.2.3.4:56789', <openvpn_status.models.Client object at 0x7f5eb54a2128>)])

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

openvpn-api-0.3.0.tar.gz (10.0 kB 查看哈希

已上传 source