#!/usr/local/bin/perl # Upgrade from Virtualmin GPL to Pro require './virtual-server-lib.pl'; &foreign_require("webmin", "webmin-lib.pl"); &foreign_require("cron", "cron-lib.pl"); &can_edit_templates() || &error($text{'upgrade_ecannot'}); &error_setup($text{'upgrade_err'}); &ReadParse(); # Make sure the serial and key are valid, by trying a HTTP request $in{'serial'} =~ /^\S+$/ || &error($text{'upgrade_eserial'}); $in{'key'} =~ /^\S+$/ || &error($text{'upgrade_ekey'}); &http_download($upgrade_virtualmin_host, $upgrade_virtualmin_port, $upgrade_virtualmin_testpage, \$out, \$error, undef, 0, $in{'serial'}, $in{'key'}, undef, 0, 1); if ($error =~ /401/) { &error($text{'upgrade_elogin'}); } elsif ($error) { &error(&text('upgrade_econnect', $error)); } if (&webmin::shared_root_directory()) { &error(&text('upgrade_esharedroot', "$root_directory")); } # Verify that the install is one we can upgrade chop($itype = &read_file_contents("$module_root_directory/install-type")); if ($itype eq "rpm") { -r $virtualmin_yum_repo || &error($text{'upgrade_eyumrepo'}); } elsif ($itype eq "deb") { $sources_list = "/etc/apt/sources.list"; $lref = &read_file_lines($sources_list); $found = 0; foreach $l (@$lref) { if ($l =~ /^deb\s+http:\/\/software\.virtualmin\.com/) { $found = 1; } } $found || $text{'upgrade_edebrepo'}; } &ui_print_unbuffered_header(undef, $text{'upgrade_title'}, ""); $SIG{'TERM'} = 'IGNORE'; # Stop process from being killed on upgrade # Write out the licence file &$first_print($text{'upgrade_file'}); &lock_file($virtualmin_license_file); %lfile = ( 'SerialNumber' => $in{'serial'}, 'LicenseKey' => $in{'key'} ); &write_env_file($virtualmin_license_file, \%lfile); &unlock_file($virtualmin_license_file); &$second_print($text{'setup_done'}); # Work out how we were installed. Possible sources are from the wbm.gz files, # from the GPL YUM repo, and from the GPL Debian repo if ($itype eq "rpm") { # GPL YUM repo. Replace it with the Pro version local $found; local $lref = &read_file_lines($virtualmin_yum_repo); foreach my $l (@$lref) { if ($l =~ /^baseurl=.*\/gpl(\/.*)/) { $l = "baseurl=http://$in{'serial'}:$in{'key'}\@$upgrade_virtualmin_host$1"; $found++; } } &flush_file_lines($virtualmin_yum_repo); $found || &error(&text('upgrade_eyumfile', "$virtualmin_yum_repo")); # Clear all YUM caches &$first_print($text{'upgrade_yumclear'}); &execute_command("yum clean all"); &$second_print($text{'setup_done'}); # Update all Virtualmin-related packages &foreign_require("software", "software-lib.pl"); foreach $p (&software::update_system_available()) { if ($p->{'name'} eq "webmin" || $p->{'name'} eq "usermin" || $p->{'name'} =~ /^(wbm|wbt|usm|ust)-/) { push(@packages, $p->{'name'}); } } &$first_print(&text('upgrade_rpms', join(" ", map { "$_" } @packages))); print "
";
	&clean_environment();
	open(YUM, "yum -y install ".join(" ", @packages)." 2>&1 |");
	while() {
		print &html_escape($_);
		}
	close(YUM);
	$errors++ if ($?);
	&reset_environment();
	&$second_print($text{'setup_done'});
	}
elsif ($itype eq "deb") {
	# GPL APT repo .. change to use the Pro one
	$lref = &read_file_lines($sources_list);
	foreach $l (@$lref) {
		if ($l =~ /^deb\s+http:\/\/software\.virtualmin\.com\/gpl(\/.*)/) {
			$l = "deb http://$in{'serial'}:$in{'key'}\@software.virtualmin.com$1";
			}
		}
	&flush_file_lines($sources_list);

	# Force refresh of packages
	&$first_print($text{'upgrade_update'});
	print "
";
	open(YUM, "apt-get update 2>&1 |");
	while() {
		print &html_escape($_);
		}
	close(YUM);
	&$second_print($text{'setup_done'});

	# Update all Virtualmin-related packages
	&foreign_require("software", "software-lib.pl");
	foreach $p (&software::update_system_available()) {
		if ($p->{'name'} eq "webmin" || $p->{'name'} eq "usermin" ||
		    $p->{'name'} =~ /^(webmin|usermin)-(virtualmin|virtual-server|security-updates)/) {
			if ($p->{'name'} eq 'webmin-virtual-server') {
				# For the Virtualmin package, select pro
				# version explicitly so that the GPL is
				# replaced.
				local ($ver) = grep { !/\.gpl/ }
					&apt_package_versions($p->{'name'});
                                push(@packages, $p->{'name'}."=".$ver);
				}
			else {
				push(@packages, $p->{'name'});
				}
			}
		}
	&$first_print(&text('upgrade_debs',
		join(" ", map { "$_" } @packages)));
	print "
";
	&clean_environment();
	open(YUM, "apt-get -y --force-yes -f install ".join(" ", @packages)." 2>&1 |");
	while() {
		print &html_escape($_);
		}
	close(YUM);
	$errors++ if ($?);
	&reset_environment();
	&$second_print($text{'setup_done'});
	}
else {
	# Assume wbm.gz install. Download all the Pro modules, and install them
	&$first_print($text{'upgrade_mods'});
	&$indent_print();
	&http_download($upgrade_virtualmin_host, $upgrade_virtualmin_port,
		       $upgrade_virtualmin_updates, \$uout, undef, undef, 0,
		       $in{'serial'}, $in{'key'}, undef, 0, 1);
	foreach $line (split(/\r?\n/, $uout)) {
		($mod, $ver, $path, $os_support, $desc) = split(/\t/, $line);
		next if (!$mod);
		&$first_print(&text('upgrade_mod', $mod, $ver));

		# Check if we have a later version
		local %minfo = &get_module_info($mod);
		local %tinfo = &get_theme_info($mod);
		local %info = %minfo ? %minfo : %tinfo;
		if (%info && ($info{'version'} > $ver ||
			      $info{'version'} == $ver &&
			      $info{'version'} !~ /gpl/)) {
			&$second_print(&text('upgrade_gotver',
					     $info{'version'}));
			if ($mod eq "virtual-server") {
				$errors++;
				goto PAGEEND;
				}
			next;
			}

		# Download the file
		($mhost, $mport, $mpage, $mssl) =
			&parse_http_url($path, $upgrade_virtualmin_host,
					$upgrade_virtualmin_port,
					$upgrade_virtualmin_updates, 0);
		($mfile = $mpage) =~ s/^(.*)\///;
		$mtemp = &transname($mfile);
		$merror = undef;
		&$indent_print();
		$progress_callback_url = ($mssl ? "https://" : "http://").
					 $mhost.$mpage;
		&http_download($mhost, $mport, $mpage, $mtemp, \$merror,
			       \&progress_callback, $mssl,
				$in{'serial'}, $in{'key'});
		&$outdent_print();
		if ($merror) {
			&$second_print(&text('upgrade_moderr', $merror));
			$errors++;
			if ($mod eq "virtual-server") {
				goto PAGEEND;
				}
			next;
			}

		# Actually install it
		$irv = &webmin::install_webmin_module($mtemp, 1, 0,
						      [ $base_remote_user ]);
		&set_all_html_print();	# In case changed by postinstall
		if (ref($irv)) {
			# Worked!
			local $dir = $irv->[1]->[0];
			$dir =~ s/^.*\///g;
			local %tinfo = &get_theme_info($dir);
			&$second_print(&text(%tinfo ? 'upgrade_themeok' :
						      'upgrade_modok', $irv->[0]->[0]));
			}
		else {
			# Install failed for some reason
			&$second_print(&text('upgrade_modfailed', $irv));
			$errors++;
			if ($mod eq "virtual-server") {
				goto PAGEEND;
				}
			}
		}
	&$outdent_print();
	&$second_print($text{'setup_done'});

	# Configure the Webmin updates service
	&$first_print($text{'upgrade_sched'});
	@upsource = split(/\t/, $webmin::config{'upsource'});
	@upsource = &unique(@upsource,
		"http://$upgrade_virtualmin_host:$upgrade_virtualmin_port$upgrade_virtualmin_updates",
		"http://$webmin::update_host:$webmin::update_port$webmin::update_page");
	&lock_file($webmin::module_config_file);
	$webmin::config{'upsource'} = join("\t", @upsource);
	$webmin::config{'upthird'} = 1;
	$webmin::config{'upuser'} = $in{'serial'};
	$webmin::config{'uppass'} = $in{'key'};
	$webmin::config{'upshow'} = 0;
	&webmin::save_module_config();
	&unlock_file($webmin::module_config_file);
	@jobs = &cron::list_cron_jobs();
	$upjob = &webmin::find_cron_job(\@jobs);
	if ($upjob) {
		&$second_print($text{'upgrade_schedok'});
		}
	else {
		&$second_print(&text('upgrade_schednot',
				     "../webmin/edit_upgrade.cgi",
				     $webmin::module_info{'desc'}));
		}

	# Use the Virtualmin framed theme
	if ($current_theme ne "virtual-server-theme" &&
	    $current_theme ne "thejax-theme") {
		%tinfo = &get_theme_info("virtual-server-theme");
		if (%tinfo) {
			&$first_print(&text('upgrade_theme', $tinfo{'desc'}));
			&lock_file("$config_directory/config");
			$gconfig{'theme'} = "virtual-server-theme";
			&write_file("$config_directory/config", \%gconfig);
			&unlock_file("$config_directory/config");
			&lock_file($ENV{'MINISERV_CONFIG'});
			&get_miniserv_config(\%miniserv);
			$miniserv{'preroot'} = "virtual-server-theme";
			&put_miniserv_config(\%miniserv);
			&unlock_file($ENV{'MINISERV_CONFIG'});
			&reload_miniserv();
			&$second_print($text{'setup_done'});
			}
		}
	}

# Clear security updates caches, as we now have new updates available
if (&foreign_installed("security-updates")) {
	&foreign_require("security-updates", "security-updates-lib.pl");
	unlink($security_updates::security_cache_file);
	unlink($security_updates::available_cache_file);
	unlink($security_updates::current_cache_file);
	}

PAGEEND:
if ($errors) {
	print "$text{'upgrade_problems'}

\n"; } else { print "$text{'upgrade_complete'}

\n"; } &webmin_log("upgrade"); &ui_print_footer("", $text{'index_return'}); sub apt_package_versions { local ($name) = @_; local @rv; open(OUT, "apt-cache show ".quotemeta($name)." |"); while() { if (/^Version:\s+(\S+)/) { push(@rv, $1); } } close(OUT); return @rv; }