j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

Oxidizedのconfigファイルの場所を勘違いした

Oxidizedとは

ここを見て ytti/oxidized: configuration backup software (IOS, JunOS) - silly attempt at rancid

勘違い

環境変数 OXIDIZED_HOME を設定した場合、 ${OXIDIZED_HOME}/config をconfigファイルとして読み込んでくれると思っていたが、それは間違いだった。

正解

Oxidizedは次の2つのファイルを順番に読み込み、それらをマージしたものをconfigとして使用する。

  1. /etc/oxidized/config
  2. ${HOME}/.config/oxidized/config

ちゃんとREADMEで説明されていた。

Oxidized configuration is in YAML format. Configuration files are subsequently sourced from /etc/oxidized/config then ~/.config/oxidized/config. The hashes will be merged, this might be useful for storing source information in a system wide file and user specific configuration in the home directory (to only include a staff specific username and password). Eg. if many users are using oxs, see Oxidized::Script. https://github.com/ytti/oxidized/blob/master/README.md#configuration

コードリーディング

configファイルは oxidized/lib/oxidized/config.rb のこの部分で読み込んでいる。

    def self.load(cmd_opts = {})
      asetus = Asetus.new(name: 'oxidized', load: false, key_to_s: true)
      Oxidized.asetus = asetus

https://github.com/ytti/oxidized/blob/ff4a6b790f2e05769574a3cfd8d71b2c8be08df5/lib/oxidized/config.rb#L17

configの読み込みには、Oxidizedと同じ作者のAsetusモジュールを使用している。 このあたりを読むと、Asetusが /etc/oxidized/config${HOME}/.config/oxidized/config を読み込むことがわかる。

  # @param [Hash] opts options for Asetus.new
  # @option opts [String]  :name     name to use for asetus (/etc/name/, ~/.config/name/) - autodetected if not defined
  # @option opts [String]  :adapter  adapter to use 'yaml', 'json' or 'toml' for now
  # @option opts [String]  :usrdir   directory for storing user config ~/.config/name/ by default
  # @option opts [String]  :sysdir   directory for storing system config /etc/name/ by default
  # @option opts [String]  :cfgfile  configuration filename, by default CONFIG_FILE
  # @option opts [Hash]    :default  default settings to use
  # @option opts [boolean] :load     automatically load+merge system+user config with defaults in #cfg
  # @option opts [boolean] :key_to_s convert keys to string by calling #to_s for keys
  def initialize opts={}
    @name     = (opts.delete(:name)    or metaname)
    @adapter  = (opts.delete(:adapter) or 'yaml')
    @usrdir   = (opts.delete(:usrdir)  or File.join(Dir.home, '.config', @name))
    @sysdir   = (opts.delete(:sysdir)  or File.join('/etc', @name))
    @cfgfile  = (opts.delete(:cfgfile) or CONFIG_FILE)
    @default  = ConfigStruct.new opts.delete(:default)
    @system   = ConfigStruct.new
    @user     = ConfigStruct.new
    @cfg      = ConfigStruct.new
    @load     = true
    @load     = opts.delete(:load) if opts.has_key?(:load)
    @key_to_s = opts.delete(:key_to_s)
    raise UnknownOption, "option '#{opts}' not recognized" unless opts.empty?
    load :all if @load
  end

https://github.com/ytti/asetus/blob/master/lib/asetus.rb#L103