#!/usr/bin/perl
use strict;

my @ok = ();
my @err = ();

my $bond_slave_hash = {};

my $cmdResult = `/usr/bin/ovs-appctl lacp/show`;
my $cmdExit = $? >> 8;

if ($? == -1) {
    print "UNKNOWN: Missing open vSwitch utils\n";
    exit 3;
} elsif ($cmdExit != 0) {
    print "UNKNOWN: Running open vSwitch utils returned error code $cmdExit\n";
    exit 3;
}

my $cur_bond = my $bond_slave = my $slave_state = "";
foreach my $line (split /\n/, $cmdResult) {
    if ($line =~ m#^----\s(bond\d+)\s----#) { $cur_bond = $1; }
    if ($line =~ m#^(?:slave|member):\s([^:]+):\s(.*)#) {
        $bond_slave = $1;
        $slave_state = $2;
        $$bond_slave_hash{$cur_bond}{$bond_slave} = $slave_state;
    }
}

foreach my $bond (sort keys %$bond_slave_hash) {
    foreach my $slave (sort keys %{$$bond_slave_hash{$bond}}) {
        my $state = $$bond_slave_hash{$bond}{$slave};
        if ($state ne "current attached") {
            push @err, "${bond}::${slave}::${state}";
        }
    }
}

if (scalar(@err)) {
    print "CRITICAL: " . join(", ", @err) . "\n";
    exit 3;
}

print "OK: " . join(", ", sort keys %$bond_slave_hash) . "\n";
exit 0;
