Compare commits

..

7 Commits

15 changed files with 540 additions and 106 deletions

View File

@@ -40,5 +40,10 @@
$OUT .= " Require ip $localAccess $externalSSLAccess\n";
}
$OUT .= " </Location>\n";
# prevent caching of manager files in browser
$OUT .= " <LocationMatch \"/$place/.+\.(html|cgi)\$\">\n";
$OUT .= " Header set Cache-Control no-store\n";
$OUT .= " </LocationMatch>\n";
}
}

View File

@@ -67,5 +67,21 @@ hr.sme-copyrightbar {
color: #8ebe43;
background-color: #8ebe43;
}
/* flag container no flag */
#flag-container span {
font-size: 24px;
}
.fallback-box {
display: inline-block; /* Make it inline-block to fit around the content */
border: 2px solid gray; /* Change the border color as desired */
padding: 10px; /* Add some padding */
border-radius: 10px; /* Round the corners of the box */
font-size: 60px; /* Adjust size if needed */
margin-top: 10px; /* Add some margin */
text-align: center; /* Center text inside the box */
}
HERE
}

View File

@@ -25,6 +25,7 @@ use SrvMngr::Plugin::I18N;
use SrvMngr::I18N;
use SrvMngr::Model::Main;
use SrvMngr::Plugin::WithoutCache;
our $VERSION = '1.420';
$VERSION = eval $VERSION;
@@ -210,6 +211,8 @@ sub setup_plugins {
$self->plugin('TagHelpers');
$self->plugin('RenderFile');
$self->plugin('SrvMngr::Plugin::WithoutCache');
# CSRF protection if production mode
# $self->plugin('Mojolicious::Plugin::CSRFDefender' => {

View File

@@ -395,19 +395,16 @@ sub get_current_webmail_status {
# determine status of webmail
my $WebmailStatus = "disabled";
my $IMPStatus = $cdb->get_prop('imp', 'status') || 'disabled';
my $HordeStatus = $cdb->get_prop('horde', 'status') || 'disabled';
my $RoundcubeStatus = $cdb->get_prop('roundcube', 'status') || 'disabled';
my $MysqlStatus = $cdb->get_prop('mariadb', 'status') || 'disabled';
my $PHPStatus = $cdb->get_prop('php', 'status') || 'disabled';
my $PHPStatus = $cdb->get_prop('php81', 'status') || 'disabled';
my $Networkaccess = $cdb->get_prop('horde','access') || 'disabled';
my $Networkaccess = $cdb->get_prop('roundcube','access') || 'disabled';
# all four components must be on for webmail to be working
if ( ( $IMPStatus eq "enabled" )
&& ( $HordeStatus eq "enabled" )
# all 3 components must be on for webmail to be working
if ( ( $RoundcubeStatus eq "enabled" )
&& ( $MysqlStatus eq "enabled" )
&& ( $PHPStatus eq "enabled" )
&& ( $Networkaccess eq "public"))
@@ -415,8 +412,7 @@ sub get_current_webmail_status {
$WebmailStatus = "enabledSSL";
}
elsif ( ( $IMPStatus eq "enabled" )
&& ( $HordeStatus eq "enabled" )
elsif ( ( $RoundcubeStatus eq "enabled" )
&& ( $MysqlStatus eq "enabled" )
&& ( $PHPStatus eq "enabled" )
&& ( $Networkaccess eq "private" ))
@@ -507,8 +503,7 @@ sub get_webmail_opt {
return [[ $c->l('DISABLED') => 'disabled' ],
[ $c->l('mai_ENABLED_SECURE_ONLY') => 'enabledSSL' ],
[ $c->l('mai_ONLY_LOCAL_NETWORK_SSL') => 'localnetworkSSL' ],
[ $c->l('mai_ENABLED_BOTH') => 'public' ]];
[ $c->l('mai_ONLY_LOCAL_NETWORK_SSL') => 'localnetworkSSL' ]];
}
@@ -519,10 +514,10 @@ sub get_webmail_options {
my %options = (
disabled => 'DISABLED',
enabledSSL => 'mai_ENABLED_SECURE_ONLY',
localnetworkSSL => 'mai_ONLY_LOCAL_NETWORK_SSL' );
enabledSSL => 'mai_ENABLED_SECURE_ONLY',
localnetworkSSL => 'mai_ONLY_LOCAL_NETWORK_SSL')
\%options;
return \%options;
}
@@ -658,6 +653,7 @@ sub display_multidrop {
sub change_settings_reception {
my $c = shift;
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $FetchmailMethod = ( $c->param('FetchmailMethod') || 'standard' );
@@ -724,6 +720,7 @@ sub change_settings_reception {
sub change_settings_delivery {
my ($c) = shift;
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $EmailUnknownUser = ($c->param('EmailUnknownUser') || 'returntosender');
@@ -752,7 +749,8 @@ sub change_settings_delivery {
sub change_settings_access {
my $c = shift;
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $pop3Access = ($c->param('POPAccess') || 'private');
if ($pop3Access eq 'disabled') {
$cdb->set_prop('pop3', "status", "disabled" );
@@ -802,38 +800,22 @@ sub change_settings_access {
#------------------------------------------------------------
my $webmail = ($c->param('WebMail') || 'disabled');
if ( $webmail eq "enabled" ) {
$cdb->set_prop('php', "status", $webmail );
$cdb->set_prop('mariadb',"status", $webmail );
$cdb->set_prop('imp',"status", $webmail );
$cdb->set_prop('horde', "status", $webmail );
$cdb->set_prop('imp',"access", "full" );
$cdb->set_prop('horde',"access", "public" );
$cdb->set_prop('horde',"HttpsOnly", "no" );
}
elsif ( $webmail eq "enabledSSL" ) {
$cdb->set_prop('php',"status", "enabled" );
if ( $webmail eq "enabledSSL" ) {
$cdb->set_prop('php81',"status", "enabled" );
$cdb->set_prop('mariadb',"status", "enabled" );
$cdb->set_prop('imp',"status", 'enabled' );
$cdb->set_prop('horde',"status", 'enabled' );
$cdb->set_prop('imp',"access", "SSL" );
$cdb->set_prop('horde',"access", "public" );
$cdb->set_prop('horde',"HttpsOnly", "yes" );
$cdb->set_prop('roundcube',"status", 'enabled' );
$cdb->set_prop('roundcube',"access", "public" );
}
elsif ( $webmail eq "localnetworkSSL" ) {
$cdb->set_prop('php',"status", "enabled" );
$cdb->set_prop('php81',"status", "enabled" );
$cdb->set_prop('mariadb',"status", "enabled" );
$cdb->set_prop('imp',"status", 'enabled' );
$cdb->set_prop('horde',"status", 'enabled' );
$cdb->set_prop('imp',"access", "SSL" );
$cdb->set_prop('horde',"access", "private" );
$cdb->set_prop('horde',"HttpsOnly", "yes" );
$cdb->set_prop('roundcube',"status", 'enabled' );
$cdb->set_prop('roundcube',"access", "private" );
}
else {
$cdb->set_prop('imp',"status", 'disabled' );
$cdb->set_prop('horde',"status", 'disabled' );
$cdb->set_prop('roundcube',"status", 'disabled' );
}
unless ( system( "/sbin/e-smith/signal-event", "email-update" ) == 0 ) {
@@ -847,6 +829,8 @@ sub change_settings_access {
sub change_settings_filtering {
my $c = shift;
$cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $virus_status = ( $c->param('VirusStatus') || 'disabled' );
$cdb->set_prop("qpsmtpd", 'VirusScan', $virus_status);

View File

@@ -171,9 +171,11 @@ sub add_portforward {
#work out which protocol
my $fdb;
if ($proto eq 'TCP') {
$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
$fdb = $tcp_db;
}
else {
$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
$fdb = $udp_db;
}
#Get the other values

View File

@@ -23,6 +23,8 @@ use File::Basename;
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
my $dnf_status_file = '/var/cache/dnf/dnf.status';
#use File::stat;
our %dbs;
@@ -52,7 +54,8 @@ sub main {
$yum_datas{'trt'} = 'STAT';
if ( -e "/var/run/yum.pid" ) {
if ( $c->is_dnf_running()) {
$yum_datas{'trt'} = 'LOGF';
$dest = 'yumlogfile';
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
@@ -83,7 +86,7 @@ sub do_display {
$yum_datas{'trt'} = $trt;
# force $trt if current logfile
if ( -e "/var/run/yum.pid" ) {
if ( $c->is_dnf_running() ) {
$trt = 'LOGF';
} elsif ($cdb->get_prop('dnf', 'LogFile')) {
$trt = 'PSTU';
@@ -106,7 +109,7 @@ sub do_display {
}
if ( $trt eq 'LOGF' ) {
if (-e "/var/run/yum.pid") {
if ($c->is_dnf_running()) {
$dest = 'yumlogfile';
}
}
@@ -221,7 +224,7 @@ sub do_update {
if ( $trt eq 'LOGF' ) {
$dest = 'yumlogfile';
if ( ! -e "/var/run/yum.pid") {
if ( ! $c->is_dnf_running()) {
$yum_datas{trt} = 'SUC';
$result = $c->l('yum_SUCCESS');
}
@@ -247,6 +250,24 @@ sub do_update {
};
sub get_dnf_status {
#interrogate status file created and maintained by smeserver.py plugin for dnf.
my ($c) = @_;
my $file_name = $dnf_status_file;
my $content = "resolved";
if ( -e "$file_name") {
open my $fh, '<', $file_name or die "Can't open file: $!";
$content = <$fh>;
close $fh;
}
return $content;
}
sub is_dnf_running {
my ($c) = @_;
my $dnf_status = $c->get_dnf_status();
return $dnf_status ne "resolved" && $dnf_status ne "config" && $dnf_status ne "sack";
}
sub is_empty {
@@ -488,7 +509,7 @@ sub do_yum {
}
esmith::util::backgroundCommand(0,
"/sbin/e-smith/signal-event", "DNF-$function");
"/sbin/e-smith/signal-event", "dnf-$function");
for ( qw(available installed updates) ) {
$dbs{$_}->reload;

View File

@@ -0,0 +1,73 @@
package SrvMngr::Plugin::Cache;
use Mojo::Base -base;
=head1 NAME
Mojolicious::Plugin::Renderer::WithoutCache::Cache - Mojo::Cache that doesn't cache
=head1 VERSION
Version 0.04
=cut
our $VERSION = '0.04';
$VERSION = eval $VERSION;
=head1 SYNOPSIS
You probably don't want to use this directly.
my $cache = Mojolicious::Plugin::Renderer::WithoutCache::Cache->new;
# this cache does nothing
=head1 DESCRIPTION
A cache object that's compatible to Mojo::Cache but does nothing. It does
not save or return any values. It's always empty.
=head1 METHODS
=head2 get
Does nothing. Returns C<undef>.
=cut
sub get {}
=head2 set
Does nothing. Returns C<$self> so chaining is possible.
=cut
sub set { shift; }
=head2 max_keys
Always returns zero. Can't be set. We don't want any keys.
=cut
sub max_keys { 0 }
=head1 AUTHOR
simbabque, C<< <simbabque at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests through an issue
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
=head1 LICENSE
Copyright (C) simbabque.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
1;

View File

@@ -0,0 +1,94 @@
package SrvMngr::Plugin::WithoutCache;
use Mojo::Base 'Mojolicious::Plugin';
use SrvMngr::Plugin::Cache;
=head1 NAME
Mojolicious::Plugin::Renderer::WithoutCache - Disable the template cache in your Mojo app
=begin html
<p>
<a href="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache"><img src="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache.svg?branch=master"></a>
<a href='https://coveralls.io/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache?branch=master'><img src='https://coveralls.io/repos/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/badge.svg?branch=master' alt='Coverage Status' /></a>
</p>
=end html
=head1 VERSION
Version 0.04
=cut
our $VERSION = '0.04';
$VERSION = eval $VERSION;
=head1 SYNOPSIS
This plugin turns off the renderer's cache in L<Mojolicious> and L<Mojo::Lite> applications.
use Mojolicious::Lite;
plugin 'Renderer::WithoutCache';
=head1 DESCRIPTION
This does what it says on the box. It turns off caching for the L<Mojolicious::Renderer>
or any other renderer that's inside C<$app-E<gt>renderer> by injecting a cache object that
does not do anything. This is superior to setting the C<max_keys> of L<Mojo::Cache>
to C<0> if you plan to do a lot of uncached requests, because L<Mojolicious::Renderer>
will still try to cache, and every time L<Mojo::Cache> sets a value in the cache it
looks at the C<max_keys>, and then stops.
Doing nothing at all is cheaper. But not a lot really.
=head1 METHODS
=head2 register
Register the plugin in a L<Mojolicious> application.
$plugin->register(Mojolicious->new);
=cut
sub register {
my ( $self, $app ) = @_;
$app->renderer->cache( SrvMngr::Plugin::Cache->new );
}
=head1 AUTHOR
simbabque, C<< <simbabque at cpan.org> >>
=head1 BUGS
Please report any bugs or feature requests through an issue
on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc Mojolicious::Plugin::Renderer::WithoutCache
=head2 Why would I want to turn off the cache?
I don't know.
=head1 ACKNOWLEDGEMENTS
This plugin was inspired by Tom Hunt asking about turning the cache off
on L<Stack Overflow|http://stackoverflow.com/q/41750243/1331451>.
=head1 LICENSE
Copyright (C) simbabque.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
1;

View File

@@ -1,63 +1,278 @@
document.addEventListener('DOMContentLoaded', () => {
const flagContainer = document.getElementById('flag-container');
// Function to get the browser's locale
function getBrowserLocale() {
return navigator.language || navigator.userLanguage;
}
async function getCountryName(countryCode) {
try {
const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`);
if (!response.ok) throw new Error('Country not found');
const data = await response.json();
// Return the name in the native language
return data[0].name.common;
} catch (error) {
console.error(error);
return 'Unknown Country';
}
}
// Function to map locale to country code
function getCountryCodeFromLocale(locale) {
const localeParts = locale.split('-');
return localeParts.length > 1 ? localeParts[1] : localeParts[0];
}
function getFlagEmoji(locale) {
// Split the locale to get the language and country code
const parts = locale.split('-');
let countryCode;
// Function to fetch country names from a CDN
async function fetchCountryNames() {
const response = await fetch('https://restcountries.com/v3.1/all');
const countries = await response.json();
const countryNames = {};
for (const country of countries) {
const code = country.cca2.toLowerCase(); // Country code (ISO 3166-1 alpha-2)
const name = country.name.common; // Common name of the country
countryNames[code] = name;
}
return countryNames;
}
// Handle single subtag (language only) or double subtag (language-country)
if (parts.length === 1) {
countryCode = getCountryCodeFromLanguage(parts[0]);
} else if (parts.length === 2) {
countryCode = parts[1].toLowerCase(); // Use the country code
}
// Function to create and display the flag icon
function displayFlagIcon(countryCode, countryName) {
const flagIcon = document.createElement('span');
flagIcon.className = `flag-icon flag-icon-${countryCode.toLowerCase()}`;
flagIcon.id = 'flag-icon';
flagIcon.title = countryName; // Set the title for the tooltip
// If country code is not found, set a fallback output
if (!countryCode) {
const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale
return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' };
}
// If you want a custom tooltip instead (uncomment the lines below):
/*
const tooltip = document.createElement('span');
tooltip.className = 'tooltip';
tooltip.innerText = countryName;
flagIcon.appendChild(tooltip);
// Convert the country code to a flag emoji
return {
flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))),
isUnknown: false,
countryCode: countryCode
};
}
flagIcon.addEventListener('mouseenter', () => {
tooltip.style.display = 'block';
});
function getCountryCodeFromLanguage(language) {
// Map languages to countries (this is an example, extend as needed)
const languageToCountryMap = {
// Add more mappings as needed
"af": "NA",
"agq": "CM",
"ak": "GH",
"am": "ET",
"ar": "01",
"as": "IN",
"asa": "TZ",
"ast": "ES",
"az": "rl",
"bas": "CM",
"be": "BY",
"bem": "ZM",
"bez": "TZ",
"bg": "BG",
"bm": "ML",
"bn": "BD",
"bo": "CN",
"br": "FR",
"brx": "IN",
"bs": "rl",
"ca": "AD",
"ccp": "BD",
"ce": "RU",
"cgg": "UG",
"chr": "US",
"ckb": "IQ",
"cs": "CZ",
"cy": "GB",
"da": "DK",
"dav": "KE",
"de": "DE",
"dje": "NE",
"dsb": "DE",
"dua": "CM",
"dyo": "SN",
"dz": "BT",
"ebu": "KE",
"ee": "GH",
"el": "CY",
"en": "01",
"es": "ES",
"et": "EE",
"eu": "ES",
"ewo": "CM",
"fa": "AF",
"ff": "CM",
"fi": "FI",
"fil": "PH",
"fo": "FO",
"fr": "FR",
"fur": "IT",
"fy": "NL",
"ga": "IE",
"gd": "GB",
"gl": "ES",
"gsw": "CH",
"gu": "IN",
"guz": "KE",
"gv": "IM",
"ha": "GH",
"haw": "US",
"he": "IL",
"hi": "IN",
"hr": "HR",
"hsb": "DE",
"hu": "HU",
"hy": "AM",
"id": "ID",
"ig": "NG",
"ii": "CN",
"is": "IS",
"it": "IT",
"ja": "JP",
"jgo": "CM",
"jmc": "TZ",
"ka": "GE",
"kab": "DZ",
"kam": "KE",
"kde": "TZ",
"kea": "CV",
"khq": "ML",
"ki": "KE",
"kk": "KZ",
"kkj": "CM",
"kl": "GL",
"kln": "KE",
"km": "KH",
"kn": "IN",
"ko": "KP",
"kok": "IN",
"ks": "IN",
"ksb": "TZ",
"ksf": "CM",
"ksh": "DE",
"kw": "GB",
"ky": "KG",
"lag": "TZ",
"lb": "LU",
"lg": "UG",
"lkt": "US",
"ln": "AO",
"lo": "LA",
"lrc": "IQ",
"lt": "LT",
"lu": "CD",
"luo": "KE",
"Luo": "KE",
"luy": "KE",
"lv": "LV",
"mas": "KE",
"mer": "KE",
"mfe": "MU",
"mg": "MG",
"mgh": "MZ",
"mgo": "CM",
"mk": "MK",
"ml": "IN",
"mn": "MN",
"mr": "IN",
"ms": "BN",
"mt": "MT",
"mua": "CM",
"my": "MM",
"mzn": "IR",
"naq": "NA",
"nb": "NO",
"nd": "ZW",
"nds": "DE",
"ne": "IN",
"nl": "NL",
"nmg": "CM",
"nn": "NO",
"nnh": "CM",
"nus": "SS",
"nyn": "UG",
"om": "ET",
"or": "IN",
"os": "GE",
"pa": "ab",
"pl": "PL",
"ps": "AF",
"pt": "PT",
"qu": "BO",
"rm": "CH",
"rn": "BI",
"ro": "RO",
"rof": "TZ",
"ru": "RU",
"rw": "RW",
"rwk": "TZ",
"sah": "RU",
"saq": "KE",
"sbp": "TZ",
"se": "SE",
"seh": "MZ",
"ses": "ML",
"sg": "CF",
"shi": "tn",
"si": "LK",
"sk": "SK",
"sl": "SI",
"smn": "FI",
"sn": "ZW",
"so": "SO",
"sq": "AL",
"sr": "rl",
"sv": "AX",
"sw": "CD",
"ta": "IN",
"te": "IN",
"teo": "KE",
"tg": "TJ",
"th": "TH",
"ti": "ER",
"to": "TO",
"tr": "TR",
"tt": "RU",
"twq": "NE",
"tzm": "MA",
"ug": "CN",
"uk": "UA",
"ur": "IN",
"uz": "ab",
"vai": "tn",
"Vai": "tn",
"vi": "VN",
"vun": "TZ",
"wae": "CH",
"wo": "SN",
"xog": "UG",
"yav": "CM",
"yi": "01",
"yo": "BJ",
"yue": "ns",
"zgh": "MA",
"zh": "ns",
"zu": "ZA"
flagIcon.addEventListener('mouseleave', () => {
tooltip.style.display = 'none';
});
*/
flagContainer.appendChild(flagIcon);
}
};
// Main logic
(async () => {
const locale = getBrowserLocale();
const countryCode = getCountryCodeFromLocale(locale);
const countryNames = await fetchCountryNames(); // Fetch country names
return languageToCountryMap[language] || null;
}
const countryName = countryNames[countryCode.toLowerCase()] || 'Unknown Country'; // Get the country name
displayFlagIcon(countryCode, countryName); // Display the flag with country name
})();
async function displayLocaleAndFlag() {
// Get the browser locale
const userLocale = navigator.language || navigator.userLanguage;
const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale);
// Display the locale and the corresponding flag (or fallback)
//document.getElementById('locale').textContent = `Your Locale: ${userLocale}`;
if (isUnknown) {
const fallbackDiv = document.createElement('div');
fallbackDiv.className = 'fallback-box';
fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Only show ? and locale code inside the box
//document.getElementById('flag-container').textContent = "Flag: ";
document.getElementById('flag-container').appendChild(fallbackDiv);
// Tooltip for fallback
fallbackDiv.title = "Unknown Country"; // Tooltip for fallback
} else {
const countryName = await getCountryName(countryCode);
const flagSpan = document.createElement('span');
flagSpan.textContent = flag; // Use flag emoji
flagSpan.title = countryName; // Tooltip for the flag in country language
//document.getElementById('flag-container').textContent = "Flag: ";
document.getElementById('flag-container').appendChild(flagSpan);
}
}
displayLocaleAndFlag();
});

View File

@@ -79,9 +79,9 @@
%= hidden_field 'trt' => 'CONF'
<br>
<div class='center'>
<!--<div class='center'>-->
%= submit_button $c->l('SAVE'), class => 'action'
</div>
<!--</div>-->
% end

View File

@@ -47,9 +47,9 @@
%= hidden_field 'trt' => 'INST'
<br><br>
<div class='center'>
<!-- <div class='center'>-->
%= submit_button $c->l('yum_INSTALL_SOFTWARE'), class => 'action'
</div>
<!--</div>-->
% end

View File

@@ -34,9 +34,9 @@
%= hidden_field 'trt' => 'PSTU'
%= hidden_field 'reconf' => $yum_datas->{reconf}
<br>
<div class='center'>
<!-- <div class='center'>-->
%= submit_button "$btn", class => 'action'
</div>
<!--</div>-->
% end

View File

@@ -46,9 +46,9 @@
%= hidden_field 'trt' => 'REMO'
<br>
<div class='center'>
<!--<div class='center'>-->
%= submit_button $c->l('REMOVE'), class => 'action'
</div>
<!--</div>-->
% end

View File

@@ -33,9 +33,9 @@
%= hidden_field 'trt' => 'UPDT'
<br>
<div class='center'>
<!--<div class='center'>-->
%= submit_button $c->l('yum_INSTALL_UPDATES'), class => 'action'
</div>
<!--</div>-->
% end

View File

@@ -2,7 +2,7 @@ Summary: Sme server navigation module : manager 2
%define name smeserver-manager
Name: %{name}
%define version 11.0.0
%define release 15
%define release 21
Version: %{version}
Release: %{release}%{?dist}
License: GPL
@@ -108,6 +108,27 @@ true
%defattr(-,root,root)
%changelog
* Mon Sep 23 2024 Brian Read <brianr@koozali.org> 11.0.0-21.sme
- Remove both option for webmail [SME: 12744]
- Add in re-open DB for portforwarding and email settings.
* Mon Sep 23 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-20.sme
- webmail switch panel to use roundcube [SME: 12742]
- prevent browser from caching [SME: 12695]
* Thu Sep 05 2024 Brian Read <brianr@koozali.org> 11.0.0-19.sme
- Add in mojo plugin WithoutCache [SME: 12695]
* Sun Aug 25 2024 Brian Read <brianr@koozali.org> 11.0.0-18.sme
- Move flag to emojii from downloaded jpg. Fix singleton locale issue[SME: 12706]
* Thu Aug 22 2024 Brian Read <brianr@koozali.org> 11.0.0-17.sme
- Left Align Software Install panels Submit button [SME: 12727]
* Wed Aug 21 2024 Brian Read <brianr@koozali.org> 11.0.0-16.sme
- Typo uc DNF changed to lc dnf in Yum.pm [SME: 127245]
- Monitor dnf running using dnf status file
* Wed Aug 21 2024 Brian Read <brianr@koozali.org> 11.0.0-15.sme
- Migrate SM2 Software installer panel from use of yum to dnf [SME: 12718]