You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
#!/usr/bin/env python3
|
|
import sys
|
|
from urllib.error import HTTPError
|
|
from urllib.parse import urlencode
|
|
from urllib.request import urlopen
|
|
from hashlib import sha256
|
|
|
|
API_AUTH_SECRET = 'yourapikey'
|
|
SERVER_DOMAIN = 'http://localhost:8000'
|
|
|
|
|
|
def die(text):
|
|
print(text)
|
|
exit(1)
|
|
|
|
|
|
'''
|
|
obj = {
|
|
'client_ip': ip_address('127.0.0.1'),
|
|
'client_mac': 'aa:bb:cc:dd:ee:ff',
|
|
'switch_mac': 'aa:bb:cc:dd:ee:ff',
|
|
'switch_port': 3,
|
|
'cmd': 'commit'
|
|
}
|
|
'''
|
|
|
|
|
|
def calc_hash(data):
|
|
if type(data) is str:
|
|
result_data = data.encode('utf-8')
|
|
else:
|
|
result_data = bytes(data)
|
|
return sha256(result_data).hexdigest()
|
|
|
|
|
|
def make_sign(data: dict):
|
|
vars_to_hash = [str(v) for v in data.values()]
|
|
vars_to_hash.sort()
|
|
vars_to_hash.append(API_AUTH_SECRET)
|
|
return calc_hash('_'.join(vars_to_hash))
|
|
|
|
|
|
def send_to(data, server=SERVER_DOMAIN):
|
|
sign = make_sign(data)
|
|
data.update({'sign': sign})
|
|
try:
|
|
with urlopen("%s/abons/api/dhcp_lever/?%s" % (server, urlencode(data))) as r:
|
|
html = r.read()
|
|
print(html)
|
|
except ConnectionRefusedError:
|
|
print('ERROR: connection refused')
|
|
except HTTPError as e:
|
|
print('ERROR:', e)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
argv = sys.argv
|
|
if len(argv) < 3:
|
|
die(
|
|
'Too few arguments, exiting...\n'
|
|
'Usage:\n'
|
|
'COMMIT: ./dhcp_lever.py commit 192.168.1.100 ff:12:c5:9f:12:56 98:45:28:85:25:1a 3\n'
|
|
'EXPIRY or RELEASE: ./dhcp_lever.py [release |commit]'
|
|
)
|
|
if API_AUTH_SECRET == 'your api key':
|
|
raise NotImplementedError('You must specified secret api key')
|
|
|
|
action = argv[1]
|
|
if action == 'commit':
|
|
if len(argv) < 6:
|
|
die('Too few arguments, exiting...')
|
|
dat = {
|
|
'client_ip': argv[2],
|
|
'client_mac': argv[3],
|
|
'switch_mac': argv[4],
|
|
'switch_port': int(argv[5]),
|
|
'cmd': 'commit'
|
|
}
|
|
send_to(dat)
|
|
elif action == 'expiry' or action == 'release':
|
|
dat = {
|
|
'client_ip': argv[2],
|
|
'cmd': action
|
|
}
|
|
send_to(dat)
|