#!/usr/bin/env ruby

require 'socket'

def usage
  puts "usage: rbclient login USER DOMAIN PASS IP MAC"
  puts "       rbclient logout USER DOMAIN"
  puts "       rbclient stats"
  puts "       rbclient list"
  puts "       rbclient list DOMAIN"
  puts "       rbclient list USER DOMAIN"
  exit 3
end

if ARGV.length == 0 or ARGV.length > 6
  usage
end

begin
  fd = UNIXSocket.open('/tmp/oasis')
rescue
  print $!, "\n"
  exit 1
end

stats = 0

case ARGV.shift
when "login"
  usage unless ARGV.length == 5
  fd.send("LOGIN\rUSER="+ARGV.shift+"\rDOMAIN="+ARGV.shift+
		  "\rPASS="+ARGV.shift+"\rIP="+ARGV.shift+
		  "\rMAC="+ARGV.shift+"\r\n", 0);

when "stats"
  usage unless ARGV.length == 0
  fd.send("STATS\r\n", 0)
  stats = 1

when "list"
  usage unless ARGV.length <= 2
  case ARGV.length
  when 0
	fd.send("LIST\r\n", 0)
  when 1
	fd.send("LIST\rDOMAIN="+ARGV.shift+"\r\n", 0)
  when 2
	fd.send("LIST\rUSER="+ARGV.shift()+"\rDOMAIN="+ARGV.shift()+"\r\n", 0)
  else
	usage
  end
  list = 1

when "logout"
  usage unless ARGV.length == 2
  fd.send("LOGOUT\rUSER="+ARGV.shift+"\rDOMAIN="+ARGV.shift+"\r\n", 0);
else
  usage
end

if stats == 1 then
  print fd.readline
  statline = fd.readline
  f=statline.split()
  print "number of users currently logged in: ", f[0], "\n"
  print "total number of logins: ", f[1], "\n"
  print "failed authentications: ", f[2], "\n"
  print "failed requests: ", f[3], "\n"
  t = f[4].to_i
  d = t / (60*60*24)
  t = t - d*24*60*60
  h = t / (60*60)
  t = t - h*60*60
  m = t / 60
  t = t - m*60
  s = t
  print "uptime: ",d," days, ",h," hours, ",m," minutes, ",s," seconds\n"
elsif list == 1 then
  print fd.readline
  n=0
  reply = fd.each_line("\r\n") {|line|
	print line.chop, "\n"
	n=n+1
  }
  print "-----------------------\n"
  print "Totally ", n, " users logged in\n"
else
  reply = fd.each_line("\r\n") {|line|
	print "reply: ", line.chop, "\n"
  }
end
