$SIG{ 'TERM' } = \&sig_handler;
-sub log_biopiece
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SUBROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+
+sub status_set
{
- # Martin A. Hansen, January 2008.
+ my ( $time_stamp, $script, $user, $pid, $file, $fh );
- # Log messages to logfile.
+ $time_stamp = Maasha::Common::time_stamp();
+ $user = Maasha::Common::get_user();
+ $script = Maasha::Common::get_scriptname();
+ $pid = Maasha::Common::get_processid();
+
+ $file = bp_tmp() . "/" . join( ".", $user, $script, $pid ) . ".status";
+ $fh = Maasha::Filesys::file_write_open( $file );
+ flock($fh, 2);
+
+ print $fh join( ";", $time_stamp, join( " ", @ARGV ) ) . "\n";
+
+ close $fh;
+}
+
+
+sub status_log
+{
+ # Martin A. Hansen, June 2009.
+
+ # Retrieves initial status information written with status_set and uses this
+ # to write a status entry to the log file.
+
+ my ( $status, # status - OPTIONAL
+ ) = @_;
# Returns nothing.
- my ( $time_stamp, $user, $script, $fh_global, $fh_local );
+ my ( $time0, $time1, $script, $user, $pid, $file, $fh, $elap, $fh_global, $fh_local, $line, $args, $tmp_dir );
- $time_stamp = Maasha::Common::time_stamp();
+ $status ||= "OK";
+
+ $time1 = Maasha::Common::time_stamp();
$user = Maasha::Common::get_user();
$script = Maasha::Common::get_scriptname();
+ $pid = Maasha::Common::get_processid();
+
+ $file = bp_tmp() . "/" . join( ".", $user, $script, $pid ) . ".status";
+
+ return if not -f $file;
+
+ $fh = Maasha::Filesys::file_read_open( $file );
+ flock($fh, 1);
+ $line = <$fh>;
+ chomp $line;
+ close $fh;
+
+ unlink $file;
+
+ ( $time0, $args, $tmp_dir ) = split /;/, $line;
+
+ Maasha::Filesys::dir_remove( $tmp_dir ) if defined $tmp_dir;
+
+ $elap = Maasha::Common::time_stamp_diff( $time0, $time1 );
- $fh_global = Maasha::Filesys::file_append_open( "$ENV{ 'BP_LOG' }/biopieces.log" );
- $fh_local = Maasha::Filesys::file_append_open( "$ENV{ 'HOME' }/.biopieces.log" );
+ $fh_global = Maasha::Filesys::file_append_open( "$ENV{ 'BP_LOG' }/biopieces.log" );
+ flock($fh_global, 2);
+ $fh_local = Maasha::Filesys::file_append_open( "$ENV{ 'HOME' }/.biopieces.log" );
+ flock($fh_local, 2);
- print $fh_global "$time_stamp\t$user\t$script ", join( " ", @ARGV ), "\n";
- print $fh_local "$time_stamp\t$user\t$script ", join( " ", @ARGV ), "\n";
+ print $fh_global join( "\t", $time0, $time1, $elap, $user, $status, "$script $args" ) . "\n";
+ print $fh_local join( "\t", $time0, $time1, $elap, $user, $status, "$script $args" ) . "\n";
$fh_global->autoflush( 1 );
$fh_local->autoflush( 1 );
}
+sub log_biopiece
+{
+ # Martin A. Hansen, January 2008.
+
+ # Log messages to logfile.
+
+ # Returns nothing.
+
+ my ( $time_stamp, $user, $script, $fh );
+
+ $time_stamp = Maasha::Common::time_stamp();
+ $user = Maasha::Common::get_user();
+ $script = Maasha::Common::get_scriptname();
+
+ $fh = Maasha::Filesys::file_append_open( "$ENV{ 'BP_LOG' }/biopieces.log" );
+ flock($fh, 2);
+
+ print $fh "$time_stamp\t$user\t$script ", join( " ", @ARGV ), "\n";
+
+ $fh->autoflush( 1 );
+
+ close $fh;
+}
+
+
sub read_stream
{
# Martin A. Hansen, July 2007.
{
# Martin A. Hansen, May 2009
- #
+ # Parses and checks options for Biopieces.
+
+ # First the argument list is checked for duplicates and then
+ # options are parsed from ARGV after which it is checked if
+ # the Biopieces usage information should be printed. Finally,
+ # all options from ARGV are checked according to the argument list.
my ( $arg_list, # data structure with argument description
) = @_;
# ---- Adding the mandatory arguments to the arg_list ----
push @{ $arg_list }, (
-
- { long => 'help', short => '?', type => 'flag', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
- { long => 'stream_in', short => 'I', type => 'file!', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
- { long => 'stream_out', short => 'O', type => 'file', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
- { long => 'verbose', short => 'v', type => 'flag', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
+ { long => 'help', short => '?', type => 'flag', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
+ { long => 'stream_in', short => 'I', type => 'file!', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
+ { long => 'stream_out', short => 'O', type => 'file', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
+ { long => 'verbose', short => 'v', type => 'flag', mandatory => 'no', default => undef, allowed => undef, disallowed => undef },
);
check_duplicates_args( $arg_list );
# Returns nothing.
- my ( $script, $wiki );
+ my ( %options, $help, $script, $wiki );
+
+ %options = %{ $options };
+ $help = $options{ 'help' };
+ delete $options{ 'help' };
$script = Maasha::Common::get_scriptname();
if ( $script ne 'print_wiki' )
{
- if ( exists $options->{ 'help' } or -t STDIN )
+ if ( $help or -t STDIN )
{
- if ( not ( exists $options->{ 'stream_in' } or $options->{ 'data_in' } ) )
+ if ( not ( exists $options{ 'stream_in' } or $options{ 'data_in' } ) )
{
- if ( scalar keys %{ $options } <= 1 )
+ if ( scalar keys %options == 0 )
{
$wiki = $ENV{ 'BP_DIR' } . "/bp_usage/$script.wiki";
- if ( exists $options->{ 'help' } ) {
+ if ( $help ) {
`print_wiki --data_in=$wiki --help`;
- } elsif ( $script =~ /^(list_biopieces|list_genomes)$/ ) {
+ } elsif ( $script =~ /^(list_biopieces|list_genomes|list_mysql_databases|biostat)$/ ) {
return;
} else {
`print_wiki --data_in=$wiki`;
}
-sub getopt_files
-{
- # Martin A. Hansen, November 2007.
-
- # Extracts files from an explicit GetOpt::Long argument
- # allowing for the use of glob. E.g.
- # --data_in=test.fna
- # --data_in=test.fna,test2.fna
- # --data_in=*.fna
- # --data_in=test.fna,/dir/*.fna
-
- my ( $option, # option from GetOpt::Long
- ) = @_;
-
- # Returns a list.
-
- my ( $elem, @files );
-
- foreach $elem ( split ",", $option )
- {
- if ( -f $elem ) {
- push @files, $elem;
- } elsif ( $elem =~ /\*/ ) {
- push @files, glob( $elem );
- }
- }
-
- return wantarray ? @files : \@files;
-}
+# marked for deletion - obsolete?
+#sub getopt_files
+#{
+# # Martin A. Hansen, November 2007.
+#
+# # Extracts files from an explicit GetOpt::Long argument
+# # allowing for the use of glob. E.g.
+# # --data_in=test.fna
+# # --data_in=test.fna,test2.fna
+# # --data_in=*.fna
+# # --data_in=test.fna,/dir/*.fna
+#
+# my ( $option, # option from GetOpt::Long
+# ) = @_;
+#
+# # Returns a list.
+#
+# my ( $elem, @files );
+#
+# foreach $elem ( split ",", $option )
+# {
+# if ( -f $elem ) {
+# push @files, $elem;
+# } elsif ( $elem =~ /\*/ ) {
+# push @files, glob( $elem );
+# }
+# }
+#
+# return wantarray ? @files : \@files;
+#}
sub sig_handler
sleep 1;
-# if ( -d $BP_TMP )
+ if ( $sig =~ /MAASHA_ERROR/ )
{
- if ( $sig =~ /MAASHA_ERROR/ ) {
- print STDERR "\nProgram '$script' had an error" . " - Please wait for temporary data to be removed\n";
- } elsif ( $sig eq "INT" ) {
- print STDERR "\nProgram '$script' interrupted (ctrl-c was pressed)" . " - Please wait for temporary data to be removed\n";
- } elsif ( $sig eq "TERM" ) {
- print STDERR "\nProgram '$script' terminated (someone used kill?)" . " - Please wait for temporary data to be removed\n";
- } else {
- print STDERR "\nProgram '$script' died->$sig" . " - Please wait for temporary data to be removed\n";
- }
-
- clean_tmp();
+ print STDERR "\nProgram '$script' had an error" . " - Please wait for temporary data to be removed\n";
+ status_log( "ERROR" );
+ }
+ elsif ( $sig eq "INT" )
+ {
+ print STDERR "\nProgram '$script' interrupted (ctrl-c was pressed)" . " - Please wait for temporary data to be removed\n";
+ status_log( "INTERRUPTED" );
+ }
+ elsif ( $sig eq "TERM" )
+ {
+ print STDERR "\nProgram '$script' terminated (someone used kill?)" . " - Please wait for temporary data to be removed\n";
+ status_log( "TERMINATED" );
}
+ else
+ {
+ print STDERR "\nProgram '$script' died->$sig" . " - Please wait for temporary data to be removed\n";
+ status_log( "DIED" );
+ }
+
+ clean_tmp();
exit( 0 );
}
my ( $tmpdir, @dirs, $curr_pid, $dir, $user, $sid, $pid );
- $tmpdir = $ENV{ 'BP_TMP' } || Maasha::Common::error( 'No BP_TMP variable in environment.' );
+ $tmpdir = bp_tmp();
$curr_pid = Maasha::Common::get_processid();
}
-sub run_time
+sub get_tmpdir
{
- # Martin A. Hansen, May 2009.
+ # Martin A. Hansen, April 2008.
+
+ # Create a temporary directory based on
+ # $ENV{ 'BP_TMP' } and sessionid. The directory
+ # name is written to the status file.
+
+ # Returns a path.
+
+ my ( $user, $sid, $pid, $script, $path, $file, $fh, $line );
- # Returns a precision timestamp for calculating
- # run time.
+ $user = Maasha::Common::get_user();
+ $sid = Maasha::Common::get_sessionid();
+ $pid = Maasha::Common::get_processid();
+ $script = Maasha::Common::get_scriptname();
- return Maasha::Common::get_time_hires();
+ $path = bp_tmp() . "/" . join( "_", $user, $sid, $pid, "bp_tmp" );
+ $file = bp_tmp() . "/" . join( ".", $user, $script, $pid ) . ".status";
+
+ $fh = Maasha::Filesys::file_read_open( $file );
+ flock($fh, 1);
+ $line = <$fh>;
+ chomp $line;
+ close $fh;
+
+ $fh = Maasha::Filesys::file_write_open( $file );
+ flock($fh, 2);
+ print $fh "$line;$path\n";
+ close $fh;
+
+ Maasha::Filesys::dir_create( $path );
+
+ return $path;
}
-sub run_time_print
+sub biopiecesrc
{
- # Martin A. Hansen, May 2009
+ # Martin A. Hansen, July 2009.
- # Print the run time to STDERR for the current script if
- # the verbose switch is set in the option hash.
+ # Read Biopiece configuration info from .biopiecesrc.
+ # and returns the value of a given key.
- my ( $t0, # run time begin
- $t1, # run time end
- $options, # options hash
+ my ( $key, # configuration key
) = @_;
- # Returns nothing
-
- my $script = Maasha::Common::get_scriptname();
+ # Returns a string.
- print STDERR "Program: $script" . ( " " x ( 25 - length( $script ) ) ) . sprintf( "Run time: %.4f\n", ( $t1 - $t0 ) ) if $options->{ 'verbose' };
+ my ( $file, $fh, $record );
-}
+ $file = "$ENV{ 'HOME' }/.biopiecesrc";
+ return undef if not -f $file;
-sub get_tmpdir
-{
- # Martin A. Hansen, April 2008.
+ $fh = Maasha::Filesys::file_read_open( $file );
+ flock($fh, 1);
+ $record = get_record( $fh );
+ close $fh;
- # Create a temporary directory based on
- # $ENV{ 'BP_TMP' } and sessionid.
+ if ( exists $record->{ $key } ) {
+ return $record->{ $key };
+ } else {
+ return undef;
+ }
+}
- # this thing is a really bad solution and needs to be removed.
+sub bp_tmp
+{
+ # Martin A. Hansen, March 2013.
- # Returns a path.
+ # Returns the BP_TMP path.
+ # Errs if no BP_TMP in ENV and
+ # creates BP_TMP if it doesn't exists.
- my ( $user, $sid, $pid, $path );
+ my ( $path );
Maasha::Common::error( qq(no BP_TMP set in %ENV) ) if not -d $ENV{ 'BP_TMP' };
- $user = Maasha::Common::get_user();
- $sid = Maasha::Common::get_sessionid();
- $pid = Maasha::Common::get_processid();
+ $path = $ENV{ 'BP_TMP' };
- $path = "$ENV{ 'BP_TMP' }/" . join( "_", $user, $sid, $pid, "bp_tmp" );
-
- Maasha::Filesys::dir_create( $path );
+ unless ( -d $path ) { # No BP_TMP so we create it
+ mkdir $path or die qq(failed to create dir "$path": $!);
+ }
return $path;
}
-
END
{
clean_tmp();