-
Notifications
You must be signed in to change notification settings - Fork 0
/
SwgUnpack.py
50 lines (42 loc) · 1.58 KB
/
SwgUnpack.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
#!/bin/python
import xml.etree.ElementTree as ET
import base64
import gzip
import tarfile
from io import BytesIO
import argparse
class SwgUnpack:
def __init__(self, args) -> None:
self.XMLdata = args.backupfile
self.Verbose = args.v
self.Outpath = args.outpath
self.B64 = ""
self.GZIP = ""
self.TAR = ""
self.unpack()
def getB64(self):
xmlFile = ET.parse(self.XMLdata)
return xmlFile.find('.//co_backup_data').text
def getGZIP(self):
return base64.b64decode(self.B64)
def getTAR(self):
return BytesIO(gzip.decompress(self.GZIP))
def getPlain(self, export):
with tarfile.open(fileobj=self.TAR, mode='r') as tar:
tar.extractall(path=export)
def unpack(self):
if self.Verbose == True:
print(f'Backup File: {self.XMLdata}')
self.B64 = self.getB64()
self.GZIP = self.getGZIP()
self.TAR = self.getTAR()
self.getPlain(self.Outpath)
if self.Verbose == True:
print("Done!")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Extract SWG configuration from XML backup file.')
parser.add_argument('backupfile', default="xml.backup", type=str, help='Backup file from SWG.')
parser.add_argument('-o', '--outpath', default='.', help='Optional. Provide a path where backup should be exported.')
parser.add_argument('-v', help="Prints a status on the screen", action='store_true')
args = parser.parse_args()
SwgUnpack(args)