[PATCH] testbot/Janitor: Add --dry-run and --log-only options.

Francois Gouget fgouget at codeweavers.com
Wed Mar 21 20:03:02 CDT 2018


Janitor.pl now prints informational messages to stdout by default. This
helps with debugging. The old behavior can be restored by using the
--log-only option, like with the other TestBot tools.
One can now also invoke it with the --dry-run option to see what it
would do.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---

You can add --log-only to the relevant crontab line if this causes any 
inconvenience.

 testbot/bin/Janitor.pl  | 141 ++++++++++++++++++++++++++++++++++--------------
 testbot/doc/INSTALL.txt |   2 +-
 2 files changed, 101 insertions(+), 42 deletions(-)

diff --git a/testbot/bin/Janitor.pl b/testbot/bin/Janitor.pl
index 41f88d9e7..56e024a67 100755
--- a/testbot/bin/Janitor.pl
+++ b/testbot/bin/Janitor.pl
@@ -37,6 +37,8 @@ sub BEGIN
     unshift @INC, "$::RootDir/lib";
   }
 }
+my $Name0 = $0;
+$Name0 =~ s+^.*/++;
 
 use File::Path;
 
@@ -50,10 +52,61 @@ use WineTestBot::RecordGroups;
 use WineTestBot::Users;
 use WineTestBot::VMs;
 
+my $LogOnly;
+sub Trace(@)
+{
+  print @_ if (!$LogOnly);
+  LogMsg @_;
+}
+
+sub Error(@)
+{
+  print STDERR "$Name0:error: ", @_ if (!$LogOnly);
+  LogMsg @_;
+}
+
+
 
 $ENV{PATH} = "/usr/bin:/bin";
 delete $ENV{ENV};
 
+# Grab the command line options
+my ($Usage, $DryRun);
+while (@ARGV)
+{
+  my $Arg = shift @ARGV;
+  if ($Arg eq "--dry-run")
+  {
+    $DryRun = 1;
+  }
+  elsif ($Arg eq "--log-only")
+  {
+    $LogOnly = 1;
+  }
+  elsif ($Arg =~ /^(?:-\?|-h|--help)$/)
+  {
+    $Usage = 0;
+    last;
+  }
+  else
+  {
+    Error "unexpected argument '$Arg'\n";
+    $Usage = 2;
+    last;
+  }
+}
+# Check parameters
+if (defined $Usage)
+{
+  print "Usage: $Name0 [--dry-run] [--log-only] [--help]\n";
+  exit $Usage;
+}
+
+
+#
+# Main
+#
+
 # Delete obsolete Jobs
 if ($JobPurgeDays != 0)
 {
@@ -61,13 +114,12 @@ if ($JobPurgeDays != 0)
   $Jobs->AddFilter("Submitted", [time() - $JobPurgeDays * 86400], "<");
   foreach my $Job (@{$Jobs->GetItems()})
   {
-    LogMsg "Deleting job ", $Job->Id, "\n";
+    Trace "Deleting job ", $Job->Id, "\n";
+    next if ($DryRun);
+
     $Job->RmTree();
     my $ErrMessage = $Jobs->DeleteItem($Job);
-    if (defined($ErrMessage))
-    {
-      LogMsg $ErrMessage, "\n";
-    }
+    Error "$ErrMessage\n" if (defined $ErrMessage);
   }
 }
 
@@ -89,7 +141,9 @@ foreach my $Set (@{$Sets->GetItems()})
   if (! defined($MostRecentPatch) ||
       $MostRecentPatch->Received < $DeleteBefore)
   {
-    LogMsg "Deleting pending series for ", $Set->EMail, "\n";
+    Error "Deleting pending series for ", $Set->EMail, "\n";
+    next if ($DryRun);
+
     $Sets->DeleteItem($Set);
     $MostRecentPatch->Disposition("Incomplete series, discarded");
     $MostRecentPatch->Save();
@@ -107,13 +161,12 @@ if ($JobPurgeDays != 0)
     $Jobs->AddFilter("Patch", [$Patch]);
     if ($Jobs->IsEmpty())
     {
-      LogMsg "Deleting patch ", $Patch->Id, "\n";
+      Trace "Deleting patch ", $Patch->Id, "\n";
+      next if ($DryRun);
+
       unlink("$DataDir/patches/" . $Patch->Id);
       my $ErrMessage = $Patches->DeleteItem($Patch);
-      if (defined($ErrMessage))
-      {
-        LogMsg $ErrMessage, "\n";
-      }
+      Error "$ErrMessage\n" if (defined $ErrMessage);
     }
   }
 }
@@ -128,7 +181,9 @@ if ($JobArchiveDays != 0)
   {
     if (defined($Job->Ended) && $Job->Ended < $ArchiveBefore)
     {
-      LogMsg "Archiving job ", $Job->Id, "\n";
+      Trace "Archiving job ", $Job->Id, "\n";
+      next if ($DryRun);
+
       foreach my $Step (@{$Job->Steps->GetItems()})
       {
         unlink $Step->GetDir() . "/" . $Step->FileName;
@@ -157,7 +212,7 @@ if (%DeletedUsers or %DeletedVMs)
   {
     if (exists $DeletedUsers{$Job->User->Name})
     {
-      LogMsg "Keeping the ", $Job->User->Name, " account for job ", $Job->Id, "\n";
+      Trace "Keeping the ", $Job->User->Name, " account for job ", $Job->Id, "\n";
       delete $DeletedUsers{$Job->User->Name};
     }
 
@@ -169,7 +224,7 @@ if (%DeletedUsers or %DeletedVMs)
         {
           if (exists $DeletedVMs{$Task->VM->Name})
           {
-            LogMsg "Keeping the ", $Task->VM->Name, " VM for task ", join("/", @{$Task->GetMasterKey()}), "\n";
+            Trace "Keeping the ", $Task->VM->Name, " VM for task ", join("/", @{$Task->GetMasterKey()}), "\n";
             delete $DeletedVMs{$Task->VM->Name};
           }
         }
@@ -182,15 +237,14 @@ if (%DeletedUsers or %DeletedVMs)
     foreach my $UserName (keys %DeletedUsers)
     {
       my $User = $Users->GetItem($UserName);
+      Trace "Deleting the $UserName account\n";
+      next if ($DryRun);
+
       DeleteSessions($User);
       my $ErrMessage = $Users->DeleteItem($User);
       if (defined $ErrMessage)
       {
-        LogMsg "Unable to delete the $UserName account: $ErrMessage\n";
-      }
-      else
-      {
-        LogMsg "Deleted the $UserName account\n";
+        Error "Unable to delete the $UserName account: $ErrMessage\n";
       }
     }
   }
@@ -198,14 +252,13 @@ if (%DeletedUsers or %DeletedVMs)
   foreach my $VMKey (keys %DeletedVMs)
   {
     my $VM = $VMs->GetItem($VMKey);
+    Trace "Deleting the $VMKey VM\n";
+    next if ($DryRun);
+
     my $ErrMessage = $VMs->DeleteItem($VM);
     if (defined $ErrMessage)
     {
-      LogMsg "Unable to delete the $VMKey VM: $ErrMessage\n";
-    }
-    else
-    {
-      LogMsg "Deleted the $VMKey VM\n";
+      Error "Unable to delete the $VMKey VM: $ErrMessage\n";
     }
   }
 }
@@ -223,41 +276,43 @@ if (opendir(my $dh, "$DataDir/staging"))
     my $FileName = "$DataDir/staging/$1";
     my $Age = int((-M $FileName) + 0.5);
 
-    if ($Entry =~ /^[0-9a-f]{32}-websubmit_/)
-    {
-      if ($Age >= 1 and !unlink $FileName)
-      {
-        # The user abandoned the submit procedure half-way through
-        LogMsg "Could not delete '$FileName': $!\n" if (!unlink($FileName));
-      }
-    }
-    else
+    if ($Entry !~ /^[0-9a-f]{32}-websubmit_/)
     {
       if ($Entry !~ /^[0-9a-f]{32}_(?:patch|patch\.diff|wine-patches|winetest(?:64)?-latest\.exe|work)$/)
       {
-        LogMsg "Found a suspicious staging file: $Entry\n";
+        Trace "Found a suspicious staging file: $Entry\n";
       }
 
       if ($JobPurgeDays != 0)
       {
         if ($Age >= $JobPurgeDays + 7)
         {
-          if (!rmtree($FileName))
+          Trace "Deleting '$FileName'\n";
+          if (!$DryRun and !rmtree($FileName))
           {
-            LogMsg "Could not delete '$FileName': $!\n";
+            Error "Could not delete '$FileName': $!\n";
           }
         }
         elsif ($Age > $JobPurgeDays)
         {
-          LogMsg "'$FileName' is $Age days old and should have been deleted already. It will be deleted in ", $JobPurgeDays + 7 - $Age, " day(s).\n";
+          Error "'$FileName' is $Age days old and should have been deleted already. It will be deleted in ", $JobPurgeDays + 7 - $Age, " day(s).\n";
         }
       }
     }
+    elsif ($Age >= 1)
+    {
+      Trace "Deleting '$FileName'\n";
+      if (!$DryRun and !unlink $FileName)
+      {
+        # The user abandoned the submit procedure half-way through
+        Error "Could not delete '$FileName': $!\n";
+      }
+    }
   }
 }
 else
 {
-  LogMsg "Unable to open '$DataDir/staging': $!";
+  Error "Unable to open '$DataDir/staging': $!";
 }
 
 # Delete obsolete record groups
@@ -267,10 +322,14 @@ if ($JobPurgeDays != 0)
   $RecordGroups->AddFilter("Timestamp", [time() - $JobPurgeDays * 86400], "<");
   foreach my $RecordGroup (@{$RecordGroups->GetItems()})
   {
-    my $ErrMessage = $RecordGroups->DeleteItem($RecordGroup);
-    if (defined($ErrMessage))
+    if ($DryRun)
+    {
+      Trace "Deleting RecordGroup ", $RecordGroup->Id, "\n";
+    }
+    else
     {
-      LogMsg $ErrMessage, "\n";
+      my $ErrMessage = $RecordGroups->DeleteItem($RecordGroup);
+      Error "$ErrMessage\n" if (defined $ErrMessage);
     }
   }
 }
diff --git a/testbot/doc/INSTALL.txt b/testbot/doc/INSTALL.txt
index 15b2b91b9..8827c227d 100644
--- a/testbot/doc/INSTALL.txt
+++ b/testbot/doc/INSTALL.txt
@@ -67,7 +67,7 @@ General setup for the web site:
 Janitorial tasks:
 - Run the Janitor.pl script once per day to perform the janitorial
   tasks. For instance:
-    0 0 * * * $HOME/tools/testbot/bin/Janitor.pl
+    0 0 * * * $HOME/tools/testbot/bin/Janitor.pl --log-only
 - Run the CheckWineTestBot.pl script periodically to get notified in
   case the WineTestBot server dies. For instance:
     */20 * * * * $HOME/tools/testbot/scripts/CheckWineTestBot.pl
-- 
2.16.2



More information about the wine-devel mailing list