-
Notifications
You must be signed in to change notification settings - Fork 2
/
auto_logon.py
129 lines (110 loc) · 4.19 KB
/
auto_logon.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import time
import ssl
import configparser
import argparse
import logging
from requests import Request, Session
from bs4 import BeautifulSoup
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
__author__ = 'erickleao.dnt'
FORMAT = '%(asctime)-15s %(levelname)s: %(message)s'
logging.basicConfig(level=logging.INFO, format=FORMAT)
logger = logging.getLogger('sonicwall-logon')
logger.info('SonicWall Logon Started')
class AuthenticationError(Exception):
pass
class SonicWallLogon(object):
URLs = {
'params': 'auth1.html',
'auth': 'auth.cgi',
'confirm': 'dynUserLogin.html',
'status_top': 'loginStatusTop.html',
'status': 'dynLoginStatus.html?1stLoad=yes'
}
AUTH_ERROR_INTERVAL = 60
def __init__(self, username, password, server_ip, server_port, login_duration):
self.username = username
self.password = password
self.login_duration = login_duration
self.server_host = 'https://%s:%s/' % (server_ip, server_port)
self.server_port = server_port
self.auth_interval = (self.login_duration - 10) * 60
self.session = Session()
def request(self, url, method='GET', params=None, body=None, headers={}, cookies={}):
request = Request(
method, url,
params=params,
data=body,
headers=headers,
cookies=cookies
)
prepped = request.prepare()
return self.session.send(prepped, timeout=5, verify=False)
def get_params(self):
r = self.request(self.server_host + self.URLs.get('params'))
if r.status_code != 200:
raise AuthenticationError('Impossible to get auth params from SonicWall server.')
document = BeautifulSoup(r.text, 'html.parser')
params = {
'param1': document.find('input', {'name': 'param1'})['value'],
'param2': document.find('input', {'name': 'param2'})['value'],
'id': document.find('input', {'name': 'id'})['value'],
'sessId': document.find('input', {'name': 'sessId'})['value'],
'select2': 'English'
}
return params
def auth(self):
auth_params = self.get_params()
auth_params.update({
'uName': self.username,
'pass': self.password,
'digest': ''
})
r = self.request(
self.server_host + self.URLs.get('auth'),
method='POST',
params=None,
body=auth_params,
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if r.status_code != 200:
raise AuthenticationError('Received auth error from SonicWall server.')
self.auth_confirm(auth_params)
logger.info('Login performed.')
def auth_confirm(self, auth_params):
host = self.server_host.replace(':%s' % self.server_port, ':1080')
host = host.replace('https', 'http')
cookies = {'SessId': auth_params.get('SessId')}
self.request(host + self.URLs.get('confirm'), cookies=cookies)
self.request(host + self.URLs.get('status_top'), cookies=cookies)
self.request(host + self.URLs.get('status'), cookies=cookies)
def auto_auth(self):
while True:
try:
interval = self.auth_interval
self.auth()
except Exception as e:
logger.error(e)
interval = self.AUTH_ERROR_INTERVAL
finally:
time.sleep(interval)
parser = argparse.ArgumentParser(description='SonicWall auto logon.')
parser.add_argument(
'-c', '--config', help='Config file', required=True,
default='/etc/sonicwall-logon/auth.conf', type=str
)
args = parser.parse_args()
config = configparser.ConfigParser()
config.readfp(open(args.config))
sonicwall_logon = SonicWallLogon(
config.get('Auth Credentials', 'username'),
config.get('Auth Credentials', 'password'),
config.get('Server Info', 'host'),
config.get('Server Info', 'port'),
config.getint('Server Info', 'login_duration')
)
# Blocks forever
sonicwall_logon.auto_auth()
# Make service start with OS
# sudo update-rc.d sonicwall-logon defaults