Menu

Shinken Poller Install

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

IPTables

ServicePortProtoParameter
shinken-poller7771tcpoptions.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 Poller" }]
  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 Poller #{name}" }
  @tools.iptables
    rules: [
      { chain: 'INPUT', jump: 'ACCEPT', dport: options.config.port, protocol: 'tcp', state: 'NEW', comment: "Shinken Poller" }
    ]
    if: options.iptables

Identities

  @system.group header: 'Group', options.group
  @system.user header: 'User', options.user

Package

  @call header: 'Packages', ->
    @service name: 'net-snmp'
    @service name: 'net-snmp-utils'
    @service name: 'httpd'
    @service name: 'fping'
    @service name: 'krb5-devel'
    @service name: 'zlib-devel'
    @service name: 'bzip2-devel'
    @service name: 'openssl-devel'
    @service name: 'ncurses-devel'
    @service name: 'python-devel'
    @service name: 'openldap-devel'
    @service name: 'shinken-poller'

Configuration

  @file.ini
    header: 'Configuration'
    target: '/etc/shinken/daemons/pollerd.ini'
    content: daemon: options.ini
    backup: true
    eof: true

  @service.init
    header: 'Systemd Script'
    target: '/usr/lib/systemd/system/shinken-poller.service'
    source: "#{__dirname}/resources/shinken-poller-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

Plugins

  @call header: 'Plugins', ->
  for plugin in glob.sync "#{__dirname}/resources/plugins/*"
    @file.download
      target: "#{shinken.plugin_dir}/#{path.basename plugin}"
      source: plugin
      uid: options.user.name
      gid: shinken.group.name
      mode: 0o0755

Executor

  @call header: 'Executor', ->
    @krb5.addprinc options.krb5.admin,
      header: 'Kerberos'
      principal: options.krb5_principal
      randkey: true
      keytab: options.krb5_keytab
      mode: 0o644

    @call
      header: 'SSL'
      if: options.ssl.enabled
    , ->
      @file.download
        source: options.ssl.cert.source
        target: options.tls_cert_file
        local: options.ssl.cert.local
        uid: options.user.name
        gid: options.group.name
      @file.download
        source: options.ssl.key.source
        target: options.tls_key_file
        local: options.ssl.key.local
        uid: options.user.name
        gid: options.group.name

    @call header: 'Docker', ->
      options.image ?= 'ryba/shinken-poller-executor'
      options.version ?= 'latest'
      @call (_, callback) ->
        @docker.checksum
          docker: options.swarm_conf
          image: options.image
          tag: options.version
        , (err, status, checksum) ->
          return callback err, checksum
      @docker.pull
        header: 'Pull container'
        unless: -> @status(-1)
        tag: options.image
        version: options.version
        code_skipped: 1
      @file.download
        unless: -> @status(-1) or @status(-2)
        source: "#{options.cache_dir or '.'}/shinken-poller-executor.tar"
        target: '/var/lib/docker_images/shinken-poller-executor.tar'
        binary: true
        # md5: md5
      @docker.load
        header: 'Load container to docker'
        unless: -> @status(-3)
        if_exists: '/var/lib/docker_images/shinken-poller-executor.tar'
        source: '/var/lib/docker_images/shinken-poller-executor.tar'
        docker: options.swarm_conf
      @file
        target: "#{options.user.home}/resources/cronfile"
        content: """
        01 */9 * * * #{options.user.name} /usr/bin/kinit #{options.krb5_principal} -kt #{options.krb5_keytab}
        """
        eof: true
      volumes = [
        "/etc/krb5.conf:/etc/krb5.conf:ro"
        "/etc/localtime:/etc/localtime:ro"
        "#{options.user.home}/resources/cronfile:/etc/cron.d/1cron"
        "#{options.krb5_keytab}:#{options.krb5_keytab}"
      ]
      if options.ssl?
        volumes.push "#{options.tls_cert_file}:#{options.credentials.swarm_user.cert}" if options.credentials.swarm_user.cert?
        volumes.push "#{options.tls_key_file}:#{options.credentials.swarm_user.key}" if options.credentials.swarm_user.key?
      @docker.service
        name: 'poller-executor'
        image: "#{options.image}:#{options.version}"
        net: 'host'
        volume: volumes

Dependencies

path = require 'path'
glob = require 'glob'