Example #1
0
    def __init__(self, sourlient):

        AFTNPaths.normalPaths(sourlient.name)
        PXPaths.normalPaths()
        self.sysman = SystemManager()                      # General system manager
        self.sourlient = sourlient                         # Sourlient (Source/Client) object containing configuration infos.

        self.logger = sourlient.logger                     # Logger object
        self.subscriber = sourlient.subscriber             # Determine if it will act like a subscriber or a provider(MHS)
        self.host = sourlient.host                         # Remote host (name or ip)
        self.portR = sourlient.portR                       # Receiving port
        self.portS = sourlient.portS                       # Sending port
        
        self.batch = sourlient.batch                       # Number of files we read in a pass (20)
        self.timeout = sourlient.timeout                   # Timeout time in seconds (default = 10 seconds)
        self.sleepBetweenConnect = int('10')               # Time (in seconds) between connection trials 
        self.slow = sourlient.slow                         # Sleeps are added when we want to be able to decrypt log entries
        self.igniter = None                                # Igniter object (link to pid)

        self.writePath = AFTNPaths.RECEIVED                # Where we write messages we receive
        self.archivePath = AFTNPaths.SENT                  # Where we put sent messages
        self.specialOrdersPath = AFTNPaths.SPECIAL_ORDERS  # Where we put special orders

        # Paths creation
        self.sysman.createDir(PXPaths.TXQ + self.sourlient.name)
        self.sysman.createDir(self.writePath)
        self.sysman.createDir(self.archivePath)
        self.sysman.createDir(self.specialOrdersPath)


        self.mm = MessageManager(self.logger, self.sourlient)  # AFTN Protocol is implemented in MessageManager Object
        self.remoteAddress = None                          # Remote address (where we will connect())
        self.socket = None                                 # Socket object
        self.dataFromFiles = []                            # A list of tuples (content, filename) obtained from a DiskReader 

        self.reader = DiskReader(PXPaths.TXQ + self.sourlient.name, self.sourlient.batch,
                                 self.sourlient.validation, self.sourlient.diskReaderPatternMatching,
                                 self.sourlient.mtime, True, self.logger, eval(self.sourlient.sorter), self.sourlient)
        
        self.debug = True  # Debugging switch
        self.justConnect = False  # Boolean that indicates when a connexion just occur
        
        self.totBytes = 0

        #self.printInitInfos()
        self.makeConnection()
Example #2
0
    def mergeTwoDict(dict1, dict2):
        from SystemManager import SystemManager
        """
        dict1 and dict2 must be of the following form:
        dict1 = {'toto': [item1, item2, ...], 'titi':[item1], ...}
        dict2 = {'toto': [item3, ...], 'tata':[item4], ...}
        newDict = {'toto': [item1, item2, item3, ...], 'titi':[item1], 'tata':[item4], ...}
        """
        newDict = {}
        keys1 = dict1.keys(); keys2 = dict2.keys()
        keys = keys1 + keys2
        keys = SystemManager.removeDuplicate(keys)
        keys.sort()

        for key in keys:
            for dict in [dict1, dict2]:
                if dict.get(key, None):
                    newDict.setdefault(key, []).extend(dict.get(key))
        return newDict
Example #3
0
    def mergeTwoDict(dict1, dict2):
        from SystemManager import SystemManager
        """
        dict1 and dict2 must be of the following form:
        dict1 = {'toto': [item1, item2, ...], 'titi':[item1], ...}
        dict2 = {'toto': [item3, ...], 'tata':[item4], ...}
        newDict = {'toto': [item1, item2, item3, ...], 'titi':[item1], 'tata':[item4], ...}
        """
        newDict = {}
        keys1 = dict1.keys()
        keys2 = dict2.keys()
        keys = keys1 + keys2
        keys = SystemManager.removeDuplicate(keys)
        keys.sort()

        for key in keys:
            for dict in [dict1, dict2]:
                if dict.get(key, None):
                    newDict.setdefault(key, []).extend(dict.get(key))
        return newDict
Example #4
0
class TransceiverAFTN:
    """
    When started, a subscriber AFTN will listen on a port (56550), whishing to be
    connected by the AFTN provider. If this does not happen rapidly enough (before 
    the timeout expires), the subscriber will try to connect (port 5160) to the 
    provider.
    """
    def __init__(self, sourlient):

        AFTNPaths.normalPaths(sourlient.name)
        PXPaths.normalPaths()
        self.sysman = SystemManager()                      # General system manager
        self.sourlient = sourlient                         # Sourlient (Source/Client) object containing configuration infos.

        self.logger = sourlient.logger                     # Logger object
        self.subscriber = sourlient.subscriber             # Determine if it will act like a subscriber or a provider(MHS)
        self.host = sourlient.host                         # Remote host (name or ip)
        self.portR = sourlient.portR                       # Receiving port
        self.portS = sourlient.portS                       # Sending port
        
        self.batch = sourlient.batch                       # Number of files we read in a pass (20)
        self.timeout = sourlient.timeout                   # Timeout time in seconds (default = 10 seconds)
        self.sleepBetweenConnect = int('10')               # Time (in seconds) between connection trials 
        self.slow = sourlient.slow                         # Sleeps are added when we want to be able to decrypt log entries
        self.igniter = None                                # Igniter object (link to pid)

        self.writePath = AFTNPaths.RECEIVED                # Where we write messages we receive
        self.archivePath = AFTNPaths.SENT                  # Where we put sent messages
        self.specialOrdersPath = AFTNPaths.SPECIAL_ORDERS  # Where we put special orders

        # Paths creation
        self.sysman.createDir(PXPaths.TXQ + self.sourlient.name)
        self.sysman.createDir(self.writePath)
        self.sysman.createDir(self.archivePath)
        self.sysman.createDir(self.specialOrdersPath)


        self.mm = MessageManager(self.logger, self.sourlient)  # AFTN Protocol is implemented in MessageManager Object
        self.remoteAddress = None                          # Remote address (where we will connect())
        self.socket = None                                 # Socket object
        self.dataFromFiles = []                            # A list of tuples (content, filename) obtained from a DiskReader 

        self.reader = DiskReader(PXPaths.TXQ + self.sourlient.name, self.sourlient.batch,
                                 self.sourlient.validation, self.sourlient.diskReaderPatternMatching,
                                 self.sourlient.mtime, True, self.logger, eval(self.sourlient.sorter), self.sourlient)
        
        self.debug = True  # Debugging switch
        self.justConnect = False  # Boolean that indicates when a connexion just occur
        
        self.totBytes = 0

        #self.printInitInfos()
        self.makeConnection()
        #self.run()

    def setIgniter(self, igniter):
        self.igniter = igniter

    def printInitInfos(self):
        print("********************* Init. Infos ****************************")
        print("Remote Host: %s" % self.host)
        print("Port R: %s" % self.portR)
        print("Port S: %s" % self.portS)
        print("Remote Address: %s" % self.remoteAddress)
        print("Timeout: %4.1f" % self.timeout)
        print("Write Path: %s" % self.writePath)
        print("Subscriber: %s" % self.subscriber)
        print("**************************************************************")

    def reconnect(self):
        try:
            #poller.unregister(self.socket.fileno())
            self.socket.close()
        except:
            (type, value, tb) = sys.exc_info()
            self.logger.error("Unable to close the socket! Type: %s, Value: %s" % (type, value))

        # FIXME: Possibly some variable resetting should occur here?
        self.logger.info("Sleeping %d seconds (just before makeConnection())" % (self.sleepBetweenConnect))
        time.sleep(self.sleepBetweenConnect)
        self.makeConnection()

    def makeConnection(self):
        if self.subscriber:
            # The Subscriber first listens for a connection from Provider(MHS)
            self.socket = self._listen(self.portR, self.logger)
            if self.socket:
                self.logger.info("Subscriber has been connected by Provider")
                #self.run()
            else:
                # The Subscriber try to connect to the Provider(MHS)
                self.remoteAddress = (self.host, self.portS)
                self.logger.info("The subscriber will try to connect to MHS(%s)" % str(self.remoteAddress))
                self.socket = self._connect(self.remoteAddress, self.logger)
                #self.run()

        else: # Provider(MHS) case
            # The Provider first try to connect to the Subscriber
            self.remoteAddress = (self.host, self.portS)
            self.socket = self._connect(self.remoteAddress, self.logger)
            if self.socket:
                self.logger.info("Provider has completed the connection")
                #self.run()
            else:
                # The Provider(MHS) listens for a connection from Subscriber
                self.socket = self._listen(self.portR, self.logger)
                if self.socket:
                    self.logger.info("Provider has been connected by the subscriber")
                    #self.run()
                else:
                    self.logger.error("No socket (NONE)")
        self.justConnect = True
        

    def _connect(self, remoteAddress, logger):
        trials = 0
        if self.subscriber:
            maxTrials = 1000
        else:
            maxTrials = 3 

        while trials < maxTrials:
            if trials == 12:
                self.sleepBetweenConnect = 60
            socketSender = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            socketSender.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
            socketSender.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            socketSender.settimeout(self.timeout)
            #print socketSender.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
            #socketSender.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF,4096)
            #print socketSender.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
            #socketSender.setblocking(True)
            trials += 1
            try:
                socketSender.connect(remoteAddress)
                logger.info("Sender is now (after %d trial(s)) connected to: %s" % (trials, str(remoteAddress)))
                break
            except socket.gaierror, e:
                logger.error("Address related error connecting to receiver: %s" % e)
                sys.exit(1)
            except socket.error, e:
                (type, value, tb) = sys.exc_info()
                logger.error("Type: %s, Value: %s, Sleeping %d seconds ..." % (type, value, self.sleepBetweenConnect))
                socketSender.close()
                socketSender = None
                time.sleep(self.sleepBetweenConnect)
Example #5
0
 def createFlowDict(self):
     mergedDict = SystemManager.mergeTwoDict(self.sourceCluster,
                                             self.clientCluster)
     return SystemManager.mergeTwoDict(mergedDict, self.sourlientCluster)
Example #6
0
        for file in filesToDelete:
            file = file.strip()
            try:
                os.unlink(file)
                if deleteLog is not None:
                    deleteLog.info("%s has been deleted" % file)
            except:
                (type, value, tb) = sys.exc_info()
                if deleteLog is None:
                    print "Problem deleting %s , Type: %s Value: %s" % (
                        file, type, value)
                else:
                    deleteLog.error(
                        "Problem deleting %s , Type: %s Value: %s" %
                        (file, type, value))


if __name__ == '__main__':

    manager = SystemManager()
    #print manager.getRxNames()
    #print manager.getTxNames()
    #manager.createDir('/apps/px/tutu/')
    #manager.createDir('/apps/px/tata/')
    manager.changePrefixPath('/apps/px/toto/')
    manager.changePrefixPath('/apps/px/tutu/')
    manager.copyFiles('/apps/px/toto/', '/apps/px/tarteau/',
                      '/apps/px/tarteau/copy.log')
    #manager.deleteFiles('/apps/px/tarteau/copy.log', '/apps/px/tarteau/delete.log')
Example #7
0
               deleteLog.error("Problem opening %s , Type: %s Value: %s" % (cpLog, type, value))

        filesToDelete = cpLog.readlines()
        cpLog.close()

        for file in filesToDelete:
            file = file.strip()
            try:
                os.unlink(file)
                if deleteLog is not None:
                    deleteLog.info("%s has been deleted" % file)
            except:
                (type, value, tb) = sys.exc_info()
                if deleteLog is None:
                    print "Problem deleting %s , Type: %s Value: %s" % (file, type, value)
                else:
                    deleteLog.error("Problem deleting %s , Type: %s Value: %s" % (file, type, value))
    
if __name__ == '__main__':
  
    manager = SystemManager()
    #print manager.getRxNames()
    #print manager.getTxNames()
    #manager.createDir('/apps/px/tutu/')
    #manager.createDir('/apps/px/tata/')
    manager.changePrefixPath('/apps/px/toto/')
    manager.changePrefixPath('/apps/px/tutu/')
    manager.copyFiles('/apps/px/toto/', '/apps/px/tarteau/', '/apps/px/tarteau/copy.log')
    #manager.deleteFiles('/apps/px/tarteau/copy.log', '/apps/px/tarteau/delete.log')

Example #8
0
 def __init__(self):
     self.__systemManager = SystemManager()
Example #9
0
class RequestManager:
    def __init__(self):
        self.__systemManager = SystemManager()

    def processRequest(self, request):
        if not type(request) is dict:
            return Messages.invalidRequest

        elif not 'type' in request:
            return Messages.invalidRequest

        elif not 'login' in request or not 'password' in request:
            return Messages.invalidRequest

        elif request['type'] == 'REGISTER':
            if not self.__systemManager.createClient(request['login'],
                                                     request['password']):
                return Messages.loginExists
            else:
                return Messages.userCreated

        elif not self.__systemManager.authenticate(request['login'],
                                                   request['password']):
            return Messages.invalidLoginOrPassWord

        elif request['type'] == 'AUTHENTICATE':
            return Messages.authOk

        elif request['type'].startswith('GET_ITEM'):
            if not 'itemId' in request:
                return Messages.invalidRequest
            answer = False
            if request['type'] == 'GET_ITEM_NAME':
                answer = self.__systemManager.getItemName(
                    request['login'], request['itemId'])
            elif request['type'] == 'GET_ITEM_DATA':
                answer = self.__systemManager.getItemData(
                    request['login'], request['itemId'])
            elif request['type'] == 'GET_ITEM_TYPE':
                answer = self.__systemManager.getItemType(
                    request['login'], request['itemId'])
            elif request['type'] == 'GET_ITEM_PARENT':
                answer = self.__systemManager.getItemParentId(
                    request['login'], request['itemId'])
            if type(answer) is bool and not answer:
                return Messages.getError
            else:
                return dict(Messages.getOK, **{'answer': answer})

        elif request['type'] == 'CREATE_FOLDER':
            if not 'where' in request:
                return Messages.invalidRequest
            if not 'name' in request:
                return Messages.invalidRequest
            createdId = self.__systemManager.createFolder(
                request['login'], request['name'], request['where'])
            if type(createdId) is bool and not createdId:
                return Messages.invalidRequest
            return Messages.folderCreated

        elif request['type'] == 'CREATE_FILE':
            if not 'where' in request:
                return Messages.invalidRequest
            if not 'name' in request:
                return Messages.invalidRequest
            if not 'data' in request:
                return Messages.invalidRequest
            createdId = self.__systemManager.createFile(
                request['login'], request['name'], request['data'],
                request['where'])
            if type(createdId) is bool and not createdId:
                return Messages.invalidRequest
            return Messages.fileCreated

        elif request['type'] == 'GET_ROOT_FOLDER':
            client = self.__systemManager.getClient(request['login'])
            return dict(Messages.getOK, **{'answer': client.getRootFolder()})

        elif request['type'] == 'GET_SHARED_FOLDER':
            client = self.__systemManager.getClient(request['login'])
            return dict(Messages.getOK, **{'answer': client.getSharedFolder()})

        elif request['type'] == 'SHARE_ITEM':
            if not 'itemId' in request or not 'toLogin' in request:
                return Messages.invalidRequest
            if not self.__systemManager.addPermission(
                    request['itemId'], request['login'], request['toLogin']):
                return Messages.invalidRequest
            else:
                return Messages.permissionGiven

        elif request['type'] == 'RENAME_ITEM':
            if not 'itemId' in request or not 'newName' in request:
                return Messages.invalidRequest
            if not self.__systemManager.renameItem(
                    request['login'], request['itemId'], request['newName']):
                return Messages.invalidRequest
            else:
                return Messages.itemRenamed

        elif request['type'] == 'EDIT_FILE_DATA':
            if not 'fileId' in request or not 'newData' in request:
                return Messages.invalidRequest
            if not self.__systemManager.editFileData(
                    request['login'], request['fileId'], request['newData']):
                return Messages.invalidRequest
            else:
                return Messages.fileEdited

        elif request['type'] == 'MOVE_ITEM':
            if not 'itemId' in request or not 'newParent' in request:
                return Messages.invalidRequest
            if not self.__systemManager.moveItem(
                    request['login'], request['itemId'], request['newParent']):
                return Messages.invalidRequest
            else:
                return Messages.itemMoved

        else:
            return Messages.invalidRequest
Example #10
0
 def createFlowDict(self):
     mergedDict = SystemManager.mergeTwoDict(self.sourceCluster, self.clientCluster)
     return SystemManager.mergeTwoDict(mergedDict, self.sourlientCluster)