-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate_list_o365.py
75 lines (75 loc) · 3.45 KB
/
generate_list_o365.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
import json
import os
import urllib.request
import uuid
# Helper für den Aufruf des Webservices und analysieren der Antwort
def webApiGet(methodName, instanceName, clientRequestId):
ws = "https://endpoints.office.com"
requestPath = ws + '/' + methodName + '/' + instanceName + '?clientRequestId=' + clientRequestId
request = urllib.request.Request(requestPath)
with urllib.request.urlopen(request) as response:
return json.loads(response.read().decode())
# Pfad, wo Client ID, letzte Versionsnummer und alle Ergebnisfiles gespeichert werden
datapath = 'docs/o365/'
# Lese Client ID und Version ein, falls schon eine Datei existiert, andernfalls erstelle eine neue Datei
lastVersion = datapath + '/endpoints_clientid_latestversion.txt'
if os.path.exists(lastVersion):
with open(lastVersion, 'r') as fin:
clientRequestId = fin.readline().strip()
latestVersion = fin.readline().strip()
else:
clientRequestId = str(uuid.uuid4())
latestVersion = '0000000000'
with open(lastVersion, 'w') as fout:
fout.write(clientRequestId + '\n' + latestVersion)
# Aufruf der Version-Methode zur Überprüfung der aktuellen Version. Wenn sie neuer ist, dann holen der neuen Informationen und eintragen der neuen Version
version = webApiGet('version', 'Worldwide', clientRequestId)
if version['latest'] > latestVersion:
print('Neue Version der "Office 365 worldwide commercial service instance endpoints" gefunden')
# Schreibe neue Versions-Nummer in den File
with open(lastVersion, 'w') as fout:
fout.write(clientRequestId + '\n' + version['latest'])
# Rufe die endpoints Methode auf, um die neuen Daten zu bekommen
endpointSets = webApiGet('endpoints', 'Worldwide', clientRequestId)
# Filtern der Ergebnisse nach "Allow" und "Optimize" Endpunkten und übertragen des Ergebnisses in Tupel mit IPs, Ports und URLs
flatIps = []
for endpointSet in endpointSets:
if endpointSet['category'] in ('Optimize', 'Allow'):
ips = endpointSet['ips'] if 'ips' in endpointSet else []
tcpPorts = endpointSet['tcpPorts'] if 'tcpPorts' in endpointSet else ''
udpPorts = endpointSet['udpPorts'] if 'udpPorts' in endpointSet else ''
flatIps.extend([(ip, tcpPorts, udpPorts) for ip in ips])
# Einträge unique machen und sortieren
flatIpsSet = set(flatIps)
flatIps = list(flatIpsSet)
flatIps.sort()
# remove existing old lists
os.system('rm -f ' + datapath + 'tcp*')
os.system('rm -f ' + datapath + 'udp*')
# Ausgabe der verschiedenen Port-Listen
for flatP in flatIps:
portFileName = ""
if flatP[1] != "": # TCP-Ports
portFileName = portFileName + "tcp_" + flatP[1]
if flatP[2] != "": # UDP-Ports
portFileName = portFileName + "udp_" + flatP[2]
portfile = datapath + '/' + portFileName + ".txt"
f = open(portfile, "a")
f.write(flatP[0] + "\n")
f.close()
# Ausgabe der URL-Liste
flatUrls = []
for endpointSet in endpointSets:
if endpointSet['category'] in ('Optimize', 'Allow'):
urls = endpointSet['urls'] if 'urls' in endpointSet else []
flatUrls.extend([(url) for url in urls])
flatUrls.sort()
urlfile = datapath + "/" + "url.txt"
f = open(urlfile, "w")
for flatUrl in flatUrls:
writeUrl = flatUrl + "\n"
f.write(writeUrl)
f.close()
print('Neue Listen erzeugt!')
else:
print("Keine neue Version gefunden!")