Hi Thomas,

your approach to the systemsanity check is fine and as this is one of the
prereqs I suggest you incorporate the call to system-sanity into
install_prereqs. As you certainly know, install_prereq can invoke shell
scripts. Besides it has already the possibility to do different things with
different distributions, so you won't need to code that into the sanity check
scripts.

install_prereq currently won't check for the return code of the shell scripts
(or arbitrary programs) it calls, but for the sanity check it might make
sense to add this.

I want to concentrate the prereqs handling into install_prereqs and get rid of
the spaghetti code inside wizard_prep, at least for the prereqs part. I hope
you can support me in this struggle.

Another comment: you mentioned as a TODO on your checkin message:

>
> * TODO: Get the OCA based sanity framework going for oscar specific items.
>

I'm not sure whether you followed the previous discussions on this. A short
overview of arguments:

- I see no reason why the "OSCAR specific sanity framework" should be in
  OCA. It simply doesn't fit the purpose of OCA.
- install_prereqs is currently dealing with most of what a future "sanity
  framework" would need to do. It deletes previously installed packages which
  we don't want on the system and installs packages which we need as
  prereqs. Besides, it is much simpler to configure for various
  distros/architectures.
- The extension proposed in
  https://svn.oscar.openclustergroup.org/trac/oscar/ticket/209
  would make install_prereqs fulfill completely the requirements for OSCAR
  packages related sanity checking.
- The code in the current OCA/Sanity_Check/* does simply not deserve the
  attribute "framework". A _framework_ has to be general and extensible. Here
  is an example:

sub check_prereqs
{
  my $pqtv = `rpm -q --qf '%{VERSION}' perl-Qt | sed -ne 
\"s/^\\([1-9]*\\)..*/\\1/p\"`;
  oca_debug_subsection ("perl-qt version: $pqtv\n");
  if ( $pqtv && $pqtv >= 3 ) {
    return 1;
  }
  if ( $pqtv && $pqtv < 3 ) {
    oca_debug_subsection("Removing installed perl-Qt RPM because version is < 
3");
    if ( !system("rpm -e perl-Qt") ) {
      return -1;
    }
  }

  return -1;
}


This is simply a hardcoded piece of code which is both hard to extend and
hard to maintain. Imagine adding some if branches for particular
distros... And some more packages you need to care about...

Concluding: install_prereqs is doing the job right now and can be used as
sanity checking infrastructure. It requires two small extensions:
 - checking of shell script return codes (in order to react properly to the
 system sanity checks)
 - version dependent package installation/deletion.
It is extensible, easy to (re)configure _without_ programming, thus requires
only one test for functionality, not a test after each extension.

I will extend install_prereqs anyway, so if you agree with the approach I
think you can save some work. Of course, if changes in the design of
install_prereqs are needed, I'm open for that.

Best regards,
Erich



On Wednesday 19 July 2006 00:46, [EMAIL PROTECTED] wrote:
> Author: naughtont
> Date: 2006-07-18 18:46:20 -0400 (Tue, 18 Jul 2006)
> New Revision: 5181
> 
> Added:
>    trunk/lib/OSCAR/SystemSanity.pm
>    trunk/scripts/system-sanity
>    trunk/scripts/system-sanity.d/
>    trunk/scripts/system-sanity.d/su-check.pl
> Log:
> + add a very basic system sanity tool as discussed by Geoffroy Vallee 
>   and I today.  Note, this is for basic system related things and not
>   really OSCAR specific things. 
> 
>   Descr: "System Sanity", check various system related known issues
>          that preceeds the OSCAR specific checks, i.e., must be root,
>          must have SELinux disabled, etc.
>                          
>   Semantics: The tool reads a directory of check scripts, which either
>              succeed, fail, or warn -- printing this status info and a 
>              provided message.  (see also: OSCAR::SystemCheck for details),  
>  
> + The OSCAR::SystemCheck is simply to provide constants to be used
>   for consistency in all the checks.
> 
> + See the initial example: su-check.pl
> 
> * ASSUMPTION: that OSCAR_HOME has been defined!!!!
> 
> * TODO: the hook to call this will need to go somewhere very early, 
>         like install_cluster.
> 
> * TODO: Get the OCA based sanity framework going for oscar specific items.
> 
> 
> 
> Added: trunk/lib/OSCAR/SystemSanity.pm
> ===================================================================
> --- trunk/lib/OSCAR/SystemSanity.pm   2006-07-18 19:39:06 UTC (rev 5180)
> +++ trunk/lib/OSCAR/SystemSanity.pm   2006-07-18 22:46:20 UTC (rev 5181)
> @@ -0,0 +1,28 @@
> +package OSCAR::SystemSanity;
> +# $Id$
> +#
> +# Copyright (c) 2006 Oak Ridge National Laboratory.
> +#                    All rights reserved.
> +#
> +# Semantics: The tool reads a directory of check scripts, which either
> +#            success (0), failure (255), or warning (1..254), printing 
> +#            such info and having the respective return codes.
> +#
> +#            NOTE: Due to a single unsigned byte used in process tables on
> +#             many system, we are limited to process/shell return codes 
> +#             of 0..255.
> +#
> +#  See also: $OSCAR_HOME/scripts/{system-sanity, system-sanity.d/}
> +#
> +
> +use constant { SUCCESS => 0,    
> +               WARNING => 1,    # can be 1..254
> +               FAILURE => 255,
> +              };
> +
> +# NOTE: required so the @EXPORT (default exported to all) works ok
> [EMAIL PROTECTED] = qw(Exporter);
> +
> [EMAIL PROTECTED] = qw(SUCCESS WARNING FAILURE);
> +
> +1;
> 
> Added: trunk/scripts/system-sanity
> ===================================================================
> --- trunk/scripts/system-sanity       2006-07-18 19:39:06 UTC (rev 5180)
> +++ trunk/scripts/system-sanity       2006-07-18 22:46:20 UTC (rev 5181)
> @@ -0,0 +1,104 @@
> +#!/usr/bin/perl -w
> +# $Id$
> +#
> +# Copyright (c) 2006 Oak Ridge National Laboratory.
> +#                    All rights reserved.
> +#
> +#
> +# Descr: "System Sanity", check various system related known issues
> +#        that preceeds the OSCAR specific checks, i.e., must be root,
> +#        must have SELinux disabled, etc.
> +#                        
> +# Semantics: The tool reads a directory of check scripts, which either
> +#            succeed, fail, or warn printing this status info and a 
> +#            provided message.  (see also: OSCAR::SystemCheck for details),  
> +#
> +
> +use lib "$ENV{OSCAR_HOME}/lib";
> +use OSCAR::SystemSanity;  # Enumeration for constants
> +use Carp;
> +
> +my $system_check_dir = $ENV{OSCAR_HOME} . "/scripts/system-sanity.d";
> +
> +if (! -d $system_check_dir ) {
> +     croak "Error: Missing system-check.d/ directory - 
> \'$system_check_dir\'"; 
> +}
> +
> +my @files = get_check_files( $system_check_dir );
> +
> +foreach my $file (@files) {
> +     my $script = $system_check_dir . "/" . $file;
> +
> +     if (! -x $script) {
> +             print_rslt(FAILURE, "not executable \'$file\'"); 
> +
> +     } else {
> +             my $rc = system($script);
> +             $rc = $rc >> 8;  # Shift to get actual return code
> +             print_rslt($rc, $file);
> +     }
> +
> +}
> +
> +exit(0);
> +
> +
> +##########################################################################
> +# Sub-rtns
> +
> +
> +
> +#  Descr: uniform display of status info & msg from system-sanity check(s).
> +# Return: success (1) / error (undef)
> +sub print_rslt
> +{
> +     my $rc  = shift;
> +     my $msg = shift;
> +
> +     if ( !defined($rc) ) {
> +             print "Error: undefined rc value passed to " . (caller(0))[3] 
> ."\n";
> +             return(undef);
> +     }
> +
> +     if ($rc == FAILURE) {
> +             print "Failure: $msg\n";
> +
> +     } elsif ($rc == SUCCESS) {
> +             print "Success: $msg\n";
> +
> +     } elsif ($rc >= WARNING && $rc < FAILURE) {  
> +              # XXX: Keep at end b/c warnings are 1..254 
> +             print "Warning: $msg\n";
> +     
> +     } else {
> +             # Crazy catch all case?
> +             print "Crazy case -- should never see this...!\n - $msg\n";
> +     }
> +
> +     return(1);
> +}
> +
> +
> +#  Descr: read all system-sanity check file(s) from provided directory
> +# Return: list of system-sanity check filenames 
> +#
> +#   NOTE: Not fully qualify path in returned file list so caller can 
> +#         easily get at check filenames. 
> +#
> +sub get_check_files 
> +{
> +     my $dir = shift;
> +
> +     opendir(DIR, "$dir") or die "Error: $! - \'$dir\'";
> +
> +      # RegEx: ignore all files starting with a dot, 
> +      #        e.g., ".", "..", ".foobar"
> +     my @files = grep { !/^\./ } readdir(DIR);
> +
> +     closedir(DIR);
> +
> +     return(@files);
> +}
> +
> +
> +# vim:tabstop=4:shiftwidth=4:syntax=perl:textwidth=76
> 
> 
> Property changes on: trunk/scripts/system-sanity
> ___________________________________________________________________
> Name: svn:executable
>    + *
> 
> Added: trunk/scripts/system-sanity.d/su-check.pl
> ===================================================================
> --- trunk/scripts/system-sanity.d/su-check.pl 2006-07-18 19:39:06 UTC (rev 
> 5180)
> +++ trunk/scripts/system-sanity.d/su-check.pl 2006-07-18 22:46:20 UTC (rev 
> 5181)
> @@ -0,0 +1,29 @@
> +#!/usr/bin/perl
> +# $Id$
> +#
> +# Copyright (c) 2006 Oak Ridge National Laboratory.
> +#                    All rights reserved.
> +
> +use warnings;
> +use English '-no_match_vars';
> +use lib "$ENV{OSCAR_HOME}/lib";
> +
> +# NOTE: Use the predefined constants for consistency!
> +use OSCAR::SystemSanity;
> +
> +my $rc = FAILURE;
> +
> +if ( ($UID == 0) and ($ENV{USER} eq "root") ) {
> +     $rc = SUCCESS;
> +
> +} else {
> +     print " ----------------------------------------------\n";
> +     print "  $0 \n";
> +     print "   UID=(" . $UID       . ") \t should be \'0\'\n";
> +     print "  USER=(" . $ENV{USER} . ") \t should be \'root\'\n";
> +     print " ----------------------------------------------\n";
> +
> +     $rc = FAILURE;  
> +}
> +
> +exit($rc);


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Oscar-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/oscar-devel

Reply via email to