src package¶
Subpackages¶
Submodules¶
CANalyzat0r.AboutTab module¶
Created on Jun 26, 2017
@author: pschmied
-
class
AboutTab.AboutTab¶ Bases:
objectThis class handles the logic of the about tab.
-
static
browseGitHub(event)¶ Opens the SCHUTZWERK website.
- Parameters
event – Dummy, not used.
-
static
browseSW(event)¶ Opens the SCHUTZWERK website.
- Parameters
event – Dummy, not used.
-
static
prepareUI()¶ This just sets up the GUI elements.
-
static
CANalyzat0r.CANData module¶
CANalyzat0r.CANalyzat0r module¶
CANalyzat0r.ComparerTab module¶
Created on Jun 30, 2017
@author: pschmied
-
class
ComparerTab.ComparerTab(tabWidget)¶ Bases:
AbstractTab.AbstractTabThis handles the logic of the comparer tab.
-
__init__(tabWidget)¶ This just sets data and adds click handlers.
-
compare()¶ Compares
rawPacketSet1andrawPacketSet2and display the packet they have in common on the GUI.
-
getPacketSet(rawPacketList)¶ Opens a
PacketsDialogto load selected packets into the passed raw packet list.- Parameters
rawPacketList – The raw packet list
-
setPacketSet1()¶ Opens a
PacketsDialogto load packet set 1 intorawPacketSet1.
-
setPacketSet2()¶ Opens a
PacketsDialogto load packet set 2 intorawPacketSet2.
-
CANalyzat0r.Database module¶
The database model is as follows:
Note: The bold columns are NOT NULL
Created on May 17, 2017
@author: pschmied
-
class
Database.Database¶ Bases:
objectThis class handles the database connection and is responsible for creating, deleting and updating values
-
__init__()¶ - This method does the following things:
Setup logging
Create a DB connection and check the integrity
Create tables if necessary
-
checkDB()¶ Checks if all the table count of the SQLite database matches the needed table count. If the check does pass the user will be notified to create a project if no project is exisiting yet. If the check does not pass the user will be prompted for an action: - Truncate the database and create an empty one - Keep the database and exit
- Returns
A boolean value indicating the database integrity status (True = good)
-
connect()¶ Connect to the hard coded SQLite database path (see Settings).
Note: If a DatabaseError is encountered, the application will close with error code 1
- Returns
A SQLite3 connection object
-
createTables()¶ Creates all needed tables. Check
DatabaseStatementsfor the SQL statements.
-
deleteFromTableByID(tableName, id)¶ Delete a row from a table with a specific ID.
- Parameters
tableName – The table to delete from
id – ID of the record to delete
-
deleteFromTableByValue(tableName, column, value)¶ Delete rows from a table with a specific value.
- Parameters
tableName – The table to delete from
column – The column to check
value – The value to search for
-
deleteKnownPacket(knownPacket)¶ Delete a KnownPacket object
- Parameters
knownPacket – The KnownPacket object to delete
- Returns
-
deletePacketSet(packetSet)¶ Delete a PacketSet along with the associated packets
- Parameters
packetSet – The PacketSet object to delete
- Returns
-
deleteProjectAndData(project)¶ Delete a project and all associated data.
- Parameters
project – The Project object to delete
-
getKnownPackets(project=None)¶ Get all known packets of a Project as objects. Uses the global project if no project is given.
- Parameters
project – Optional parameter to specify the project to use
- Returns
A list of all known packets as KnownPacket objects
-
getOverallTableCount(tableName)¶ Returns the count(*) of a table.
- Parameters
tableName – The table to count the rows of
- Returns
The number of rows as integer
-
getPacketSets(project=None)¶ Get all packet sets of a Project as objects. Uses the global project if no project is given.
- Parameters
project – Optional parameter to specify the project to use
- Returns
A list of all known packets as PacketSet objects
-
getPacketsOfPacketSet(packetSet, raw=False)¶ Get all packets of a specific packet set. Note: Use raw=True for better performance.
- Parameters
packetSet – All returned packets will belong to this packet set
raw – Boolean value to indicate if the packets will be returned as raw data list (True) or as list of objects (False)
- Returns
Depending on the value of raw: - True: List of value lists (raw data) - False: List of Packet objects
-
getProjects()¶ Get all available projects as Project objects.
- Returns
A list of all projects as Project objects
-
saveKnownPacket(knownPacket)¶ Save a known packt to the database.
- Parameters
knownPacket – The KnownPacket object to save
- Returns
The database ID of the saved known packet
-
savePacket(packet=None, packetSetID=None, CANID=None, data=None, timestamp='', iface='', commit=True)¶ Save a packet to the database: Either by object Oo by list-values –> Faster for many values If the value in packet is not None: The passed object will be used Else: The seperate values will be used
- Parameters
packet – Optional parameter: Packet object to save
packetSetID – PacketSet ID of the saved packet
CANID – CAN ID
data – Payload data
timestamp – Timestamp
iface – The interface the packet was captured from
commit – If the operation will be commite to the database or not. Batch operations use commit=False
- Returns
The database ID of the saved packet if commit is True. Else -1
-
savePacketSet(packetSet)¶ Save a PacketSet to the database. If there’s a name collision, the user will be prompted for a new and unique name.
- Parameters
packetSet – The PacketSet to save
-
savePacketSetWithData(packetSetName, rawPackets=None, project=None, packets=None)¶ Save a packet set in the database with the given data. If no project is given, the global project will be used. You must specifiy
rawPacketsorpackets.- Parameters
packetSetName – The desired name of the PacketSet
rawPackets – Optional: Raw Packet data (List of lists). You can also use
packets.project – Optional parameter to specify a project. If this is not specified, the selected project will be used
packets – Optional; List of packet objects to save to the packet set. If this is specified,
rawPacketswill be ignored
- Returns
-
savePacketsBatch(packetSetID, rawPackets=None, packets=None)¶ Save many packets as a batch to the database. Use this for improved speed: No objects, only 1 commit.
- Parameters
packetSetID – The PacketSet ID the packets belong to
rawPackets – Optional: Packet data as raw data list (List of lists)
packets – Optional: List of packet objects to save. If this is not None, this will be used instead of
rawPackets
-
saveProject(project)¶ Save a Project objet to the database
- Parameters
project – The project to save
- Returns
The assigned database ID
-
updateKnownPacket(knownPacket)¶ Update a known packet object in the database
- Parameters
knownPacket – The KnownPacket object which holds the updated values
- Returns
-
updatePackets(rowList, packetSet, packetIDsToRemove)¶ Update the packets of a specific packet set
- Parameters
rowList – A list containing raw packet data e.g.:
[[("CANID", "232"), ("DATA", "BEEF"), packetID], [("DATA", "C0FFEE"), ("CANID", "137"), packetID]]packetSet – The PacketSet object the data in rowList belongs to
packetIDsToRemove – Database IDs of packets to remove
-
updateProject(project)¶ Update a Project object in the database.
- Parameters
project – The Project object which holds the updated values
-
-
class
Database.DatabaseStatements¶ Bases:
objectThis class is used to store and generate database statements.
-
checkTablesPresentStatement= "SELECT name FROM sqlite_master WHERE type='table'"¶ Statement which gets the names of all currently available tables in the database to check the integrity
-
createKnownPacketTableStatement= 'CREATE TABLE `KnownPacket` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`ProjectID`\tINTEGER NOT NULL,\n\t`CANID`\tTEXT NOT NULL,\n\t`Data`\tTEXT,\n\t`Description`\tTEXT NOT NULL,\n\tFOREIGN KEY(ProjectID) REFERENCES Project(ID)\n );'¶
-
createPacketSetTableStatement= 'CREATE TABLE `PacketSet` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`ProjectID`\tINTEGER NOT NULL,\n\t`Name`\tTEXT NOT NULL,\n\t`Date`\tTEXT NOT NULL,\n\tUNIQUE(ProjectID, Name),\n\tFOREIGN KEY(ProjectID) REFERENCES Project(ID)\n );'¶ Note: Unique index for the combination of Project ID and Name –> A PacketSets name is unique for a project
-
createPacketTableStatement= 'CREATE TABLE `Packet` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`PacketSetID`\tINTEGER NOT NULL,\n\t`CANID`\tTEXT NOT NULL,\n\t`Data`\tTEXT,\n\t`Timestamp`\tTEXT,\n\t`Interface`\tTEXT,\n\tFOREIGN KEY(PacketSetID) REFERENCES PacketSet(ID)\n );'¶
-
createProjectTableStatement= 'CREATE TABLE `Project` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`Name`\tTEXT NOT NULL UNIQUE,\n\t`Description`\tTEXT,\n\t`Date`\tTEXT NOT NULL\n );'¶ Project names are unique
-
createTableStatementsList= ['CREATE TABLE `Project` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`Name`\tTEXT NOT NULL UNIQUE,\n\t`Description`\tTEXT,\n\t`Date`\tTEXT NOT NULL\n );', 'CREATE TABLE `Packet` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`PacketSetID`\tINTEGER NOT NULL,\n\t`CANID`\tTEXT NOT NULL,\n\t`Data`\tTEXT,\n\t`Timestamp`\tTEXT,\n\t`Interface`\tTEXT,\n\tFOREIGN KEY(PacketSetID) REFERENCES PacketSet(ID)\n );', 'CREATE TABLE `PacketSet` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`ProjectID`\tINTEGER NOT NULL,\n\t`Name`\tTEXT NOT NULL,\n\t`Date`\tTEXT NOT NULL,\n\tUNIQUE(ProjectID, Name),\n\tFOREIGN KEY(ProjectID) REFERENCES Project(ID)\n );', 'CREATE TABLE `KnownPacket` (\n\t`ID`\tINTEGER PRIMARY KEY,\n\t`ProjectID`\tINTEGER NOT NULL,\n\t`CANID`\tTEXT NOT NULL,\n\t`Data`\tTEXT,\n\t`Description`\tTEXT NOT NULL,\n\tFOREIGN KEY(ProjectID) REFERENCES Project(ID)\n );']¶ Holds all needed create table statements
-
static
getDeleteByIDStatement(tableName, id)¶ Returns an SQL delete statement using an ID where clause using
getDeleteByValueStatement()- Parameters
tableName – The table name to delete from
id – Desired ID value for the where clause
- Returns
The resulting SQL statement
e.g.:
DELETE FROM TABLE1 WHERE ID = 1337
-
static
getDeleteByValueStatement(tableName, column, value)¶ Returns an SQL delete statement using a where clause using
getDeleteByValueStatement()- Parameters
tableName – The table name to delete from
column – Desired column for the where clause
value – Desired column value for the where clause
- Returns
The resulting SQL statement
e.g.:
DELETE FROM TABLE1 WHERE NAME = 'BANANA'
-
static
getInsertKnownPacketStatement(projectID, CANID, data, description)¶ Returns an SQL insert statement for a KnownPacket using
getInsertStatement().- Parameters
projectID – The project this KnownPacket belongs to
CANID – CAN ID
data – Payload data
description – What this specific Packet does
- Returns
The SQL insert statement with all KnownPacket specific values set
-
static
getInsertPacketSetStatement(projectID, name, date)¶ Returns an SQL insert statement for a PacketSet using
getInsertStatement().- Parameters
projectID – The project ID the record belongs to
name – The name of the PacketSet
date – Date
- Returns
The SQL insert statement with all PacketSet specific values set
-
static
getInsertPacketStatement(packetSetID, CANID, data, timestamp, iface)¶ Returns an SQL insert statement for a Packet using
getInsertStatement().- Parameters
packetSetID – The PacketSet this Packet belongs to
CANID – CAN ID
data – Payload data
timestamp – Timestamp of the packet
iface – Interface name from which this packet was captured from
- Returns
The SQL insert statement with all Packet specific values set
-
static
getInsertProjectStatement(name, desription, date)¶ Returns an SQL insert statement for a project using
getInsertStatement().- Parameters
name – Projectname
desription – Project description
date – Project date
- Returns
The SQL insert statement with all project specific values set
-
static
getInsertStatement(tableName, columnList, valuesList)¶ Builds a SQL insert statement using the passed parameters
- Parameters
tableName – The table name to insert into
columnList – List of column names that will be affected
valuesList – List of values to put into the columns
- Returns
An SQL insert statement with the desired values mapped to the columns
e.g.
INSERT INTO TABLE1 (col1, col2) VALUES (1, 2)
-
static
getOverallCountStatement(tableName)¶ Returns an SQL select count statement for the desired table using all rows
- Parameters
tableName – The table name to get the rowcount from
- Returns
The resulting SQL statement
e.g.:
SELECT COUNT(*) FROM TABLE1
-
static
getSelectAllStatement(tableName)¶ Returns an SQL select statement to get all data from a table.
- Parameters
tableName – The table name from which data will be selected
- Returns
The resulting SQL select statement
e.g.:
SELECT * FROM TABLE1
-
static
getSelectAllStatementWhereEquals(tableName, column, value)¶ Returns an SQL select statement to gather all data from a table using a where clause
- Parameters
tableName – The table name from which data will be selected
column – The column which the where clause affects
value – The desired value of the column
- Returns
The resulting SQL statement with where clause
e.g.:
SELECT * FROM TABLE1 WHERE ID = 1337
-
static
getUpdateByIDStatement(tableName, colValuePairs, ID)¶ Builds a SQL update statement using the passed parameters and an ID
- Parameters
tableName – The table name to update
colValuePairs – List of tuples: (column, desired value)
ID – The ID of the record to update
- Returns
An SQL update statement with the desired values mapped to the columns using the ID
e.g.
UPDATE TABLE1 SET col1 = 1, col2 = 2 WHERE ID = 1337
-
knownPacketTableCANIDColName= 'CANID'¶
-
knownPacketTableDataColName= 'Data'¶
-
knownPacketTableDescriptionColName= 'Description'¶
-
knownPacketTableName= 'KnownPacket'¶
-
packetSetTableName= 'PacketSet'¶
-
packetTableCANIDColName= 'CANID'¶
-
packetTableDataColName= 'Data'¶
-
packetTableName= 'Packet'¶
-
projectTableDescriptionColName= 'Description'¶
-
projectTableName= 'Project'¶
-
projectTableNameColName= 'Name'¶
-
tableCount= 4¶ The Amount of tables that must be present
-
CANalyzat0r.FilterTab module¶
Created on Jun 02, 2017
@author: pschmied
-
class
FilterTab.DataAdderThread(snifferReceivePipe, sharedEnabledFlag, curSampleIndex)¶ Bases:
PySide.QtCore.QThreadThis thread receives data from the sniffer process and emits a signal which causes the main thread to add the packets.
-
__init__(snifferReceivePipe, sharedEnabledFlag, curSampleIndex)¶ Initialize self. See help(type(self)) for accurate signature.
-
frameToList(frame)¶ Converts a received can.Message frame to raw list data. After that, the data is emitted using
signalSniffedPacket- Parameters
frame – can.Message CAN frame
-
run()¶ As long as
sharedEnabledFlagis not set to0data will be received using the pipe and processed usingframeToList().
-
signalSniffedPacket= <PySide.QtCore.Signal object>¶ Emit a signal to the main thread when items are ready to be added This emits the packet and the current sample index
-
staticMetaObject= <PySide.QtCore.QMetaObject object>¶
-
-
class
FilterTab.FilterTab(tabWidget)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the filter tab
-
__init__(tabWidget)¶ Initialize self. See help(type(self)) for accurate signature.
-
addSniffedNoise(dummyIndex, packet)¶ Adds the passed packet data to
noiseData. This method gets called by a DataAdderThread.- Parameters
dummyIndex – Not used, only exists to match the signature defined in the signal of the DataAdderThread
packet – The packet object to extract and add data from
-
addSniffedPacketToSample(curSampleIndex, packet)¶ Adds a sniffed packet to the sample defined by
curSampleIndex. Gets called by a DataAdderThread.- Parameters
curSampleIndex – The sample index to get a list from
rawData[curSampleIndex]packet – Packet data to add
- Returns
-
analyze(removeNoiseWithIDAndData=True)¶ - Analyze captured data:
Remove sorted noise data (if collected): For each sample: - Sort the sample to increase filtering speed - Remove noise
Find relevant packets: - Sort each sample to increase filtering speed - Assume that all packets of the first sample occurred in every other sample - Take every other sample and compare
Depending on
removeNoiseWithIDAndDatanoise will be filtered by ID and data (default) or ID only- Parameters
removeNoiseWithIDAndData – Optional value: Filter data by ID and Data or ID only
-
clear(returnOldPackets=False)¶ Clear the currently displayed data on the GUI and in the lists.
-
collectNoise(seconds)¶ Collect noise data and update
noiseData. Uses the processes/threads started instartSnifferAndAdder().- Parameters
seconds – Amount of seconds to capture noise
- Returns
True if noise was captured. False if the user pressed “Cancel”
-
getSampleData(sampleAmount, curSampleIndex)¶ Collect sample data and add the sniffed data to
rawData[curSampleIndex]. Uses the processes/threads started usingstartSnifferAndAdder().- Parameters
sampleAmount – Amount of samples to collect
curSampleIndex – Index of the currently captured sample in
rawData
-
noiseData= None¶ Noise that will be substracted from the collected data
-
outputRemainingPackets(remainingPackets)¶ Output all remaining packets after filtering to the table view. Note: This also clears previous data
- Parameters
remainingPackets – Raw packet list to display
Shared process independent flag to terminate the data adder
Shared process independent flag to terminate the sniffer process
-
startFilter()¶ - Handle the filtering process:
Collect noise
Record sample data
Analyze captured data
-
startSnifferAndAdder(adderMethod, curSampleIndex=-1)¶ Start a DataAdderThread and a SnifferProcess to collect data. They will communicate using a multiprocess pipe to collect data without interrupting the GUI thread.
- Parameters
adderMethod – The DataAdderThread will call this method to handle the received data
curSampleIndex – The index of the currently captured sample (-1 as default)
-
stopSnifferAndAdder()¶ Stop the DataAdderThread and SnifferProcess using the shared integer variable.
-
toggleGUIElements(state)¶ {En, Dis}able all GUI elements that are used to change filter settings
- Parameters
state – Boolean value to indicate whether to enable or disable elements
-
updateNoiseCollectProgress(progressDialog, value)¶ Update the text and progressbar value displayed while collecting noise.
- Parameters
progressDialog – The QProgressDialog to update
value – The value to set the progressbar to
-
CANalyzat0r.FuzzerTab module¶
Created on May 31, 2017
@author: pschmied
-
class
FuzzerTab.FuzzerTab(tabWidget)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the fuzzer tab
-
IDMask= None¶ The ID is 8 chars max. - initialize it with only X chars
-
IDMaskChanged()¶ This allows changing the ID mask values on the fly because a new value will only be set if the new value is valid.
-
IDMaxValue= None¶ Default: allow the max value of extended frames
-
__init__(tabWidget)¶ Initialize self. See help(type(self)) for accurate signature.
-
addPacket(valueList, addAtFront=True, append=True, emit=True, addToRawDataOnly=False)¶ Override the parents class method to add packets at front and to update the counter label
-
clear(returnOldPackets=False)¶ Clear the currently displayed data on the GUI and in the rawData list
- Parameters
returnOldPackets – If this is true, then the previously displayed packets will be returned as raw data list
- Returns
Previously displayed packets as raw data list (if returnOldPackets is True), else an empty list
-
dataMask= None¶ The data is 16 chars max.
-
dataMaskChanged()¶ This allows changing the data mask values on the fly because a new value will only be set if the new value is valid.
-
dataMaxLength= None¶ This length corresponds the length when interpreted as bytes
-
fuzzSenderThread= None¶ Sending takes place in a loop in a separate thread
-
fuzzingModeChanged()¶ This gets called if the ComboBox gets changed to update the active fuzzing mode. The other GUI elements will be set and enabled depending on the selected mode.
-
fuzzingModeComboBoxValuePairs= None¶ These values will be available in the fuzzing mode ComboBox
-
generateRandomPacket()¶ This generates a random can.Message object using
tryBuildPacket()- Returns
can.Message object with random data (random ID, data length and data)
-
itemAdderThread= None¶ Adding items also takes place in a separate thread to avoid blocking the GUI thread
-
packetBuildErrorCount= None¶ Used to avoid spamming the log box when the user specified wrong parameters while sending
-
prepareUI()¶ Prepare the tab specific GUI elements, add keyboard shortcuts and set a CANData instance
-
sliderChanged()¶ This method gets called if one of the two length sliders (min. and max. value) are changed.
dataMinLengthanddataMaxLengthwill be directly updated and available to a running FuzzerThread.
-
toggleFuzzing()¶ - This starts and stops fuzzing.
Starting: - Input values are read and validated - ItemAdderThread and FuzzSenderThread (see
FuzzSenderThread) are started - Some GUI elements will be disabledStopping: - The threads will be disabled - Disabled GUI elements will be enabled again
-
toggleGUIElements(state)¶ {En, Dis}able all GUI elements that are used to change fuzzer settings
- Parameters
state – Boolean value to indicate whether to enable or disable elements
-
toggleLoopActive()¶ If there is a FuzzerThread sending then the tab title will be red.
-
validateDataMaskInput()¶ - Validates the user specified data mask:
The length must be <= 16
It must be a valid hex string
Value will be padded to 16 chars (8 bytes)
- Returns
A validated data mask or None if it’s not possible to validate the input
-
validateIDMaskInput()¶ - Validates the user specified ID mask:
The length must be either 3 or 8
It must be a valid hex string
Has to be < 0x1FFFFFFF which is the max. value for extended frames
- Returns
A validated ID mask or None if it’s not possible to validate the input
-
CANalyzat0r.Globals module¶
Created on May 17, 2017
@author: pschmied
-
Globals.CANData= None¶ Instance to interact with the bus
-
Globals.db= None¶ Object to handle db connections
-
Globals.knownPackets= {}¶ Stores all known packets for the current project Key: CAN ID and data concatenated and separated with a “#” Value: Description
-
Globals.project= None¶ Manage the currently selected project
-
Globals.textBrowserLogs= None¶ Display logs in the GUI
-
Globals.ui= None¶ The general UI
CANalyzat0r.ItemAdderThread module¶
Created on May 18, 2017
@author: pschmied
-
class
ItemAdderThread.ItemAdderThread(receivePipe, tableModel, rawData, useTimestamp=True)¶ Bases:
PySide.QtCore.QThreadThis thread receives data from a process and emits a signal which causes the main thread to add the packets to the table.
-
__init__(receivePipe, tableModel, rawData, useTimestamp=True)¶ Initialize self. See help(type(self)) for accurate signature.
-
appendRow= <PySide.QtCore.Signal object>¶ Emit a signal to the main thread when items are ready to be added Parameters: valueList
-
frameToRow(frame)¶ Converts a can.Message object to a raw value list. This list will be emitted using the signal
appendRowalong with the table data and rawData list.- Parameters
frame – can.Message CAN frame
-
run()¶ As long as the thread is enabled: Receive a frame from the pipe and pass it to
frameToRow().
-
staticMetaObject= <PySide.QtCore.QMetaObject object>¶
-
CANalyzat0r.KnownPacket module¶
Created on May 22, 2017
@author: pschmied
-
class
KnownPacket.KnownPacket(id, projectID, CANID, data, description)¶ Bases:
objectThis class is being used to handle known packet data. It’s more comfortable to use a object to pass data than to use lists and list indexes. Please note that this costs much more performance, so please use lists if you have to deal with much data.
-
__init__(id, projectID, CANID, data, description)¶ Initialize self. See help(type(self)) for accurate signature.
-
static
fromJSON(importJSON)¶ This class method creates a KnownPacket object using a JSON string.
- Parameters
importJSON – The JSON string containing the object data
- Returns
A KnownPacket object with the values set accordingly
-
toComboBoxString()¶ Calculate a string that will be displayed in a ComboBox
- Returns
String representation of a KnownPacket object
-
toJSON()¶ To export a KnownPacket, all data is being formatted as JSON. The internal attribute __dict__ is being used to gather the data. This data will then be formatted.
- Returns
The formatted JSON data of the object
-
CANalyzat0r.Logger module¶
Created on May 17, 2017
@author: pschmied
-
class
Logger.LogHandler¶ Bases:
logging.HandlerTo manage different log levels and custom logging to the log box/text browser, this class is needed.
-
__init__()¶ Initializes the instance - basically setting the formatter to None and the filter list to empty.
-
emit(record)¶ This checks to loglevel and also logs to log box/text browser.
- Parameters
record – The record to log
-
CANalyzat0r.MainTab module¶
Created on May 22, 2017
@author: pschmied
-
class
MainTab.MainTab¶ Bases:
objectThis class handles the logic of the main tab
-
static
FDCheckboxChanged()¶ Clickhandler for the FD CheckBox which causes the FD SpinBox to be toggled
-
static
VCANCheckboxChanged()¶ Clickhandler for the VCAN CheckBox which causes the SpinBox to be toggled.
-
static
addApplicationStatus(status)¶ Add a new status to the status bar by name (ordered). If no status is present, it will display
Strings.statusBarReady- Parameters
status – The new status to add
-
static
addVCANInterface()¶ Manually add a virtual CAN interface. This uses a syscall to
ip link. If this call succeeds, a new CANDataInstance will be created usingcreateCANDataInstance(). The detected CAN interfaces will be refreshed, too.
-
static
applyGlobalInterfaceSettings()¶ Set the currently selected interface as the global interface. Also, the bitrate will be updated and GUI elements will be toggled. The CANData instances of all inactive tabs will also be set to the global interface.
-
static
applyLogLevelSetting()¶ Set the minimum logging level to display messages for.
-
static
detectCANInterfaces(updateLabels=True)¶ Detect CAN and VCAN interfaces available in the system. A syscall to
/sys/class/netis being used for this. For every detected interface a new CANData instance will be created usingcreateCANDataInstance().Also, interface labels and the global interface ComboBox will be updated.
- Parameters
updateLabels – Whether to update the interface labels or not
-
static
easterEgg(event)¶ Nothing to see here :return: fun
-
static
loadKernelModules()¶ Load kernel modules to interact with CAN networks (
canandvcan).
-
logger= <Logger CANalyzat0r.MainTab (DEBUG)>¶ The tab specific logger
-
static
populateProjects(keepCurrentIndex=False)¶ This populates the project ComboBox in the main tab.
- Parameters
keepCurrentIndex – If this is set to True, the previously selected index will be re-selected in the end
-
static
prepareUI()¶ Setup the status bar
Detect CAN interfaces and preselect the VCAN CheckBox
Populate project ComboBoxes
Add the logo
-
static
preselectUseBitrateCheckBox()¶ Preselect the FD and VCAN CheckBox states.
-
static
removeApplicationStatus(status)¶ Remove a status from the status bar. For statuses with multiple possible values (e.g.
Sending (X Threads)the search will be done using a substring search- Parameters
status – The status to remove
- Returns
-
static
removeVCANInterface()¶ This removes the currently selected VCAN interface. This uses a syscall to
ip link. If the removed interface was the current global interface, the global interface will become None. :return:
-
static
setGlobalInterfaceStatus(red=False)¶ Sets the text of the global interface status in the status bar. If the global CANData instance is None then the text will read “None”.
- Parameters
red – Optional; If this is set to True, the text will appear red. Else black.
-
static
setProject(wasDeleted=False, setNone=False)¶ This sets the current project to the currently selected project in the corresponding ComboBox. Also, the status bar and project specific ComboBoxes and GUI Elements will be updated.
- Parameters
wasDeleted – This is set to True if the current selected project was deleted. This causes
Globals.projectto become None, too.wasNull – This is set to True, if the project has to be set to None. Default: False
-
static
setProjectStatus(projectName, red=False)¶ Sets the text of the project status in the status bar.
- Parameters
projectName – The text to put as the new project name
red – Optional; If this is set to True, the text will appear red. Else black.
-
static
setupStatusBar()¶ Add labels to the status bar and prepare it.
-
statusBarActiveStatuses= []¶ These text will appear in the status bar
-
statusBarApplicationStatus= None¶ Statusbar labels
-
statusBarInterface= None¶
-
statusBarProject= None¶
-
static
updateVCANButtons()¶ Update the text of the buttons to add and remove VCAN interfaces.
-
static
CANalyzat0r.ManagerTab module¶
Created on May 22, 2017
@author: pschmied
-
class
ManagerTab.ManagerTab(tabWidget)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the manager tab
-
__init__(tabWidget)¶ Initialize self. See help(type(self)) for accurate signature.
-
addKnownPacket(CANID=None, data=None, description=None)¶ Save a known packet to the current project (and database) Default: Get values from the GUI elements. But you can also specify the values using the optional parameters.
- Parameters
CANID – Optional: CAN ID
data – Optional: Payload data
description – Optional: Description of the known packet
- Returns
-
clear(returnOldPackets=False)¶ Clear the GUI table displaying PacketSets along with data lists.
-
createDump(rawPackets=None)¶ Save a new dump to the database. This creates a new PacketSet along with associated Packet objects. If only one packet is saved, the user will be asked if he wants to create a known packet entry for the just saved packet.
- Parameters
rawPackets – Optional: If this is not None, the values from
rawPacketswill be used instead of the data that is currently being displayed in the GUI table.
-
createProject()¶ Create a new project and save it to the database. This also updates the project ComboBoxes.
-
deleteDump()¶ Delete the currently selected PacketSet from the database. This also re-populates the table with the data of another dump (if existing)
-
deleteProject()¶ Delete a project along with associated data. This also updates the project ComboBoxes.
-
dumpsRowIDs= None¶ Kepps track between the association of table row <-> database id of the packet e.g. row 2 - database ID 5
-
editKnownPacket()¶ Update a known packet with new specified values.
-
editProject()¶ Update a project with new specified values.
-
exportProject()¶ Export a project as JSON string to a textfile. The
toJSON()method is called for every object to be exported.
-
getDump()¶ Display the data of the selected PacketSet in the GUI table. This also updates
rawData
-
getKnownPacketsForCurrentProject()¶ (Re-)Populate the dictionary
Globals.knownPacketswith up-to-date data. If no project is set, the dictionary will be cleared only.
-
handleCopy()¶ Pass the copy event to the Toolbox, but only if no data is being loaded
-
handlePaste()¶ Pass the paste event to the Toolbox, but only if no data is being loaded
-
importProject()¶ Import a project from a JSON file. The
fromJSON()method of every class is called to re-create objects.
-
loadingData= None¶ Disallow copying while loading data
-
populateKnownPacketEditLineEdits()¶ Sets the GUI elements concerning editing known packets to the current selected known packet data.
-
populateKnownPackets(keepCurrentIndex=False)¶ Populate the known packet ComboBoxex (delete and edit).
- Parameters
keepCurrentIndex – Optional: Reselect a specific KnownPacket in the ComboBox
-
populatePacketSets(IDtoChoose=None)¶ Populate the dumps ComboBox in the dumps tab. Reloading dump data is being handled by the triggered event
- Parameters
IDtoChoose – Optional: Preselect a specific PacketSet in the ComboBox
-
populateProjectEditLineEdits()¶ Sets the GUI elements concerning editing projects to the current selected project data.
-
populateProjects(keepCurrentIndex=False)¶ Populate the project ComboBoxes (delete, Edit, export project).
- Parameters
keepCurrentIndex – If this is set to True, the previously selected index will be reselected
-
prepareUI()¶ Prepare the tab specific GUI elements, add keyboard shortcuts and set a CANData instance
-
removeKnownPacket()¶ Remove a known packet from the current project (and the database)
-
removeSelectedPackets()¶ Pass the remove requested event to the super class. After that, add the database IDs of the deleted packets to
dumpsDeletedPacketIDs. The deleted rows will be removed fromdumpsRowIDs, too.
-
saveToFile()¶ Save the packets in the GUI table to a file in SocketCAN format.
-
updateDump()¶ Users can change the data displayed in the GUI table. This method allows the changed data to be saved to the database.
-
CANalyzat0r.Packet module¶
Created on May 19, 2017
@author: pschmied
-
class
Packet.Packet(packetSetID, CANID, data, timestamp='', iface='', length=None, id=None)¶ Bases:
objectThis class is being used to handle packet data. It’s more comfortable to use a object to pass data than to use lists and list indexes. Please note that this costs much more performance, so please use lists if you have to deal with much data.
-
__init__(packetSetID, CANID, data, timestamp='', iface='', length=None, id=None)¶ The parameters
CANIDanddatamust be valid hex strings. If length is not specified, it will be calculated automatically.
-
static
fromJSON(importJSON)¶ This class method creates a Packet object using a JSON string.
- Parameters
importJSON – The JSON string containing the object data
- Returns
A packet object with the values set accordingly
-
static
getDisplayDataLength(CANID, hexData)¶ This makes sure that the displayed length is correct. If CANID is empty, the length will also be empty. If the length if hexData is odd, the length will read “INVALID” which prevents saving to the database. Else the length will be the amount of chars / 2
- Parameters
CANID – CAN ID
hexData – Payload data as hex string
- Returns
The correct length as string
-
lengthStringToInt(string)¶ This makes sure that the specified length is an int :return: The length as integer (if possible) - else None by exception) :raises ValueError if the length isn’t an integer
-
toJSON()¶ To export a Packet, all data is being formatted as JSON. The internal attribute __dict__ is being used to gather the data. This data will then be formatted.
- Returns
The formatted JSON data of the object
-
CANalyzat0r.PacketsDialog module¶
Created on Jun 23, 2017
@author: pschmied
-
class
PacketsDialog.PacketsDialog(packets=None, rawPacketList=None, returnPacketsAsRawList=True)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the “manage packets” dialog. For example, this can be found in the
SnifferTabElement.-
__init__(packets=None, rawPacketList=None, returnPacketsAsRawList=True)¶ This basically just sets data and reads the widget from the
.uifile.- Parameters
packets – Optional: List that contains the elements that will be pre loaded into the GUI table in the following format:
<CAN ID>#<Data>. This is used for theSnifferTabElementrawPacketList – Optional: Raw packet list that contains the elements that will be pre loaded into the GUI table. If this is specified,
packetswill be ignored.returnPacketsAsRawList – Boolean value indicating whether the displayed packets will be returned as raw packet list. If this is False, the values will be returned as list in the following format:
<CAN ID>#<Data>.
-
displayUniquePackets(IDOnly=False)¶ Filter the currently displayed data for unique packets and display them on the table. :param IDOnly: If this is True, only the ID will be matched to compare data. This allows wildcard ignores.
-
getUniqueIDs()¶ Filters all unique IDs out of
rawDataand displays them on the GUI table. Unique ID means that the data column will be ignored and left blank for wildcard ignores. This usesdisplayUniquePackets().
-
getUniquePackets()¶ Filters all unique packets out of
rawDataand displays them on the GUI table. This usesdisplayUniquePackets().
-
static
getUniqueRawPackets(rawPacketList)¶ Helper method to extract unique raw packets out of a given raw packet list which has been cleaned before (Only necessary data fields are present, all others are set to an empty string)
- Parameters
rawPacketList – The cleaned list of raw packets
- Returns
A list of unique raw packet lists
-
open()¶ Show the widget, extract data and return it
- Returns
Raw packet list if the user didn’t press Cancel and if
returnPacketsAsRawListis True. Else: list of values of the following form:<CAN ID>#<Data>if the user didn’t press Cancel. Else None.
-
prepareUI()¶ Prepare the GUI elements and add keyboard shortcuts. Also, pre populate the table
-
CANalyzat0r.PacketSet module¶
Created on May 19, 2017
@author: pschmied
-
class
PacketSet.PacketSet(id, projectID, name, date=None)¶ Bases:
objectThis class is being used to handle packet set data. It’s more comfortable to use a object to pass data than to use lists and list indexes. Please note that this costs much more performance, so please use lists if you have to deal with much data.
-
__init__(id, projectID, name, date=None)¶ The date of a PacketSet will be automatically set to the current date as string
-
static
fromJSON(importJSON)¶ This class method creates a PacketSet object using a JSON string.
- Parameters
importJSON – The JSON string containing the object data
- Returns
A PacketSet object with the values set accordingly
-
toComboBoxString()¶ Calculate a string that will be displayed in a ComboBox
- Returns
String representation of a PacketSet object
-
toJSON()¶ To export a PacketSet, all data is being formatted as JSON. The internal attribute __dict__ is being used to gather the data. This data will then be formatted.
- Returns
The formatted JSON data of the object
-
CANalyzat0r.PacketTableModel module¶
Created on May 31, 2017
@author: pschmied
-
class
PacketTableModel.PacketTableModel(parent, dataList, header, readOnlyCols, IDColIndex=1, dataColIndex=2, lengthColIndex=3, timestampColIndex=4, descriptionColIndex=5, *args)¶ Bases:
PySide.QtCore.QAbstractTableModel,PySide.QtCore.QObjectA custom TableModel is needed to allow efficient handling of many values.
-
__init__(parent, dataList, header, readOnlyCols, IDColIndex=1, dataColIndex=2, lengthColIndex=3, timestampColIndex=4, descriptionColIndex=5, *args)¶ Initialize self. See help(type(self)) for accurate signature.
-
appendRow(dataList=[], addAtFront=False, emit=True, resolveDescription=False)¶ Inserts the
dataListlist intoself.dataListto add a whole row with values at once.- Parameters
dataList – The list containing data. The length must be equal to
rowCount().addAtFront – Values will be added to the front of
self.dataListif this is True. Else: They will be appended at the endemit – Optional: If the GUI will be notified of the data change or not. This is used for batch imports where the GUI isn’t notified after each row to increase speed Default: True (Emit everytime)
resolveDescription – If this is set to True, the description of the potential known packet will be resolved. Default: False
- Returns
The description of the known packet. If
resolveDescriptionis False, an empty string is returned. Else None.
This also emits the
dataChangedandlayoutChangedsignals to let the GUI know that the data/layout has been changed.
-
appendRows(rowList, addAtFront=False, resolveDescriptions=True)¶ This allows appending a whole set of rows at once using the best possible speed
- Parameters
rowList – List of raw data lists to append
addAtFront – Values will be added to the front of
self.dataListif this is True. Else: They will be appended at the endresolveDescriptions – If this is set to true, the description for every packet will be resolved. Default: True
- Returns
If
resolveDescriptionsis True, a list of known packet descriptions will be returned. If no description for a particular packet can be resolved, an empty string will be inserted in the list to keep indexes. Else None will be returned
-
cellChanged= <PySide.QtCore.Signal object>¶ Emits rowIndex and columnIndex of the changed cell
-
clear()¶ Clears all managed data from the
dataList. This is a shortcut tosetRowCount()with parameter0.
-
columnCount(parent=None)¶ Returns the current column count by returning the length of the header list.
- Parameters
parent – Dummy parameter to keep the needed signature
- Returns
The column count as integer
-
data(index, role)¶ Return managed data depending on the
roleparameter.- Parameters
index – Index object containing row and column index
role – The display role that requests data
- Returns
If the index is invalid: None
AlignCenterifrole = TextAlignmentRoleColumn data if
role = DisplayRoleorEditRole
-
flags(index)¶ Return the flags for cell at a given index.
- Parameters
index – Index object containing row and column index
- Returns
A flags object containing whether an object is editable, selectable or enabled
-
getValue(rowIndex, colIndex)¶ Get the data from the table at the given indexes.
- Parameters
rowIndex – Row index
colIndex – Column index
- Returns
The data at the specified index (if possible); Else None
-
headerData(headerIndex, orientation, role)¶ Returns the header data to properly display the managed data on the GUI.
- Parameters
headerIndex – Which column of the data is requested
orientation –
This can be either
HorizontalorVertical:Horizontal: Return a value fromself.headerVertical: Return theheaderIndex
role – This is always expected to be
DisplayRole
- Returns
See
orientation. None is returned iforientationorroledo not match
-
insertRow(dataList=[])¶ This is just an alias to
appendRow()for compatibility.- Parameters
dataList – A list that stores the data that will be added
-
removeRow(rowIndex)¶ Removes the specified row from the table model. This also emits the
layoutChangedsignal to let the GUI know that the layout has been changed.- Parameters
rowIndex – The row index to delete
-
removeRows(rowIndexes)¶ Remove multiple rows at once.
- Parameters
rowIndexes – The rows that will be deleted
-
rowCount(parent=None)¶ Returns the current row count by returning the length of the data list.
- Parameters
parent – Dummy parameter to keep the needed signature
- Returns
The row count as integer
-
setData(index, value, role=PySide.QtCore.Qt.ItemDataRole.EditRole)¶ This gets called to change the element on the GUI at the given indexes This also emits the
layoutChangedsignal to let the GUI know that the layout has been changed.- Parameters
index – Index object containing row and column index
value – The new value
role – Optional: The role calling this method. Default: EditRole
- Returns
True if the operation succeeded
-
setRowCount(count)¶ Sets the row count by removing lines / adding empty lines. This also emits the
layoutChangedsignal to let the GUI know that the layout has been changed.- Parameters
count – The desired amount of rows
-
setText(rowIndex, colIndex, data)¶ Sets the text of at the given indexes. If
datais None the text will be an empty string. This method also emits thedataChangedandlayoutChangedsignals to let the GUI know that the data/layout has been changed.- Parameters
rowIndex – Row index
colIndex – Column index
data – New data for the column
-
sort(colIndex, order)¶ Sort the data by given column number. This also emits the
layoutChangedsignal to let the GUI know that the layout has been changed.- Parameters
colIndex – The column index to sort for
order – Either
DescendingOrderorAscendingOrder
-
staticMetaObject= <PySide.QtCore.QMetaObject object>¶
-
CANalyzat0r.Project module¶
Created on May 19, 2017
@author: pschmied
-
class
Project.Project(id, name, description)¶ Bases:
objectThis class is being used to handle project data. It’s more comfortable to use a object to pass data than to use lists and list indexes. Please note that this costs much more performance, so please use lists if you have to deal with much data.
-
__init__(id, name, description)¶ This just sets the attributes to the passed parameters.
-
static
fromJSON(importJSON)¶ This class method creates a project object using a JSON string.
- Parameters
importJSON – The JSON string containing the object data
- Returns
A project object with the values set accordingly
-
toComboBoxString()¶ Calculate a string which will be displayed in the ComboBoxes.
- Returns
String representation of the object
-
toJSON()¶ To export a Project, all data is being formatted as JSON. The internal attribute __dict__ is being used to gather the data. This data will then be formatted.
- Returns
The formatted JSON data of the object
-
CANalyzat0r.SearcherTab module¶
Created on May 17, 2017
@author: pschmied
-
class
SearcherTab.SearcherTab(tabWidget)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the filter tab
-
__init__(tabWidget)¶ Initialize self. See help(type(self)) for accurate signature.
-
askActionPerformed()¶ Ask the user if the action has been performed using a MessageBox
- Returns
True if the user pressed yes, else False
-
askWhichAction()¶ - Ask the user what to do if no chunk worked:
Try again
Re-test the current last working chunk
Cancel
- Returns
An integer value indicating the pressed button: - 0 if the user wants to try again - 1 if the user wants to re-test - 2 if the user wants to cancel
-
beep()¶ To play a sound after sending has been finished.
-
clear(returnOldPackets=False)¶ Clear the GUI table and all associated data lists
-
downwardsSearch= None¶ We first search downwards in the binary search tree. If this doesn’t succeed, we use randomization and begint to search upwards.
-
enterWhenReady()¶ Block the GUI thread until the user pressed the button on the MessageBox.
-
lastWorkingChunk= None¶ The currently smallest known set of packets that cause a specific action. Values are lists with raw data
-
outputRemainingPacket(packet)¶ Show the passed packet on the GUI table.
- Parameters
packet – The raw packet to display
-
outputRemainingPackets(rawPackets)¶ Show all passed packets on the GUI table. Note: This also sets
rawDatato the passed set of packets.- Parameters
packet – List of raw packets to display
-
searchPackets()¶ - This starts the whole searching routine and sets up things first:
Set a CANData instance
Get user input values
Walk down the binary search tree: Try to find a specific packet for an action
If 1 packet has been found: output the packet
If not: Get the last working chunk of packets that worked. Use shuffling and new values for the chunk amount to find a minimal set of packets
-
sendAndSearch(chunkAmount=2)¶ - Use the remaining data to search for relevant packets:
Setup a progress bar
Split the raw packet list in the desired amount of chunks
Test each chunk (Newest packets first) and ask the user if it worked
If it worked: Set
lastWorkingChunkto the last tested chunk and return TrueElse: Return False if all other chunks failed too.
- Parameters
chunkAmount – The amount of chunks to generate from the given data list
- Returns
True if a specific chunk worked, else False
-
splitLists(lst, chunkAmount=2)¶ Split a list into a specific amount of chunks
- Parameters
lst – The list to split
chunkAmount – Desired amount of chunks
- Returns
List of chunks (List of lists in this case)
-
toggleGUIElements(state)¶ {En, Dis}able all GUI elements that are used to change searcher settings
- Parameters
state – Boolean value to indicate whether to enable or disable elements
-
CANalyzat0r.SenderTab module¶
Created on May 22, 2017
@author: pschmied
-
class
SenderTab.SenderTab¶ Bases:
objectThis class handles the logic of the sender tab. Subtabs are being handled in
SenderTabElement.-
CANData= None¶ The tab specific CANData instance
-
active= False¶
-
static
addSender(senderTabName=None)¶ Appends a new sender tab to the sub tab bar.
- Parameters
senderTabName – Optional; The displayed name of the tab. If this is None, the user is requested to enter a name
-
static
addSenderWithData(listOfRawPackets=None, listOfPackets=None)¶ Uses
addSender()to add a new sender tab with data already filled in into the GUI table. You must specifylistOfRawPacketsorlistOfPackets. If both are specified,listOfRawPacketswill be used.- Parameters
listOfRawPackets – Optional; List of raw packets to add to the table.
listOfPackets – Optional; List of packet objects to add to the table.
- Returns
-
currentlySendingTabs= 0¶ Used to handle the font color of the sender tab
-
classmethod
handleInterfaceSettingsDialog()¶ This invokes
handleInterfaceSettingsDialog()for the class
-
indexInMainTabBar= 2¶ The index of the sender tab in the main tab bar
-
labelInterfaceValue= None¶
-
logger= <Logger CANalyzat0r.SenderTab (DEBUG)>¶ The tab specific logger
-
static
prepareUI()¶ Prepare the tab specific GUI elements, add sender tab and keyboard shortcuts. Also set a CANData instance.
-
static
removeSender(senderTabElement)¶ Remove a sender from the sub tab bar. This method gets called from an instance of
SenderTabElementbyremoveSender().- Parameters
senderTabElement – The
SenderTabElementinstance to remove
-
static
sendSinglePacket()¶ Sends a single packet using the specified interface. All packet values are read from the GUI elements.
-
senderTabs= []¶ Consinsts of all SenderTabElements
-
classmethod
setInitialCANData()¶ This invokes
setInitialCANData()for the class
-
static
toggleActive()¶ If there is at least one tab sending then the tab bar title will be red.
-
static
toggleGUIElements(state)¶ {En, Dis}able all GUI elements that are used to change filter settings
- Parameters
state – Boolean value to indicate whether to enable or disable elements
-
classmethod
updateCANDataInstance(CANDataInstance, delegate=False)¶ This invokes
updateCANDataInstance()for the class- Parameters
CANDataInstance – The new CANData instance
delegate – Boolean indicating if all sender sub tabs will be updated too. Default: False
-
classmethod
updateInterfaceLabel()¶ This invokes
updateInterfaceLabel()for the class
-
CANalyzat0r.SenderTabElement module¶
Created on May 23, 2017
@author: pschmied
-
class
SenderTabElement.SenderTabElement(tabWidget, tabName)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the sender sub tab. The main tab is being handled in
SenderTab.-
__init__(tabWidget, tabName)¶ Set all passed data. Also, add the own send button to
SenderTab.sendButtonListto allow managing it globally.- Parameters
tabWidget – The element in the tab bar. Not the table widget.
-
amountThreadsRunning= 0¶ Amount of sending threads running to display in the status bar
-
getTabIndex()¶ Get the current tab index of the sub tab element
- Returns
The tab index of the sender tab
-
loopSenderThread= None¶ The thread that runs when sending takes place in a loop
-
prepareUI()¶ Prepare the tab specific GUI elements, add keyboard shortcuts and set a CANData instance
-
removeSender()¶ This gets called when the remove sender button is pressed on the sub tab. This stops the sender thread and calls the parents method (
removeSender()) to remove the sender form the tab bar.
-
sendAll()¶ Send all packets in the GUI table. By default, this just sends the packet once using simple calls. If the user requests to send the packets in a loop, an instance of
LoopSenderThreadis being used to send the packets. Also, GUI elements like the status bar are being updated.
-
sendButtonList= []¶ Static attribute of send buttons to manage {en, dis}abled states
-
setSendButtonState(state)¶ This sets the enabled state of the send button.
- Parameters
state – The desired enabled state as boolean value
-
stopSending()¶ This stops the currently running instance of
LoopSenderThreadfrom sending. Also, GUI elements like the status bar are being updated.
-
toggleGUIElements(state)¶ {En, Dis}able all GUI elements that are used to change filter settings
- Parameters
state – Boolean value to indicate whether to enable or disable elements
-
toggleLoopActive()¶ Toggles the current sub tab to (in)active. This also calls
toggleActive()to manage the color of the main tab (parent tab).
-
updateStatusBar()¶ Updates the status bar label to display the correct amount of sending tabs (if any)
-
CANalyzat0r.SenderThread module¶
Created on Jun 08, 2017
@author: pschmied
-
class
SenderThread.FuzzSenderThread(sleepTime, fuzzerSendPipe, CANData, threadName)¶ Bases:
PySide.QtCore.QThreadSpawns a new thread that will send random data in a loop.
-
__init__(sleepTime, fuzzerSendPipe, CANData, threadName)¶ Initialize self. See help(type(self)) for accurate signature.
-
disable()¶ This sets the
enabledflag to False which causes the main loop to terminate.
-
run()¶ Send the packets in a loop and wait accordingly until the thread is disabled.
-
staticMetaObject= <PySide.QtCore.QMetaObject object>¶
-
-
class
SenderThread.LoopSenderThread(packets, sleepTime, CANData, threadName)¶ Bases:
PySide.QtCore.QThreadSpawns a new thread that will send the passed packets in a loop.
-
__init__(packets, sleepTime, CANData, threadName)¶ Initialize self. See help(type(self)) for accurate signature.
-
disable()¶ This sets the
enabledflag to False which causes the main loop to terminate.
-
run()¶ Send the packets in a loop and wait accordingly until the thread is disabled.
-
staticMetaObject= <PySide.QtCore.QMetaObject object>¶
-
CANalyzat0r.Settings module¶
Created on May 17, 2017
@author: pschmied
-
Settings.APP_NAME= 'CANalyzat0r'¶ The application name
-
Settings.APP_VERSION= '1.0'¶ The application version
-
Settings.DB_NAME= '../data/database.db'¶ The relative path of the SQLite database file
-
Settings.DB_PATH= '../data/database.db'¶ Optionally we can specify a different database path
-
Settings.FORKME_PATH= './ui/icon/forkme.png'¶ Where to find the “Fork Me” icon
-
Settings.GITHUB_URL= 'https://github.com/schutzwerk/CANalyzat0r'¶ Where to find this project in GitHub
-
Settings.ICON_PATH= './ui/icon/icon.png'¶ Where to find the app icon
-
Settings.LOGO_PATH= './ui/icon/swlogo_small.png'¶ Where to find the company logo
CANalyzat0r.SnifferProcess module¶
Created on May 18, 2017
@author: pschmied
-
class
SnifferProcess.SnifferProcess(snifferSendPipe, sharedEnabledFlag, snifferName, CANData=None)¶ Bases:
multiprocessing.context.ProcessSpawn a new process that will sniff packets from the specified CANData instance. Captured data will be transmitted via the
snifferSendPipe.-
__init__(snifferSendPipe, sharedEnabledFlag, snifferName, CANData=None)¶ Set the passed parameters.
- Parameters
snifferSendPipe – The multiprocessing pipe to send received data to
sharedEnabledFlag – The multiprocessing value to handle disabling
snifferName – The name of the sniffer process, used for logging
CANData – Optional: The CANData instance to query for data. If this is not specified, the global interface is being used
-
run()¶ As long as the process hasn’t been disabled: Read a frame using
readPacketAsync()and transmit the received can.Message object via the pipe.
-
CANalyzat0r.SnifferTab module¶
Created on May 18, 2017
@author: pschmied
-
class
SnifferTab.SnifferTab¶ Bases:
objectThis class handles the logic of the sniffer tab. Subtabs are being handled in
SnifferTabElement.-
static
addSniffer(snifferTabName)¶ Appends a new sniffer tab to the sub tab bar.
- Parameters
snifferTabName – The displayed name of the tab. Normally, this corresponds to the CAN interface the tab is managing
-
static
clearAndAddPlaceholder()¶ Add a placeholder where normally sniffer tabs are displayed
-
indexInMainTabBar= 1¶ The index of the sniffer tab in the main tab bar
-
logger= <Logger CANalyzat0r.SnifferTab (DEBUG)>¶ The tab specific logger
-
static
prepareUI()¶ This adds a placeholder of no instance of
SnifferTabElementwas created previously.
-
static
removeSniffer(snifferTabElement=None, snifferTabName=None)¶ Remove a sniffer from the sub tab bar. This method gets called from an instance of
SnifferTabElementbyremoveSender(). One can either specifysnifferTabElementorsnifferTabNameto delete a tab. If both are used, the object parameter is used.- Parameters
senderTabElement – Optional: The
SnifferTabElementinstance to removesnifferTabName – Optional: The name of the
SenderTabElementinstance to remove
-
snifferTabs= {}¶ Consinsts of all SnifferTabElements, interface names as key
-
static
toggleActive()¶ If there is at least one tab sniffing then the tab bar title will be red.
-
classmethod
updateInterfaceLabel()¶ This invokes
updateInterfaceLabel()every sniffer tab
-
static
CANalyzat0r.SnifferTabElement module¶
Created on Jun 16, 2017
@author: pschmied
-
class
SnifferTabElement.SnifferTabElement(tabWidget, tabName, ifaceName=None)¶ Bases:
AbstractTab.AbstractTabThis class handles the logic of the sniffer sub tab. The main tab is being handled in
SnifferTab.-
__init__(tabWidget, tabName, ifaceName=None)¶ Set parameters and initialize the CANData instance
- Parameters
tabWidget – The element in the tab bar. Not the table widget.
tabName – The name of the tab
ifaceName – Optional: The interface name. If this is None, then the
tabNamewill be used
-
addPacket(valueList, addAtFront=True, append=True, emit=True, addToRawDataOnly=False, ignorePacketRate=False)¶ Override the parents method to add packets at front and to update the counter label. If too much data is received, the data will be added after sniffing to prevent freezes. Also, only add packets if the data isn’t present in
self.ignoredPackets- Parameters
ignorePacketRate – Additional optional parameter: Boolean value indicating whether the rate of packets per second will be ignored or not. This is set to False by Default. We need to set it to True to process
self.valueListafter sniffing if too much data was received.
-
amountThreadsRunning= 0¶ Amount of sniffing threads running to display in the status bar
-
clear(returnOldPackets=False)¶ Clear the currently displayed data on the GUI and in the lists.
- Parameters
returnOldPackets – Optional: If this is True then the previously displayed data will be returned as raw data list. Default is False
-
getPacketCount()¶ This uses a call to
/sys/class/net/<ifaceName>/statistics/rx_packetsto return the number of total received packets of the current interface- Returns
Received packet count of the current interface as itneger
-
handleInterfaceSettingsDialog(allowOnlyOwnInterface=True)¶ Override the parents method to only allow the currently set CAN interface
-
handleManageIgnoredPacketsDialog()¶ Open a dialog to manage ignored packets when sniffing
-
removeSniffer()¶ This gets called when associated interface disappears after a re-check. This stops the sniffer thread and calls the parents method (
removeSender()) to remove the sniffer form the tab bar.
-
tabIndex()¶ Get the current tab index of the sub tab element
- Returns
The tab index of the sniffer tab
-
terminateThreads()¶ This stops the processes/threads called
snifferProcessanditemAdderThread. Also, the CANData instance will be set to inactive and GUI elements will be toggled.
-
toggleActive()¶ Toggles the current sub tab to (in)active. This also calls
toggleActive()to manage the color of the main tab (parent tab).
-
toggleSniffing()¶ This starts and stops sniffing for a specific sniffer tab. Instances of
ItemAdderThreadandSnifferProcessare used to gather and display data.
-
updateStatusBar()¶ Updates the status bar label to display the correct amount of sniffer tabs (if any)
-
CANalyzat0r.Toolbox module¶
Created on May 22, 2017
@author: pschmied
-
class
Toolbox.Toolbox¶ Bases:
objectThis calls offers helpful static methods that every tab can use to unify program logic and simplify code.
-
static
askUserConfirmAction()¶ Spawns a MessageBox that asks the user to confirm an action
- Returns
True if the user has clicked on Yes, else False
-
static
checkProjectIsNone(project=-1)¶ Checks if a project is
Noneand displays a MessageBox if True.- Parameters
project – Optional. The project to check. Default: -1 wich causes the global project to be checked
- Returns
Boolean value indicating whether the checked project is
None
-
static
getKnownPacketDescription(CANID, data)¶ Get a description for a known packet. This will use the dictionary defined in
Globalsto find data- Parameters
CANID – CAN ID
data – Data
- Returns
The description if one can be found, else an empty string
-
static
getPacketDictIndex(CANID, data)¶ Calculates the index of a packet with a specific CAN ID and data in a dictionary.
- Parameters
CANID – CAN ID
data – Data
- Returns
The index of a packet in a dictionary
-
static
getSaveFileName(dialogTitle)¶ Spawns a “save file dialog” to get a file path to save to.
- Parameters
dialogTitle – The displayed dialog title
- Returns
The file path of the selected file
-
static
getWorkingDialog(text)¶ Generates a working dialog object which blocks the UI.
- Parameters
text – Text to display while working
- Returns
The created working dialog widget
-
interfaceDialogWidget= None¶ The dialog widget to set the interface settings
-
static
interfaceSettingsDialog(currentCANData, CANDataOverrideValues=None)¶ Handles the logic of the interface settings dialog.
- Parameters
CANDataOverrideValues – Optional: List of CANData instances that will be selectable instead of all values.
- Returns
A new CANData instances with the selected values. None if no editable CANData instance exists
-
static
interfaceSettingsDialogCheckBoxChanged(state)¶ Gets called when the use VCAN CheckBox of the interface dialog gets changed to handle the enabled state of the bitrate SpinBox
- Parameters
state – Not used, state is determined by
isChecked
-
static
interfaceSettingsDialogComboBoxChanged()¶ Gets called when the interface ComboBox of the interface dialog gets changed to pre-populate the GUI elements accordingly.
-
static
interfaceSettingsDialogFDCheckBoxChanged(state)¶ Gets called when the “use FD” CheckBox of the interface dialog gets changed to handle the enabled state of the FD bitrate SpinBox
- Parameters
state – Not used, state is determined by
isChecked
-
static
isHexString(hexString)¶ Checks if a hexString is a valid hex string of base 16
- Parameters
hexString – The hex string
- Returns
Boolean value indicating the correctness of the hex string
-
logger= <Logger CANalyzat0r.Toolbox (DEBUG)>¶ The toolbox also has its own logger instance
-
mp3Processes= {}¶ Used to keep track of the processes that play mp3 files. Key = filepath, value: multiprocessing Process object
-
static
playMP3(filePath)¶ Plays an mp3 sound file using ffmpeg
- Parameters
filePath – Path of the mp3 file
-
static
populateInterfaceComboBox(comboBoxWidget, reselectCurrentItem=True, ignoreActiveInstances=False)¶ Inserts all available interface values into the passed ComboBox widget
- Parameters
comboBoxWidget – The GUI element to fill with items
reselectCurrentItem – Optional: If this is true, the previously selected index will be re-selected Default: True
-
static
stopMP3(filePath)¶ Stops the playback of a given mp3 file :param filePath: Path of the mp3 file
-
static
tableExtractAllRowData(table)¶ Get all contents of a GUI table
- Parameters
table – The
QTableViewobject to gather data from- Returns
A list of raw row data –> List of lists
-
static
tableExtractSelectedRowData(table)¶ Get the selected contents of a GUI table
- Parameters
table – The
QTableViewobject to gather data from- Returns
A list of raw row data –> List of lists
-
static
toggleDisabledProjectGUIElements()¶ This toggles specific GUI elements that should only be active if a project has been selected
-
static
toggleDisabledSenderGUIElements()¶ This toggles specific GUI elements that should only be active if a CANData instance is present
-
static
updateCANDataInstances(CANDataInstance)¶ Calls
updateCANDataInstancefor every tab.- Parameters
CANDataInstance – The new CANData instance
-
static
updateInterfaceLabels()¶ Calls
updateInterfaceLabelfor every tab.
-
static
widgetFromUIFile(filePath)¶ Reads an
.uifile and creates a new widget object from it.- Parameters
filePath – Where to find the
.uifile- Returns
The new created widget
-
static
yesNoBox(title, text)¶ Spawns a MessageBox that asks the user a Yes-No question.
- Returns
True if the user has clicked on Yes, else False
-
static
CANalyzat0r.mainWindow module¶
CANalyzat0r.AbstractTab module¶
Created on Jun 26, 2017
@author: pschmied
-
class
AbstractTab.AbstractTab(tabWidget, loggerName, readOnlyCols, packetTableViewName, labelInterfaceValueName=None, CANData=None, hideTimestampCol=True, sendToSenderContextMenu=True, saveAsPacketSetContextMenu=True, allowTableCopy=True, allowTablePaste=True, allowTableDelete=True)¶ Bases:
objectThis is a base class for most tabs. If you’re using a tab that uses the following things, you can use this class: - Non-static tab - you create instances from it - a QTableView to display data -
rawDataas raw packet list - Copy, paste and/or delete actions by shortcuts and context menusJust take care of
packetTableViewNameandlabelInterfaceValueNameas they’re necessary for this to work.-
CANData= None¶ The tab specific CANData instance
-
__init__(tabWidget, loggerName, readOnlyCols, packetTableViewName, labelInterfaceValueName=None, CANData=None, hideTimestampCol=True, sendToSenderContextMenu=True, saveAsPacketSetContextMenu=True, allowTableCopy=True, allowTablePaste=True, allowTableDelete=True)¶ Initialize self. See help(type(self)) for accurate signature.
-
active= None¶ Whether the tab is currently active (using
CANData)
-
addPacket(valueList, addAtFront=False, append=True, emit=True, addToRawDataOnly=False)¶ Add a packet to the GUI table.
- Parameters
valueList – Packet data as raw value list
addAtFront – Optional. Indicates whether the packets will be inserted at the start of
rawData. Default: Falseappend – Optional. Indicates whether data will be added to
self.rawDataor not. Default: Trueemit – Optional. Indicates whether the GUI will be notified using signals. Default: True
addToRawDataOnly – Optional. Indicates whether only
self.rawDatawill be updated, ignoring the packet table model. Default: False
-
applyNewKnownPackets()¶ Apply new known packets which have been saved in the mean time. This reloads the packets into the GUI table.
-
clear(returnOldPackets=False)¶ Clear the currently displayed data on the GUI and in the rawData list
- Parameters
returnOldPackets – If this is true, then the previously displayed packets will be returned as raw data list
- Returns
Previously displayed packets as raw data list (if returnOldPackets is True), else an empty list
-
handleCellChanged(rowIndex, colIndex)¶ To update the rawData element and to put the length of the changed data field into the length field.
- Parameters
rowIndex – The changed row
colIndex – The changed column
- Returns
-
handleCopy()¶ Handle copying selected rows from a GUI table. This copies the raw data list to the clipboard.
-
handleInterfaceSettingsDialog(allowOnlyOwnInterface=False)¶ Open a dialog to change interface settings and set the updated CANData instance.
- Parameters
allowOnlyOwnInterface – If this is true, you can only edit the CANData instance that is already selected for the current tab. This is being used for the sniffer tabs.
-
handlePaste()¶ Handle pasting rows into a GUI table. Data is being gathered from the clipboard and be of the following types: - Raw data list (list of lists which consist of column data) - Parsing takes place asynchronously - SocketCAN format (see
SocketCANFormat)
-
handleRightCick()¶ This spawns a custom context menu right next to the cursor if a user has right clicked on a table cell.
-
loggerName= None¶ The tab specific logger
-
manualAddPacket()¶ Manually add an empty packet row to the GUI table. This also updates
rawData.
-
packetTableModel= None¶ Custom packet model of the GUI table
-
prepareUI()¶ Prepare the tab specific GUI elements, add keyboard shortcuts and set a CANData instance
-
rawData= None¶ Raw packet data that corresponds to the data displayed in the GUI table
-
readOnlyCols= None¶ Tab specific read only columns as list of indexes
-
removeSelectedPackets()¶ Remove selected rows from a table and also delete those rows from a
rawDatalist. :return: A list of indexes of the removed rows. None if no rows have been selected
-
setInitialCANData()¶ Try to get initial an initial CANData instance. This method also updates GUI elements.
- Returns
A boolean value which indicates the success
-
tabWidget= None¶ The specific GUI tab
-
toggleGUIElements(state)¶
-
updateCANDataInstance(CANDataInstance)¶ Updates the tab specific CANData instance to the passed parameter. This only takes place if the tab is not active to prevent errors. This also calls
updateInterfaceLabel()to update the label.- Parameters
CANDataInstance – The new CANData instance
-
updateInterfaceLabel()¶ Set the text of the interface label to the updated value, if the label is present. Uses the text “None” if no interface is set.
-