#!/usr/bin/perl

# Need to look at command line options, parse them,
# and do what is necessary.
# bsdsar version 0.10
# $ bsdsar /path/to/bsdsar/logdirectory

$directory = shift;
if (!($directory)) {
	$directory = "/var/log";
}

$time = `date "+%m%d %H:%M"`;
chomp $time;

&get_mem_info;
&get_swap_info;
&get_cpu_info;
#&get_ide_info;
#&get_scsi_info;
&get_disk_info;
&get_network_info;
&get_nfs_info;

&check_datafile_size;
&write_data_file;


##################
sub check_datafile_size {
	#	
	$datafile = "$directory\/bsdsar.dat";
	if ((-s $datafile) > 2200000) {
		# whack the first 1500 entries
		open(DFILE, "$datafile");
		@dlines = <DFILE>;
		close(DFILE);
		@junk = splice(@dlines, 0, 1500);
		open(DFILE, ">$datafile");
		print DFILE @dlines;
		close(DFILE);	
	}
}


sub get_network_info {
	$ifacecount = 0;
	# netstat -s -b -d -p tcp

	@netstatdata = `netstat -b -i`;
	foreach $temp (@netstatdata) {
		if (($temp !~ /^(sl|ppp|lo|gif|faith|lp)/) && ($temp =~ /Link/)) {
			push (@netstatlist, $temp);
		}
	}
	# now lets pull data from netstatlist
	foreach $ifaceline (@netstatlist) {
		chomp $ifaceline;
		($ifacename, $junk, $junk, $junk, $inpkts, $inerrs, $inbytes, $outpkts, $outerrs, $outbytes, $coll) = split/\s+/,$ifaceline;
		$ifaceinfo .= "$ifacename,$inpkts,$inerrs,$inbytes,$outpkts,$outerrs,$outbytes,$coll\|";
		$ifacecount++;
	}
	$ifaceleft = 4 - $ifacecount;
	for ($i = 1; $i <= $ifaceleft; $i++) {
                $ifaceinfo .= "\|";
        }
	# store interface info
	$objects{'ifacestats'} = $ifaceinfo;	

}

sub write_data_file {
	$datafile = "$directory\/bsdsar.dat";
	open(DATA,">>$datafile");
	print DATA "$time\|$objects{'memfree'}\|$objects{'memactive'}\|$objects{'meminactive'}\|";
	print DATA "$objects{'totalswap'}\|$objects{'usedswap'}\|$objects{'freeswap'}\|";
	print DATA "$objects{'cpu_user'}\|$objects{'cpu_nice'}\|$objects{'cpu_sys'}\|$objects{'cpu_use'}\|$objects{'cpu_idle'}\|";
	print DATA "$objects{'ad0'}\|$objects{'ad1'}\|$objects{'ad2'}\|$objects{'ad3'}\|";
	print DATA "$objects{'da0'}\|$objects{'da1'}\|$objects{'da2'}\|$objects{'da3'}\|$objects{'da4'}\|$objects{'da5'}\|$objects{'da6'}\|";
	print DATA "$objects{'ifacestats'}";
  	print DATA "$objects{'nfsclientread'}\|$objects{'nfsclientwrite'}\|$objects{'nfsclientreq'}\|";
  	print DATA "$objects{'nfssrvrread'}\|$objects{'nfssrvrwrite'}\|$objects{'nfssrvraccess'}\|";
	print DATA "\n";
	close(DATA);
}

sub get_nfs_info {
  @rawnfs_info = `nfsstat`;
  @clientline = split /\s+/,$rawnfs_info[3];
  $objects{'nfsclientread'} = $clientline[4];
  $objects{'nfsclientwrite'} = $clientline[5];
  @clientline = split /\s+/,$rawnfs_info[10];
  $objects{'nfsclientreq'} = $clientline [4];
  
  @srvline = split /\s+/, $rawnfs_info[19];
  $objects{'nfssrvrread'} = $srvline[4];
  $objects{'nfssrvrwrite'} = $srvline[5];
  @srvline = split /\s+/, $rawnfs_info[21];
  $objects{'nfssrvraccess'} = $srvline[7];
}

sub get_mem_info {
	@toplist = `top -d 1 -b`;
	@meminfo = split /\s+/,$toplist[3];
	$objects{'memfree'} = $meminfo[11];
	$objects{'memactive'} = $meminfo[1];
	$objects{'meminactive'} = $meminfo[3];
}

sub get_swap_info {
	@swapinfo = `pstat -s -k`;
	@swapdata = split /\s+/,$swapinfo[1];
	$objects{'totalswap'} = $swapdata[1];
	$objects{'usedswap'} = $swapdata[2];
	$objects{'freeswap'} = $swapdata[3];
}

sub get_cpu_info {
	@raw_iostat_cpu = `iostat -C -n 0 1 2`;
	($junk, $junk, $junk, $objects{'cpu_user'}, $objects{'cpu_nice'}, $objects{'cpu_sys'}, $objects{'cpu_use'}, $objects{'cpu_idle'}) = split/\s+/,$raw_iostat_cpu[3];
	if ($objects{'cpu_use'} eq "0100") { $objects{'cpu_use'} = 0; $objects{'cpu_idle'} = "100"; }
	if ($objects{'cpu_user'} eq "0100") { $objects{'cpu_user'} = 0; $objects{'cpu_nice'} = "100"; }
	if ($objects{'cpu_nice'} eq "0100") { $objects{'cpu_nice'} = 0; $objects{'cpu_sys'} = "100"; }
	if ($objects{'cpu_sys'} eq "0100") { $objects{'cpu_sys'} = 0; $objects{'cpu_use'} = "100"; }
}

sub get_disk_info {
	@vminfo_disks = `vmstat -n 11 -p IDE -p SCSI 1 2`;
	@taglist = split /\s+/,$vminfo_disks[1];
	$h = 0;
	foreach $tag (@taglist) {
		if ($tag =~ /ad[0-3]/) { $idedrives{$tag} = $h; }
		elsif ($tag =~ /da[0-6]/) { $scsidrives{$tag} = $h; }
		$h++;
	}
	@drive_info = split /\s+/,$vminfo_disks[3];
	$objects{'ad0'} = $drive_info[$idedrives{'ad0'}];
	$objects{'ad1'} = $drive_info[$idedrives{'ad1'}];
	$objects{'ad2'} = $drive_info[$idedrives{'ad2'}];
	$objects{'ad3'} = $drive_info[$idedrives{'ad3'}];
	$objects{'da0'} = $drive_info[$scsidrives{'da0'}];
	$objects{'da1'} = $drive_info[$scsidrives{'da1'}];
	$objects{'da2'} = $drive_info[$scsidrives{'da2'}];
	$objects{'da3'} = $drive_info[$scsidrives{'da3'}];
	$objects{'da4'} = $drive_info[$scsidrives{'da4'}];
	$objects{'da5'} = $drive_info[$scsidrives{'da5'}];
	$objects{'da6'} = $drive_info[$scsidrives{'da6'}];
}
sub get_ide_info {
	# get the data for ide drives:
	@vminfo_ide = `vmstat -n 4 -p da 1 2`;
	@ide_info = split /\s+/,$vminfo_ide[3];
	@ide_labels = split /\s+/,$vminfo_ide[1];
	$lastdrive = $#ide_info - 7;
	$firstdrive = 11;
	for ($i = $firstdrive; $i <= $lastdrive; $i++) {
    		$objects{$ide_labels[$i+1]} = $ide_info[$i];
	}
}

sub get_scsi_info {
	# get the data for scsi drives:
	@vminfo_scsi = `vmstat -n 4 -p sa 1 2`;
	@scsi_info = split /\s+/,$vminfo_scsi[3];
	@scsi_labels = split /\s+/,$vminfo_scsi[1];
	$lastdrive = $#scsi_info - 7;
	$firstdrive = 11;
	for ($i = $firstdrive; $i <= $lastdrive; $i++) {
		$objects{$scsi_labels[$i+1]} = $scsi_info[$i];
	}
}


