chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:12:17 +08:00
commit cf8edb9f21
44281 changed files with 1655134 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
---- Changes since 1.150 ----
When displaying the details of a package, the version numbers from each of the hosts it is installed on is shown.
---- Changes since 1.170 ----
Added a page for comparing two or more systems, to check for mismatches between installed packages.
---- Changes since 1.190 ----
Package refreshes can now be limited to a single host or members of a group.
---- Changes since 1.200 ----
Packages can be installed from APT, YUM or other supported package systems on multiple hosts at once.
---- Changes since 1.220 ----
Multiple packages can be un-installed at once from multiple servers from the search results page.
---- Changes since 1.250 ----
When doing cluster compares, groups can be selected as well as individual hosts.
---- Changes since 1.310 ----
Added the ability to list, install and delete packages on systems using different package formats.
Added a popup progress window to track uploaded package files.
---- Changes since 1.380 ----
Added a Module Config option to show managed systems in a table.
+37
View File
@@ -0,0 +1,37 @@
#!/usr/local/bin/perl
# add.cgi
# Add or update a server or group from the webmin servers module
require './cluster-software-lib.pl';
&ReadParse();
@servers = &list_servers();
if ($in{'add'}) {
# Add a single host
@add = grep { $_->{'id'} eq $in{'server'} } @servers;
&error_setup($text{'add_err'});
$msg = &text('add_msg', &server_name($add[0]));
}
else {
# Add all from a group
($group) = grep { $_->{'name'} eq $in{'group'} }
&servers::list_all_groups(\@servers);
foreach $m (@{$group->{'members'}}) {
push(@add, grep { $_->{'host'} eq $m } @servers);
}
&error_setup($text{'add_gerr'});
$msg = &text('add_gmsg', $in{'group'});
}
&ui_print_header(undef, $text{'add_title'}, "");
print "<b>$msg</b><p>\n";
# Get the packages for each host
foreach $s (@add) {
($ok, $out) = &add_managed_host($s);
print "$out<p>\n";
}
&remote_finished();
&ui_print_footer("", $text{'index_return'});
+11
View File
@@ -0,0 +1,11 @@
#!/usr/local/bin/perl
# close.cgi
# Remove some class from the open list
require './cluster-software-lib.pl';
&ReadParse();
@heir = &get_heiropen($in{'id'});
@heir = grep { $_ ne $in{'what'} } @heir;
&save_heiropen(\@heir, $in{'id'});
&redirect("edit_host.cgi?id=$in{'id'}");
+9
View File
@@ -0,0 +1,9 @@
#!/usr/local/bin/perl
# closeall.cgi
# Empty the open list
require './cluster-software-lib.pl';
&ReadParse();
&save_heiropen([ ], $in{'id'});
&redirect("edit_host.cgi?id=$in{'id'}");
+370
View File
@@ -0,0 +1,370 @@
# cluster-software-lib.pl
# common functions for installing packages across a cluster
# XXX refresh all packages after installing
BEGIN { push(@INC, ".."); };
use WebminCore;
&init_config();
&foreign_require("servers", "servers-lib.pl");
&foreign_require("software", "software-lib.pl");
$parallel_max = 20;
%access = &get_module_acl();
# validate_remote_download_target()
# Validates URL-derived download target fields in %in
sub validate_remote_download_target
{
$in{'host'} =~ /^\S+$/ || &error("Invalid download host");
my @ips = &to_ipaddress($in{'host'});
push(@ips, &to_ip6address($in{'host'}));
@ips || &error("Invalid download host");
if ($in{'ftpfile'}) {
$in{'ftpfile'} =~ /^\/\S+$/ || &error("Invalid FTP path");
}
else {
$in{'port'} =~ /^\d+$/ && $in{'port'} >= 1 && $in{'port'} <= 65535 ||
&error("Invalid HTTP port");
$in{'page'} =~ /^\/\S*$/ || &error("Invalid HTTP path");
}
}
# list_software_hosts()
# Returns a list of all hosts whose software is being managed by this module
sub list_software_hosts
{
local @rv;
local %smap = map { $_->{'id'}, $_ } &list_servers();
local $hdir = "$module_config_directory/hosts";
opendir(DIR, $hdir);
foreach $h (readdir(DIR)) {
next if ($h =~ /\.host$/ || $h eq '.' || $h eq '..');
local %host = ( 'id', $h );
next if (!$smap{$h}); # underlying server was deleted
opendir(PDIR, "$hdir/$h") || next;
foreach $p (readdir(PDIR)) {
next if ($p eq "." || $p eq "..");
local %pkg;
&read_file("$hdir/$h/$p", \%pkg);
push(@{$host{'packages'}}, \%pkg);
}
closedir(PDIR);
&read_file("$hdir/$h.host", \%host);
push(@rv, \%host);
}
closedir(DIR);
return @rv;
}
# save_software_host(&host)
# Add or update a managed host with it's package list
sub save_software_host
{
local $hdir = "$module_config_directory/hosts";
mkdir($hdir, 0700);
if (-d "$hdir/$_[0]->{'id'}") {
opendir(DIR, "$hdir/$_[0]->{'id'}");
foreach $f (readdir(DIR)) {
unlink("$hdir/$_[0]->{'id'}/$f");
}
closedir(DIR);
}
else {
mkdir("$hdir/$_[0]->{'id'}", 0700);
}
foreach $p (@{$_[0]->{'packages'}}) {
local $pname = $p->{'name'};
$pname =~ s/\//_/g;
&write_file("$hdir/$_[0]->{'id'}/$pname", $p);
}
local %h = %{$_[0]};
delete($h{'packages'});
&write_file("$hdir/$_[0]->{'id'}.host", \%h);
}
# delete_software_host(&host)
sub delete_software_host
{
&unlink_file("$module_config_directory/hosts/$_[0]->{'id'}.host");
&unlink_file("$module_config_directory/hosts/$_[0]->{'id'}");
}
# list_servers()
# Returns a list of all servers from the webmin servers module that can be
# managed, plus this server
sub list_servers
{
local @servers = &servers::list_servers_sorted();
return ( &servers::this_server(), grep { $_->{'user'} } @servers );
}
# host_to_server(&host|id)
sub host_to_server
{
local $id = ref($_[0]) ? $_[0]->{'id'} : $_[0];
local ($serv) = grep { $_->{'id'} eq $id } &list_servers();
return $serv;
}
# server_name(&server)
sub server_name
{
return $_[0]->{'desc'} || $_[0]->{'realhost'} || $_[0]->{'host'};
}
# get_heiropen(hostid)
# Returns an array of open categories
sub get_heiropen
{
open(HEIROPEN, "<$module_config_directory/heiropen.$_[0]");
local @heiropen = <HEIROPEN>;
chop(@heiropen);
close(HEIROPEN);
return @heiropen;
}
# save_heiropen(&heir, hostid)
sub save_heiropen
{
&open_tempfile(HEIR, ">$module_config_directory/heiropen.$_[1]");
foreach $h (@{$_[0]}) {
&print_tempfile(HEIR, $h,"\n");
}
&close_tempfile(HEIR);
}
# create_on_input(desc, [no-donthave], [no-have])
sub create_on_input
{
local @hosts = &list_software_hosts();
local @servers = &list_servers();
local @opts;
push(@opts, [ -1, $text{'edit_all'} ]);
push(@opts, [ -2, $text{'edit_donthave'} ]) if (!$_[1]);
push(@opts, [ -3, $text{'edit_have'} ]) if (!$_[2]);
local @groups = &servers::list_all_groups(\@servers);
local $h;
foreach $h (@hosts) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
if ($s) {
push(@opts, [ $s->{'id'},
$s->{'desc'} || $s->{'realhost'} || $s->{'host'} ]);
$gothost{$s->{'host'}}++;
}
}
local $g;
foreach $g (@groups) {
local ($found, $m);
foreach $m (@{$g->{'members'}}) {
($found++, last) if ($gothost{$m});
}
push(@opts, [ "group_$g->{'name'}",
&text('edit_group', $g->{'name'}) ]) if ($found);
}
local $sel = &ui_select("server", undef, \@opts);
if ($_[0]) {
print &ui_table_row($_[0], $sel);
}
else {
print $sel;
}
}
# create_on_parse(prefix, &already, name)
sub create_on_parse
{
local @hosts = &list_software_hosts();
local @servers = &list_servers();
if ($in{'server'} == -2) {
# Install on hosts that don't have it
local %already = map { $_->{'id'}, 1 } @{$_[1]};
@hosts = grep { !$already{$_->{'id'}} } @hosts;
print "<b>",&text($_[0].'3', $_[2]),"</b><p>\n";
}
elsif ($in{'server'} == -3) {
# Install on hosts that do have it
local %already = map { $_->{'id'}, 1 } @{$_[1]};
@hosts = grep { $already{$_->{'id'}} } @hosts;
print "<b>",&text($_[0].'6', $_[2]),"</b><p>\n";
}
elsif ($in{'server'} =~ /^group_(.*)/) {
# Install on members of some group
local ($group) = grep { $_->{'name'} eq $1 }
&servers::list_all_groups(\@servers);
@hosts = grep { local $hid = $_->{'id'};
local ($s) = grep { $_->{'id'} == $hid } @servers;
&indexof($s->{'host'}, @{$group->{'members'}}) >= 0 }
@hosts;
print "<b>",&text($_[0].'4', $_[2], $group->{'name'}),
"</b><p>\n";
}
elsif ($in{'server'} != -1) {
# Just install on one host
@hosts = grep { $_->{'id'} == $in{'server'} } @hosts;
local ($s) = grep { $_->{'id'} == $hosts[0]->{'id'} } @servers;
print "<b>",&text($_[0].'5', $_[2],
&server_name($s)),"</b><p>\n";
}
else {
# Installing on every host
print "<b>",&text($_[0], join(" ", @names)),"</b><p>\n";
}
return @hosts;
}
# Setup error handler for down hosts
sub add_error
{
$add_error_msg = join("", @_);
}
# add_managed_host(&server)
# Adds a new system to this module for management, and returns a status code
# (0 or 1) and error or information message
sub add_managed_host
{
local ($s) = @_;
&remote_error_setup(\&add_error);
# Get the packages for each host
local %sconfig = &foreign_config("software");
$add_error_msg = undef;
local $host = { 'id' => $s->{'id'} };
local $soft = &remote_foreign_check($s->{'host'}, "software");
if ($add_error_msg) {
return (0, $add_error_msg);
}
if (!$soft) {
return (0, &text('add_echeck', $s->{'host'}));
}
&remote_foreign_require($s->{'host'}, "software", "software-lib.pl");
local $rconfig = &remote_foreign_config($s->{'host'}, "software");
#if ($rconfig->{'package_system'} ne $sconfig{'package_system'}) {
# return (0, &text('add_esystem', $s->{'host'}));
# }
$host->{'package_system'} = $rconfig->{'package_system'};
local $gconfig = &remote_foreign_config($s->{'host'}, undef);
foreach $g ('os_type', 'os_version',
'real_os_type', 'real_os_version') {
$host->{$g} = $gconfig->{$g};
}
local $n = &remote_foreign_call($s->{'host'}, "software",
"list_packages");
local $packages = &remote_eval($s->{'host'}, "software", "\\%packages");
for(my $i=0; $i<$n; $i++) {
push(@{$host->{'packages'}},
{ 'name' => $packages->{$i,'name'},
'class' => $packages->{$i,'class'},
'desc' => $packages->{$i,'desc'},
'version' => $packages->{$i,'version'},
'nouninstall' => $packages->{$i,'nouninstall'},
'nolist' => $packages->{$i,'nolist'}, });
}
&save_software_host($host);
return (1, &text('add_ok', &server_name($s), $n));
}
# refresh_packages(&hosts)
# Update the local cache with actual installed packages. Returns an array
# of either an error messages or two arrays of added and removed packages.
sub refresh_packages
{
local ($hosts) = @_;
local @servers = &list_servers();
# Setup error handler for down hosts
sub ref_error
{
$ref_error_msg = join("", @_);
}
&remote_error_setup(\&ref_error);
local $p = 0;
foreach my $h (@$hosts) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local ($rh = "READ$p", $wh = "WRITE$p");
pipe($rh, $wh);
if (!fork()) {
close($rh);
if ($s) {
# Refresh the list
&remote_foreign_require($s->{'host'}, "software",
"software-lib.pl");
if ($ref_error_msg) {
# Host is down ..
print $wh &serialise_variable($ref_error_msg);
exit;
}
local $gconfig = &remote_foreign_config($s->{'host'}, undef);
foreach $g ('os_type', 'os_version',
'real_os_type', 'real_os_version') {
$h->{$g} = $gconfig->{$g};
}
local @old = map { $_->{'name'} } @{$h->{'packages'}};
undef($h->{'packages'});
local $n = &remote_foreign_call($s->{'host'}, "software",
"list_packages");
local $packages = &remote_eval($s->{'host'}, "software",
"\\%packages");
local @added;
for($i=0; $i<$n; $i++) {
next if (!$packages->{$i,'name'});
push(@{$h->{'packages'}},
{ 'name' => $packages->{$i,'name'},
'class' => $packages->{$i,'class'},
'desc' => $packages->{$i,'desc'},
'version' => $packages->{$i,'version'},
'nouninstall' => $packages->{$i,'nouninstall'},
'nolist' => $packages->{$i,'nolist'}, });
$idx = &indexof($packages->{$i,'name'}, @old);
if ($idx < 0) {
push(@added, $packages->{$i,'name'});
}
else {
splice(@old, $idx, 1);
}
}
&save_software_host($h);
$rv = [ \@added, \@old ];
}
else {
# remove from managed list
&delete_software_host($h);
$rv = undef;
}
print $wh &serialise_variable($rv);
close($wh);
exit;
}
close($wh);
$p++;
}
# Read back results
$p = 0;
local @results;
foreach my $h (@hosts) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local $rh = "READ$p";
local $line = <$rh>;
local $rv = &unserialise_variable($line);
close($rh);
push(@results, $rv);
$p++;
}
return @results;
}
# same_package_system(&host)
# Returns 1 if some host is using the same package system as this master
sub same_package_system
{
local ($host) = @_;
return !$host->{'package_system'} ||
$host->{'package_system'} eq $software::config{'package_system'};
}
1;
+72
View File
@@ -0,0 +1,72 @@
#!/usr/local/bin/perl
# Do an actual comparison
require './cluster-software-lib.pl';
&error_setup($text{'compare_err'});
&ReadParse();
# Work out which servers to use
if ($in{'all'}) {
@hosts = &list_software_hosts();
}
else {
@allhosts = &list_software_hosts();
@servers = &list_servers();
@groups = &servers::list_all_groups(\@servers);
foreach $s (split(/\0/, $in{'hosts'})) {
if ($s =~ /^group_(.*)$/) {
# Add all group members
($group) = grep { $_->{'name'} eq $1 } @groups;
foreach $m (@{$group->{'members'}}) {
($server) =grep { $_->{'host'} eq $m } @servers;
($host) = grep { $_->{'id'} eq $server->{'id'} } @allhosts;
push(@hosts, $host) if ($host);
}
}
else {
# Add one host
($host) = grep { $_->{'id'} eq $s } @allhosts;
push(@hosts, $host) if ($host);
}
}
}
@hosts >= 2 || &error($text{'compare_etwo'});
&ui_print_header(undef, $text{'compare_title'}, "");
# Find union of all packages
foreach $h (@hosts) {
foreach $p (@{$h->{'packages'}}) {
$p->{'host'} = $h;
push(@{$packs{$p->{'name'}}}, $p);
}
}
# Show results by package
%smap = map { $_->{'id'}, $_ } &list_servers();
print &ui_columns_start([ $text{'compare_pack'},
map { &server_name($smap{$_->{'id'}}) } @hosts ]);
foreach $pn (sort { $a cmp $b } (keys %packs)) {
local @row = ( &ui_link("edit_pack.cgi?package=$pn",$pn) );
local $ok = 1;
foreach $h (@hosts) {
local ($ph) = grep { $_->{'host'} eq $h } @{$packs{$pn}};
if (!$ph) {
push(@row, $text{'compare_miss'});
$ok = 0;
}
else {
push(@row, $ph->{'version'} || $text{'compare_got'});
if ($ph->{'version'} &&
$ph->{'version'} != $packs{$pn}->[0]->{'version'}) {
$ok = 0;
}
}
}
if (!$ok || $in{'showall'}) {
print &ui_columns_row(\@row);
}
}
print &ui_columns_end();
&ui_print_footer("", $text{'index_return'});
+35
View File
@@ -0,0 +1,35 @@
#!/usr/local/bin/perl
# Show form for comparing packages on multiple servers
require './cluster-software-lib.pl';
&ui_print_header(undef, $text{'compare_title'}, "");
print "$text{'compare_desc'}<p>\n";
print &ui_form_start("compare.cgi", "post");
print "<table>\n";
# Hosts to compare
print "<tr> <td valign=top><b>$text{'compare_hosts'}</b></td> <td>\n";
print &ui_radio("all", 1, [ [ 1, $text{'compare_all'} ],
[ 0, $text{'compare_sel'} ] ]),"<br>\n";
%smap = map { $_->{'id'}, $_ } &list_servers();
@sel = map { [ $_->{'id'}, &server_name($smap{$_->{'id'}}) ] }
&list_software_hosts();
@groups = &servers::list_all_groups();
push(@sel, map { [ "group_".$_->{'name'}, &text('edit_group', $_->{'name'}) ] }
@groups);
print &ui_select("hosts", undef, \@sel, 5, 1);
print "</td> </tr>\n";
# Show all, or just mismatches?
print "<tr> <td><b>$text{'compare_showall'}</b></td> <td>\n";
print &ui_radio("showall", 0, [ [ 1, $text{'compare_showall1'} ],
[ 0, $text{'compare_showall0'} ] ]);
print "</td> </tr>\n";
print "</table>\n";
print &ui_submit($text{'compare_ok'});
print &ui_form_end();
&ui_print_footer("", $text{'index_return'});
+2
View File
@@ -0,0 +1,2 @@
sort_mode=0
table_mode=0
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Sort hosts by,1,1-Hostname,0-Order added,2-Description
table_mode=Show hosts as,1,1-Table,0-Icons
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Ordena els hosts per,1,1-Nom de host,0-Ordre d'addició,2-Descripció
table_mode=Mostra els hosts com a,1,1-Taula,0-Icones
+1
View File
@@ -0,0 +1 @@
sort_mode=Třídit hosty podle,1,1-Názvu hosta,0-Pořadí přidávání,2-Popisu
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Sortiere Hosts nach,1,1-Hostname,0-wie hinzugefügt,2-Beschreibung
table_mode=Zeige Hosts als,1,1-Tabelle,0-Symbol
+1
View File
@@ -0,0 +1 @@
sort_mode=Clasificar máquinas por,1,1-Nombre de máquina,0-Orden añadido,2-Descripción
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Trier les hôtes par,1,1-Nom d'hôte,0-Ordre ajouté,2-Description
table_mode=Afficher les hôtes comme,1,1-Table,0-Icônes
View File
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Susun hosts dengan,1,1-Nama host,0-Urutan yang ditambah,2-Penerangan
table_mode=Paparkan hosts sebagai,1,1-Jadual,0-Ikon
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Sorteer hosts met ,1,1-Hostnaam,0-Toegevoegde volgorde,2-Omschrijving
table_mode=Laat hosts zien als,1,1-Tabel,0-Iconen
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Sorter verter etter,1,1-Vertsnavn,0-Når de bla lagt til,2-Beskrivelse
table_mode=Viser verter som,1,1-Tabell,0-Ikoner
+2
View File
@@ -0,0 +1,2 @@
sort_mode=Sortuj hosty według,1,1-Nazw,0-Kolejności dodania,2-Opisu
table_mode=Wyświetl hosty jako,1,1-Tabela,0-Ikony
+1
View File
@@ -0,0 +1 @@
add=1
+11
View File
@@ -0,0 +1,11 @@
#!/usr/local/bin/perl
# delete_host.cgi
# Remove a managed host from the list
require './cluster-software-lib.pl';
&ReadParse();
@hosts = &list_software_hosts();
($host) = grep { $_->{'id'} == $in{'id'} } @hosts;
&delete_software_host($host);
&redirect("");
+111
View File
@@ -0,0 +1,111 @@
#!/usr/local/bin/perl
# delete_pack.cgi
# Ask if the user wants to delete a package, and if so do it
require './cluster-software-lib.pl';
&foreign_require("software", "software-lib.pl");
&ReadParse();
@servers = &list_servers();
@hosts = &list_software_hosts();
if ($in{'server'} < 0) {
# Find servers that have the package
foreach $h (@hosts) {
foreach $p (@{$h->{'packages'}}) {
if ($p->{'name'} eq $in{'package'}) {
local ($s) = grep { $_->{'id'} == $h->{'id'} }
@servers;
push(@got, $s);
$gotmap{$s} = $h;
$best = $s if (!$s->{'id'});
last;
}
}
}
$s = $best ? $best : $got[0];
}
else {
($s) = grep { $_->{'id'} == $in{'server'} } @servers;
($h) = grep { $_->{'id'} == $in{'server'} } @hosts;
@got = ( $s );
$gotmap{$s} = $h;
}
&ui_print_header(undef, $text{'delete_title'}, "", "delete_pack");
if ($in{'sure'}) {
# Do the deletion
print "<b>",&text('delete_header', "<tt>$in{'package'}</tt>"),"</b><p>\n";
&remote_multi_callback(\@got, $parallel_max, \&delete_callback, undef,
\@rvs, \@errs, "software", "software-lib.pl");
# Show the results
$p = 0;
foreach $g (@got) {
local $d = $g->{'desc'} ? $g->{'desc'} : $g->{'host'};
if ($errs[$p] || $rvs[$p]) {
print &text('delete_error', $d, $errs[$p] || $rvs[$p]),"<br>\n";
}
else {
print &text('delete_success', $d),"<br>\n";
local $h = $gotmap{$g};
local @newpacks = grep { $_->{'name'} ne $in{'package'} } @{$h->{'packages'}};
$h->{'packages'} = \@newpacks;
&save_software_host($h);
}
$p++;
}
print "<p><b>$text{'delete_done'}</b><p>\n";
}
else {
# Sum up file sizes on best host
&remote_foreign_require($s->{'host'}, "software", "software-lib.pl");
if (!$gotmap{$s}->{'nofiles'}) {
$n = &remote_foreign_call($s->{'host'}, "software",
"check_files", $in{'package'});
$files = &remote_eval($s->{'host'}, "software", "\\%files");
$sz = 0;
for($i=0; $i<$n; $i++) {
if ($files->{$i,'type'} == 0) {
$sz += $files->{$i,'size'};
}
}
}
# Ask if the user is sure..
print "<center>\n";
if ($in{'server'} < 0) {
print &text($n ? 'delete_rusure' : 'delete_rusurenone',
"<tt>$in{'package'}</tt>", $n, $sz),"<br>\n";
}
else {
print &text($n ? 'delete_rusure2' : 'delete_rusure2none',
"<tt>$in{'package'}</tt>", $n, $sz,
$s->{'desc'} ? $s->{'desc'} : $s->{'host'}),"<br>\n";
}
print "<form action=delete_pack.cgi>\n";
print "<input type=hidden name=package value=\"$in{'package'}\">\n";
print "<input type=hidden name=server value=\"$in{'server'}\">\n";
print "<input type=hidden name=sure value=1>\n";
print "<input type=hidden name=search value=\"$in{'search'}\">\n";
print "<input type=submit value=\"$text{'delete_ok'}\"><p>\n";
# Show deletion options - but only if remote package system matches
if (defined(&software::delete_options) &&
&same_package_system($gotmap{$s})) {
&foreign_call("software", "delete_options", $p);
}
print "</center></form>\n";
}
&remote_finished();
&ui_print_footer("", $text{'index_return'});
# delete_callback(&host)
sub delete_callback
{
local $error = &remote_foreign_call($_[0]->{'host'},
"software", "delete_package", $in{'package'}, \%in);
return $error;
}
+100
View File
@@ -0,0 +1,100 @@
#!/usr/local/bin/perl
# Ask if the user wants to delete multiple packages, and if so do it
require './cluster-software-lib.pl';
&ReadParse();
&error_setup($text{'deletes_err'});
# Find the specified hosts
@servers = &list_servers();
@hosts = &list_software_hosts();
if ($in{'server'} >= 0) {
@hosts = grep { $_->{'id'} eq $in{'server'} } @hosts;
}
@got = map { &host_to_server($_) } @hosts;
# Find the packages for each host
@packs = split(/\0/, $in{'del'});
foreach $p (@packs) {
foreach $h (@hosts) {
($pkg) = grep { $_->{'name'} eq $p } @{$h->{'packages'}};
if ($pkg) {
push(@{$pkghosts{$h->{'id'}}}, $p);
$pkgmap{$h->{'id'},$p} = 1;
$found++;
}
}
}
$found || &error($text{'deletes_enone'});
&ui_print_header(undef, $text{'deletes_title'}, "", undef);
if ($in{'sure'}) {
# do the deletion
print "<b>",&text('deletes_desc', "<tt>".join(" ", @packs)."</tt>"),
"</b><p>\n";
&remote_multi_callback(\@got, $parallel_max, \&deletes_callback, undef,
\@rvs, \@errs, "software", "software-lib.pl");
# Show the results
$p = 0;
foreach $h (@hosts) {
$g = &host_to_server($h);
local $d = $g->{'desc'} ? $g->{'desc'} : $g->{'host'};
if ($errs[$p] || $rvs[$p]) {
print &text('delete_error', $d, $errs[$p] || $rvs[$p]),"<br>\n";
}
else {
print &text('delete_success', $d),"<br>\n";
local @newpacks = grep { !$pkgmap{$h->{'id'},$_->{'name'}} } @{$h->{'packages'}};
$h->{'packages'} = \@newpacks;
&save_software_host($h);
}
$p++;
}
print "<p><b>$text{'delete_done'}</b><p>\n";
&webmin_log("deletes", "package", undef, { 'packs' => \@packs });
}
else {
# Ask if the user is sure..
print "<center>\n";
print &text('deletes_rusure', "<tt>".join(" ", @packs)."</tt>"),
"<p>\n";
print "<form action=delete_packs.cgi>\n";
foreach $d (@packs) {
print "<input type=hidden name=del value='$d'>\n";
}
print "<input type=hidden name=sure value=1>\n";
print "<input type=hidden name=server value=$in{'server'}>\n";
print "<input type=hidden name=search value=\"$in{'search'}\">\n";
print "<input type=submit value=\"$text{'deletes_ok'}\"><p>\n";
if (defined(&software::delete_options) &&
&same_package_system($hosts[0])) {
&software::delete_options($packs[0]);
}
print "</center></form>\n";
}
&ui_print_footer("search.cgi?search=$in{'search'}", $text{'search_return'});
# deletes_callback(&server)
sub deletes_callback
{
local ($serv) = @_;
local @pkgs = @{$pkghosts{$serv->{'id'}}};
if (defined(&software::delete_packages)) {
# Use single delete function
$error = &remote_foreign_call($serv->{'host'}, "software", "delete_packages", \@pkgs, \%in);
}
else {
# Call delete function once per package
local @errors;
foreach my $p (@pkgs) {
local $oneerror = &remote_foreign_call($serv->{'host'}, "software", "delete_package", $p, \%in);
push(@errors, $oneerror) if ($oneerror);
}
$error = join(" ", @errors);
}
return $error;
}
+273
View File
@@ -0,0 +1,273 @@
#!/usr/local/bin/perl
# do_install.cgi
# Install some package on all hosts, in parallel. If the package was
# downloaded from a URL, have the hosts do the same - otherwise, transfer
# it to each.
require './cluster-software-lib.pl';
&ReadParse();
# Work out package names, for display to use
if ($in{'source'} == 3) {
# Package names are from YUM
@packages = @names = @descs = split(/\s+/, $in{'file'});
}
else {
# Get package names and descriptions from file
@packages = $in{'unknownfile'} ? ( $in{'unknownfile'} ) :
&software::file_packages($in{'file'});
foreach $p (@packages) {
local ($n, $d) = split(/\s+/, $p, 2);
push(@names, $n);
push(@descs, $d || $n);
}
}
$in{'source'} == 3 || -r $in{'file'} || &error($text{'do_edeleted'});
if ($in{'source'} == 2 && $in{'down'}) {
&validate_remote_download_target();
}
&ui_print_header(undef, $text{'do_title'}, "");
# Setup error handler for down hosts
sub inst_error
{
$inst_error_msg = join("", @_);
}
&remote_error_setup(\&inst_error);
# Work out hosts to install on
@hosts = &list_software_hosts();
@already = grep { local ($alr) = grep { $_->{'name'} eq $names[0] }
@{$_->{'packages'}};
$alr } @hosts;
@hosts = &create_on_parse("do_header", \@already, join(" ", @names));
@servers = &list_servers();
$p = 0;
foreach $h (@hosts) {
# Install on one host
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local $d = $s->{'desc'} || $s->{'realhost'} || $s->{'host'};
local ($rh = "READ$p", $wh = "WRITE$p");
pipe($rh, $wh);
select($wh); $| = 1; select(STDOUT);
if (!fork()) {
# Do the install in a subprocess
close($rh);
&remote_foreign_require($s->{'host'}, "software",
"software-lib.pl");
if ($inst_error_msg) {
# Failed to contact host ..
print $wh &serialise_variable([ $inst_error_msg ]);
exit;
}
local $rfile;
local $need_unlink = 1;
if ($in{'source'} == 3) {
# Installing from an update service like APT or YUM
$need_unlink = 0;
}
elsif (!$s->{'id'}) {
# This host, so we already have the file
$rfile = $in{'file'};
$need_unlink = 0;
}
elsif ($in{'source'} == 0) {
# Is the file the same on remote (like if we have NFS)
local @st = stat($in{'file'});
local $qfile = &quote_literal_escape($in{'file'});
local $rst = &remote_eval($s->{'host'}, "software",
"[ stat('$qfile') ]");
local @rst = @$rst;
if (@st && @rst && $st[7] == $rst[7] &&
$st[9] == $rst[9]) {
# File is the same! No need to download
$rfile = $in{'file'};
$need_unlink = 0;
}
else {
# Need to copy the file across :(
local $filename = $in{'file'};
$filename =~ /([^\/\\]+)$/;
$rfile = &remote_write(
$s->{'host'}, $in{'file'}, undef, "$1");
}
}
elsif ($in{'source'} == 2 && $in{'down'}) {
# Ask the remote server to download the file
local $filename = $in{'file'};
$filename =~ /([^\/\\]+$)/;
$rfile = &remote_foreign_call($s->{'host'}, "software",
"tempname", $1);
if ($in{'ftpfile'}) {
&remote_foreign_call($s->{'host'}, "software",
"ftp_download", $in{'host'}, $in{'ftpfile'},
$rfile);
}
else {
&remote_foreign_call($s->{'host'}, "software",
"http_download", $in{'host'}, $in{'port'},
$in{'page'}, $rfile, undef, undef,
$in{'ssl'});
}
}
else {
# Need to copy the file across :(
local $filename = $in{'file'};
$filename =~ /([^\/\\]+)$/;
$rfile = &remote_write($s->{'host'}, $in{'file'},
undef, "$1");
}
# Do the install ..
local @rv;
if ($in{'source'} != 3) {
# Installing some package
for($i=0; $i<@names; $i++) {
local $error = &remote_foreign_call(
$s->{'host'}, "software",
"install_package", $rfile,
$names[$i], \%in);
if ($error) {
push(@rv, $error);
}
else {
# Success .. get the package details
push(@rv, [ &remote_foreign_call($s->{'host'}, "software", "package_info", $names[$i]) ] );
}
}
}
else {
# Install from update system
local $rus = &remote_eval($s->{'host'}, "software",
'$update_system');
if ($rus ne $software::update_system) {
push(@rv, &text('install_erus',
$rus, $software::update_system));
}
else {
local @resp = &remote_foreign_call($s->{'host'},
"software", "capture_function_output",
"software::update_system_install",
$in{'file'});
if (@{$resp[1]}) {
# Worked .. get package details
foreach $p (@{$resp[1]}) {
push(@rv, [ &remote_foreign_call($s->{'host'}, "software", "package_info", $p) ] );
}
}
else {
# May have failed
($first) = split(/\s+/, $in{'file'});
local @info = &remote_foreign_call(
$s->{'host'}, "software",
"package_info", $first);
if (@info && $info[0] eq $first) {
push(@rv, &text('install_ealready', $info[4]));
}
else {
push(@rv, $text{'install_eupdate'});
}
}
}
}
if ($need_unlink) {
local $qfile = &quote_literal_escape($rfile);
&remote_eval($s->{'host'}, "software",
"unlink('$qfile')");
}
print $wh &serialise_variable(\@rv);
close($wh);
exit;
}
close($wh);
$p++;
}
# Get back all the results
$p = 0;
foreach $h (@hosts) {
local $rh = "READ$p";
local $line = <$rh>;
close($rh);
local $rv = &unserialise_variable($line);
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local $d = $s->{'desc'} || $s->{'realhost'} || $s->{'host'};
if (!$line) {
print &text('do_failed', $d, "Unknown reason"),"<br>\n";
}
else {
$i=0;
foreach $r (@$rv) {
if (ref($r)) {
# Install went ok!
print &text('do_success2', $r->[0],$d),"<br>\n";
$pinfo[$i] = $r if (!$pinfo[$i] && @$r);
if (!@$r) {
# Failed to get info! Need a refresh..
$refresh{$s->{'id'}} = 1;
}
elsif ($names[$i] &&
&indexof($names[$i],
@{$h->{'packages'}}) < 0) {
push(@{$h->{'packages'}},
{ 'name' => $names[$i],
'desc' => $descs[$i],
'class' => $pinfo[$i]->[1],
'version' => $pinfo[$i]->[4] });
&save_software_host($h);
}
}
else {
# Failed for some reason..
print &text('do_failed', $d, $r),"<br>\n";
}
$i++;
}
}
$p++;
}
unlink($in{'file'}) if ($in{'need_unlink'});
print "<p><b>$text{'do_done'}</b><p>\n";
# Show details of installed packages, where we have them
for($i=0; $i<@names; $i++) {
next if (!$pinfo[$i]);
print &ui_table_start($text{'do_details'}, "width=100%", 4);
if ($pinfo[$i]->[2]) {
print &ui_table_row($text{'do_desc'},
"<pre>".&html_escape($pinfo[$i]->[2])."</pre>", 3);
}
print &ui_table_row($text{'do_pack'},
$pinfo[$i]->[0]);
print &ui_table_row($text{'do_class'},
$pinfo[$i]->[1] || $text{'do_none'});
print &ui_table_row($text{'do_ver'},
$pinfo[$i]->[4]);
print &ui_table_row($text{'do_vend'},
$pinfo[$i]->[5]);
print &ui_table_row($text{'do_arch'},
$pinfo[$i]->[3]);
print &ui_table_row($text{'do_inst'},
$pinfo[$i]->[6]);
print &ui_table_end();
}
&remote_finished();
&ui_print_footer("", $text{'index_return'});
+114
View File
@@ -0,0 +1,114 @@
#!/usr/local/bin/perl
# do_install.cgi
# Install some package on all hosts, in parallel. If the package was
# downloaded from a URL, have the hosts do the same - otherwise, transfer
# it to each.
require './cluster-software-lib.pl';
&ReadParse();
@packages = &foreign_call("software", "file_packages", $in{'file'});
foreach $p (@packages) {
local ($n, $d) = split(/\s+/, $p, 2);
push(@names, $n); push(@descs, $d);
}
-r $in{'file'} || &error($text{'do_edeleted'});
if ($in{'source'} == 2 && $in{'down'}) {
&validate_remote_download_target();
}
&ui_print_header(undef, $text{'do_title'}, "");
print "<b>",&text('do_header', join(" ", @names)),"</b><p>\n";
@hosts = &list_software_hosts();
@servers = &list_servers();
foreach $h (@hosts) {
# Check if already installed
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
local $d = $s->{'desc'} ? $s->{'desc'} : $s->{'host'};
local ($a) = grep { &indexof($_->{'name'}, @names) >= 0 }
@{$h->{'packages'}};
#if ($a) {
# print &text('do_already', $d),"<br>\n";
# next;
# }
&remote_foreign_require($s->{'host'}, "software", "software-lib.pl");
local $rfile;
local $need_unlink = 1;
if (!$s->{'id'}) {
# This host, so we already have the file
$rfile = $in{'file'};
$need_unlink = 0;
}
elsif ($in{'source'} == 2 && $in{'down'}) {
# Ask the remote server to download the file
$rfile = &remote_eval($s->{'host'}, "software", '&tempname()');
if ($in{'ftpfile'}) {
&remote_foreign_call($s->{'host'}, "software",
"ftp_download", $in{'host'}, $in{'ftpfile'},
$rfile);
}
else {
&remote_foreign_call($s->{'host'}, "software",
"http_download", $in{'host'}, $in{'port'},
$in{'page'}, $rfile);
}
}
else {
# Need to copy the file across :(
$rfile = &remote_write($s->{'host'}, $in{'file'});
}
# Do the install ..
for($i=0; $i<@names; $i++) {
local $error = &remote_foreign_call($s->{'host'}, "software",
"install_package", $rfile, $names[$i], \%in);
if ($error) {
print &text('do_failed', $d, $error),"<br>\n";
}
else {
# Success .. get the package details and add to list
print &text('do_success', $d),"<br>\n";
if (!$pinfo[$i]) {
$pinfo[$i] = [ &remote_foreign_call($s->{'host'}, "software",
"package_info", $names[$i]) ];
}
if (&indexof($names[$i], @{$h->{'packages'}}) < 0) {
push(@{$h->{'packages'}},
{ 'name' => $names[$i],
'desc' => $descs[$i],
'class' => $pinfo[$i]->[1] });
&save_software_host($h);
}
}
}
if ($need_unlink) {
local $qfile = &quote_literal_escape($rfile);
&remote_eval($s->{'host'}, "software", "unlink('$qfile')");
}
}
unlink($in{'file'}) if ($in{'need_unlink'});
print "<p><b>$text{'do_done'}</b><p>\n";
for($i=0; $i<@names; $i++) {
next if (!$pinfo[$i]);
print "<table border width=100%>\n";
print "<tr $tb> <td><b>$text{'do_details'}</b></td> </tr>\n";
print "<tr $cb> <td><table width=100%>\n";
print "<tr> <td valign=top width=20%><b>$text{'do_desc'}</b></td>\n";
print "<td colspan=3><font size=+1><pre>$pinfo[$i]->[2]</pre></font></td> </tr>\n";
print "<tr> <td width=20%><b>$text{'do_pack'}</b></td> <td>$pinfo[$i]->[0]</td>\n";
print "<td width=20%><b>$text{'do_class'}</b></td> <td>",
$pinfo[$i]->[1] ? $pinfo[$i]->[1] : $text{'do_none'},"</td> </tr>\n";
print "<tr> <td width=20%><b>$text{'do_ver'}</b></td> <td>$pinfo[$i]->[4]</td>\n";
print "<td width=20%><b>$text{'do_vend'}</b></td> <td>$pinfo[$i]->[5]</td> </tr>\n";
print "<tr> <td width=20%><b>$text{'do_arch'}</b></td> <td>$pinfo[$i]->[3]</td>\n";
print "<td width=20%><b>$text{'do_inst'}</b></td> <td>$pinfo[$i]->[6]</td> </tr>\n";
print "</table></td></tr></table><p>\n";
}
&remote_finished();
&ui_print_footer("", $text{'index_return'});
+131
View File
@@ -0,0 +1,131 @@
#!/usr/local/bin/perl
# edit_host.cgi
# Show details of a managed host, and all the packages on it
require './cluster-software-lib.pl';
&foreign_require("servers", "servers-lib.pl");
&ReadParse();
&ui_print_header(undef, $text{'host_title'}, "", "edit_host");
@hosts = &list_software_hosts();
($host) = grep { $_->{'id'} eq $in{'id'} } @hosts;
$server = &foreign_call("servers", "get_server", $in{'id'});
@packages = @{$host->{'packages'}};
# Show host details
print "<table border width=100%>\n";
print "<tr $tb> <td><b>$text{'host_header'}</b></td> </tr>\n";
print "<tr $cb> <td><table width=100%>\n";
print "<tr> <td><b>$text{'host_name'}</b></td>\n";
if ($server->{'id'}) {
$h = $server->{'realhost'} || $server->{'host'};
printf "<td>". &ui_link("/servers/link.cgi/%s/","%s")."</td>\n",
$server->{'id'}, $server->{'desc'} ? "$server->{'desc'} ($h:$server->{'port'})" : "$h:$server->{'port'}";
}
else {
print "<td><a href=/>$text{'this_server'}</a></td>\n";
}
if ($server->{'id'}) {
print "<td><b>$text{'host_type'}</b></td> <td>\n";
foreach $t (@servers::server_types) {
print $t->[1] if ($t->[0] eq $server->{'type'});
}
print "</td>\n";
}
print "</tr>\n";
print "<tr> <td><b>$text{'host_count'}</b></td>\n";
printf "<td>%d</td>\n", scalar(@packages);
print "<td><b>$text{'host_os'}</b></td>\n";
print "<td>$host->{'real_os_type'} $host->{'real_os_version'}</td> </tr>\n";
print "<tr> <td><b>$text{'host_system'}</b></td>\n";
$system = $host->{'package_system'} || $software::config{'package_system'};
print "<td colspan=3>",uc($system),"</td>\n";
print "</tr>\n";
print "</table></td></tr></table>\n";
# Show delete and refresh buttons
print "<p></p><table width=100%><tr>\n";
print "<td><form action=delete_host.cgi>\n";
print "<input type=hidden name=id value=$in{'id'}>\n";
print "<input type=submit value='$text{'host_delete'}'>\n";
print "</form></td>\n";
print "<td align=right><form action=refresh.cgi>\n";
print "<input type=hidden name=id value=$in{'id'}>\n";
print "<input type=submit value='$text{'host_refresh'}'>\n";
print "</form></td>\n";
print "</tr></table>\n";
# Show tree of packages
$heir{""} = "";
foreach $c (sort { $a cmp $b } &unique(map { $_->{'class'} } @packages)) {
if (!$c) { next; }
@w = split(/\//, $c);
$p = join('/', @w[0..$#w-1]);
if (!defined($heir{$p})) {
$pp = join('/', @w[0..$#w-2]);
$heir{$pp} .= "$p\0";
}
$heir{$p} .= "$c\0";
$hasclasses++;
}
# get the current open list
%heiropen = map { $_, 1 } &get_heiropen($in{'id'});
$heiropen{""}++;
# traverse the hierarchy
$spacer = "&nbsp;"x3;
print &ui_hr();
print &ui_subheading($text{'host_installed'});
print "<table width=100%>\n";
&traverse("", 0);
print "</table>\n";
if ($hasclasses) {
print "<p></p>";
print &ui_link("closeall.cgi?id=$in{'id'}",$text{'host_close'}),"\n";
print &ui_link("openall.cgi?id=$in{'id'}",$text{'host_open'}),"<p>\n";
}
&ui_print_footer("", $text{'index_return'});
sub traverse
{
local($s, $act, $i);
print "<tr style='border-top: 1px solid #aaaaaa28'> <td>", $spacer x $_[1];
if ($_[0]) {
print "<a name=\"$_[0]\"></a>\n";
$act = $heiropen{$_[0]} ? "close" : "open";
print "<a href=\"$act.cgi?id=$in{'id'}&what=",&urlize($_[0]),"\">";
$_[0] =~ /([^\/]+)$/;
print "<img border=0 src=images/$act.gif></a>&nbsp; $1</td>\n",
}
else { print "<img src=images/close.gif> <i>$text{'host_all'}</i></td>\n"; }
print "<td><br></td> </tr>\n";
if ($heiropen{$_[0]}) {
# print sub-folders followed by packages
foreach $i (@packages) {
if ($i->{'class'} eq $_[0]) {
print "<tr style='border-top: 1px solid #aaaaaa28'> <td>", $spacer x ($_[1]+1);
print "<img border=0 src=images/pack.gif></a>&nbsp;\n";
print "<a href=\"edit_pack.cgi?package=",
&urlize($i->{'name'}),"\">$i->{'name'}</a></td>\n";
print "<td>$i->{'desc'}</td>\n";
print "</tr>\n";
}
}
foreach $s (&unique(split(/\0+/, $heir{$_[0]}))) {
&traverse($s, $_[1]+1);
}
}
}
+104
View File
@@ -0,0 +1,104 @@
#!/usr/local/bin/perl
# edit_pack.cgi
# Display details of a package
require './cluster-software-lib.pl';
&ReadParse();
&ui_print_header(undef, $text{'edit_title'}, "", "edit_pack");
# Find all hosts with the package
@hosts = &list_software_hosts();
@servers = &list_servers();
foreach $h (@hosts) {
foreach $p (@{$h->{'packages'}}) {
if ($p->{'name'} eq $in{'package'}) {
local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers;
push(@got, $s);
$version{$s} = $p->{'version'};
$pkg = $p if (!$pkg);
$checkon = $s if (!$s->{'id'});
}
}
}
# Get the details from this host, or the first in the list
$checkon = $got[0] if (!$checkon);
&remote_foreign_require($checkon->{'host'}, "software", "software-lib.pl");
@pinfo = &remote_foreign_call($checkon->{'host'}, "software", "package_info",
$in{'package'});
# Show package details
print "<table border width=100%>\n";
print "<tr $tb> <td><b>",&text('edit_details', $checkon->{'desc'} ?
$checkon->{'desc'} : "<tt>$checkon->{'host'}</tt>"),"</b></td> </tr>\n";
print "<tr $cb> <td><table width=100%>\n";
# Description, if we have one
if ($pinfo[2]) {
print "<tr> <td valign=top width=20%><b>$text{'edit_desc'}</b></td>\n";
print "<td colspan=3>",
&html_escape(&entities_to_ascii($pinfo[2])),
"</td> </tr>\n";
}
print "<tr> <td width=20%><b>$text{'edit_pack'}</b></td> <td>$pinfo[0]</td>\n";
print "<td width=20%><b>$text{'edit_class'}</b></td> <td>",
$pinfo[1] ? $pinfo[1] : $text{'edit_none'},"</td> </tr>\n";
print "<tr> <td width=20%><b>$text{'edit_ver'}</b></td> <td>$pinfo[4]</td>\n";
print "<td width=20%><b>$text{'edit_vend'}</b></td> <td>$pinfo[5]</td> </tr>\n";
print "<tr> <td width=20%><b>$text{'edit_arch'}</b></td> <td>$pinfo[3]</td>\n";
print "<td width=20%><b>$text{'edit_inst'}</b></td> <td>$pinfo[6]</td> </tr>\n";
print "</table></td></tr></table><p>\n";
print &ui_buttons_start();
# Show button to list files, if possible
@opts = map { [ $_->{'id'},
($_->{'desc'} || $_->{'realhost'} || $_->{'host'}) ] } @got;
if (!$pinfo[8]) {
$ssel = &ui_select("server", undef, \@opts);
print &ui_buttons_row("list_pack.cgi",
$text{'edit_list'},
$text{'edit_listdesc'},
&ui_hidden("package", $pinfo[0]).
&ui_hidden("search", $in{'search'}),
$ssel);
}
# Show button to un-install, if possible
if (!$pinfo[7]) {
$ssel = &ui_select("server", undef,
[ [ -1, $text{'edit_all'} ], @opts ]);
print &ui_buttons_row("delete_pack.cgi",
$text{'edit_uninst'},
$text{'edit_uninstdesc'},
&ui_hidden("package", $pinfo[0]).
&ui_hidden("search", $in{'search'}),
$ssel);
}
print &ui_buttons_end();
# Show hosts with the package
print &ui_hr();
print &ui_subheading($text{'edit_hosts'});
@icons = map { "/servers/images/$_->{'type'}.svg" } @got;
@links = map { "edit_host.cgi?id=$_->{'id'}" } @got;
@titles = map { ($_->{'desc'} ? $_->{'desc'} :
$_->{'realhost'} ? "$_->{'realhost'}:$_->{'port'}" :
"$_->{'host'}:$_->{'port'}").
($version{$_} ? "<br>$text{'edit_ver'} $version{$_}" : "") } @got;
&icons_table(\@links, \@titles, \@icons);
print "<br>";
&remote_finished();
if ($in{'search'}) {
&ui_print_footer("search.cgi?search=$in{'search'}", $text{'search_return'});
}
else {
&ui_print_footer("", $text{'index_return'});
}
@@ -0,0 +1 @@
<header> حذف الحزمة </header> تسمح لك هذه الصفحة بتأكيد حذف الحزمة قبل إزالتها من خادم واحد أو أكثر. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Изтриване на пакета </header> Тази страница ви позволява да потвърдите изтриването на пакет, преди той да бъде премахнат от един или повече сървъри. <p><hr>
@@ -0,0 +1,9 @@
<header>Supressió de Paquet</header>
Aquesta pàgina permet confirmar la supressió d'un paquet abans que s'elimini
d'un o més servidors.
<p>
<hr>
@@ -0,0 +1 @@
<header> Smazat balíček </header> Tato stránka umožňuje potvrdit odstranění balíčku před jeho odebráním z jednoho nebo více serverů. <p><hr>
@@ -0,0 +1 @@
<header> Slet pakke </header> Denne side giver dig mulighed for at bekræfte sletningen af en pakke, før den fjernes fra en eller flere servere. <p><hr>
@@ -0,0 +1 @@
<header>Paket löschen</header>Diese Seite ermöglicht die Bestätigung der Löschung eines Pakets, bevor es von einem oder mehreren Servern entfernt wird.<p><hr>
@@ -0,0 +1 @@
<header> Διαγραφή πακέτου </header> Αυτή η σελίδα σάς επιτρέπει να επιβεβαιώσετε τη διαγραφή ενός πακέτου προτού καταργηθεί από έναν ή περισσότερους διακομιστές. <p><hr>
@@ -0,0 +1,7 @@
<header>Borrar Paquete</header>
Esta página le permite confirmar el borrado de un paquete antes de que sea
eliminado de uno o más servidores. <p>
<hr>
@@ -0,0 +1 @@
<header> Paketea ezabatu </header> Orrialde honek zerbitzari bat edo gehiago kargatu aurretik pakete bat ezabatu ahal izango duzu. <p><hr>
@@ -0,0 +1 @@
<header> پاک کردن بسته </header> این صفحه به شما امکان می دهد قبل از حذف یک یا چند سرور ، حذف یک بسته را تأیید کنید. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Poista paketti </header> Tällä sivulla voit vahvistaa paketin poistamisen ennen sen poistamista yhdestä tai useammasta palvelimesta. <p><hr>
@@ -0,0 +1 @@
<header> Supprimer le package </header> Cette page vous permet de confirmer la suppression d&#39;un package avant qu&#39;il ne soit supprimé d&#39;un ou plusieurs serveurs. <p><hr>
@@ -0,0 +1 @@
<header> Izbriši paket </header> Ova stranica omogućuje potvrdu brisanja paketa prije nego što ga uklonite s jednog ili više poslužitelja. <p><hr>
+7
View File
@@ -0,0 +1,7 @@
<header>Delete Package</header>
This page allows you to confirm the deletion of a package before it is removed
from one or more servers. <p>
<hr>
@@ -0,0 +1 @@
<header> Törölje a csomagot </header> Ez az oldal lehetővé teszi egy csomag törlésének megerősítését, mielőtt azt egy vagy több szerverről eltávolítanák. <p><hr>
@@ -0,0 +1 @@
<header> Elimina pacchetto </header> Questa pagina consente di confermare l&#39;eliminazione di un pacchetto prima che venga rimosso da uno o più server. <p><hr>
@@ -0,0 +1 @@
<header>パッケージを削除</header>このページでは、パッケージが1つ以上のサーバーから削除される前に、パッケージの削除を確認できます。 <p><hr>
@@ -0,0 +1 @@
<header> 패키지 삭제 </header> 이 페이지에서 하나 이상의 서버에서 패키지를 제거하기 전에 패키지 삭제를 확인할 수 있습니다. <p><hr>
@@ -0,0 +1 @@
<header> Padamkan Pakej </header> Halaman ini membolehkan anda mengesahkan penghapusan pakej sebelum dikeluarkan dari satu atau lebih pelayan. <p><hr>
@@ -0,0 +1,7 @@
<header>Verwijder Pakket</header>
Met deze pagina kunt u een bevestiging vragen voordat er een pakket word
verwijdert van 1 of meerdere servers. <p>
<hr>
@@ -0,0 +1 @@
<header> Slett pakken </header> Denne siden lar deg bekrefte sletting av en pakke før den fjernes fra en eller flere servere. <p><hr>
@@ -0,0 +1,7 @@
<header>Usuwanie pakietu</header>
Ta strona pozwala na potwierdzenie usunięcia pakietu z jednego lub
większej ilości serwerów. <p>
<hr>
@@ -0,0 +1 @@
<header> Excluir pacote </header> Esta página permite confirmar a exclusão de um pacote antes de ser removido de um ou mais servidores. <p><hr>
@@ -0,0 +1 @@
<header> Excluir pacote </header> Esta página permite confirmar a exclusão de um pacote antes de ser removido de um ou mais servidores. <p><hr>
@@ -0,0 +1 @@
<header> Удалить пакет </header> Эта страница позволяет подтвердить удаление пакета до его удаления с одного или нескольких серверов. <p><hr>
@@ -0,0 +1 @@
<header> Odstrániť balík </header> Táto stránka vám umožňuje potvrdiť odstránenie balíka pred jeho odstránením z jedného alebo viacerých serverov. <p><hr>
@@ -0,0 +1 @@
<header> Radera paketet </header> På denna sida kan du bekräfta att ett paket tas bort innan det tas bort från en eller flera servrar. <p><hr>
@@ -0,0 +1 @@
<header> Paketi Sil </header> Bu sayfa, bir veya daha fazla sunucudan kaldırılmadan önce bir paketin silinmesini onaylamanızı sağlar. <p><hr>
@@ -0,0 +1 @@
<header> Видалити пакет </header> Ця сторінка дозволяє підтвердити видалення пакету до його видалення з одного або декількох серверів. <p><hr>
@@ -0,0 +1 @@
<header>删除包裹</header>通过此页面,您可以在从一台或多台服务器删除软件包之前确认删除软件包。 <p><hr>
@@ -0,0 +1 @@
<header>刪除包裹</header>通過此頁面,您可以在從一台或多台服務器刪除軟件包之前確認刪除軟件包。 <p><hr>
@@ -0,0 +1 @@
<header> الخادم المُدار </header> تعرض هذه الصفحة تفاصيل أحد الخوادم التي تتم إدارة حزم برامجها بواسطة هذه الوحدة ، وشجرة من الحزم المثبتة على الخادم. يمكنك توسيع الشجرة من خلال النقر على أيقونات المجلد ، أو من خلال تفاصيل الحزمة بالضغط على رابطها في الشجرة. <p style=";text-align:right;direction:rtl"> لإزالة هذا الخادم من القائمة المُدارة ، انقر فوق الزر الموجود أسفل تفاصيل الخادم. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Управляван сървър </header> Тази страница показва детайлите на един от сървърите, чиито софтуерни пакети се управляват от този модул, и дърво от пакети, инсталирани на сървъра. Можете да разширите дървото, като кликнете върху иконите на папките или чрез детайлите на пакета, като щракнете върху връзката му в дървото. <p> За да премахнете този сървър от управлявания списък, щракнете върху бутона под данните за сървъра. <p><hr>
+16
View File
@@ -0,0 +1,16 @@
<header>Servidor Gestionat</header>
Aquesta pàgina mostra els detalls d'un dels servidors els paquets de
programari del qual són gestionats per aquest mòdul, i un arbre de paquets
instal·lats en aquest servidor. Pots expandir l'arbre fent clic sobre
les icones de les carpetes, o a través dels detalls d'un paquet fent clic
al seu enllaç de l'arbre.
<p>
Per eliminar aquest servidor de la llista de gestió, fes clic sobre el
botó de sota dels detalls del servidor.
<p>
<hr>
@@ -0,0 +1 @@
<header> Spravovaný server </header> Tato stránka zobrazuje podrobnosti o jednom ze serverů, jejichž softwarové balíčky jsou spravovány tímto modulem, a strom balíčků nainstalovaných na serveru. Strom můžete rozbalit kliknutím na ikony složek nebo prostřednictvím podrobností o balíčku kliknutím na jeho odkaz ve stromu. <p> Chcete-li tento server odebrat ze spravovaného seznamu, klikněte na tlačítko pod údaji o serveru. <p><hr>
@@ -0,0 +1 @@
<header> Administreret server </header> Denne side viser detaljerne om en af de servere, hvis softwarepakker administreres af dette modul, og et træpakker installeret på serveren. Du kan udvide træet ved at klikke på mappeikonerne eller via detaljerne i en pakke ved at klikke på dets link i træet. <p> For at fjerne denne server fra den administrerede liste, skal du klikke på knappen under serveroplysningerne. <p><hr>
+1
View File
@@ -0,0 +1 @@
<header>Verwalteter Server</header>Diese Seite zeigt die Details eines Servers, dessen Softwarepakete durch dieses Modul verwaltet werden, sowie eine Baumstruktur der auf dem Server installierten Pakete. Die Baumstruktur kann durch Klicken auf die Ordnersymbole erweitert werden, und detaillierte Informationen zu einem Paket sind durch Klicken auf dessen Link im Baum abrufbar.<p>Um diesen Server aus der Verwaltungsliste zu entfernen, klicken Sie auf die Schaltfläche unter den Serverdetails.<p><hr>
@@ -0,0 +1 @@
<header> Διαχειριζόμενος διακομιστής </header> Αυτή η σελίδα εμφανίζει τις λεπτομέρειες ενός από τους διακομιστές του οποίου τα πακέτα λογισμικού διαχειρίζονται αυτή η λειτουργική μονάδα και ένα δέντρο πακέτων εγκατεστημένο στον διακομιστή. Μπορείτε να επεκτείνετε το δέντρο κάνοντας κλικ στα εικονίδια του φακέλου ή μέσω των λεπτομερειών ενός πακέτου κάνοντας κλικ στον σύνδεσμό του στο δέντρο. <p> Για να καταργήσετε αυτόν τον διακομιστή από τη διαχειριζόμενη λίστα, κάντε κλικ στο κουμπί κάτω από τις λεπτομέρειες του διακομιστή. <p><hr>
+12
View File
@@ -0,0 +1,12 @@
<header>Servidor Gestionado</header>
Esta página muestra los detalles de uno de los servidores cuyos paquetes de
software se gestionan con este módulo, y un árbol de los paquetes
instalados en el servidor. Puede expandir el árbol pulsando en los iconos
de las carpetas, o ver los detalles de un paquete pulsando sobre su enlace
en el árbol. <p>
Para eliminar este servidor de la lista de los gestionados, pulse el botón
a continuación de los detalles del servidor. <p>
<hr>
@@ -0,0 +1 @@
<header> Kudeatutako zerbitzaria </header> Orrialde honetan modulu honek kudeatzen dituen software paketeen xehetasunak eta zerbitzarian instalatutako paketeen zuhaitza erakusten dira. Zuhaitza zabaldu dezakezu karpetaren ikonoetan klik eginez edo pakete baten xehetasunetan zuhaitzean dagoen estekan klik eginez. <p> Zerbitzaria kudeatutako zerrendatik kentzeko, egin klik zerbitzariaren xehetasunen azpian dagoen botoian. <p><hr>
@@ -0,0 +1 @@
<header> سرور مدیریت شده </header> در این صفحه جزئیات یکی از سرورهایی که بسته های نرم افزاری آن توسط این ماژول مدیریت می شود ، نشان می دهد و یک درخت از بسته های نصب شده روی سرور. می توانید با کلیک کردن بر روی نمادهای پوشه ، درخت را گسترش داده و یا با کلیک روی پیوند آن در درخت ، از جزئیات یک بسته استفاده کنید. <p style=";text-align:right;direction:rtl"> برای حذف این سرور از لیست مدیریت شده ، روی دکمه زیر جزئیات سرور کلیک کنید. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Hallittu palvelin </header> Tällä sivulla on yksityiskohdat yhdestä palvelimesta, jonka ohjelmistopaketteja tämä moduuli hallitsee, ja palvelimelle asennettujen pakettien puusta. Voit laajentaa puuta napsauttamalla kansiokuvakkeita tai napsauttamalla paketin tietoja napsauttamalla sen linkkiä puussa. <p> Poista tämä palvelin hallittujen luettelosta napsauttamalla palvelimen tietojen alla olevaa painiketta. <p><hr>
@@ -0,0 +1 @@
<header> Serveur géré </header> Cette page affiche les détails de l&#39;un des serveurs dont les packages logiciels sont gérés par ce module, ainsi qu&#39;une arborescence de packages installés sur le serveur. Vous pouvez développer l&#39;arborescence en cliquant sur les icônes des dossiers, ou via les détails d&#39;un package en cliquant sur son lien dans l&#39;arborescence. <p> Pour supprimer ce serveur de la liste gérée, cliquez sur le bouton sous les détails du serveur. <p><hr>
@@ -0,0 +1 @@
<header> Upravljani poslužitelj </header> Ova stranica prikazuje detalje jednog poslužitelja čijim softverskim paketima upravlja ovaj modul i stablo paketa instaliranih na poslužitelju. Stablo možete proširiti klikom na ikone mape ili preko detalja paketa klikom na njegovu vezu u stablu. <p> Da biste uklonili ovaj poslužitelj s upravljanog popisa, kliknite gumb ispod pojedinosti o poslužitelju. <p><hr>
+11
View File
@@ -0,0 +1,11 @@
<header>Managed Server</header>
This page shows the details of one of the servers whose software packages
are managed by this module, and a tree of packages installed on the server.
You can expand the tree by clicking on the folder icons, or via the details
of a package by clicking on its link in the tree. <p>
To remove this server from the managed list, click on the button below
the server details. <p>
<hr>
@@ -0,0 +1 @@
<header> Felügyelt szerver </header> Ezen az oldalon azoknak a kiszolgálóknak a részletei láthatók, amelyek szoftvercsomagjait ez a modul kezeli, és a kiszolgálóra telepített csomagok fája. A fát kibonthatja a mappaikonokra kattintva, vagy a csomag részleteivel a fastruktúráján található linkre kattintva. <p> A kiszolgáló eltávolításához a kezelt listából kattintson a kiszolgáló részletei alatti gombra. <p><hr>
@@ -0,0 +1 @@
<header> Server gestito </header> Questa pagina mostra i dettagli di uno dei server i cui pacchetti software sono gestiti da questo modulo e una struttura di pacchetti installati sul server. È possibile espandere l&#39;albero facendo clic sulle icone delle cartelle o tramite i dettagli di un pacchetto facendo clic sul relativo collegamento nell&#39;albero. <p> Per rimuovere questo server dall&#39;elenco gestito, fare clic sul pulsante sotto i dettagli del server. <p><hr>
@@ -0,0 +1 @@
<header>管理対象サーバー</header>このページには、ソフトウェアパッケージがこのモジュールによって管理されているサーバーの1つの詳細と、サーバーにインストールされているパッケージのツリーが表示されます。フォルダアイコンをクリックしてツリーを展開するか、ツリー内のリンクをクリックしてパッケージの詳細を介して展開できます。 <p>このサーバーを管理リストから削除するには、サーバーの詳細の下にあるボタンをクリックします。 <p><hr>
@@ -0,0 +1 @@
<header> 관리 서버 </header> 이 페이지에는이 모듈에서 소프트웨어 패키지를 관리하는 서버 중 하나와 서버에 설치된 패키지 트리의 세부 정보가 표시됩니다. 폴더 아이콘을 클릭하거나 트리에서 해당 링크를 클릭하여 패키지 세부 사항을 통해 트리를 펼칠 수 있습니다. <p> 관리 대상 목록에서이 서버를 제거하려면 서버 세부 사항 아래에있는 단추를 클릭하십시오. <p><hr>
@@ -0,0 +1 @@
<header> Pelayan Terurus </header> Halaman ini menunjukkan perincian salah satu pelayan yang pakej perisiannya dikendalikan oleh modul ini, dan sebilangan besar pakej yang dipasang di pelayan. Anda boleh mengembangkan pokok dengan mengklik ikon folder, atau melalui perincian pakej dengan mengklik pautan di pohon. <p> Untuk mengeluarkan pelayan ini dari senarai yang diuruskan, klik pada butang di bawah butiran pelayan. <p><hr>
+11
View File
@@ -0,0 +1,11 @@
<header>Server Beheer</header>
Deze pagina toont 1 van de servers waarvan de software pakketten worden
beheerd door deze module, en de lijst met pakketten die reeds zijn geinstalleerd.
U kunt de lijst uitpakken door te klikken op de folder iconen of via de details
van een pakket door te klikken op de link in de lijst. <p>
Indien u deze server wilt verwijderen van de lijst klikt u op de knop onder
server details. <p>
<hr>
@@ -0,0 +1 @@
<header> Administrert server </header> Denne siden viser detaljene til en av serverne hvis programvarepakker administreres av denne modulen, og et tre pakker som er installert på serveren. Du kan utvide treet ved å klikke på mappeikonene, eller via detaljene i en pakke ved å klikke på lenken i treet. <p> For å fjerne denne serveren fra den administrerte listen, klikk på knappen under serverdetaljene. <p><hr>
+11
View File
@@ -0,0 +1,11 @@
<header>Zarządzanie serwerem</header>
Ta strona wyświetla szczegóły jednego z serwerów, na którym można
zarządzać pakietami oprogramowania przez ten moduł oraz drzewo
zainstalowanych pakietów na tym serwerze. Możesz rozwinąć drzewo
pakietów przez kliknięcie na ikonie folderu lub przez szczegóły danego
pakietu.<p>
Aby usunąć ten serwer z listy zarządzanych, naciśnij przycisk poniżej
szczegółów serwera. <p>
<hr>
@@ -0,0 +1 @@
<header> Servidor gerenciado </header> Esta página mostra os detalhes de um dos servidores cujos pacotes de software são gerenciados por este módulo e uma árvore de pacotes instalados no servidor. Você pode expandir a árvore clicando nos ícones da pasta ou através dos detalhes de um pacote clicando no seu link na árvore. <p> Para remover este servidor da lista gerenciada, clique no botão abaixo dos detalhes do servidor. <p><hr>
@@ -0,0 +1 @@
<header> Servidor gerenciado </header> Esta página mostra os detalhes de um dos servidores cujos pacotes de software são gerenciados por este módulo e uma árvore de pacotes instalados no servidor. Você pode expandir a árvore clicando nos ícones da pasta ou através dos detalhes de um pacote clicando no seu link na árvore. <p> Para remover este servidor da lista gerenciada, clique no botão abaixo dos detalhes do servidor. <p><hr>
@@ -0,0 +1 @@
<header> Управляемый сервер </header> На этой странице отображаются сведения об одном из серверов, программные пакеты которых управляются этим модулем, а также дерево пакетов, установленных на сервере. Вы можете развернуть дерево, нажав на значки папок, или с помощью сведений о пакете, щелкнув по его ссылке в дереве. <p> Чтобы удалить этот сервер из списка управляемых, нажмите кнопку под информацией о сервере. <p><hr>
@@ -0,0 +1 @@
<header> Spravovaný server </header> Táto stránka zobrazuje podrobnosti o jednom zo serverov, ktorých softvérové balíky sú spravované týmto modulom, a strom balíkov nainštalovaných na serveri. Strom môžete rozbaliť kliknutím na ikony priečinka alebo prostredníctvom podrobností o balíku kliknutím na jeho odkaz v strome. <p> Ak chcete odstrániť tento server zo spravovaného zoznamu, kliknite na tlačidlo pod podrobnosťami o serveri. <p><hr>
@@ -0,0 +1 @@
<header> Hanterad server </header> Den här sidan visar detaljerna om en av servrarna vars programvarupaket hanteras av den här modulen och ett paketträd installerat på servern. Du kan utöka trädet genom att klicka på mappikonerna, eller via detaljerna om ett paket genom att klicka på länken i trädet. <p> För att ta bort den här servern från den hanterade listan, klicka på knappen nedanför serverinformationen. <p><hr>
@@ -0,0 +1 @@
<header> Yönetilen Sunucu </header> Bu sayfa, yazılım paketleri bu modül tarafından yönetilen sunuculardan birinin ayrıntılarını ve sunucuda kurulu bir paket ağacını gösterir. Klasör simgelerini tıklatarak veya ağaçtaki bağlantısına tıklayarak bir paketin ayrıntılarını kullanarak ağacı genişletebilirsiniz. <p> Bu sunucuyu yönetilen listesinden kaldırmak için sunucu ayrıntılarının altındaki düğmeyi tıklayın. <p><hr>
@@ -0,0 +1 @@
<header> Керований сервер </header> На цій сторінці відображаються деталі одного з серверів, пакети програм, якими керує цей модуль, та дерево пакетів, встановлених на сервері. Ви можете розгорнути дерево, натиснувши на піктограму папок або через реквізити пакета, натиснувши його посилання на дереві. <p> Щоб видалити цей сервер із керованого списку, натисніть кнопку під реквізитом сервера. <p><hr>
@@ -0,0 +1 @@
<header>受管服务器</header>该页面显示了其中一个软件包由该模块管理的服务器之一的详细信息,以及服务器上安装的软件包树。您可以通过单击文件夹图标来展开树,也可以通过单击树中的链接来查看软件包的详细信息。 <p>要将服务器从托管列表中删除,请单击服务器详细信息下方的按钮。 <p><hr>
@@ -0,0 +1 @@
<header>受管服務器</header>該頁面顯示了其中一個軟件包由該模塊管理的服務器之一的詳細信息,以及服務器上安裝的軟件包樹。您可以通過單擊文件夾圖標來展開樹,也可以通過單擊樹中的鏈接來查看軟件包的詳細信息。 <p>要將服務器從託管列表中刪除,請單擊服務器詳細信息下方的按鈕。 <p><hr>
@@ -0,0 +1 @@
<header> تحرير الحزمة </header> يعرض القسم العلوي من هذه الصفحة تفاصيل حزمة مثبتة على مضيف مُدار أو أكثر. في حالة وجود حزمة على خوادم متعددة ، سيتم أخذ الوصف الكامل والتفاصيل الأخرى من الخوادم الأولى المدرجة في أسفل الصفحة. <p style=";text-align:right;direction:rtl"> أسفل تفاصيل الحزمة توجد أزرار لإدراج الملفات التي تتكون منها الحزمة ، ولإلغاء تثبيت الحزمة من خادم واحد أو من جميع الخوادم. يوجد في الجزء السفلي جدول من الرموز ، واحد لكل خادم من الخوادم التي تم تثبيت الحزمة عليها. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Редактиране на пакета </header> В горната част на тази страница са показани подробностите за пакет, който е инсталиран на един или повече управлявани хостове. В случай на пакет, който е на множество сървъри, пълното описание и други подробности ще бъдат взети от първите сървъри, изброени в долната част на страницата. <p> Под детайлите на пакета се намират бутони за изброяване на файловете, които съставляват пакета, и за деинсталиране на пакета или от един сървър или от всички сървъри. В долната част е таблица с икони, по една за всеки от сървърите, на които е известно, че пакетът е инсталиран. <p><hr>
+17
View File
@@ -0,0 +1,17 @@
<header>Edició de Paquet</header>
La secció superior d'aquesta pàgina mostra els detalls d'un paquet que
està instal·lat en un o més hosts gestionats. En el cas d'un paquet que
és a més d'un servidor, la descripció completa i altres detalls es prendran
del primer servidor llistat al peu de la pàgina.
<p>
Sota els detalls del paquet hi ha botons per llistar els fitxers que formen
el paquet, i per desinstal·lar el paquet d'un sol servidor o bé de tots.
Al peu, hi ha una taula d'icones, una per cadascun dels servidors dels
quals se sap que tenen instal·lat el paquet.
<p>
<hr>
@@ -0,0 +1 @@
<header> Upravit balíček </header> V horní části této stránky jsou uvedeny podrobnosti o balíčku, který je nainstalován na jednom nebo více spravovaných hostitelích. V případě balíčku, který je na více serverech, bude úplný popis a další podrobnosti převzaty z prvních serverů uvedených v dolní části stránky. <p> Pod podrobnostmi balíčku jsou tlačítka pro výpis souborů, které tvoří balíček, a pro odinstalaci balíčku z jednoho serveru nebo ze všech serverů. Ve spodní části je tabulka ikon, jedna pro každý ze serverů, o nichž je známo, že je balíček nainstalován. <p><hr>
@@ -0,0 +1 @@
<header> Rediger pakke </header> Det øverste afsnit af denne side viser detaljerne om en pakke, der er installeret på en eller flere administrerede værter. I tilfælde af en pakke, der findes på flere servere, vil den fulde beskrivelse og andre detaljer blive taget fra de første servere, der er anført nederst på siden. <p> Under pakkedetaljerne er knapper til liste af filer, der udgør pakken, og til afinstallation af pakken fra enten en enkelt server eller alle servere. Nederst er en tabel med ikoner, en for hver af de servere, som pakken vides at være installeret på. <p><hr>
+1
View File
@@ -0,0 +1 @@
<header>Paket bearbeiten</header>Der obere Abschnitt dieser Seite zeigt die Details eines Pakets, das auf einem oder mehreren verwalteten Hosts installiert ist. Falls ein Paket auf mehreren Servern vorhanden ist, werden die vollständige Beschreibung und weitere Details vom ersten in der Liste am unteren Rand der Seite aufgeführten Server übernommen.<p>Unter den Paketdetails befinden sich Schaltflächen zum Anzeigen der Dateien, aus denen das Paket besteht, sowie zur Deinstallation des Pakets entweder von einem einzelnen Server oder von allen Servern. Am unteren Rand der Seite befindet sich eine Tabelle mit Symbolen, die jeweils einen Server repräsentieren, auf dem das Paket installiert ist.<p><hr>
@@ -0,0 +1 @@
<header> Επεξεργασία πακέτου </header> Η επάνω ενότητα αυτής της σελίδας δείχνει τις λεπτομέρειες ενός πακέτου που είναι εγκατεστημένο σε έναν ή περισσότερους διαχειριζόμενους κεντρικούς υπολογιστές. Στην περίπτωση ενός πακέτου που βρίσκεται σε πολλούς διακομιστές, η πλήρης περιγραφή και άλλες λεπτομέρειες θα ληφθούν από τους πρώτους διακομιστές που αναφέρονται στο κάτω μέρος της σελίδας. <p> Κάτω από τις λεπτομέρειες του πακέτου υπάρχουν κουμπιά για την καταχώριση των αρχείων που αποτελούν το πακέτο και για την απεγκατάσταση του πακέτου από έναν μόνο διακομιστή ή από όλους τους διακομιστές. Στο κάτω μέρος υπάρχει ένας πίνακας εικονιδίων, ένας για κάθε διακομιστή στον οποίο είναι γνωστό ότι είναι εγκατεστημένο το πακέτο. <p><hr>
+15
View File
@@ -0,0 +1,15 @@
<header>Editar Paquete</header>
La sección superior de esta página le muestra los detalles de un paquete
instalado en una o más máquinas gestionadas. En el caso de un paquete
instalado en múltiples servidores, la descripción completa y otros detalles
se tomarán del primer servidor listado al final de la página. <p>
A continuación de los detalles del paquete hay unos botones para listar los
ficheros que contiene el paquete, y para desinstalar el paquete de uno o
todos los servidores. Al final de la página hay una tabla con iconos, uno
para cada uno de los servidores donde se sabe que está instalado este
paquete. <p>
<hr>
@@ -0,0 +1 @@
<header> Editatu paketea </header> Orrialde honen goiko atalean kudeatutako ostalari batean edo gehiagotan instalatutako pakete baten xehetasunak agertzen dira. Zerbitzari anitzetan dagoen pakete baten kasuan, deskribapen osoa eta bestelako xehetasunak orriaren behealdean zerrendatzen diren lehen zerbitzarietatik hartuko dira. <p> Paketearen xehetasunak azpian daude paketeak osatzen dituzten fitxategiak zerrendatzeko eta paketeak zerbitzari bakarretik edo zerbitzarietatik desinstalatzeko. Behean ikonoen taula bat dago, paketeak instalatuta daudela jakingo duen zerbitzari bakoitzeko bat. <p><hr>
@@ -0,0 +1 @@
<header> ویرایش بسته </header> در قسمت بالای این صفحه جزئیات یک بسته نصب شده روی یک یا چند میزبان مدیریت شده نشان داده شده است. در مورد بسته ای که روی چندین سرور است ، توضیحات کامل و سایر جزئیات از اولین سرورهایی که در پایین صفحه ذکر شده اند گرفته می شود. <p style=";text-align:right;direction:rtl"> در زیر جزئیات بسته دکمه هایی برای لیست پرونده هایی که بسته را تشکیل می دهند ، و برای حذف بسته از یک سرور منفرد یا همه سرورها است. در پایین یک جدول از آیکون ها ، یکی برای هر یک از سرورهای که بسته شناخته شده است که روی آن نصب شده است. <p style=";text-align:right;direction:rtl"><hr>
@@ -0,0 +1 @@
<header> Muokkaa pakettia </header> Tämän sivun yläosa näyttää yksityiskohdat paketista, joka on asennettu yhteen tai useampaan hallittuun isäntään. Jos paketti on useilla palvelimilla, täydellinen kuvaus ja muut yksityiskohdat otetaan ensimmäisistä sivun alaosassa luetelluista palvelimista. <p> Paketin yksityiskohtien alapuolella on painikkeet paketin muodostavien tiedostojen luetteloimiseksi ja paketin poistamiseksi joko yhdestä palvelimesta tai kaikista palvelimista. Alareunassa on kuvakekuvake, yksi jokaiselle palvelimelle, johon paketin tiedetään olevan asennettuna. <p><hr>

Some files were not shown because too many files have changed in this diff Show More