my $clearadm = new Clearadm;
# Add a new system
- my %system = (
+ my %system =(
name => 'jupiter',
alias => 'defaria.com',
admin => 'Andrew DeFaria',
description => 'Home server',
);
- my ($err, $msg) = $clearadm->AddSystem (%system);
+ my ($err, $msg) = $clearadm->AddSystem(%system);
# Find systems matching 'jup'
- my @systems = $clearadm->FindSystem ('jup');
+ my @systems = $clearadm->FindSystem('jup');
# Get a system by name
- my %system = $clearadm->GetSystem ('jupiter');
+ my %system = $clearadm->GetSystem('jupiter');
# Update system
my %update = (
# Delete system (Warning: will delete all related records regarding this
# system).
- my ($err, $msg) = $clearadm->DeleteSystem ('jupiter');
+ my ($err, $msg) = $clearadm->DeleteSystem('jupiter');
=head1 DESCRIPTION
use Display;
use GetConfig;
use Mail;
+use Clearcase::Vob;
+use Clearcase::View;
my $conf = dirname(__FILE__) . '/../etc/clearadm.conf';
my @returnValues;
# Quote data values
- push @returnValues, $_ eq '' ? 'null' : $self->{db}->quote($_)
- for (@values);
+ push @returnValues, $_ eq '' ? 'null' : $self->{db}->quote($_) for (@values);
return @returnValues;
} # _formatValues
my @nameValueStrs;
- push @nameValueStrs, "$_=" . $self->{db}->quote($rec{$_})
- for (keys %rec);
+ push @nameValueStrs, "$_=" . $self->{db}->quote($rec{$_}) for (keys %rec);
return @nameValueStrs;
} # _formatNameValues
my $count;
my $statement = "select count(*) from $table ";
- $statement .= "where $condition"
- if $condition;
+ $statement .= "where $condition" if $condition;
my $sth = $self->{db}->prepare($statement)
or return $self->_dberror('Unable to prepare statement', $statement);
$count = 0;
} # if
- return ($count, 'Records deleted')
- if $count == 0;
+ return ($count, 'Records deleted') if $count == 0;
$statement = "delete from $table ";
- $statement .= "where $condition"
- if $condition;
+ $statement .= "where $condition" if $condition;
$self->{db}->do($statement);
my $statement = "update $table set ";
$statement .= join ',', $self->_formatNameValues(%rec);
- $statement .= " where $condition"
- if $condition;
+ $statement .= " where $condition" if $condition;
$self->{db}->do($statement);
} # if
} # for
- return "$fieldname is required"
- unless $found;
+ return "$fieldname is required" unless $found;
} # for
return;
if ($system{name}) {
return $system{name};
} else {
- return;
+ return;
} # if
} # _aliasSystem
my $result = _checkRequiredFields \@requiredFields, \%system;
- return -1, "AddSystem: $result"
- if $result;
+ return -1, "AddSystem: $result" if $result;
$system{loadavgHist} ||= $defaultLoadavgHist;
sub GetSystem($) {
my ($self, $system) = @_;
- return
- unless $system;
+ return unless $system;
my @records = $self->_getRecords(
'system',
if ($records[0]) {
return %{$records[0]};
} else {
- return;
+ return;
} # if
} # GetSystem
my $result = _checkRequiredFields \@requiredFields, \%package;
- return -1, "AddPackage: $result"
- if $result;
+ return -1, "AddPackage: $result" if $result;
return $self->_addRecord('package', %package);
} # AddPackage
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
return $self->_updateRecord('package', "system='$system'", %update);
} # UpdatePackage
$system = $self->_aliasSystem($system);
- return
- unless $system;
-
- return
- unless $name;
+ return unless $system;
+ return unless $name;
my @records = $self->_getRecords(
'package',
if ($records[0]) {
return %{$records[0]};
} else {
- return;
+ return;
} # if
} # GetPackage
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
my $condition = "system='$system' and name like '%$name%'";
my $result = _checkRequiredFields \@requiredFields, \%filesystem;
- return -1, "AddFilesystem: $result"
- if $result;
+ return -1, "AddFilesystem: $result" if $result;
# Default filesystem threshold
$filesystem{threshold} ||= $defaultFilesystemThreshold;
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
return $self->_deleteRecord(
'filesystem',
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
return $self->_updateRecord(
'filesystem',
$system = $self->_aliasSystem($system);
- return
- unless $system;
-
- return
- unless $filesystem;
+ return unless $system;
+ return unless $filesystem;
my @records = $self->_getRecords(
'filesystem',
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
my $condition = "system='$system' and filesystem like '%$filesystem%'";
} # if
} # GetVob
+<<<<<<< HEAD
+sub FindVobStorage(;$$) {
+ my ($self, $tag, $region) = @_;
+
+ $tag ||= '';
+ $region ||= '';
+
+=======
sub FindVob($;$) {
my ($self, $tag, $region) = @_;
$condition .= " and region='$region'" if $region;
+ return $self->_getRecords('vobstorage', $condition);
+} # FindVobStorage
+
+sub FindVob(;$$) {
+ my ($self, $tag, $region) = @_;
+
+ $tag ||= '';
+ $region ||= '';
+
+ # Windows vob tags begin with "\", which is problematic. The solution is to
+ # escape the "\"
+ $tag =~ s/^\\/\\\\/;
+
+ my $condition = "tag like '%$tag%'";
+
+ $condition .= " and region='$region'" if $region;
+
return $self->_getRecords('vob', $condition);
} # FindVob
my $result = _checkRequiredFields \@requiredFields, \%view;
- return -1, "AddView: $result"
- if $result;
+ return -1, "AddView: $result" if $result;
return $self->_addRecord('view', %view);
} # AddView
} # GetView
sub FindView(;$$$$) {
- my ($self, $system, $region, $tag, $ownerName) = @_;
-
- $system ||= '';
- $region ||= '';
- $tag ||= '';
- $ownerName ||= '';
+ my ($self, $tag, $region, $ownerName) = @_;
my $condition;
+ my @conditions;
- $condition = "system like '%$system%'";
- $condition .= ' and ';
- $condition = "region like '%$region%'";
- $condition .= ' and ';
- $condition .= "tag like '%$tag'";
- $condition .= ' and ';
- $condition .= "ownerName like '%$ownerName'";
+ push @conditions, "tag like '%$tag%'" if $tag;
+ push @conditions, "region = '$region'" if $region;
+ push @conditions, "ownerName like '$ownerName'" if $ownerName;
+
+ $condition = join " and ", @conditions if @conditions;
return $self->_getRecords('view', $condition);
} # FindView
my %filesystem = $self->GetFilesystem($system, $filesystem);
- return
- unless %filesystem;
+ return unless %filesystem;
my %task = $self->GetTask('scrub');
);
if ($dbmsg eq 'Records deleted') {
- return (0, $dbmsg)
- if $dberr == 0;
+ return (0, $dbmsg) if $dberr == 0;
my %runlog;
my %system = $self->GetSystem($system);
- return
- unless %system;
+ return unless %system;
my %task = $self->GetTask('loadavg');
);
if ($dbmsg eq 'Records deleted') {
- return (0, $dbmsg)
- if $dberr == 0;
+ return (0, $dbmsg) if $dberr == 0;
my %runlog;
return ($dberr, $dbmsg);
} # TrimLoadavg
+sub TrimStorage($$$) {
+ my ($self, $type, $tag, $region) = @_;
+
+ my $today = Today2SQLDatetime;
+
+ my $oldage = SubtractDays $today, $Clearadm::CLEAROPTS{CLEARADM_SCRUBDAYS};
+
+ my $table = $type =~ /vob/i
+ ? 'vobstorage'
+ : 'viewstorage';
+
+ my ($dberr, $dbmsg) = $self->_deleteRecord(
+ $table,
+ "tag='$tag' and region='$region' and timestamp<='$oldage'"
+ );
+
+ if ($dbmsg eq 'Records deleted') {
+ return (0, $dbmsg) if $dberr == 0;
+
+ my %runlog;
+
+ $runlog{task} = 'Scrub';
+ $runlog{started} = $today;
+ $runlog{status} = 0;
+ $runlog{message} =
+ "Scrubbed $dberr ${type}storage records";
+
+ my ($err, $msg) = $self->AddRunlog(%runlog);
+
+ $self->Error("Unable to add runload (Error: $err)\n$msg") if $err;
+ } # if
+
+ return ($dberr, $dbmsg);
+} # TrimStorage
+
+sub ValidateCCObjects() {
+ my ($self) = @_;
+
+ my $vobRecordsDeleted = 0;
+ my $viewRecordsDeleted = 0;
+
+ for my $region ($Clearcase::CC->regions) {
+ for my $type (qw(vob view)) {
+ my @ccobjs;
+ verbose "Processing ${type}s in $region";
+
+ if ($type eq 'vob') {
+ verbose "Finding all vobs in region $region";
+ @ccobjs = $self->FindVob(undef, $region);
+ verbose 'Found ' . scalar @ccobjs . ' vobs to process';
+ } elsif ($type eq 'view') {
+ verbose "Finding all views in region $region";
+ @ccobjs = $self->FindView(undef, $region);
+ verbose 'Found ' . scalar @ccobjs . ' views to process';
+ } # if
+
+ for my $object (@ccobjs) {
+ my %ccobjrec = %$object;
+
+ verbose "Processing $ccobjrec{tag}:$ccobjrec{region}";
+
+ my $ccobj;
+
+ if ($type eq 'vob') {
+ $ccobj = Clearcase::Vob->new($ccobjrec{tag}, $ccobjrec{region});
+ } else {
+ $ccobj = Clearcase::View->new($ccobjrec{tag}, $ccobjrec{region});
+ } # if
+
+ verbose_nolf 'Checking if ' . $ccobj->{tag} . ':' . $ccobj->{region} . ' exists anymore...';
+
+ if ($ccobj->exists) {
+ verbose ' it does! Skipping...';
+ next;
+ } else {
+ verbose ' it doesn\'t!';
+ } # if
+
+ #next if $ccobj->exists;
+
+ verbose "Deleting $type $ccobjrec{tag}:$ccobjrec{region}";
+
+ my ($recordsDeleted, $msg) = $self->_deleteRecord($type,
+ "tag='$ccobjrec{tag}' and region='$ccobjrec{region}'");
+
+ if ($msg ne 'Records deleted') {
+ return ($recordsDeleted, $msg);
+ } else {
+ $viewRecordsDeleted += $recordsDeleted if $type eq 'view';
+ $vobRecordsDeleted += $recordsDeleted if $type eq 'vob';
+ } # if
+ } # for
+ } # for
+ } # for
+
+ return ($viewRecordsDeleted, $vobRecordsDeleted);
+} # ValidateCCObjects
+
sub GetFS($$;$$$$) {
my ($self, $system, $filesystem, $start, $end, $count, $interval) = @_;
$system = $self->_aliasSystem($system);
- return
- unless $system;
-
- return
- unless $filesystem;
+ return unless $system;
+ return unless $filesystem;
$interval ||= 'Minute';
$system = $self->_aliasSystem($system);
- return
- unless $system;
-
- return
- unless $filesystem;
+ return unless $system;
+ return unless $filesystem;
my @records = $self->_getRecords(
'fs',
);
if ($records[0]) {
- return %{$records[0]};
+ return %{$records[0]};
} else {
- return;
+ return;
} # if
} # GetLatestFS
my $result = _checkRequiredFields \@requiredFields, \%loadavg;
- return -1, "AddLoadavg: $result"
- if $result;
+ return -1, "AddLoadavg: $result" if $result;
# Timestamp record
$loadavg{timestamp} = Today2SQLDatetime;
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
$interval ||= 'Minute';
my $offset = $nbrRecs - $count;
# Offsets of < 0 are not allowed.
- $offset = 0
- if $offset < 0;
+ $offset = 0 if $offset < 0;
$condition .= " limit $offset, $count";
} # if
$system = $self->_aliasSystem($system);
- return
- unless $system;
+ return unless $system;
my @records = $self->_getRecords(
'loadavg',
} # if
} # GetLatestLoadavg
-sub GetStorage($$$;$$$$$) {
+sub GetStoragePool($$$;$$$$$) {
my ($self, $type, $tag, $storage, $region, $start, $end, $count, $interval) = @_;
$interval ||= 'Day';
} # while
return @records;
-} # GetStorage
+} # GetStoragePool
sub AddTask(%) {
my ($self, %task) = @_;
my $result = _checkRequiredFields \@requiredFields, \%task;
- return -1, "AddTask: $result"
- if $result;
+ return -1, "AddTask: $result" if $result;
return $self->_addRecord('task', %task);
} # AddTask
sub GetTask($) {
my ($self, $name) = @_;
- return
- unless $name;
+ return unless $name;
my @records = $self->_getRecords('task', "name='$name'");
my $result = _checkRequiredFields \@requiredFields, \%schedule;
- return -1, "AddSchedule: $result"
- if $result;
+ return -1, "AddSchedule: $result" if $result;
return $self->_addRecord('schedule', %schedule);
} # AddSchedule
my ($self, $name, $task) = @_;
$name ||= '';
- $task||= '';
+ $task ||= '';
my $condition = "name like '%$name%'";
$condition .= ' and ';
my $result = _checkRequiredFields \@requiredFields, \%runlog;
- return -1, "AddRunlog: $result"
- if $result;
+ return -1, "AddRunlog: $result" if $result;
$runlog{ended} = Today2SQLDatetime;
sub GetRunlog($) {
my ($self, $id) = @_;
- return
- unless $id;
+ return unless $id;
my @records = $self->_getRecords('runlog', "id=$id");
my $result = _checkRequiredFields \@requiredFields, \%alert;
- return -1, "AddAlert: $result"
- if $result;
+ return -1, "AddAlert: $result" if $result;
return $self->_addRecord('alert', %alert);
} # AddAlert
# If you want to fake an alert in the debugger just change $diff accordingly
my $diff = Compare($today, $lastnotified);
- return
- if $diff <= 0;
+ return if $diff <= 0;
} # if
my $when = Today2SQLDatetime;
my %system = $self->GetSystem($system);
- return
- unless $system;
+ return unless $system;
if ($system{notification} and
$system{notification} eq 'Filesystem' and
# If we've never heard from this system then we will assume that the system
# has not been set up to run clearagent and has never checked in. In any event
# we cannot say the system died because we've never known it to be alive!
- return 1
- unless $system{lastheardfrom};
+ return 1 unless $system{lastheardfrom};
# If a system is not active (may have been temporarily been deactivated) then
# we don't want to turn on the bells and whistles alerting people it's down.
- return 1
- if $system{active} eq 'false';
+ return 1 if $system{active} eq 'false';
my $today = Today2SQLDatetime;
my $lastheardfrom = $system{lastheardfrom};
my $result = _checkRequiredFields \@requiredFields, \%alertlog;
- return -1, "AddAlertlog: $result"
- if $result;
+ return -1, "AddAlertlog: $result" if $result;
# Timestamp record
$alertlog{timestamp} = Today2SQLDatetime;
$condition .= "notification like '%$notification%'";
$condition .= " order by timestamp desc";
- if (defined $start) {
- $page ||= 10;
- $condition .= " limit $start, $page";
- } # unless
+ if (defined $start) {
+ $page ||= 10;
+ $condition .= " limit $start, $page";
+ } # unless
return $self->_getRecords('alertlog', $condition);
} # FindAlertLog
sub GetAlertlog($) {
my ($self, $alert) = @_;
- return
- unless $alert;
+ return unless $alert;
my @records = $self->_getRecords('alertlog', "alert='$alert'");
my $result = _checkRequiredFields \@requiredFields, \%notification;
- return -1, "AddNotification: $result"
- if $result;
+ return -1, "AddNotification: $result" if $result;
return $self->_addRecord('notification', %notification);
} # AddNotification
sub GetNotification($) {
my ($self, $name) = @_;
- return
- unless $name;
+ return unless $name;
my @records = $self->_getRecords('notification', "name='$name'");