用于 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.IP
或VPNType.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 对象包含以下内容:
守护进程的当前模式,client
或server
>>> 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
或断开连接的原因,如果状态是RECONNECTING
或EXITING
>>> 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_addr
和remote_port
将填充远程服务器的地址和端口
>>> s.remote_addr
'1.2.3.4'
>>> s.remote_port
1194
如果守护进程处于服务器模式,则local_addr
和local_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>)])