Quantcast
Channel: Maximilian Thoma – LANbugs
Viewing all 65 articles
Browse latest View live

socat: Pfiffiges Tool zum Mappen von IPv6 auf IPv4 Adressen

$
0
0

Wer gerade vor dem Problem steht alle Dienste auf seinen Linux Maschinen IPv4/IPv6 Dualstack fähig zu machen, der ist froh wenn er so ein Tool wie socat findet.

Es sind zwar die meisten Linux Dienste bereits Dualstack fähig aber es gibt vereinzelt noch Dienste wo keine regelmäßige bis keine Pflege der Software stattfindet.

socat ist quasi ein IPv6 -> IPv4 Relay. Das Paket ist im Packet Repository von Debian / Ubuntu verfügbar.

Beschreibung von socat aus der README des Pakets:

socat is a relay for bidirectional data transfer between two independent data
channels. Each of these data channels may be a file, pipe, device (serial line
etc. or a pseudo terminal), a socket (UNIX, IP4, IP6 - raw, UDP, TCP), an
SSL socket, proxy CONNECT connection, a file descriptor (stdin etc.), the GNU
line editor (readline), a program, or a combination of two of these.
These modes include generation of "listening" sockets, named pipes, and pseudo
terminals.

socat can be used, e.g., as TCP port forwarder (one-shot or daemon), as an
external socksifier, for attacking weak firewalls, as a shell interface to UNIX
sockets, IP6 relay, for redirecting TCP oriented programs to a serial line, to
logically connect serial lines on different computers, or to establish a
relatively secure environment (su and chroot) for running client or server
shell scripts with network connections.

Many options are available to refine socats behaviour:
terminal parameters, open() options, file permissions, file and process owners,
basic socket options like bind address, advanced socket options like IP source
routing, linger, TTL, TOS (type of service), or TCP performance tuning.

More capabilities, like daemon mode with forking, client address check,
"tail -f" mode, some stream data processing (line terminator conversion),
choosing sockets, pipes, or ptys for interprocess communication, debug and
trace options, logging to syslog, stderr or file, and last but not least
precise error messages make it a versatile tool for many different purposes.

In fact, many of these features already exist in specialized tools; but until
now, there does not seem to exists another tool that provides such a generic,
flexible, simple and almost comprehensive (UNIX) byte stream connector.

Das Tool kann noch wesentlich mehr, Infos findet man auf der Webseite des Programmierers http://www.dest-unreach.org/socat/.

Ich habe das für meinen alten SKS Keyserver verwendet, der noch kein IPv6 beherrscht. Ich lasse das ganze in einzelnen Screens laufen.

screen -dmS socat1 socat TCP6-LISTEN:11370,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11370
screen -dmS socat2 socat TCP6-LISTEN:11371,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11371
screen -dmS socat3 socat TCP6-LISTEN:80,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11371

Damit das ganze auch noch einen Neustart überlebt kann man es noch in die /etc/rc.local vor dem „exit 0“ einfügen.


Massenhafte Änderungen von Datei und Verzeichnis Rechten unter Linux

$
0
0

Ich habe gerade das Tool OpenTimeTool auf einem Server installiert. Im Paket sind alle Dateien und Verzeichnisse mit 777 Rechten vorhanden. Man sollte wenn die Kiste im Internet steht die Berechtungungen schon ein wenig restriktiver vergeben. Normalerweise haben Dateien auf einem Webserver eine 644 Maske und Verzeichnisse eine 755 Maske.

foo@bar:/var/www/bar/opentimetool/test# ls -la
insgesamt 2404
drwxr-xr-x  7 root   root      4096 2011-07-21 15:10 .
drwxr-xr-x  8 foo    foo       4096 2011-07-21 15:10 ..
-rwxrwxrwx  1 root   root      9513 2011-04-18 22:12 CHANGELOG
drwxrwxrwx  3 root   root      4096 2011-04-18 22:25 classes
-rwxrwxrwx  1 root   root      1371 2008-10-21 21:20 config-local.php.dist
-rwxrwxrwx  1 root   root      8179 2011-04-18 22:12 config.php
-rwxrwxrwx  1 root   root      3642 2011-01-05 00:10 db_upgrade.php
drwxrwxrwx  3 root   root      4096 2011-04-18 22:25 docs
drwxrwxrwx  9 root   root      4096 2011-04-18 22:25 htdocs
drwxrwxrwx 15 root   root      4096 2011-04-18 22:25 includes
-rwxrwxrwx  1 root   root      1546 2008-03-18 15:45 index.php
-rwxrwxrwx  1 root   root     22871 2011-01-05 00:10 init.php
-rwxrwxrwx  1 root   root      2983 2008-09-22 18:51 INSTALL
-rwxrwxrwx  1 root   root      2403 2008-09-22 18:51 INSTALL.de
-rwxrwxrwx  1 root   root     18009 2008-03-18 15:45 LICENSE
-rwxrwxrwx  1 root   root        17 2008-03-18 15:45 media
-rwxrwxrwx  1 root   root       856 2008-03-18 15:45 messages.php
-rwxrwxrwx  1 root   root       717 2008-10-21 21:20 mobile_access.README
drwxrwxrwx  2 root   root      4096 2011-04-18 22:25 mobile_login
-rwxrwxrwx  1 root   root     63312 2010-09-09 10:24 mysql.sql
-rw-r--r--  1 root   root   2201345 2011-04-27 22:02 openTimetool_2.3.1.tar.gz
-rwxrwxrwx  1 root   root       214 2008-03-18 15:45 phpinfo.php
-rwxrwxrwx  1 root   root       676 2008-03-18 15:45 README
-rwxrwxrwx  1 root   root       915 2008-03-18 15:45 SafeMode.README
-rwxrwxrwx  1 root   root       709 2008-03-24 21:18 Suhosin-README.txt
-rwxrwxrwx  1 root   root     10215 2008-03-18 15:45 TODO
-rwxrwxrwx  1 root   root     10761 2010-02-09 09:59 translate_de.sql
-rwxrwxrwx  1 root   root      9243 2010-02-09 09:59 translate_en.sql
-rwxrwxrwx  1 root   root       982 2010-02-09 09:59 update.README

Mit den Linuxboardmitteln kann man sich viel Arbeit sparen. Mit „find“ kann ich einen Parameter -type mitgeben wo ich entweder Dateien (f = Files) oder Verzeichnisse (d = Directory) als Ergebnis zurückgeben lassen kann. Mit dem Parameter -exec kann ich anschließend direkt ein Kommando ausführen und das gefundene als Parameter ({}) mitgeben.

find /var/www/bar/opentimetool/test -type f -exec chmod 644 {} \;
find /var/www/bar/opentimetool/test -type d -exec chmod 755 {} \;

Zuletzt sollte man noch den Benutzer und die Gruppe richtig setzen.

chown www-data:www-data -R /var/www/bar/opentimetool/test

Das Resultat sieht dann wie folgt aus:

foo@bar:/var/www/opentimetool/test# ls -la
insgesamt 2404
drwxr-xr-x  7 www-data www-data    4096 2011-07-21 15:10 .
drwxr-xr-x  8 foo      foo         4096 2011-07-21 15:10 ..
-rw-r--r--  1 www-data www-data    9513 2011-04-18 22:12 CHANGELOG
drwxr-xr-x  3 www-data www-data    4096 2011-04-18 22:25 classes
-rw-r--r--  1 www-data www-data    1371 2008-10-21 21:20 config-local.php.dist
-rw-r--r--  1 www-data www-data    8179 2011-04-18 22:12 config.php
-rw-r--r--  1 www-data www-data    3642 2011-01-05 00:10 db_upgrade.php
drwxr-xr-x  3 www-data www-data    4096 2011-04-18 22:25 docs
drwxr-xr-x  9 www-data www-data    4096 2011-04-18 22:25 htdocs
drwxr-xr-x 15 www-data www-data    4096 2011-04-18 22:25 includes
-rw-r--r--  1 www-data www-data    1546 2008-03-18 15:45 index.php
-rw-r--r--  1 www-data www-data   22871 2011-01-05 00:10 init.php
-rw-r--r--  1 www-data www-data    2983 2008-09-22 18:51 INSTALL
-rw-r--r--  1 www-data www-data    2403 2008-09-22 18:51 INSTALL.de
-rw-r--r--  1 www-data www-data   18009 2008-03-18 15:45 LICENSE
-rw-r--r--  1 www-data www-data      17 2008-03-18 15:45 media
-rw-r--r--  1 www-data www-data     856 2008-03-18 15:45 messages.php
-rw-r--r--  1 www-data www-data     717 2008-10-21 21:20 mobile_access.README
drwxr-xr-x  2 www-data www-data    4096 2011-04-18 22:25 mobile_login
-rw-r--r--  1 www-data www-data   63312 2010-09-09 10:24 mysql.sql
-rw-r--r--  1 www-data www-data 2201345 2011-04-27 22:02 openTimetool_2.3.1.tar.gz
-rw-r--r--  1 www-data www-data     214 2008-03-18 15:45 phpinfo.php
-rw-r--r--  1 www-data www-data     676 2008-03-18 15:45 README
-rw-r--r--  1 www-data www-data     915 2008-03-18 15:45 SafeMode.README
-rw-r--r--  1 www-data www-data     709 2008-03-24 21:18 Suhosin-README.txt
-rw-r--r--  1 www-data www-data   10215 2008-03-18 15:45 TODO
-rw-r--r--  1 www-data www-data   10761 2010-02-09 09:59 translate_de.sql
-rw-r--r--  1 www-data www-data    9243 2010-02-09 09:59 translate_en.sql
-rw-r--r--  1 www-data www-data     982 2010-02-09 09:59 update.README

Postfix: Mail-Relay mit SMTP-Auth via Submission/TLS für ausgehende Mails

$
0
0

Ein Server soll als Relayhost (oder in der Windowswelt auch Smarthost gennant) dienen. Wer keine feste IP Adresse mit passenden DNS Reverse Eintrag hat wird schlechte Chancen haben das ein richtig konfigurierter Mailserver die Mails annehmen wird. Die Lösung ist die Mails an einen anderen Relayhost oder Mailserver zu schicken und dieser stellt dann die Mails zu. Manchmal bieten die Provider selbst Relayhosts an in vielen Fällen bleibt nichts anderes übrig als das ganze über ein Postfach zu versenden. Einige Provider bieten das Anliefern von Mails nur noch über Submission (TCP/587) und TLS verschlüsselt an. Ist mir persönlich auch lieber …

Beispielszenario

Provider: example.net

Mailaccount: user1@example.net Password: example%1

Mailserver: mail.example.net

Submission (TCP/587) und TLS sind notwendig.

 Lösung

„/etc/postfix/main.cf“ ergänzen mit:

relayhost = mail.example.net:submission
smtp_use_tls=yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth
smtp_sasl_security_options = noanonymous, noplaintext
smtp_sasl_tls_security_options = noanonymous

/etc/postfix/smtp_auth (Map-Datei, muss initialisiert werden!!!)

mail.example.net:submission               user1@example.net:example%1

Folgende Kommandos sind noch auszuführen:

postmap /etc/postfix/smtp_auth

durchführen um die Datei zu mappen.

/etc/init.d/postfix restart

durchführen um die Änderungen zu aktivieren.

Ubuntu/Debian: Eigene Rootzertifikate importieren und vertrauen

$
0
0

Um Zertifikatsfehler bei eigenen CAs zu beseitigen muss man das Root CA Zertifikat dem Zertifikatsstore des Betriebssystems bekannt machen.

Das Root CA Zertifikat muss im Ordner /usr/share/ca-certificates abgelegt werden mit der Endung .crt (nicht .pem). Man sollte einen passenden und aussagekräfigen Namen für die Datei vergeben. Bei Ubuntu sind zusätzlich die Zertifikate in verschiedene Unterordner einsortiert. Wenn es mehrere sind kann man auch noch einen eigenen Ordner erstellen.

root@foobar:/usr/share/ca-certificates# ls -la
insgesamt 52
drwxr-xr-x  11 root root  4096 2011-07-29 12:29 .
drwxr-xr-x 101 root root  4096 2011-07-28 11:10 ..
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 brasil.gov.br
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 cacert.org
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 debconf.org
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 gouv.fr
drwxr-xr-x   2 root root 12288 2011-07-28 10:16 mozilla
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 signet.pl
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 spi-inc.org
drwxr-xr-x   2 root root  4096 2011-07-28 10:16 telesec.de

Nach dem Ablegen des Zertifikats muss man dieses noch installieren. Dazu ist das Kommando „dpkg-reconfigure ca-certificates“ auszuführen. Es öffnet sich ein Menü, hier ist sicherheitshalber „Fragen“ auszuwählen.

 ┌──────────────────────────────┤ ca-certificates configuration ├───────────────────────────────┐
 │ Dieses Paket kann neue Zertifikate von CAs (Zertifizierungsstellen) installieren, wenn ein   │
 │ Upgrade durchgeführt wird. Sie sollten solche neuen CA-Zertifikate vielleicht prüfen und     │
 │ nur Zertifikate auswählen, denen Sie vertrauen.                                              │
 │                                                                                              │
 │  - Ja    : neuen CA-Zertifikaten wird vertraut und sie werden installiert;                   │
 │  - Nein  : neue CA-Zertifikate werden standardmäßig nicht installiert;                       │
 │  - Fragen: fragt bei jedem neuen CA-Zertifikat nach.                                         │
 │                                                                                              │
 │ Neuen Zertifikaten von Zertifizierungsstellen vertrauen?                                     │
 │                                                                                              │
 │                                            Ja                                                │
 │                                            Nein                                              │
 │                                            Fragen                                            │
 │                                                                                              │
 │                                                                                              │
 │                                            <Ok>                                              │
 │                                                                                              │
 └──────────────────────────────────────────────────────────────────────────────────────────────┘

Im nächsten Screen muss das zu installierende Zertifikat markiert werden.

 

┌──────────────────────────────┤ ca-certificates configuration ├──────────────────────────────┐
│ Dieses Paket installiert gebräuchliche Zertifikate von CAs (Zertifizierungsstellen) unter   │
│ /usr/share/ca-certificates.                                                                 │
│                                                                                             │
│ Bitte wählen Sie die Zertifizierungsstellen aus, denen Sie vertrauen, damit deren           │
│ Zertifikate in /etc/ssl/certs installiert werden. Sie werden in eine einzige Datei          │
│ /etc/ssl/certs/ca-certificates.crt zusammengestellt.                                        │
│                                                                                             │
│ Zu aktivierende Zertifikate:                                                                │
│                                                                                             │
│    [*] brasil.gov.br/brasil.gov.br.crt                                                  ↑   │
│    [*] cacert.org/cacert.org.crt                                                        ▮   │
│    [*] debconf.org/ca.crt                                                               ▒   │
│    [*] gouv.fr/cert_igca_dsa.crt                                                        ▒   │
│    [*] gouv.fr/cert_igca_rsa.crt                                                        ▒   │
│    [ ] eigene-root-ca/root-ca.crt                                                       ▒   │
│    [*] mozilla/ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA.crt                            ▒   │
│    [*] mozilla/AddTrust_External_Root.crt                                               ↓   │
│                                                                                             │
│                                                                                             │
│                                           <Ok>                                              │
│                                                                                             │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

Das ganze mit OK bestätigen, das Zertifikat wird installiert.

Enterasys Logging & Debugging

$
0
0

Kürzlich wurde ich von einem Kunden mit einem Problem konfrontiert das im Enterasys NetSight im Traplog immer wieder „Incorrect Community Name“ auftaucht. SNMP war im NetSight korrekt konfiguriert. Der Kunde wollte wissen wer versucht auf dem Switch zuzugreifen per SNMP. In der Trap Meldung wird diese Information leider nicht mitgesendet. Die bekannten Debug Befehle die man von Cisco kennt gibt es nicht aber man kann den Enterasysgeräten auch einige Informationen entlocken wenn man weiß wo man suchen muss.

Man kann bei Enterasys das Loggingverhalten für verschiedene Systemdienste anpassen um mehr Informationen zu bekommen.

Mit dem Kommando „show logging application“ oder kurz „sh logg app“ angezeigt werden.

Hier eine Liste von den verschiedenen Switch Serien und Applications wo man das Logging ändern kann:
Enterasys B3 Serie:

         Application   Current Severity Level
---------------------------------------------
 89      CLIWEB                   6
 90      SNMP                     7
 91      STP                      6
 92      Driver                   6
 93      System                   7
 94      Stacking                 6
 112     UPN                      6
 118     Router                   6

1(emergencies)  2(alerts)       3(critical)
4(errors)       5(warnings)     6(notifications)
7(information)  8(debugging)

Enterasys C2 Serie:

         Application   Current Severity Level
---------------------------------------------
 89      CLIWEB                   6
 90      SNMP                     6
 91      STP                      6
 92      Driver                   6
 93      System                   6
 94      Stacking                 6
 95      RtrOspf                  6
 96      RtrMcast                 6
 97      RtrVrrp                  6
 112     UPN                      6
 118     Router                   6

1(emergencies)  2(alerts)       3(critical)
4(errors)       5(warnings)     6(notifications)
7(information)  8(debugging)

Enterasys N Serie:

        Application   Current Severity Level Server List
----------------------------------------------------------
  88    RtrAcl                           6      1-8,console,file
  89    CLI                              6      1-8,console,file
  90    SNMP                             6      1-8,console,file
  91    Webview                          6      1-8,console,file
  93    System                           6      1-8,console,file
  95    RtrFe                            6      1-8,console,file
  96    Trace                            6      1-8,console,file
 105    RtrLSNat                         6      1-8,console,file
 111    FlowLimt                         6      1-8,console,file
 112    UPN                              6      1-8,console,file
 117    AAA                              6      1-8,console,file
 118    Router                           6      1-8,console,file
 140    AddrNtfy                         6      1-8,console,file
 141    OSPF                             6      1-8,console,file
 142    VRRP                             6      1-8,console,file
 145    RtrArpProc                       6      1-8,console,file
 147    LACP                             6      1-8,console,file
 148    RtrNat                           6      1-8,console,file
 151    RtrTwcb                          6      1-8,console,file
 154    DbgIpPkt                         6      1-8,console,file
 158    HostDoS                          6      1-8,console,file
 180    RtrMcast                         6      1-8,console,file
 183    PIM                              6      1-8,console,file
 184    DVMRP                            6      1-8,console,file
 185    BGP                              6      1-8,console,file
 196    LinkFlap                         6      1-8,console,file
 199    Spoof                            6      1-8,console,file
 207    IPmcast                          6      1-8,console,file
 209    Spantree                         6      1-8,console,file
 211    trackobj                         6      1-8,console,file
 213    LinkTrap                         6      1-8,console,file
 214    CDP                              6      1-8,console,file
 215    LLDP                             6      1-8,console,file
 216    CiscoDP                          6      1-8,console,file
 222    Security                         6      1-8,console,file
 225    RMON                             6      1-8,console,file
 231    IPsec                            6      1-8,console,file

1(emergencies)  2(alerts)       3(critical)
4(errors)       5(warnings)     6(notifications)
7(information)  8(debugging)

Enterasys S Serie SSA (SW-release mit VSB = Virtual Chassis Bonding):

        Application   Current Severity Level Server List
----------------------------------------------------------
  88    RtrAcl                           6      1-8,console,file
  89    CLI                              6      1-8,console,file
  90    SNMP                             6      1-8,console,file
  91    Webview                          6      1-8,console,file
  93    System                           6      1-8,console,file
  95    RtrFe                            6      1-8,console,file
  96    Trace                            6      1-8,console,file
 105    RtrLSNat                         6      1-8,console,file
 111    FlowLimt                         6      1-8,console,file
 112    UPN                              6      1-8,console,file
 117    AAA                              6      1-8,console,file
 118    Router                           6      1-8,console,file
 140    AddrNtfy                         6      1-8,console,file
 141    OSPF                             6      1-8,console,file
 142    VRRP                             6      1-8,console,file
 145    RtrArpProc                       6      1-8,console,file
 147    LACP                             6      1-8,console,file
 148    RtrNat                           6      1-8,console,file
 151    RtrTwcb                          6      1-8,console,file
 154    DbgIpPkt                         6      1-8,console,file
 158    HostDoS                          6      1-8,console,file
 180    RtrMcast                         6      1-8,console,file
 183    PIM                              6      1-8,console,file
 184    DVMRP                            6      1-8,console,file
 185    BGP                              6      1-8,console,file
 196    LinkFlap                         6      1-8,console,file
 199    Spoof                            6      1-8,console,file
 207    IPmcast                          6      1-8,console,file
 209    Spantree                         6      1-8,console,file
 211    trackobj                         6      1-8,console,file
 213    LinkTrap                         6      1-8,console,file
 214    CDP                              6      1-8,console,file
 215    LLDP                             6      1-8,console,file
 216    CiscoDP                          6      1-8,console,file
 218    OAM                              6      1-8,console,file
 222    Security                         6      1-8,console,file
 225    RMON                             6      1-8,console,file
 231    IPsec                            6      1-8,console,file
 239    Bonding                          6      1-8,console,file
 242    HAUpgrade                        6      1-8,console,file

1(emergencies)  2(alerts)       3(critical)
4(errors)       5(warnings)     6(notifications)
7(information)  8(debugging)

Um jetzt mehr sehen zu können muss der Severity Level angepasst werden für die Application die man „debuggen“ will. Ein meinem Fall war es SNMP auf einem B3 Switch also => SNMP.

 
set logging application SNMP level 7

Wer die Informationen an einen Syslog Server senden will sollte noch einen Syslogserver hinterlegen mit den richtigen Severity Level.

 
set logging server 1 ip-addr 10.1.1.1 severity 8 description "default" state enable

Alternativ kann man sich die Syslogs auch auf der Console ausgeben lassen:

A/B/C/D/I-Serie auf Console:

 
set logging local console enable

A/B/C/D/I/N/S-Serie in File:

 
set logging local console disable file enable

N/S-Serie:

 
set logging here enable

Im Syslog tauchte dann auch das System auf das versucht hat mit einer falschen SNMP Community auf die Switche zuzugreifen. Es war ein Printer Verwaltungserver (HP Jetadmin) der die komplette IP-Range des Standorts scannt und versucht per SNMP Parameter von den Geräten abzufragen (Tonerstand, etc.)

 
<166>Feb 1 10:33:06 192.168.1.52-1 TRAPMGR[175072816]: traputil.c(475) 260 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.2-1 TRAPMGR[138984840]: traputil.c(475) 430 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.4-1 TRAPMGR[138984160]: traputil.c(475) 245 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.8-1 TRAPMGR[138983208]: traputil.c(475) 264 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.11-1 TRAPMGR[138983560]: traputil.c(475) 327 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.14-2 TRAPMGR[138984192]: traputil.c(475) 203 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.15-1 TRAPMGR[138983728]: traputil.c(475) 219 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.35-1 TRAPMGR[175050544]: traputil.c(475) 205 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:05 192.168.1.39-1 TRAPMGR[126209216]: traputil.c(466) 181 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.43-1 TRAPMGR[175061168]: traputil.c(475) 280 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.48-1 TRAPMGR[175067568]: traputil.c(475) 446 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.52-1 TRAPMGR[175072816]: traputil.c(475) 261 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.2-1 TRAPMGR[138984840]: traputil.c(475) 431 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.4-1 TRAPMGR[138984160]: traputil.c(475) 246 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.8-1 TRAPMGR[138983208]: traputil.c(475) 265 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.11-1 TRAPMGR[138983560]: traputil.c(475) 328 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:07 192.168.1.15-1 TRAPMGR[138983728]: traputil.c(475) 220 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.14-2 TRAPMGR[138984192]: traputil.c(475) 204 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.35-1 TRAPMGR[175050544]: traputil.c(475) 206 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:06 192.168.1.39-1 TRAPMGR[126209216]: traputil.c(466) 182 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.43-1 TRAPMGR[175061168]: traputil.c(475) 281 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.48-1 TRAPMGR[175067568]: traputil.c(475) 447 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.52-1 TRAPMGR[175072816]: traputil.c(475) 262 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.2-1 TRAPMGR[138984840]: traputil.c(475) 432 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.4-1 TRAPMGR[138984160]: traputil.c(475) 247 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.8-1 TRAPMGR[138983208]: traputil.c(475) 266 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.11-1 TRAPMGR[138983560]: traputil.c(475) 329 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.14-2 TRAPMGR[138984192]: traputil.c(475) 205 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.15-1 TRAPMGR[138983728]: traputil.c(475) 221 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.35-1 TRAPMGR[175050544]: traputil.c(475) 207 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:08 192.168.1.39-1 TRAPMGR[126209216]: traputil.c(466) 183 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.43-1 TRAPMGR[175061168]: traputil.c(475) 282 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.48-1 TRAPMGR[175067568]: traputil.c(475) 448 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.52-1 TRAPMGR[175072816]: traputil.c(475) 263 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.2-1 TRAPMGR[138984840]: traputil.c(475) 433 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.4-1 TRAPMGR[138984160]: traputil.c(475) 248 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.8-1 TRAPMGR[138983208]: traputil.c(475) 267 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.11-1 TRAPMGR[138983560]: traputil.c(475) 330 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.14-2 TRAPMGR[138984192]: traputil.c(475) 206 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.15-1 TRAPMGR[138983728]: traputil.c(475) 222 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:10 192.168.1.35-1 TRAPMGR[175050544]: traputil.c(475) 208 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:09 192.168.1.39-1 TRAPMGR[126209216]: traputil.c(466) 184 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:11 192.168.1.43-1 TRAPMGR[175061168]: traputil.c(475) 283 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26
<166>Feb 1 10:33:11 192.168.1.48-1 TRAPMGR[175067568]: traputil.c(475) 449 %% Authent. Failure: Unit: 1 IP Address: 192.168.7.26

Cisco ASA überflüssige Syslog Nachrichten deaktivieren

$
0
0

Das Syslog auf der Cisco ASA ist sehr geschwätzig und viele Nachrichten sind für das nachvollziehen von Verbindungen nicht notwendig.

Cisco Syslog Messages ASA: http://www.cisco.com/c/en/us/td/docs/security/asa/syslog/b_syslog.html

Folgende Syslog Typen lassen sich problemlos deaktivieren:

no logging message 302012Error Message %ASA-6-302012: Pre-allocate H225 Call Signalling Connection for faddr IP_address /port to laddr IP_address
no logging message 302013Error Message%ASA-6-302013: Built {inbound|outbound} TCP connection_id for interface :real-address /real-port (mapped-address/mapped-port ) [(idfw_user )] to interface :real-address /real-port (mapped-address/mapped-port ) [(idfw_user )] [(user )]
no logging message 302014Error Message %ASA-6-302014: Teardown TCP connection id for interface :real-address /real-port [(idfw_user )] to interface :real-address /real-port [(idfw_user )] duration hh:mm:ss bytes bytes [reason ] [(user )]
no logging message 302015Error Message %ASA-6-302015: Built {inbound|outbound} UDP connection number for interface_name :real_address /real_port (mapped_address /mapped_port ) [(idfw_user )] to interface_name :real_address /real_port (mapped_address /mapped_port )[(idfw_user )] [(user )]
no logging message 302016Error Message %ASA-6-302016: Teardown UDP connection number for interface :real-address /real-port [(idfw_user )] to interface :real-address /real-port [(idfw_user )] duration hh :mm :ss bytes bytes [(user )]
no logging message 302020Error Message %ASA-6-302020: Built {in | out} bound ICMP connection for faddr {faddr | icmp_seq_num } [(idfw_user )] gaddr {gaddr | cmp_type } laddr laddr [(idfw_user )] type {type } code {code }
no logging message 302021Error Message %ASA-6-302021: Teardown ICMP connection for faddr {faddr | icmp_seq_num } [(idfw_user )] gaddr {gaddr | cmp_type } laddr laddr [(idfw_user )] (981) type {type } code {code }
no logging message 305011Error Message %ASA-6-305011: Built {dynamic|static} {TCP|UDP|ICMP} translation from interface_name :real_address/real_port [(idfw_user )] to interface_name :mapped_address/mapped_port
no logging message 305012Error Message %ASA-6-305012: Teardown {dynamic|static} {TCP|UDP|ICMP} translation from interface_name [(acl-name )]:real_address /{real_port |real_ICMP_ID } [(idfw_user )] to interface_name :mapped_address /{mapped_port |mapped_ICMP_ID } duration time
Optional:
no logging message 302017Error Message %ASA-6-302017: Built {inbound|outbound} GRE connection id from interface :real_address (translated_address ) [(idfw_user )] to interface :real_address /real_cid (translated_address /translated_cid ) [(idfw_user )] [(user )
no logging message 302018Error Message %ASA-6-302018: Teardown GRE connection id from interface :real_address (translated_address ) [(idfw_user )] to interface :real_address /real_cid (translated_address /translated_cid ) [(idfw_user )] duration hh :mm :ss bytes bytes [(user )]

Config:

no logging message 302012
no logging message 302013
no logging message 302014
no logging message 302015
no logging message 302016
no logging message 302020
no logging message 302021
no logging message 305011
no logging message 305012
! Optional
no logging message 302017
no logging message 302018

 

Check_MK: Einfacher lokaler Check (Agent)

$
0
0

Dem Check_MK Agenten ist es egal mit welcher Sprache ein lokaler Check geschrieben ist, er muss vom Betriebsystem ausführbar sein. Somit kann jede Scriptsprache (Perl, PHP, Python, Powershell, VBS, etc.) verwendet werden. Der Agent erwartet folgendes Format:

<checkresult> <name> <perfdata> <status_text>

Checkresult

0 = OK – 1 = Warning – 2 = Crtitcal – 3 = Unknown

Name

Dies Repräsentiert den Namen des Checks, whitespaces sind durch Unterstriche zu ersetzen, z.B. DNS_Check

Perfdata

Wenn von dem Check keine Performancedaten erzeugt werden ist hier ein Minus – einzusetzen; Die Werte sind in folgendem Format zu übergeben:

varname=value;warn;crit;min;max

Min und Max sind nur für das alte PNP4Nagios bei der freien Check_MK Version, das neue Graphing System der Enterprise Version benötigt das nicht und können weggelassen werden.

Mehrere Performancewerte werden durch ein Pipe | getrennt. z.B.

varname=value;warn;crit|varname2=value;warn;crit|varname3=value;warn;crit

Checks z.B. nur alle 10 Minuten ausführen

Per default wird der lokale Check jedes mal ausgeführt wenn Check_MK den Agenten abfrägt, das Verhalten kann man manipulieren in dem man im local Ordner einen Ordner anlegt in Sekunden, z.B. 10 Minuten sind 600 Sekunden. Der Check mein_check.sh wird dann im Ordner local/600/mein_check.sh abgelegt. Das Checkergebnis wird für die Anzahl der Sekunden des Ordners gecached.

Die Local Checks liegen in einem Linux System unter /usr/lib/check_mk_agent/local, in Windows ist es abhänig vom Installationsort. Diesen kann man ermitteln indem man den Agenten per Telnet abfrägt:

telnet 1.2.3.4 6556
<<<check_mk>>>
...
LocalDirectory: C:\program files\check_mk_agent\local
...

Bei Windows Maschinen muss noch in der check_mk.ini definiert werden welche Scriptendungen ausgeführt werden dürfen.

# Example configuration for Windows agent
[global]
    # Restrict access to certain IP addresses
    # If ipv6 is enabled, all listed ipv4 adresses are also accepted as
    # source adresses in their ipv6-mapped form. I.e. if
    # 192.168.56.0/24 is listed, connections from ::ffff:c0a8:3800/120
    # are also possible
    # only_from = 127.0.0.1 192.168.56.0/24 ::1

    # Change port where the agent is listening ( default 6556 )
    # port = 6556

    # Disable ipv6 support. By default, ipv4 is always supported
    # and ipv6 is enabled additionally if supported by the system.
    # ipv6 = no

    # Do only execute programs and scripts with
    # the following suffixes (in local and plugins).
    # Per default all extensions except txt and dir
    # are being executed.
    execute = exe bat vbs ps1

Zu finden ist ein Beispiel INI File unter /omd/versions/default/share/check_mk/agents/windows/check_mk.example.ini

Einfacher lokaler Check als Python Script:

#!/usr/bin/env python

import os

warn = 100000
crit = 200000

def size(path = '.'):
    tsize = 0
    for dp, dn, fn in os.walk(path):
        for f in fn:
            fp = os.path.join(dp, f)
            tsize += os.path.getsize(fp)
    return tsize

tmp_size = size("/tmp")

if tmp_size >= crit:
    print "2 tmp dir size size=%d;%d;%d TMP size is %d " % (tmp_size, tmp_size, warn, crit)
elif tmp_size >= warn:
    print "1 tmp_dir_size size=%d;%d;%d TMP size is %d " % (tmp_size, tmp_size, warn, crit)
else:
    print "0 tmp_dir_size size=%d;%d;%d TMP size is %d " % (tmp_size, tmp_size, warn, crit)



Ein weiteres tolles Feature der lokalen Checks ist das man sich theoretisch nicht um die Logik kümmern muss damit OK, WARN oder CRIT zurückgegeben wird. Dazu müssen bei dem Counter Warning und Critical Werte mitgegeben werden. Dazu gibt es ein schönes Beispiel in den „Treasures“ von Check_MK (siehe localchecks/zombies).

Die Treasures sind zu finden unter: /omd/versions/default/share/doc/check_mk/treasures

Hier ein Beispiel:

#!/bin/bash

proc=$( ps aux | wc -l )

echo "P Processes processes=$proc;1000;5000"

Mit P am Anfang anstatt 0,1,2,3 wird der Status von Check_MK bestimmt.

Andere Beispiele, etc. bei Mathias Kettner direkt und weitere Infos: (siehe z.B. filecount) https://mathias-kettner.de/checkmk_localchecks.html

Check_MK: Eigener Agent Check

$
0
0

Neben den lokalen Checks gibt es noch Checks die als Plugin im Agenten laufen. Der Unterschied liegt darin das auf dem Host auf dem der Agent läuft keine Bewertung der Informationen stattfindet, diese werden dem Check_MK Monitoring nur als Text zur Verfügung gestellt. Somit basiert ein Agent Plugin aus einem Host Teil (Agent Plugin) und einem Monitoring Server Teil (Check_MK Check).

Alle Dateien des DEMOs als MKP zum Download:

 

Das Agent Plugin

Hierzu ein Beispiel:

Ein Check der die aktuellen offen TCP Listener Ports ausgibt. Die Scriptsprache ist egal, die Datei muss executeable sein.

my_tcp_listener.sh Script in /usr/lib/check_mk_agent/plugins

#!/bin/bash

echo "<<<my_tcp_listener>>>"

netstat -tlpen | sed 1,2d

Im <<<>>> Block wird der Checkname angegeben.

Folgende Ausgabe erzeugt das Plugin:

mmm@home:/home/mmm$ /usr/lib/check_mk_agent/plugins/test.sh
<<<my_tcp_listener>>>
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          12608       621/sshd        
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      0          14982       1034/exim4      
tcp        0      0 0.0.0.0:6556            0.0.0.0:*               LISTEN      0          14882       793/xinetd      
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               LISTEN      1000       869419      15640/java      
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      999        13258       1230/apache2    
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN      1000       867186      15640/java      
tcp        0      0 0.0.0.0:34607           0.0.0.0:*               LISTEN      105        1941        599/rpc.statd   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      0          1882        590/rpcbind     
tcp6       0      0 :::22                   :::*                    LISTEN      0          12610       621/sshd        
tcp6       0      0 :::39352                :::*                    LISTEN      105        1945        599/rpc.statd   
tcp6       0      0 ::1:25                  :::*                    LISTEN      0          14983       1034/exim4      
tcp6       0      0 :::111                  :::*                    LISTEN      0          1885        590/rpcbind     
tcp6       0      0 :::80                   :::*                    LISTEN      0          13641       1006/apache2    

Die Ausgabe wird wenn der Agent vom Server abgefragt wird angehängt. Das kann man selbst testen mit einem „telnet <host> 6556“.

In der Check Instanz auf dem Server muss nun noch ein Check geschrieben werden der die Ausgabe des Agenten verarbeiten kann.

Die eigenen Check Plugins auf dem Monitoring Server liegen unter /omd/sites/<sitename>/local/share/check_mk/checks

Beispiel zu my_tcp_listener, die Scriptsprache ist hier zwingend Python:

#!/usr/bin/python

def inventory_my_tcp_listener(info):
  for l in info:
    service_identify = "%s/%s" % (l[0], l[3].split(":")[-1])
    yield service_identify, None

def check_my_tcp_listener(item, params, info):

  proto, port = item.split("/")
  message = (2, "CRIT service not listen")

  for l in info:
    if proto in l[0] and port in l[3].split(":")[-1]:
      message = (0, "OK service listen")

  return message

check_info["my_tcp_listener"] = {
  "inventory_function" :	inventory_my_tcp_listener,
  "check_function" :	check_my_tcp_listener,
  "service_description" : "TCP Listener %s",
}

Die Bestandteile des Check_MK Server Plugins

Inventory Funktion

Die Inventory Funktion dient dazu das WATO neue Services automatisch anlegen kann. Der info Variable wird die Ausgabe des Host Plugins übergeben. Dabei wird jede Zeile in eine Python Liste umgewandelt.

Eine Debugging Ausgabe ist möglich in dem man in die Inventory Funktion direkt ein print info einbaut. Check_MK stellt auch Pretty Print aus Python bereit, das Modul muss nicht importiert werden.

print info:

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -II localhost
Discovering services on localhost:
localhost:
[[u'tcp', u'0', u'0', u'0.0.0.0:22', u'0.0.0.0:*', u'LISTEN', u'0', u'12608', u'621/sshd'], [u'tcp', u'0', u'0', u'127.0.0.1:25', u'0.0.0.0:*', u'LISTEN', u'0', u'14982', u'1034/exim4'], [u'tcp', u'0', u'0', u'0.0.0.0:6556', u'0.0.0.0:*', u'LISTEN', u'0', u'14882', u'793/xinetd'], [u'tcp', u'0', u'0', u'127.0.0.1:6942', u'0.0.0.0:*', u'LISTEN', u'1000', u'869419', u'15640/java'], [u'tcp', u'0', u'0', u'127.0.0.1:5000', u'0.0.0.0:*', u'LISTEN', u'999', u'13258', u'1230/apache2'], [u'tcp', u'0', u'0', u'127.0.0.1:63342', u'0.0.0.0:*', u'LISTEN', u'1000', u'867186', u'15640/java'], [u'tcp', u'0', u'0', u'0.0.0.0:34607', u'0.0.0.0:*', u'LISTEN', u'105', u'1941', u'599/rpc.statd'], [u'tcp', u'0', u'0', u'0.0.0.0:111', u'0.0.0.0:*', u'LISTEN', u'0', u'1882', u'590/rpcbind'], [u'tcp6', u'0', u'0', u':::22', u':::*', u'LISTEN', u'0', u'12610', u'621/sshd'], [u'tcp6', u'0', u'0', u':::39352', u':::*', u'LISTEN', u'105', u'1945', u'599/rpc.statd'], [u'tcp6', u'0', u'0', u'::1:25', u':::*', u'LISTEN', u'0', u'14983', u'1034/exim4'], [u'tcp6', u'0', u'0', u':::111', u':::*', u'LISTEN', u'0', u'1885', u'590/rpcbind'], [u'tcp6', u'0', u'0', u':::80', u':::*', u'LISTEN', u'0', u'13641', u'1006/apache2']]

oder mit pprint.pprint(info)

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -II localhost
Discovering services on localhost:
localhost:
[[u'tcp',
  u'0',
  u'0',
  u'0.0.0.0:22',
  u'0.0.0.0:*',
  u'LISTEN',
  u'0',
  u'12608',
  u'621/sshd'],
 [u'tcp',
  u'0',
  u'0',
  u'127.0.0.1:25',
  u'0.0.0.0:*',
  u'LISTEN',
  u'0',
  u'14982',
  u'1034/exim4'],
 [u'tcp',
  u'0',
  u'0',
  u'0.0.0.0:6556',
  u'0.0.0.0:*',
  u'LISTEN',
  u'0',
  u'14882',
  u'793/xinetd'],
 [u'tcp',
  u'0',
  u'0',
  u'127.0.0.1:6942',
  u'0.0.0.0:*',
  u'LISTEN',
  u'1000',
  u'869419',
  u'15640/java'],
 [u'tcp',
  u'0',
  u'0',
  u'127.0.0.1:5000',
  u'0.0.0.0:*',
  u'LISTEN',
  u'999',
  u'13258',
  u'1230/apache2'],
 [u'tcp',
  u'0',
  u'0',
  u'127.0.0.1:63342',
  u'0.0.0.0:*',
  u'LISTEN',
  u'1000',
  u'867186',
  u'15640/java'],
 [u'tcp',
  u'0',
  u'0',
  u'0.0.0.0:34607',
  u'0.0.0.0:*',
  u'LISTEN',
  u'105',
  u'1941',
  u'599/rpc.statd'],
 [u'tcp',
  u'0',
  u'0',
  u'0.0.0.0:111',
  u'0.0.0.0:*',
  u'LISTEN',
  u'0',
  u'1882',
  u'590/rpcbind'],
 [u'tcp6',
  u'0',
  u'0',
  u':::22',
  u':::*',
  u'LISTEN',
  u'0',
  u'12610',
  u'621/sshd'],
 [u'tcp6',
  u'0',
  u'0',
  u':::39352',
  u':::*',
  u'LISTEN',
  u'105',
  u'1945',
  u'599/rpc.statd'],
 [u'tcp6',
  u'0',
  u'0',
  u'::1:25',
  u':::*',
  u'LISTEN',
  u'0',
  u'14983',
  u'1034/exim4'],
 [u'tcp6',
  u'0',
  u'0',
  u':::111',
  u':::*',
  u'LISTEN',
  u'0',
  u'1885',
  u'590/rpcbind'],
 [u'tcp6',
  u'0',
  u'0',
  u':::80',
  u':::*',
  u'LISTEN',
  u'0',
  u'13641',
  u'1006/apache2']]

Im Beispiel wird jetzt jede Zeile durchgegangen und ein eindeutiger Identifier (Servicename) erzeugt für den Service.

for l in info:
    service_identify = "%s/%s" % (l[0], l[3].split(":")[-1])
    yield service_identify, None

Die Rückgabe der Funktion erfolgt über die Generator Funktion yield und erwartet ein Tuple aus 2 Werten. 1 Wert ist der Servicename, 2 Wert sind Parameter die als Tuple oder Dictionary übergeben werden können. In dem Beispiel haben wir keine Parameter somit übergeben wir ein None.

Hat man seine Inventory Funktion und die check_info Definition in seinem Check komplettiert kann man das auf der Kommandozeile testen:

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -II localhost
Discovering services on localhost:
localhost:
    1 cpu.loads
    1 cpu.threads
    1 df
    1 diskstat
    3 kernel
    1 kernel.util
    1 livestatus_status
    1 lnx_if
    3 local
    1 mem.linux
    1 mkeventd_status
    1 mknotifyd
    1 mounts
    3 mtr
   13 my_tcp_listener
    1 ntp.time
    1 omd_apache
    1 omd_status
    1 tcp_conn_stats
    1 uptime

Die Inventory Funktion hat meine 13 lokalen TCP Ports gefunden und dem Host hinzugefügt. Gespeichert werden diese Informationen an folgendem Ort:

/omd/sites/<sitename>/var/check_mk/autochecks/<hostname>.mk

OMD[test1]:~/var/check_mk/autochecks$ cat localhost.mk 
[
  ('cpu.loads', None, cpuload_default_levels),
  ('cpu.threads', None, threads_default_levels),
  ('df', u'/', {}),
  ('diskstat', u'SUMMARY', diskstat_default_levels),
  ('kernel', u'Context Switches', kernel_default_levels),
  ('kernel', u'Major Page Faults', kernel_default_levels),
  ('kernel', u'Process Creations', kernel_default_levels),
  ('kernel.util', None, {}),
  ('livestatus_status', u'test1', {}),
  ('lnx_if', u'2', {'state': ['1'], 'speed': 1000000000}),
  ('mem.linux', None, {}),
  ('mkeventd_status', u'test1', {}),
  ('mknotifyd', u'test1', {}),
  ('mounts', u'/', [u'data=ordered', u'errors=remount-ro', u'relatime', u'rw']),
  ('my_tcp_listener', u'tcp/111', None),
  ('my_tcp_listener', u'tcp/22', None),
  ('my_tcp_listener', u'tcp/25', None),
  ('my_tcp_listener', u'tcp/34607', None),
  ('my_tcp_listener', u'tcp/5000', None),
  ('my_tcp_listener', u'tcp/63342', None),
  ('my_tcp_listener', u'tcp/6556', None),
  ('my_tcp_listener', u'tcp/6942', None),
  ('my_tcp_listener', u'tcp6/111', None),
  ('my_tcp_listener', u'tcp6/22', None),
  ('my_tcp_listener', u'tcp6/25', None),
  ('my_tcp_listener', u'tcp6/39352', None),
  ('my_tcp_listener', u'tcp6/80', None),
  ('ntp.time', None, {}),
  ('omd_apache', u'test1', None),
  ('omd_status', u'test1', None),
  ('tcp_conn_stats', None, tcp_conn_stats_default_levels),
  ('uptime', None, {}),
]

Check Funktion

Die Check Funktion beinhaltet die Logik welche überprüft in welchem Zustand sich ein Service befindet (0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN).

Der Check Funktion werden 3 Variablen übergeben: item, params, info

Variable item

Der Variable wird der Servicename übergeben

Variable params

Hier werden die Parameter übergeben die beim Inventory oder durch eine WATO Regel für den Service gesetzt sind.

Variable info

Hier wird die komplette Ausgabe des Agent Check Plugins als Liste übergeben so wie bei der Inventory Funktion.

Die Check Funktion ist hier stark vereinfacht, grundsätzlich muss man sein item aus der Datenmenge info herraussuchen:

Beispiel aus einem anderen Check:

for line in info:
    if item == line[0]:
        # Hier der Check

Hier für unser Beispiel:

def check_my_tcp_listener(item, params, info):

    proto, port = item.split("/")
    message = (2, "CRIT service not listen")

    for l in info:
        if proto in l[0] and port in l[3].split(":")[-1]:
            message = (0, "OK service listen")

    return message

Als Rückgabe erwartet Check_MK aus 2 bzw. 3 Werten in einem Tuple. 2 Werte wenn keine Performance Daten übergeben werden, 3 wenn Performance Daten dabei sind.

ohne Performance Werte

<STATUS>, <MESSAGE>

mit Performance Werte

<STATUS>, <MESSAGE>, <PERFDATA>

Die Perfomance Werte sind wiederum eine Liste aus Tupeln. Das werde ich in einem anderen Artikel erläutern.

Das check_info Dictionary

Das check_info Dictionary ist ein Verzeichnis das von Check_MK selbst bereitgestellt wird und alle zur Verfügung stehenden Checks beinhaltet.

check_info["my_tcp_listener"] = {
    "inventory_function" :  inventory_my_tcp_listener,
    "check_function" :  check_my_tcp_listener,
    "service_description" : "TCP Listener %s",
}

Der Key muss dem Namen entsprechen welche der Agent für die Sektion z.B. <<<my_tcp_listener>>> verwendet. Im Dictionary werden dann Check_MK die Inventory Funktion und die Check Funktion mitgeteilt. Desweiteren kann man hier den Text definieren welcher für den Service angezeigt wird. Hier wird z.B. für SNMP Checks die OIDs definiert. Mehr dazu in einem anderen Artikel …

Wenn der Check fertig ist muss der Check_MK Core neu geladen werden damit er den Check kennt, das erledigt folgendes Kommando in der OMD Umgebung „cmk -R“

Ob der Check funktioniert kann man mit „cmk -D localhost“ in der OMD Umgebung testen.

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -D localhost

localhost                                                                      
Addresses:              127.0.0.1
Tags:                   /wato/, cmk-agent, ip-v4, ip-v4-only, lan, prod, site:test1, tcp, wato
Host groups:            
Contact groups:         all
Type of agent:          TCP (port: 6556)
Is aggregated:          no
Services:
  checktype         item                           params                                                                                                                                                                                                                                                                                                                                                   description                    groups summarized to groups
  ----------------- ------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------ ------ ------------- ------
...
  my_tcp_listener   tcp/111                        None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/111                                      
  my_tcp_listener   tcp/22                         None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/22                                       
  my_tcp_listener   tcp/25                         None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/25                                       
  my_tcp_listener   tcp/34607                      None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/34607                                    
  my_tcp_listener   tcp/5000                       None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/5000                                     
  my_tcp_listener   tcp/63342                      None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/63342                                    
  my_tcp_listener   tcp/6556                       None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/6556                                     
  my_tcp_listener   tcp/6942                       None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp/6942                                     
  my_tcp_listener   tcp6/111                       None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp6/111                                     
  my_tcp_listener   tcp6/22                        None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp6/22                                      
  my_tcp_listener   tcp6/25                        None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp6/25                                      
  my_tcp_listener   tcp6/39352                     None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp6/39352                                   
  my_tcp_listener   tcp6/80                        None                                                                                                                                                                                                                                                                                                                                                     TCP Listener tcp6/80                                      
....

OMD[test1]:~/local/share/check_mk/checks$ 

Debugging Plugin

Per default werden Exceptions auf der Kommandozeile unterdrückt. Man kann mit –debug die Ausgaben beim „cmk“ Kommando einschalten.

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -II --debug localhost
Discovering services on localhost:
localhost:
Traceback (most recent call last):
  File "/omd/sites/test1/share/check_mk/modules/check_mk.py", line 4838, in <module>
    do_discovery(hostnames, check_types, seen_I == 1)
  File "/omd/sites/test1/share/check_mk/modules/discovery.py", line 80, in do_discovery
    do_discovery_for(hostname, check_types, only_new, use_caches, on_error)
  File "/omd/sites/test1/share/check_mk/modules/discovery.py", line 100, in do_discovery_for
    new_items = discover_services(hostname, check_types, use_caches, do_snmp_scan, on_error)
  File "/omd/sites/test1/share/check_mk/modules/discovery.py", line 718, in discover_services
    return services + discover_services_impl(hostname, check_types, use_caches, on_error, ipaddress)
  File "/omd/sites/test1/share/check_mk/modules/discovery.py", line 733, in discover_services_impl
    use_caches, on_error, use_snmp):
  File "/omd/sites/test1/share/check_mk/modules/discovery.py", line 899, in discover_check_type
    discovered_items = list(discovered_items)
  File "/omd/sites/test1/local/share/check_mk/checks/my_tcp_listener", line 6, in inventory_my_tcp_listener
    yield service_identify, None, xxxx,xxxx,xx
NameError: global name 'xxxx' is not defined

Fertig ???

Im WATO muss man seinen neuen Check auf dem Host noch mit einem einfachen „Tabula Rasa“ inventarisieren.

Jetzt kann man sein Ergebnis auf der Webseite bewundern 🙂

 


Check_MK: Helferlein und Treasures

$
0
0

Check_MK hat ein paar kleine Helferlein & Treasures an Board die nicht jeder kennt.

mkcheck

Mkcheck ist ein Script das ein Template für einen neuen eigenen Check erzeugt.

Zu finden ist es unter ~/share/doc/check_mk/helpers/mkcheck

OMD[test1]:~$ ~/share/doc/check_mk/helpers/mkcheck -h

DESCRIPTION:
  This script creates a basic check file or if '-m'
  specified a manual page.
  You have to specify at least one name.

  The created check or manual page are saved to
  the current directory.

  It is recommended to run this script in the checks folder
  if you want to create a check or in the manual page folder
  if you want to create a man page.

USAGE: mkcheck [OPTS] ARGS

OPTIONS:
 -h, --help        Show this help
 -s                Adds SNMP info and scan function
 -p                Adds parse function
 -m                Creates the manual page instead of
                   the check

Beispiel für einen SNMP Check:

OMD[test1]:~$ ~/share/doc/check_mk/helpers/mkcheck -sp my_snmp_check
OMD[test1]:~$ cat my_snmp_check 

#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-
# +------------------------------------------------------------------+
# |             ____ _               _        __  __ _  __           |
# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |
# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |
# |           | |___| | | |  __/ (__|   <    | |  | | . \            |
# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |
# |                                                                  |
# | Copyright Mathias Kettner 2017             mk@mathias-kettner.de |
# +------------------------------------------------------------------+
#
# This file is part of Check_MK.
# The official homepage is at http://mathias-kettner.de/check_mk.
#
# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# tails. You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.


# example output


def parse_my_snmp_check(info):
    pprint.pprint(info)
    parsed = {}
    return parsed


def inventory_my_snmp_check(parsed):
    return []


def check_my_snmp_check(item, params, parsed):
    return 3, 'not yet implemented'


check_info['my_snmp_check'] = {
    'parse_function'        : parse_my_snmp_check,
    'inventory_function'    : inventory_my_snmp_check,
    'check_function'        : check_my_snmp_check,
    'service_description'   : 'DESCR',
    'snmp_info'             : ('', []),
    'snmp_scan_function'    : lambda oid: False,
}

figheader

Figheader ist ein Helper der Kommentarblöcke im Check_MK Style erzeugt. figlet muss auf dem System installiert sein.

Zu finden unter ~/share/doc/check_mk/helpers/figheader

OMD[test1]:~$ ~/share/doc/check_mk/helpers/figheader whoohoo
#.
#   .--whoohoo-------------------------------------------------------------.
#   |                     _                 _                              |
#   |           __      _| |__   ___   ___ | |__   ___   ___               |
#   |           \ \ /\ / / '_ \ / _ \ / _ \| '_ \ / _ \ / _ \              |
#   |            \ V  V /| | | | (_) | (_) | | | | (_) | (_) |             |
#   |             \_/\_/ |_| |_|\___/ \___/|_| |_|\___/ \___/              |
#   |                                                                      |
#   +----------------------------------------------------------------------+
#   |                                                                      |
#   '----------------------------------------------------------------------'

wato_import.py

Wato_import.py ist ein Script aus der Schatzkiste und dient zum Import einer CSV Liste in WATO.

Zu finden unter ~/share/doc/check_mk/treasures/wato_import.py

OMD[test1]:~/share/doc/check_mk/treasures$ python wato_import.py 
Run this script inside a OMD site
    Usage: ./wato_import.py csvfile.csv
    CSV Example:
    wato_foldername;hostname|tag1 tag2;host_alias;ipaddress|None

cmk-delete-host

Cmk-delete-host ist ebenfalls aus der Schatzkiste und dient zum Löschen von Hosts von der Kommandozeile aus. Dazu wird die Automation Schnittstelle verwendet.

Zu finden unter ~/share/doc/check_mk/treasures/cmk-delete-host

extract_inventory.py

Extract_inventory.py ist aus der Schatzkiste und exportiert die Inventory Daten als CSV.

Zu finden unter ~/share/doc/check_mk/treasures/inventory/extract_inventory.py

OMD[test1]:~/share/doc/check_mk/treasures/inventory$ ./extract_inventory.py 
creating relation inv_raw_generic(OS) for localhost
creating relation inv_raw_generic(Linux) for localhost
creating relation inv_raw_arp for localhost
creating relation devices for localhost
creating relation inv_raw_file for localhost

mmm@max:/var/tmp# ls -la
insgesamt 32
drwxrwxrwt  3 root  root  4096 Jul 14 11:41 .
drwxr-xr-x 13 root  root  4096 Feb  3  2014 ..
-rw-r--r--  1 test1 test1  377 Jul 14 11:41 devices
-rw-r--r--  1 test1 test1   75 Jul 14 11:41 inv_raw_arp
-rw-r--r--  1 test1 test1  114 Jul 14 11:41 inv_raw_file
-rw-r--r--  1 test1 test1   59 Jul 14 11:41 inv_raw_generic(Linux)
-rw-r--r--  1 test1 test1   43 Jul 14 11:41 inv_raw_generic(OS)

mmm@max:/var/tmp# cat devices 
"import_id", "import_data_source_id", "import_org_level_2_id", "device_key", "device_manufacturer", "device_model", "serial_number", "operating_system", "inventory_date", "installation_date", "cpu_socket_count", "cpu_chip_count", "cpu_core_count", "cpu_speed", "cpu_name"
"localhost", "sla", "default", "localhost", "", "", "", "", "2017-07-14", "", "", "1", "4", "3200.0", ""

Inoffizielle Notification Scripts

In den Treasures befinden sich noch einige Notification Scripts welche man gut als Vorlage für eigene Scripte verwenden kann. Eigene Notification Scripte sind unter ~/local/share/check_mk/notifications abzulegen.

OMD[test1]:~/share/doc/check_mk/treasures/notifications$ ls -la
insgesamt 64
drwxr-xr-x  2 root root  4096 Jul 11 13:55 ./
drwxr-xr-x 21 root root  4096 Jul 11 13:55 ../
-rwxr-xr-x  1 root root  2829 Okt 12  2016 braintower*
-rwxr-xr-x  1 root root 24497 Jul  5 14:53 glpi.py*
-rwxr-xr-x  1 root root  3842 Okt 12  2016 mobilant*
-rwxr-xr-x  1 root root  5114 Okt 12  2016 multitech*
-rwxr-xr-x  1 root root  2059 Okt 12  2016 opcmsg*
-rw-r--r--  1 root root   344 Okt 12  2016 README
-rwxr-xr-x  1 root root   632 Okt 12  2016 slack*
-rwxr-xr-x  1 root root   803 Okt 12  2016 snmp_trap*

Andere Dinge

In der Schatzkiste und in vielen Ordnern im Check_MK Root verbergen sich noch viele coole Sachen am besten geht ihr mal selbst auf die Suche 🙂

~/share/doc/check_mk/treasures

~/share/doc/check_mk/helpers

Check_MK: SNMP based Check

$
0
0

Neben der Möglichkeit lokale Scripts per Agent oder Agent Plugins zu verwenden gibt es noch die Option Werte direkt per SNMP von Geräten auszulesen. Bei diesem Beispiel ist auch eine Erweiterung dabei damit in WATO eine Regel erstellt werden kann mit den Parametern für den Check. Performance Werte sind in dem Beispiel ebenfalls integriert.

Die anderen HowTos sind unter Agent Plugin Check und Local Check zu finden.

 

Aufbau eines SNMP Checks

Der SNMP Check besteht genau so wie der Agent based Check aus drei Bestandteilen.

  1. Inventory Funktion
  2. Check Funktion
  3. check_info Directory

Hier ein Beispiel Check dazu, der Check wird abgelegt in ~/local/share/check_mk/checks/:

#!/usr/bin/python

default_mycanon = (500,20000)

def inventory_mycanon(info):

    for i in info:
        idx, frag, pages = i
        yield idx, default_mycanon


def check_mycanon(item, params, info):

    perf=[]

    for i in info:
        idx, frag, pages_s = i

        if idx == item:
            warn, crit = params
            pages = int(pages_s)

    perf = [("pages",pages, warn, crit), ("page_rate",get_rate("page_rate", time.time(), pages), warn, crit)]


    if pages >= crit:
        status = 2
    elif pages >= warn:
        status = 1
    else:
        status = 0

    return status, "%d pages (w:%d/c:%d) %s" % (pages, warn, crit, get_item_state("buh")), perf


check_info["mycanon"] = {
    "inventory_function":   inventory_mycanon,
    "check_function":       check_mycanon,
    "service_description":  "Printer FooBar",
    "snmp_scan_function":   lambda oid: "canon" in oid(".1.3.6.1.2.1.1.1.0").lower(),
    "snmp_info":            ( ".1.3.6.1.4.1.1602.1.11.1.4.1", ["2", "3", "4"]),
    "has_perfdata":         True,
    "group":                "mycanon",
}

Im Gegensatz zu den anderen Checks beginne ich in umgekehrter Reihenfolge mit den einzelnen Bausteinen weil in dem check_info Dictionary definiert ist wo die Inventory Funktion und die Check Funktion ihre Daten her bekommen.

Das check_info Dictionary

check_info["mycanon"] = {
    "inventory_function":   inventory_mycanon,
    "check_function":       check_mycanon,
    "service_description":  "Printer FooBar",
    "snmp_scan_function":   lambda oid: "canon" in oid(".1.3.6.1.2.1.1.1.0").lower(),
    "snmp_info":            ( ".1.3.6.1.4.1.1602.1.11.1.4.1", ["2", "3", "4"]),
    "has_perfdata":         True,
    "group":                "mycanon",
}

Genauso wie bei dem Agent Check muss auch beim SNMP Check die Inventory Funktion und die Check Funktion angegeben werden. Die Service Description ist der Name unter dem später der Check in Check_MK im Host auftaucht.

Die snmp_scan_function wird verwendet um festzustellen ob Check_MK überhaupt auf diesem Gerät tätig wird. Nur wenn der Scan erfolgreich ist wird per SNMP BULK WALK die OIDs die in snmp_info angegeben sind abgerufen.

Bei dem Testgerät handelt es sich um einen Canon Drucker, bei einem SNMP Get auf die OID .1.3.6.1.2.1.1.1.0 gibt er folgenden String zurück „Canon iR C1021 /P“. Die Lambda Funktion überprüft ob in der OID .1.3.6.1.2.1.1.1.0 der String „canon“ vorkommt. Dabei wird die Rückgabe von oid(„.1.3.6.1.2.1.1.1.0“) mit lower() in Lowercase umgewandelt um den Vergleich zu vereinfachen.Hier gibt es noch verschiedene andere Möglichkeiten um zu bestimmen ob der Check zum Gerät passt. Am besten sich dazu die Check_MK eigenen Checks ansehen unter: ~/share/check_mk/checks

In snmp_info werden die OIDs angegeben die Abgerufen werden. Wenn es nur eine OID ist so ist ein Tuple mit OID und den entsprechenden einzelnen Untertabellen anzugeben. Sind es mehrere OIDs sind die Tuples in eine Liste zu verpacken.

"snmp_info":            ( ".1.3.6.1.4.1.1602.1.11.1.4.1", ["2", 
                                                           "3",
                                                           "4"
                        ]),

In dem Beispiel rufen wir jetzt drei Untertabellen der OID .1.3.6.1.4.1.1602.1.11.1.4.1 ab. Diese werden an den Check für die Inventory Funktion und die Check Funktion als verschachtelte Liste übergeben.

Um das zu Testen geben wir die info in der Inventory Funktion mit pprint aus:

def inventory_mycanon(info):
    pprint.pprint(info)

Ausgabe auf der Shell:

OMD[test1]:~/local/share/check_mk/checks$ cmk -v -II printer-canon-c1021
Discovering services on printer-canon-c1021:
printer-canon-c1021:
[[u'101', u'', u'1'],
 [u'102', u'', u'1'],
 [u'104', u'', u'1'],
 [u'108', u'', u'8930'],
 [u'113', u'', u'8930'],
 [u'114', u'', u'2994'],
 [u'123', u'', u'11147'],
 [u'127', u'', u'18618'],
 [u'133', u'', u'7877'],
 [u'148', u'', u'10741'],
 [u'201', u'', u'1459'],
 [u'202', u'', u'1459'],
 [u'222', u'', u'1053'],
 [u'230', u'', u'406'],
 [u'231', u'', u'406'],
 [u'232', u'', u'406']]

In der Liste sind weitere Listen die den Werten aus der SNMP Anfrage entsprechen. Aus der ersten Liste [u’101′, u“, u’1′] ist der 1. Wert aus der 2. Untertabelle, der 2. Wert aus der 3. Untertabelle und der 3. Wert aus der 4. Untertabelle. (siehe oben bei snmp_info)

Inventory Funktion

default_mycanon = (500,20000)

def inventory_mycanon(info):

    for i in info:
        idx, frag, pages = i
        yield idx, default_mycanon

Die Inventory Funktion erkennt neue Services und legt diese in Check_MK an. Der Funktion wird das SNMP BULK WALK Ergebnis übergeben als Liste. (siehe oben) Diese einfache Inventory Funktion legt für jede Subliste einen neuen Service an. Dem yield Generator wird ein Tuple übergeben mit eindeutigem Servicenamen und den Default Parametern für den Check.

Check Funktion

def check_mycanon(item, params, info):

    perf=[]

    for i in info:
        idx, frag, pages_s = i

        if idx == item:
            warn, crit = params
            pages = int(pages_s)

    perf = [("pages",pages, warn, crit), ("page_rate",get_rate("page_rate", time.time(), pages), warn, crit)]


    if pages >= crit:
        status = 2
    elif pages >= warn:
        status = 1
    else:
        status = 0

    return status, "%d pages (w:%d/c:%d)" % (pages, warn, crit), perf

Die Check Funktion beinhaltet die Logik welche überprüft in welchem Zustand sich ein Service befindet (0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN).

Der Check Funktion werden 3 Variablen übergeben: item, params, info

Variable item

Der Variable wird der Servicename übergeben

Variable params

Hier werden die Parameter übergeben die beim Inventory oder durch eine WATO Regel für den Service gesetzt sind.

Variable info

Hier wird die komplette Ausgabe des Agent Check Plugins als Liste übergeben so wie bei der Inventory Funktion.

Schritt 1: Aus info Liste das richtige Item suchen

for i in info:
       idx, frag, pages_s = i

       if idx == item:
           warn, crit = params
           pages = int(pages_s)

Die Liste wird durchgegangen und mit einer IF Anweisung wird verglichen ob es sich um den richtigen Datensatz handelt, wenn True wird das Parameter Tuple in die Variablen warn und vrit gespeichert. Der dritte Wert der Liste ist die Seitenanzahl und die muss noch von einem Unicode String umgewandelt werden zu einem Integer int(pages_s).

Schritt 2: Performance Werte

perf = [("pages",pages, warn, crit), ("page_rate",get_rate("page_rate", time.time(), pages), warn, crit)]

Die Performance Werte werden als Liste übergeben. In der Liste sind wiederum Tupels.

Der Tuple ist wie folgt aufgebaut:

(„<name_des_counters>“, <aktueller_wert>, <warn_wert>, <crit_wert>)

Nettes Feature in Check_MK:

Es gibt die Funktion get_rate welche Werte speichern kann und eine Rate pro Sekunde errechnen kann. Dazu ist eine eindeutige Identifier zu bestimmen und es muss die aktuelle Zeit mitgegeben werden damit Check_MK die Rate berechnen kann. Das gleiche gibt es auch für Average Werte, auch ist es möglich Werte ohne Berechung einfach zu speichern bis zur nächsten Check Ausführung (set_item_state(), get_item_state()).

Schritt 3: Status Logik

Der Status des Checks wird als 0 = OK, 1 = WARNING, 2 = CRITICAL oder 3 = UNKNOWN übergeben.

if pages >= crit:
    status = 2
elif pages >= warn:
    status = 1
else:
    status = 0

Schritt 4: Return oder Yield des Checkergebnisses

return status, "%d pages (w:%d/c:%d)" % (pages, warn, crit), perf

Als letztes wird ein Tuple zusammengebaut das aus 3 Werten besteht:

STATUS, MESSAGE, PERFORMANCEVALUES

Es gibt die Möglichkeit auch das dem yield Generator zu übergeben, statt return wird dann yield verwendet. Check_MK aggregiert dann alle Ergebnisse nacheinander. Dazu kommt in einem anderen Artikel noch weitere Informationen.

WATO Erweiterung für eigene Parameter

Ich habe in unserem Beispiel default Parameter definiert die für jeden Check angelegt werden. Wenn man jetzt für einen Host, Service oder Host/Service die Werte anpassen möchte und es bequem über WATO erledigen will muss man WATO erweitern.

WATO Erweiterungen befinden sich unter ~/lokal/share/check_mk/web/plugins/wato/ und müssen die Dateiendung .py haben. Auch muss zwingend der Apache neu gestartet werden. Das geht auf der OMD Konsole mit „omd restart apache“.

#!/usr/bin/python

register_check_parameters(
    # Category
    "Printers",
    # Group
    "mycanon",
    # Rulename
    "Printer pages max values",
    #Parameter
    Tuple(
        title = "Printer pages max value",
        help = "Define critical and warning values",
        elements = [
            Integer(title="Warn at", unit="pages"),
            Integer(title="Critical at", unit="pages"),
        ]
    ),
    #Item
    TextAscii(
        title = "Item Name",
        help = "Help for the item"
    ),
    #Match
    match_type = "first"
)

Wir haben als default Parameter ein Tuple gespeichert mit 2 Werten, Warn und Crit. Dementsprechend muss unsere WATO Regel ebenfalls ein Tuple mit 2 Werten erzeugen.

Die Funktion register_check_parameters() erzeugt eine neue möglichkeit Regeln zu definieren.

Die Funktion erwartet 6 Parameter:

1 Kategorie – Die Kategorie ist die Rubrik unter der die neue Regel angezeigt wird.

2 Group – Die Gruppe macht die Zuordnung zum Check. Im Check im check_info gibt es hierfür im Dictionary den Key „group“. (siehe oben im Beispiel)

3 Rulename – Der Rulename wird in der Übersicht angezeigt

4 Parameter – Hier werden die Parameter definiert.

5 Item – Es gibt hier 2 Möglichkeiten:

None – Die Regel kann nur für den Host definiert werden und gilt für alle Services die auf die Group matchen.

TextAscii( title = „Item Name“, help = „Help for the item“ ) –  Hier kann ein Servicename definiert werden, die Regel gilt dann nur für einen bestimmten Servicenamen

6 Matchtype – Es gibt 2 Matchtypen:

first – Die erste Regel die Zutrifft wird angewendet.

dict – Eine Kombination aus mehreren Werten ist möglich aus mehreren Regeln. Der Typ ist zwingend wenn der äußere Parametertyp Dictionary ist.

Der Parameter Block

#Parameter
    Tuple(
        title = "Printer pages max value",
        help = "Define critical and warning values",
        elements = [
            Integer(title="Warn at", unit="pages"),
            Integer(title="Critical at", unit="pages"),
        ]
    ),

Das äußere Tuple() ist eine von Check_MK bereitgestellte Funktion, es gibt noch viele weitere (z.B. TextAscii, Integer, Float, ListOf, Dictionary, etc.) Weitere Beispiele findet ihr direkt im Check_MK Code unter ~/share/check_mk/web/plugins/wato/.

Das Tuple() hat in diesem Fall 3 Übergabewerte:

title – Gibt den Titel der Werte an

help – Wenn die Hilfe aktiviert ist (Buch rechts oben in der Ecke) werden die Hilfstexte angezeigt

elements – Sind die Werte die in WATO eingegeben werden können, diese können beliebig oft, entsprechend dem Datenformat, verschachtelt werden. In elements befinden sich unsere 2 Integer() Werte Warn und Crit.

Zu den WATO Erweiterungen wird noch ein gesonderter Artikel folgen den ich hier verlinken werde.

Fertig ??

Jetzt können wir den Check mal Testen, dazu in WATO ein „Tabula Rasa“ für den Host machen, der neue Check sollte dann auftauchen.

Viel Spaß beim Spielen 🙂

 

Check_MK: Mit gespeicherten SNMP Walks Checks entwickeln

$
0
0

Es ist keine schlechte Idee seine Checks auf einer Testinstanz zu entwickeln, geht etwas schief wird das Produktionssystem davon nicht beeinflusst.

Check_MK bietet die Möglichkeit einen SNMP Walk zu exportieren und diesen für die Checkentwicklung zu verwenden.

Schritt 1: Export eines SNMP Walks in Check_MK

OMD[test1]:~$ cmk -v --snmpwalk router
router:
Walk on ".1.3.6.1.2.1"...2939 variables.
Walk on ".1.3.6.1.4.1"...1539 variables.
Successfully Wrote /omd/sites/test1/var/check_mk/snmpwalks/router.

Mit dem Befehl „cmk –snmpwalk <hostname>“ lässt sich auf dem Produktivsystem ein Check_MK kompatibler SNMP Walk erzeugen der in der Site unter ~/var/check_mk/snmpwalks/ abgelegt wird.

Schritt 2: Check_MK Testinstanz erzeugen

root@max:~# omd create dev
Adding /opt/omd/sites/dev/tmp to /etc/fstab.
Creating temporary filesystem /omd/sites/dev/tmp...OK
Restarting Apache...OK
Created new site dev with version 2017.07.11.cee.

  The site can be started with omd start dev.
  The default web UI is available at http://max/dev/

  The admin user for the web applications is cmkadmin with password: xxxxxxxxxxx
  (It can be changed with 'htpasswd -m ~/etc/htpasswd cmkadmin' as site user.
)
  Please do a su - dev for administration of this site.

root@max:~# omd start dev
Starting mkeventd...OK
Starting liveproxyd...OK
Starting mknotifyd...OK
Starting rrdcached...OK
Starting cmc...OK
Starting apache...OK
Initializing Crontab...OK
root@max:~#
  1. omd create dev
  2. omd start dev

Schritt 3: Kopieren des Walks

root@max:~# cp /omd/sites/prod/var/check_mk/snmpwalks/router /omd/sites/dev/var/check_mk/snmpwalks/router

Schritt 4: Host anlegen & SNMP walk Regel erstellen

Der Host muss genau so heissen wie das Walk-File, als IP-Adresse 127.0.0.1 angeben und bei Agent Type SNMP.

Anschließend noch eine Regel erstellen das die Walks verwendet werden für den Host.

Danach die Änderungen deployen.

Schritt 5: Inventory durchführen & Aktivieren

  1. Inventory: cmk -v -II router
  2. Aktivieren: cmk -v -O
  3. cmk -v -D router
OMD[dev]:~$ cmk -v -II router
Discovering services on router:
router:
    1 hr_cpu
    4 hr_fs
    1 hr_mem
    2 if64
    1 snmp_info
    1 snmp_uptime
    1 ucd_cpu_load

OMD[dev]:~$ cmk -v -O
Waiting for exclusive lock on /omd/sites/dev/etc/check_mk/main.mk.
Generating configuration for core (type cmc)...
Not importing state from Nagios, /omd/sites/dev/var/nagios/retention.dat not found.
/omd/sites/dev/var/check_mk/core/config written.
OK
Baking agents...VANILLA...linux_rpm:uptodate...linux_deb:uptodate...linux_tgz:uptodate...aix_tgz:uptodate...solaris_tgz:uptodate...solaris_pkg:uptodate...windows_msi:uptodate...OK
GENERIC...linux_rpm:uptodate...linux_deb:uptodate...linux_tgz:uptodate...aix_tgz:uptodate...solaris_tgz:uptodate...solaris_pkg:uptodate...windows_msi:uptodate...OK
router...does not use agent, skipping.
OK
Packing config...OK
Reloading monitoring core...OK
OMD[dev]:~$

OMD[dev]:~$ cmk -D router

router                                                                         
Addresses:              127.0.0.1
Tags:                   /wato/, ip-v4, ip-v4-only, lan, prod, site:dev, snmp, snmp-only, wato
Host groups:            
Contact groups:         all
Type of agent:          SNMP (use stored walk)
Services:
  checktype    item     params                                                                                                                                                                                                                        description         groups
  ------------ -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------- ------
  ucd_cpu_load None     (5.0, 10.0)                                                                                                                                                                                                                   CPU load                  
  hr_cpu       None     {'levels': (80.0, 90.0)}                                                                                                                                                                                                      CPU utilization           
  hr_fs        /        {'trend_range': 24, 'show_levels': 'onmagic', 'inodes_levels': (10.0, 5.0), 'magic_normsize': 20, 'show_inodes': 'onlow', 'levels': (80.0, 90.0), 'show_reserved': False, 'levels_low': (50.0, 60.0), 'trend_perfdata': True} Filesystem /              
  hr_fs        /boot    {'trend_range': 24, 'show_levels': 'onmagic', 'inodes_levels': (10.0, 5.0), 'magic_normsize': 20, 'show_inodes': 'onlow', 'levels': (80.0, 90.0), 'show_reserved': False, 'levels_low': (50.0, 60.0), 'trend_perfdata': True} Filesystem /boot          
  hr_fs        /distros {'trend_range': 24, 'show_levels': 'onmagic', 'inodes_levels': (10.0, 5.0), 'magic_normsize': 20, 'show_inodes': 'onlow', 'levels': (80.0, 90.0), 'show_reserved': False, 'levels_low': (50.0, 60.0), 'trend_perfdata': True} Filesystem /distros       
  hr_fs        /opt/omd {'trend_range': 24, 'show_levels': 'onmagic', 'inodes_levels': (10.0, 5.0), 'magic_normsize': 20, 'show_inodes': 'onlow', 'levels': (80.0, 90.0), 'show_reserved': False, 'levels_low': (50.0, 60.0), 'trend_perfdata': True} Filesystem /opt/omd       
  if64         2        {'state': [u'1'], 'errors': (0.01, 0.1), 'speed': 1000000000}                                                                                                                                                                 Interface 2               
  if64         3        {'state': [u'1'], 'errors': (0.01, 0.1), 'speed': 100000000}                                                                                                                                                                  Interface 3               
  hr_mem       None     (150.0, 200.0)                                                                                                                                                                                                                Memory used               
  snmp_info    None     None                                                                                                                                                                                                                          SNMP Info                 
  snmp_uptime  None     {}                                                                                                                                                                                                                            Uptime                    
OMD[dev]:~$ 

Viel Spaß beim Entwickeln 😉

Check_MK: Piggyback Checkergebnisse anderer Hosts bereitstellen

$
0
0

Es gibt die Möglichkeit Check Ergebnisse wenn ein Host nicht direkt erreichbar ist für Check_MK oder man bestimmte Dinge z.B. Erreichbarkeit eines TCP Services von einem anderen Host aus testen möchte, als Piggyback über den Agenten eines anderen Hosts mitzugeben.

In den Beispiel haben wir einen Host (router) der ein Check Ergebnis von einem anderen Host (localhost) bekommen soll. Check_MK verwendet hierfür folgenden Syntax:

<<<<hostname>>>>

Check Ergebnisse, Ausgaben von Local Checks, etc.

<<<<>>>>

Das Piggyback File muss auf dem Host mit Agenten unter /var/lib/check_mk_agent/spool abgelegt werden. Ich habe die Ausgabe für ein Agent Check + einen Local Check eingebaut.

root@cmkdev:/var/lib/check_mk_agent/spool# cat piggy_router 

<<<<router>>>>
<<<mycheck>>>
foo 1
bar 2

<<<local>>>
0 Mein_piggyback_localcheck - TEST TEST TEST

<<<<>>>>

Dazu ein einfacher Check der in der Zeile den 2 Parameter als Status für den ersten zurückgibt:

OMD[dev1]:~/local/share/check_mk/checks$ cat mycheck 
#!/usr/bin/python
# -*- encoding: utf-8; py-indent-offset: 4 -*-


def inventory_mycheck(info):
    if len(info) > 1:
        yield '', None


def check_mycheck(item, params, info):
    for i in info:
        yield int(i[1]), "Status von: %s" % i[0]



check_info['mycheck'] = {
    'inventory_function'    : inventory_mycheck,
    'check_function'        : check_mycheck,
    'service_description'   : 'MyCheck',
}

Inventory, Reload und Test:

OMD[dev1]:~$ cmk -v -II router
Discovering services on router:
router:
Using piggyback information from host localhost.
    1 local
    1 mycheck

OMD[dev1]:~$ cmk -R
Generating configuration for core (type cmc)...OK
Packing config...OK
Restarting monitoring core...OK

OMD[dev1]:~$ cmk -v router
Check_MK version 1.4.0p8
Using piggyback information from host localhost.
Mein_piggyback_localcheck OK - TEST TEST TEST
MyCheck              CRIT - Status von: foo(!), Status von: bar(!!)
OK - execution time 0.0 sec|execution_time=0.002 user_time=0.000 system_time=0.010 children_user_time=0.000 children_system_time=0.000

Check_MK weist auf der Shell darauf hin das Piggyback Informationen verwendet wurden:

Using piggyback information from host localhost.

 

Viel Spaß beim piggybacken 😉

Check_MK: yield statt return in der Check Funktion

$
0
0

Check_MK erwartet bei der Check Funktion ein Tuple mit 2 (ohne Performance Daten) bzw. 3 Werten (mit Performance Daten).

<STATUS>, <MESSAGE>, <PERFOMANCEDATA>

Wenn man in einem Service mehrere Werte aggregieren möchte z.B. man hat mehrere Lüfter im System möchte aber nicht für jeden einen eigenen Service sondern nur einen einzigen, so muss man die Werte von mehreren vergleichen und dann den entsprechenden Status zurückgeben. Da diese ganzen Vergleiche aufwändig sind und fehleranfällig löst Check_MK so eine Situation mit dem yield Generator. Diesem werden alle Werte einfach übergeben, er setzt nach einer Logik den Servicestatus und fügt alle einzelnen Status in den Output des Services.

Der Status des Checks wird in folgender Reihenfolge angezeigt, d.H. ist einer der Status UNKNOWN wird der komplette Service als UNKNOWN angezeigt:

  1. Unknown
  2. Critical
  3. Warn
  4. OK

Beispiel alte Lösung mit 1 return

def check_mycheck(item, params, info):
    warn = False
    crit = False
    unkn = False

    msg = ""

    for i in info:
        fan, status = i
        status = int(status) 

        if status == 2:
            crit = True
            msg += " %s: CRIT -" % fan
        elif status == 1:
            warn = True
            msg += " %s: WARN -" % fan
        elif status == 3:
            unkn = True
            msg += " %s: UNKN -" % fan
        else:
            msg += " %s: OK -" % fan

    if unkn == True:
        return 3, msg
    elif crit == True:
        return 2, msg
    elif warn == True:
        return 1, msg
    else:
        return 0, msg

Ausgabe:

Beispiel neue Lösung mit yield

def check_mycheck(item, params, info):
    for i in info:
        fan, status = i
        status = int(status)
        yield status, "Status von: %s" % fan

Ausgabe:

Check_MK: Script um IP Adresse statisch bei einem Host einzutragen

$
0
0

Wenn die Hosts nur mit DNS-Namen angelegt sind wird regelmäßig der DNS-Cache aktualisiert, dies verzögert den Deploy Prozess. Das Script ließt den DNS Cache aus und setzt für die Hosts die IP Adresse statisch, ist die IP nicht im Cache löst er diese direkt per DNS auf.

#!/usr/bin/env python

#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful, but WITHOUT ANY 
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with 
# this program; if not, write to the Free Software Foundation, Inc., 
# 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
#

import json
import os
import subprocess
import sys
import livestatus
import socket

url = "http://cmkdev/dev1/check_mk/webapi.py"
user = "checkmk_automation"
passw = "password"
department = "hosttag"

##########################################################################################
### DON'T CHANGE ANYTHING BELOW
##########################################################################################

curl_base_cmd = url + "?_username=%s&_secret=%s" %(user,passw)

def execute_curl_cmd(curl_cmd):
    try:
        p = subprocess.Popen(curl_cmd, shell=True, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        o, e = p.communicate()
        out  = json.loads(o)
    except Exception, e:
        sys.stderr.write("ERROR: '%s' while executing '%s'\n" % (e, curl_cmd))
        sys.exit(1)
        return {}

    if out["result_code"] == 0:
        return out["result"]
    else:
        sys.stderr.write("ERROR: while executing WEB API command: '%s'\ncurl: '%s'\n" % \
                         (out["result"], curl_cmd))
        sys.exit(1)
        return {}

def edit_wato_host(curl_base_cmd, req):
    create_cmd = ('curl --insecure \'' + curl_base_cmd + \
                  '&action=edit_host\' ' + \
                  '-d \'%s\'') % req
    return execute_curl_cmd(create_cmd)

try:
    omd_root = os.getenv("OMD_ROOT")
    socket_path = "unix:" + omd_root + "/tmp/run/live"
    ip_cache = omd_root + "/var/check_mk/ipaddresses.cache"

    with open(ip_cache,'r') as inf:
        ipc = eval(inf.read())

except:
    sys.stderr.write("This example is indented to run in an OMD site\n")
    sys.stderr.write("Please change socket_path in this example, if you are\n")
    sys.stderr.write("not using OMD.\n")
    sys.exit(1)

hosts_arr = livestatus.SingleSiteConnection(socket_path).query_table("GET hosts\nColumns: name\nFilter: custom_variables ~~ TAGS %s" % department)

for host in hosts_arr:

    cached_ip = ipc.get((host[0], 4))

    if cached_ip != None:

        print host[0]
        print cached_ip

        req = 'request={"hostname": "%s", "attributes":{"ipaddress": "%s"}}' %(host[0],cached_ip)

        print req

        edit_wato_host(curl_base_cmd,req)

    else:

        try:
            ip = socket.gethostbyname(host[0])
            print "%s - %s" % (host[0],ip)

        except:
            print "no dns record for host %s " % host[0]

        req = 'request={"hostname": "%s", "attributes":{"ipaddress": "%s"}}' %(host[0],ip)

        print req

        edit_wato_host(curl_base_cmd,req)

 

Check_MK: Service custom variables

$
0
0

Die Service Variablen lassen sich genau so Erweitern wie die Host Variablen.

Dazu muss man eine neue Definition erstellen im Folder ~/local/share/check_mk/web/plugins/wato/. Die Dateiendung muss .py sein.

#!/usr/bin/env python

register_rule(
    # Sektion
    "Test",
    # Variable
    "extra_service_conf:_test_test",
    # Parameter
    TextUnicode(
        title = _("TEST TEST"),
        help = _("Test test"),
        size = 80,
        attrencode = True,
    ),
    itemtype = 'service',
    match = 'first',
)

Die Variable in der das gespeichert wird ist: extra_service_conf:_test_test, in Livestatus ist es dann unter service_custom_variables als TEST_TEST abrufbar.

Danach ein „omd restart apache && cmk -R“ um die Änderung zu aktivieren.

Jetzt kann mann unter „Parameters for this service“ einen Wert für den Service setzen.

Die selbst festgelegten Parameter können auch per Livestatus abgefragt werden:

OMD[dev1]:~/local/share/check_mk/web/plugins/wato$ lq "GET services\nColumns: service_host_name service_service_description\nFilter: service_custom_variables ~ TEST_TEST (^|[ ])test123($|[ ])"
localhost;CPU utilization

 


Check_MK: Host custom variables

$
0
0

Check_MK bietet auch die Möglichkeit die Host Variablen zu erweitern um z.B. ein Host Description Feld hinzuzufügen.

Die Erweiterung muss in ~/local/share/check_mk/web/plugins/wato/ abgelegt werden. Die Dateiendung ist zwingend .py.

OMD[dev1]:~/local/share/check_mk/web/plugins/wato$ cat host_custom_vars.py 

#!/usr/bin/env python

declare_host_attribute(
    NagiosTextAttribute(
        # Sektion / Gruppe
        "MY_HOST_CUSTOM_VARIABLES",
        # Variable mit beginnenden Unterstrich
        "_HOST_MAGIC",
        # Feldbeschreibung
        _("Host Magic"),
        # Hilfe
        _("Hilfe"),
    ),
    show_in_table=True,
    show_in_folder=True,
)

Nach dem Anlegen eines eigenen Attributs muss der Apache neu gestartet werden mit z.B. „omd restart apache“.

Die Host custom variables sind auch per Livestatus abrufbar:

OMD[dev1]:~/local/share/check_mk/web/plugins/wato$ lq "GET hosts\nColumns: host_name host_address\nFilter: host_custom_variables ~ HOST_MAGIC (^|[ ])magic($|[ ])"
localhost;127.0.0.1

 

Nano Editor Settings für Python

$
0
0

Zum Python Code schreiben empfiehlt es sich auf Tabs und Spaces zu achten. PEP-8 schreibt für Python 2.x vor das Tabs in Spaces gewandelt werden sollten.

https://www.python.org/dev/peps/pep-0008/#tabs-or-spaces

Hier eine passende .nanorc die man in sein Homeverzeichnis ablegt:

set tabsize 4
set nowrap
set tabstospaces
set autoindent
set smooth

 

Python: Einfacher IMAP Client

$
0
0

Die Überschrift sagt eigentlich schon alles. Das Code Snippet dient dazu von einem IMAP Server Mails zu laden und mit dem Payload Dinge anzustellen.

#!/usr/bin/env python

import imaplib
import sys
import email
import re
import email.header
import base64
from HTMLParser import HTMLParser

username = "blah@blah.de"
password = "xxxxxx"

imap_rz1 = "imap.xxx.de"
imap_rz2 = "imap-rz2.xxxxx.de"


class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()




# Try primary server
try:
    M = imaplib.IMAP4(imap_rz1)

except:

    sys.stderr.write("Try second server, primary not reachable.\n")
    # Try secondary server
    try:
        M = imaplib.IMAP4(imap_rz2)

    except:
        sys.stderr.write("Error no connection possible.\n")
        sys.exit(1)

# Try to Login
try:
    M.login(username, password)

except:
    sys.stderr.write("Error login.\n")
    sys.exit(1)

# DATA
M.select()
typ, data = M.search(None, 'ALL')

for num in data[0].split():
    typ, data = M.fetch(num, '(RFC822)')

    #### print 'Message %s\n%s\n' % (num, data[0][1])
    msg = email.message_from_string(data[0][1])
    hdr = email.header.make_header(email.header.decode_header(msg['Subject']))

    if msg.is_multipart():
        print "Multipart Mail"
        for payload in msg.get_payload():
            print payload.get_payload()
    else:

        enc = msg['Content-Transfer-Encoding']

        if enc == "base64":
            dirty = msg.get_payload()
            payload = base64.decodestring(dirty)
            print payload
            #print strip_tags(payload)
            pmail = parse_mail(mailcontent=strip_tags(payload).rstrip().lstrip().splitlines())
        else:
            print msg.get_payload()
            #print strip_tags(msg.get_payload())
            pmail = parse_mail(mailcontent=strip_tags(msg.get_payload()).rstrip().lstrip().splitlines())
            
    # Set to deleted
    M.store(num, '+FLAGS', '\\Deleted')

# Delete permanently
M.expunge()
# Close current mailbox
M.close()
# Logout
M.logout()

Python: Einfache HTML Mail versenden per SMTP

$
0
0
#!/usr/bin/env python

from mailer import Mailer
from mailer import Message
 
message = Message(From="foobar@example.com", To="foobaz@example.com")
message.Subject = "Eine HTML Mail"
message.Html = """
   <p>Hi!<br>
   Blah blub<br>
   </p>"""
 
sender = Mailer('smtp.example.com')
sender.send(message)

 

DNS Blacklist Check

$
0
0

Check um zu Überprüfen ob ein Mailserver auf einer Blacklist ist. Der Check lässt sich auch in Check_MK einbinden, dazu das Script in ~/local/lib/nagios/plugins/ ablegen und eine Regel „Classical active and passive Monitoring checks“ für den Mailserver erstellen. Eine native Check_MK Implementierung folgt noch 😉

#!/usr/bin/env python
# -*- encoding: utf-8; py-indent-offset: 4 -*-

#
# check_dnspl.py - Check IP against Blacklist
# Use it on your own risk!
#
# Written 2017 - Maximilian Thoma
#
# This program is free software; you can redistribute it and/or modify it under the terms of the GNU
# General Public License as published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program; if not,
# write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
#

import getopt
import sys
import socket

# Define blacklists to be checked
blacklists = [
    'all.s5h.net',
    'b.barracudacentral.org',
    'bl.emailbasura.org',
    'bl.spamcannibal.org',
    'bl.spamcop.net',
    'blacklist.woody.ch',
    'bogons.cymru.com',
    'cbl.abuseat.org',
    # 'cdl.anti-spam.org.cn',
    'combined.abuse.ch',
    'db.wpbl.info',
    'dnsbl-1.uceprotect.net',
    'dnsbl-2.uceprotect.net',
    'dnsbl-3.uceprotect.net',
    'dnsbl.anticaptcha.net',
    'dnsbl.cyberlogic.net',
    'dnsbl.dronebl.org',
    'dnsbl.inps.de',
    'dnsbl.sorbs.net',
    'drone.abuse.ch',
    'drone.abuse.ch',
    'duinv.aupads.org',
    'dul.dnsbl.sorbs.net',
    'dyna.spamrats.com',
    'dynip.rothen.com',
    'exitnodes.tor.dnsbl.sectoor.de',
    'http.dnsbl.sorbs.net',
    'ips.backscatterer.org',
    'ix.dnsbl.manitu.net',
    'korea.services.net',
    'misc.dnsbl.sorbs.net',
    'noptr.spamrats.com',
    'orvedb.aupads.org',
    'pbl.spamhaus.org',
    'proxy.bl.gweep.ca',
    'psbl.surriel.com',
    'relays.bl.gweep.ca',
    'relays.nether.net',
    'sbl.spamhaus.org',
    'short.rbl.jp',
    'singular.ttk.pte.hu',
    'smtp.dnsbl.sorbs.net',
    'socks.dnsbl.sorbs.net',
    'spam.abuse.ch',
    'spam.dnsbl.sorbs.net',
    'spam.spamrats.com',
    'spambot.bls.digibase.ca',
    'spamrbl.imp.ch',
    'spamsources.fabel.dk',
    'ubl.lashback.com',
    'ubl.unsubscore.com',
    'virus.rbl.jp',
    'web.dnsbl.sorbs.net',
    'wormrbl.imp.ch',
    'xbl.spamhaus.org',
    'z.mailspike.net',
    'zen.spamhaus.org',
    'zombie.dnsbl.sorbs.net',
]


def check_if_valid_host_ip(ip):
    try:
        socket.inet_aton(ip)
        return True
    except socket.error:
        return False


def revert_ip(ip):
    x = ip.split('.')
    return x[3] + '.' + x[2] + '.' + x[1] + '.' + x[0]


def bls(olist):
    x = ''
    for bl in olist:
        x += bl + " "
    return x


def log(debug, s):
    if debug:
        print s


def usage():
    print "check_dnsbl.py - Check IP against DNS blacklists.\n" \
          " -H, --host <hostname or ip> Hostname or IP\n" \
          " -d, --debug Debug Modus\n" \
          " -h, --help Help"


def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "H:dh", ['host=', 'debug', 'help'])
    except getopt.GetoptError as err:
        print str(err)
        sys.exit(2)

    found_h = False
    host = None
    debug = False

    for o, a in opts:
        if o in ('-H', '--host'):
            host = a
            found_h = True
        if o in ('-d', '--debug'):
            debug = True
        if o in ('-h', '--help'):
            usage()
            sys.exit(2)

    if not found_h:
        print "-H is not given"
        usage()
        sys.exit(2)

    # print host
    # print debug



    # Check if valid Host IP
    if check_if_valid_host_ip(host) is not True:
        try:
            resolved_ip = socket.gethostbyname(host)
        except socket.gaierror:
            sys.stderr.write('Unable to make an DNS lookup, provided IP or hostname is invalid.')
            sys.exit(2)
        if check_if_valid_host_ip(resolved_ip) is not True:
            sys.stderr.write('Error no valid IP address.')
            sys.exit(2)
        else:
            ip = resolved_ip
    else:
        ip = host

    # Revert IP
    rip = revert_ip(ip)

    # Init variables
    negative_result_buffer = []

    for bl in blacklists:
        # Init Result
        result = ''
        # Build query string
        q = rip + '.' + bl
        log(debug, q)

        # Query DNS
        try:
            result = socket.gethostbyname(q)
            log(debug, "Result: %s" % result)
        except socket.error:
            log(debug, "No result")
            pass

        if "127.0.0" in result:
            log(debug, "Found 127.0.0 in result.")
            negative_result_buffer.append(bl)

    if len(negative_result_buffer) == 0:
        print "OK - %s (%s) is not listed at: %s" % (host, ip, bls(blacklists))
        sys.exit(0)
    else:
        print "CRITICAL - %s (%s) ist listed at: %s" % (host, ip, bls(negative_result_buffer))
        sys.exit(2)


if __name__ == "__main__":
    main()

 

Viewing all 65 articles
Browse latest View live