Source: util/config-file.js

/**
 * Copyright (C) 2016-2018 Regents of the University of California.
 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
 * @author: From https://github.com/named-data/ndn-cxx/blob/master/src/util/config-file.hpp
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * A copy of the GNU Lesser General Public License is in the file COPYING.
 */

/** @ignore */
var fs = require('fs'); /** @ignore */
var path = require('path'); /** @ignore */
var BasicIdentityStorage = require('../security//identity/basic-identity-storage').BasicIdentityStorage;

/**
 * A ConfigFile locates, opens, and parses a library configuration file, and
 * holds the values for the application to get.
 *
 * Locate, open, and parse a library configuration file.
 * @constructor
 */
var ConfigFile = function ConfigFile()
{
  this.path_ = ConfigFile.findConfigFile_();
  this.config_ = {};

  if (this.path_ !== "")
    this.parse_();
};

exports.ConfigFile = ConfigFile;

/**
 * Get the value for the key, or a default value if not found.
 * @param {string} key The key to search for.
 * @param {string}  defaultValue The default value if the key is not found.
 * @return {string}  The value, or defaultValue if the key is not found.
 */
ConfigFile.prototype.get = function(key, defaultValue)
{
  if (this.config_[key] !== undefined)
    return this.config_[key];
  else
    return defaultValue;
};

/**
 * Get the path of the configuration file.
 * @return {string} The path or an empty string if not found.
 */
ConfigFile.prototype.getPath = function() { return this.path_; };

/**
 * Get the configuration key/value pairs.
 * @return {object} An associative array of the key/value pairs.
 */
ConfigFile.prototype.getParsedConfiguration = function() { return this.config_; };

/**
 * Look for the configuration file in these well-known locations:
 *
 * 1. $HOME/.ndn/client.conf
 * 2. /etc/ndn/client.conf
 * We don't support the C++ #define value @SYSCONFDIR@.
 *
 * @return {string} The path of the config file or an empty string if not found.
 */
ConfigFile.findConfigFile_ = function()
{
  var filePath = path.join
    (BasicIdentityStorage.getUserHomePath(), ".ndn", "client.conf");
  try {
    fs.accessSync(filePath, fs.F_OK);
    return filePath;
  } catch (e) {}

  // Ignore the C++ SYSCONFDIR.

  filePath = "/etc/ndn/client.conf";
  try {
    fs.accessSync(filePath, fs.F_OK);
    return filePath;
  } catch (e) {}

  return "";
};

/**
 * Open path_, parse the configuration file and set config_.
 */
ConfigFile.prototype.parse_ = function()
{
  if (this.path_ === "")
    throw new Error
      ("ConfigFile.parse: Failed to locate the configuration file for parsing");

  // Use readFileSync instead of the asycnronous readline.
  input = fs.readFileSync(this.path_).toString();

  var thisConfig = this;
  input.split(/\r?\n/).forEach(function(line) {
    line = line.trim();
    if (line === "" || line[0] === ';')
      // Skip empty lines and comments.
      return;

    var iSeparator = line.indexOf('=');
    if (iSeparator < 0)
      return;

    var key = line.substr(0, iSeparator).trim();
    var value = line.substr(iSeparator + 1).trim();

    thisConfig.config_[key] = value;
  });
};