#!/usr/local/bin/perl # Show server or domain information BEGIN { push(@INC, ".."); }; use WebminCore; &init_config(); &ReadParse(); &load_theme_library(); if (&get_product_name() eq "usermin") { $level = 3; } else { $level = 0; } %text = &load_language($current_theme); $bar_width = 300; foreach $o (split(/\0/, $in{'open'})) { push(@open, $o); $open{$o} = 1; } $prehead = defined(&WebminCore::theme_prehead) ? &capture_function_output(\&WebminCore::theme_prehead) : ""; &popup_header(undef, $prehead); print "
\n"; # Webmin logo if (&get_product_name() eq 'webmin') { print "

\n"; } if ($level == 0) { # Show general system information print &ui_table_start(undef, undef, 2); # Ask status module for collected info &foreign_require("system-status"); $info = &system_status::get_collected_info(); # Hostname $ip = $info && $info->{'ips'} ? $info->{'ips'}->[0]->[0] : &to_ipaddress(get_system_hostname()); $ip = " ($ip)" if ($ip); $host = &get_system_hostname().$ip; if (&foreign_available("net")) { $host = "$host"; } print &ui_table_row($text{'right_host'}, $host); # Operating system print &ui_table_row($text{'right_os'}, $gconfig{'os_version'} eq '*' ? $gconfig{'real_os_type'} : $gconfig{'real_os_type'}." ".$gconfig{'real_os_version'}); # Webmin version print &ui_table_row($text{'right_webmin'}, &get_webmin_version()); # System time $tm = localtime(time()); print &ui_table_row($text{'right_time'}, &foreign_available("time") ? "$tm" : $tm); # Kernel and CPU if ($info->{'kernel'}) { print &ui_table_row($text{'right_kernel'}, &text('right_kernelon', $info->{'kernel'}->{'os'}, $info->{'kernel'}->{'version'}, $info->{'kernel'}->{'arch'})); } # CPU type and cores if ($info->{'load'}) { @c = @{$info->{'load'}}; if (@c > 3) { print &ui_table_row($text{'right_cpuinfo'}, &text('right_cputype', @c)); } } # Temperatures, if available if ($info->{'cputemps'}) { my @temps; foreach my $t (@{$info->{'cputemps'}}) { push(@temps, $t->{'core'}.": ". int($t->{'temp'})."℃"); } print &ui_table_row($text{'right_cputemps'}, join(", ", @temps)); } if ($info->{'drivetemps'}) { my @temps; foreach my $t (@{$info->{'drivetemps'}}) { my $short = $t->{'device'}; $short =~ s/^\/dev\///; my $emsg; if ($t->{'errors'}) { $emsg .= " (". &text('right_driveerr', $t->{'errors'}). ")"; } elsif ($t->{'failed'}) { $emsg .= " (". $text{'right_drivefailed'}. ")"; } push(@temps, $short.": ".$t->{'temp'}."℃".$emsg); } print &ui_table_row($text{'right_drivetemps'}, join(", ", @temps)); } # System uptime &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); } if ($uptime) { if (&foreign_available("init")) { $uptime = "$uptime"; } print &ui_table_row($text{'right_uptime'}, $uptime); } # Running processes if (&foreign_check("proc")) { @procs = &proc::list_processes(); $pr = scalar(@procs); print &ui_table_row($text{'right_procs'}, &foreign_available("proc") ? "$pr" : $pr); } # Load averages if ($info->{'load'}) { @c = @{$info->{'load'}}; if (@c) { print &ui_table_row($text{'right_cpu'}, &text('right_load', @c)); } } # CPU usage if ($info->{'cpu'}) { @c = @{$info->{'cpu'}}; print &ui_table_row($text{'right_cpuuse'}, &text('right_cpustats', @c)); } # Memory usage if ($info->{'mem'}) { @m = @{$info->{'mem'}}; if (@m && $m[0] && $m[5]) { # Show memory usage with bursting $real = &text('right_used2', &nice_size($m[0]*1024), &nice_size(($m[0]-$m[1])*1024), &nice_size($m[5]*1024))."
\n". &bar_chart_three($m[5], $m[1], $m[0]-$m[1], $m[5]-$m[0]); } elsif (@m && $m[0] && !$m[5]) { # Show memory usage on a regular system $real = &text('right_used', &nice_size($m[0]*1024), &nice_size(($m[0]-$m[1])*1024))."
\n". &bar_chart($m[0], $m[0]-$m[1], 1); } else { # No memory info available $real = undef; } if ($real) { if (&foreign_available("proc")) { $real = "$real"; } print &ui_table_row($text{'right_real'}, $real); } 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))."
\n". &bar_chart($m[2], $m[2]-$m[3], 1)); } } # Disk space on local drives if ($info->{'disk_total'}) { ($total, $free) = ($info->{'disk_total'}, $info->{'disk_free'}); $disk = &text('right_used', &nice_size($total), &nice_size($total-$free)); if (&foreign_available("mount")) { $disk = "$disk"; } print &ui_table_row($text{'right_disk'}, $disk."
\n". &bar_chart($total, $total-$free, 1)); } # Package updates if ($info->{'poss'}) { @poss = @{$info->{'poss'}}; @secs = grep { $_->{'security'} } @poss; if (@poss && @secs) { $msg = &text('right_upsec', scalar(@poss), scalar(@secs)); } elsif (@poss) { $msg = &text('right_upneed', scalar(@poss)); } else { $msg = $text{'right_upok'}; } if (&foreign_available("package-updates")) { $msg = "$msg"; } print &ui_table_row($text{'right_updates'}, $msg); } print &ui_table_end(); # Show other webmin-generated notifications if (&foreign_check("webmin")) { &foreign_require("webmin", "webmin-lib.pl"); &webmin::show_webmin_notifications(); } } elsif ($level == 3) { # Show Usermin user's information print "

$text{'right_header5'}

\n"; print &ui_table_start(undef, undef, 2); # Host and login info print &ui_table_row($text{'right_host'}, &get_system_hostname()); # Operating system print &ui_table_row($text{'right_os'}, $gconfig{'os_version'} eq '*' ? $gconfig{'real_os_type'} : $gconfig{'real_os_type'}." ".$gconfig{'real_os_version'}); # Webmin version print &ui_table_row($text{'right_usermin'}, &get_webmin_version()); # System time $tm = localtime(time()); print &ui_table_row($text{'right_time'}, &foreign_available("time") ? "$tm" : $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 = $quota::config{'block_size'}; print &ui_table_row($text{'right_uquota'}, &text('right_out', &nice_size($usage*$bsize), &nice_size($quota*$bsize))."
\n". &bar_chart($quota, $usage, 1)); } } print &ui_table_end(); } print "
\n"; &popup_footer(); # bar_chart(total, used, blue-rest) # Returns HTML for a bar chart of a single value sub bar_chart { local ($total, $used, $blue) = @_; local $rv; $rv .= sprintf "", int($bar_width*$used/$total)+1; if ($blue) { $rv .= sprintf "", $bar_width - int($bar_width*$used/$total)-1; } else { $rv .= sprintf "", $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 = int($bar_width*$used1/$total)+1; local $w2 = int($bar_width*$used2/$total); local $w3 = int($bar_width*$used3/$total); $rv .= sprintf "", $w1; $rv .= sprintf "", $w2; $rv .= sprintf "", $w3; $rv .= sprintf "", $bar_width - $w1 - $w2 - $w3; return $rv; } # collapsed_header(text, name) sub collapsed_header { local ($text, $name) = @_; print "
"; local $others = join("&", map { "open=$_" } grep { $_ ne $name } @open); $others = "&$others" if ($others); if ($open{$name}) { print "\n"; print &ui_link("right.cgi?$others",$text); } else { print "\n"; print &ui_link("right.cgi?open=$name$others",$text); } print "
\n"; return $open{$name}; }