Menu

Shinken Arbiter Install

module.exports = header: 'Shinken Arbiter Install', handler: (options)->

IPTables

ServicePortProtoParameter
shinken-arbiter7770tcpoptions.config.port

IPTables rules are only inserted if the parameter "iptables.action" is set to "start" (default value).

  rules = [{ chain: 'INPUT', jump: 'ACCEPT', dport: options.config.port, protocol: 'tcp', state: 'NEW', comment: "Shinken Arbiter" }]
  for name, mod of options.modules
    if mod.config?.port?
      rules.push { chain: 'INPUT', jump: 'ACCEPT', dport: mod.config.port, protocol: 'tcp', state: 'NEW', comment: "Shinken Arbiter #{name}" }
  @tools.iptables
    header: 'IPTables'
    rules: rules
    if: options.iptables

Packages

  @service
    header: 'Packages'
    name: 'shinken-arbiter'

Remove default config files

  @call header: 'Clean Install', ->
    @system.remove target: '/etc/shinken/realms/all.cfg'
    @system.remove target: '/etc/shinken/contacts/nagiosadmin.cfg'
    @system.remove target: '/etc/shinken/services/linux_disks.cfg'
    @system.remove target: '/etc/shinken/hosts/localhost.cfg'
    @system.remove target: '/etc/shinken/templates/templates.cfg'
    @system.remove target: '/etc/shinken/resource.d/path.cfg'
    
    @service.init
      header: 'Systemd Script'
      target: '/usr/lib/systemd/system/shinken-arbiter'
      source: "#{__dirname}/resources/shinken-arbiter-systemd.j2"
      local: true
      mode: 0o0644

Modules

  @call header: 'Modules', ->
    installmod = (name, mod) =>
      @call unless_exec: "shinken inventory | grep #{name}", ->
        @file.download
          target: "#{options.build_dir}/#{mod.archive}.#{mod.format}"
          source: mod.source
          cache_file: "#{mod.archive}.#{mod.format}"
          unless_exec: "shinken inventory | grep #{name}"
        @tools.extract
          source: "#{options.build_dir}/#{mod.archive}.#{mod.format}"
        @system.execute
          cmd: "shinken install --local #{options.build_dir}/#{mod.archive}"
        @system.remove target: "#{options.build_dir}/#{mod.archive}.#{mod.format}"
        @system.remove target: "#{options.build_dir}/#{mod.archive}"
      for subname, submod of mod.modules then installmod subname, submod
    for name, mod of options.modules then installmod name, mod

Python Modules

  @call header: 'Python Modules', ->
    install_dep = (k, v) =>
      @call unless_exec: "pip list | grep #{k}", ->
        @file.download
          source: v.url
          target: "#{options.build_dir}/#{v.archive}.#{v.format}"
          cache_file: "#{v.archive}.#{v.format}"
        @tools.extract
          source: "#{options.build_dir}/#{v.archive}.#{v.format}"
        @system.execute
          cmd:"""
          cd #{options.build_dir}/#{v.archive}
          python setup.py build
          python setup.py install
          """
        @system.remove target: "#{options.build_dir}/#{v.archive}.#{v.format}"
        @system.remove target: "#{options.build_dir}/#{v.archive}"
    for _, mod of options.modules then for k,v of mod.python_modules then install_dep k, v

Configuration

Shinken Config

  @call header: 'Daemons Config', ->
    for subsrv in ['arbiter', 'broker', 'poller', 'reactionner', 'receiver', 'scheduler']
      @file.render
        header: subsrv
        target: "/etc/shinken/#{subsrv}s/#{subsrv}-master.cfg"
        source: "#{__dirname}/resources/#{subsrv}.cfg.j2"
        local: true
        context: "#{subsrv}s": options["#{subsrv}_daemons"]
        backup: true
    @file.properties
      target: '/etc/shinken/resource.d/resources.cfg'
      content:
        "$PLUGINSDIR$": options.plugin_dir
        "$DOCKER_EXEC$": 'docker exec poller-executor'
      backup: true
    @call
      header: 'Shinken CFG'
    , ->
      #now shinken throw error if empty configuration
      for k, v of options.config
        if Array.isArray v
          options.config[k] = '0' if v.length is 0
      writes = for k, v of options.config
        match: ///^#{k}=.*$///mg
        replace: "#{k}=#{v}"
        append: true
      @file
        target: '/etc/shinken/shinken.cfg'
        write: writes
        backup: true
        eof: true

Modules Config

  @call header: 'Modules Config', ->
    config_mod = (name, mod) =>
      @file.render
        target: "/etc/shinken/modules/#{mod.config_file}"
        source: "#{__dirname}/resources/module.cfg.j2"
        local: true
        context:
          name: name
          type: mod.type
          config: mod.config
        backup: true
      if mod.modules?
        config_mod sub_name, sub_mod for sub_name, sub_mod of mod.modules
    # Loop on all services
    for service in ['arbiter', 'broker', 'poller', 'reactionner', 'receiver', 'scheduler']
      for name, mod of options["#{service}_modules"]
        config_mod name, mod

Objects Config

Objects config

  @call header: 'Objects', ->
    # Un-templated objects
    ## Some commands need the lists of brokers (for their livestatus module)
    #for obj in ['hostgroups', 'servicegroups', 'contactgroups', 'commands', 'realms', 'dependencies', 'escalations', 'timeperiods']
    for obj in ['hostgroups', 'contactgroups', 'commands', 'realms', 'dependencies', 'escalations', 'timeperiods']
      @file.render
        header: obj
        target: "/etc/shinken/#{obj}/#{obj}.cfg"
        source: "#{__dirname}/../../commons/monitoring/resources/#{obj}.cfg.j2"
        local: true
        context:
          "#{obj}": options[obj]
          brokers: options.broker_hosts.join(',')
          credentials: options.credentials
        backup: true
    # Templated objects
    for obj in ['hosts', 'services', 'contacts']
      real = {}
      templated = {}
      for k, v of options[obj]
        if "#{v.register}" is '0' then templated[k] = v
        else real[k] = v
      @file.render
        header: "#{obj} templates"
        target: "/etc/shinken/templates/#{obj}.cfg"
        source: "#{__dirname}/../../commons/monitoring/resources/#{obj}.cfg.j2"
        local: true
        context: "#{obj}": templated
        backup: true
      @file.render
        header: obj
        target: "/etc/shinken/#{obj}/#{obj}.cfg"
        source: "#{__dirname}/../../commons/monitoring/resources/#{obj}.cfg.j2"
        local: true
        context: "#{obj}": real
        backup: true

SSL

  @call header: 'SSL', if: options.ssl.enabled
  , ->
    @file.download
      source: options.ssl.cert.source
      target: options.config['server_cert']
      local: options.ssl.cert.local
      uid: options.user.name
      gid: options.group.name
    @file.download
      source: options.ssl.key.source
      target: options.config['server_key']
      local: options.ssl.key.local
      uid: options.user.name
      gid: options.group.name
    @file.download
      source: options.ssl.cacert.source
      target: options.config['ca_cert']
      local: options.ssl.cacert.local
      uid: options.user.name
      gid: options.group.name

Check Config

This will execute a dry-run: arbiter will only check the configuration and exit This output is more verbose than a failed start so it runs at the end of install

  @system.execute
    header: 'Check config'
    cmd: 'shinken-arbiter -v -r -c /etc/shinken/shinken.cfg'
    shy: true