Nagios Conference 2011 - Michael Medin - Workshop: Scripting On The Windows Side
Upcoming SlideShare
Loading in...5
×
 

Nagios Conference 2011 - Michael Medin - Workshop: Scripting On The Windows Side

on

  • 2,440 views

Michael Medin's workshop on Windows scripting for Nagios. The workshop was given during the Nagios World Conference North America held Sept 27-29th, 2011 in Saint Paul, MN. For more information on the ...

Michael Medin's workshop on Windows scripting for Nagios. The workshop was given during the Nagios World Conference North America held Sept 27-29th, 2011 in Saint Paul, MN. For more information on the conference (including photos and videos), visit: http://go.nagios.com/nwcna

Statistics

Views

Total Views
2,440
Views on SlideShare
2,355
Embed Views
85

Actions

Likes
0
Downloads
24
Comments
0

1 Embed 85

http://exchange.nagios.org 85

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Hello my name is Michael Medin.I am from Stockholm, Sweden.I will give this in English just because I think everyone else does...If there are any questions or such just chime in.Feel free to ask questions in Swedish if you wish.
  • Standard Disclaimer - My views (not anyone else's) - Not peer reviewed so I could be lying to you. - If you 2 billion dollar servers crash: life sucksLets simplify this a bit…
  • cmd /c is because we need to capture the “exit code” normally exit will exit all running shellsWe get the message but no error codeUse echo %ERRORLEVEL% to display the exit code
  • We run the scriptGet the error code (Critical) and the Message (...)But we get no performance data
  • We run the scriptGet the error code (Critical) and the Message (...)But we get no performance data
  • 2 minutes
  • 2 minutes
  • 2 minutes

Nagios Conference 2011 - Michael Medin - Workshop: Scripting On The Windows Side Nagios Conference 2011 - Michael Medin - Workshop: Scripting On The Windows Side Presentation Transcript

  • Scripting...
    …on the Windows side
  • These slides represent the work and opinions of the author and do not constitute official positions of any organization sponsoring the author’s work
    This material has not been peer reviewed and is presented here as-is with the permission of the author.
    The author assumes no liability for any content or opinion expressed in this presentation and or use of content herein.
    Disclaimer!
    It is not their fault!
    It is not my fault!
    It is your fault!
  • External Scripts
    Internal Scripts
    Arguments
    Scripting: Batch files
    Wrapped scripts
    Scripting: VBA
    Internal Scripts
    Agenda
  • Windows monitoring
    NSClient++ (from a scripters perspecitve)
  • External Scripts
    The normal kind of scripts
    Can be written in:
    Batch
    VBA/VBScript (pretty popular on Windows)
    Powershell (a rather strange language)
    But also:
    Perl, python, bash, etc etc…
    Internal Scripts
    Can interact with (other) internal commands
    Can access settings
    Can hold state
    Can be written in:
    Lua
    Python (requires python on the machine)
    Two kinds of scripts
  • Enable the check module
    [/modules]
    CheckExternalScripts= # Runs the script
    NRPEServer= # NRPE server
    Each script requires a definition
    [/settings/External Scripts]
    check_es_test=scriptstest.bat
    Options disabled by default (for a reason)
    allow arguments = false
    allow nasty characters = false
    Configuring External Scripts
  • Enable the check module
    [/modules]
    LUAScript=
    PythonScript=
    Each script requires a definition
    [/settings/LUA/Scripts]
    <alias>=test.lua
    [/settings/python/Scripts]
    <alias>=test.py
    Scripts requires NRPE/NSCA (or NSCP)
    [/modules]
    NRPEServer=
    Configuring Internal Scripts
  • Can be configured in many places
    Is probably more confusing then it is worth
    The server module
    Means NO commands can have arguments
    The script module
    Means NO external script can have arguments
    Allow arguments
  • Allow arguments
  • Writing our first Scripts
    The first batch script
  • Output:
    Use: echo <text>
    Don’t forget @echo off (or all commands will be echoed)
    Exit statuses:
    Use: exit <code>
    0 = OK
    1 = Warning
    2 = Critical
    3 = Unknown
    NSC.ini syntax:
    [/settings/External Scripts/scripts]
    my_script=scriptsscript.bat
    Reference:
    http://www.ss64.com/nt/
    Don’t let preconceptions fool you: batch can actually do a lot!
    Writing a Script (Batch)
  • @echo off
    echo CRITICAL: Everything is not going to be fine
    exit 2
    A basic script (batch)
  • …NSClient++scripts>cmd /ctest.bat
    CRITICAL: Everything is not going to be fine
    …NSClient++scripts>echo %ERRORLEVEL%
    2
    Running from Command Line
  • D:demo>nscp --test
    NSClient++ 0,4,0,98 2011-09-06 x64 booting...
    Boot.ini found in: D:/demo//boot.ini
    Boot order: ini://${shared-path}/nsclient.ini, old://${exe-path}/nsc.ini
    Activating: ini://${shared-path}/nsclient.ini
    Creating instance for: ini://${shared-path}:80/nsclient.ini
    Reading INI settings from: D:/demo//nsclient.ini
    Loading: D:/demo//nsclient.ini from ini://${shared-path}/nsclient.ini
    Booted settings subsystem...
    On crash: restart: NSClientpp
    Archiving crash dumps in: D:/demo//crash-dumps
    booting::loading plugins
    Found: CheckExternalScripts as
    Processing plugin: CheckExternalScripts.dll as
    addPlugin(D:/demo//modules/CheckExternalScripts.dll as )
    Loading plugin: Check External Scripts as
    NSClient++ - 0,4,0,98 2011-09-06 Started!
    Enter command to inject or exit to terminate...
    Running from NSClient
  • Enter command to inject or exit to terminate...
    my_scripts
    Injecting: my_script...
    Arguments:
    Result my_script: WARNING
    WARNING:Hello World
    Running from NSClient
    Command
    Return Status
    Return Message
  • Demo
    Writing our first Scripts
  • Writing our first Scripts
    Killing notepad once and or all!
  • TASKKILL [/S dator [/U användarnamn [/P lösenord]]]]
    { [/FI filter] [/PID process-ID | /IM avbildning] } [/T][/F]
    Beskrivning:
    Det här verktyget används för att avsluta en eller flera aktiviteter
    utifrån process-ID (PID) eller avbildningsnamn.
    Parameterlista:

    /FI filter Använder ett filter för att välja aktiviteter.
    Jokertecknet * kan användas, t.ex:
    imagenameeq note*
    /PID process-ID Anger process-ID för den process som ska avbrytas.
    Använd kommandot Tasklist för att hämta process-ID
    /IM avbildning Anger avbildning för den process som
    för den process som ska avslutas. Jokertecknet *
    användas för att ange alla aktiviteter eller
    avbildningar.
    Killing notepad once and for all!
  • @echo off
    taskkill /im notepad.exe 1>NUL 2>NUL
    IF ERRORLEVEL 128 GOTO err
    IF ERRORLEVEL 0 GOTO ok
    GOTO unknown
    :unknown
    echo UNKNOWN: unknown problem killing notepad...
    exit /B 3
    :err
    echo CRITICAL: Notepad was not killed...
    exit /B 1
    :ok
    echo OK: Notepad was killed!
    exit /B 0
    KILL!!!
  • Demo
    Killing notepad…
  • Wrapped scripts
    Interlude
  • NSC.ini syntax:
    [External Scripts]
    check_bat=scriptscheck_test.bat
    Or
    [Wrapped Scripts]
    check_test=check_test.bat
    Adding a Script (.bat)
  • NSC.ini syntax:
    [External Scripts]
    check_test=cscript.exe /T:30 /NoLogo scriptscheck_test.vbs
    Or
    [Wrapped Scripts]
    check_test=check_test.vbs
    Adding a Script (.VBS)
  • NSC.ini syntax:
    [External Scripts]
    check_test=cscript.exe /T:30 /NoLogo scriptslibwrapper.vbs scriptscheck_test.vbs
    Or
    [Wrapped Scripts]
    check_test=check_test.vbs
    Adding a Script (.VBS) w/ libs
  • NSC.ini syntax:
    [External Scripts]
    check_test=cmd /c echo scriptscheck_test.ps1; exit($lastexitcode) | powershell.exe -command -
    Or
    [Wrapped Scripts]
    check_test=check_test.ps1
    Adding a Script (.PS1)
  • […/wrappings]
    bat=scripts%SCRIPT% %ARGS%
    vbs=cscript.exe //T:30 //NoLogo scriptslibwrapper.vbs %SCRIPT% %ARGS%
    ps1=cmd /c echo scripts%SCRIPT% %ARGS%; exit($lastexitcode) | powershell.exe -command -
    […/wrapped scripts]
    check_test_vbs=check_test.vbs /arg1:1 /variable:1
    check_test_ps1=check_test.ps1 arg1 arg2
    check_test_bat=check_test.bat $ARG1$ arg2
    check_battery=check_battery.vbs
    check_printer=check_printer.vbs
    ; So essentially it is a macro! (but a nice one)
    What is wrapped scripts?
  • Writing your first Scripts
    Writing a simple VB script
  • Output:
    Use: Wscript.StdOut.WriteLine <text>
    Exit statuses:
    Use: Wscript.Quit(<code>)
    0 = OK
    1 = Warning
    2 = Critical
    3 = Unknown
    NSC.ini syntax:
    [External Scripts]
    check_vbs=cscript.exe //T:30 //NoLogo scriptscheck_vbs.vbs
    //T:30 Is the timeout and might need to be changed.
    Reference:
    http://msdn.microsoft.com/en-us/library/t0aew7h6(VS.85).aspx
    Writing a Script (VBS)
  • wscript.echo ”Hello World"
    wscript.quit(0)
    Hello_World.vbs
  • Set <variable name>=CreateObject(“<COM Object>")
    There is A LOT of objects you can create
    A nice way to interact with other applications
    For instance:
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = True
    Set objDoc = objWord.Documents.Add()
    Set objSelection = objWord.Selection
    objSelection.Font.Name = “Comic Sans MS"
    objSelection.Font.Size = “28"
    objSelection.TypeText“Hello World"
    objSelection.TypeParagraph()
    objSelection.Font.Size = "14"
    objSelection.TypeText "" & Date()
    objSelection.TypeParagraph()
    Object oriented programming (ish)
  • Demo:
    Words…
  • strFile=”c:windows”
    Dim oFSO
    Set oFSO=CreateObject("Scripting.FileSystemObject")
    If oFSO.FileExists(strFile) Then
    wscript.echo”Yaay!"
    wscript.quit(0)
    else
    wscript.echo“Whhh… what the f***!"
    wscript.quit(2)
    end if
    Are we running windows?
  • Demo:
    Are we running Windows?
  • Using the library
    Dissecting a VBScript
  • Can be used to extend NSClient++
    Are very powerful
    A good way to:
    Alter things you do not like
    Create advanced things
    Are written in Lua or Python
    Possibly unsafe
    Runs inside NSClient++
    Internal Scripts
  • Internal scripts are fundamentally different
    One script is NOT equals to one function
    A script (at startup) can:
    Register query (commands) handlers
    Register submission (passive checks) handlers
    Register exec handlers
    Register configuration
    Access configuration
    Handlers can:
    Execute queries (commands)
    Submit submissions (passive checks)
    Etc etc…
    Anatomy of an internal script
  • definit(plugin_id, plugin_alias, script_alias):
    conf = Settings.get()
    reg = Registry.get(plugin_id)
    reg.simple_cmdline('help', get_help)
    reg.simple_function(‘command', cmd, ‘A command…')
    conf.set_int('hello', 'python', 42)
    log(Answer: %d'%conf.get_int('hello','python',-1))
    def shutdown():
    log(“Shutting down…”)
    A basic script
  • defget_help(arguments):
    return (status.OK, ‘Im not helpful ')
    def test(arguments):
    core = Core.get()
    count = len(arguments)
    (retcode, retmessage, retperf) =
    core.simple_query(‘CHECK_NSCP’, [])
    return (status.OK, ‘Life is good… %d'%count)
    A basic script
  • Questions?
    Q&A
  • Michael Medin
    michael@medin.name
    http://www.linkedin.com/in/mickem
    Information about NSClient++
    http://nsclient.org
    Facebook: facebook.com/nsclient
    Slides, and examples
    http://nsclient.org/nscp/conferances/2011/nwcna/
    Thank You!