summaryrefslogtreecommitdiff
path: root/databases/pgcluster/files/check_pgreplicate.pl
blob: bda8010840ab04aba89486dc2c9c4e933eecb9fd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/perl -w
#
# Copyright (c) 2004  IMG SRC, Inc.  All rights reserved.
#
# $Id: check_pgreplicate.pl,v 1.2 2004/04/16 12:10:53 kuriyama Exp $
#
# Plugin for nagios.
#
# define command{
# 	command_name	check_pgreplicate
# 	command_line	$USER1$/check_pgreplicate -H $HOSTADDRESS$ -p $ARG1$ -w $ARG2$ -c $ARG3$
# 	}
#
# # Declare cluster which has 2 pgcluster instances.
# # Send a warning if usable pgcluster is under 2.
# # Send a critical if usable pgcluster is under 1.
# define service{
# 	use		generic-service
# 	host_name	replicator.example.org
# 	service_description	PGREPLICATE
# 	check_command	check_pgreplicate!8777!2!1
# }

use strict;
use Getopt::Std;
use IO::Socket::INET;

my %O;
getopts('H:p:w:c:v', \%O);

my $w = $O{w};
my $c = $O{c};
usage() if (not $w or not $c);

my $host = sprintf("%s:%d", $O{H} || "localhost", $O{p} || 8777);
my $sock = IO::Socket::INET->new($host) or die "$!";

my $HOSTNAME_MAX_LENGTH = 128;
my $DBNAME_MAX_LENGTH = 128;
my $USERNAME_MAX_LENGTH = 128;

# typedef struct ReplicateHeaderType
# {
# 	char cmdSys;
# 	char cmdSts;
# 	char cmdType;
# 	char dummy;
# 	char port[INT_LENGTH];
# 	char pid[INT_LENGTH];
# 	char query_size[INT_LENGTH];
# 	char except_host[HOSTNAME_MAX_LENGTH];
# 	char from_host[HOSTNAME_MAX_LENGTH];
# 	char dbName[DBNAME_MAX_LENGTH];
# 	char userName[USERNAME_MAX_LENGTH];
# 	struct timeval tv;
# } ReplicateHeader;
my $query = "dummy";
my $packet = pack "CCCCa12a12a12a128a128a128a128ll", 0, 0, ord("o"), 0,
  "0", "0", "5", "except host", "from host", "db name", "user name",
  time, 0;

print $sock $packet;
print $sock $query;

my ($use, @Host, %tmp) = (0);
while (<$sock>) {
  chomp;
  if ($_ eq "") {
    push @Host, { %tmp };
    $use++ if ($tmp{useFlag} == 2);
    %tmp = ();
  } else {
    my ($var, $val) = split(/=/, $_, 2);
    $tmp{$var} = $val;
  }
}
close($sock);

my $ret = 0;
if ($use < $O{c}) {
  $ret = 2;
} elsif ($use < $O{w}) {
  $ret = 1;
}
my %STATUS = (2 => "CRITICAL", 1 => "WARNING", 0 => "OK");
printf "PGREPLICATE %s: %d hosts active\n", $STATUS{$ret}, $use;
if ($O{v}) {
  foreach (@Host) {
    printf "%s:%d, useFlag=%d, recoveryPort=%d\n",
      $_->{hostName}, $_->{port}, $_->{useFlag}, $_->{recoveryPort};
  }
}
exit $ret;

# ============================================================
sub usage {
  print "Usage: check_pgreplicate -H host -p port -w <warn> -c <crit> [-v]\n";
  exit(3);
}