windows-nt/Source/XPSP1/NT/base/ntsetup/bom/bbcommon.pl
2020-09-26 16:20:57 +08:00

212 lines
6 KiB
Perl

$script_db = "C:\\nt\\private\\windows\\setup\\bom\\scripts.dat";
@script_fields = ( "time", "script", "lang", "machine", "status", "eta", "build", "error", "state" );
sub LOCK_SH { 1 }
sub LOCK_EX { 2 }
sub LOCK_NB { 4 }
sub LOCK_UN { 8 }
sub script_status_update {
my ( $state, $status, $time, $script, $script_id, $lang, $build, $date, $products, $machine, $new ) = 0;
$state = shift @_;
$time = shift @_;
$machine = shift @_;
$status = shift @_;
@args = split ' ', $_[0];
$script = shift @args;
$script =~ s/(\w+)\.bat/$1/i;
foreach $arg ( @args ) {
SWITCH: {
if ( $sup_lang{uc $arg} ) { $lang = uc $arg; last SWITCH; }
if ( is_build($arg) ) { $build = uc $arg; last SWITCH; }
if ( is_date($arg) ) { $date = $arg; last SWITCH; }
if ( $sup_prod{uc $arg} ) { $products{uc $arg} = 1; last SWITCH; }
}
}
$lang = USA unless $lang;
### Load the DB.
&read_script_dat();
if ( $Scripts{time}{$time} ) {
$script_id = $time;
} else {
if ( $Scripts{script}{$script} ) {
foreach $key ( keys %{ $Scripts{script}{$script} } ) {
$new = 0;
foreach $sub_key ( "script", "lang", "build", "machine" ) {
unless ( eval "\$Scripts{script}{\$script}{\$key}{\$sub_key} =~ /\$$sub_key/i" ) {
$new = 1;
next;
}
}
$script_id = $key;
last unless $new;
}
} else {
$new = 1;
}
}
if ( $script_id and $state =~ /START/i ) {
my $new_id = $time;
foreach $sort_method ( @script_fields ) {
eval "\$Scripts{time}{\$new_id}{\$new_id}{\$sort_method} = $Scripts{time}{\$script_id}{\$script_id}{\$sort_method}";
}
delete $Scripts{time}{$script_id};
$script_id = $new_id;
}
### Make new script ID;
$script_id = $time if $new;
foreach $sort_method ( @script_fields ) {
eval "\$Scripts{time}{\$script_id}{\$script_id}{\$sort_method} = \$$sort_method";
}
$Scripts{time}{$script_id}{$script_id}{error} = "NO" unless $Scripts{time}{$script_id}{$script_id}{error} or $Scripts{time}{$script_id}{$script_id}{error} =~ /YES/i;
write_script_dat();
}
sub clear_script_hash {
foreach $sort_method ( @script_fields ) {
delete $Scripts{$sort_method};
}
}
sub read_script_dat {
### Clear out the Scripts hash.
clear_script_hash;
open (DB, $script_db) || die "Can't read $script_db: $!\n";
unless ( flock ( DB, LOCK_EX | LOCK_NB ) ) {
print "$$: Can't read during write update! Waiting for read lock ($!) ....";
unless ( flock ( DB, LOCK_EX)) { print "ERROR: flock: $!" }
}
while (<DB>) {
chomp;
my ($time, $script, $lang, $machine, $status, $last_err, $eta, $build, $state) = split(/\|/);
### Strip .bat from $script
$script =~ s/(\w+)\.bat/$1/i;
foreach $sort_method ( @script_fields ) {
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{script} = \$script";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{lang} = \$lang";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{machine} = \$machine";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{status} = \$status";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{error} = \$last_err";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{eta} = \$eta";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{time} = \$time";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{build} = \$build";
eval "\$Scripts{\$sort_method}{\$$sort_method}{$time}{state} = \$state";
}
}
flock ( DB, LOCK_UN );
close (DB);
}
sub write_script_dat {
my $Script_Save;
### Make sure we can get an exclusive lock
open (DB, "$script_db") || die "Can't read $script_db: $!\n";
unless ( flock (DB, LOCK_EX | LOCK_NB ) ) {
print "$$: Must have exclusive lock! - $!\n";
unless ( flock ( DB, LOCK_EX ) ) {die "flock: $!\n" }
}
close DB;
### Open DB.
open (DB, ">$script_db") || die "Can't read $script_db: $!\n";
### Lock the DB.
for ( $x = 0; $x <= 10; $x++ ) {
my $success = 0;
if ( flock (DB, LOCK_EX | LOCK_NB ) ) {
$success = 1;
} else {
print "\n$$: Must have exclusive lock! - $!\n";
}
last if $success;
}
# unless ( flock (DB, LOCK_EX | LOCK_NB ) ) {
# $bogus = 1;
# print "$$: Must have exclusive lock! - $!\n";
# unless ( flock ( DB, LOCK_EX ) ) {print "ERROR: flock: $!\n" }
# }
# }
### Create the new DB file.
foreach $key ( sort bykey keys %{ $Scripts{time} } ) {
$Script_Save .= "$key|$Scripts{time}{$key}{$key}{script}|$Scripts{time}{$key}{$key}{lang}|$Scripts{time}{$key}{$key}{machine}|$Scripts{time}{$key}{$key}{status}|$Scripts{time}{$key}{$key}{error}|$Scripts{time}{$key}{$key}{eta}|$Scripts{time}{$key}{$key}{build}|$Scripts{time}{$key}{$key}{state}\n" if $Scripts{time}{$key}{$key}{script};
}
### Write out the DB.
print DB $Script_Save;
close DB;
flush;
}
sub time {
my ($tm, $short) = @_;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
= localtime($tm);
my $ampm;
if ( $hour >= 12 ) {
$ampm = "p";
$hour = $hour - 12;
} else {
$ampm = "a";
}
if ( $short =~ /short/i ) {
return ( sprintf( "%d:%0.2d%s", $hour, $min, $ampm ) );
} else {
return ( sprintf( "[%d/%0.2d] %d:%0.2d%s", $mon, $wday, $hour, $min, $ampm ) );
}
}
sub bykey {
lc($a) cmp lc($b);
}
sub bykey_rev {
lc($b) cmp lc($a);
}
sub bynum {
$a <=> $b;
}
sub bynum_rev {
$b <=> $a;
}
1;