summaryrefslogtreecommitdiff
path: root/pyvyos/device.py
diff options
context:
space:
mode:
authorRoberto Berto <roberto.berto@gmail.com>2023-12-13 12:50:45 -0300
committerRoberto Berto <roberto.berto@gmail.com>2023-12-13 12:50:45 -0300
commit4148924483f14e5ecde296df09e0c2a2fef20787 (patch)
treef88b368e9d9a40f9daa34b88a7df204d27cde4a4 /pyvyos/device.py
parent1cd622e219ceed9ba669bb373a4e4407a9542215 (diff)
downloadpyvyos-4148924483f14e5ecde296df09e0c2a2fef20787.tar.gz
pyvyos-4148924483f14e5ecde296df09e0c2a2fef20787.zip
version 0.2.0 with all api and tests
Diffstat (limited to 'pyvyos/device.py')
-rw-r--r--pyvyos/device.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/pyvyos/device.py b/pyvyos/device.py
new file mode 100644
index 0000000..1d0933b
--- /dev/null
+++ b/pyvyos/device.py
@@ -0,0 +1,130 @@
+import urllib3
+urllib3.disable_warnings()
+
+import requests
+import json
+import pprint
+from dataclasses import dataclass
+
+@dataclass
+class ApiResponse:
+ status: int
+ request: dict
+ result: dict
+ error: str
+
+class VyDevice:
+ def __init__(self, hostname, apikey, protocol='https', port=443, verify=True, timeout=10):
+ self.hostname = hostname
+ self.apikey = apikey
+ self.protocol = protocol
+ self.port = port
+ self.verify = verify
+ self.timeout = timeout
+
+
+ def _get_url(self, command):
+ return f"{self.protocol}://{self.hostname}:{self.port}/{command}"
+
+
+ def _get_payload(self, op, path=[], file=None, url=None, name=None):
+ data = {
+ 'op': op,
+ 'path': path
+ }
+
+ if file is not None:
+ data['file'] = file
+
+ if url is not None:
+ data['url'] = url
+
+ if name is not None:
+ data['name'] = name
+
+ payload = {
+ 'data': json.dumps(data),
+ 'key': self.apikey
+ }
+
+ #print(payload)
+ return payload
+
+ def _api_request(self, command, op, path=[], method='POST', file=None, url=None, name=None):
+ url = self._get_url(command)
+ payload = self._get_payload(op, path=path, file=file, url=url, name=name)
+ #pprint.pprint(payload)
+
+ headers = {}
+ error = False
+ result = {}
+
+ try:
+ resp = requests.post(url, verify=self.verify, data=payload, timeout=self.timeout, headers=headers)
+ pprint.pprint(resp.text)
+
+ if resp.status_code == 200:
+ try:
+ resp_decoded = resp.json()
+
+ if resp_decoded['success'] == True:
+ result = resp_decoded['data']
+ error = False
+ else:
+ error = resp_decoded['error']
+
+ except json.JSONDecodeError:
+ error = 'json decode error'
+ else:
+ error = 'http error'
+
+ status = resp.status_code
+
+ except requests.exceptions.ConnectionError as e:
+ error = 'connection error: ' + str(e)
+ status = 0
+
+ # removing apikey from payload for security reasons
+ del(payload['key'])
+ return ApiResponse(status=status, request=payload, result=result, error=error)
+
+
+ def retrieve_show_config(self, path=[]):
+ return self._api_request(command="retrieve", op='showConfig', path=path, method="POST")
+
+ def retrieve_return_values(self, path=[]):
+ return self._api_request(command="retrieve", op='returnValues', path=path, method="POST")
+
+ def reset(self, path=[]):
+ return self._api_request(command="reset", op='reset', path=path, method="POST")
+
+ def image_add(self, url=None, file=None, path=[]):
+ return self._api_request(command="image", op='add', url=url, method="POST")
+
+ def image_delete(self, name, url=None, file=None, path=[]):
+ return self._api_request(command="image", op='delete', name=name, method="POST")
+
+ def show(self, path=[]):
+ return self._api_request(command="show", op='show', path=path, method="POST")
+
+ def generate(self, path=[]):
+ return self._api_request(command="generate", op='generate', path=path, method="POST")
+
+ def configure_set(self, path=[]):
+ return self._api_request(command="configure", op='set', path=path, method="POST")
+
+ def configure_delete(self, path=[]):
+ return self._api_request(command="configure", op='delete', path=path, method="POST")
+
+ def config_file_save(self, file=None):
+ return self._api_request(command="config-file", op='save', file=file, method="POST")
+
+ def config_file_load(self, file=None):
+ return self._api_request(command="config-file", op='load', file=file, method="POST")
+
+ def reboot(self, path=["now"]):
+ return self._api_request(command="reboot", op='reboot', path=path, method="POST")
+
+ def poweroff(self, path=["now"]):
+ return self._api_request(command="poweroff", op='poweroff', path=path, method="POST")
+ \ No newline at end of file