Changeset 38168
- Timestamp:
- Apr 23, 2015, 3:12:58 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 19 edited
-
ippScripts/scripts/sc_check_diff.pl (modified) (2 diffs)
-
ippScripts/scripts/sc_mk_stack_mdc.pl (modified) (1 diff)
-
ippScripts/scripts/sc_mk_staticsky_mdc.pl (modified) (1 diff)
-
ippScripts/scripts/sc_prepare_camera.pl (modified) (5 diffs)
-
ippScripts/scripts/sc_prepare_chip.pl (modified) (5 diffs)
-
ippScripts/scripts/sc_prepare_diff.pl (modified) (5 diffs)
-
ippScripts/scripts/sc_prepare_ff.pl (modified) (8 diffs)
-
ippScripts/scripts/sc_prepare_run.pl (modified) (2 diffs)
-
ippScripts/scripts/sc_prepare_stack.pl (modified) (6 diffs)
-
ippScripts/scripts/sc_prepare_staticsky.pl (modified) (6 diffs)
-
ippScripts/scripts/sc_prepare_warp.pl (modified) (4 diffs)
-
ippScripts/scripts/sc_remote_exec.pl (modified) (8 diffs)
-
ippScripts/scripts/sc_remote_poll.pl (modified) (10 diffs)
-
ippTasks/remote.pro (modified) (10 diffs)
-
ippTools/share/Makefile.am (modified) (1 diff)
-
ippTools/share/remotetool_definebyquery_ff.sql (added)
-
ippTools/src/remotetool.c (modified) (1 diff)
-
ippconfig/recipes/Makefile.am (modified) (1 diff)
-
ippconfig/recipes/remote_hosts.config (modified) (3 diffs)
-
ippconfig/system.config (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippScripts/scripts/sc_check_diff.pl
r38093 r38168 8 8 9 9 10 my $remote_root = '/scratch3/watersc1/';10 #my $remote_root = '/scratch3/watersc1/'; 11 11 12 my ($diff_id,$skycell_id,$dbname,$out_path_base );12 my ($diff_id,$skycell_id,$dbname,$out_path_base, $remote_root); 13 13 GetOptions( 14 14 'diff_id=s' => \$diff_id, … … 16 16 'dbname=s' => \$dbname, 17 17 'out_path_base=s' => \$out_path_base, 18 'remote_root=s' => \$remote_root, 18 19 ) or pod2usage( 2 ); 19 20 20 pod2usage( -msg => "Required options: --out_path_base ", -exitval => 3) unless21 pod2usage( -msg => "Required options: --out_path_base --remote_root", -exitval => 3) unless 21 22 defined($out_path_base) && 22 23 defined($diff_id) && 23 24 defined($skycell_id) && 25 defined($remote_root) && 24 26 defined($dbname); 25 27 -
trunk/ippScripts/scripts/sc_mk_stack_mdc.pl
r37833 r38168 8 8 9 9 10 my $remote_root = '/scratch3/watersc1/';10 #my $remote_root = '/scratch3/watersc1/'; 11 11 12 my ($compmap_file );12 my ($compmap_file,$remote_root); 13 13 GetOptions( 14 14 'compmap=s' => \$compmap_file, 15 'remote_root=s' => \$remote_root, 15 16 ) or pod2usage( 2 ); 16 17 17 18 pod2usage( -msg => "Required options: --compmap", -exitval => 3) unless 19 defined($remote_root) and 18 20 defined($compmap_file); 19 21 -
trunk/ippScripts/scripts/sc_mk_staticsky_mdc.pl
r37833 r38168 8 8 9 9 10 my $remote_root = '/scratch3/watersc1/';10 #my $remote_root = '/scratch3/watersc1/'; 11 11 12 my ($compmap_file );12 my ($compmap_file, $remote_root); 13 13 GetOptions( 14 14 'compmap=s' => \$compmap_file, 15 'remote_root=s' => \$remote_root, 15 16 ) or pod2usage( 2 ); 16 17 17 18 pod2usage( -msg => "Required options: --compmap", -exitval => 3) unless 19 defined($remote_root) and 18 20 defined($compmap_file); 19 21 -
trunk/ippScripts/scripts/sc_prepare_camera.pl
r38105 r38168 19 19 use Pod::Usage qw( pod2usage ); 20 20 21 # Hard coded values22 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location23 my $remote_root = '/scratch3/watersc1/'; # Far side destination base location24 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.25 my $threads_req = 0; # How many threads are we going to use?26 27 my $fail_state = "prep_fail";28 29 21 # Look for programs we need 30 22 my $missing_tools; … … 32 24 my $camtool = can_run('camtool') or (warn "Can't find camtool" and $missing_tools = 1); 33 25 my $ppStatsFromMetadata = can_run('ppStatsFromMetadata') or (warn "Can't find ppStatsFromMetadata" and $missing_tools = 1); 26 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 34 27 35 28 if ($missing_tools) { … … 38 31 } 39 32 40 my ($remote_id,$cam_id,$camera,$dbname,$verbose,$path_base,$no_update );33 my ($remote_id,$cam_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 41 34 GetOptions( 42 35 'remote_id=s' => \$remote_id, … … 44 37 'camera|c=s' => \$camera, 45 38 'dbname|d=s' => \$dbname, 39 'recipe=s' => \$cmd_recipe, 46 40 'path_base=s' => \$path_base, 47 41 'no_update' => \$no_update, … … 50 44 51 45 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 52 pod2usage( -msg => "Required options: --remote_id --cam_id --camera --dbname --path_base ", -exitval => 3) unless46 pod2usage( -msg => "Required options: --remote_id --cam_id --camera --dbname --path_base --recipe", -exitval => 3) unless 53 47 defined($remote_id) and 54 48 defined($cam_id) and 55 49 defined($camera) and 56 50 defined($path_base) and 51 defined($cmd_recipe) and 57 52 defined($dbname); 53 54 55 # Hard coded values 56 # Now accessible from a recipe 57 my %remote_recipe = (); 58 { 59 my $verbose = 0; 60 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 61 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 62 run(command => $conf_cmd, verbose => $verbose); 63 unless ($success) { 64 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 65 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 66 } 67 my $mdcParser = PS::IPP::Metadata::Config->new; 68 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 69 70 my $active_recipe = ''; 71 my %recipes = (); 72 73 # print Dumper($metadata); 74 foreach my $entry (@{ $metadata }) { 75 if (${ $entry }{name} eq 'ACTIVE') { 76 $active_recipe = ${ $entry }{value}; # Not actually used 77 } 78 else { 79 if (${ $entry }{class} eq 'metadata') { # A real recipe 80 my $name = ${ $entry }{name}; 81 foreach my $tentry (@{ ${ $entry }{value} }) { 82 if (${ $tentry }{class} eq 'scalar') { # A recipe value 83 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 84 } 85 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 86 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 87 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 88 } 89 } 90 } 91 } 92 } 93 } 94 95 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 96 # print Dumper(%recipes); 97 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 98 # print Dumper(\%remote_recipe); 99 } 100 101 102 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 103 my $remote_root = $remote_recipe{REMOTE_ROOT}; 104 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 105 my $threads_req = 0; # How many threads are we going to use? 106 107 my $fail_state = "prep_fail"; 108 58 109 59 110 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id, $cam_id, $PS_EXIT_CONFIG_ERROR, $fail_state); -
trunk/ippScripts/scripts/sc_prepare_chip.pl
r37833 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/'; # Far side destination base location23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $remote_raw = "${remote_root}/tmp/"; # Directory to find raw data in.25 my $threads_req = 4;26 27 my $fail_state = "prep_fail";28 my $hard_fail_state = "fail";29 20 30 21 # Look for programs we need … … 34 25 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 35 26 my $ipp_burntool_fix = can_run('ipp_apply_burntool_fix.pl') or (warn "Can't find ipp_apply_burntool_fix.pl" and $missing_tools = 1); 27 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 36 28 37 29 if ($missing_tools) { … … 41 33 42 34 # Options 43 my ($remote_id,$chip_id,$camera,$dbname,$path_base,$no_update,$verbose,$dbverbose );35 my ($remote_id,$chip_id,$camera,$dbname,$path_base,$no_update,$verbose,$dbverbose,$cmd_recipe); 44 36 GetOptions( 45 37 'remote_id=s' => \$remote_id, … … 47 39 'camera|c=s' => \$camera, 48 40 'dbname|d=s' => \$dbname, 41 'recipe=s' => \$cmd_recipe, 49 42 'path_base=s' => \$path_base, 50 43 'no_update' => \$no_update, … … 54 47 55 48 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 56 pod2usage( -msg => "Required options: --remote_id --chip_id --camera --dbname --path_base ", -exitval => 3) unless49 pod2usage( -msg => "Required options: --remote_id --chip_id --camera --dbname --path_base --recipe", -exitval => 3) unless 57 50 defined($remote_id) and 58 51 defined($chip_id) and 59 52 defined($camera) and 60 53 defined($path_base) and 54 defined($cmd_recipe) and 61 55 defined($dbname); 56 57 58 # Hard coded values 59 # Now accessible from a recipe 60 my %remote_recipe = (); 61 { 62 my $verbose = 0; 63 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 64 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 65 run(command => $conf_cmd, verbose => $verbose); 66 unless ($success) { 67 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 68 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 69 } 70 my $mdcParser = PS::IPP::Metadata::Config->new; 71 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 72 73 my $active_recipe = ''; 74 my %recipes = (); 75 76 # print Dumper($metadata); 77 foreach my $entry (@{ $metadata }) { 78 if (${ $entry }{name} eq 'ACTIVE') { 79 $active_recipe = ${ $entry }{value}; # Not actually used 80 } 81 else { 82 if (${ $entry }{class} eq 'metadata') { # A real recipe 83 my $name = ${ $entry }{name}; 84 foreach my $tentry (@{ ${ $entry }{value} }) { 85 if (${ $tentry }{class} eq 'scalar') { # A recipe value 86 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 87 } 88 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 89 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 90 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 91 } 92 } 93 } 94 } 95 } 96 } 97 98 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 99 # print Dumper(%recipes); 100 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 101 # print Dumper(\%remote_recipe); 102 } 103 104 105 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 106 my $remote_root = $remote_recipe{REMOTE_ROOT}; 107 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 108 my $remote_raw = "${remote_root}/tmp/"; # Directory to find raw data in. 109 my $threads_req = 4; 110 111 my $fail_state = "prep_fail"; 112 my $hard_fail_state = "fail"; 62 113 63 114 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id, $chip_id, $PS_EXIT_CONFIG_ERROR, $fail_state); -
trunk/ippScripts/scripts/sc_prepare_diff.pl
r38097 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/';23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $threads_req = 4; # How many threads are we going to use?25 26 my $fail_state = "prep_fail";27 28 20 # Look for programs we need 29 21 my $missing_tools; 30 22 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 31 23 my $difftool = can_run('difftool') or (warn "Can't find difftool" and $missing_tools = 1); 24 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 32 25 33 26 if ($missing_tools) { … … 36 29 } 37 30 38 my ($remote_id,$diff_id,$camera,$dbname,$verbose,$path_base,$no_update );31 my ($remote_id,$diff_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 39 32 GetOptions( 40 33 'remote_id=s' => \$remote_id, … … 42 35 'camera|c=s' => \$camera, 43 36 'dbname|d=s' => \$dbname, 37 'recipe=s' => \$cmd_recipe, 44 38 'path_base=s' => \$path_base, 45 39 'no_update' => \$no_update, … … 48 42 49 43 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 50 pod2usage( -msg => "Required options: --remote_id -diff_id --camera --dbname --path_base ", -exitval => 3) unless44 pod2usage( -msg => "Required options: --remote_id -diff_id --camera --dbname --path_base --recipe", -exitval => 3) unless 51 45 defined($remote_id) and 52 46 defined($diff_id) and 53 47 defined($camera) and 54 48 defined($path_base) and 49 defined($cmd_recipe) and 55 50 defined($dbname); 51 52 53 # Hard coded values 54 # Now accessible from a recipe 55 my %remote_recipe = (); 56 { 57 my $verbose = 0; 58 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 59 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 60 run(command => $conf_cmd, verbose => $verbose); 61 unless ($success) { 62 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 63 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 64 } 65 my $mdcParser = PS::IPP::Metadata::Config->new; 66 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 67 68 my $active_recipe = ''; 69 my %recipes = (); 70 71 # print Dumper($metadata); 72 foreach my $entry (@{ $metadata }) { 73 if (${ $entry }{name} eq 'ACTIVE') { 74 $active_recipe = ${ $entry }{value}; # Not actually used 75 } 76 else { 77 if (${ $entry }{class} eq 'metadata') { # A real recipe 78 my $name = ${ $entry }{name}; 79 foreach my $tentry (@{ ${ $entry }{value} }) { 80 if (${ $tentry }{class} eq 'scalar') { # A recipe value 81 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 82 } 83 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 84 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 85 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 86 } 87 } 88 } 89 } 90 } 91 } 92 93 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 94 # print Dumper(%recipes); 95 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 96 # print Dumper(\%remote_recipe); 97 } 98 99 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 100 my $remote_root = $remote_recipe{REMOTE_ROOT}; 101 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 102 my $threads_req = 4; # How many threads are we going to use? 103 104 my $fail_state = "prep_fail"; 105 56 106 57 107 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $remote_id, $diff_id, $PS_EXIT_CONFIG_ERROR, $fail_state); … … 198 248 my $remote_templsourc = &uri_local_to_remote($ipp_templsourc); 199 249 200 my $pre_command = " sc_check_diff.pl --diff_id ${diff_id} -- skycell_id ${skycell_id} --dbname ${dbname} --out_path_base ${remote_outroot} $remote_inimage $remote_inmask $remote_inwt $remote_insourc $remote_templimage $remote_templmask $remote_templwt $remote_templsourc ";250 my $pre_command = " sc_check_diff.pl --diff_id ${diff_id} --remote_root ${remote_root} --skycell_id ${skycell_id} --dbname ${dbname} --out_path_base ${remote_outroot} $remote_inimage $remote_inmask $remote_inwt $remote_insourc $remote_templimage $remote_templmask $remote_templwt $remote_templsourc "; 201 251 202 252 # make any directory we may need -
trunk/ippScripts/scripts/sc_prepare_ff.pl
r38145 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/';23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $threads_req = 4; # How many threads are we going to use?25 26 my $fail_state = "prep_fail";27 28 20 # Look for programs we need 29 21 my $missing_tools; 30 22 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 31 23 my $fftool = can_run('fftool') or (warn "Can't find fftool" and $missing_tools = 1); 24 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 32 25 33 26 if ($missing_tools) { … … 36 29 } 37 30 38 my ($remote_id,$ff_id,$camera,$dbname,$verbose,$path_base,$no_update );31 my ($remote_id,$ff_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 39 32 GetOptions( 40 33 'remote_id=s' => \$remote_id, … … 42 35 'camera|c=s' => \$camera, 43 36 'dbname|d=s' => \$dbname, 37 'recipe=s' => \$cmd_recipe, 44 38 'path_base=s' => \$path_base, 45 39 'no_update' => \$no_update, … … 48 42 49 43 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 50 pod2usage( -msg => "Required options: --remote_id -ff_id --camera --dbname --path_base ", -exitval => 3) unless44 pod2usage( -msg => "Required options: --remote_id -ff_id --camera --dbname --path_base --recipe", -exitval => 3) unless 51 45 defined($remote_id) and 52 46 defined($ff_id) and 53 47 defined($camera) and 54 48 defined($path_base) and 49 defined($cmd_recipe) and 55 50 defined($dbname); 51 52 53 # Hard coded values 54 # Now accessible from a recipe 55 my %remote_recipe = (); 56 { 57 my $verbose = 0; 58 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 59 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 60 run(command => $conf_cmd, verbose => $verbose); 61 unless ($success) { 62 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 63 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 64 } 65 my $mdcParser = PS::IPP::Metadata::Config->new; 66 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 67 68 my $active_recipe = ''; 69 my %recipes = (); 70 71 # print Dumper($metadata); 72 foreach my $entry (@{ $metadata }) { 73 if (${ $entry }{name} eq 'ACTIVE') { 74 $active_recipe = ${ $entry }{value}; # Not actually used 75 } 76 else { 77 if (${ $entry }{class} eq 'metadata') { # A real recipe 78 my $name = ${ $entry }{name}; 79 foreach my $tentry (@{ ${ $entry }{value} }) { 80 if (${ $tentry }{class} eq 'scalar') { # A recipe value 81 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 82 } 83 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 84 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 85 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 86 } 87 } 88 } 89 } 90 } 91 } 92 93 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 94 # print Dumper(%recipes); 95 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 96 # print Dumper(\%remote_recipe); 97 } 98 99 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 100 my $remote_root = $remote_recipe{REMOTE_ROOT}; 101 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 102 my $remote_raw = "${remote_root}/tmp/"; # Directory to find raw data in. 103 104 my $threads_req = 4; # How many threads are we going to use? 105 106 my $fail_state = "prep_fail"; 107 56 108 57 109 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $remote_id, $ff_id, $PS_EXIT_CONFIG_ERROR, $fail_state); … … 126 178 my $ipp_insourc = $ipprc->filename("PSPHOT.OUTPUT.CFF",$source_pb); 127 179 128 my ($ipp_disk_inimage, $remote_inimage) = &uri_to_outputs($ipp_inimage); 129 my ($ipp_disk_inmask, $remote_inmask) = &uri_to_outputs($ipp_inmask); 130 my ($ipp_disk_inwt, $remote_inwt) = &uri_to_outputs($ipp_inwt); 131 my ($ipp_disk_insourc, $remote_insourc) = &uri_to_outputs($ipp_insourc); 180 # my ($ipp_disk_inimage, $remote_inimage) = &uri_to_outputs($ipp_inimage); 181 # my ($ipp_disk_inmask, $remote_inmask) = &uri_to_outputs($ipp_inmask); 182 # my ($ipp_disk_inwt, $remote_inwt) = &uri_to_outputs($ipp_inwt); 183 # my ($ipp_disk_insourc, $remote_insourc) = &uri_to_outputs($ipp_insourc); 184 185 my (undef,$remote_inimage) = uri_to_outputs_raw($ipp_inimage); 186 my (undef,$remote_inmask) = uri_to_outputs_raw($ipp_inmask); 187 my (undef,$remote_inwt) = uri_to_outputs_raw($ipp_inwt); 188 my (undef,$remote_insourc) = uri_to_outputs_raw($ipp_insourc); 132 189 133 190 # make any directory we may need … … 142 199 $remote_id,$ff_id, $PS_EXIT_CONFIG_ERROR, $fail_state); 143 200 } 201 144 202 145 203 … … 176 234 print CONFIG " && mkdir -p ${remote_root}/tmp/${remote_outroot_dir} && ln -sf $remote_disk ${remote_root}/tmp/${ipp_disk} && touch $remote_disk "; 177 235 } 236 # If we're this far, we succeeded, so delete the input files. 237 print CONFIG " && rm -f $remote_insourc $remote_inimage $remote_inmask $remote_inwt "; 178 238 print CONFIG "\n"; 179 239 # die(); … … 234 294 my $neb_uri = shift; 235 295 my ($ipp_disk, $remote_disk) = &uri_convert( $neb_uri ); 296 297 print TRANSFER "$ipp_disk\n"; 298 print CHECK "$remote_disk\n"; 299 return($ipp_disk,$remote_disk); 300 } 301 302 sub uri_to_outputs_raw { 303 my $neb_uri = shift; 304 my ($ipp_disk, $remote_disk) = uri_convert( $neb_uri ); 305 $remote_disk = $remote_raw . $ipp_disk; 236 306 237 307 print TRANSFER "$ipp_disk\n"; -
trunk/ippScripts/scripts/sc_prepare_run.pl
r38145 r38168 21 21 use Pod::Usage qw( pod2usage ); 22 22 23 #use Data::Dumper; 24 # Look for programs we need 25 my $missing_tools; 26 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 27 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 28 29 if ($missing_tools) { 30 warn("Can't find required tools."); 31 exit($PS_EXIT_CONFIG_ERROR); 32 } 33 34 # Options 35 my ($remote_id,$cmd_recipe,$stage,$camera,$path_base,$dbname,$verbose,$no_update); 36 GetOptions( 37 'remote_id=s' => \$remote_id, 38 'recipe=s' => \$cmd_recipe, 39 'stage=s' => \$stage, 40 'camera|c=s' => \$camera, 41 'path_base=s' => \$path_base, 42 'dbname|d=s' => \$dbname, 43 'verbose' => \$verbose, 44 'no_update' => \$no_update, 45 ) or pod2usage( 2 ); 46 47 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 48 pod2usage( -msg => "Required options: --remote_id --stage --camera --dbname --path_base --recipe", -exitval => 3) unless 49 defined($remote_id) and 50 defined($stage) and 51 defined($camera) and 52 defined($path_base) and 53 defined($cmd_recipe) and 54 defined($dbname) and 55 defined($dbname); 56 23 57 # Hard coded values 24 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 25 my $remote_root = '/scratch3/watersc1/'; 58 # Now accessible from a recipe 59 my %remote_recipe = (); 60 { 61 my $verbose = 0; 62 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 63 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 64 run(command => $conf_cmd, verbose => $verbose); 65 unless ($success) { 66 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 67 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 68 } 69 my $mdcParser = PS::IPP::Metadata::Config->new; 70 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 71 72 my $active_recipe = ''; 73 my %recipes = (); 74 75 # print Dumper($metadata); 76 foreach my $entry (@{ $metadata }) { 77 if (${ $entry }{name} eq 'ACTIVE') { 78 $active_recipe = ${ $entry }{value}; # Not actually used 79 } 80 else { 81 if (${ $entry }{class} eq 'metadata') { # A real recipe 82 my $name = ${ $entry }{name}; 83 foreach my $tentry (@{ ${ $entry }{value} }) { 84 if (${ $tentry }{class} eq 'scalar') { # A recipe value 85 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 86 } 87 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 88 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 89 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 90 } 91 } 92 } 93 } 94 } 95 } 96 97 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 98 # print Dumper(%recipes); 99 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 100 # print Dumper(\%remote_recipe); 101 } 102 103 my $remote_root = $remote_recipe{REMOTE_ROOT}; 26 104 my $remote_raw = "${remote_root}/tmp/"; # Directory to find raw data in. 27 105 … … 51 129 $job_subscription{"ff"} = 1; 52 130 53 my $proc_per_node = 24;# processors per node54 my $min_nodes = 1;# smallest allocation to ask for55 my $max_nodes = 1000;# largest allocation to ask for56 my $min_time = 1;# shortest allocation to ask for57 my $max_time = 8;# longest allocation to ask for131 my $proc_per_node = $remote_recipe{PROC_PER_NODE}; # processors per node 132 my $min_nodes = $remote_recipe{MIN_NODES}; # smallest allocation to ask for 133 my $max_nodes = $remote_recipe{MAX_NODES}; # largest allocation to ask for 134 my $min_time = $remote_recipe{MIN_TIME}; # shortest allocation to ask for 135 my $max_time = $remote_recipe{MAX_TIME}; # longest allocation to ask for 58 136 59 137 # We need to ensure we only ever try to transfer a file once. 60 138 my %file_filter = (); 61 139 62 # Look for programs we need 63 my $missing_tools; 64 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 65 66 if ($missing_tools) { 67 warn("Can't find required tools."); 68 exit($PS_EXIT_CONFIG_ERROR); 69 } 70 71 # Options 72 my ($remote_id,$stage,$camera,$path_base,$dbname,$verbose,$no_update); 73 GetOptions( 74 'remote_id=s' => \$remote_id, 75 'stage=s' => \$stage, 76 'camera|c=s' => \$camera, 77 'path_base=s' => \$path_base, 78 'dbname|d=s' => \$dbname, 79 'verbose' => \$verbose, 80 'no_update' => \$no_update, 81 ) or pod2usage( 2 ); 82 83 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 84 pod2usage( -msg => "Required options: --remote_id --stage --camera --dbname --path_base", -exitval => 3) unless 85 defined($remote_id) and 86 defined($stage) and 87 defined($camera) and 88 defined($path_base) and 89 defined($dbname); 90 140 141 # Finish setup 91 142 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id, $PS_EXIT_CONFIG_ERROR, $fail_state); 92 143 -
trunk/ippScripts/scripts/sc_prepare_stack.pl
r38137 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/'; # Far side destination base location23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $threads_req = 4; # How many threads are we going to use?25 my $have_warps = 0; # Do we have a copy of the warp if we don't find one there?26 27 my $fail_state = "prep_fail";28 29 20 # Look for programs we need 30 21 my $missing_tools; 31 22 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 32 23 my $stacktool = can_run('stacktool') or (warn "Can't find stacktool" and $missing_tools = 1); 24 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 33 25 34 26 if ($missing_tools) { … … 37 29 } 38 30 39 my ($remote_id,$stack_id,$camera,$dbname,$verbose,$path_base,$no_update );31 my ($remote_id,$stack_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 40 32 GetOptions( 41 33 'remote_id=s' => \$remote_id, … … 43 35 'camera|c=s' => \$camera, 44 36 'dbname|d=s' => \$dbname, 37 'recipe=s' => \$cmd_recipe, 45 38 'path_base=s' => \$path_base, 46 39 'no_update' => \$no_update, … … 49 42 50 43 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 51 pod2usage( -msg => "Required options: --remote_id --stack_id --camera --dbname --path_base ", -exitval => 3) unless44 pod2usage( -msg => "Required options: --remote_id --stack_id --camera --dbname --path_base --recipe", -exitval => 3) unless 52 45 defined($remote_id) and 53 46 defined($stack_id) and 54 47 defined($camera) and 55 defined($path_base) and 48 defined($path_base) and 49 defined($cmd_recipe) and 56 50 defined($dbname); 51 52 # Hard coded values 53 # Now accessible from a recipe 54 my %remote_recipe = (); 55 { 56 my $verbose = 0; 57 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 58 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 59 run(command => $conf_cmd, verbose => $verbose); 60 unless ($success) { 61 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 62 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 63 } 64 my $mdcParser = PS::IPP::Metadata::Config->new; 65 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 66 67 my $active_recipe = ''; 68 my %recipes = (); 69 70 # print Dumper($metadata); 71 foreach my $entry (@{ $metadata }) { 72 if (${ $entry }{name} eq 'ACTIVE') { 73 $active_recipe = ${ $entry }{value}; # Not actually used 74 } 75 else { 76 if (${ $entry }{class} eq 'metadata') { # A real recipe 77 my $name = ${ $entry }{name}; 78 foreach my $tentry (@{ ${ $entry }{value} }) { 79 if (${ $tentry }{class} eq 'scalar') { # A recipe value 80 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 81 } 82 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 83 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 84 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 85 } 86 } 87 } 88 } 89 } 90 } 91 92 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 93 # print Dumper(%recipes); 94 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 95 # print Dumper(\%remote_recipe); 96 } 97 98 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 99 my $remote_root = $remote_recipe{REMOTE_ROOT}; # Far side destination base location 100 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 101 my $threads_req = 4; # How many threads are we going to use? 102 my $have_warps = $remote_recipe{TRANSFER_WARP_IMAGES}; # Do we have a copy of the warp if we don't find one there? 103 104 my $fail_state = "prep_fail"; 105 57 106 58 107 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id, $stack_id, $PS_EXIT_CONFIG_ERROR, $fail_state); … … 158 207 # ${remote_root}/tmp/${ipp_disk} 159 208 160 if ($have_warps != 0) { # Check to see if we have a copy, because if we do, then we can send it over if it's missing.209 if ($have_warps) { # Check to see if we have a copy, because if we do, then we can send it over if it's missing. 161 210 (undef,$remote_file) = &uri_to_outputs($warp_path_base . ".fits"); 162 211 ($ipp_disk,undef) = &uri_convert($warp_path_base . ".fits"); … … 201 250 close(COMPMAP); 202 251 203 my $mk_mdc_command = "mkdir -p $remote_outdir && sc_mk_stack_mdc.pl -- compmap ${remote_root}/tmp/${component_map} $warp_path_base_string > ${remote_outroot}.in.mdc";252 my $mk_mdc_command = "mkdir -p $remote_outdir && sc_mk_stack_mdc.pl --remote_root ${remote_root} --compmap ${remote_root}/tmp/${component_map} $warp_path_base_string > ${remote_outroot}.in.mdc"; 204 253 my $recipe_ppstack = $ipprc->reduction($reduction, 'STACK_PPSTACK'); # Recipe to use 205 254 my $ppstack_command = " ppStack -input ${remote_outroot}.in.mdc "; -
trunk/ippScripts/scripts/sc_prepare_staticsky.pl
r38137 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/'; # Far side destination base location23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $threads_req = 4; # How many threads are we going to use?25 26 my $fail_state = "prep_fail";27 28 20 # Look for programs we need 29 21 my $missing_tools; … … 31 23 my $stacktool = can_run('stacktool') or (warn "Can't find stacktool" and $missing_tools = 1); 32 24 my $staticskytool= can_run('staticskytool') or (warn "Can't find staticskytool" and $missing_tools = 1); 25 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 33 26 34 27 if ($missing_tools) { … … 37 30 } 38 31 39 my ($remote_id,$sky_id,$camera,$dbname,$verbose,$path_base,$no_update );32 my ($remote_id,$sky_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 40 33 GetOptions( 41 34 'remote_id=s' => \$remote_id, … … 43 36 'camera|c=s' => \$camera, 44 37 'dbname|d=s' => \$dbname, 38 'recipe=s' => \$cmd_recipe, 45 39 'path_base=s' => \$path_base, 46 40 'no_update' => \$no_update, … … 49 43 50 44 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 51 pod2usage( -msg => "Required options: --remote_id --sky_id --camera --dbname --path_base ", -exitval => 3) unless45 pod2usage( -msg => "Required options: --remote_id --sky_id --camera --dbname --path_base --recipe", -exitval => 3) unless 52 46 defined($remote_id) and 53 47 defined($sky_id) and 54 48 defined($camera) and 55 49 defined($path_base) and 50 defined($cmd_recipe) and 56 51 defined($dbname); 52 53 # Hard coded values 54 # Now accessible from a recipe 55 my %remote_recipe = (); 56 { 57 my $verbose = 0; 58 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 59 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 60 run(command => $conf_cmd, verbose => $verbose); 61 unless ($success) { 62 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 63 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 64 } 65 my $mdcParser = PS::IPP::Metadata::Config->new; 66 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 67 68 my $active_recipe = ''; 69 my %recipes = (); 70 71 # print Dumper($metadata); 72 foreach my $entry (@{ $metadata }) { 73 if (${ $entry }{name} eq 'ACTIVE') { 74 $active_recipe = ${ $entry }{value}; # Not actually used 75 } 76 else { 77 if (${ $entry }{class} eq 'metadata') { # A real recipe 78 my $name = ${ $entry }{name}; 79 foreach my $tentry (@{ ${ $entry }{value} }) { 80 if (${ $tentry }{class} eq 'scalar') { # A recipe value 81 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 82 } 83 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 84 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 85 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 86 } 87 } 88 } 89 } 90 } 91 } 92 93 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 94 # print Dumper(%recipes); 95 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 96 # print Dumper(\%remote_recipe); 97 } 98 99 100 my $remote_root = $remote_recipe{REMOTE_ROOT}; # Far side destination base location 101 my $remote_hostname = $remote_recipe{REMOTE_HOSTNAME}; # Name of the remote node. 102 my $threads_req = 4; # How many threads are we going to use? 103 104 my $fail_state = "prep_fail"; 105 57 106 58 107 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id, $sky_id, $PS_EXIT_CONFIG_ERROR, $fail_state); … … 186 235 close(COMPMAP); 187 236 188 my $mk_mdc_command = "mkdir -p $remote_outdir && sc_mk_staticsky_mdc.pl -- compmap ${remote_root}/tmp/${component_map} $input_path_base_string > ${remote_outroot}.in.mdc";237 my $mk_mdc_command = "mkdir -p $remote_outdir && sc_mk_staticsky_mdc.pl --remote_root ${remote_root} --compmap ${remote_root}/tmp/${component_map} $input_path_base_string > ${remote_outroot}.in.mdc"; 189 238 my $recipe_psphot = $ipprc->reduction($reduction, 'STACKPHOT_PSPHOT'); 190 239 my $recipe_ppsub = $ipprc->reduction($reduction, 'STACKPHOT_PPSUB'); -
trunk/ippScripts/scripts/sc_prepare_warp.pl
r37833 r38168 18 18 use Pod::Usage qw( pod2usage ); 19 19 20 # Hard coded values21 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location22 my $remote_root = '/scratch3/watersc1/';23 my $remote_hostname = "LANL/Mustang"; # Name of the remote node.24 my $threads_req = 4; # How many threads are we going to use?25 26 my $fail_state = "prep_fail";27 28 20 # Look for programs we need 29 21 my $missing_tools; 30 22 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 31 23 my $warptool = can_run('warptool') or (warn "Can't find warptool" and $missing_tools = 1); 24 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 32 25 33 26 if ($missing_tools) { … … 36 29 } 37 30 38 my ($remote_id,$warp_id,$camera,$dbname,$verbose,$path_base,$no_update );31 my ($remote_id,$warp_id,$camera,$dbname,$verbose,$path_base,$no_update,$cmd_recipe); 39 32 GetOptions( 40 33 'remote_id=s' => \$remote_id, … … 42 35 'camera|c=s' => \$camera, 43 36 'dbname|d=s' => \$dbname, 37 'recipe=s' => \$cmd_recipe, 44 38 'path_base=s' => \$path_base, 45 39 'no_update' => \$no_update, … … 48 42 49 43 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 50 pod2usage( -msg => "Required options: --remote_id -warp_id --camera --dbname --path_base ", -exitval => 3) unless44 pod2usage( -msg => "Required options: --remote_id -warp_id --camera --dbname --path_base --recipe", -exitval => 3) unless 51 45 defined($remote_id) and 52 46 defined($warp_id) and 53 47 defined($camera) and 54 48 defined($path_base) and 49 defined($cmd_recipe) and 55 50 defined($dbname); 56 51 52 53 # Hard coded values 54 # my $remote_root = '/lustre/scratch1/turquoise/watersc1/ps1/'; # Far side destination base location 55 # Now accessible from a recipe 56 my %remote_recipe = (); 57 { 58 my $verbose = 0; 59 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 60 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 61 run(command => $conf_cmd, verbose => $verbose); 62 unless ($success) { 63 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 64 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 65 } 66 my $mdcParser = PS::IPP::Metadata::Config->new; 67 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 68 69 my $active_recipe = ''; 70 my %recipes = (); 71 72 # print Dumper($metadata); 73 foreach my $entry (@{ $metadata }) { 74 if (${ $entry }{name} eq 'ACTIVE') { 75 $active_recipe = ${ $entry }{value}; # Not actually used 76 } 77 else { 78 if (${ $entry }{class} eq 'metadata') { # A real recipe 79 my $name = ${ $entry }{name}; 80 foreach my $tentry (@{ ${ $entry }{value} }) { 81 if (${ $tentry }{class} eq 'scalar') { # A recipe value 82 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 83 } 84 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 85 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 86 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 87 } 88 } 89 } 90 } 91 } 92 } 93 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 94 # print Dumper(%recipes); 95 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 96 # print Dumper(\%remote_recipe); 97 98 } 99 100 my $remote_root = $remote_recipe{REMOTE_ROOT}; 101 my $hostname = $remote_recipe{REMOTE_HOSTNAME}; 102 my $have_warps = $remote_recipe{TRANSFER_WARP_IMAGES}; 103 my $threads_req = 4; # How many threads are we going to use? 104 105 my $fail_state = "prep_fail"; 106 107 57 108 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $remote_id, $warp_id, $PS_EXIT_CONFIG_ERROR, $fail_state); 58 109 59 110 my $mdcParser = PS::IPP::Metadata::Config->new; # Parser for metadata config files 60 111 61 my @return_component_list = ("DBINFO.EXP", "PSWARP.CONFIG", "PSWARP.OUTPUT", "PSWARP.OUTPUT.MASK", "PSWARP.OUTPUT.VARIANCE", "PSWARP.OUTPUT.SOURCES","PSPHOT.PSF.SKY.SAVE","LOG.EXP"); 112 my @return_component_list = ("DBINFO.EXP", "PSWARP.CONFIG", "PSWARP.OUTPUT.SOURCES","PSPHOT.PSF.SKY.SAVE","LOG.EXP"); 113 if ($have_warps) { 114 push @return_component_list, ("PSWARP.OUTPUT", "PSWARP.OUTPUT.MASK", "PSWARP.OUTPUT.VARIANCE"); 115 } 62 116 63 117 # STEP 0: Open output files -
trunk/ippScripts/scripts/sc_remote_exec.pl
r38062 r38168 13 13 use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt ); 14 14 use Pod::Usage qw( pod2usage ); 15 16 # Hard coded values17 my $DMZ_HOST = 'wtrw';18 my @SEC_HOSTS= ('mu-fe1','mu-fe2','mu-fe3'19 # ,'mu-fe4'20 );21 my $SEC_HOST = $SEC_HOSTS[int(rand(@SEC_HOSTS))]; # 'mu-fe';22 my $IPP_PATH = '/turquoise/usr/projects/cosmo/mswarren/ipp/';23 my $remote_root = '/scratch3/watersc1/';24 15 25 16 # tools … … 28 19 my $scp = can_run('scp') or (warn "Can't find scp" and $missing_tools = 1); 29 20 my $remotetool = can_run('remotetool') or (warn "Can't find remotetool" and $missing_tools = 1); 21 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 30 22 31 23 if ($missing_tools) { … … 35 27 36 28 # Options 37 my ($remote_id,$job_id,$path_base,$dbname,$verbose,$no_update,$camera );29 my ($remote_id,$job_id,$path_base,$dbname,$verbose,$no_update,$camera,$cmd_recipe); 38 30 $verbose = 0; 39 31 GetOptions( … … 42 34 'camera=s' => \$camera, 43 35 'dbname=s' => \$dbname, 36 'recipe=s' => \$cmd_recipe, 44 37 'verbose' => \$verbose, 45 38 'no_update' => \$no_update, … … 47 40 48 41 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 49 pod2usage( -msg => "Required options: --remote_id --path_base ", -exitval => 3) unless42 pod2usage( -msg => "Required options: --remote_id --path_base --recipe", -exitval => 3) unless 50 43 defined($path_base) and 44 defined($camera) and 45 defined($cmd_recipe) and 46 defined($dbname) and 51 47 defined($remote_id); 48 49 # Hard coded values 50 # Now accessible from a recipe 51 my %remote_recipe = (); 52 { 53 my $verbose = 0; 54 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 55 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 56 run(command => $conf_cmd, verbose => $verbose); 57 unless ($success) { 58 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 59 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 60 } 61 my $mdcParser = PS::IPP::Metadata::Config->new; 62 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 63 64 my $active_recipe = ''; 65 my %recipes = (); 66 67 # print Dumper($metadata); 68 foreach my $entry (@{ $metadata }) { 69 if (${ $entry }{name} eq 'ACTIVE') { 70 $active_recipe = ${ $entry }{value}; # Not actually used 71 } 72 else { 73 if (${ $entry }{class} eq 'metadata') { # A real recipe 74 my $name = ${ $entry }{name}; 75 foreach my $tentry (@{ ${ $entry }{value} }) { 76 if (${ $tentry }{class} eq 'scalar') { # A recipe value 77 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 78 } 79 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 80 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 81 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 82 } 83 } 84 } 85 } 86 } 87 } 88 89 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 90 # print Dumper(%recipes); 91 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 92 # print Dumper(\%remote_recipe); 93 } 94 95 # Hard coded values 96 my $DMZ_HOST = $remote_recipe{DMZ_HOST}; 97 my @SEC_HOSTS= @{ $remote_recipe{SEC_HOST} }; 98 my $SEC_HOST; 99 if ($#SEC_HOSTS != -1) { 100 $SEC_HOST = $SEC_HOSTS[int(rand(@SEC_HOSTS))]; 101 } 102 else { 103 $SEC_HOST = ''; 104 } 105 my $IPP_PATH = $remote_recipe{IPP_PATH}; 106 my $remote_root = $remote_recipe{REMOTE_ROOT}; 52 107 53 108 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $remote_id); … … 141 196 my $file = shift; 142 197 my $destination = shift; 143 my $cmd = "$scp $file ${DMZ_HOST}:${SEC_HOST}:${destination}"; 198 my $cmd; 199 if ($SEC_HOST ne '') { 200 $cmd = "$scp $file ${DMZ_HOST}:${SEC_HOST}:${destination}"; 201 } 202 else { 203 $cmd = "$ssh -n $DMZ_HOST $cmd"; 204 } 144 205 145 206 my $directory = dirname($destination); … … 157 218 my $destination = shift; 158 219 my $file = shift; 159 160 my $cmd = "$scp ${DMZ_HOST}:${SEC_HOST}:${destination} $file "; 220 my $cmd; 221 if ($SEC_HOST ne '') { 222 $cmd = "$scp ${DMZ_HOST}:${SEC_HOST}:${destination} $file "; 223 } 224 else { 225 $cmd = "$ssh -n $DMZ_HOST $cmd"; 226 } 161 227 162 228 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = … … 170 236 sub ssh_exec_command { 171 237 my $cmd = shift; 172 $cmd = "$ssh -n $DMZ_HOST ssh ${SEC_HOST} $cmd"; 238 if ($SEC_HOST ne '') { 239 $cmd = "$ssh -n $DMZ_HOST ssh ${SEC_HOST} $cmd"; 240 } 241 else { 242 $cmd = "$ssh -n $DMZ_HOST $cmd"; 243 } 244 173 245 print "EXEC: $cmd\n"; 174 246 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = -
trunk/ippScripts/scripts/sc_remote_poll.pl
r38145 r38168 26 26 use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt ); 27 27 use Pod::Usage qw( pod2usage ); 28 29 # Hard coded values30 my $DMZ_HOST = 'wtrw';31 my @SEC_HOSTS= ('mu-fe1','mu-fe2','mu-fe3'32 # ,'mu-fe4'33 );34 my $SEC_HOST = $SEC_HOSTS[int(rand(@SEC_HOSTS))]; # 'mu-fe';35 my $IPP_PATH = '/turquoise/usr/projects/cosmo/mswarren/ipp/';36 my $remote_root = '/scratch3/watersc1/';37 28 38 29 # tools … … 44 35 my $camtool = can_run('camtool') or (warn "Can't find camtool" and $missing_tools = 1); 45 36 my $warptool = can_run('warptool') or (warn "Can't find warptool" and $missing_tools = 1); 37 my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1); 46 38 47 39 if ($missing_tools) { … … 51 43 52 44 # Options 53 my ($remote_id,$path_base,$skip_poll,$skip_transfer,$job_id,$dbname,$retry,$verbose,$no_update,$camera );45 my ($remote_id,$path_base,$skip_poll,$skip_transfer,$job_id,$dbname,$retry,$verbose,$no_update,$camera,$cmd_recipe); 54 46 $verbose = 0; 55 47 GetOptions( … … 61 53 'camera=s' => \$camera, 62 54 'dbname=s' => \$dbname, 55 'recipe=s' => \$cmd_recipe, 63 56 'retry' => \$retry, 64 57 'verbose' => \$verbose, … … 67 60 68 61 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 69 pod2usage( -msg => "Required options: --remote_id --job_id --path_base ", -exitval => 3) unless62 pod2usage( -msg => "Required options: --remote_id --job_id --path_base --recipe", -exitval => 3) unless 70 63 defined($path_base) and 71 64 defined($remote_id) and 65 defined($cmd_recipe) and 72 66 defined($job_id); 67 68 69 70 # Now accessible from a recipe 71 my %remote_recipe = (); 72 { 73 my $verbose = 0; 74 my $conf_cmd = "$ppConfigDump -dump-recipe REMOTE -"; 75 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 76 run(command => $conf_cmd, verbose => $verbose); 77 unless ($success) { 78 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 79 &my_die("Unable to perform ppConfigDump: $error_code", -1, $PS_EXIT_SYS_ERROR); 80 } 81 my $mdcParser = PS::IPP::Metadata::Config->new; 82 my $metadata = $mdcParser->parse(join "", @$stdout_buf); 83 84 my $active_recipe = ''; 85 my %recipes = (); 86 87 # print Dumper($metadata); 88 foreach my $entry (@{ $metadata }) { 89 if (${ $entry }{name} eq 'ACTIVE') { 90 $active_recipe = ${ $entry }{value}; # Not actually used 91 } 92 else { 93 if (${ $entry }{class} eq 'metadata') { # A real recipe 94 my $name = ${ $entry }{name}; 95 foreach my $tentry (@{ ${ $entry }{value} }) { 96 if (${ $tentry }{class} eq 'scalar') { # A recipe value 97 $recipes{$name}{${ $tentry }{name}} = ${ $tentry }{value}; 98 } 99 elsif (${ $tentry }{class} eq 'metadata') { # A recipe array 100 foreach my $arr_entry (@{ ${ $tentry }{value} }) { 101 push @{ $recipes{$name}{${ $tentry }{name}} }, ${ $arr_entry }{value}; 102 } 103 } 104 } 105 } 106 } 107 } 108 109 unless (exists($recipes{$cmd_recipe})) { &my_die("Cannot find recipe $cmd_recipe", -1, $PS_EXIT_CONFIG_ERROR) }; 110 # print Dumper(%recipes); 111 %remote_recipe = %{ $recipes{$cmd_recipe} }; # Select the appropriate recipe. 112 # print Dumper(\%remote_recipe); 113 } 114 115 116 # Hard coded values 117 my $DMZ_HOST = $remote_recipe{DMZ_HOST}; 118 my @SEC_HOSTS= @{ $remote_recipe{SEC_HOST} }; 119 my $SEC_HOST; 120 if ($#SEC_HOSTS != -1) { 121 $SEC_HOST = $SEC_HOSTS[int(rand(@SEC_HOSTS))]; 122 } 123 else { 124 $SEC_HOST = ''; 125 } 126 my $IPP_PATH = $remote_recipe{IPP_PATH}; 127 my $remote_root = $remote_recipe{REMOTE_ROOT}; 128 73 129 74 130 my $ipprc = PS::IPP::Config->new( $camera ) or &my_die( "Unable to set up", $remote_id); … … 351 407 my $file = shift; 352 408 my $destination = shift; 353 my $cmd = "$scp $file ${DMZ_HOST}:${SEC_HOST}:${destination}"; 409 my $cmd; 410 if ($SEC_HOST ne '') { 411 $cmd = "$scp $file ${DMZ_HOST}:${SEC_HOST}:${destination}"; 412 } 413 else { 414 $cmd = "$scp $file ${DMZ_HOST}:${destination}"; 415 } 354 416 355 417 my $directory = dirname($destination); … … 367 429 my $destination = shift; 368 430 my $file = shift; 369 370 my $cmd = "$scp ${DMZ_HOST}:${SEC_HOST}:${destination} $file "; 431 my $cmd; 432 if ($SEC_HOST ne '') { 433 $cmd = "$scp ${DMZ_HOST}:${SEC_HOST}:${destination} $file "; 434 } 435 else { 436 $cmd = "$scp $file ${DMZ_HOST}:${destination}"; 437 } 371 438 372 439 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = … … 380 447 sub ssh_exec_command { 381 448 my $cmd = shift; 382 $cmd = "$ssh -n $DMZ_HOST ssh ${SEC_HOST} $cmd"; 449 450 if ($SEC_HOST ne '') { 451 $cmd = "$ssh -n $DMZ_HOST ssh ${SEC_HOST} $cmd"; 452 } 453 else { 454 $cmd = "$ssh -n $DMZ_HOST $cmd"; 455 } 456 383 457 print "EXEC: $cmd\n"; 384 458 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = … … 511 585 } 512 586 elsif ($stage eq 'staticsky') { 513 # ($class_id, $stage_id) = $file =~ /(/;587 ($class_id, $stage_id) = $file =~ /(skycell.\d\d\d\d.\d\d\d).sky.(\d*).dbinfo/; 514 588 } 515 589 elsif ($stage eq 'diff') { 516 # ($class_id,$stage_id) = $file =~ /(/;590 ($class_id,$stage_id) = $file =~ /(skycell.\d\d\d\d.\d\d\d).WS.dif.(\d*).dbinfo/; 517 591 } 518 592 elsif ($stage eq 'ff') { 519 # ($class_id,$stage_id) = $file =~ /(/;593 ($class_id,$stage_id) = $file =~ /wrp\.(\d*).ff.(\d*).dbinfo/; 520 594 } 521 595 return ($stage_id, $class_id); … … 548 622 $class_id = 0; 549 623 } 624 elsif ($stage eq 'staticsky') { 625 ($class_id, $stage_id, $component) = $file =~ /(skycell.\d\d\d\d.\d\d\d).sky.(\d*).([\w\.]+)$/; 626 } 627 elsif ($stage eq 'diff') { 628 ($class_id,$stage_id, $component) = $file =~ /(skycell.\d\d\d\d.\d\d\d).WS.dif.(\d*).([\w\.]+)$/; 629 } 630 elsif ($stage eq 'ff') { 631 ($class_id,$stage_id, $component) = $file =~ /wrp\.(\d*).ff.(\d*).([\w\.]+)$/; 632 } 633 550 634 return($stage_id,$class_id,$component); 551 635 } -
trunk/ippTasks/remote.pro
r38126 r38168 20 20 $remoteExec_DB = 0 21 21 $remotePoll_DB = 0 22 $REMOTE_RECIPE = 0 23 22 24 23 25 list STAGES … … 94 96 active true 95 97 end 98 end 99 100 macro set.remote.recipe 101 if ($0 != 2) 102 echo "USAGE: set.remote.recipe (recipe_name)" 103 break 104 end 105 $REMOTE_RECIPE = $1 96 106 end 97 107 … … 273 283 if ($N == 0) break 274 284 if ($NETWORK == 0) break 285 if ($REMOTE_RECIPE == 0) break 275 286 276 287 book getpage remotePrepCompRuns 0 -var pageName -key pantaskState INIT … … 287 298 288 299 if ("$STAGE" == "chip") 289 $command = sc_prepare_chip.pl --c amera GPC1 --chip_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME300 $command = sc_prepare_chip.pl --chip_id $STAGE_ID 290 301 end 291 302 if ("$STAGE" == "camera") 292 $command = sc_prepare_camera.pl --cam era GPC1 --cam_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME303 $command = sc_prepare_camera.pl --cam_id $STAGE_ID 293 304 end 294 305 if ("$STAGE" == "warp") 295 $command = sc_prepare_warp.pl -- camera GPC1 --warp_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME306 $command = sc_prepare_warp.pl --warp_id $STAGE_ID 296 307 end 297 308 if ("$STAGE" == "stack") 298 $command = sc_prepare_stack.pl -- camera GPC1 --stack_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME309 $command = sc_prepare_stack.pl --stack_id $STAGE_ID 299 310 end 300 311 if ("$STAGE" == "staticsky") 301 $command = sc_prepare_staticsky.pl -- camera GPC1 --sky_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME312 $command = sc_prepare_staticsky.pl --sky_id $STAGE_ID 302 313 end 303 314 if ("$STAGE" == "diff") 304 $command = sc_prepare_diff.pl --camera GPC1 --diff_id $STAGE_ID --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME 305 end 315 $command = sc_prepare_diff.pl --diff_id $STAGE_ID 316 end 317 if ("$STAGE" == "ff") 318 $command = sc_prepare_ff.pl --ff_id $STAGE_ID 319 end 320 321 # Common elements 322 $command = $command --recipe $REMOTE_RECIPE --camera GPC1 --remote_id $REMOTE_ID --path_base $outroot --dbname $DBNAME 306 323 307 324 options $pageName … … 391 408 if ($N == 0) break 392 409 if ($NETWORK == 0) break 410 if ($REMOTE_RECIPE == 0) break 393 411 394 412 book getpage remotePrepRuns 0 -var pageName -key pantaskState INIT … … 404 422 sprintf outroot "%s/remote_%s.%s" $PATH_BASE $STAGE $REMOTE_ID 405 423 406 $command = sc_prepare_run.pl --camera GPC1 --remote_id $REMOTE_ID --stage $STAGE --path_base $outroot --dbname $DBNAME 424 $command = sc_prepare_run.pl --camera GPC1 --remote_id $REMOTE_ID --stage $STAGE --path_base $outroot --dbname $DBNAME --recipe $REMOTE_RECIPE 407 425 408 426 options $pageName … … 491 509 if ($N == 0) break 492 510 if ($NETWORK == 0) break 511 if ($REMOTE_RECIPE == 0) break 493 512 494 513 book getpage remoteExecRuns 0 -var pageName -key pantaskState INIT … … 505 524 sprintf outroot "%s/remote_%s.%s" $PATH_BASE $STAGE $REMOTE_ID 506 525 507 $command = sc_remote_exec.pl --remote_id $REMOTE_ID --path_base $outroot --verbose --dbname $DBNAME --camera GPC1 526 $command = sc_remote_exec.pl --remote_id $REMOTE_ID --path_base $outroot --verbose --dbname $DBNAME --camera GPC1 --recipe $REMOTE_RECIPE 508 527 509 528 options $pageName … … 593 612 if ($N == 0) break 594 613 if ($NETWORK == 0) break 614 if ($REMOTE_RECIPE == 0) break 595 615 596 616 book getpage remotePollRuns 0 -var pageName -key pantaskState INIT … … 609 629 # This can't have an invalid job_id 610 630 if ($JOB_ID == -1) break 611 $command = sc_remote_poll.pl --remote_id $REMOTE_ID --path_base $outroot --verbose --dbname $DBNAME --camera GPC1 --job_id $JOB_ID 631 $command = sc_remote_poll.pl --remote_id $REMOTE_ID --path_base $outroot --verbose --dbname $DBNAME --camera GPC1 --job_id $JOB_ID --recipe $REMOTE_RECIPE 612 632 613 633 options $pageName -
trunk/ippTools/share/Makefile.am
r38157 r38168 528 528 remotetool_definebyquery_staticsky.sql \ 529 529 remotetool_definebyquery_diff.sql \ 530 remotetool_definebyquery_ff.sql \ 530 531 remotetool_dropcomponent.sql \ 531 532 remotetool_listcomponent.sql \ -
trunk/ippTools/src/remotetool.c
r38080 r38168 166 166 else if (!strcmp(stage,"diff")) { 167 167 query = pxDataGet("remotetool_definebyquery_diff.sql"); 168 if (!query) { 169 psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement"); 170 return(false); 171 } 172 173 if (label) { 174 psStringAppend(&whereOption, "\n AND (label = '%s')", label); 175 } 176 } 177 else if (!strcmp(stage,"ff")) { 178 query = pxDataGet("remotetool_definebyquery_ff.sql"); 168 179 if (!query) { 169 180 psError(PXTOOLS_ERR_SYS,false, "failed to retreive SQL statement"); -
trunk/ippconfig/recipes/Makefile.am
r34212 r38168 33 33 nightly_science.config \ 34 34 ppBackground.mdc \ 35 pstamp.config 35 pstamp.config \ 36 remote_hosts.config 36 37 37 38 install_DATA = $(install_files) -
trunk/ippconfig/recipes/remote_hosts.config
r38144 r38168 5 5 6 6 SEC_HOST MULTI 7 SEC_HOST STR mu-fe1 8 SEC_HOST STR mu-fe2 9 SEC_HOST STR mu-fe3 10 SEC_HOST STR mu-fe4 7 SEC_HOST METADATA 8 SEC_HOST1 STR mu-fe1 9 SEC_HOST2 STR mu-fe2 10 SEC_HOST3 STR mu-fe3 11 SEC_HOST4 STR mu-fe4 11 12 END 12 13 13 14 IPP_PATH STR /turquoise/usr/projects/cosmo/mswarren/ipp/ 14 15 REMOTE_ROOT STR /scratch3/watersc1/ 15 REMOTE_HOSTNAME STR LANL/Mustang 16 REMOTE_HOSTNAME STR LANL/Mustang 17 18 # This is used to decide if we bring back warp images, and if stack should ask for local copies. 19 TRANSFER_WARP_IMAGES BOOL FALSE 20 21 PROC_PER_NODE S32 24 22 MIN_NODES S32 1 23 MAX_NODES S32 1000 24 MIN_TIME S32 1 25 MAX_TIME S32 8 16 26 END 17 27 … … 20 30 21 31 SEC_HOST MULTI 32 SEC_HOST METADATA 22 33 END 23 34 … … 25 36 REMOTE_ROOT STR /lus/scratch/watersc/ 26 37 REMOTE_HOSTNAME STR UH/Cray 38 39 TRANSFER_WARP_IMAGES BOOL FALSE 40 41 PROC_PER_NODE S32 20 42 MIN_NODES S32 1 43 MAX_NODES S32 10 44 MIN_TIME S32 1 45 MAX_TIME S32 8 27 46 END -
trunk/ippconfig/system.config
r37415 r38168 66 66 PSVIDEOPHOT STR recipes/psvideophot.config # video cell photometry 67 67 PSTAMP STR recipes/pstamp.config # postage stamp server 68 REMOTE STR recipes/remote_hosts.config # Remote supercomputer processing 68 69 END
Note:
See TracChangeset
for help on using the changeset viewer.
