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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

2,028
views

Published on

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

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,028
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 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
  • Transcript

    • 1. Scripting...
      …on the Windows side
    • 2. 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!
    • 3. External Scripts
      Internal Scripts
      Arguments
      Scripting: Batch files
      Wrapped scripts
      Scripting: VBA
      Internal Scripts
      Agenda
    • 4. Windows monitoring
      NSClient++ (from a scripters perspecitve)
    • 5. 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
    • 6. 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
    • 7. 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
    • 8. 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
    • 9. Allow arguments
    • 10. Writing our first Scripts
      The first batch script
    • 11. 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)
    • 12. @echo off
      echo CRITICAL: Everything is not going to be fine
      exit 2
      A basic script (batch)
    • 13. …NSClient++scripts>cmd /ctest.bat
      CRITICAL: Everything is not going to be fine
      …NSClient++scripts>echo %ERRORLEVEL%
      2
      Running from Command Line
    • 14. 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
    • 15. 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
    • 16. Demo
      Writing our first Scripts
    • 17. Writing our first Scripts
      Killing notepad once and or all!
    • 18. 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!
    • 19. @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!!!
    • 20. Demo
      Killing notepad…
    • 21. Wrapped scripts
      Interlude
    • 22. NSC.ini syntax:
      [External Scripts]
      check_bat=scriptscheck_test.bat
      Or
      [Wrapped Scripts]
      check_test=check_test.bat
      Adding a Script (.bat)
    • 23. 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)
    • 24. 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
    • 25. 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)
    • 26. […/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?
    • 27. Writing your first Scripts
      Writing a simple VB script
    • 28. 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)
    • 29. wscript.echo ”Hello World"
      wscript.quit(0)
      Hello_World.vbs
    • 30. 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)
    • 31. Demo:
      Words…
    • 32. 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?
    • 33. Demo:
      Are we running Windows?
    • 34. Using the library
      Dissecting a VBScript
    • 35. 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
    • 36. 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
    • 37. 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
    • 38. 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
    • 39. Questions?
      Q&A
    • 40. 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!