Source code for pManager.modules.fileWriter
from ..dataModels.models import Port
from ..dataModels.models import Service
from .fileParser import fileParser
import os
[docs]
class WriterError(Exception):
"""Base class for exceptions in the writer module."""
def __init__(self, message, filename=None):
self.message = message
self.filename = filename
super().__init__(message)
[docs]
class fileWriter:
"""
Class for writing or updating .qpmgr files
"""
def __init__(self, filename, autoFlush = True, ignoreExtension = False):
"""
Constructor for fileWriter class
Args:
filename (str): Path to the file
autoFlush (bool): Whether to flush data to file or not
ignoreExtension (bool): Whether to ignore file extension or not
"""
self.__portNumError = WriterError('Port should be number', filename)
# Variables; consts
self.__autoFlush = autoFlush
if ignoreExtension: self.__filename = filename
else: self.__filename = filename if filename.endswith(".qpmgr") else f"{filename}.qpmgr" # Shadows filename into class scope
self.__servicesList = {} # Parsed information from .qpmgr file w/service as key
self.__stateTable = {"O" : True, "C" : False}
self.__serviceRecordMask = "$SERVICE -- $PORTSINFO || $SERVICEDESCRIPTION"
self.__fileHeader = \
"""\
#====================== firewall allowed ports ======================#
# #
# |--------------------------------------------------------------| #
# | HINT | #
# | | #
# | Use pManager to work with .qpmgr files or follow pattern | #
# |--------------------------------------------------------------| #
# | ScriptReadable Pattern | #
# | | #
# | Service -- TCP/UDP::port[1-N]::O/C::PortDescr || ServiceDesc | #
# |--------------------------------------------------------------| #
# #
#====================================================================#
"""
if os.path.exists(self.__filename):
fp = fileParser(self.__filename)
existingServicesList = fp.getPlainServiceList()
for _ in existingServicesList.keys():
self.constructServiceObj(_, existingServicesList[_]['description'], existingServicesList[_]['ports'])
def __flushFile(self):
"""
Flushes data to file
"""
with open(self.__filename, 'w') as file:
file.write(self.__fileHeader)
for srv in self.__servicesList.keys():
file.write(self.__serviceRecordMask.replace('$SERVICE', srv, 1)
.replace('$PORTSINFO', self.__servicesList[srv].generatePortConfig(), 1)
.replace('$SERVICEDESCRIPTION', self.__servicesList[srv].getServiceDescription(), 1) + '\n'
)
[docs]
def constructServiceObj(self, serviceName, serviceDescription ="No description", portList=None) -> Service:
"""
Creates service object and adds it to the list
Args:
serviceName (str): Name of the service
serviceDescription (str): Description of the service
portList (dict): Dictionary of ports, where key is port number and value is port object
Returns:
Service (pManager.dataModels.models.Service): Created service object
"""
srv = Service(serviceName=serviceName, serviceDescription=serviceDescription, portList=portList)
self.addService(srv)
return srv
[docs]
def bindPortToService(self, serviceName, portNum, portProto, openState, portDesc ="No description") -> Port:
"""
Binds port to existing service
Args:
serviceName (str): Name (key) of the service
portNum (int): Port number
portProto (str): Protocol of the port
openState (bool): State of the port
portDesc (str): Description of the port
Returns:
Port (pManager.dataModels.models.Port): Port object that was created
"""
port = Port(serviceName, portNum, portProto, openState, portDesc)
self.addPort(port)
return Port(serviceName, portNum, portProto, openState, portDesc)
[docs]
def addService(self, serviceObj: Service):
"""
Adds service to the list
Args:
serviceObj (pManager.dataModels.models.Service): Service object
Raises:
WriterError: If the service object is not of type Service
"""
if type(serviceObj) == Service:
self.__servicesList[serviceObj.getServiceName()] = serviceObj
else:
raise WriterError("Wrong type of object passed to addService method", self.__filename)
[docs]
def addPort(self, portObj: Port):
"""
Adds port to existing service
Args:
portObj (pManager.dataModels.models.Port): Port object
Raises:
WriterError: If the port object is not of type Port
"""
if type(portObj) == Port:
if self.__servicesList[portObj.getServiceName()].isPortsAdded:
self.__servicesList[portObj.getServiceName()].addPortToService(portObj.getPortAsJson())
else:
self.__servicesList[portObj.getServiceName()].addPortToService(portObj.getPortAsJson())
if self.__autoFlush: self.__flushFile()
else:
raise WriterError("Wrong type of object passed to addPort method", self.__filename)
[docs]
def getServiceList(self):
"""
Returns dictionary of services
Returns:
dict: Dictionary of services
"""
return self.__servicesList
[docs]
def writeToFile(self):
"""
Writes service list to file
"""
self.__flushFile()