## Check_requirements

Script: `check_requirements`

**check_requirements** is a plugin to run different check to show the ability to run an application. You can these checks

* Check if a process exists
* Check an open udp or tcp port (local or on given host/ ip)
* Ping a target system (new in v1.3)

You can insert a label to create multiple blocks.

## Requirements

* Linux GNU tools
  * `ps`
  * `top`
  * `ping`

## Standalone installation

From this repository ypu need next to this script:

* `inc_pluginfunctions` shared function for all IML checks written in bash

## Syntax

```txt
______________________________________________________________________

CHECK_REQUIREMENTS
v1.3

(c) Institute for Medical Education - University of Bern
Licence: GNU GPL 3

https://os-docs.iml.unibe.ch/icinga-checks/Checks/check_requirements.html
______________________________________________________________________

Check if a list requirements regarding processes and network 
connections do exist.

The check returns OK if all given requirements match.

SYNTAX:
check_requirements [-h] [PARAMETERS]

OPTIONS:

    -h|--help            show this help.
    -v|--verbose         show more data: processes and port numbers from
                         /etc/services; add it as first param

PARAMETERS:

    -c|--connect TYPE TARGET PORT        
                         check if connect to a server to a given port
                         is reachable
                         TYPE    string  one of tcp|udp
                         TARGET  string  target host
                         PORT    int     port number
    -i|--ping TARGET     ping a target system
    -l|--label STRING    add label to divide the output in multiple sections
    -p|--process STRING  check if a process with given regex exists in the
                         output of 'ps aux'
    -t|--tcp PORT        check if connect on local tcp port is reachable;
                         This is a shortcut for '-c tcp localhost PORT'

The parameters can be repeated multiple times. Checks will be executed in
the given order.

EXAMPLES

check_requirements -p httpd -p mysqld -t 22 -t 80 -t 443 -t 3306
     Check if
     - a process httpd and a process mysqld exist
     - localhost listens to ports 22, 80, 443 and 3306

check_requirements -l "webservice" -p httpd -t 80 -t 443 -l "database" -p mysqld -t 3306
     Use output with multiple sections

```

### Parameters

(none)

## Examples

### 3 checks

Check a locally rtunning webservice as process and 2 ports: ``check_requirements -p nginx -t 443 -t 80``

```txt
OK: 3 Requirement checks - errors: 0

STATUS  TYPE        RESULT
OK      process     nginx (2 x)
OK      connection  tcp to localhost on port 443
OK      connection  tcp to localhost on port 80
```

### Verbose mode

The verbose mode can be activated with `-v`. The checks are execeuted parameter by parameter. The debug begins where you add `-v` - so the best option is to add it at the beginning.

This is the same list of checks again that you can compare both outputs: ``check_requirements -v -p nginx -t 443 -t 80``

```txt
OK: 3 Requirement checks - errors: 0

STATUS  TYPE        RESULT
OK      process     nginx (2 x)
        > root        1211  0.0  0.0  16468  3436 ?        Ss   13:34   0:00 nginx: master process /usr/bin/nginx
        > http        1212  0.0  0.0  16476  5188 ?        S    13:34   0:00 nginx: worker process

OK      connection  tcp to localhost on port 443
        > https             443/tcp

OK      connection  tcp to localhost on port 80
        > http               80/tcp
        > www                80/tcp
        > www-http           80/tcp
```

### Labels

The `-l <TEXT>` parameter adds a label. With it you can visually group some checks.

When executing this: `/check_requirements -l "webservice" -p nginx -t 443 -t 80 -l "network" -c tcp www.example.com 443` then we get 2 sections with a table of executed checks inside:

```txt
OK: 4 Requirement checks - errors: 0

========== webservice

STATUS  TYPE        RESULT
OK      process     nginx (2 x)
OK      connection  tcp to localhost on port 443
OK      connection  tcp to localhost on port 80

========== network

STATUS  TYPE        RESULT
OK      connection  tcp to www.example.com on port 443
```