diff --git a/Targets/Letsencrypt/Letsencrypt-Custom.pm b/Targets/Letsencrypt/Letsencrypt-Custom.pm
new file mode 100644
index 0000000..271a526
--- /dev/null
+++ b/Targets/Letsencrypt/Letsencrypt-Custom.pm
@@ -0,0 +1,97 @@
+#
+# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+#
+#
+# Routines to be edited by the developer to provide validation for parameters
+# and provison of the control data for table(s)
+#
+use esmith::util;
+use esmith::HostsDB;
+use esmith::AccountsDB;
+use esmith::NetworksDB;
+use esmith::HostsDB;
+use esmith::DomainsDB;
+
+
+#The most common ones
+our $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
+our $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
+our $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
+our $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
+our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
+
+# Validation routines - parameters for each panel
+
+ sub validate_LIST {
+ my $c = shift;
+ my $prefix_data = shift; #Data hash as parameter
+ my $ret = 'ok';
+ return $ret;
+ }
+
+ sub validate_PARAMS {
+ my $c = shift;
+ my $prefix_data = shift; #Data hash as parameter
+ my $ret = 'ok';
+ return $ret;
+ }
+
+
+# Get control data for tables(s)
+
+ sub get_DomainList {
+ # Return an array of hashes of the contents for each row and column for DomainList
+ # default is a single row of strings "col1header-1, col2header-1, col3Header-1 etc"
+ my $c = shift;
+ my $control_data = $c->stash('DomainList');
+ my @ret = {};
+# foreach my $colHead (@$control_data) {
+# my ret{$colHead} = "$colhead-1";
+# };
+ return \@ret;
+ }
+
+
+# Return hash with values from row in which link clicked on table
+
+ sub get_selected_LIST {
+ my $c = shift;
+ my $selected = shift; #Parameter is name of selected row.
+ my $is_new_record = shift; #Indicates new record required (defaults)
+ my %ret = {};
+ return $ret;
+ }
+
+ sub get_selected_PARAMS {
+ my $c = shift;
+ my $selected = shift; #Parameter is name of selected row.
+ my $is_new_record = shift; #Indicates new record required (defaults)
+ my %ret = {};
+ return $ret;
+ }
+
+
+#after sucessful modify or create or whatever and submit then perfom (if the params validate)
+
+ sub perform_LIST {
+ my $c = shift;
+ my $prefix_data = shift; #Data hash as parameter
+ my $ret = 'ok';
+ return $ret;
+ }
+
+ sub perform_PARAMS {
+ my $c = shift;
+ my $prefix_data = shift; #Data hash as parameter
+ my $ret = 'ok';
+ return $ret;
+ }
+
+
+sub create_link{
+ # WIP
+ my ($c,$route, $panel, $index) = shift;
+ my $link = "$route?trt=$panel&Selected=$index";
+ return $link;
+}
+1;
\ No newline at end of file
diff --git a/Targets/Letsencrypt/Letsencrypt.pm b/Targets/Letsencrypt/Letsencrypt.pm
new file mode 100644
index 0000000..7b75d3e
--- /dev/null
+++ b/Targets/Letsencrypt/Letsencrypt.pm
@@ -0,0 +1,267 @@
+package SrvMngr::Controller::Letsencrypt;
+#
+# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+#
+#----------------------------------------------------------------------
+# heading : Miscellaneous
+# description : letsencrypt
+# navigation : 2000 400
+#
+# name : letsencrypt, method : get, url : /letsencrypt, ctlact : Letsencrypt#main
+# name : letsencryptu, method : post, url : /letsencryptu, ctlact : Letsencrypt#do_update
+# name : letsencryptd, method : get, url : /letsencryptd, ctlact : Letsencrypt#do_display
+#
+# routes : end
+#
+# Documentation: https://wiki.contribs.org/Letsencrypt
+#----------------------------------------------------------------------
+
+#
+# Scheme of things:
+#
+# TBA!!
+
+use strict;
+use warnings;
+use Mojo::Base 'Mojolicious::Controller';
+
+use constant FALSE => 0;
+use constant TRUE => 1;
+
+use Locale::gettext;
+use SrvMngr::I18N;
+use SrvMngr qw(theme_list init_session);
+
+use Data::Dumper;
+
+use esmith::util;
+use esmith::HostsDB;
+use esmith::AccountsDB;
+use esmith::NetworksDB;
+use esmith::HostsDB;
+use esmith::DomainsDB;
+
+
+#The most common ones
+our $cdb = esmith::ConfigDB->open() || die("Couldn't open config db");
+our $adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
+our $ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
+our $hdb = esmith::HostsDB->open() || die("Couldn't open Hosts db");
+our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
+
+require '/usr/share/smanager/lib/SrvMngr/Controller/Letsencrypt-Custom.pm'; #The code that is to be added by the developer
+
+sub main {
+#
+# Initial entry - route is "/"
+#
+#set initial panel
+#for initial panel:
+ #Specifiy panel to enter
+ #load up _data hash with DB fields
+ #load up stash with pointer(s) to control fields hash(= get-))
+ #and a pointer to the prefix_data hash
+#render initial panel
+
+ my $c = shift;
+ $c->app->log->info( $c->log_req );
+
+ my %lets_data = ();
+ my $title = $c->l('lets_letsencrypt');
+ my $modul = '';
+
+ $lets_data{'trt'} = 'LIST';
+
+ #Load any DB entries into the _data area so as they are preset in the form
+ # which DB - this only really works if the initial panel is a PARAMS type panel and not a TABLE
+ my $db = $cdb; #pickup local or global db or Default to config
+
+
+ # and table control fields
+ $c->stash(DomainList=>$c->get_DomainList());
+
+
+ $c->stash(
+ title => $title,
+ modul => $modul,
+ lets_data => \%lets_data
+ );
+ $c->render( template => "letsencrypt" );
+}
+
+# Post request with params - submit from the form
+sub do_update {
+#
+# Return after submit pushed on panel (this is a post) - route is "/u"
+# parameters in the params hash.
+#
+#load up all params into prefix_data hash:
+#By panel (series of if statements - only one executed):
+ #call validate-PANEL() - return ret = ok or error message
+
+#if validation not ok:
+ #render back to current panel with error message in stash
+#otherwise:
+ #By panel (series of if statements - only one executed):
+ #do whatever is required: call perform-PANEL() - return "ok" or Error Message
+ #call signal-event for any global actions specified (check it exists - error and continue?)
+ #if action smeserver--update exists
+ #signal_event smeserver--update
+ #call signal-event for any specific actions for thids panel (check it exists first - error and continue)
+ #set success in stash
+ #if no "nextpanel" entry:
+ #set firstpanel
+ #else
+ #set nextpanel
+ #call render
+
+ my $c = shift;
+ $c->app->log->info($c->log_req);
+
+ my %lets_data = ();
+ my $title = $c->l('lets_letsencrypt');
+
+ # Accessing all POST parameters
+ my %params = $c->req->params->to_hash;
+
+ # Get number of POST parameters
+ my $num_params = keys %params;
+
+ #Params are available in the hash "params" - copy to the prefix_data hash
+ while (my ($key, $value) = each %{$c->req->params->to_hash}) {
+ $lets_data{$key} = $value;
+ }
+
+ # the value of trt will tell you which panel has returned
+ my $trt = $c->param('trt') || 'LIST'; #hidden control on every form.
+ my $ret = 'ok';
+ #Validate the parameters in a custom sub one for each panel (although only one of these will be executed)
+
+ my $thispanel;
+
+ if ($trt eq 'LIST'){
+ #Validate form parameters for panel LIST
+ $ret = $c->validate_LIST(\%lets_data);
+ $thispanel = 'LIST';
+ }
+
+ if ($trt eq 'PARAMS'){
+ #Validate form parameters for panel PARAMS
+ $ret = $c->validate_PARAMS(\%lets_data);
+ $thispanel = 'PARAMS';
+ }
+
+
+ if ($ret ne "ok") {
+ # return to the panel with error message
+ $c->stash(error => $c->l($ret));
+ $c->render("letsencrypt");
+ } else {
+ #Do whatever is needed, including writing values to the DB
+
+ if ($trt eq 'LIST'){
+ #do whatever is required ...
+ $ret = $c->perform_LIST(\%lets_data);
+ if ($ret ne "ok") {
+ # return to the panel with error message
+ $c->stash(error => $c->l($ret));
+ $c->render("letsencrypt");
+ } else {
+ $c->stash( success => $c->l('lets_LIST_panel_action_was_successful')); #A bit bland - edit it in the lex file
+ }
+ }
+
+ if ($trt eq 'PARAMS'){
+ #do whatever is required ...
+ $ret = $c->perform_PARAMS(\%lets_data);
+ if ($ret ne "ok") {
+ # return to the panel with error message
+ $c->stash(error => $c->l($ret));
+ $c->render("letsencrypt");
+ } else {
+ $c->stash( success => $c->l('lets_PARAMS_panel_action_was_successful')); #A bit bland - edit it in the lex file
+ }
+ }
+
+ # and call any signal-events needed
+
+
+ # Setup shared data and call panel
+ $c->stash(
+ title => $title,
+ lets_data => \%lets_data
+ );
+ if ('none' eq 'none') {
+ $lets_data{'trt'} = 'LIST';
+ } else {
+ $lets_data{'trt'} = 'none';
+ }
+ $c->render("letsencrypt");
+ }
+}
+
+sub do_display {
+#
+# Return after link clicked in table (this is a get) - route is "/d"
+# Expects ?trt=PANEL&selected="TableRowName" plus any other required
+#
+# OR it maybe a post from the main panel to add a new record
+#
+#load up all supplied params into prefix_data hash
+#call get-selected-PANEL() - returns hash of all relevent parameters
+#load up returned hash into prefix_data
+#render - to called panel
+
+ my $c = shift;
+ $c->app->log->info($c->log_req);
+
+ my %lets_data = ();
+ my $title = $c->l('lets_letsencrypt');
+
+ # Accessing all parameters
+ my %params = $c->req->params->to_hash;
+
+ # Get number of parameters
+ my $num_params = keys %params;
+
+ #Tag as Post or Get (ie. create new entry or edit existing one
+ my $is_new_record = ($c->req->method() eq 'POST');
+
+ #Params are available in the hash "params" - copy to the prefix_data hash
+ while (my ($key, $value) = each %{$c->req->params->to_hash}) {
+ $lets_data{$key} = $value;
+ }
+
+ # the value of trt will tell you which panel has returned
+ my $trt = $c->param('trt') || 'LIST'; #Indicates where to go now
+
+ # Now add in the params from the selected row from the table
+
+ my %selectedrow;
+
+ if ($trt eq 'LIST'){
+ #Validate form parameters for panel LIST
+ %selectedrow = $c->get_selected_LIST($lets_data{'Selected'},$is_new_record);
+ }
+
+ if ($trt eq 'PARAMS'){
+ #Validate form parameters for panel PARAMS
+ %selectedrow = $c->get_selected_PARAMS($lets_data{'Selected'},$is_new_record);
+ }
+
+
+ #Copy in the selected row params to the prefix_data hash to pass to the panel
+ while (my ($key, $value) = each %selectedrow){
+ $lets_data{$key} = $value;
+ }
+ # Where to go now
+ $lets_data{'trt'} = $trt;
+
+ # Data for panel
+ $c->stash(
+ title => $title,
+ lets_data => \%lets_data
+ );
+ $c->render("letsencrypt");
+}
+1;
diff --git a/Targets/Letsencrypt/_lets_LIST.html.ep b/Targets/Letsencrypt/_lets_LIST.html.ep
new file mode 100644
index 0000000..51ac398
--- /dev/null
+++ b/Targets/Letsencrypt/_lets_LIST.html.ep
@@ -0,0 +1,71 @@
+%#
+%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+%#
+
+
+
+ %= l('lets_Hello_LIST');
+
+ % my $btn = l('lets_APPLY');
+ %= form_for "Letsencryptd" => (method => 'POST') => begin
+
+ % param 'trt' => $lets_data->{trt} unless param 'trt';
+ %= hidden_field 'trt' => $lets_data->{trt}
+ %# Inputs etc in here.
+
+
<%=l('lets_List_of_Domains')%>
+
+
<%=l('lets_FORM_DESCRIPTION')%>
+
+
+ %=l('lets_Internal_IP')
+
+ % param 'InternalIP' => $lets_data->{InternalIP} unless param 'InternalIP';
+ %= text_field 'InternalIP', size => '50', class => 'textinput InternalIP' , pattern=>'.*' , placeholder=>'InternalIP', Readonly=>'true'
+
+
+
+ %=l('lets_Internet_IP')
+
+ % param 'ObserverIP' => $lets_data->{ObserverIP} unless param 'ObserverIP';
+ %= text_field 'ObserverIP', size => '50', class => 'textinput ObserverIP' , pattern=>'.*' , placeholder=>'ObserverIP', Readonly=>'true'
+
+
+
+
+
+ <%=l('lets_Domain_name_/_HOSTNAME')%> |
+ <%=l('lets_Brief_description')%> |
+ <%=l('lets_Content')%> |
+ <%=l('lets_LABEL_NAMESERVERS')%> |
+ <%=l('lets_LABEL_POINT')%> |
+ <%=l('lets_LABEL_LECERT')%> |
+ <%=l('lets_IS_IN_CERT')%> |
+ <%=l('lets_CHECK')%> |
+
+
+
+ % my $control_data = $self->stash('DomainList');
+ % foreach my $row (@$control_data) {
+
+ <%=$c->render_to_string(inline=>$row->{'Table1-Domain name / HOSTNAME'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-Brief description'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-Content'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-LABEL_NAMESERVERS'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-LABEL_POINT'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-LABEL_LECERT'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-IS_IN_CERT'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Table1-CHECK'})%> |
+
+ %}
+
+
+
+
+ %# Probably finally by a submit.
+ %end
+
diff --git a/Targets/Letsencrypt/_lets_PARAMS.html.ep b/Targets/Letsencrypt/_lets_PARAMS.html.ep
new file mode 100644
index 0000000..7a74d94
--- /dev/null
+++ b/Targets/Letsencrypt/_lets_PARAMS.html.ep
@@ -0,0 +1,97 @@
+%#
+%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+%#
+
+
+
+ %= l('lets_Hello_PARAMS');
+
+ % my $btn = l('lets_APPLY');
+ %= form_for "Letsencryptd" => (method => 'POST') => begin
+
+ % param 'trt' => $lets_data->{trt} unless param 'trt';
+ %= hidden_field 'trt' => $lets_data->{trt}
+ %# Inputs etc in here.
+
+
<%=l('lets_Configuration_for_Letsencrypt')%>
+
+
<%=l('lets_Manage_letsencrypt-config_settings:')%>
+
+
+ %=l('lets_CONFIG_LETSENCRYPT')
+
+
+
+ %=l('lets_SERVICE_STATUS')
+
+ % my @status_options = Disabled;
+ % param 'status' => $lets_data->{status} unless param 'status';
+ %= select_field 'status' => @status_options, class => 'input'
+
+
+
+ %=l('lets_HOOKSCRIPT_STATUS')
+
+ % my @hookScript_options = ;
+ % param 'hookScript' => $lets_data->{hookScript} unless param 'hookScript';
+ %= select_field 'hookScript' => @hookScript_options, class => 'input'
+
+
+
+ %=l('lets_HOSTOVERRIDE_STATUS')
+
+ % my @hostOverride_options = ;
+ % param 'hostOverride' => $lets_data->{hostOverride} unless param 'hostOverride';
+ %= select_field 'hostOverride' => @hostOverride_options, class => 'input'
+
+
+
+ %=l('lets_ACCEPT_TERMS_STATUS')
+
+ % my @ACCEPT_TERMS_options = ;
+ % param 'ACCEPT_TERMS' => $lets_data->{ACCEPT_TERMS} unless param 'ACCEPT_TERMS';
+ %= select_field 'ACCEPT_TERMS' => @ACCEPT_TERMS_options, class => 'input'
+
+
+
+ %=l('lets_API_STATUS')
+
+ % my @API_options = ;
+ % param 'API' => $lets_data->{API} unless param 'API';
+ %= select_field 'API' => @API_options, class => 'input'
+
+
+
+ %=l('lets_KEYSIZE_STATUS')
+
+ % my @keysize_options = ;
+ % param 'keysize' => $lets_data->{keysize} unless param 'keysize';
+ %= select_field 'keysize' => @keysize_options, class => 'input'
+
+
+
+ %=l('lets_CONFIGUREMODE_STATUS')
+
+ % my @configure_options = ;
+ % param 'configure' => $lets_data->{configure} unless param 'configure';
+ %= select_field 'configure' => @configure_options, class => 'input'
+
+
+
+ %=l('lets_EMAIL')
+
+ % param 'email' => $lets_data->{email} unless param 'email';
+ %= text_field 'email', size => '50', class => 'textinput email' , pattern=>'.*' , placeholder=>'email'
+
+
+
+ %= submit_button l('lets_Save'), class => 'action subm9'
+
+
+ %# Probably finally by a submit.
+ %end
+
diff --git a/Targets/Letsencrypt/letsencrypt.css b/Targets/Letsencrypt/letsencrypt.css
new file mode 100644
index 0000000..0b98201
--- /dev/null
+++ b/Targets/Letsencrypt/letsencrypt.css
@@ -0,0 +1,18 @@
+/*
+ Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+*/
+.Letsencrypt-panel {}
+.name {}
+.rout {}
+.head {}
+.subh {}
+.para1 {}
+.sele1 {}
+.sele2 {}
+.sele3 {}
+.sele4 {}
+.sele5 {}
+.sele6 {}
+.sele7 {}
+.text8 {}
+.subm9 {}
diff --git a/Targets/Letsencrypt/letsencrypt.html.ep b/Targets/Letsencrypt/letsencrypt.html.ep
new file mode 100644
index 0000000..1d18d2c
--- /dev/null
+++ b/Targets/Letsencrypt/letsencrypt.html.ep
@@ -0,0 +1,56 @@
+%#
+%# Generated by SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+%#
+% layout 'default', title => "Sme server 2 - letsencrypt", share_dir => './';
+%# css specific to this panel:
+% content_for 'module' => begin
+%= stylesheet '/css/letsencrypt.css'
+
+
+ % if ($config->{debug} == 1) {
+
+ %= dumper $c->current_route
+
+ % }
+
+
<%=$title%>
+
+ % if ( stash('modul') ) {
+ %= $c->render_to_string(inline => stash('modul') );
+ % }
+
+ %if ($lets_data->{first}) {
+
+ %=$c->render_to_string(inline =>$c->l($lets_data->{first}))
+
+
+ %} elsif ($lets_data->{success}) {
+
+
Operation Status Report
+ %= $c->l($lets_data->{success});
+
+
+
+ %} elsif ($lets_data->{error}) {
+
+
Operation Status Report - error
+ %= $c->l($lets_data->{error});
+
+
+ %}
+
+ %#Routing to partials according to trt parameter.
+ %#This ought to be cascading if/then/elsif, but is easier to just stack the if/then's rather like a case statement'
+
+ % if ($lets_data->{trt} eq "LIST") {
+ %= include 'partials/_lets_LIST'
+ %}
+
+ % if ($lets_data->{trt} eq "PARAMS") {
+ %= include 'partials/_lets_PARAMS'
+ %}
+
+
+
+
+%end
diff --git a/Targets/Letsencrypt/letsencrypt_en.lex b/Targets/Letsencrypt/letsencrypt_en.lex
new file mode 100644
index 0000000..28239d2
--- /dev/null
+++ b/Targets/Letsencrypt/letsencrypt_en.lex
@@ -0,0 +1,33 @@
+#
+# Generated by SM2Gen version: SM2Gen version:0.8 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 19:00:38
+#
+'lets_LABEL_LECERT' => 'LABEL LECERT',
+'lets_Hello_LIST' => 'Hello LIST',
+'lets_Domain_name_/_HOSTNAME' => 'Domain name / HOSTNAME',
+'lets_IS_IN_CERT' => 'IS IN CERT',
+'lets_Internet_IP' => 'Internet IP',
+'lets_HOOKSCRIPT_STATUS' => 'HOOKSCRIPT STATUS',
+'lets_Save' => 'Save',
+'lets_FORM_DESCRIPTION' => 'FORM DESCRIPTION',
+'lets_EMAIL' => 'Email',
+'lets_Hello_PARAMS' => 'Hello PARAMS',
+'lets_HOSTOVERRIDE_STATUS' => 'HOSTOVERRIDE STATUS',
+'lets_Brief_description' => 'Brief description',
+'lets_Internal_IP' => 'Internal IP',
+'lets_CONFIG_LETSENCRYPT' => 'CONFIG LETSENCRYPT',
+'lets_KEYSIZE_STATUS' => 'KEYSIZE STATUS',
+'lets_CONFIGUREMODE_STATUS' => 'CONFIGUREMODE STATUS',
+'lets_List_of_Domains' => 'List of Domains',
+'lets_SERVICE_STATUS' => 'SERVICE STATUS',
+'lets_Configuration_for_Letsencrypt' => 'Configuration for Letsencrypt',
+'lets_LABEL_POINT' => 'LABEL POINT',
+'lets_API_STATUS' => 'API STATUS',
+'lets_letsencrypt' => 'Letsencrypt',
+'lets_LIST_panel_action_was_successful' => 'LIST panel action was successful',
+'lets_CHECK' => 'Check',
+'lets_LABEL_NAMESERVERS' => 'LABEL NAMESERVERS',
+'lets_Content' => 'Content',
+'lets_ACCEPT_TERMS_STATUS' => 'ACCEPT TERMS STATUS',
+'lets_PARAMS_panel_action_was_successful' => 'PARAMS panel action was successful',
+'lets_Manage_letsencrypt-config_settings:' => 'Manage letsencrypt-config settings:',
+'lets_APPLY' => 'Apply',
diff --git a/Templates/custom.pm.tem b/Templates/custom.pm.tem
index ca8d616..9532ac0 100644
--- a/Templates/custom.pm.tem
+++ b/Templates/custom.pm.tem
@@ -36,12 +36,12 @@ our $ddb = esmith::DomainsDB->open() || die("Couldn't open Domains db");
# Return an array of hashes of the contents for each row and column for ${tablecontrol}
# default is a single row of strings "col1header-1, col2header-1, col3Header-1 etc"
my $c = shift;
- my $control_data = $self->stash('${tablecontrol}');
- my @ret = {}
+ my $control_data = $c->stash('${tablecontrol}');
+ my @ret = {};
# foreach my $colHead (@$control_data) {
-# my ret{$colHead} = "$colhead-1"
+# my ret{$colHead} = "$colhead-1";
# };
- return \@ret
+ return \@ret;
}
@@ -72,4 +72,4 @@ sub create_link{
my $link = "$route?trt=$panel&Selected=$index";
return $link;
}
-1;
+1;
\ No newline at end of file
diff --git a/Templates/html_controls.html.ep.xml b/Templates/html_controls.html.ep.xml
index 0172a32..046295e 100644
--- a/Templates/html_controls.html.ep.xml
+++ b/Templates/html_controls.html.ep.xml
@@ -1,5 +1,5 @@
-
%=l('${prefix}_${Label}')
@@ -7,7 +7,7 @@
% param '${Name}' => $$${prefix}_data->{${Name}} unless param '${Name}';
%= select_field '${Name}' => @${Name}_options, class => 'input'
- ]]>
+ ]]>
@@ -46,6 +46,15 @@
]]>
+
+ %=l('${prefix}_${Label}')
+
+ % param '${Name}' => $$${prefix}_data->{${Name}} unless param '${Name}';
+ %= text_field '${Name}', size => '${size | 50}', class => 'textinput ${Name}' , pattern=>'${regexp | ".*"}' , placeholder=>'${placeholder | Name}', Readonly=>'true'
+
+ ]]>
+
<%=l('${Value}')%>]]>
@@ -71,7 +80,7 @@
%=l('${prefix}_${Label}')
%=Search field
- %=search field , class => 'searc${type_serial}'
+ %=search_field , class => 'searc${type_serial}'
span>
]]>
@@ -80,7 +89,7 @@
%=l('${Label}')
- %=URL field , class => 'url${type_serial}'
+ %=URL_field , class => 'url${type_serial}'
span>
]]>
@@ -89,7 +98,7 @@
%=l('${Label}')
- %=tel field, class => 'tel${type_serial}'
+ %=tel_field, class => 'tel${type_serial}'
span>
]]>
@@ -98,7 +107,7 @@
%=l('${Label}')
- %=email field, class => 'emai${type_serial}'
+ %=email_field, class => 'emai${type_serial}'
span>
]]>
@@ -107,7 +116,7 @@
%=l('${Label}')
- %=password field, class => 'pass${type_serial}'
+ %=password_field, class => 'pass${type_serial}'
span>
]]>
@@ -116,7 +125,7 @@
%=l('${Label}')
- %=timedate field, class => 'time${type_serial}'
+ %=timedate_field, class => 'time${type_serial}'
span>
]]>
@@ -125,7 +134,7 @@
%=l('${Label}')
- %=week field, class => 'week${type_serial}'
+ %=week_field, class => 'week${type_serial}'
span>
]]>
@@ -134,7 +143,7 @@
%=l('${Label}')
- %=month field, class => 'mont${type_serial}'
+ %=month_field, class => 'mont${type_serial}'
span>
]]>
@@ -143,7 +152,7 @@
%=l('${Label}')
- %=range field, class => 'rang${type_serial}'
+ %=range_field, class => 'rang${type_serial}'
span>
]]>
@@ -152,7 +161,7 @@
%=l('${Label}')
- %=radio field, class => 'radi${type_serial}'
+ %=radio_field, class => 'radi${type_serial}'
span>
]]>
@@ -161,7 +170,7 @@
%=l('${Label}')
- %=number field, class => 'numb${type_serial}'
+ %=number_field, class => 'numb${type_serial}'
span>
]]>
@@ -170,7 +179,7 @@
%=l('${Label}')
- %=file field, class => 'file${type_serial}'
+ %=file_field, class => 'file${type_serial}'
span>
]]>
@@ -179,7 +188,7 @@
%=l('${Label}')
- %=color field, class => 'colo${type_serial}'
+ %=color_field, class => 'colo${type_serial}'
span>
]]>
@@ -188,7 +197,7 @@
%=l('${Label}')
- %=checkbox field, class => 'chec${type_serial}'
+ %=checkbox_field, class => 'chec${type_serial}'
span>
]]>
@@ -220,4 +229,4 @@
-
+
\ No newline at end of file
diff --git a/html/letsencrypt-list.html b/html/letsencrypt-list.html
index 4188918..f91d794 100644
--- a/html/letsencrypt-list.html
+++ b/html/letsencrypt-list.html
@@ -33,7 +33,8 @@
href="letsencrypt?page=0&page_stack=&Next=Next&wherenext=CHECK_DOMAINS_PAGE">CHECK_ALL_DOMAINS
CHECK_ENABLED_DOMAINS
-
Issuer: /C=--/ST=----/L=Ottawa/O=XYZ Corporation/OU=Main/CN=sme11.thereadclan.me.uk/emailAddress=admin@thereadclan.me.uk
Expiry: 2025-10-03T02:09:03Z
Not Before: 2024-10-03T02:09:03Z
+ > Issuer: /C=--/ST=----/L=Ottawa/O=XYZ Corporation/OU=Main/CN=sme11.thereadclan.me.uk/emailAddress=admin@thereadclan.me.uk
Expiry: 2025-10-03T02:09:03Z
Not Before: 2024-10-03T02:09:03Z
>
+
CURRENT_LIST_OF_DOMAINS
diff --git a/json5/Letsencrypt.json5 b/json5/Letsencrypt.json5
new file mode 100644
index 0000000..0bb033b
--- /dev/null
+++ b/json5/Letsencrypt.json5
@@ -0,0 +1,200 @@
+//
+// Generated by sm1-html-2-json5 version:0.5 Chameleon version:4.5.4 On Python:3.12.3 at 2024-10-18 14:47:03
+//
+{
+ 'PackageName': 'Letsencrypt',
+ 'prefix': 'lets',
+ 'MenuHeading': 'Miscellaneous',
+ 'MenuDescription': 'letsencrypt',
+ 'MenuNavigation': '2000 400',
+ 'firstPanel': 'LIST',
+ 'signalEvent': 'smeserver-letsencrypt-update',
+ 'html': [
+ {
+ 'Name': 'List',
+ 'route': 'LIST',
+ 'Header': 'lets_List of Domains',
+ 'SubHeader': 'lets_FORM_DESCRIPTION',
+ 'Subheader': 'SERVER_IPS',
+ Input1: {
+ Name: 'InternalIP',
+ Type: 'ReadonlyText',
+ Label: 'Internal IP',
+ Value: 'stash("InternalIP")',
+ },
+ Input2: {
+ Name: 'ObserverIP',
+ Type: 'ReadonlyText',
+ Label: 'Internet IP',
+ Value: 'stash("InternetIP")',
+ },
+ 'Table1': {
+ 'Type': 'Table',
+ 'TableControl': 'DomainList',
+ 'TopHeadings': [
+ 'Domain name / HOSTNAME',
+ 'Brief description',
+ 'Content',
+ 'LABEL_NAMESERVERS',
+ 'LABEL_POINT',
+ 'LABEL_LECERT',
+ 'IS_IN_CERT',
+ 'CHECK'
+ ],
+ 'Columns': [
+ 'Table1-Domain name / HOSTNAME',
+ 'Table1-Brief description',
+ 'Table1-Content',
+ 'Table1-LABEL_NAMESERVERS',
+ 'Table1-LABEL_POINT',
+ 'Table1-LABEL_LECERT',
+ 'Table1-IS_IN_CERT',
+ 'Table1-CHECK'
+ ]
+ }
+ },
+ {
+ 'Name': 'params',
+ 'route': 'PARAMS',
+ 'Header': 'Configuration for Letsencrypt',
+ 'SubHeader': 'Manage letsencrypt-config settings:',
+ 'Paragraph1': 'CONFIG_LETSENCRYPT',
+ 'Input1': {
+ 'Type': 'Select',
+ 'Value': 'Disabled',
+ 'Name': 'status',
+ 'Label': 'SERVICE_STATUS',
+ 'Options': [
+ {
+ 'Value': 'disabled',
+ 'Text': 'Disabled'
+ },
+ {
+ 'Value': 'enabled',
+ 'Text': 'Enabled'
+ },
+ {
+ 'Value': 'test',
+ 'Text': 'TEST'
+ }
+ ]
+ },
+ 'Input2': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'hookScript',
+ 'Label': 'HOOKSCRIPT_STATUS',
+ 'Options': [
+ {
+ 'Value': 'disabled',
+ 'Text': 'Disabled'
+ },
+ {
+ 'Value': 'enabled',
+ 'Text': 'Enabled'
+ }
+ ]
+ },
+ 'Input3': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'hostOverride',
+ 'Label': 'HOSTOVERRIDE_STATUS',
+ 'Options': [
+ {
+ 'Value': 'disabled',
+ 'Text': 'Disabled'
+ },
+ {
+ 'Value': 'yes',
+ 'Text': 'Yes'
+ }
+ ]
+ },
+ 'Input4': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'ACCEPT_TERMS',
+ 'Label': 'ACCEPT_TERMS_STATUS',
+ 'Options': [
+ {
+ 'Value': 'disabled',
+ 'Text': 'Disabled'
+ },
+ {
+ 'Value': 'yes',
+ 'Text': 'Yes'
+ }
+ ]
+ },
+ 'Input5': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'API',
+ 'Label': 'API_STATUS',
+ 'Options': [
+ {
+ 'Value': '2',
+ 'Text': '2'
+ }
+ ]
+ },
+ 'Input6': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'keysize',
+ 'Label': 'KEYSIZE_STATUS',
+ 'Options': [
+ {
+ 'Value': '2048',
+ 'Text': '2048'
+ },
+ {
+ 'Value': '3072',
+ 'Text': '3072'
+ },
+ {
+ 'Value': '4096',
+ 'Text': '4096'
+ }
+ ]
+ },
+ 'Input7': {
+ 'Type': 'Select',
+ 'Value': '',
+ 'Name': 'configure',
+ 'Label': 'CONFIGUREMODE_STATUS',
+ 'Options': [
+ {
+ 'Value': 'all',
+ 'Text': 'ALL'
+ },
+ {
+ 'Value': 'domains',
+ 'Text': 'Domains'
+ },
+ {
+ 'Value': 'hosts',
+ 'Text': 'HOSTS'
+ },
+ {
+ 'Value': 'none',
+ 'Text': 'NONE'
+ }
+ ]
+ },
+ 'Input8': {
+ 'Type': 'Text',
+ 'Value': '',
+ 'Name': 'email',
+ 'Label': 'EMAIL'
+ },
+ 'Input9': {
+ 'Type': 'Submit',
+ 'Value': 'Save',
+ 'Name': 'Next',
+ 'Label': null
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/json5/Nfsshare.json5 b/json5/Nfsshare.json5
index 949b8d0..2814c8e 100644
--- a/json5/Nfsshare.json5
+++ b/json5/Nfsshare.json5
@@ -20,7 +20,7 @@
},
Input2: {
Name: 'ShareOwnerGrp',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Share owner Group',
Value: [
'Write = admin, Read = group',
@@ -31,7 +31,7 @@
},
Input3: {
Name: 'EnableNFSshare',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Enable the NFS Share',
Value: [
'Disabled',
@@ -41,7 +41,7 @@
},
Input4: {
Name: 'ShareOnLocalNetwork',
- Type: 'Selection',
+ Type: 'Select',
Label: 'EnableShare on local network',
Value: [
'Disabled',
@@ -58,7 +58,7 @@
},
Input6: {
Name: 'FileSystemPermissions',
- Type: 'Selection',
+ Type: 'Select',
Label: 'File system permissions',
Value: [
'Read only',
@@ -68,7 +68,7 @@
},
Input7: {
Name: 'WriteAsync',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Write (a)synchronously',
Value: [
'Synchronous',
@@ -77,7 +77,7 @@
},
Input8: {
Name: 'DelayWrite',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Delays the disk writing',
Value: [
'Write delay',
@@ -87,7 +87,7 @@
},
Input9: {
Name: 'Squash',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Squash the power of users',
Value: [
'All users squash',
@@ -98,7 +98,7 @@
},
Input10: {
Name: 'BrowseParents',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Browse the parent folders',
Value: [
'Hide folder',
@@ -108,7 +108,7 @@
},
Input11: {
Name: 'SecurePorts',
- Type: 'Selection',
+ Type: 'Select',
Label: 'Requests on secure ports',
Value: [
'Secure',
@@ -143,4 +143,4 @@
}
}
]
-}
+}
\ No newline at end of file
diff --git a/sm2gen.py b/sm2gen.py
index bb87317..1518d05 100644
--- a/sm2gen.py
+++ b/sm2gen.py
@@ -526,9 +526,9 @@ if __name__ == "__main__":
file.write(controller_perl)
print(f"{controller_file} controller generated ok")
except Exception as e:
- print(f"A Chameleon controller render error occurred: {e}")
+ print(f"A Chameleon controller render error occurred: {e} {traceback.format_exc()}")
except Exception as e:
- print(f"A Chameleon controller template error occurred: {e}")
+ print(f"A Chameleon controller template error occurred: {e} {traceback.format_exc()}")
# Generate Custom controller file
try:
@@ -542,9 +542,9 @@ if __name__ == "__main__":
file.write(custom_controller_perl)
print(f"{custom_controller_file} custom controller generated ok")
except Exception as e:
- print(f"A Chameleon custom controller render error occurred: {e}")
+ print(f"A Chameleon custom controller render error occurred: {e} {traceback.format_exc()}")
except Exception as e:
- print(f"A Chameleon custom controller template error occurred: {e}")
+ print(f"A Chameleon custom controller template error occurred: {e} {traceback.format_exc()}")
# generate Layout file
layout_template = PageTemplateFile("Templates/layout.html.ep.tem")
@@ -608,7 +608,8 @@ if __name__ == "__main__":
try:
control_html = control_template.render(
version=strVersion, **inner_html, prefix=prefix_is,
- classname=class_name
+ classname=class_name,
+ type_serial=type_serial
)
all_controls_html = all_controls_html + control_html
except Exception as e:
@@ -783,4 +784,4 @@ if __name__ == "__main__":
# print(
# f"Skipping the creation of {translated_lex_file} as it exists already"
# )
- quit() # end of the program
+ quit() # end of the program
\ No newline at end of file