#!/usr/bin/perl # Show the left-side menu of Virtualmin domains, plus modules use strict; use warnings; no warnings 'redefine'; no warnings 'uninitialized'; # Globals our %in; our %text; our $base_remote_user; our %miniserv; our %gaccess; our $session_id; our $trust_unknown_referers = 1; require "gray-theme/gray-theme-lib.pl"; require "gray-theme/theme.pl"; ReadParse(); popup_header("Virtualmin"); my $is_master; # Is this user root? if (foreign_available("virtual-server")) { foreign_require("virtual-server"); $is_master = virtual_server::master_admin(); } elsif (foreign_available("server-manager")) { foreign_require("server-manager"); $is_master = server_manager::can_action(undef, "global"); } # Find all left-side items from Webmin my $sects = get_right_frame_sections(); my @leftitems = list_combined_webmin_menu($sects, \%in); my @lefttitles = grep { $_->{'type'} eq 'title' } @leftitems; # Work out what mode selector contains my @has = ( ); my %modmenu; foreach my $title (@lefttitles) { push(@has, { 'id' => $title->{'module'}, 'desc' => $title->{'desc'}, 'icon' => $title->{'icon'} }); $modmenu{$title->{'module'}}++; } my $nw = $sects->{'nowebmin'} || 0; if ($nw == 0 || $nw == 2 && $is_master) { my $p = get_product_name(); push(@has, { 'id' => 'modules', 'desc' => $text{'has_'.$p}, 'icon' => '/images/'.$p.'-small.png' }); } # Default left-side mode my $mode = $in{'mode'} ? $in{'mode'} : $sects->{'tab'} && $sects->{'tab'} =~ /vm2/ ? "server-manager" : $sects->{'tab'} && $sects->{'tab'} =~ /virtualmin/ ? "virtual-server" : $sects->{'tab'} && $sects->{'tab'} =~ /mail/ ? "mailboxes" : $sects->{'tab'} && $sects->{'tab'} =~ /webmin/ ? "modules" : @leftitems ? $has[0]->{'id'} : "modules"; # Show mode selector if (indexof($mode, (map { $_->{'id'} } @has)) < 0) { $mode = $has[0]->{'id'}; } if (@has > 1) { print "<div class='mode'>"; foreach my $m (@has) { print "<b>"; if ($m->{'id'} ne $mode) { print "<a href='left.cgi?mode=$m->{'id'}'>"; } if ($m->{'icon'}) { my $icon = add_webprefix($m->{'icon'}); print "<img src='$icon' alt='$m->{'id'}'> "; } print $m->{'desc'}; if ($m->{'id'} ne $mode) { print "</a>\n"; } print "</b>\n"; } print "</div>"; } print "<div class='wrapper leftmenu'>\n"; print "<table id='main' width='100%'><tbody><tr><td>\n"; my $selwidth = (get_left_frame_width() - 70)."px"; if ($mode eq "modules") { # Only showing Webmin modules @leftitems = &list_modules_webmin_menu(); foreach my $l (@leftitems) { $l->{'members'} = [ grep { !$modmenu{$_->{'id'}} } @{$l->{'members'}} ]; } push(@leftitems, { 'type' => 'hr' }); } else { # Only show items under some title OR items that have no title my ($lefttitle) = grep { $_->{'id'} eq $mode } @lefttitles; my %titlemods = map { $_->{'module'}, $_ } @lefttitles; @leftitems = grep { $_->{'module'} eq $mode || !$titlemods{$_->{'module'}} } @leftitems; } # Show Webmin search form my $cansearch = ($gaccess{'webminsearch'} || '') ne '0' && !$sects->{'nosearch'}; if ($mode eq "modules" && $cansearch) { push(@leftitems, { 'type' => 'input', 'desc' => ' ', 'tags' => " placeholder='$text{'left_search'}' style='width: 92%;'", 'size' => 10, 'name' => 'search', 'cgi' => '/webmin_search.cgi', }); push(@leftitems, { 'type' => 'hr' }); } # Show system information link push(@leftitems, { 'type' => 'item', 'id' => 'home', 'desc' => $text{'left_home'}, 'link' => '/right.cgi', 'icon' => '/images/gohome.png' }); # Show refresh modules link if ($mode eq "modules" && foreign_available("webmin")) { push(@leftitems, { 'type' => 'item', 'id' => 'refresh', 'desc' => $text{'main_refreshmods'}, 'link' => '/webmin/refresh_modules.cgi', 'icon' => '/images/reload.png' }); } # Show logout link get_miniserv_config(\%miniserv); if ($miniserv{'logout'} && !$ENV{'SSL_USER'} && !$ENV{'LOCAL_USER'} && $ENV{'HTTP_USER_AGENT'} !~ /webmin/i) { my $logout = { 'type' => 'item', 'id' => 'logout', 'target' => 'window', 'icon' => '/images/stock_quit.png' }; if ($main::session_id) { $logout->{'desc'} = $text{'main_logout'}; $logout->{'link'} = '/session_login.cgi?logout=1'; } else { $logout->{'desc'} = $text{'main_switch'}; $logout->{'link'} = '/switch_user.cgi'; } push(@leftitems, $logout); } # Show link back to original Webmin server if ($ENV{'HTTP_WEBMIN_SERVERS'}) { push(@leftitems, { 'type' => 'item', 'desc' => $text{'header_servers'}, 'link' => $ENV{'HTTP_WEBMIN_SERVERS'}, 'icon' => '/images/webmin-small.gif', 'target' => 'window' }); } show_menu_items_list(\@leftitems, 0); print "</td></tr></tbody></table>\n"; print <<EOF; <script type='text/javascript'> (function() { var imgs = document.querySelectorAll('img[src]'), mailfolders = 0; imgs.forEach(function(img) { var i = document.createElement("i"); if (img.src) { if (img.src.includes('webmin-small.png')) { i.classList.add('ff', 'ff-webmin'); } else if (img.src.includes('usermin-small.png')) { i.classList.add('ff', 'ff-webmin', 'ff-usermin'); } else if (img.src.includes('virtualmin.png')) { i.classList.add('ff', 'ff-virtualmin'); } else if (img.src.includes('vm2.png')) { i.classList.add('ff', 'ff-cloudmin'); } else if (img.src.includes('index.png')) { i.classList.add('ff', 'ff-fw', 'ff-virtualmin-tick'); } else if (img.src.includes('graph.png')) { i.classList.add('ff', 'ff-fw', 'ff-chart'); } else if (img.src.includes('gohome.png')) { i.classList.add('ff', 'ff-fw', 'ff-home'); } else if (img.src.includes('stock_quit.png')) { i.classList.add('ff', 'ff-fw', 'ff-sign-out'); } else if (img.src.includes('reload.png')) { i.classList.add('ff', 'ff-fw', 'ff-refresh'); } else if (img.src.includes('mail.') && !mailfolders) { i.classList.add('ff', 'ff-mail'); mailfolders = 1; } else if (img.src.includes('mail.') && mailfolders) { i.classList.add('ff', 'ff-folder-open'); } else if (img.src.includes('address.')) { i.classList.add('ff', 'ff-address-book'); } else if (img.src.includes('address.')) { i.classList.add('ff', 'ff-address-book'); } else if (img.src.includes('sig.')) { i.classList.add('ff', 'ff-signature'); } else if (img.src.includes('changepass.')) { i.classList.add('ff', 'ff-lock'); } if (i.classList.length) { img.replaceWith(i); } } }); var inputs = document.querySelectorAll('input[src]'); inputs.forEach(function(input) { var b = document.createElement("button"), i = document.createElement("i"); if (input.src) { if (input.src.includes('ok.png')) { i.classList.add('ff', 'ff-play-circle'); b.type = 'submit'; b.classList.add('servers-submit'); b.appendChild(i); input.replaceWith(b); } } }); })(); </script> EOF print "</div>\n"; popup_footer(); # show_menu_items_list(&list, indent) # Actually prints the HTML for menu items sub show_menu_items_list { my ($items, $indent) = @_; foreach my $item (@$items) { if ($item->{'type'} eq 'item') { # Link to some page my $it = $item->{'target'} || ''; my $t = $it eq 'new' ? '_blank' : $it eq 'window' ? '_top' : 'right'; my $link = add_webprefix($item->{'link'}); if ($item->{'link'} =~ /^(https?):\/\//) { $t = '_blank'; $link = $item->{'link'}; } if ($item->{'icon'}) { my $icon = add_webprefix($item->{'icon'}); print "<div class='linkwithicon". ($item->{'inactive'} ? ' inactive' : '')."'>". "<img src='$icon' alt=''>\n"; } my $cls = $item->{'icon'} ? 'aftericon' : $indent ? 'linkindented'. ($item->{'inactive'} ? ' inactive' : ''). '' : 'leftlink'; print "<div class='$cls'>"; print "<a href='$link' target=$t>". "$item->{'desc'}</a>"; print "</div>"; if ($item->{'icon'}) { print "</div>"; } print "\n"; } elsif ($item->{'type'} eq 'cat') { # Start of a new category my $c = $item->{'id'}; print "<details>"; print "<summary><span>$item->{'desc'}</span></summary>"; show_menu_items_list($item->{'members'}, $indent+1); print "</details>\n"; } elsif ($item->{'type'} eq 'html') { # Some HTML block print "<div class='leftlink'>",$item->{'html'},"</div>\n"; } elsif ($item->{'type'} eq 'text') { # A line of text print "<div class='leftlink'>", html_escape($item->{'desc'}),"</div>\n"; } elsif ($item->{'type'} eq 'hr') { # Separator line print "<hr>\n"; } elsif ($item->{'type'} eq 'menu' || $item->{'type'} eq 'input') { # For with an input of some kind if ($item->{'cgi'}) { my $cgi = add_webprefix($item->{'cgi'}); print "<form action='$cgi' target=right>\n"; } else { print "<form>\n"; } foreach my $h (@{$item->{'hidden'}}) { print ui_hidden(@$h); } print ui_hidden("mode", $mode); print "<div class='leftlink'>"; print $item->{'desc'},"\n"; if ($item->{'type'} eq 'menu') { my $sel = ""; if ($item->{'onchange'}) { $sel = "window.parent.frames[1].location = ". "\"$item->{'onchange'}\" + this.value"; } print ui_select($item->{'name'}, $item->{'value'}, $item->{'menu'}, 1, 0, 0, 0, "onChange='form.submit(); $sel' ". "style='width:$selwidth'"); } elsif ($item->{'type'} eq 'input') { print ui_textbox($item->{'name'}, $item->{'value'}, $item->{'size'}, undef, undef, $item->{'tags'}); } if ($item->{'icon'}) { my $icon = add_webprefix($item->{'icon'}); print "<input type=image src='$icon' ". "border=0 class=goArrow>\n"; } print "</div>"; print "</form>\n"; } elsif ($item->{'type'} eq 'title') { # Nothing to print here, as it is used for the tab title } } } # module_to_menu_item(&module) # Converts a module to the hash ref format expected by show_menu_items_list sub module_to_menu_item { my ($minfo) = @_; return { 'type' => 'item', 'id' => $minfo->{'dir'}, 'desc' => $minfo->{'desc'}, 'link' => '/'.$minfo->{'dir'}.'/' }; } # add_webprefix(link) # If a URL starts with a / , add webprefix sub add_webprefix { my ($link) = @_; return $link =~ /^\// ? &get_webprefix().$link : $link; }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
acl | Folder | 0755 |
|
|
adsl-client | Folder | 0755 |
|
|
apache | Folder | 0755 |
|
|
at | Folder | 0755 |
|
|
backup-config | Folder | 0755 |
|
|
bandwidth | Folder | 0755 |
|
|
bind8 | Folder | 0755 |
|
|
bsdfdisk | Folder | 0755 |
|
|
burner | Folder | 0755 |
|
|
cfengine | Folder | 0755 |
|
|
change-user | Folder | 0755 |
|
|
cluster-copy | Folder | 0755 |
|
|
cluster-cron | Folder | 0755 |
|
|
cluster-passwd | Folder | 0755 |
|
|
cluster-shell | Folder | 0755 |
|
|
cluster-software | Folder | 0755 |
|
|
cluster-useradmin | Folder | 0755 |
|
|
cluster-webmin | Folder | 0755 |
|
|
cpan | Folder | 0755 |
|
|
cron | Folder | 0755 |
|
|
custom | Folder | 0755 |
|
|
dhcpd | Folder | 0755 |
|
|
dhcpd-2.0 | Folder | 0755 |
|
|
dnsadmin | Folder | 0755 |
|
|
dovecot | Folder | 0755 |
|
|
download | Folder | 0755 |
|
|
escputil | Folder | 0755 |
|
|
exports | Folder | 0755 |
|
|
fdisk | Folder | 0755 |
|
|
fetchmail | Folder | 0755 |
|
|
file | Folder | 0755 |
|
|
firewall | Folder | 0755 |
|
|
frox | Folder | 0755 |
|
|
fsdump | Folder | 0755 |
|
|
generate-acls | Folder | 0755 |
|
|
gnupg | Folder | 0755 |
|
|
grub | Folder | 0755 |
|
|
heartbeat | Folder | 0755 |
|
|
help | Folder | 0755 |
|
|
htaccess-htpasswd | Folder | 0755 |
|
|
htpasswd-file | Folder | 0755 |
|
|
idmapd | Folder | 0755 |
|
|
images | Folder | 0755 |
|
|
inetd | Folder | 0755 |
|
|
init | Folder | 0755 |
|
|
inittab | Folder | 0755 |
|
|
ipchains | Folder | 0755 |
|
|
ipsec | Folder | 0755 |
|
|
iptables | Folder | 0755 |
|
|
iscsi-client | Folder | 0755 |
|
|
iscsi-server | Folder | 0755 |
|
|
iscsi-target | Folder | 0755 |
|
|
jabber | Folder | 0755 |
|
|
jsample | Folder | 0755 |
|
|
krb5 | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
ldap-useradmin | Folder | 0755 |
|
|
lilo | Folder | 0755 |
|
|
logrotate | Folder | 0755 |
|
|
lpadmin | Folder | 0755 |
|
|
lvm | Folder | 0755 |
|
|
lvs | Folder | 0755 |
|
|
mailbox | Folder | 0755 |
|
|
mailboxes | Folder | 0755 |
|
|
majordomo | Folder | 0755 |
|
|
man | Folder | 0755 |
|
|
mon | Folder | 0755 |
|
|
mount | Folder | 0755 |
|
|
mysql | Folder | 0755 |
|
|
net | Folder | 0755 |
|
|
nettools | Folder | 0755 |
|
|
nis | Folder | 0755 |
|
|
openslp | Folder | 0755 |
|
|
pam | Folder | 0755 |
|
|
pap | Folder | 0755 |
|
|
passwd | Folder | 0755 |
|
|
phpini | Folder | 0755 |
|
|
postfix | Folder | 0755 |
|
|
postgresql | Folder | 0755 |
|
|
ppp-client | Folder | 0755 |
|
|
pptp-client | Folder | 0755 |
|
|
pptp-server | Folder | 0755 |
|
|
proc | Folder | 0755 |
|
|
procmail | Folder | 0755 |
|
|
procyonguide | Folder | 0755 |
|
|
proftpd | Folder | 0755 |
|
|
pserver | Folder | 0755 |
|
|
qmailadmin | Folder | 0755 |
|
|
quota | Folder | 0755 |
|
|
raid | Folder | 0755 |
|
|
samba | Folder | 0755 |
|
|
sarg | Folder | 0755 |
|
|
sargreports | Folder | 0755 |
|
|
sendmail | Folder | 0755 |
|
|
sentry | Folder | 0755 |
|
|
servers | Folder | 0755 |
|
|
shell | Folder | 0755 |
|
|
shorewall | Folder | 0755 |
|
|
simple-firewall | Folder | 0755 |
|
|
smart-status | Folder | 0755 |
|
|
software | Folder | 0755 |
|
|
spam | Folder | 0755 |
|
|
squid | Folder | 0755 |
|
|
squidguard | Folder | 0755 |
|
|
squidinfo | Folder | 0755 |
|
|
squidreports | Folder | 0755 |
|
|
squidstat | Folder | 0755 |
|
|
ssh | Folder | 0755 |
|
|
sshd | Folder | 0755 |
|
|
status | Folder | 0755 |
|
|
stunnel | Folder | 0755 |
|
|
swell-wizard | Folder | 0755 |
|
|
sysgraph | Folder | 0755 |
|
|
sysinfo | Folder | 0755 |
|
|
syslog | Folder | 0755 |
|
|
sysstats | Folder | 0755 |
|
|
telnet | Folder | 0755 |
|
|
template | Folder | 0755 |
|
|
time | Folder | 0755 |
|
|
tsunamiguide | Folder | 0755 |
|
|
tunnel | Folder | 0755 |
|
|
unauthenticated | Folder | 0755 |
|
|
updown | Folder | 0755 |
|
|
useradmin | Folder | 0755 |
|
|
usermin | Folder | 0755 |
|
|
vgetty | Folder | 0755 |
|
|
webalizer | Folder | 0755 |
|
|
webfetch | Folder | 0755 |
|
|
webmin | Folder | 0755 |
|
|
webmin-iptables | Folder | 0755 |
|
|
webminguide | Folder | 0755 |
|
|
webminlog | Folder | 0755 |
|
|
wpad-wizard | Folder | 0755 |
|
|
wuftpd | Folder | 0755 |
|
|
xinetd | Folder | 0755 |
|
|
zones | Folder | 0755 |
|
|
config | File | 337 B | 0644 |
|
config.cgi | File | 3.48 KB | 0755 |
|
config_save.cgi | File | 1.46 KB | 0755 |
|
edit_overlay.cgi | File | 783 B | 0755 |
|
edit_right.cgi | File | 3.77 KB | 0755 |
|
favicon.ico | File | 1.12 KB | 0644 |
|
gray-theme-lib.pl | File | 4.63 KB | 0755 |
|
index.cgi | File | 4.19 KB | 0755 |
|
left.cgi | File | 10.06 KB | 0755 |
|
pngfix.html | File | 95 B | 0644 |
|
pngfix.js | File | 1.21 KB | 0644 |
|
recollect.cgi | File | 277 B | 0755 |
|
right.cgi | File | 54.67 KB | 0755 |
|
save_overlay.cgi | File | 902 B | 0755 |
|
save_right.cgi | File | 1.55 KB | 0755 |
|
theme.info | File | 151 B | 0644 |
|
theme.pl | File | 34.32 KB | 0755 |
|
top.cgi | File | 346 B | 0755 |
|
uconfig.cgi | File | 2.98 KB | 0755 |
|
uconfig_save.cgi | File | 1.39 KB | 0755 |
|