Package: python-glinet
python-glinet - A Python3 Client for GL.Inet RouterPython3 client providing full access to the GL.Inet Luci API.Supported firmware versions: 4.0 onwardsDynamic method creation including docstring from the gl.inet
online documentationApi responses are recursively build as objects, such that you can
access all properties via '.'Cache for api description and hashed loginConfigurable background thread to keep connection aliveNote:GL.Inet changed the api mechanism from REST to JSON-RPC with the
introduction of the firmware 4.0. Therefore, older versions are not
supported.There is no official English api documentation. The client parses
the Chinese documentation fromhereand dynamically
creates the api methods. Once it is available, the repo will be
updated.The best way to navigate and explore the api is within an ipython
shell. A wrapper for ipython and terminal is on the roadmap.InstallationPIPpip install python-glinetFrom Repo#clone repository
git clone https://github.com/tomtana/python-glinet.git
cd python-glinetIt is strongly recommended to install the package inside an python
virtual environment (seeherefor more infos).
The pip parameter-eis optional and gives you the possibility to edit
thepython-glinetdirectly in the folder.python3 -m venv venv
source venv/bin/activate
pip install -e .Getting StartedThe heart piece ofpython-glinetis theGlInetclass. It is manages
authentication, session and communication with the api. In case you
modified the router default settings such as ip-address or username you
need to pass them as parameter (see the documentation of theGlInetclass for
more details).For browsing the api using the dynamically created api_client, it is
assumed that the commands are executed in an ipython shell.Warning:Even though possible, it is strongly discouraged to pass the password as
a parameter.Note:The constructor is checking if a api description is already in the
persistence and will load it from the gl.inet online documentation
if not.Make sure you check and understand the default settingsfrom pyglinet import GlInet
glinet = GlInet()Loginglinet.login()The login method call has deliberately not been integrated into the
constructor. For convenience it is possible to instantiate the object
and login as shown below.# one liner: instantiation and login
glinet = GlInet().login()Note:if no password is passed as parameter in the constructor,login()will try to load login data from persistenceif no success ask via prompt and persist settingsstart background thread to keep connection aliveAPI Access Via Dynamically Created ClientMake sure you are in an ipython shell and logged in. Then, generate theapi_client.api_client = glinet.get_api_client()You have also direct access to the api via theapiproperty of theGlInetinstance.GeneralThe api structure is as follow:client.<functionial_group>.<method>Due to python naming rules for variables, all "-" are replaced
with "_" for the api method construction.e.g. wg-client
becomes wg_client.Use code completion and docstring to intuitively navigate the apiFunctional GroupsJust call your client to see all available api function groups.api_clientOr same result withglinet.apiOut[11]:
Function
------------------
repeater
rs485
qos
acl
modem
logread
igmp
custom_dns
dns
dlna
nas_web
adguardhome
s2s
samba
switch_button
diag
rtty
network
upgrade
reboot
wg_server
firewall
ovpn_server
vpn_policy
fan
system
wg_client
cable
led
ui
netmode
ddns
ipv6
ovpn_client
plugins
tethering
macclone
lan
edgerouter
clients
wifi
cloud
cloud_batch_manageMethodsTo explore the methods of a function group, just select it and hit
enter.api_client.wg_clientOut[6]:
Function
--------------------
get_recommend_config
get_third_config
add_config
set_config
remove_config
clear_config_list
get_config_list
start
stop
get_status
check_config
confirm_config
add_group
remove_group
set_group
get_group_list
get_all_config_list
set_proxy
add_route
set_route
get_route_list
remove_routeParametersSelect your method and press enter. A list for all possible parameters
are printed. A parameter prepended with?is optional.api_client.wg_client.set_configOut[8]:
Parameter              Type    Description
---------------------  ------  ------------------
name                   string  节点名
address_v4             string  节点IPv4子网
?address_v6            string  节点IPv6子网
private_key            string  节点私钥
allowed_ips            string  节点的allowedips
end_point              string  节点的endpoint
public_key             string  节点公钥
?dns                   string  节点的dns
?preshared_key         string  预分享密钥
?ipv6_enable           bool    是否启用IPv6
presharedkey_enable    bool    是否使用预分享密钥
group_id               number  组ID
peer_id                number  配置ID
?listen_port           number  监听端口
?persistent_keepalive  number  节点保活
?mtu                   number  节点的mtuDocstringYou can also show the docstring by appending a?to the method. It
will show all the parameters and usage examples.api_client.wg_client.set_config?Signature: api.wg_client.set_config(params=None)
Type:      GlInetApiCall
File:      ~/.local/lib/python3.10/site-packages/pyglinet/api_helper.py
Docstring:
Available parameters (?=optional):
Parameter              Type    Description
---------------------  ------  ------------------
name                   string  节点名
address_v4             string  节点IPv4子网
?address_v6            string  节点IPv6子网
private_key            string  节点私钥
allowed_ips            string  节点的allowedips
end_point              string  节点的endpoint
public_key             string  节点公钥
?dns                   string  节点的dns
?preshared_key         string  预分享密钥
?ipv6_enable           bool    是否启用IPv6
presharedkey_enable    bool    是否使用预分享密钥
group_id               number  组ID
peer_id                number  配置ID
?listen_port           number  监听端口
?persistent_keepalive  number  节点保活
?mtu                   number  节点的mtu

Example request:
{\"jsonrpc\":\"2.0\",\"method\":\"call\",\"params\":[\"\",\"wg-client\",\"set_config\",{\"group_id\":3212,\"peer_id\":1254,\"name\":\"test\",\"address_v4\":\"10.8.0.0/24\",\"address_v6\":\"fd00:db8:0:123::/64\",\"private_key\":\"XVpIdr+oYjTcgDwzSZmNa1nSsk8JO+tx1NBo17LDBAI=\",\"allowed_ips\":\"0.0.0.0/0,::/0\",\"end_point\":\"103.231.88.18:3102\",\"public_key\":\"zv0p34WZN7p2vIgehwe33QF27ExjChrPUisk481JHU0=\",\"dns\":\"193.138.219.228\",\"presharedkey_enable\":false,\"listen_port\":22536,\"persistent_keepalive\":25,\"mtu\":1420,\"ipv6_enable\":true}],\"id\":1}

Example response:
{\"jsonrpc\": \"2.0\", \"id\": 1, \"result\": {}}Method callJust call the method as usual. Check the usage examples to understand
how parameters need to be passed.api_client.wg_client.get_all_config_list()Out[12]: {'name': 'wg_client__get_all_config_list', 'config_list': [{'name': 'wg_client__get_all_config_list', 'username': '', 'group_name': 'AzireVPN', 'peers': [], 'password': '', 'auth_type': 1, 'group_id': 9690}]}API Response ProcessingThe API json responses are recursively converted into objects. This
provides convenient access with code completion and point access to the
data.API Access Via Direct RequestInstead of using the dynamically created api_client, it is also
possible to use theGlInetinstance to make api requests. In fact, the
api_client uses theGlInetsession under the hood.Once logged in, you simply can use theglinet.request(method, params)method to access or retrieve data from the api. Information about the
method and the parameters can either be found in thedocumentationor via the
api_client.e.g.glinet.request("call", ["adguardhome", "get_config"])Out[12]: {'name': 'adguardhome__get_config', 'id': 13, 'jsonrpc': '2.0', 'result': {'name': 'adguardhome__get_config', 'enabled': False}}is equivalent toapi_client.adguardhome.get_config()Out[13]: {'name': 'adguardhome__get_config', 'enabled': False}Note:The output of therequestmethod returns the whole response body
whereas the api_client just returns the result dict.RoadmapV1.0.0☒ Add dynamically docstring for API calls☒ Create pip compliant package☒ Publish pip package☒ Add tests☒ Improve documentation☒ Increase test coverage☒ replace crypt dependency to allow also Windows execution☐ Add wrapper for execution via terminalV2.0.0☐ Add asyncio support☐ ...