def parseSetting(self, key, value): """ Parse a single setting for this object. Settings are written in text files in a key=value fashion. For each such setting that belongs to this object this method will be called. After all settings have been given, the method checkSettings will be called. If a setting does not parse correctly, this method raises an Exception with a descriptive message. Subclassers should first parse their own settings and then call this implementation to have the generic settings parsed and to have any unknown settings raise an Exception. @param key The name of the parameter, i.e. the key from the key=value pair. @param value The value of the parameter, i.e. the value from the key=value pair. """ if key == 'port': if self.port: parseError( "Port already set: {0}".format( self.port ) ) if not isPositiveInt( value ) or int(value) < 1024 or int(value) > 65535: parseError( "Port must be a positive integer greater than 1023 and smaller than 65536, not {0}".format( value ) ) self.port = int(value) elif key == 'changeTracker' or key == 'changetracker': if not isValidName( value ): parseError( "{0} is not a valid name for a file object.".format( value ) ) self.changeTrackers.append( value ) elif key == 'changeClientTracker': if not isValidName( value ): parseError( "{0} is not a valid name for a client object.".format( value ) ) self.changeClientTrackers.append( value ) else: client.parseSetting(self, key, value)
def parseSetting(self, key, value): """ Parse a single setting for this object. Settings are written in text files in a key=value fashion. For each such setting that belongs to this object this method will be called. After all settings have been given, the method checkSettings will be called. If a setting does not parse correctly, this method raises an Exception with a descriptive message. Subclassers should first parse their own settings and then call this implementation to have the generic settings parsed and to have any unknown settings raise an Exception. @param key The name of the parameter, i.e. the key from the key=value pair. @param value The value of the parameter, i.e. the value from the key=value pair. """ if key == 'name': if self.name != '': parseError( 'Name already set: {0}'.format( self.name ) ) if not isValidName( value ): parseError( '"{0}" is not a valid name'.format( value ) ) if value in self.scenario.getObjectsDict('parser'): parseError( 'Parser object called {0} already exists'.format( value ) ) self.name = value else: parseError( 'Unknown parameter name: {0}'.format( key ) )
def parseSetting(self, key, value): """ Parse a single setting for this object. Settings are written in text files in a key=value fashion. For each such setting that belongs to this object this method will be called. After all settings have been given, the method checkSettings will be called. If a setting does not parse correctly, this method raises an Exception with a descriptive message. Subclassers should first parse their own settings and then call this implementation to have the generic settings parsed and to have any unknown settings raise an Exception. @param key The name of the parameter, i.e. the key from the key=value pair. @param value The value of the parameter, i.e. the value from the key=value pair. """ if key == 'name': if self.name != '': parseError( 'Name already set: {0}'.format( self.name ) ) if not isValidName( value ): parseError( '"{0}" is not a valid name'.format( value ) ) if value in self.scenario.getObjectsDict('file'): parseError( 'File object called {0} already exists'.format( value ) ) self.name = value elif key == "rootHash": Campaign.logger.log( "Warning: The rootHash parameter to a file is deprecated due to ambiguity. Please use rootHash[1] instead." ) if 1 in self.rootHashes: parseError( 'Root hash for chunksize 1 already set: {0}'.format( self.rootHash ) ) if not isinstance( value, basestring ) or len( value ) != 40 or reduce( lambda x, y: x or not ( ( y >= '0' and y <= '9' ) or ( y >= 'A' and y <= 'F' ) or ( y >= 'a' and y <= 'f' ) ), value, False ): parseError( 'Valid root hashes consist of exactly 40 hexadecimal digits, unlike "{0}"'.format( value ) ) self.rootHash = value self.rootHashes[1] = value elif key[:9] == 'rootHash[' and key[-1:] == ']': chunksize = key[9:-1] if chunksize[-1:] == 'L': if not isPositiveInt(chunksize[:-1], True): parseError( 'The chunksize of a root hash must be a positive non-zero integer, possibly postfixed by L for legacy root hashes.' ) else: if not isPositiveInt(chunksize, True): parseError( 'The chunksize of a root hash must be a positive non-zero integer, possibly postfixed by L for legacy root hashes.' ) chunksize = int(chunksize) if chunksize in self.rootHashes: parseError( 'The root hash for chunksize {0} has already been set: {1}'.format( chunksize, self.rootHashes[chunksize] ) ) if not isinstance( value, basestring ) or len( value ) != 40 or reduce( lambda x, y: x or not ( ( y >= '0' and y <= '9' ) or ( y >= 'A' and y <= 'F' ) or ( y >= 'a' and y <= 'f' ) ), value, False ): parseError( 'Valid root hashes consist of exactly 40 hexadecimal digits, unlike "{0}"'.format( value ) ) self.rootHashes[chunksize] = value if chunksize == 1: self.rootHash = value elif key == "metaFile": if self.metaFile: parseError( 'Meta file already set: {0}'.format( self.metaFile ) ) if not os.path.exists( value ): parseError( 'Meta file {0} seems not to exist'.format( value ) ) self.metaFile = value else: parseError( 'Unknown parameter name: {0}'.format( key ) )
def parseSetting(self, key, value): """ Parse a single setting for this object. Settings are written in text files in a key=value fashion. For each such setting that belongs to this object this method will be called. After all settings have been given, the method checkSettings will be called. If a setting does not parse correctly, this method raises an Exception with a descriptive message. Subclassers should first parse their own settings and then call this implementation to have the generic settings parsed and to have any unknown settings raise an Exception. @param key The name of the parameter, i.e. the key from the key=value pair. @param value The value of the parameter, i.e. the value from the key=value pair. """ if key == 'name': if self.name != '': parseError( 'Name already set: {0}'.format( self.name ) ) if not isValidName( value ): parseError( '"{0}" is not a valid name'.format( value ) ) if value in self.scenario.getObjectsDict('host'): parseError( 'Host object called {0} already exists'.format( value ) ) self.name = value elif key == 'preparation': parseError( 'The preparation parameter was badly supported under version 1 and has been deprecated. If you need this parameter, please contact the developers of the framework to discuss support.' ) elif key == 'cleanup': parseError( 'The cleanup parameter was badly supported under version 1 and has been deprecated. If you need this parameter, please contact the developers of the framework to discuss support.' ) elif key == 'remoteFolder' or key == 'remoteDirectory': if self.remoteDirectory: parseError( 'Remote directory already set' ) if value != '': self.remoteDirectory = value elif key == 'tc_iface' or key == 'tcInterface': if self.tcInterface: parseError( 'Only one interface for TC allowed' ) if value == '': parseError( 'Empty interface for TC found, but an interface is required' ) self.tcInterface = value self.tcParamsSet = True elif key == 'tc_down' or key == 'tcMaxDownSpeed': if self.tcDown != 0: parseError( 'Maximum download speed for TC already set' ) self.tcDown = checkSpeedValue( value, 'Maximum download speed' ) self.tcParamsSet = True elif key == 'tc_down_burst' or key == 'tcMaxDownBurst': if self.tcDownBurst != 0: parseError( 'Maximum download burst for TC already set' ) self.tcDownBurst = checkSpeedValue( value, 'Maximum download burst' ) self.tcParamsSet = True elif key == 'tc_up' or key == 'tcMaxUpSpeed': if self.tcUp != 0: parseError( 'Maximum upload speed for TC already set' ) self.tcUp = checkSpeedValue( value, 'Maximum upload speed' ) self.tcParamsSet = True elif key == 'tc_up_burst' or key == 'tcMaxUpBurst': if self.tcUpBurst != 0: parseError( 'Maximum upload burst for TC already set' ) self.tcUpBurst = checkSpeedValue( value, 'Maximum upload burst' ) self.tcParamsSet = True elif key == 'tc': if self.tc != '': parseError( 'TC module already set' ) if value == '': return if not isValidName( value ): parseError( 'Name given as name of TC module is not a valid name: {0}'.format( value ) ) __import__( 'modules.tc.'+value, globals(), locals(), value ) # Just checks availability self.tc = value elif key == 'tc_loss' or key == 'tcLossChance': if self.tcLoss != 0: parseError( 'Loss chance for TC already set' ) if (not isPositiveFloat( value )) or float(value) > 100: parseError( 'Loss chance for TC should be a floating point number >= 0.0 and <= 100.0, unlike {0}'.format( value ) ) self.tcLoss = float(value) elif key == 'tc_corruption' or key == 'tcCorruptionChance': if self.tcCorruption != 0: parseError( 'Corruption chance for TC already set' ) if (not isPositiveFloat( value )) or float(value) > 100: parseError( 'Corruption chance for TC should be a floating point number >= 0.0 and <= 100.0, unlike {0}'.format( value ) ) self.tcCorruption = float(value) elif key == 'tc_duplication' or key == 'tcDuplicationChance': if self.tcDuplication != 0: parseError( 'Duplication chance for TC already set' ) if (not isPositiveFloat( value )) or float(value) > 100: parseError( 'Duplication chance for TC should be a floating point number >= 0.0 and <= 100.0, unlike {0}'.format( value ) ) self.tcDuplication = float(value) elif key == 'tc_delay' or key == 'tcDelay': if self.tcDelay != 0: parseError( 'Delay for TC already set' ) if not isPositiveInt( value ): parseError( 'Delay for TC should be a positive integer denoting the delay in ms, unlike {0}'.format( value ) ) self.tcDelay = int(value) elif key == 'tc_jitter' or key == 'tcJitter': if self.tcJitter != 0: parseError( 'Jitter in the delay for TC already set' ) if not isPositiveInt( value ): parseError( 'Jitter in the delay for TC should be a positive integer denoting the maximum deviation in the delay for TC in ms, unlike {0}'.format( value ) ) self.tcJitter = int(value) else: parseError( 'Unknown parameter name: {0}'.format( key ) )
def parseSetting(self, key, value): """ Parse a single setting for this object. Settings are written in text files in a key=value fashion. For each such setting that belongs to this object this method will be called. After all settings have been given, the method checkSettings will be called. If a setting does not parse correctly, this method raises an Exception with a descriptive message. Subclassers should first parse their own settings and then call this implementation to have the generic settings parsed and to have any unknown settings raise an Exception. @param key The name of the parameter, i.e. the key from the key=value pair. @param value The value of the parameter, i.e. the value from the key=value pair. """ if key == 'host': if self.hostName: parseError( "A host was already given: {0}".format( self.hostName ) ) if not isValidName( value ): if not isValidName( value[:value.find('@')]): parseError( "{0} is not a valid host object name".format( value ) ) self.hostName = value elif key == 'client': if self.clientName: parseError( "A client was already given: {0}".format( self.clientName ) ) if not isValidName( value ): if not isValidName( value[:value.find('@')]): parseError( "{0} is not a valid client object name".format( value ) ) self.clientName = value elif key == 'file': if not isValidName( value ): if not isValidName( value[:value.find('@')]): parseError( "{0} is not a valid file object name".format( value ) ) if not self.fileNames: self.fileNames = [value] elif value not in self.fileNames: self.fileNames.append(value) else: Campaign.logger.log( "Warning for execution object on line {0}: file object {1} already added".format( Campaign.currentLineNumber, value ) ) elif key == 'parser': if not isValidName( value ): parseError( "{0} is not a valif parser object name".format( value ) ) if not self.parserNames: self.parserNames = [] self.parserNames.append( value ) elif key == 'seeder': if value != '': self.seeder = True elif key == 'timeout': if self.timeout != None: parseError( "The timeout was already set: {0}".format( self.timeout ) ) if not isPositiveFloat( value ): parseError( "The timeout must be a non-negative floating point number." ) self.timeout = float(value) elif key == 'keepSeeding': if value != '': self.keepSeeding = True elif key == 'multiply': if self.multiply is not None: parseError( "Multiply already set: {0}".format( self.multiply ) ) if not isPositiveInt(value, True): parseError( "The multiply parameter must be a non-zero positive integer." ) self.multiply = int(value) else: parseError( 'Unknown parameter name: {0}'.format( key ) )