|
1
2
|
#! /usr/bin/env python3
|
|
3
4
5
6
7
8
|
import sys
sys.path.append('modules')
sys.path.append('vars')
sys.path.append('logger')
|
|
9
|
import time
|
|
10
11
12
13
14
|
import locale
from dialog import Dialog
import glob
import os
import subprocess as sp
|
|
15
|
import tomb
|
|
16
|
import traceback
|
|
17
18
19
|
import logger
from consolelogger import ConsoleLogger
from filelogger import FileLogger
|
|
20
|
from hashlib import sha256
|
|
21
22
23
24
25
26
27
28
29
30
31
|
def getModules():
choiceList = []
modules = []
for filename in glob.glob('./modules/*.py'):
modules.append(os.path.splitext(os.path.basename(filename))[0])
modules.remove('__init__')
for modname in modules:
try:
module = __import__(modname)
|
|
32
|
instance = module.getInstance()
|
|
33
34
35
36
37
38
39
40
41
|
choiceList.append((instance.name,instance.description,False))
del instance
del module
sys.modules.pop(modname)
except Exception as e:
print("Exception raised while importing " + modname)
return choiceList
def prepareModule(moduleName):
|
|
42
43
44
45
46
|
try:
module = __import__(moduleName).getInstance()
module.getVars()
return module
except Exception as e:
|
|
47
48
|
raise
|
|
49
50
51
52
53
54
55
56
57
58
|
def sha256sum(file):
f = open(file, 'rb')
result = sha256(f.read()).hexdigest()
f.close()
return result
def bagAndTag():
tombPath = tomb.getPath()
hashes = open(tombPath + "hashes.txt",'a+')
|
|
59
60
|
boneList = []
|
|
61
62
63
64
|
for root, dirnames, filenames in os.walk(tombPath):
for dir in dirnames:
for subroot, subdirnames, subfilenames in os.walk(tombPath + dir):
for filename in subfilenames:
|
|
65
66
67
68
69
70
71
72
73
74
|
boneList.append(subroot + "/" + filename)
d.gauge_start(title="Hashing all collected artifacts...",width=60,height=10)
boneCount = 0
for bone in boneList:
d.gauge_update(text=bone,percent=int(boneCount*100/len(boneList)),update_text=True)
hashes.write(sha256sum(bone) + " " + bone + "\n")
boneCount += 1
d.gauge_update(text="Complete!",percent=100,update_text=True)
time.sleep(1)
|
|
75
|
hashes.close()
|
|
76
77
78
|
def finish(allSuccessful):
bagAndTag()
|
|
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
msg = ""
if(allSuccessful):
msg = "All modules finished execution"
else:
msg = "Some or all modules failed execution. Please check the logs."
code, tag = d.menu(msg, choices=[("Poweroff", "Shutdown the computer"),
("Reboot", "Reboot the computer"),
("Restart", "Run Gravedigger again")])
if (code == d.OK):
if tag == "Poweroff":
sp.call("poweroff", shell=True)
elif tag == "Reboot":
sp.call("reboot", shell=True)
|
|
94
|
logger.msgLog("Finished excavation of tomb: " + tomb.getPath(),"digger",logger.TYPE_INFO)
|
|
95
96
97
|
exit(0)
def showContinueDialog(d,msg):
|
|
98
99
100
101
102
103
|
code, tag = d.menu(msg + "\n\nDo you want to retry module configuration or continue execution without the module?",
choices=[("retry", "Retry configuration"),
("continue", "Continue without module")])
if code != d.OK:
return "abort"
return tag
|
|
104
105
106
107
108
109
110
111
|
if __name__ == "__main__":
locale.setlocale(locale.LC_ALL, '')
d = Dialog(dialog="dialog",autowidgetsize=True)
d.set_background_title("Gravedigger")
moduleList = getModules()
code,value = d.inputbox("Input computer's name")
|
|
112
|
if code == d.OK:
|
|
113
114
115
|
tomb._MACHINE_NAME= value
logger.logSystems.append(ConsoleLogger())
logger.logSystems.append(FileLogger(tomb.getPath() + "log.txt"))
|
|
116
|
logger.msgLog("Beginning excavation of tomb: " + tomb.getPath(),"digger",logger.TYPE_INFO)
|
|
117
118
119
120
121
122
|
d.set_background_title("Gravedigger - " + value)
code, tags = d.checklist("Select modules to execute",
choices=moduleList + [("all","Execute all modules",False)],
title="Module selection")
if code == d.OK:
runlist = []
|
|
123
|
if "all" in tags:
|
|
124
|
logger.msgLog("Selected modules: " + repr(moduleList), "digger", logger.TYPE_INFO)
|
|
125
|
for module in moduleList:
|
|
126
127
128
129
130
131
132
133
134
135
136
|
while True:
try:
mod = prepareModule(module[0])
runlist.append(mod)
break
except Exception as e:
msg = "Exception raised while preparing module \"" + module[0] + "\": " + str(e)
logger.msgLog(msg, module[0], logger.TYPE_ERROR)
#logger.msgLog(traceback.format_exc(), module[0], logger.TYPE_ERROR)
ans = showContinueDialog(d,msg)
if ans == "abort":
|
|
137
|
finish(False)
|
|
138
|
elif ans == "continue":
|
|
139
|
logger.msgLog("Skipping module " + module[0], "digger", logger.TYPE_INFO)
|
|
140
|
break
|
|
141
|
else:
|
|
142
|
logger.msgLog("Selected modules: " + repr(tags), "digger", logger.TYPE_INFO)
|
|
143
|
for tag in tags:
|
|
144
145
146
147
148
149
150
151
152
153
154
|
while True:
try:
mod = prepareModule(tag)
runlist.append(mod)
break
except Exception as e:
msg = "Exception raised while preparing module \"" + tag + "\": " + str(e)
logger.msgLog(msg,tag,logger.TYPE_ERROR)
#logger.msgLog(traceback.format_exc(), tag logger.TYPE_ERROR)
ans = showContinueDialog(d, msg)
if ans == "abort":
|
|
155
|
finish(False)
|
|
156
157
158
|
elif ans == "continue":
logger.msgLog("Skipping module " + tag, "digger", logger.TYPE_INFO)
break
|
|
159
|
|
|
160
161
|
sp.call('clear', shell=True)
for module in runlist:
|
|
162
|
logger.msgLog("Running " + module.name + "...", "digger", logger.TYPE_INFO)
|
|
163
|
try:
|
|
164
165
|
#Battle routine, set!
module.execute()
|
|
166
|
except Exception as e:
|
|
167
168
|
logger.msgLog("Exception raised while running \"" + module.name + "\": " + str(e), module.name, logger.TYPE_ERROR)
#logger.msgLog(traceback.format_exc(), module.name, logger.TYPE_ERROR)
|
|
169
|
|
|
170
|
|
|
171
|
finish(True)
|