'Loads an additional configuration file.
The configuration system has the concept of a single Primary configuration
file, and multiple secondary files. The primary configuration file is the
main file that is used by the program. Any writebacks will only be made to
the primary configuration file. Secondary files contain additional
configuration data which will be merged into the configuration system.
This method adds an additional configuration file.
Args:
filename: The configuration file that will be loaded. For example
file:///etc/grr.conf or reg://HKEY_LOCAL_MACHINE/Software/GRR.
parser: An optional parser can be given. In this case, the parser\'s data
will be loaded directly.
Returns:
The parser used to parse this configuration source.
Raises:
ConfigFileNotFound: If a specified included file was not found.'

def LoadSecondaryConfig(self, filename=None, parser=None):

    if filename:
        self.files.append(filename)
        parser_cls = self.GetParserFromFilename(filename)
        parser = parser_cls(filename=filename)
        logging.info('Loading    configuration    from    %s', filename)
    clone = self.MakeNewConfig()
    clone.MergeData(parser.RawData())
    clone.initialized = True
    for file_to_load in clone['Config.includes']:
        if (not os.path.isabs(file_to_load)):
            if (not filename):
                raise ConfigFileNotFound(('While    loading    %s:    Unable    to    include    a    relative    path    (%s)    from    a    config    without    a    filename' % (filename, file_to_load)))
            file_to_load = os.path.join(os.path.dirname(filename), file_to_load)
        clone_parser = clone.LoadSecondaryConfig(file_to_load)
        if (not clone_parser.parsed):
            raise ConfigFileNotFound(('Unable    to    load    include    file    %s' % file_to_load))
    self.MergeData(clone.raw_data)
    self.files.extend(clone.files)
    return parser
