From b8c0577b549ec4bbe717b679f623698e6d833f03 Mon Sep 17 00:00:00 2001 From: Digimer Date: Wed, 22 Jan 2020 15:21:35 -0500 Subject: [PATCH] * Fixed several issues with the fence configuration menu in striker. * Added filters Striker->get_fence_data() for parameters. Manually change 'action' entries from 'string' to 'select' and use the data in the 'actions' element to populate it, with actions that don't make sense filtered out. Signed-off-by: Digimer --- Anvil/Tools/Striker.pm | 50 +++++- cgi-bin/striker | 324 ++++++++++++++++++++++------------ html/skins/alteeve/anvil.html | 146 ++++++++++++++- html/skins/alteeve/main.css | 8 + notes | 3 + share/words.xml | 10 +- tools/test.pl | 24 ++- 7 files changed, 437 insertions(+), 128 deletions(-) diff --git a/Anvil/Tools/Striker.pm b/Anvil/Tools/Striker.pm index 71e8f0b2..44375b52 100644 --- a/Anvil/Tools/Striker.pm +++ b/Anvil/Tools/Striker.pm @@ -129,7 +129,6 @@ sub get_fence_data $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "fences::${fence_agent}::description" => $anvil->data->{fences}{$fence_agent}{description}, }}); - if (exists $agent_ref->{'resource-agent'}->{'symlink'}) { if (ref($agent_ref->{'resource-agent'}->{'symlink'}) eq "ARRAY") @@ -155,7 +154,13 @@ sub get_fence_data foreach my $hash_ref (@{$agent_ref->{'resource-agent'}->{parameters}{parameter}}) { - my $name = $hash_ref->{name}; + # We ignore some parameters that are not useful parameters in our case. + my $name = $hash_ref->{name}; + next if $name eq "help"; + next if $name eq "version"; + next if $name eq "delay"; + next if $name eq "separator"; + my $unique = exists $hash_ref->{unique} ? $hash_ref->{unique} : 0; my $required = exists $hash_ref->{required} ? $hash_ref->{required} : 0; my $deprecated = exists $hash_ref->{deprecated} ? $hash_ref->{deprecated} : 0; @@ -177,10 +182,39 @@ sub get_fence_data "fences::${fence_agent}::parameters::${name}::switches" => $anvil->data->{fences}{$fence_agent}{parameters}{$name}{switches}, "fences::${fence_agent}::parameters::${name}::content_type" => $anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type}, }}); - if ($anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type} eq "string") + + # 'action' is a string, but it has a set list of allowed values, so we manually switch it to a 'select' for the web interface + if ($name eq "action") + { + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type} = "select"; + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{options} = []; + + # Read the action + print "Agent: [".$fence_agent."]; actions (default: [".$anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'}."]);\n"; + foreach my $array_ref (sort {$a cmp $b} @{$agent_ref->{'resource-agent'}->{actions}->{action}}) + { + # There are several options that don't make sense for us. + next if $array_ref->{name} eq "list"; + next if $array_ref->{name} eq "monitor"; + next if $array_ref->{name} eq "manpage"; + next if $array_ref->{name} eq "status"; + next if $array_ref->{name} eq "validate-all"; + next if $array_ref->{name} eq "list-status"; + next if $array_ref->{name} eq "metadata"; + next if $array_ref->{name} eq "on"; + + push @{$anvil->data->{fences}{$fence_agent}{parameters}{$name}{options}}, $array_ref->{name}; + } + + foreach my $option (sort {$a cmp $b} @{$anvil->data->{fences}{$fence_agent}{parameters}{$name}{options}}) + { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { option => $option }}); + } + } + elsif ($anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type} eq "string") { - my $string_default = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; - $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = $string_default; + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "fences::${fence_agent}::parameters::${name}::default" => $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'}, }}); @@ -205,8 +239,7 @@ sub get_fence_data elsif ($anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type} eq "second") { # Nothing to collect here. - my $second_default = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; - $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = $second_default; + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "fences::${fence_agent}::parameters::${name}::default" => $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'}, }}); @@ -214,8 +247,7 @@ sub get_fence_data elsif ($anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type} eq "integer") { # Nothing to collect here. - my $integer_default = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : ""; - $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = $integer_default; + $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} = exists $hash_ref->{content}->{'default'} ? $hash_ref->{content}->{'default'} : "";; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "fences::${fence_agent}::parameters::${name}::default" => $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'}, }}); diff --git a/cgi-bin/striker b/cgi-bin/striker index 335e03fc..9fea347f 100755 --- a/cgi-bin/striker +++ b/cgi-bin/striker @@ -1543,7 +1543,7 @@ sub process_fences my ($anvil) = @_; # Read/process the unified fences metadata. - $anvil->Striker->get_fence_data({debug => 2}); + $anvil->Striker->get_fence_data({debug => 3}); $anvil->data->{cgi}{fence_agent}{value} = "" if not defined $anvil->data->{cgi}{fence_agent}{value}; $anvil->data->{cgi}{fence_count}{value} = 2 if not defined $anvil->data->{cgi}{fence_count}{value}; @@ -1552,137 +1552,241 @@ sub process_fences "cgi::fence_count::value" => $anvil->data->{cgi}{fence_count}{value}, }}); - # For each agent, we'll create a
with it's options that will be shown/hidden basen on the agent - # select box. - my $agents = []; - my $description_form = ""; - foreach my $fence_agent (sort {$a cmp $b} keys %{$anvil->data->{fences}}) - { - # We don't care about IPMI-based fence agents here. - next if $fence_agent eq "fence_drac5"; - next if $fence_agent eq "fence_idrac"; - next if $fence_agent =~ /^fence_ilo/; - next if $fence_agent eq "fence_imm"; - next if $fence_agent eq "fence_ipmilan"; - next if $fence_agent eq "fence_redfish"; - next if $fence_agent eq "fence_rsa"; - - push @{$agents}, $fence_agent; - - my $agent_description = $anvil->data->{fences}{$fence_agent}{description}; - $agent_description =~ s/\n/
/gs; - $agent_description =~ s/
/
\n/gs; - $agent_description =~ s/(http:\/\/.*)\n/$1<\/a>/gs; - $agent_description =~ s/(https:\/\/.*)\n/$1<\/a>/gs; - $agent_description =~ s/(http:\/\/.*) /$1<\/a> /gs; - $agent_description =~ s/(https:\/\/.*) /$1<\/a> /gs; + # Are we configuring an agent/device? + if ($anvil->data->{cgi}{fence_agent}{value}) + { + my $fence_agent = $anvil->data->{cgi}{fence_agent}{value}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { fence_agent => $fence_agent }}); + + my $agent_description = format_fence_description($anvil, $fence_agent, $anvil->data->{fences}{$fence_agent}{description}); - # There's a table in the fence_azure_arm agent, this formats it - if ($fence_agent eq "fence_azure_arm") + # Walk through the list of options + my $option_form = ""; + foreach my $i (1..$anvil->data->{cgi}{fence_count}{value}) { - my $in_pre = 0; - my $break_number = 0; - my $new_desctiption = ""; - foreach my $line (split/\n/, $agent_description) + my $say_device = $anvil->Words->string({key => "striker_0216", variables => { number => $i }}); + my $device_options = ""; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + i => $i, + say_device => $say_device, + }}); + + foreach my $name (sort {$a cmp $b} keys %{$anvil->data->{fences}{$fence_agent}{parameters}}) { - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); - if ($line =~ /\+---/) + # We don't show deprecated or replaced options. + next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{replacement}; + next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{deprecated}; + my $option_key = $name."_".$i; + my $unique = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{unique}; + my $required = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{required}; + my $description = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{description}; + my $type = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type}; + my $default = exists $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} ? $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} : ""; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { + option_key => $option_key, + unique => $unique, + required => $required, + description => $description, + type => $type, + 'default' => $default, + }}); + + # Set the cgi variable to the default, if not already set. + $anvil->data->{cgi}{$option_key}{value} = $default if not defined $anvil->data->{cgi}{$option_key}{value}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "cgi::".$option_key."::value" => $anvil->data->{cgi}{$option_key}{value}, + }}); + + # Set the CGI default if not already set. + $anvil->data->{cgi}{$option_key}{value} = $default if not exists $anvil->data->{cgi}{$option_key}{value}; + if ($type eq "select") { - $line =~ s/
//g; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { break_number => $break_number }}); - if (not $break_number) + # Build the select box + my $options = []; + foreach my $option (sort {$a cmp $b} @{$anvil->data->{fences}{$fence_agent}{parameters}{$name}{options}}) { - $in_pre = 1; - $new_desctiption .= "
\n";
-						$new_desctiption .= $line."\n";
-						$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { new_desctiption => $new_desctiption }});
+						push @{$options}, $option;
 					}
-					elsif ($break_number == 2)
-					{
-						$in_pre          =  0;
-						$new_desctiption .= $line."\n";
-						$new_desctiption .= "
\n"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { new_desctiption => $new_desctiption }}); - } - else - { - $new_desctiption .= $line."\n"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { new_desctiption => $new_desctiption }}); - } - $break_number++; + + my $select_options = $anvil->Template->select_form({ + name => $option_key, + options => $options, + blank => $required ? 0 : 1, + 'sort' => 1, + selected => $anvil->data->{cgi}{$option_key}{value}, + class => $required ? "input_required" : "input_clear", + }); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { select_options => $select_options }}); + + # Build the entry + my $select_form .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-option-entry", variables => { + name => $name, + option => $select_options, + description => $description, + }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { select_form => $select_form }}); + + $device_options .= $select_form; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { device_options => $device_options }}); + } + elsif ($type eq "boolean") + { + # Build the entry + my $checkbox_form .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-checkbox-entry", variables => { + name => $name, + checkbox_name => $option_key, + checkbox_checked => $anvil->data->{cgi}{$option_key}{value} ? "checked" : "", + description => $description, + }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { checkbox_form => $checkbox_form }}); + + $device_options .= $checkbox_form; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { device_options => $device_options }}); } else { - if ($in_pre) - { - $line =~ s/
//g; - } - $new_desctiption .= $line."\n"; + ### String, Second or Integer. + # Build the entry + my $string_options .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-input-entry", variables => { + name => $name, + key => $option_key, + value => $anvil->data->{cgi}{$option_key}{value}, + 'default' => $default, + class => $required ? "input_required" : "input_clear",, + description => $description, + }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { string_options => $string_options }}); + + $device_options .= $string_options; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { device_options => $device_options }}); } } - $agent_description = $new_desctiption; + + $option_form .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-option-menu", variables => { + device_name => $say_device, + device_options => $device_options, + }}); } - $description_form .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-description", variables => { - fence_agent => $fence_agent, - description => $agent_description, + $anvil->data->{form}{back_link} = "?anvil=true&task=fences"; + $anvil->data->{form}{body} = $anvil->Template->get({file => "anvil.html", name => "fence-agent-configuration", variables => { + description => $agent_description, + options => $option_form, }}); -=cut - foreach my $name (sort {$a cmp $b} keys %{$anvil->data->{fences}{$fence_agent}{parameters}}) + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { 'form::body' => $anvil->data->{form}{body} }}); + } + else + { + # For each agent, we'll create a
with it's options that will be shown/hidden basen on the agent + # select box. + my $agents = []; + my $description_form = ""; + foreach my $fence_agent (sort {$a cmp $b} keys %{$anvil->data->{fences}}) { - # We don't show deprecated or replaced options. - next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{replacement}; - next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{deprecated}; - my $unique = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{unique}; - my $required = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{required}; - my $description = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{description}; - my $switches = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{switches}; - my $type = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type}; - my $star = $required ? "*" : ""; - my $default = exists $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} ? $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} : ""; - if ($type eq "select") + # We don't care about IPMI-based fence agents here. + next if $fence_agent eq "fence_drac5"; + next if $fence_agent eq "fence_idrac"; + next if $fence_agent =~ /^fence_ilo/; + next if $fence_agent eq "fence_imm"; + next if $fence_agent eq "fence_ipmilan"; + next if $fence_agent eq "fence_redfish"; + next if $fence_agent eq "fence_rsa"; + + push @{$agents}, $fence_agent; + + my $agent_description = format_fence_description($anvil, $fence_agent, $anvil->data->{fences}{$fence_agent}{description}); + + $description_form .= $anvil->Template->get({file => "anvil.html", name => "fence-agent-description", variables => { + name => $fence_agent, + description => $agent_description, + }}); + } + + my $fence_agent_select = $anvil->Template->select_form({ + name => "fence_agent", + options => $agents, + blank => 0, + 'sort' => 1, + selected => $anvil->data->{cgi}{fence_agent}{value} ? $anvil->data->{cgi}{fence_agent}{value} : "fence_apc_snmp", + class => "input_clear", + }); + my $fence_count_select = $anvil->Template->select_form({ + name => "fence_count", + options => [1, 2, 3, 4], + blank => 0, + 'sort' => 0, + selected => $anvil->data->{cgi}{fence_count}{value}, + class => "input_clear", + }); + + $anvil->data->{form}{back_link} = "?anvil=true&task=create"; + $anvil->data->{form}{body} = $anvil->Template->get({file => "anvil.html", name => "fence-agent-menu", variables => { + fence_select => $fence_agent_select, + fence_count => $fence_count_select, + descriptions => $description_form, + existing_fences => "", + }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { 'form::body' => $anvil->data->{form}{body} }}); + } + + return(0); +} + +sub format_fence_description +{ + my ($anvil, $fence_agent, $agent_description) = @_; + + # Replace newlines with
elements. + $agent_description =~ s/\n/
/gs; + $agent_description =~ s/
/
\n/gs; + + # Handle fence_azure_arm. + if ($fence_agent eq "fence_azure_arm") + { + my $in_pre = 0; + my $break_number = 0; + my $new_desctiption = ""; + foreach my $line (split/\n/, $agent_description) + { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { line => $line }}); + if ($line =~ /\+---/) { - # Build the select box - my @options = (); - foreach my $option (sort @{$anvil->data->{fences}{$fence_agent}{parameters}{$name}{options}}) + $line =~ s/
//g; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { break_number => $break_number }}); + if (not $break_number) { - push @options, $option; + $in_pre = 1; + $new_desctiption .= "
\n";
+					$new_desctiption .= $line."\n";
+					$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { new_desctiption => $new_desctiption }});
 				}
+				elsif ($break_number == 2)
+				{
+					$in_pre          =  0;
+					$new_desctiption .= $line."\n";
+					$new_desctiption .= "
\n"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { new_desctiption => $new_desctiption }}); + } + else + { + $new_desctiption .= $line."\n"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { new_desctiption => $new_desctiption }}); + } + $break_number++; + } + else + { + if ($in_pre) + { + $line =~ s/
//g; + } + $new_desctiption .= $line."\n"; } } -=cut + $agent_description = $new_desctiption; } - my $fence_agent_select = $anvil->Template->select_form({ - name => "fence_agent", - options => $agents, - blank => 0, - 'sort' => 1, - selected => $anvil->data->{cgi}{fence_agent}{value}, - class => "input_clear", - }); - my $fence_count_select = $anvil->Template->select_form({ - name => "fence_count", - options => [1, 2, 3, 4], - blank => 0, - 'sort' => 0, - selected => $anvil->data->{cgi}{fence_count}{value}, - class => "input_clear", - }); - - $anvil->data->{form}{back_link} = "?anvil=true&task=create"; - $anvil->data->{cgi}{task}{value} = "" if not defined $anvil->data->{cgi}{task}{value}; - $anvil->data->{cgi}{subtask}{value} = "" if not defined $anvil->data->{cgi}{subtask}{value}; - $anvil->data->{cgi}{action}{value} = "" if not defined $anvil->data->{cgi}{action}{value}; - $anvil->data->{form}{body} = $anvil->Template->get({file => "anvil.html", name => "fence-agent-menu", variables => { - fence_select => $fence_agent_select, - fence_count => $fence_count_select, - descriptions => $description_form, - existing_fences => "", - }}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { 'form::body' => $anvil->data->{form}{body} }}); - - return(0); + return($agent_description); } # This handles creating an Anvil! from an existing manifest diff --git a/html/skins/alteeve/anvil.html b/html/skins/alteeve/anvil.html index caa35f28..8329efe1 100644 --- a/html/skins/alteeve/anvil.html +++ b/html/skins/alteeve/anvil.html @@ -58,6 +58,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+   +
+ + + #!string!striker_0215!# +
+   + + #!string!striker_0218!# +
+   + + #!variable!description!# +
+   +
+ #!string!striker_0219!# +
+
+ + #!variable!options!# + + + +
+ + + +
+
+
+   +
+ + + + + + #!variable!device_name!# + + + #!variable!device_options!# + + + + + + #!variable!name!#   + + + #!variable!option!# + + +   #!variable!description!# + + + + + + + + #!variable!name!#   + + + + + +   #!variable!description!# + + + + + + + + #!variable!name!#   + + + + + +   #!variable!description!# + + + + @@ -141,28 +258,45 @@
+ +
+
- -
- #!variable!descriptions!# -
+   + + + + + + + + + + +
+ #!string!striker_0214!# +
+ + #!variable!descriptions!#
+   +
- + - #!variable!fence_agent!#
+ #!variable!name!# #!variable!description!# diff --git a/html/skins/alteeve/main.css b/html/skins/alteeve/main.css index 551e39ec..ccdadafb 100644 --- a/html/skins/alteeve/main.css +++ b/html/skins/alteeve/main.css @@ -198,6 +198,14 @@ input[type=text].input_alert, input[type=number].input_alert, select.input_alert border: 1px solid #ff3f3f; } +input[type=text].input_required, input[type=number].input_required, select.input_required { + border: 1px solid #7f7fff; +} + +.say_required { + color: #7f7fff; +} + input[type=text].input_clear, input[type=number].input_clear, select.input_clear { border: 1px solid #9ba0a5; } diff --git a/notes b/notes index 42a42684..3136bb83 100644 --- a/notes +++ b/notes @@ -1349,3 +1349,6 @@ Striker Version: 2.0.7 + + + diff --git a/share/words.xml b/share/words.xml index 2326cbef..26c405a6 100644 --- a/share/words.xml +++ b/share/words.xml @@ -836,7 +836,7 @@ Here we will inject 't_0006', which injects 't_0001' which has a variable: [#!st Anvil! Striker ScanCore - Alteeve's Niche! Inc., Toronto, Ontario, Canada]]> + Alteeve's Niche! Inc., Toronto, Ontario, Canada]]> Anvil!]]> Node DR Host @@ -1081,7 +1081,13 @@ If you are comfortable that the target has changed for a known reason, you can s Fence devices are used to force a node that has entered an unknown state into a known state. Recovery after a node fault can not proceed until this happens, so this step is critically important. Note: Any IPMI (iRMC, iLO, DRAC, etc) fence config will be handled in the host's config. This section configures shared devices, like PDUs. The ports/outlets a given node will use will be set in the install manifest later. How Many? - Known fence devices: + Configure fence devices: + List of fence agents installed on this system: + Configuring #!data!cgi::fence_agent::value!#. + Configure device #!variable!number!#: + Options description (from the agent's metadata): + Note: Names and descriptions come from the fence agent itself + Required field #!variable!number!#/sec diff --git a/tools/test.pl b/tools/test.pl index 1bd7979c..f90c0971 100755 --- a/tools/test.pl +++ b/tools/test.pl @@ -38,7 +38,29 @@ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure = # print "iso: [".$iso."] -> [".$anvil->data->{sys}{languages}{$iso}."]\n"; #} -# $anvil->Striker->get_fence_data({debug => 3}); +$anvil->Striker->get_fence_data({debug => 3}); + +my $fence_agent = "fence_apc_snmp"; +print "Fence agent: [".$fence_agent."]\n"; +foreach my $name (sort {$a cmp $b} keys %{$anvil->data->{fences}{$fence_agent}{parameters}}) +{ + next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{replacement}; + next if $anvil->data->{fences}{$fence_agent}{parameters}{$name}{deprecated}; + my $unique = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{unique}; + my $required = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{required}; + my $description = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{description}; + my $type = $anvil->data->{fences}{$fence_agent}{parameters}{$name}{content_type}; + my $default = exists $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} ? $anvil->data->{fences}{$fence_agent}{parameters}{$name}{'default'} : ""; + print "- name: [$name], default: [".$default."]\n"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + name => $name, + unique => $unique, + required => $required, + description => $description, + type => $type, + 'default' => $default, + }}); +} # foreach my $fence_agent (sort {$a cmp $b} keys %{$anvil->data->{fences}}) # {