#!/usr/bin/bash
#
# Get a list of users who have ever logged into the server and thier most recent login details
#

function discovery {
    env TZ=Australia/Sydney lastlog \
     | perl -MDate::Parse -MJSON -ne '
        BEGIN { @DATA = (); };
        next if ($. == 1 || /\*\*Never logged in\*\*/);
        /^(?<USER>\S+)\s+(?<PORT>\S+)\s+(?:(?<FROM>\S+?)\s+)?(?<TIMESTAMP>(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat).*$)/;
        my %item = %+;
        $item{EPOCH} = "" . str2time($item{TIMESTAMP});
        %item = map {; "{#$_}" => $item{$_} } (keys %item);
        push(@DATA, \%item);
        END { print to_json({ data => \@DATA }, { pretty => 1}) . "\n"; };
    '
}

function data {
    local WHO="$1"
    local WHAT="$2"
    env TZ=Australia/Sydney lastlog -u "$WHO" \
      | perl -MDate::Parse -MJSON -ne '
        BEGIN { $WHAT = uc pop @ARGV; }
        next if ($. == 1);
	s/\*\*Never logged in\*\*/ - - Thu Jan 01 10:00:00 +1000 1970/;
        /^(?<USER>\S+)\s+(?<PORT>\S+)\s+(?:(?<FROM>\S+?)\s+)(?<TIMESTAMP>(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat).*$)/;
        my %item = %+;
        $item{EPOCH} = "" . str2time($item{TIMESTAMP});
        print ($item{$WHAT} // "ZBX_NOTSUPPORTED");
        print "\n";
      ' -- "$WHAT"
}

function usage {
    echo "USAGE: $(basename $0) ( --usage|--help|-h|-? | [<discovery-dummy-key>] | <user> (USER|PORT|FROM|EPOCH|TIMESTAMP) )" 
}

if [[ "$1" =~ ^--usage|--help|-h|-\?$ ]]; then
    usage
elif [[ $# -le 1 ]]; then
    discovery "$1"
elif [[ -n "$1" && -n "$2" ]]; then
    if getent passwd "$1" >/dev/null 2>/dev/null; then
        data "$1" "$2"
    else
        # No such user....
        echo "ZBX_NOTSUPPORTED"
    fi
else
    usage
fi
