def __init__(self): self.injectBasicFilename = "injectBasic.stp" self.injectAdvancedFilename = "injectAdvanced.stp" self.injector = None self.controller = None self.builder = gtk.Builder() self.builder.add_from_file("fault_injection.glade") # signaly z glade souboru self.builder.connect_signals({ "exitApp": gtk.main_quit, "browseButtonClicked": self.browseClicked, "nofileRadio": self.nofileRadioClicked, "eacessRadio": self.eacessRadioClicked, "enoentRadio": self.enoentRadioClicked, "emfileRadio": self.emfileRadioClicked, "ewouldblockRadio": self.ewouldblockRadioClicked, "eexistRadio": self.eexistRadioClicked, "nonetRadio": self.nonetRadioClicked, "enetunreachRadio": self.enetunreachRadioClicked, "etimedoutRadio": self.etimedoutRadioClicked, "econnrefusedRadio": self.econnrefusedRadioClicked, "econnresetRadio": self.econnresetRadioClicked, "emsgsizeRadio": self.emsgsizeRadioClicked, "eisconnRadio": self.eisconnRadioClicked, "enotconnRadio": self.enotconnRadioClicked, "startButtonClicked": self.startButtonClicked, "termButtonClicked": self.termButtonClicked, "eaccesProcessRadio": self.eaccesProcessRadioClicked, "enoentProcessRadio": self.enoentProcessRadioClicked, "enoexecRadio": self.enoexecRadioClicked, "enomemProcessRadio": self.enomemProcessRadioClicked, "elibbadRadio": self.elibbadRadioClicked, "etxtbsyRadio": self.etxtbsyRadioClicked, "noprocessRadio": self.noprocessRadioClicked, "addFaultButton": self.addFaultButtonClicked, "removeButtonClicked": self.removeButtonClicked, "modeBasicToggled": self.modeBasicToggled, "modeAdvancedToggled": self.modeAdvancedToggled, "saveAs": self.saveAs, "save": self.save, "open": self.openFile, "mainDeleteEvent": self.mainDeleteEvent, "noMemoryRadio": self.noMemoryRadioClicked, "memoryEnomemRadio": self.memoryEnomemRadioClicked, "memoryEaccesRadio": self.memoryEaccesRadioClicked, "memoryEagainRadio": self.memoryEagainRadioClicked, "noRwRadio": self.noRwRadioClicked, "rwEbadfRadio": self.rwEbadfRadioClicked, "rwEioRadio": self.rwEioRadioClicked, "rwEfbigRadio": self.rwEfbigRadioClicked, "rwEnospcRadio": self.rwEnospcRadioClicked, "fileENOTDIRRadio": self.fileENOTDIRRadioClicked, "fileEBUSYRadio": self.fileEBUSYRadioClicked, "fileENOTEMPTYRadio": self.fileENOTEMPTYRadioClicked, "fileEMLINKRadio": self.fileEMLINKRadioClicked, "runAbout": self.runAbout, "textViewAllocate": self.scrollDown }) button = self.builder.get_object("termButton") button.set_sensitive(False) self.window = self.builder.get_object("mainWindow") self.window.show() # Tabulka pro chyby v pokrocilem rezimu self.faultView = self.builder.get_object("faultView") self.faultList = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN) self.faultView.set_model(self.faultList) column = gtk.TreeViewColumn("Syscall", gtk.CellRendererText(), text=0) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg1", gtk.CellRendererText(), text=1) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg2", gtk.CellRendererText(), text=2) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg3", gtk.CellRendererText(), text=3) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg4", gtk.CellRendererText(), text=4) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg5", gtk.CellRendererText(), text=5) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg6", gtk.CellRendererText(), text=6) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("Error", gtk.CellRendererText(), text=7) column.set_resizable(True) self.faultView.append_column(column) cell = gtk.CellRendererToggle() cell.set_radio(True) cell.connect("toggled", self.faultToggled, self.faultList) column = gtk.TreeViewColumn("Enable", cell, active=8) column.set_clickable(True) column.set_resizable(True) column.set_alignment(0.5) self.faultView.append_column(column) # extrakce systemovych volani a jejich navratovych hodnot extractor = SyscallExtractor() self.syscallsAndErrors = extractor.extract("syscalls") # asociativni pole pro povolene chyby od zacatku testovani # v zakladnim rezimu self.enableFault = {} self.enableFault["file"] = "NOFAULT" self.enableFault["net"] = "NOFAULT" self.enableFault["process"] = "NOFAULT" self.enableFault["memory"] = "NOFAULT" self.enableFault["rw"] = "NOFAULT" # datove typy pro chyby v pokrocilem rezimu self.faults = {} self.existedFaults = [] self.faultsStartValue = {} self.faultsEdited = False self.saveItem = self.builder.get_object("saveItem") self.saveAsItem = self.builder.get_object("saveAsItem") self.openItem = self.builder.get_object("openItem") self.saveItem.set_sensitive(False) self.saveAsItem.set_sensitive(False) self.openItem.set_sensitive(False) self.fileName = None # log pro aktualni chyby self.logText = "" self.textBuffer = self.builder.get_object("textBuffer") self.logView = self.builder.get_object("textViewLog") # jmeno systemtapoveho modulu v procfs self.moduleName = "" # jmeno aplikace a jeji argumenty self.appEntry = self.builder.get_object("appEntry") self.paramEntry = self.builder.get_object("paramEntry") # normalni nebo pokracile vkladani self.modeBasic = True frame = self.builder.get_object("frame2") frame.set_visible(False) # vkladane chyby do zakladniho modu self.basicError = {} self.basicError["file"] = { "open": ["EACCES", "ENOENT", "EMFILE", "EEXIST"], "creat": ["EACCES", "ENOENT", "EMFILE", "EEXIST"], "mkdir": ["EACCES", "ENOENT", "ENOTDIR", "EEXIST"], "mkdirat": ["EACCES", "ENOENT", "ENOTDIR", "EEXIST"], "chmod": ["EACCES", "ENOENT", "ENOTDIR"], "chmodat": ["EACCES", "ENOENT", "ENOTDIR"], "chown": ["EACCES", "ENOENT", "ENOTDIR"], "fchown": ["EACCES", "ENOENT", "ENOTDIR"], "lchown": ["EACCES", "ENOENT", "ENOTDIR"], "rmdir": ["EACCES", "ENOENT", "ENOTDIR", "EBUSY", "ENOTEMPTY"], "link": ["EACCES", "ENOENT", "ENOTDIR", "EEXIST", "EMLINK"], "linkat": ["EACCES", "ENOENT", "ENOTDIR", "EEXIST", "EMLINK"] } self.basicError["net"] = { "connect": ["ENETUNREACH", "ETIMEDOUT", "ECONNREFUSED", "EISCONN"], "send": ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "sendto": ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "sendmsg": ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "recv": ["ECONNREFUSED", "ENOTCONN"], "recvfrom": ["ECONNREFUSED", "ENOTCONN"], "recvmsg": ["ECONNREFUSED", "ENOTCONN"] } self.basicError["process"] = { "execve": ["EACCES", "ENOENT", "ENOEXEC", "ENOMEM", "ELIBBAD", "ETXTBSY"], "fork": ["ENOMEM"] } self.basicError["memory"] = { "mmap2": ["ENOMEM", "EACCES", "EAGAIN"], "munmap": ["ENOMEM", "EACCES", "EAGAIN"], "mremap": ["EAGAIN"], "mprotect": ["EACCES", "EAGAIN"], "brk": ["EAGAIN"] } self.basicError["rw"] = { "write": ["EBADF", "EIO", "EFBIG", "ENOSPC"], "read": ["EBADF", "EIO"] } # chybejici volani v zakladnim rezim self.missingSyscall = [] # zkontroluje, ktere volani v zakldnim rezimu nelze pouzit self.checkError() # stav aplikace self.progress = self.builder.get_object("progressbar") self.imageYes = self.builder.get_object("imageYes") self.imageYes.set_visible(False) self.imageNo = self.builder.get_object("imageNo") self.labelStatus = self.builder.get_object("labelStatus")
print "no command" return # otevreni vstupniho souboru # a nacteni dat (pravidel pro injection) inputData = "" try: inputFile = file(inputFilename, 'r') except IOError: print "File does not exist." return inputData = inputFile.read() inputFile.close() # extrakce systemovych volani a jejich navratovych hodnot extractor = SyscallExtractor() try: syscallsAndErrors = extractor.extract("syscalls") except: print "Error during syscalls search" return # lexikalni a syntakticka analyza vstupniho soboru s pravidly scanner = InputScanner(syscallsAndErrors) injectValues = scanner.scan(inputData) if injectValues == None: print "Bad format of input file" return # vygeneruje soubor pro systemtap generator = GenerateStap()
def __init__(self): self.injectBasicFilename = "injectBasic.stp" self.injectAdvancedFilename = "injectAdvanced.stp" self.injector = None self.controller = None self.builder = gtk.Builder() self.builder.add_from_file("fault_injection.glade") # signaly z glade souboru self.builder.connect_signals({ "exitApp" : gtk.main_quit, "browseButtonClicked": self.browseClicked, "nofileRadio" : self.nofileRadioClicked, "eacessRadio" : self.eacessRadioClicked, "enoentRadio" : self.enoentRadioClicked, "emfileRadio" : self.emfileRadioClicked, "ewouldblockRadio" : self.ewouldblockRadioClicked, "eexistRadio" : self.eexistRadioClicked, "nonetRadio" : self.nonetRadioClicked, "enetunreachRadio" : self.enetunreachRadioClicked, "etimedoutRadio" : self.etimedoutRadioClicked, "econnrefusedRadio" : self.econnrefusedRadioClicked, "econnresetRadio" : self.econnresetRadioClicked, "emsgsizeRadio" : self.emsgsizeRadioClicked, "eisconnRadio" : self.eisconnRadioClicked, "enotconnRadio" : self.enotconnRadioClicked, "startButtonClicked" : self.startButtonClicked, "termButtonClicked" : self.termButtonClicked, "eaccesProcessRadio" : self.eaccesProcessRadioClicked, "enoentProcessRadio" : self.enoentProcessRadioClicked, "enoexecRadio" : self.enoexecRadioClicked, "enomemProcessRadio" : self.enomemProcessRadioClicked, "elibbadRadio" : self.elibbadRadioClicked, "etxtbsyRadio" : self.etxtbsyRadioClicked, "noprocessRadio" : self.noprocessRadioClicked, "addFaultButton" : self.addFaultButtonClicked, "removeButtonClicked": self.removeButtonClicked, "modeBasicToggled" : self.modeBasicToggled, "modeAdvancedToggled" : self.modeAdvancedToggled, "saveAs" : self.saveAs, "save" : self.save, "open" : self.openFile, "mainDeleteEvent" : self.mainDeleteEvent, "noMemoryRadio" : self.noMemoryRadioClicked, "memoryEnomemRadio" : self.memoryEnomemRadioClicked, "memoryEaccesRadio" : self.memoryEaccesRadioClicked, "memoryEagainRadio" : self.memoryEagainRadioClicked, "noRwRadio" : self.noRwRadioClicked, "rwEbadfRadio" : self.rwEbadfRadioClicked, "rwEioRadio" : self.rwEioRadioClicked, "rwEfbigRadio" : self.rwEfbigRadioClicked, "rwEnospcRadio" : self.rwEnospcRadioClicked, "fileENOTDIRRadio" : self.fileENOTDIRRadioClicked, "fileEBUSYRadio" : self.fileEBUSYRadioClicked, "fileENOTEMPTYRadio" : self.fileENOTEMPTYRadioClicked, "fileEMLINKRadio" : self.fileEMLINKRadioClicked, "runAbout" : self.runAbout, "textViewAllocate" : self.scrollDown}) button = self.builder.get_object("termButton") button.set_sensitive(False) self.window = self.builder.get_object("mainWindow") self.window.show() # Tabulka pro chyby v pokrocilem rezimu self.faultView = self.builder.get_object("faultView") self.faultList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN) self.faultView.set_model(self.faultList) column = gtk.TreeViewColumn("Syscall", gtk.CellRendererText(), text=0) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg1", gtk.CellRendererText(), text=1) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg2", gtk.CellRendererText(), text=2) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg3", gtk.CellRendererText(), text=3) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg4", gtk.CellRendererText(), text=4) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg5", gtk.CellRendererText(), text=5) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("arg6", gtk.CellRendererText(), text=6) column.set_resizable(True) self.faultView.append_column(column) column = gtk.TreeViewColumn("Error", gtk.CellRendererText(), text=7) column.set_resizable(True) self.faultView.append_column(column) cell = gtk.CellRendererToggle() cell.set_radio(True) cell.connect("toggled", self.faultToggled, self.faultList) column = gtk.TreeViewColumn("Enable", cell, active=8) column.set_clickable(True) column.set_resizable(True) column.set_alignment(0.5) self.faultView.append_column(column) # extrakce systemovych volani a jejich navratovych hodnot extractor = SyscallExtractor() self.syscallsAndErrors = extractor.extract("syscalls") # asociativni pole pro povolene chyby od zacatku testovani # v zakladnim rezimu self.enableFault = {} self.enableFault["file"] = "NOFAULT" self.enableFault["net"] = "NOFAULT" self.enableFault["process"] = "NOFAULT" self.enableFault["memory"] = "NOFAULT" self.enableFault["rw"] = "NOFAULT" # datove typy pro chyby v pokrocilem rezimu self.faults = {} self.existedFaults = [] self.faultsStartValue = {} self.faultsEdited = False self.saveItem = self.builder.get_object("saveItem") self.saveAsItem = self.builder.get_object("saveAsItem") self.openItem = self.builder.get_object("openItem") self.saveItem.set_sensitive(False) self.saveAsItem.set_sensitive(False) self.openItem.set_sensitive(False) self.fileName = None # log pro aktualni chyby self.logText = "" self.textBuffer = self.builder.get_object("textBuffer") self.logView = self.builder.get_object("textViewLog") # jmeno systemtapoveho modulu v procfs self.moduleName = "" # jmeno aplikace a jeji argumenty self.appEntry = self.builder.get_object("appEntry") self.paramEntry = self.builder.get_object("paramEntry") # normalni nebo pokracile vkladani self.modeBasic = True frame = self.builder.get_object("frame2") frame.set_visible(False) # vkladane chyby do zakladniho modu self.basicError = {} self.basicError["file"] = { "open" : ["EACCES", "ENOENT", "EMFILE", "EEXIST"], "creat" : ["EACCES", "ENOENT", "EMFILE", "EEXIST"], "mkdir" : ["EACCES", "ENOENT", "ENOTDIR", "EEXIST"], "mkdirat" : ["EACCES", "ENOENT", "ENOTDIR", "EEXIST"], "chmod" : ["EACCES", "ENOENT", "ENOTDIR"], "chmodat" : ["EACCES", "ENOENT", "ENOTDIR"], "chown" : ["EACCES", "ENOENT", "ENOTDIR"], "fchown" : ["EACCES", "ENOENT", "ENOTDIR"], "lchown" : ["EACCES", "ENOENT", "ENOTDIR"], "rmdir" : ["EACCES", "ENOENT", "ENOTDIR", "EBUSY", "ENOTEMPTY"], "link" : ["EACCES", "ENOENT", "ENOTDIR", "EEXIST", "EMLINK"], "linkat" : ["EACCES", "ENOENT", "ENOTDIR", "EEXIST", "EMLINK"]} self.basicError["net"] = { "connect" : ["ENETUNREACH", "ETIMEDOUT", "ECONNREFUSED", "EISCONN"], "send" : ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "sendto" : ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "sendmsg" : ["ECONNRESET", "EMSGSIZE", "EISCONN", "ENOTCONN"], "recv" : ["ECONNREFUSED", "ENOTCONN"], "recvfrom" : ["ECONNREFUSED", "ENOTCONN"], "recvmsg" : ["ECONNREFUSED", "ENOTCONN"]} self.basicError["process"] = {"execve" : ["EACCES", "ENOENT", "ENOEXEC", "ENOMEM", "ELIBBAD", "ETXTBSY"], "fork" : ["ENOMEM"]} self.basicError["memory"] = {"mmap2" : ["ENOMEM", "EACCES", "EAGAIN"], "munmap" : ["ENOMEM", "EACCES", "EAGAIN"], "mremap" : ["EAGAIN"], "mprotect" : ["EACCES", "EAGAIN"], "brk" : ["EAGAIN"]} self.basicError["rw"] = {"write" : ["EBADF", "EIO", "EFBIG", "ENOSPC"], "read" : ["EBADF", "EIO"]} # chybejici volani v zakladnim rezim self.missingSyscall = [] # zkontroluje, ktere volani v zakldnim rezimu nelze pouzit self.checkError() # stav aplikace self.progress = self.builder.get_object("progressbar") self.imageYes =self.builder.get_object("imageYes") self.imageYes.set_visible(False) self.imageNo =self.builder.get_object("imageNo") self.labelStatus = self.builder.get_object("labelStatus")