Browse Source

extras: Added a basic puppet-module to configure nagbot

Sebastien Badia 10 years ago
parent
commit
d1099c769d

+ 7 - 0
extras/puppet-nagbot/Gemfile

@@ -0,0 +1,7 @@
+source 'https://rubygems.org'
+
+puppetversion = ENV.key?('PUPPET_VERSION') ? "= #{ENV['PUPPET_VERSION']}" : ['>= 3.3']
+gem 'puppet', puppetversion
+gem 'puppetlabs_spec_helper', '>= 0.1.0'
+gem 'puppet-lint', '>= 0.3.2'
+gem 'facter', '>= 1.7.0'

+ 79 - 0
extras/puppet-nagbot/README.md

@@ -0,0 +1,79 @@
+# nagbot
+
+#### Table of Contents
+
+1. [Overview](#overview)
+2. [Module Description - What the module does and why it is useful](#module-description)
+3. [Setup - The basics of getting started with nagbot](#setup)
+    * [What nagbot affects](#what-nagbot-affects)
+    * [Setup requirements](#setup-requirements)
+    * [Beginning with nagbot](#beginning-with-nagbot)
+4. [Usage - Configuration options and additional functionality](#usage)
+5. [Reference - An under-the-hood peek at what the module is doing and how](#reference)
+5. [Limitations - OS compatibility, etc.](#limitations)
+6. [Development - Guide for contributing to the module](#development)
+
+## Overview
+
+A one-maybe-two sentence summary of what the module does/what problem it solves.
+This is your 30 second elevator pitch for your module. Consider including
+OS/Puppet version it works with.
+
+## Module Description
+
+If applicable, this section should have a brief description of the technology
+the module integrates with and what that integration enables. This section
+should answer the questions: "What does this module *do*?" and "Why would I use
+it?"
+
+If your module has a range of functionality (installation, configuration,
+management, etc.) this is the time to mention it.
+
+## Setup
+
+### What nagbot affects
+
+* A list of files, packages, services, or operations that the module will alter,
+  impact, or execute on the system it's installed on.
+* This is a great place to stick any warnings.
+* Can be in list or paragraph form.
+
+### Setup Requirements **OPTIONAL**
+
+If your module requires anything extra before setting up (pluginsync enabled,
+etc.), mention it here.
+
+### Beginning with nagbot
+
+The very basic steps needed for a user to get the module up and running.
+
+If your most recent release breaks compatibility or requires particular steps
+for upgrading, you may wish to include an additional section here: Upgrading
+(For an example, see http://forge.puppetlabs.com/puppetlabs/firewall).
+
+## Usage
+
+Put the classes, types, and resources for customizing, configuring, and doing
+the fancy stuff with your module here.
+
+## Reference
+
+Here, list the classes, types, providers, facts, etc contained in your module.
+This section should include all of the under-the-hood workings of your module so
+people know what the module is touching on their system but don't need to mess
+with things. (We are working on automating this section!)
+
+## Limitations
+
+This is where you list OS compatibility, version compatibility, etc.
+
+## Development
+
+Since your module is awesome, other users will want to play with it. Let them
+know what the ground rules for contributing are.
+
+## Release Notes/Contributors/Etc **Optional**
+
+If you aren't using changelog, put your release notes here (though you should
+consider using changelog). You may also add any additional sections you feel are
+necessary or important to include here. Please use the `## ` header.

+ 6 - 0
extras/puppet-nagbot/Rakefile

@@ -0,0 +1,6 @@
+require 'rubygems'
+require 'puppetlabs_spec_helper/rake_tasks'
+require 'puppet-lint/tasks/puppet-lint'
+
+PuppetLint.configuration.send('disable_80chars')
+PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]

+ 50 - 0
extras/puppet-nagbot/manifests/init.pp

@@ -0,0 +1,50 @@
+# == Class: nagbot
+#
+# Nagbot IRC notification/commands bot.
+#
+# === Parameters
+#
+#
+# === Examples
+#
+#  class { 'nagbot': }
+#
+# === Authors
+#
+# Sebastien Badia <seb@sebian.fr
+#
+# === Copyright
+#
+# Copyright 2014 Sebastien Badia, unless otherwise noted.
+#
+class nagbot(
+  $irc_server       = 'irc.geeknode.net',
+  $irc_chatnet      = 'geeknode',
+  $irc_port         = '6697',
+  $irc_ssl          = 'no',
+  $irc_autoconnect  = 'no',
+  $irc_autosendcmd  = '/^msg C nick IDENTIFY mybotpassword',
+  $channel_name     = '#main_channel',
+  $channel_chatnet  = 'geeknode',
+  $channel_passwd   = 'password',
+  $channel_autojoin = 'Yes',
+  $nickname         = 'nagbot',
+  $nagios_command   = '/var/lib/nagios3/rw/live',
+  $fifo_remote_file = '/home/tc-14/var/nagios-fifo'
+
+) {
+
+  package { 'nagbot':
+    ensure => installed,
+  }
+
+  file { '/etc/nagbot/config' :
+    ensure  => present,
+    owner   => 'nagbot',
+    group   => 'nagbot',
+    mode    => '0644',
+    content => template('nagbot/config.erb'),
+    require => Package['nagbot'],
+  }
+
+}

+ 14 - 0
extras/puppet-nagbot/metadata.json

@@ -0,0 +1,14 @@
+{
+  "name": "puppet-nagbot",
+  "version": "1.0.0",
+  "author": "sbadia",
+  "summary": "Irssi bot to handle nagios/irssi communication.",
+  "license": "Apache 2.0",
+  "source": "https://code.ffdn.org/asr/nagios-irssi.git",
+  "project_page": "https://code.ffdn.org/asr/nagios-irssi",
+  "issues_url": "https://code.ffdn.org/asr/nagios-irssi/issues",
+  "dependencies": [
+    {"name":"puppetlabs-stdlib","version_requirement":">= 1.0.0"}
+  ]
+}
+

+ 7 - 0
extras/puppet-nagbot/spec/classes/init_spec.rb

@@ -0,0 +1,7 @@
+require 'spec_helper'
+describe 'nagbot' do
+
+  context 'with defaults for all parameters' do
+    it { should contain_class('nagbot') }
+  end
+end

+ 1 - 0
extras/puppet-nagbot/spec/spec_helper.rb

@@ -0,0 +1 @@
+require 'puppetlabs_spec_helper/module_spec_helper'

+ 262 - 0
extras/puppet-nagbot/templates/config.erb

@@ -0,0 +1,262 @@
+# Managed by puppet
+# Module:: nagbot
+#
+servers = (
+  {
+    address = "<%= @irc_server %>";
+    chatnet = "<%= @irc_chatnet %>";
+    autoconnect = "<%= @irc_autoconnect %>";
+    port = "<%= @irc_port %>";
+    use_ssl = "<%= @irc_ssl %>";
+    autosendcmd = "<%= @irc_autosendcmd %>";
+  }
+);
+
+chatnets = {};
+
+channels = (
+###################################
+  {
+    name = "<%= @channel_name %>";
+    chatnet = "<%= @channel_chatnet %>";
+    password = "<%= @channel_passwd %>";
+    autojoin = "<%= @channel_autojoin %>";
+  }
+);
+###################################
+
+aliases = {
+  J = "join";
+  WJOIN = "join -window";
+  WQUERY = "query -window";
+  LEAVE = "part";
+  BYE = "quit";
+  EXIT = "quit";
+  SIGNOFF = "quit";
+  DESCRIBE = "action";
+  DATE = "time";
+  HOST = "userhost";
+  LAST = "lastlog";
+  SAY = "msg *";
+  WI = "whois";
+  WII = "whois $0 $0";
+  WW = "whowas";
+  W = "who";
+  N = "names";
+  M = "msg";
+  T = "topic";
+  C = "clear";
+  CL = "clear";
+  K = "kick";
+  KB = "kickban";
+  KN = "knockout";
+  BANS = "ban";
+  B = "ban";
+  MUB = "unban *";
+  UB = "unban";
+  IG = "ignore";
+  UNIG = "unignore";
+  SB = "scrollback";
+  UMODE = "mode $N";
+  WC = "window close";
+  WN = "window new hide";
+  SV = "say Irssi $J ($V) - http://irssi.org/";
+  GOTO = "sb goto";
+  CHAT = "dcc chat";
+  RUN = "SCRIPT LOAD";
+  SBAR = "STATUSBAR";
+  INVITELIST = "mode $C +I";
+  Q = "QUERY";
+  "MANUAL-WINDOWS" = "set use_status_window off;set autocreate_windows off;set autocreate_query_level none;set autoclose_windows off;set reuse_unused_windows on;save";
+  EXEMPTLIST = "mode $C +e";
+  ATAG = "WINDOW SERVER";
+};
+
+
+#######################
+# Cosmetic parameters #
+#######################
+
+statusbar = {
+  # formats:
+  # when using {templates}, the template is shown only if it's argument isn't
+  # empty unless no argument is given. for example {sb} is printed always,
+  # but {sb $T} is printed only if $T isn't empty.
+
+  items = {
+    # start/end text in statusbars
+    barstart = "{sbstart}";
+    barend = "{sbend}";
+
+    topicbarstart = "{topicsbstart}";
+    topicbarend = "{topicsbend}";
+
+    # treated "normally", you could change the time/user name to whatever
+    time = "{sb $Z}";
+    user = "{sb {sbnickmode $cumode}$N{sbmode $usermode}{sbaway $A}}";
+
+    # treated specially .. window is printed with non-empty windows,
+    # window_empty is printed with empty windows
+    window = "{sb $winref:$itemname{sbmode $M}}";
+    window_empty = "{sb $winref{sbservertag $tag}}";
+    prompt = "{prompt $[.15]itemname}";
+    prompt_empty = "{prompt $winname}";
+    topic = " $topic";
+    topic_empty = " Irssi v$J - http://irssi.org/help/";
+
+    # all of these treated specially, they're only displayed when needed
+    lag = "{sb Lag: $0-}";
+    act = "{sb Act: $0-}";
+    more = "-- more --";
+  };
+
+  # there's two type of statusbars. root statusbars are either at the top
+  # of the screen or at the bottom of the screen. window statusbars are at
+  # the top/bottom of each split window in screen.
+  default = {
+    # the "default statusbar" to be displayed at the bottom of the window.
+    # contains all the normal items.
+    window = {
+      disabled = "no";
+
+      # window, root
+      type = "window";
+      # top, bottom
+      placement = "bottom";
+      # number
+      position = "1";
+      # active, inactive, always
+      visible = "active";
+
+      # list of items in statusbar in the display order
+      items = {
+        barstart = { priority = "100"; };
+        time = { };
+        user = { };
+        window = { };
+        window_empty = { };
+        lag = { priority = "-1"; };
+        act = { priority = "10"; };
+        more = { priority = "-1"; alignment = "right"; };
+        barend = { priority = "100"; alignment = "right"; };
+        usercount = { };
+      };
+    };
+
+    # statusbar to use in inactive split windows
+    window_inact = {
+      type = "window";
+      placement = "bottom";
+      position = "1";
+      visible = "inactive";
+      items = {
+        barstart = { priority = "100"; };
+        window = { };
+        window_empty = { };
+        more = { priority = "-1"; alignment = "right"; };
+        barend = { priority = "100"; alignment = "right"; };
+      };
+    };
+
+    # we treat input line as yet another statusbar :) It's possible to
+    # add other items before or after the input line item.
+    prompt = {
+      type = "root";
+      placement = "bottom";
+      # we want to be at the bottom always
+      position = "100";
+      visible = "always";
+      items = {
+        prompt = { priority = "-1"; };
+        prompt_empty = { priority = "-1"; };
+        # treated specially, this is the real input line.
+        input = { priority = "10"; };
+      };
+    };
+
+    # topicbar
+    topic = {
+      type = "root";
+      placement = "top";
+      position = "1";
+      visible = "always";
+      items = {
+        topicbarstart = { priority = "100"; };
+        topic = { };
+        topic_empty = { };
+        topicbarend = { priority = "100"; alignment = "right"; };
+      };
+    };
+    awl_0 = {
+      items = {
+        barstart = { priority = "100"; };
+        awl_0 = { };
+        barend = { priority = "100"; alignment = "right"; };
+      };
+    };
+  };
+};
+settings = {
+  "irc/core" = {
+    join_auto_chans_on_invite = "yes";
+    ctcp_version_reply = "nagbot 42";
+  };
+  core = {
+    real_name = "Protocol Droid 42, at your service.";
+    user_name = "<%= @nickname %>";
+    nick = "<%= @nickname %>";
+    recode_out_default_charset = "= utf8";
+    recode_autodetect_utf8 = "yes";
+    quit_message = "Sir, the possibility of successfully navigating an asteroid field is approximately 3,720 to 1. We should turn ar...";
+  };
+  "perl/core/scripts" = {
+    charsetwars_convert_in = "yes";
+    charsetwars_convert_out = "yes";
+    charsetwars_own = "utf";
+###################################
+    autorejoin_channels = "<%= @channel_name %>";
+    nagios_ack_channel = "<%= @channel_name %>";
+    nagios_ack_nick = "";
+    nagios_command = "<%= @nagios_command %>";
+    fifo_remote_file = "<%= @fifo_remote_file %>";
+}
+  };
+  "fe-common/core" = {
+    term_charset = "utf8";
+    autolog = "yes";
+    autolog_colors = "no";
+    autocreate_query_level = "NONE";
+  };
+  "fe-text" = { actlist_sort = "refnum"; };
+};
+conversions = {};
+hilights = ( { text = "<%= @nickname %>"; nick = "yes"; word = "yes"; } );
+windows = {
+  1 = {
+    immortal = "yes";
+    name = "(status)";
+    level = "ALL";
+    sticky = "yes";
+  };
+  2 = { immortal = "yes"; name = "hilight"; sticky = "yes"; };
+  3 = {
+###################################
+    items = (
+      {
+        type = "CHANNEL";
+        chat_type = "IRC";
+        name = "<%= @channel_name %>";
+        tag = "GeekNode";
+      }
+    );
+    sticky = "yes";
+###################################
+  };
+};
+mainwindows = {
+  2 = { first_line = "1"; lines = "5"; };
+  3 = { first_line = "19"; lines = "53"; };
+  1 = { first_line = "6"; lines = "13"; };
+};
+logs = { };
+ignores = ( { level = "CTCPS"; } );

+ 12 - 0
extras/puppet-nagbot/tests/init.pp

@@ -0,0 +1,12 @@
+# The baseline for module testing used by Puppet Labs is that each manifest
+# should have a corresponding test manifest that declares that class or defined
+# type.
+#
+# Tests are then run by using puppet apply --noop (to check for compilation
+# errors and view a log of events) or by fully applying the test in a virtual
+# environment (to compare the resulting system state to the desired state).
+#
+# Learn more about module testing here:
+# http://docs.puppetlabs.com/guides/tests_smoke.html
+#
+include nagbot