#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8
#
# Munin plugin to show number of documents in Sphinx index
#
# Copyright Igor Borodikhin
#
# License : GPLv3
#
# parsed environment variables:
# server: hostname or ip-address of Sphinx server
# port: port number of Sphinx server
#
# This plugin shows graphs of numbers of documents in Sphinxsearch indexes.
#
# ## Requirements
# This plugin requires pythons sphinxsearch module which can be installed via easy_install.
#
# ## Installation
# Copy file to directory /usr/share/munin/pligins/ and create symbolic links for each index you wish to monitor.
# For example, if you've got indexes called index1 and index2 create these symlinks:
#
#     ln -s /usr/share/munin/plugins/sphindex_ /etc/munin/plugins/sphindex_index1
#     ln -s /usr/share/munin/plugins/sphindex_ /etc/munin/plugins/sphindex_index2
#
# If you run munin-node at different box than Sphinxsearch you can specify hostname and port options in munin-node.conf:
#
#     [sphindex_*]
#     env.server 10.216.0.141
#     env.port 9312
#
#%# capabilities=autoconf
#%# family=contrib

import os, sys, sphinxsearch
progName  = sys.argv[0]
indexName = progName[progName.find("_")+1:]

if len(sys.argv) == 2 and sys.argv[1] == "autoconf":
    print "yes"
elif len(sys.argv) == 2 and sys.argv[1] == "config":
    warning = "0:"
    critical = "0:"
    if "warning" in os.environ and os.environ["warning"] != None:
        warning = os.environ["warning"]
    if "critical" in os.environ and os.environ["critical"] != None:
        critical = os.environ["critical"]

    print "graph_title Sphinx index %s stats" % indexName
    print "graph_vlabel docs count"
    print "graph_category search"
    print "documents_count.warning %s" % warning
    print "documents_count.critical %s" % critical
    print "documents_count.label Documents count in index"
    print "graph_args --base 1000 -l 0"
else:
    if "server" in os.environ and os.environ["server"] != None:
        server = os.environ["server"]
    else:
        server =  "localhost"

    if "port" in os.environ and os.environ["port"] != None:
        try:
            port = int(os.environ["port"])
        except ValueError:
            port = 9312
    else:
        port = 9312

    client = sphinxsearch.SphinxClient()
    client.SetServer(server, port)
    client.SetLimits(0, 1, 0, 0)
    result = client.Query("", indexName)
    docCount = result["total_found"]

    print "documents_count.value %d" % docCount
