Manisha is a Nagios (and compatible) monitoring plug-in to test Gemini servers. It allows to test automatically if the servers work fine from monitoring schedulers like Nagios or Icinga. It can test the status code, the content of the answer, etc.

Gemini is a lightweight system to distribute information (an alternative to the Web).

Manisha is written in Python.


Manisha follows the usual Nagios rules. The options are:

  • -H: host name or address to monitor
  • -V: virtual hostname (necessary for the Gemini protocole, and the certificate check will be based on that)
  • -p: path in the URL (do not add a leading slash)
  • -e: a string to expect in the answer
  • -c: the status code to expect (20, by default)
  • -C: the expiration date of the certificate (as days_before_warning,days_before_critical)
  • -m: a string to expect in the meta-answer (for instance text/gemini)
  • -P: port to use (the default is 1965)
  • -g: get the content of the resource (only way, with Gemini, to get the size)
  • -i: insecure (do not check the certificate)
  • -T: disable TOFU certificate check
  • -a: accept expired certificates
  • -x: do not send the SNI
  • -4: force a test over IPv4
  • -6: force a test over IPv6

For Icinga, the following definition enables the plugin:

object CheckCommand "gemini" {
  command = [ PluginContribDir + "/check_gemini" ]

  arguments = {
     "-H" = {{
       var v6only = macro("$gemini_forceipv6$")
       var v4only  = macro("$dot_forceipv4$")
       var addr_v4 = macro("$address$")
       var addr_v6 = macro("$address6$")
           if ((addr_v6 && !v4only) || v6only) {
        return addr_v6
       } else {
        return addr_v4
      "-V" = "$gemini_vhost$",
      "-e" = "$gemini_expect$",
      "-c" = "$gemini_expect_statuscode$",
      "-C" = "$gemini_certificate$",
      "-m" = "$gemini_expect_meta$",
      "-p" = "$gemini_path$",
      "-P" = "$gemini_port$",
      "-i" = { set_if = "$gemini_insecure$" },
      "-T" = { set_if = "$gemini_no_tofu$" },
      "-a" = { set_if = "$gemini_accept_expired$" },
      "-x" = { set_if = "$gemini_nosni$" },
      "-g" = { set_if = "$gemini_get_content$" },
      "-4" = "$gemini_force_ipv4$",
      "-6" = "$gemini_force_ipv6$"


And a possible use is:

apply Service for (gemini_vhost => config in host.vars.gemini_vhosts) {
  import "generic-service"

  check_command = "gemini"
  assign where (host.address || host.address6) && host.vars.gemini
  vars += config
object Host "radia" {
  vars.gemini_vhosts["vhost1"] = {
      gemini_expect = "This is virtual host 1"
      gemini_vhost = "vhost1.example"

  vars.gemini_vhosts["vhost2"] = {
      gemini_expect = "This is virtual host 2"
      gemini_vhost = "vhost2.example"


You need Python 3, Agunua and PyOpenSSL. You can install them with pip pip3 install pyOpenSSL agunua.

On Debian, if you prefer regular operating system packages to pip, apt install python3-openssl will install PyOpenSSL (Agunua is not yet packaged).

Then, copy the script to the directory of local plugins.


Manisha is the girlfriend of Gemini in a movie.




Stéphane Bortzmeyer .

Reference site Use the Gitlab issue tracker to report bugs or wishes. But you can of course also access it with gemini at gemini://