php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay
files >> /usr/libexec/webmin/virtual-server-theme/ |
files >> //usr/libexec/webmin/virtual-server-theme/right.cgi |
#!/usr/bin/perl # Show server or domain information $trust_unknown_referers = 1; require "virtual-server-theme/virtual-server-theme-lib.pl"; &ReadParse(); use Time::Local; # Work out system capabilities. Level 3 = usermin, 2 = domain owner, # 1 = reseller, 0 = master, 4 = Cloudmin system owner ($hasvirt, $level, $hasvm2) = get_virtualmin_user_level(); %text = &load_language($current_theme); %text = ( &load_language('virtual-server'), %text ); $bar_width = 100; if ($hasvirt && $in{'dom'}) { $defdom = virtual_server::get_domain($in{'dom'}); } # Check for wizard redirect if ($hasvirt && defined(&virtual_server::wizard_redirect)) { $redir = &virtual_server::wizard_redirect(); if ($redir) { &redirect($redir); return; } } # Work out which sections are open by default foreach $o (split(/\0/, $in{'open'})) { push(@open, $o); } foreach $o (split(/\0/, $in{'auto'})) { push(@open, $o); push(@auto, $o); } if (!defined($in{'open'})) { @open = ( 'system', 'reseller', 'status', 'updates', 'common', 'vm2limits', 'vm2usage' ); @auto = ( 'status' ); } %open = map { $_, indexof($_, @auto) >= 0 ? 2 : 1 } @open; header(undef); if ($hasvirt || $hasvm2) { # Show link for editing what appears $sects = get_right_frame_sections(); if (!$sects->{'global'} || $hasvirt && virtual_server::master_admin() || $hasvm2 && !$server_manager::access{'owner'}) { print "<div align=right>"; @links = ( "<a href='edit_right.cgi'>$text{'right_edit'}</a>" ); if ($hasvirt && virtual_server::master_admin()) { # Refresh collected info push(@links, "<a href='recollect.cgi'>". "$text{'right_recollect'}</a>"); } @overlays = &list_virtualmin_theme_overlays(); if (@overlays) { # Change theme overlay push(@links, "<a href='edit_overlay.cgi'>". "$text{'right_overlay'}</a>"); } if ($hasvirt) { # Virtualmin docs $doclink = get_virtualmin_docs($level); push(@links, "<a href='$doclink' target=_new>$text{'right_virtdocs'}</a>"); } if ($hasvm2) { # Cloudmin docs $doclink = get_vm2_docs($level); push(@links, "<a href='$doclink' target=_new>$text{'right_vm2docs'}</a>"); } if ($hasvirt && $virtual_server::config{'docs_link'}) { # Custom Virtualmin docs push(@links, "<a href='". $virtual_server::config{'docs_link'}. "' target=_new>". ($virtual_server::config{'docs_text'} || $text{'right_virtdocs2'})."</a>"); } if ($hasvm2 && $server_manager::config{'docs_link'}) { # Custom Cloudmin docs push(@links, "<a href='". $server_manager::config{'docs_link'}. "' target=_new>". ($server_manager::config{'docs_text'} || $text{'right_virtdocs2'})."</a>"); } print ui_links_row(\@links); print "</div>\n"; $shown_config_link = 1; } } # Check for custom URL if ($sects->{'alt'} && !$in{'noalt'}) { $url = $sects->{'alt'}; if ($shown_config_link) { # Show in iframe, so that the config link is visible print "<iframe src='$url' width=100% height=95% frameborder=0 ", "marginwidth=0 marginheight=0>\n"; } else { # Redirect whole frame print "<script type='text/javascript'>\n"; print "document.location = '$url';\n"; print "</script>\n"; } popup_footer(); exit; } if ($hasvirt) { # Check Virtualmin licence if (defined(&virtual_server::warning_messages)) { print virtual_server::warning_messages(); } else { print virtual_server::licence_warning_message(); } # See if module config needs to be checked if (virtual_server::need_config_check() && virtual_server::can_check_config()) { print "<table width=100%><tr bgcolor=#ffee00><td align=center>"; print ui_form_start("virtual-server/check.cgi"); print "<b>$text{'index_needcheck'}</b><p>\n"; print ui_submit($text{'index_srefresh'}); print ui_form_end(); print "</td></tr></table>\n"; } } if ($hasvm2) { # Check Cloudmin licence or other warnings if (defined(&server_manager::warning_messages)) { print server_manager::warning_messages(); } else { print server_manager::licence_error_message(); } } # Show Webmin notifications, if supported if (foreign_check("webmin")) { foreign_require("webmin", "webmin-lib.pl"); if (defined(&webmin::get_webmin_notifications)) { @notifs = webmin::get_webmin_notifications(1); } if (@notifs) { print "<table width=100%><tr bgcolor=#ffee00><td align=center>"; print @notifs; print "</td></tr></table>\n"; } } if ($level == 0) { # Master admin # Show Virtualmin master admin info $hasposs = foreign_check("security-updates"); $canposs = foreign_available("security-updates"); if ($hasvm2) { # Check if Cloudmin has collected own info my $me = &server_manager::get_managed_server(0); if ($me) { $meinfo = &server_manager::get_server_collected($me); } } if ($hasvirt) { # Get from Virtualmin's collected info $info = virtual_server::get_collected_info(); @poss = $info ? @{$info->{'poss'}} : ( ); @allposs = $info ? @{$info->{'allposs'}} : ( ); @inst = $info ? @{$info->{'inst'}} : ( ); } elsif ($meinfo && $meinfo->{'poss'}) { # Use own collected info @poss = @{$meinfo->{'poss'}}; @allposs = @{$meinfo->{'allposs'}}; @inst = @{$meinfo->{'inst'}}; } elsif ($hasposs) { # Get possible updates directly from security-updates module foreign_require("security-updates", "security-updates-lib.pl"); @poss = security_updates::list_possible_updates(); if (defined(&security_updates::list_possible_installs)){ @inst = security_updates::list_possible_installs(); } } if (!$sects->{'nosystem'}) { # Show general system information print ui_hidden_table_start($text{'right_systemheader'}, "width=100%", 4, "system", $open{'system'}); # Host and login info $ip = $info && $info->{'ips'} ? $info->{'ips'}->[0]->[0] : &to_ipaddress(get_system_hostname()); $ip = " ($ip)" if ($ip); print ui_table_row($text{'right_host'}, get_system_hostname().$ip, 1, ["width='15%'", "width='35%'"]); if ($gconfig{'os_version'} eq '*') { print ui_table_row($text{'right_os'}, $gconfig{'real_os_type'}, 1, ["width='15%'", "width='35%'"]); } else { print ui_table_row($text{'right_os'}, "$gconfig{'real_os_type'} $gconfig{'real_os_version'}", 1, ["width='15%'", "width='35%'"]); } # Webmin/Usermin version if (get_product_name() eq 'webmin') { print ui_table_row($text{'right_webmin'}, get_webmin_version(), 1, ["width='15%'", "width='35%'"]); } else { print ui_table_row($text{'right_usermin'}, get_webmin_version(), 1, ["width='15%'", "width='35%'"]); } # Virtualmin / Cloudmin version if ($hasvirt) { print ui_table_row($text{'right_virtualmin'}, $virtual_server::module_info{'version'} . " " . ($virtual_server::module_info{'virtualmin'} eq 'gpl' ? 'GPL' : 'Pro'), 1, ["width='15%'", "width='35%'"]); } if ($hasvm2) { print ui_table_row($text{'right_vm2'}, $server_manager::module_info{'version'} , 1, ["width='15%'", "width='35%'"]); } # Theme version my %current_theme_info = get_theme_info($current_theme); print ui_table_row($text{'right_themever'}, $current_theme_info{'version'} , 1, ["width='15%'", "width='35%'"]); # System time and uptime my $tm = make_date(time()); if (&foreign_available("time")) { $tm = "<a href=time/>$tm</a>"; } &foreign_require("proc"); my $uptime; my ($d, $h, $m) = &proc::get_system_uptime(); if ($d) { $uptime = &text('right_updays', $d, $h, $m); } elsif ($m) { $uptime = &text('right_uphours', $h, $m); } elsif ($m) { $uptime = &text('right_upmins', $m); } $tm .= " , ".$uptime if ($uptime); print ui_table_row($text{'right_time'}, $tm , 1, ["width='15%'", "width='35%'"]); # Kernel type if ($k = $info->{'kernel'}) { print ui_table_row($text{'right_kernel'}, text('right_kernelon', $k->{'os'}, $k->{'version'}, $k->{'arch'}) , 1, ["width='15%'", "width='35%'"]); } # Load and memory info { my @c; if ($info->{'load'}) { @c = @{$info->{'load'}}; } elsif (foreign_check("proc")) { foreign_require("proc", "proc-lib.pl"); if (defined(&proc::get_cpu_info)) { @c = proc::get_cpu_info(); } } if (@c) { print ui_table_row($text{'right_cpu'}, text('right_loadgraph', $c[0], history_link("load", 1), $c[1], history_link("load5", 1), $c[2], history_link("load15", 1)) , 1, ["width='15%'", "width='35%'"]); } } # Running processes if ($info->{'procs'}) { if (foreign_available("proc")) { print ui_table_row($text{'right_procs'}, "<a href=proc/>$info->{'procs'}</a>" . " " . history_link("procs", 1) , 1, ["width='15%'", "width='35%'"]); } else { print ui_table_row($text{'right_procs'}, $info->{'procs'} . history_link("procs", 1) , 1, ["width='15%'", "width='35%'"]); } } # Memory used if ($info->{'mem'}) { @m = @{$info->{'mem'}}; } elsif (foreign_check("proc")) { foreign_require("proc", "proc-lib.pl"); if (defined(&proc::get_memory_info)) { @m = proc::get_memory_info(); } } if (@m && $m[0] && $m[5]) { # Has burstable limit print ui_table_row($text{'right_real'}, text('right_used2', nice_size($m[0]*1024), nice_size(($m[0]-$m[1])*1024), nice_size($m[5]*1024)) . " " . history_link("memused", 1) . "<br>" . bar_chart_three($m[5], $m[1], $m[0]-$m[1], $m[5]-$m[0]) , 1, ["width='15%'", "width='35%'"]); } elsif (@m && $m[0] && !$m[5]) { # Just regular RAM limit print ui_table_row($text{'right_real'}, text('right_used', nice_size($m[0]*1024), nice_size(($m[0]-$m[1])*1024)) . " " . history_link("memused", 1) . "<br>" . bar_chart($m[0], $m[0]-$m[1], 1) , 1, ["width='15%'", "width='35%'"]); } if (@m && $m[2]) { print ui_table_row($text{'right_virt'}, text('right_used', nice_size($m[2]*1024), nice_size(($m[2]-$m[3])*1024)) . " " . history_link("swapused", 1) . "<br>" . bar_chart($m[2], $m[2]-$m[3], 1) , 1, ["width='15%'", "width='35%'"]); } # Disk space on local drives if ($info->{'disk_total'}) { ($total, $free) = ($info->{'disk_total'}, $info->{'disk_free'}); } elsif (foreign_check("mount")) { foreign_require("mount", "mount-lib.pl"); if (defined(&mount::local_disk_space)) { ($total, $free) = mount::local_disk_space(); } } if ($total) { print ui_table_row($text{'right_disk'}, text('right_used', nice_size($total), nice_size($total-$free)) . " " . history_link("diskused", 1) . "<br>" . bar_chart($total, $total-$free, 1) , 1, ["width='15%'", "width='35%'"]); } @pkgmsgs = ( ); if (!$sects->{'noupdates'} && $hasposs && !@poss && $canposs) { # Re-assure the user that everything is up to date push(@pkgmsgs, &text('right_upall', "security-updates/index.cgi?mode=all")); } if (!$sects->{'noupdates'} && $hasposs && @inst && $canposs) { # Tell the user about extra packages push(@pkgmsgs, text('right_upinst', scalar(@inst), "security-updates/index.cgi?mode=new")); } if (!$sects->{'noupdates'} && $hasposs && @allposs && scalar(@allposs) != scalar(@poss) && $canposs) { # Tell the user about non-virtualmin packages push(@pkgmsgs, &text('right_upsys', scalar(@allposs), "security-updates/index.cgi?mode=updates&all=1")); } if (@pkgmsgs) { print ui_table_row($text{'right_pkgupdesc'}, join("<br>\n", @pkgmsgs), 3); } print ui_hidden_table_end("system"); } # Check for package updates if (!$sects->{'noupdates'} && $hasposs && @poss && $canposs) { # Show updates section print ui_hidden_table_start($text{'right_updatesheader'}, "width=100%", 1, "updates", $open{'updates'}); print ui_form_start("security-updates/update.cgi"); print text( @poss > 1 ? 'right_upcount' : 'right_upcount1', scalar(@poss), 'security-updates/index.cgi?mode=updates'),"<p>\n"; print ui_columns_start([ $text{'right_upname'}, $text{'right_updesc'}, $text{'right_upver'} ], "80%"); %sinfo = get_module_info("security-updates"); foreach $p (@poss) { print ui_columns_row([ $p->{'name'}, $p->{'desc'}, $p->{'version'} ]); print ui_hidden("u", $sinfo{'version'} >= 1.7 && $p->{'update'} ? $p->{'update'}."/".$p->{'system'} : $p->{'name'}); } print ui_columns_end(); print ui_form_end([ [ undef, $text{'right_upok'} ] ]); print ui_hidden_table_end("updates"); } # Show Virtualmin feature statuses if ($hasvirt && !$sects->{'nostatus'} && $info->{'startstop'} && virtual_server::can_stop_servers()) { my @ss = @{$info->{'startstop'}}; my $mid = int((@ss-1) / 2); my $status_open = $open{'status'}; if ($status_open == 2) { # Open if something is down @down = grep { !$_->{'status'} } @ss; $status_open = @down ? 1 : 0; } print ui_hidden_table_start($text{'right_statusheader'}, "width=100%", 4, "status", $status_open); #print theme_ui_yui_grid_start('rightstat', 'g'); # 50/50 split #print theme_ui_yui_grid_section_start('rightstat_left', 'first'); print "<table class='ui_table'><tr><td width='49%' valign=top>\n"; print status_grid(@ss[0 .. $mid]); print "</td><td width='49%' valign=top>\n"; #print theme_ui_yui_grid_section_end('rightstat_left'); #print theme_ui_yui_grid_section_start('rightstat_right'); print status_grid(@ss[$mid+1 .. $#ss]); print "</td></tr></table>\n"; #print theme_ui_yui_grid_section_end('rightstat_right'); #print theme_ui_yui_grid_end('rightstat'); print ui_hidden_table_end('rightstat'); } # New features for master admin show_new_features(0); if ($hasvirt && !$sects->{'novirtualmin'} && $info->{'fcount'}) { # Show Virtualmin information print ui_hidden_table_start($text{'right_virtheader'}, "width=100%", 1, "virtualmin", $open{'virtualmin'}); print "<table>\n"; my $i = 0; foreach my $f (@{$info->{'ftypes'}}) { my $cur = int($info->{'fcount'}->{$f}); my $extra = $info->{'fextra'}->{$f}; my $max = $info->{'fmax'}->{$f}; my $hide = $info->{'fhide'}->{$f}; print "<tr class='ui_form_pair'>\n" if ($i%2 == 0); print "<td class='ui_form_label' width=25%>",$text{'right_f'.$f},"</td>\n"; my $hlink = $f eq "doms" || $f eq "users" || $f eq "aliases" ? history_link($f, 1) : ""; if ($extra < 0 || $hide) { print "<td class='ui_form_value' width=25%>",$cur," ",$hlink, "</td>\n"; } else { print "<td class='ui_form_value' width=25%>", text('right_out', $cur, $max)," ", $hlink,"</td>\n"; } print "</tr>\n" if ($i%2 == 1); $i++; } print "</table>\n"; print ui_hidden_table_end("virtualmin"); } if ($hasvirt && !$sects->{'noquotas'} && $info->{'quota'} && @{$info->{'quota'}}) { # Show quota graphs print ui_hidden_table_start($text{'right_quotasheader'}, "width=100%", 1, "quotas", $open{'quotas'} || &any_over_quota($info->{'quota'})); show_quotas_info($info->{'quota'}, $info->{'maxquota'}); print ui_hidden_table_end("quotas"); } if ($hasvirt && !$sects->{'nobw'} && $virtual_server::config{'bw_active'}) { # Show bandwidth graph by domain my @doms = virtual_server::list_domains(); my @bwdoms = grep { !$_->{'parent'} && defined($_->{'bw_usage'}) } @doms; print ui_hidden_table_start($text{'right_bwheader'}, "width=100%", 1, "bw", $open{'bw'} || &any_over_bandwidth(\@doms)); if (@bwdoms) { show_bandwidth_info(\@doms); } else { print ui_table_row(undef, $text{'right_bwnone'}, 2); } print ui_hidden_table_end("bw"); } if ($hasvirt && !$sects->{'noips'} && $info->{'ips'}) { # Show virtual IPs used print ui_hidden_table_start($text{'right_ipsheader'}, "width=100%", 1, "ips", $open{'ips'}); print "<table>\n"; @allips = @{$info->{'ips'}}; push(@allips, @{$info->{'ips6'}}) if ($info->{'ips6'}); foreach my $ipi (@allips) { print "<tr class='ui_form_pair'>\n"; print "<td class='ui_form_label' width=30%>$ipi->[0]</td>\n"; print "<td>",$ipi->[1] eq 'def' ? $text{'right_defip'} : $ipi->[1] eq 'reseller' ? text('right_reselip', $ipi->[2]) : $ipi->[1] eq 'shared' ? $text{'right_sharedip'} : $text{'right_ip'},"</td>\n"; $slink = "../virtual-server/search.cgi?field=ip&what=$ipi->[0]"; if ($ipi->[3] == 1) { print "<td class='ui_form_value'>". "<tt>$ipi->[4]</tt></td>\n"; } else { print "<td class='ui_form_value'>", "<a href='$slink'>". &text('right_ips', $ipi->[3])."</a>", "</td>\n"; } print "</tr>\n"; } print "</table>\n"; if ($info->{'ipranges'}) { # Show IP ranges for allocation print &ui_hr(); print "<table>\n"; foreach my $r (@{$info->{'ipranges'}}) { print "<tr class='ui_form_pair'>\n"; print "<td class='ui_form_label' nowrap width=30%>", $r->[0],"</td>\n"; print "<td class='ui_form_value'>", &text('right_iprange', $r->[1], $r->[2]), "</td>\n"; print "</tr>\n"; } print "</table>\n"; } print ui_hidden_table_end("ips"); } # Show system programs information section if ($hasvirt && !$sects->{'nosysinfo'} && $info->{'progs'} && virtual_server::can_view_sysinfo()) { print ui_hidden_table_start($text{'right_sysinfoheader'}, "width=100%", 1, "sysinfo", $open{"sysinfo"}); print "<table>\n"; @info = @{$info->{'progs'}}; for($i=0; $i<@info; $i++) { print "<tr class='ui_form_pair'>\n" if ($i%2 == 0); print "<td class='ui_form_label'><b>$info[$i]->[0]</b></td>\n"; print "<td class='ui_form_value'>$info[$i]->[1]</td>\n"; print "</tr>\n" if ($i%2 == 1); } print "</table>\n"; print ui_hidden_table_end("sysinfo"); } # Show Cloudmin server summary by status and by type if ($hasvm2) { print ui_hidden_table_start($text{'right_vm2serversheader'}, "width=100%", 4, "vm2servers", $open{'vm2servers'}, [ "width=30%" ]); @servers = server_manager::list_managed_servers(); show_vm2_servers(\@servers, 1); print ui_hidden_table_end('vm2servers'); } # Show licenses @lics = ( ); if ($hasvirt && read_env_file($virtual_server::virtualmin_license_file, \%vserial) && $vserial{'SerialNumber'} ne 'GPL') { # Show Virtualmin serial and key push(@lics, [ $text{'right_vserial'}, $vserial{'SerialNumber'} ]); push(@lics, [ $text{'right_vkey'}, $vserial{'LicenseKey'} ]); push(@lbuts, [ "virtual-server/licence.cgi", $text{'right_vlcheck'} ]); # Add allowed domain counts ($dleft, $dreason, $dmax, $dhide) = virtual_server::count_domains("realdoms"); push(@lics, [ $text{'right_vmax'}, $dmax <= 0 ? $text{'right_vunlimited'} : $dmax ]); push(@lics, [ $text{'right_vleft'}, $dleft < 0 ? $text{'right_vunlimited'} : $dleft ]); # Add allowed system counts my %lstatus; read_file($virtual_server::licence_status, \%lstatus); if ($lstatus{'used_servers'}) { push(@lics, [ $text{'right_smax'}, $lstatus{'servers'} || $text{'right_vunlimited'} ]); push(@lics, [ $text{'right_sused'}, $lstatus{'used_servers'} ]); } # Show license expiry date if ($lstatus{'expiry'} =~ /^203[2-8]-/) { push(@lics, [ $text{'right_expiry'}, $text{'right_expirynever'} ]); } elsif ($lstatus{'expiry'}) { push(@lics, [ $text{'right_expiry'}, $lstatus{'expiry'} ]); $ltm = &parse_license_date($lstatus{'expiry'}); if ($ltm) { $days = int(($ltm - time()) / (24*60*60)); push(@lics, [ $text{'right_expirydays'}, $days < 0 ? &text('right_expiryago', -$days) : $days ]); } } $hasvirt_lic = 1; } if ($hasvm2 && read_env_file($server_manager::licence_file, \%sserial) && $sserial{'SerialNumber'} ne 'GPL') { if ($hasvirt_lic) { push(@lics, [ undef, &ui_hr(), 4 ]); } # Show Cloudmin serial push(@lics, [ $text{'right_sserial'}, $sserial{'SerialNumber'} ]); push(@lics, [ $text{'right_skey'}, $sserial{'LicenseKey'} ]); push(@lbuts, [ "server-manager/licence.cgi", $text{'right_slcheck'} ]); # Add allowed system counts my %lstatus; read_file($server_manager::licence_status, \%lstatus); @allservers = grep { &server_manager::is_virtual_server($_) } &server_manager::list_managed_servers(); push(@lics, [ $text{'right_vm2max'}, $lstatus{'servers'} > 0 ? $lstatus{'servers'} : $text{'right_vunlimited'} ]); push(@lics, [ $text{'right_vm2used'}, scalar(@allservers) ]); # Show license expiry date if ($lstatus{'expiry'} =~ /^203[2-8]-/) { push(@lics, [ $text{'right_expiry'}, $text{'right_expirynever'} ]); } elsif ($lstatus{'expiry'}) { push(@lics, [ $text{'right_expiry'}, $lstatus{'expiry'} ]); $ltm = &parse_license_date($lstatus{'expiry'}); if ($ltm) { $days = int(($ltm - time()) / (24*60*60)); push(@lics, [ $text{'right_expirydays'}, $days < 0 ? &text('right_expiryago', -$days) : $days ]); } } $hasvm2_lic = 1; } if (@lics) { local $tb = undef; local $cb = undef; $h = $hasvirt_lic && $hasvm2_lic ? $text{'right_licenceheader_virt_vm2'} : $hasvirt_lic ? $text{'right_licenceheader'} : $text{'right_licenceheader_vm2'}; print ui_hidden_table_start( $h, "width=100%", 4, "licence", $open{'licence'}); foreach my $l (@lics) { print ui_table_row(@$l); } print ui_table_row(undef, ui_links_row( [ map { "<a href='$_->[0]'>$_->[1]</a>" } @lbuts ]), 4); print ui_hidden_table_end('licence'); } } elsif ($level == 1) { # Reseller # Show a reseller info about his domains @doms = grep { virtual_server::can_edit_domain($_) } virtual_server::list_domains(); $info = virtual_server::get_collected_info(); @qdoms = grep { virtual_server::can_edit_domain($_->[0]) } @{$info->{'quota'}}; # Domain and feature counts if (!$sects->{'novirtualmin'}) { print ui_hidden_table_start($text{'right_resellerheader'}, 'width=100%', 1, 'reseller', $open{'reseller'}); show_domains_info(\@doms); print ui_hidden_table_end('reseller'); } # Show quotas across reseller-owned domains if (!$sects->{'noquotas'} && @qdoms) { print ui_hidden_table_start($text{'right_quotasheader'}, 'width=100%', 1, 'quotas', $open{'quotas'} || &any_over_quota(\@qdoms)); show_quotas_info(\@qdoms, $info->{'maxquota'}); print ui_hidden_table_end('quotas'); } # Show bandwidth across reseller-owned domains if (!$sects->{'nobw'} && $virtual_server::config{'bw_active'}) { my @bwdoms = grep { !$_->{'parent'} && defined($_->{'bw_usage'}) } @doms; print ui_hidden_table_start($text{'right_bwheader'}, 'width=100%', 1, 'bw', $open{'bw'} || &any_over_bandwidth(\@bwdoms)); if (@bwdoms) { show_bandwidth_info(\@doms); } else { print ui_table_row(undef, $text{'right_bwnone'}, 2); } print ui_hidden_table_end(); } # New features for reseller show_new_features(0); } elsif ($level == 2) { # Domain owner # Show a server owner info about one domain $ex = virtual_server::extra_admin(); if ($ex) { $d = virtual_server::get_domain($ex); } else { $d = virtual_server::get_domain_by( "user", $remote_user, "parent", ""); } print ui_table_start($text{'right_header3'}, "width=100%", 4); print ui_table_row("<b>$text{'right_login'}</b>", $remote_user); print ui_table_row("<b>$text{'right_from'}</b>", $ENV{'REMOTE_HOST'}); if ($hasvirt) { print ui_table_row("<b>$text{'right_virtualmin'}</b>", $virtual_server::module_info{'version'}); } else { print ui_table_row("<b>$text{'right_virtualmin'}</b>", $text{'right_not'}); } $dname = defined(&virtual_server::show_domain_name) ? &virtual_server::show_domain_name($d) : $d->{'dom'}; print ui_table_row("<b>$text{'right_dom'}</b>", $dname); @subs = ( $d, virtual_server::get_domain_by("parent", $d->{'id'}) ); @reals = grep { !$_->{'alias'} } @subs; @mails = grep { $_->{'mail'} } @subs; ($sleft, $sreason, $stotal, $shide) = virtual_server::count_domains("realdoms"); if ($sleft < 0 || $shide) { print ui_table_row("<b>$text{'right_subs'}</b>", scalar(@reals)); } else { print ui_table_row("<b>$text{'right_subs'}</b>", text('right_of', scalar(@reals), $stotal)); } @aliases = grep { $_->{'alias'} } @subs; if (@aliases) { ($aleft, $areason, $atotal, $ahide) = virtual_server::count_domains("aliasdoms"); if ($aleft < 0 || $ahide) { print ui_table_row("<b>$text{'right_aliases'}</b>", scalar(@aliases)); } else { print ui_table_row("<b>$text{'right_aliases'}</b>", text('right_of', scalar(@aliases), $atotal)); } } # Users and aliases info $users = virtual_server::count_domain_feature("mailboxes", @subs); ($uleft, $ureason, $utotal, $uhide) = virtual_server::count_feature("mailboxes"); $msg = @mails ? $text{'right_fusers'} : $text{'right_fusers2'}; if ($uleft < 0 || $uhide) { print ui_table_row("<b>$msg</b>", $users); } else { print ui_table_row("<b>$msg</b>", text('right_of', $users, $utotal)); } if (@mails) { $aliases = virtual_server::count_domain_feature("aliases", @subs); ($aleft, $areason, $atotal, $ahide) = virtual_server::count_feature("aliases"); if ($aleft < 0 || $ahide) { print ui_table_row("<b>$text{'right_faliases'}</b>", $aliases); } else { print ui_table_row("<b>$text{'right_faliases'}</b>", text('right_of', $aliases, $atotal)); } } # Databases $dbs = virtual_server::count_domain_feature("dbs", @subs); ($dleft, $dreason, $dtotal, $dhide) = virtual_server::count_feature("dbs"); if ($dleft < 0 || $dhide) { print ui_table_row("<b>$text{'right_fdbs'}</b>", $dbs); } else { print ui_table_row("<b>$text{'right_fdbs'}</b>", text('right_of', $dbs, $dtotal)); } if (!$sects->{'noquotas'} && virtual_server::has_home_quotas()) { # Disk usage for all owned domains $homesize = virtual_server::quota_bsize("home"); $mailsize = virtual_server::quota_bsize("mail"); ($home, $mail, $db) = virtual_server::get_domain_quota($d, 1); $usage = $home*$homesize + $mail*$mailsize + $db; $limit = $d->{'quota'}*$homesize; if ($limit) { print &ui_table_row($text{'right_quota'}, text('right_of', nice_size($usage), &nice_size($limit)), 3); print &ui_table_row(" ", bar_chart_three($limit, $usage-$db, $db, $limit-$usage), 3); } else { print &ui_table_row($text{'right_quota'}, nice_size($usage), 3); } } if (!$sects->{'nobw'} && $virtual_server::config{'bw_active'} && $d->{'bw_limit'}) { # Bandwidth usage and limit print &ui_table_row($text{'right_bw'}, &text('right_of', &nice_size($d->{'bw_usage'}), &text( 'edit_bwpast_'.$virtual_server::config{'bw_past'}, &nice_size($d->{'bw_limit'}), $virtual_server::config{'bw_period'})), 3); print &ui_table_row(" ", &bar_chart($d->{'bw_limit'}, $d->{'bw_usage'}, 1), 3); } print ui_table_end(); # New features for domain owner show_new_features(0); } elsif ($level == 3) { # Usermin # Show user's information print ui_hidden_table_start($text{'right_header5'}, "width=100%", 4, "system", $open{'system'}); # Login name and real name print ui_table_row($text{'right_login'}, $remote_user); @uinfo = getpwnam($remote_user); if ($uinfo[6]) { $uinfo[6] =~ s/,.*$// if ($uinfo[6] =~ /,.*,/); print ui_table_row($text{'right_realname'}, &html_escape($uinfo[6])); } # Host and login info print ui_table_row($text{'right_host'}, &get_display_hostname()); print ui_table_row($text{'right_os'}, $gconfig{'os_version'} eq '*' ? $gconfig{'real_os_type'} : "$gconfig{'real_os_type'} $gconfig{'real_os_version'}"); # Usermin version print ui_table_row($text{'right_usermin'}, &get_webmin_version()); # System time $tm = &make_date(time()); print ui_table_row($text{'right_time'}, $tm); # Disk quotas if (&foreign_installed("quota")) { &foreign_require("quota", "quota-lib.pl"); $n = "a::user_filesystems($remote_user); $usage = 0; $quota = 0; for($i=0; $i<$n; $i++) { if ($quota::filesys{$i,'hblocks'}) { $quota += $quota::filesys{$i,'hblocks'}; $usage += $quota::filesys{$i,'ublocks'}; } elsif ($quota::filesys{$i,'sblocks'}) { $quota += $quota::filesys{$i,'sblocks'}; $usage += $quota::filesys{$i,'ublocks'}; } } if ($quota) { $bsize = undef; if (defined("a::quota_block_size)) { $bsize = "a::quota_block_size(); } $bsize ||= $quota::config{'block_size'}; $bsize ||= 1024; print ui_table_row($text{'right_uquota'}, &text('right_out', &nice_size($usage*$bsize), &nice_size($quota*$bsize)), 3); print ui_table_row(" ", &bar_chart($quota, $usage, 1), 3); } } print ui_hidden_table_end(); # Common modules @commonmods = grep { &foreign_available($_) } ( "filter", "changepass", "gnupg", "file", "mysql", "postgresql", "datastore" ); if (@commonmods) { print ui_hidden_table_start($text{'right_header7'}, "width=100%", 2, $open{'common'}); foreach $mod (@commonmods) { %minfo = &get_module_info($mod); print ui_table_row($minfo{'desc'}, "<a href='$mod/'>". ($text{'common_'.$mod} || $minfo{'longdesc'}). "</a>"); } print ui_hidden_table_end(); } } elsif ($level == 4) { # Show a Cloudmin system owner information about his systems print ui_hidden_table_start($text{'right_ownerheader'}, "width=100%", 4, "owner", $open{'owner'}, [ "width=30%" ]); print ui_table_row($text{'right_login'}, $remote_user); print ui_table_row($text{'right_from'}, $ENV{'REMOTE_HOST'}); print ui_table_row($text{'right_vm2'} , $server_manager::module_info{'version'}); print ui_table_row($text{'right_vm2real'} , $server_manager::access{'real'}); print ui_table_row($text{'right_vm2email'} , $server_manager::access{'email'}); @servers = &server_manager::list_available_managed_servers_sorted(); if (@servers == 1) { # Show primary system here $s = $servers[0]; if (&server_manager::can_action($s, "view")) { print ui_table_row("<b>$text{'right_vm2one'}</b>" , "<a href='server-manager/edit_serv.cgi?id=$s->{'id'}'>$s->{'host'}</a>"); } else { print ui_table_row("<b>$text{'right_vm2one'}</b>" , $s->{'host'}); } } print ui_hidden_table_end(); # New features for domain owner show_new_features(0); # Show a list of his systems if (@servers > 1) { print ui_hidden_table_start($text{'right_vm2serversheader'}, "width=100%", 4, "vm2servers", $open{'vm2servers'}, [ "width=30%" ]); show_vm2_servers(\@servers, 1); print ui_hidden_table_end('vm2servers'); } # Show limits and counts if (defined(&server_manager::get_owner_limits) && &server_manager::supports_plans()) { $limits = &server_manager::get_owner_limits(); $plan = &server_manager::get_owner_plan(); if ($limits) { print ui_hidden_table_start( $text{'right_vm2limitsheader'}, "width=100%", 4, "vm2limits", $open{'vm2limits'}, [ "width=30%", undef, "width=30%" ]); show_vm2_limits($limits, $plan); print ui_hidden_table_end('vm2servers'); } } # Show usage if (defined(&server_manager::get_owner_usage)) { $owner = &server_manager::get_system_owner($base_remote_user); @allusage = &server_manager::get_owner_usage($owner); @allusage = sort { $a->{'start'} cmp $b->{'start'} } @allusage; if (@allusage) { print ui_hidden_table_start( $text{'right_vm2usageheader'}, "width=100%", 2, "vm2usage", $open{'vm2usage'}, [ "width=30%", undef ]); show_vm2_usage(\@allusage); print ui_hidden_table_end('vm2servers'); } } } # See if any plugins have defined sections if ($hasvirt || $hasvm2) { foreach $s (&list_right_frame_sections()) { next if (!$s->{'plugin'}); next if ($sects->{'no'.$s->{'name'}}); print ui_hidden_table_start($s->{'title'}, "width=100%", 1, $s->{'name'}, $s->{'status'}); print $s->{'html'}; print ui_hidden_table_end($s->{'name'}); } } &popup_footer(); # status_grid(@services) # Returns HTML for a table of service statuses and actions sub status_grid { my @services = @_; my $rv; $rv = ui_columns_start([ $text{'right_status_service'} , $text{'right_status_up'} , $text{'right_status_actions'} ]); foreach my $status (@services) { my $label; # Manage link and stats? if ($status->{'links'} && @{$status->{'links'}}) { foreach my $l (@{$status->{'links'}}) { if ($l->{'manage'}) { $label = "<a href='$l->{'link'}'>$status->{'name'}</a>"; } elsif ($l->{'stat'}) { #print history_link($l->{'stat'}, 1); } } } $label = $status->{'name'} if (!$label); # Start or stop button? my $action = ($status->{'status'} ? "stop_feature.cgi" : "start_feature.cgi"); my $action_icon = ($status->{'status'} ? "<img src='images/stop.png' alt=$status->{'desc'} />" : "<img src='images/start.png' alt=$status->{'desc'} />"); my $action_link = "<a href='virtual-server/$action?" . "feature=$status->{'feature'}" . "&redirect=/right.cgi'" . " title='$status->{'desc'}'>" . "$action_icon</a>"; # Restartable? my $restart_link = ($status->{'status'} ? "<a href='virtual-server/restart_feature.cgi?" . "feature=$status->{'feature'}" . "&redirect=/right.cgi'" . " title='$status->{'restartdesc'}'>" . "<img src='images/reload.png'" . "alt='$status->{'restartdesc'}'></a>\n" : ""); # Nothing, if not running $rv .= ui_columns_row([$label, (!$status->{'status'} ? "<img src='images/down.gif' alt='Stopped' title='Stopped' />" : "<img src='images/up.gif' alt='Running' title='Running' />") , $action_link . " " . $restart_link]); } $rv .= ui_columns_end(); return $rv; } # bar_chart(total, used, blue-rest) # Returns HTML for a bar chart of a single value sub bar_chart { local ($total, $used, $blue) = @_; my $rv; $rv .= sprintf "<div class='barchart'><img src=images/red.gif alt='' width=%s%% height=12px>", int($bar_width*$used/$total)+1; if ($blue) { $rv .= sprintf "<img src=images/blue.gif alt='' width=%s%% height=12px></div>", $bar_width - int($bar_width*$used/$total)-1; } else { $rv .= sprintf "<img src=images/white.gif alt='' width=%s%% height=12px></div>", $bar_width - int($bar_width*$used/$total)-1; } return $rv; } # bar_chart_three(total, used1, used2, used3) # Returns HTML for a bar chart of three values, stacked sub bar_chart_three { local ($total, $used1, $used2, $used3) = @_; local $rv; local $w1 = $total ? int($bar_width*$used1/$total)+1 : 0; local $w2 = $total ? int($bar_width*$used2/$total) : 0; local $w3 = $total ? int($bar_width*$used3/$total) : 0; local $w4 = int($bar_width - $w1 - $w2 - $w3); $rv .= "<div class='barchart' nowrap='nowrap'>"; if ($w1) {$rv .= sprintf "<img src=images/red.gif width=%s%% height=12px>", $w1;} if ($w2) {$rv .= sprintf "<img src=images/purple.gif width=%s%% height=12px>", $w2;} if ($w3) {$rv .= sprintf "<img src=images/blue.gif width=%s%% height=12px>", $w3;} if ($w4) {$rv .= sprintf "<img src=images/grey.gif width=%s%% height=12px>", $w4;} $rv .= "</div>"; return $rv; } # show_domains_info(&domains) # Given a list of domains, show summaries of feature usage sub show_domains_info { # Count features for specified domains local @doms = @{$_[0]}; local %fcount = map { $_, 0 } @virtual_server::features; $fcount{'doms'} = 0; foreach my $f (@virtual_server::features, 'doms', 'dbs', 'mailboxes', 'aliases', 'quota', 'bw') { $fcount{$f} = &virtual_server::count_domain_feature($f, @doms); } # Show counts for features, including maxes $bsize = &virtual_server::has_home_quotas() ? &virtual_server::quota_bsize("home") : undef; print "<table width=100%>\n"; my $i = 0; foreach my $f ("doms", "dns", "web", "ssl", "mail", "dbs", "mailboxes", "aliases", "quota", "bw") { local $cur = int($fcount{$f}); next if ($cur < 0); local ($extra, $reason, $max, $hide) = &virtual_server::count_feature($f); print "<tr class='ui_form_pair'>\n" if ($i%2 == 0); print "<td class='ui_form_label' width=25%>", $text{'right_f'.$f},"</td>\n"; local $hlink = $f eq "doms" || $f eq "users" || $f eq "aliases" ? &history_link($f, 1) : ""; if ($f eq "bw") { $cur = &nice_size($cur); $max = &nice_size($max); } elsif ($f eq "quota" && $bsize) { $cur = &nice_size($cur * $bsize); $max = &nice_size($max * $bsize); } if ($extra < 0 || $hide) { print "<td class='ui_form_value' width=25%>", $cur," ",$hlink,"</td>\n"; } else { print "<td class='ui_form_value' width=25%>", &text('right_out', $cur, $max)," ",$hlink,"</td>\n"; } print "</tr>\n" if ($i%2 == 1); $i++; } print "</table>\n"; } sub any_over_quota { local ($quota) = @_; foreach my $q (@$quota) { return 1 if ($q->[2] && $q->[1]+$q->[3] >= $q->[2]); } return 0; } # show_quotas_info("as, maxquota) # Show disk usage by various domains sub show_quotas_info { local ($quota, $maxquota) = @_; local @quota = @$quota; local $max = $sects->{'max'} || $default_domains_to_show; if (@quota) { # Work out if showing by percent makes sense my $qshow = $sects->{'qshow'}; if ($qshow) { my @quotawithlimit = grep { $_->[2] } @quota; $qshow = 0 if (!@quotawithlimit); } # Limit to those with a quota limit, if showing a percent if ($qshow) { @quota = grep { $_->[2] } @quota; } if ($qsort) { # Sort by percent used @quota = grep { $_->[2] } @quota; @quota = sort { ($b->[1]+$b->[3])/$b->[2] <=> ($a->[1]+$a->[3])/$a->[2] } @quota; } else { # Sort by usage @quota = sort { $b->[1]+$b->[3] <=> $a->[1]+$a->[3] } @quota; } # Show message about number of domains being displayed print "<table width=100%>\n"; if (@quota > $max) { @quota = @quota[0..($max-1)]; $qmsg = &text('right_quotamax', $max); } elsif ($level == 0) { $qmsg = $text{'right_quotaall'}; } else { $qmsg = $text{'right_quotayours'}; } # Show links to graphs print "<tr class='ui_form_pair'> <td class='ui_form_value' colspan=2>$qmsg ", &history_link("quotalimit", 1)," ", &history_link("quotaused", 1),"</td> </tr>\n"; # The table of domains foreach my $q (@quota) { print "<tr class='ui_form_pair'>\n"; my $ed = virtual_server::can_config_domain($q->[0]) ? "edit_domain.cgi" : "view_domain.cgi"; $dname = virtual_server::show_domain_name($q->[0]); print "<td class='ui_form_label' width=20%><a href='virtual-server/$ed?", "dom=$q->[0]->{'id'}'>$dname</a></td>\n"; print "<td class='ui_form_value' width=50% nowrap>"; if ($qshow) { # By percent used $qpc = int($q->[1]*100 / $q->[2]); $dpc = int($q->[3]*100 / $q->[2]); print &bar_chart_three( 100, $qpc, $dpc, 100-$qpc-$dpc ); } else { # By actual usage print &bar_chart_three( $maxquota, # Highest quota $q->[1], # Domain's disk usage $q->[3], # DB usage $q->[2] ? $q->[2]-$q->[1]-$q->[3] : 0, # Leftover ); } print "</td>\n"; # Percent used, if available if ($q->[2]) { local $pc = int(($q->[1]+$q->[3])*100 / $q->[2]); $pc = " $pc" if ($pc < 10); print "<td class='ui_form_value' nowrap>",$pc,"% - ", &text('right_out', &nice_size($q->[1]+$q->[3]), &nice_size($q->[2])),"</td>\n"; } else { print "<td class='ui_form_value'>",&nice_size($q->[1]+$q->[3]),"</td>\n"; } print "</tr>\n"; } print "</table>\n"; } } sub any_over_bandwidth { local ($doms) = @_; foreach my $d (@$doms) { if ($d->{'bw_limit'} && $d->{'bw_usage'} >= $d->{'bw_limit'}) { return 1; } } return 0; } # show_bandwidth_info(&domains) # Show a table of bandwidth usage for all domains this user can access sub show_bandwidth_info { # Filter domains local @doms = @{$_[0]}; local @doms = grep { !$_->{'parent'} } @doms; if ($sects->{'qsort'}) { # Sort by percent used @doms = grep { $_->{'bw_limit'} } @doms; @doms = sort { $b->{'bw_usage'}/$b->{'bw_limit'} <=> $a->{'bw_usage'}/$a->{'bw_limit'} } @doms; } else { # Sort by usage @doms = sort { $b->{'bw_usage'} <=> $a->{'bw_usage'} } @doms; } # Work out highest usage or limit my $maxbw = 0; foreach my $d (@doms) { $maxbw = $d->{'bw_limit'} if ($d->{'bw_limit'} > $maxbw); $maxbw = $d->{'bw_usage'} if ($d->{'bw_usage'} > $maxbw); } return if (!$maxbw); # No bandwidth yet # Show message about number of domains being displayed local $max = $sects->{'max'} || $default_domains_to_show; print "<table width=100%>\n"; if (@doms > $max) { @doms = @doms[0..($max-1)]; $qmsg = &text('right_quotamax', $max); } else { $qmsg = $text{'right_quotaall'}; } print "<tr class='ui_form_pair'> <td class='ui_form_value' colspan=2>$qmsg</td> </tr>\n"; # Work out if showing by percent makes sense my $qshow = $sects->{'qshow'}; if ($qshow) { my @domswithlimit = grep { $_->{'bw_limit'} } @doms; $qshow = 0 if (!@domswithlimit); } # The table of domains foreach my $d (@doms) { print "<tr class='ui_form_pair'>\n"; my $ed = virtual_server::can_config_domain($d) ? "edit_domain.cgi" : "view_domain.cgi"; $dname = virtual_server::show_domain_name($d); print "<td class='ui_form_label' width=20%><a href='virtual-server/$ed?", "dom=$d->{'id'}'>$dname</a></td>\n"; print "<td class='ui_form_value' width=50% nowrap>"; $pc = $d->{'bw_limit'} ? int($d->{'bw_usage'}*100 / $d->{'bw_limit'}) : undef; if ($qshow) { # By percent used print bar_chart_three( 100, $pc, 0, $pc > 100 ? 0 : 100-$pc, ); } else { # By actual usage print bar_chart_three( $maxbw, # Highest usage $d->{'bw_usage'}, # Domain's bandwidth 0, $d->{'bw_usage'} > $d->{'bw_limit'} ? 0 : $d->{'bw_limit'} ? $d->{'bw_limit'}-$d->{'bw_usage'} : 0, # Leftover ); } print "</td>\n"; # Percent used, if available if ($d->{'bw_limit'}) { $pc = " $pc" if ($pc < 10); print "<td class='ui_form_value' nowrap>",$pc,"% - ", &text('right_out', &nice_size($d->{'bw_usage'}), &nice_size($d->{'bw_limit'})),"</td>\n"; } else { print "<td class='ui_form_value'>",&nice_size($d->{'bw_usage'}),"</td>\n"; } print "</tr>\n"; } print "</table>\n"; } # collapsed_header(text, name) sub collapsed_header { local ($text, $name) = @_; print "<br><font style='font-size:16px'>"; local $others = join("&", map { "open=$_" } grep { $_ ne $name } @open); $others = "&$others" if ($others); if ($open{$name}) { print "<img src=images/open.gif border=0>\n"; print "<a href='right.cgi?$others'>$text</a>"; } else { print "<img src=images/closed.gif border=0>\n"; print "<a href='right.cgi?open=$name$others'>$text</a>"; } print "</font><br>\n"; return $open{$name}; } # show_toggleview(name, id, status, header) # Prints HTML for an open/close toggler sub show_toggleview { local ($name, $id, $status, $header) = @_; local $img = $status ? "open" : "closed"; local $cls = $status ? "itemshown" : "itemhidden"; print "<a href=\"javascript:toggleview('$name','$id')\" id='$id'><img border='0' src='images/$img.gif' alt='[–]'></a>"; print "<a href=\"javascript:toggleview('$name','$id')\" id='$id'><b> $header</b></a><p>"; print "<div class='$cls' id='$name'>"; } # history_link(stat, [notd]) # If history is being kept and the user can view it, output a graph link sub history_link { local ($stat, $notd) = @_; if ($hasvirt && defined(&virtual_server::can_show_history) && &virtual_server::can_show_history()) { local $msg = $text{'history_stat_'.$stat}; return ($notd ? "" : "<td>"). "<a href='virtual-server/history.cgi?stat=$stat'>". "<img src=images/graph.png border=0 title='$msg'></a>". ($notd ? "" : "</td>")."\n"; } return undef; } sub show_new_features { my ($nosect) = @_; my $newhtml; if ($hasvirt && !$sects->{'nonewfeatures'} && defined(&virtual_server::get_new_features_html) && ($newhtml = virtual_server::get_new_features_html($defdom))) { # Show new features HTML for Virtualmin if ($nosect) { print "<h3>$text{'right_newfeaturesheader'}</h3>\n"; } else { print ui_hidden_table_start($text{'right_newfeaturesheader'}, "width=100%", 2, "newfeatures", 1); } print &ui_table_row(undef, $newhtml, 2); if (!$nosect) { print ui_hidden_table_end("newfeatures"); } } if ($hasvm2 && !$sects->{'nonewfeatures'} && defined(&server_manager::get_new_features_html) && ($newhtml = server_manager::get_new_features_html(undef))) { # Show new features HTML for Cloudmin if ($nosect) { print "<h3>$text{'right_newfeaturesheadervm2'}</h3>\n"; } else { print ui_hidden_table_start($text{'right_newfeaturesheadervm2'}, "width=100%", 2, "newfeaturesvm2", 1); } print &ui_table_row(undef, $newhtml, 2); if (!$nosect) { print ui_hidden_table_end("newfeaturesvm2"); } } } # show_vm2_servers(&servers, showtypes?) # Prints a summary of Cloudmin systems sub show_vm2_servers { local ($servers, $showtypes) = @_; # Count up systems by type and status and usage my %c; foreach my $s (@$servers) { $c{'all'}++; if (&server_manager::is_parent_server($s)) { $c{'host'}++; } my $virt = &server_manager::is_virtual_server($s); $c{$virt ? 'virt' : 'real'}++; if ($s->{'status'} eq 'nowebmin' || $s->{'status'} eq 'novirt' || $s->{'status'} eq 'virt' || $s->{'status'} eq 'alive') { $c{'up'}++; } else { $c{'down'}++; } my $mfunc = "server_manager::type_".$s->{'manager'}."_get_memory_size"; if (defined(&$mfunc)) { my $mem = &$mfunc($s); if ($mem) { $c{'mem'} += $mem; } } my $dfunc = "server_manager::type_".$s->{'manager'}."_get_disk_size"; if (defined(&$dfunc)) { my $disk = &$dfunc($s); if ($disk) { $c{'disk'} += $disk; } } } # Show in a form foreach my $f ('all', 'host', 'virt', 'real', 'up', 'down', 'mem', 'disk') { print &ui_table_row($text{'right_vm2count'.$f}, $f eq 'mem' || $f eq 'disk' ? &nice_size($c{$f}) : int($c{$f})); } } # Output a table of VM2 system owners limits and usage sub show_vm2_limits { my ($limits, $plan) = @_; # Account plan name if ($plan) { print ui_table_row($text{'right_vm2plan'}, $plan->{'desc'}, 3); } foreach my $l (@server_manager::plan_limit_types) { $n = &indexof($l, @server_manager::nice_plan_limit_types) >= 0; $nice = $n ? &nice_size($limits->{$l}) : $l eq "cpu" ? $limits->{$l}."%" : $limits->{$l}; $nicemax = $n ? &nice_size($limits->{'max_'.$l}) : $l eq "cpu" ? $limits->{'max_'.$l}."%" : $limits->{'max_'.$l}; $msg1 = $limits->{$l} || !$limits->{$l.'_unlimited'} ? $nice : $text{'right_vunlimited'}; $msg2 = $limits->{'max_'.$l} ? $nicemax : $text{'right_vunlimited'}; if ($limits->{'max_'.$l} && $limits->{$l} > $limits->{'max_'.$l}) { $msg1 = "<font color=red>$msg1</font>"; $msg2 = "<font color=red>$msg2</font>"; } print ui_table_row($text{'right_vm2c'.$l}, $msg1); print ui_table_row($text{'right_vm2m'.$l}, $msg2); } } # show_vm2_usage(&usage) # Print usage of various types over the last period sub show_vm2_usage { my ($allusage) = @_; my @usageids = &unique(map { $_->{'server'} } @$allusage); # Period range my ($start, $end) = &server_manager::usage_period_start_end($allusage, 0); print &ui_table_row($server_manager::text{'edit_ustart'}, &make_date($start)); # Total uptime over usage period my $up = &server_manager::sum_usage_over_period($allusage, $start, $end, 'up'); print &ui_table_row($server_manager::text{'edit_uup'}, &server_manager::nice_hour_mins_secs($up)); # Cross-module calls to &text don't work $text{'edit_ugbh'} = $server_manager::text{'edit_ugbh'}; $text{'edit_ucpuh'} = $server_manager::text{'edit_ucpuh'}; $text{'edit_ugbh2'} = $server_manager::text{'edit_ugbh2'}; $text{'owner_del'} = $server_manager::text{'owner_del'}; # Memory over accounting period $mem = &server_manager::sum_usage_over_period(\@allusage, $start, $end, 'mem'); if ($mem) { $gbh = sprintf("%.2f", ($mem / (3600*1024*1024*1024))); $avgmem = &nice_size(int($mem / ($end - $start))); $upmem = &nice_size(int($mem / $up)); print &ui_table_row($server_manager::text{'edit_umem'}, &text('edit_ugbh', $gbh, $avgmem, $upmem)); } # CPU allocation, in percent hours $cpu = &server_manager::sum_usage_over_period(\@allusage, $start, $end, 'cpu'); if ($cpu) { $cpuh = sprintf("%.2f", ($cpu / 3600)); $avgcpu = int($cpu / ($end - $start)); $upcpu = int($cpu / $up); print &ui_table_row($server_manager::text{'edit_ucpu'}, &text('edit_ucpuh', $cpuh, $avgcpu, $upcpu)); } # CPU load, in percent hours $load = &server_manager::sum_usage_over_period(\@allusage, $start, $end, 'load'); if ($load) { $cpuh = sprintf("%.2f", ($load / 3600)); $avgcpu = int($load / ($end - $start)); $upcpu = int($load / $up); print &ui_table_row($server_manager::text{'edit_uload'}, &text('edit_ucpuh', $cpuh, $avgcpu, $upcpu)); } # Disk assigned and used over period $disk = &server_manager::sum_usage_over_period(\@allusage, $start, $end, 'disk'); $space = &server_manager::sum_usage_over_period(\@allusage, $start, $end, 'space'); if ($disk && $disk != $space) { $gbh = sprintf("%.2f", ($disk / (3600*1024*1024*1024))); $avgdisk = &nice_size(int($disk / ($end - $start))); print &ui_table_row($server_manager::text{'edit_udisk'}, &text('edit_ugbh2', $gbh, $avgdisk)); } if ($space) { $gbh = sprintf("%.2f", ($space / (3600*1024*1024*1024))); $avgspace = &nice_size(int($space / ($end - $start))); print &ui_table_row($server_manager::text{'edit_uspace'}, &text('edit_ugbh2', $gbh, $avgspace)); } # Combined bandwidth usage if ($server_manager::config{'bw_enabled'}) { $bstart = &server_manager::bandwidth_period_start($in{'ago'}); $bend = &server_manager::bandwidth_period_end($in{'ago'}); $bwinfo = &server_manager::get_owner_bandwidth($owner, $bstart, $bend); $bwtotal = 0; for($hh=$bstart; $hh<$bend; $hh+=3600) { $bwtotal += $bwinfo->{'hour_in_'.$hh}; $bwtotal += $bwinfo->{'hour_out_'.$hh}; } print &ui_table_row($server_manager::text{'owner_bwusage'}, &nice_size($bwtotal)); } # Systems included if (@usageids) { my @usagenames; foreach my $id (@usageids) { my $us = &server_manager::get_managed_server($id); push(@usagenames, $us ? $us->{'host'} : &text('owner_del', $id)); } print &ui_table_row($server_manager::text{'owner_usagesystems'}, &ui_links_row(\@usagenames)); } } sub parse_license_date { if ($_[0] =~ /^(\d{4})-(\d+)-(\d+)$/) { return eval { timelocal(0, 0, 0, $3, $2-1, $1-1900) }; } return undef; }y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`