Blame view

digger.py 6.42 KB
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
Imanol-Mikel Barba Sabariego authored
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")
Imanol-Mikel Barba Sabariego authored
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 = []
Imanol-Mikel Barba Sabariego authored
123
            if "all" in tags:
124
                logger.msgLog("Selected modules: " + repr(moduleList), "digger", logger.TYPE_INFO)
Imanol-Mikel Barba Sabariego authored
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":
Imanol-Mikel Barba Sabariego authored
139
                                logger.msgLog("Skipping module " + module[0], "digger", logger.TYPE_INFO)
140
                                break
Imanol-Mikel Barba Sabariego authored
141
            else:
142
                logger.msgLog("Selected modules: " + repr(tags), "digger", logger.TYPE_INFO)
Imanol-Mikel Barba Sabariego authored
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
Imanol-Mikel Barba Sabariego authored
160
161
            sp.call('clear', shell=True)
            for module in runlist:
162
                logger.msgLog("Running " + module.name + "...", "digger", logger.TYPE_INFO)
Imanol-Mikel Barba Sabariego authored
163
                try:
Imanol-Mikel Barba Sabariego authored
164
165
                    #Battle routine, set!
                    module.execute()
Imanol-Mikel Barba Sabariego authored
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
Imanol-Mikel Barba Sabariego authored
170
171
            finish(True)