-
Notifications
You must be signed in to change notification settings - Fork 0
/
free_wifi.py
302 lines (259 loc) · 8.46 KB
/
free_wifi.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
import os, sys, re, subprocess
from free_wifi_basekits import *
from free_wifi_config import *
WIFI_CONFIG = WIFI_CONFIG
WIFI_CMD = {
"check" : "netsh wlan show drivers",
"setmode" : "netsh wlan set hostednetwork mode=allow",
"setnet" : "netsh wlan set hostednetwork ssid={ssid} key={key}",
"start" : "netsh wlan start hostednetwork",
"stop" : "netsh wlan stop hostednetwork",
"status" : "netsh wlan show hostednetwork",
}
WIFI_ACCOUNTS_INFO = {
"account_list" : {
# "xKey" : "xPassw",
},
"account_order" : [
# "xPassw",
],
"selected" : None, # "xKey"
}
########################## WIFI 控制模块 ##################################
def wfCheck():
res = "".join(os.popen(WIFI_CMD["check"]).readlines())
grp = re.search(r"支持的承载网络 : (.*)[\r\n ]*", res)
return bool(grp and grp.group(1) == "是")
# wifi startup
def wfStart(ssid, key):
os.system(WIFI_CMD["setmode"])
os.system(WIFI_CMD["setnet"].format(ssid=ssid,key=key))
os.system(WIFI_CMD["start"])
# wifi stop
def wfStop():
os.system(WIFI_CMD["stop"])
# wifi status
def wfStatus():
return "".join(os.popen(WIFI_CMD["status"]).readlines())
########################## ACCOUNT 管控模块 ##################################
## 底层操作 ##
def acFilePath():
return "/".join((WIFI_CONFIG["dir"]["data"], WIFI_CONFIG["account"]))
def acInit():
with open(acFilePath(), 'a'):
pass
def acLoad():
account_list = {}
account_selected = None
with open(acFilePath(), "r") as fr:
for account in fr.readlines():
account = account.strip()
if not account:
continue
account = account.split(',')
ssid = account[0]
key = account[1]
selected = bool(len(account) > 2 and account[2] == WIFI_CONFIG["guard"])
account_list[ssid] = key
account_selected = (ssid if selected else account_selected)
WIFI_ACCOUNTS_INFO["account_list"] = account_list
WIFI_ACCOUNTS_INFO["selected"] = account_selected
def acDump():
with open(acFilePath(), "w") as fw:
account_list = WIFI_ACCOUNTS_INFO["account_list"]
for ssid in account_list:
key = account_list[ssid]
fw.write("{}\n".format(",".join((ssid,key,WIFI_CONFIG["guard"])
if ssid == WIFI_ACCOUNTS_INFO["selected"] else (ssid,key))))
def acRefresh():
# sorted list for accounts' ssid
WIFI_ACCOUNTS_INFO["account_order"] = sorted(WIFI_ACCOUNTS_INFO["account_list"].keys())
# check selected ssid, if not choose a default one
if WIFI_ACCOUNTS_INFO["selected"] not in WIFI_ACCOUNTS_INFO["account_order"]:
WIFI_ACCOUNTS_INFO["selected"] = (WIFI_ACCOUNTS_INFO["account_order"][0] if WIFI_ACCOUNTS_INFO["account_order"] else None)
def acFilter(ssid, key):
return bool(WIFI_CONFIG["format"]["ssid"](ssid) and WIFI_CONFIG["format"]["key"](key))
## 顶层封装 ##
def acListAll():
infos = []
account_order = WIFI_ACCOUNTS_INFO["account_order"]
for idx, ssid in enumerate(account_order):
info = [idx, ssid, WIFI_ACCOUNTS_INFO["account_list"][ssid], ""]
if WIFI_ACCOUNTS_INFO["selected"] == ssid:
info[3] = WIFI_CONFIG["guard"]
infos.append(info)
return infos
def acUpdate(ssid, key):
if not acFilter(ssid, key):
raise IncorrectFormatError
WIFI_ACCOUNTS_INFO["account_list"][ssid] = key
acRefresh()
acDump()
def acDelete(idx):
if idx < 0 or idx >= len(WIFI_ACCOUNTS_INFO["account_order"]):
raise AccountNotFoundError
ssid = WIFI_ACCOUNTS_INFO["account_order"][idx]
del WIFI_ACCOUNTS_INFO["account_list"][ssid]
acRefresh()
acDump()
return ssid
def acSelect(idx):
if idx < 0 or idx >= len(WIFI_ACCOUNTS_INFO["account_order"]):
raise AccountNotFoundError
ssid = WIFI_ACCOUNTS_INFO["selected"] = WIFI_ACCOUNTS_INFO["account_order"][idx]
acDump()
return ssid
########################## 监控模块 ##################################
## 底层操作 ##
def mtTempPath(file):
return "/".join((WIFI_CONFIG["dir"]["tmp"], file))
def mtStatePath(state):
return mtTempPath(state)
def mtCheckState():
# 当前路径下
return bool(SearchFilesInCondition(path=WIFI_CONFIG["dir"]["tmp"],
cond=(lambda obj:bool(re.match(WIFI_CONFIG["monitor"]["state"]["prefix"], obj)))))
def mtGenState():
uuid = GenRandomUUID(WIFI_CONFIG["monitor"]["state"]["size"])
state = "{0}{1}".format(WIFI_CONFIG["monitor"]["state"]["prefix"], uuid)
with open(mtStatePath(state), "w") as fw:
pass
return state
def mtRmvState():
files = SearchFilesInCondition(path=WIFI_CONFIG["dir"]["tmp"],
cond=(lambda obj:bool(re.match(WIFI_CONFIG["monitor"]["state"]["prefix"], obj))))
for file in files:
os.remove(mtStatePath(file))
def mtLaunchProc(state):
vbs = 'CreateObject("WScript.Shell").Run "python {proc} {state}",0'.format(proc=WIFI_CONFIG["monitor"]["script"]["boost"], state=state)
with open(mtTempPath(WIFI_CONFIG["monitor"]["script"]["vbs"]), "w", encoding="utf-8") as fw:
fw.write(vbs)
subprocess.call(["cscript.exe", mtTempPath(WIFI_CONFIG["monitor"]["script"]["vbs"])])
## 顶层封装 ##
def mtStart():
if mtCheckState():
return
state = mtGenState()
mtLaunchProc(state)
def mtStop():
mtRmvState()
########################## CMD 模块 ##################################
class CommandLines:
def __init__(self, cmds):
if not isinstance(cmds, dict):
raise TypeError("cmd map must be a dictionary")
self.cmds = cmds or {}
def run(self):
while 1:
try:
comd = input("\n>>")
comd = comd.strip().split(' ')
if comd[0] in self.cmds:
self.cmds[comd[0]](*(comd[1:] if len(comd) > 1 else []))
else:
LogW("Unknown Command ...")
except Exception as err:
LogE("Unknown Error in Command: ", err)
########################## 指令逻辑流程 ##################################
def InitWifi():
checkDrivers()
acInit()
acLoad()
acRefresh()
def checkDrivers():
LogN("Drivers checking ...")
if not wfCheck():
LogW("Drivers not support wifi hotspot, any press to exit ...")
input()
quit()
def StartWifi(*args, **kwargs):
if not WIFI_ACCOUNTS_INFO["selected"]:
LogW("There is no account in configuration file {file} yet, please new one ...".format(file=acFilePath()))
return
ssid = WIFI_ACCOUNTS_INFO["selected"]
key = WIFI_ACCOUNTS_INFO["account_list"][ssid]
wfStart(ssid, key)
LogN("Wifi has started !!!")
LogN("Monitor is on the way !!!")
mtStart()
def StopWifi(*args, **kwargs):
mtStop()
LogN("Monitor is stopping !!!")
wfStop()
LogN("Wifi has stopped !!!")
def ShowWifi(*args, **kwargs):
stat = wfStatus()
grp = re.search(r"SSID 名称 *:“(.*)”", stat)
accs = WIFI_ACCOUNTS_INFO["account_list"]
ssid = (grp.group(1) if grp else "")
key = (accs[ssid] if ssid in accs else "")
LogN("Wifi Status as follow:")
LogN("Wifi Name: {ssid}".format(ssid=ssid))
LogN("Wifi Code: {key}".format(key=key))
LogN(stat)
def ListAccount(*args, **kwargs):
accs = acListAll()
LogP("----------- Users Info -----------")
for acc in accs:
LogP("{idx}. {ssid} : {key} {selected}".format(idx=acc[0],ssid=acc[1],key=acc[2],selected=acc[3]))
LogP("----------------------------------")
def UpdateAccount(*args, **kwargs):
try:
ssid, key = args[0].split(":")
acUpdate(ssid, key)
LogN("Account {ssid} updated !!!".format(ssid=ssid))
except IncorrectFormatError as err:
LogW(err)
except Exception as err:
LogW("Mismatch input format <ssid>:<key>, your input is {}".format(args))
def DeleteAccount(*args, **kwargs):
try:
acidx = int(args[0])
ssid = acDelete(acidx)
LogN("Account {ssid} deleted !!!".format(ssid=ssid))
except AccountNotFoundError as err:
LogW(err)
except Exception as err:
LogW("Mismatch input format <tag>, your input is {}".format(args))
def SelectAccount(*args, **kwargs):
try:
acidx = int(args[0])
ssid = acSelect(acidx)
LogN("Account {ssid} selected !!!".format(ssid=ssid))
except AccountNotFoundError as err:
LogW(err)
except Exception as err:
LogW("Mismatch input format <tag>, your input is {}".format(args))
def Clear(*args, **kwargs):
os.system("cls")
def TipInfo():
LogP("============== Free Wifi =============")
LogP("Support Command:\n" +
" start | stop | show\n" +
" new <ssid>:<key> | delete <tag>\n" +
" list | select <tag>\n" +
" help | clear | quit\n")
def Quit(*args, **kwargs):
LogN("Wifi manger quit now ...")
quit()
CMD_LOGFUNCS = {
# wifi
"start" : StartWifi,
"stop" : StopWifi,
"show" : ShowWifi,
# accounts
"new" : UpdateAccount,
"delete": DeleteAccount,
"list" : ListAccount,
"select": SelectAccount,
# control
"help" : TipInfo,
"clear" : Clear,
"quit" : Quit,
}
if __name__ == '__main__':
InitWifi()
Clear()
cmd = CommandLines(CMD_LOGFUNCS)
TipInfo()
cmd.run()