mirror of
https://github.com/webmin/webmin.git
synced 2025-08-15 21:20:10 +00:00
Fixed scheduled updates feature
This commit is contained in:
@ -176,18 +176,23 @@ print &ui_form_columns_table(
|
|||||||
# Show scheduled report form
|
# Show scheduled report form
|
||||||
print "<hr>\n";
|
print "<hr>\n";
|
||||||
print &ui_form_start("save_sched.cgi");
|
print &ui_form_start("save_sched.cgi");
|
||||||
|
print &ui_hidden("all", $in{'all'});
|
||||||
|
print &ui_hidden("mode", $in{'mode'});
|
||||||
|
print &ui_hidden("search", $in{'search'});
|
||||||
print &ui_table_start($text{'index_header'}, undef, 2);
|
print &ui_table_start($text{'index_header'}, undef, 2);
|
||||||
|
|
||||||
$job = &find_cron_job();
|
$job = &find_cron_job();
|
||||||
if ($job) {
|
if ($job) {
|
||||||
$sched = $job->{'hours'} eq '*' ? 'h' :
|
$sched = $job->{'hours'} eq '*' ? 'h' :
|
||||||
$job->{'days'} eq '*' && $job->{'weekdays'} eq '*' ? 'd' :
|
$job->{'days'} eq '*' && $job->{'weekdays'} eq '*' ? 'd' :
|
||||||
$job->{'days'} eq '*' && $job->{'weekdays'} eq '0' ? 'w' :
|
$job->{'days'} eq '*' && $job->{'months'} eq '*' ? 'w' :
|
||||||
undef;
|
undef;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$sched = "d";
|
$sched = "d";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# When to run
|
||||||
print &ui_table_row($text{'index_sched'},
|
print &ui_table_row($text{'index_sched'},
|
||||||
&ui_radio("sched_def", $job ? 0 : 1,
|
&ui_radio("sched_def", $job ? 0 : 1,
|
||||||
[ [ 1, $text{'index_sched1'} ],
|
[ [ 1, $text{'index_sched1'} ],
|
||||||
@ -197,9 +202,11 @@ print &ui_table_row($text{'index_sched'},
|
|||||||
[ 'd', $text{'index_schedd'} ],
|
[ 'd', $text{'index_schedd'} ],
|
||||||
[ 'w', $text{'index_schedw'} ] ]));
|
[ 'w', $text{'index_schedw'} ] ]));
|
||||||
|
|
||||||
|
# Send email to
|
||||||
print &ui_table_row($text{'index_email'},
|
print &ui_table_row($text{'index_email'},
|
||||||
&ui_textbox("email", $config{'sched_email'}, 40));
|
&ui_textbox("email", $config{'sched_email'}, 40));
|
||||||
|
|
||||||
|
# Install or just notify?
|
||||||
print &ui_table_row($text{'index_action'},
|
print &ui_table_row($text{'index_action'},
|
||||||
&ui_radio("action", int($config{'sched_action'}),
|
&ui_radio("action", int($config{'sched_action'}),
|
||||||
[ [ 0, $text{'index_action0'} ],
|
[ [ 0, $text{'index_action0'} ],
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
#
|
#
|
||||||
# XXX cron job to collect .. actually use webmin module collector
|
# XXX cron job to collect .. actually use webmin module collector
|
||||||
# XXX re-check after package update
|
# XXX re-check after package update
|
||||||
# XXX test automatic notification
|
|
||||||
# XXX show on system information page?
|
# XXX show on system information page?
|
||||||
|
|
||||||
BEGIN { push(@INC, ".."); };
|
BEGIN { push(@INC, ".."); };
|
||||||
@ -80,66 +79,6 @@ if ($nocache || &cache_expired($current_cache_file)) {
|
|||||||
# Filter out dupes and sort by name
|
# Filter out dupes and sort by name
|
||||||
@rv = &filter_duplicates(\@rv);
|
@rv = &filter_duplicates(\@rv);
|
||||||
|
|
||||||
local $incwebmin = &include_webmin_modules();
|
|
||||||
if ($incwebmin) {
|
|
||||||
# Add installed Webmin modules
|
|
||||||
foreach my $minfo (&get_all_module_infos()) {
|
|
||||||
push(@rv, { 'name' => $minfo->{'dir'},
|
|
||||||
'update' => $minfo->{'dir'},
|
|
||||||
'desc' => &text('index_webmin',
|
|
||||||
$minfo->{'desc'}),
|
|
||||||
'version' => $minfo->{'version'},
|
|
||||||
'system' => 'webmin',
|
|
||||||
'updateonly' => 1,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add installed Webmin themes
|
|
||||||
foreach my $tinfo (&webmin::list_themes()) {
|
|
||||||
push(@rv, { 'name' => $tinfo->{'dir'},
|
|
||||||
'update' => $tinfo->{'dir'},
|
|
||||||
'desc' => &text('index_webmintheme',
|
|
||||||
$tinfo->{'desc'}),
|
|
||||||
'version' => $tinfo->{'version'},
|
|
||||||
'system' => 'webmin',
|
|
||||||
'updateonly' => 1,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add an entry for Webmin itself, but only if this was
|
|
||||||
# a tar.gz install
|
|
||||||
if ($incwebmin != 2) {
|
|
||||||
push(@rv, { 'name' => 'webmin',
|
|
||||||
'update' => 'webmin',
|
|
||||||
'desc' => 'Webmin Package',
|
|
||||||
'version' => &get_webmin_version(),
|
|
||||||
'system' => 'tgz',
|
|
||||||
'updateonly' => 1,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
# Remove Webmin from the list, as YUM sometimes
|
|
||||||
# includes it in the 'yum list' output even though
|
|
||||||
# it cannot actual do an update!
|
|
||||||
@rv = grep { $_->{'name'} ne 'webmin' } @rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
# If Usermin is installed from a tgz, add it too
|
|
||||||
if (&include_usermin_modules() == 1) {
|
|
||||||
push(@rv, { 'name' => 'usermin',
|
|
||||||
'update' => 'usermin',
|
|
||||||
'desc' => 'Usermin Package',
|
|
||||||
'version' =>
|
|
||||||
&usermin::get_usermin_version(),
|
|
||||||
'system' => 'tgz',
|
|
||||||
'updateonly' => 1,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
@rv = grep { $_->{'name'} ne 'usermin' } @rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&write_cache_file($current_cache_file, \@rv);
|
&write_cache_file($current_cache_file, \@rv);
|
||||||
return @rv;
|
return @rv;
|
||||||
}
|
}
|
||||||
@ -575,63 +514,6 @@ if ($gconfig{'os_type'} eq 'solaris') {
|
|||||||
$pkg->{'desc'} =~ s/^\Q$pkg->{'update'}\E\s+\-\s+//;
|
$pkg->{'desc'} =~ s/^\Q$pkg->{'update'}\E\s+\-\s+//;
|
||||||
}
|
}
|
||||||
|
|
||||||
# include_webmin_modules()
|
|
||||||
# Returns 1 if we should include all Webmin modules and the program itself in
|
|
||||||
# the list of updates. Returns 2 if only non-core modules should be included.
|
|
||||||
# The first case is selected when you have a tar.gz install, while the second
|
|
||||||
# corresponds to a rpm or deb install with Virtualmin modules added.
|
|
||||||
sub include_webmin_modules
|
|
||||||
{
|
|
||||||
return 0 if (&webmin::shared_root_directory());
|
|
||||||
local $type = &read_file_contents("$root_directory/install-type");
|
|
||||||
chop($type);
|
|
||||||
if (!$type) {
|
|
||||||
# Webmin tar.gz install
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
# How was virtual-server installed?
|
|
||||||
return 0 if (!&foreign_check("virtual-server"));
|
|
||||||
local $vtype = &read_file_contents(
|
|
||||||
&module_root_directory("virtual-server")."/install-type");
|
|
||||||
chop($vtype);
|
|
||||||
if (!$vtype) {
|
|
||||||
# A tar.gz install ... which we may be able to update
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# include_usermin_modules()
|
|
||||||
# Returns 1 if Usermin was installed from a tar.gz, 2 if installed from an
|
|
||||||
# RPM but virtualmin-specific modules were from a tar.gz
|
|
||||||
sub include_usermin_modules
|
|
||||||
{
|
|
||||||
if (&foreign_installed("usermin")) {
|
|
||||||
&foreign_require("usermin", "usermin-lib.pl");
|
|
||||||
local $type = &usermin::get_install_type();
|
|
||||||
if (!$type) {
|
|
||||||
# Usermin tar.gz install
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
# How was virtual-server-theme installed?
|
|
||||||
local %miniserv;
|
|
||||||
&usermin::get_usermin_miniserv_config(\%miniserv);
|
|
||||||
local $vtype = &read_file_contents(
|
|
||||||
"$miniserv{'root'}/virtual-server-theme/install-type");
|
|
||||||
chop($vtype);
|
|
||||||
if (!$vtype) {
|
|
||||||
# A tar.gz install ... which we may be able to update
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
# installation_candiate(&package)
|
# installation_candiate(&package)
|
||||||
# Returns 1 if some package can be installed, even when it currently isn't.
|
# Returns 1 if some package can be installed, even when it currently isn't.
|
||||||
# Always true for now.
|
# Always true for now.
|
||||||
|
@ -26,16 +26,16 @@ else {
|
|||||||
$job->{'mins'} = $job->{'hours'} = $job->{'days'} =
|
$job->{'mins'} = $job->{'hours'} = $job->{'days'} =
|
||||||
$job->{'months'} = $job->{'weekdays'} = '*';
|
$job->{'months'} = $job->{'weekdays'} = '*';
|
||||||
if ($in{'sched'} eq 'h') {
|
if ($in{'sched'} eq 'h') {
|
||||||
$job->{'mins'} = '0';
|
$job->{'mins'} = int(rand()*60);
|
||||||
}
|
}
|
||||||
elsif ($in{'sched'} eq 'd') {
|
elsif ($in{'sched'} eq 'd') {
|
||||||
$job->{'mins'} = '0';
|
$job->{'mins'} = int(rand()*60);
|
||||||
$job->{'hours'} = '0';
|
$job->{'hours'} = int(rand()*24);
|
||||||
}
|
}
|
||||||
elsif ($in{'sched'} eq 'w') {
|
elsif ($in{'sched'} eq 'w') {
|
||||||
$job->{'mins'} = '0';
|
$job->{'mins'} = int(rand()*60);
|
||||||
$job->{'hours'} = '0';
|
$job->{'hours'} = int(rand()*24);
|
||||||
$job->{'weekdays'} = '0';
|
$job->{'weekdays'} = int(rand()*7);
|
||||||
}
|
}
|
||||||
&lock_file(&cron::cron_file($job));
|
&lock_file(&cron::cron_file($job));
|
||||||
if ($oldjob) {
|
if ($oldjob) {
|
||||||
@ -56,6 +56,7 @@ else {
|
|||||||
|
|
||||||
print "$msg<p>\n";
|
print "$msg<p>\n";
|
||||||
|
|
||||||
&ui_print_footer("", $text{'index_return'});
|
|
||||||
&webmin_log("sched", undef, $in{'sched_def'} ? 0 : 1);
|
&webmin_log("sched", undef, $in{'sched_def'} ? 0 : 1);
|
||||||
|
&ui_print_footer("index.cgi?all=$in{'all'}&mode=$in{'mode'}&search=".
|
||||||
|
&urlize($in{'search'}), $text{'index_return'});
|
||||||
|
|
||||||
|
@ -4,9 +4,13 @@
|
|||||||
$no_acl_check++;
|
$no_acl_check++;
|
||||||
require './package-updates-lib.pl';
|
require './package-updates-lib.pl';
|
||||||
|
|
||||||
|
if ($ARGV[0] eq "--debug" || $ARGV[0] eq "-debug") {
|
||||||
|
$debug = 1;
|
||||||
|
}
|
||||||
|
|
||||||
# See what needs doing
|
# See what needs doing
|
||||||
@current = &list_current(1);
|
@current = &list_all_current(1);
|
||||||
@avail = &list_available(1);
|
@avail = &list_available(1, 1);
|
||||||
foreach $c (sort { $a->{'name'} cmp $b->{'name'} } @current) {
|
foreach $c (sort { $a->{'name'} cmp $b->{'name'} } @current) {
|
||||||
($a) = grep { $_->{'name'} eq $c->{'name'} &&
|
($a) = grep { $_->{'name'} eq $c->{'name'} &&
|
||||||
$_->{'system'} eq $c->{'system'} } @avail;
|
$_->{'system'} eq $c->{'system'} } @avail;
|
||||||
@ -14,8 +18,8 @@ foreach $c (sort { $a->{'name'} cmp $b->{'name'} } @current) {
|
|||||||
# An update is available
|
# An update is available
|
||||||
push(@todo, { 'name' => $c->{'name'},
|
push(@todo, { 'name' => $c->{'name'},
|
||||||
'update' => $a->{'update'},
|
'update' => $a->{'update'},
|
||||||
|
'oldversion' => $c->{'version'},
|
||||||
'version' => $a->{'version'},
|
'version' => $a->{'version'},
|
||||||
'desc' => "New version released",
|
|
||||||
'level' => $a->{'security'} ? 1 : 2 });
|
'level' => $a->{'security'} ? 1 : 2 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,19 +29,19 @@ $tellcount = 0;
|
|||||||
foreach $t (@todo) {
|
foreach $t (@todo) {
|
||||||
if ($t->{'level'} <= $config{'sched_action'}) {
|
if ($t->{'level'} <= $config{'sched_action'}) {
|
||||||
# Can install
|
# Can install
|
||||||
$body .= "An update to $t->{'name'} $t->{'version'} is needed : $t->{'desc'}\n";
|
$body .= "An update to $t->{'name'} from $t->{'oldversion'} to $t->{'version'} is needed.\n";
|
||||||
($out, $done) = &capture_function_output(
|
($out, $done) = &capture_function_output(
|
||||||
\&package_install, $t->{'update'});
|
\&package_install, $t->{'update'});
|
||||||
if (@$done) {
|
if (@$done) {
|
||||||
$body .= "This update has been successfully installed.\n\n";
|
$body .= "This update has been successfully installed.\n\n";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$body .= "However, this update could not be installed! Try the update manually\nusing the Security Updates module.\n\n";
|
$body .= "However, this update could not be installed! Try the update manually\nusing the Package Updates module.\n\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
# Just tell the user about it
|
# Just tell the user about it
|
||||||
$body .= "An update to $t->{'name'} $t->{'version'} is available : $t->{'desc'}\n\n";
|
$body .= "An update to $t->{'name'} from $t->{'oldversion'} to $t->{'version'} is available.\n\n";
|
||||||
$tellcount++;
|
$tellcount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,10 +62,14 @@ if ($config{'sched_email'} && $body) {
|
|||||||
local $mail = { 'headers' =>
|
local $mail = { 'headers' =>
|
||||||
[ [ 'From', $from ],
|
[ [ 'From', $from ],
|
||||||
[ 'To', $config{'sched_email'} ],
|
[ 'To', $config{'sched_email'} ],
|
||||||
[ 'Subject', "Security updates" ] ],
|
[ 'Subject', "Package updates on ".
|
||||||
|
&get_system_hostname() ] ],
|
||||||
'attach' =>
|
'attach' =>
|
||||||
[ { 'headers' => [ [ 'Content-type', 'text/plain' ] ],
|
[ { 'headers' => [ [ 'Content-type', 'text/plain' ] ],
|
||||||
'data' => $body } ] };
|
'data' => $body } ] };
|
||||||
&mailboxes::send_mail($mail, undef, 1, 0);
|
&mailboxes::send_mail($mail, undef, 1, 0);
|
||||||
|
if ($debug) {
|
||||||
|
print STDERR $body;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user