use lib ("lib"); use WebminUI::All; use Socket; # get_zone_form(&in, &zinfo) # Returns a form for editing a zone sub get_zone_form { local ($in, $zinfo) = @_; local $form = new WebminUI::Form("save_zone.cgi"); $form->set_input($in); $form->add_hidden("zone", $zinfo->{'name'}); local $section = new WebminUI::Section($text{'edit_common'}, 4, undef, "100%"); $form->add_section($section); $section->add_row($text{'edit_name'}, "$in{'zone'}"); $section->add_row($text{'edit_status'}, &nice_status($zinfo->{'status'})); $section->add_row($text{'edit_zonepath'}, "$zinfo->{'zonepath'}"); local $auto = new WebminUI::Select("autoboot", $zinfo->{'autoboot'}, [ [ "true", $text{'yes'} ], [ "false", $text{'no'} ] ]); $section->add_input($text{'edit_autoboot'}, $auto); local $pool = &pool_object("pool", $zinfo->{'pool'}); $section->add_input($text{'edit_pool'}, $pool); $section->add_row($text{'edit_brand'}, "$zinfo->{'brand'}"); local @actions = &zone_status_actions($zinfo, 1); $form->add_button(new WebminUI::Submit($text{'save'}, "save")); $form->add_button_spacer(); foreach my $a (@actions) { $form->add_button(new WebminUI::Submit($a->[1], $a->[0])); } $form->add_button_spacer() if (@actions); $form->add_button(new WebminUI::Submit($text{'edit_delete'}, "delete")); return $form; } sub pool_object { local ($name, $value) = @_; local $rv = new WebminUI::OptTextbox($name, $value, 10, $text{'pool_none'}); $rv->set_validation_regexp('^\S+$', $text{'save_epool'}); return $rv; } # get_confirm_page(&in, type, &zinfo, from-list) sub get_confirm_page { local ($in, $action, $zinfo, $list) = @_; local $p = new WebminUI::ConfirmPage(&zone_title($zinfo->{'name'}), $text{$action.'_title'}, &text($action.'_rusure', "$zinfo->{'name'}"), "save_zone.cgi", $in, $text{'edit_'.$action}, $text{'ui_cancel'}); if ($list) { $p->add_footer("index.cgi", $text{'index_return'}); } else { $p->add_footer("edit_zone.cgi?zone=$zinfo->{'name'}", $text{'edit_return'}); } return $p; } # get_execute_page(action, &zinfo, from-list, action-args) sub get_execute_page { local ($action, $zinfo, $list, $args) = @_; local $p = new WebminUI::Page(&zone_title($zinfo->{'name'}), $text{$action.'_title'}); local $d = new WebminUI::DynamicWait(\&execute_action, [ $action, $zinfo, $args ]); $p->add_form($d); $d->set_message($text{$action.'_doing'}); $d->set_wait(1); if ($list || $action eq "delete") { $p->add_footer("index.cgi", $text{'index_return'}); } else { $p->add_footer("edit_zone.cgi?zone=$zinfo->{'name'}", $text{'edit_return'}); } return $p; } sub execute_action { my ($d, $action, $zinfo, $args) = @_; sleep(1); local ($out, $ex); if ($action eq "delete") { # Halt and un-install before deleting if ($zinfo->{'status'} ne 'configured') { if ($zinfo->{'status'} ne 'installed' && $zinfo->{'status'} ne 'incomplete') { ($out, $ex) = &run_zone_command($zinfo, "halt"); } if (!$ex) { ($out, $ex) = &run_zone_command($zinfo, "uninstall -F"); } } if (!$ex) { &delete_zone($zinfo); } } else { # Just run zoneadm to execute action ($out, $ex) = &run_zone_command($zinfo, $action.($args ? " $args" : ""), 1); } $d->stop(); if ($ex) { $p->add_error($text{'reboot_failed'}, $out); } else { $p->add_message($text{'reboot_ok'}); if ($action eq "delete") { unlink(&zone_sysidcfg_file($zinfo->{'name'})); } &webmin_log($action, "zone", $zinfo->{'name'}); } } # get_net_form(&in, &zinfo, &net) sub get_net_form { local ($in, $zinfo, $net) = @_; local ($new, $active, $address, $netmask); local $form = new WebminUI::Form("save_net.cgi", "post"); $form->add_hidden("zone", $zinfo->{'name'}); if ($net->{'address'}) { $active = &get_active_interface($net); ($address, $netmask) = &get_address_netmask($net, undef); $form->add_hidden("old", $net->{'address'}); } else { $net = { 'physical' => &get_default_physical() }; $new = 1; $form->add_hidden("new", 1); } $form->set_input($in); local $section = new WebminUI::Section($text{'net_header'}, 2); $form->add_section($section); local $ainput = new WebminUI::Textbox("address", $address, 20); $ainput->set_mandatory(1); $ainput->set_validation_func(\&validate_address); $section->add_input($text{'net_address'}, $ainput); local $pinput = &physical_object("physical", $net->{'physical'}); $section->add_input($text{'net_physical'}, $pinput); local $ninput = new WebminUI::OptTextbox("netmask", $netmask, 20, $text{'default'}); $ninput->set_validation_func(\&validate_netmask); $section->add_input($text{'net_netmask'}, $ninput); if ($active) { $section->add_row($text{'net_broadcast'}, "$active->{'broadcast'}"); } if ($new) { $form->add_button(new WebminUI::Submit($text{'create'}, "create")); } else { $form->add_button(new WebminUI::Submit($text{'save'}, "save")); $form->add_button(new WebminUI::Submit($text{'delete'}, "delete")); } return $form; } # physical_object(name, value) # Returns an input for selecting a real interface sub physical_object { local ($name, $value) = @_; return new WebminUI::Select($name, $value, [ map { [ $_->{'name'} ] } grep { $_->{'virtual'} eq '' } &net::active_interfaces() ], 0, $value ? 1 : 0); } sub validate_address { return &check_ipaddress($_[0]) ? undef : $text{'net_eaddress'}; } sub validate_netmask { return &check_ipaddress($_[0]) ? undef : $text{'net_enetmask'}; } # get_pkg_form(&in, &zinfo, &pkg) sub get_pkg_form { local ($in, $zinfo, $pkg) = @_; local ($new); local $form = new WebminUI::Form("save_pkg.cgi", "post"); $form->set_input($in); $form->add_hidden("zone", $zinfo->{'name'}); if ($pkg->{'dir'}) { $form->add_hidden("old", $pkg->{'dir'}); } else { $new = 1; $form->add_hidden("new", 1); } local $section = new WebminUI::Section($text{'pkg_header'}, 2); $form->add_section($section); local $dinput = new WebminUI::File("dir", $pkg->{'dir'}, 50, 1); $dinput->set_mandatory(1); $dinput->set_validation_func(\&validate_dir); $section->add_input($text{'pkg_dir'}, $dinput); if ($new) { $form->add_button(new WebminUI::Submit($text{'create'}, "create")); } else { $form->add_button(new WebminUI::Submit($text{'save'}, "save")); $form->add_button(new WebminUI::Submit($text{'delete'}, "delete")); } return $form; } sub validate_dir { return -d $_[0] ? undef : $text{'pkg_edir'}; } # get_attr_form(&in, &zinfo, &attr) sub get_attr_form { local ($in, $zinfo, $pkg) = @_; local ($new); local $form = new WebminUI::Form("save_attr.cgi", "post"); $form->set_input($in); $form->add_hidden("zone", $zinfo->{'name'}); if ($attr->{'name'}) { $form->add_hidden("old", $attr->{'name'}); } else { $new = 1; $form->add_hidden("new", 1); } local $section = new WebminUI::Section($text{'attr_header'}, 2); $form->add_section($section); local $ninput = new WebminUI::Textbox("name", $attr->{'name'}, 30); $ninput->set_mandatory(1); $ninput->set_validation_regexp('^\S+$', $text{'attr_ename'}); $section->add_input($text{'attr_name'}, $ninput); local $tinput = new WebminUI::Select("type", $attr->{'type'} || "string", [ map { [ $_, $text{'attr_'.$_} ] } &list_attr_types() ], 0, 1); $section->add_input($text{'attr_type'}, $tinput); local $vinput = new WebminUI::Textbox("value", $attr->{'value'}, 30); $vinput->set_validation_func(\&validate_value); $vinput->set_mandatory(1); $section->add_input($text{'attr_value'}, $vinput); if ($new) { $form->add_button(new WebminUI::Submit($text{'create'}, "create")); } else { $form->add_button(new WebminUI::Submit($text{'save'}, "save")); $form->add_button(new WebminUI::Submit($text{'delete'}, "delete")); } return $form; } sub validate_value { local ($value, $name, $form) = @_; if ($form->get_value("type") eq 'int') { $value =~ /^\-?\d+$/ || return $text{'attr_eint'}; } elsif ($form->get_value("type") eq 'uint') { $value =~ /^\d+$/ || return $text{'attr_euint'}; } elsif ($form->get_value("type") eq 'boolean') { $value eq "true" || $value eq "false" || return $text{'attr_uboolean'}; } return undef; } # get_fs_form(in, &zinfo, &fs, type) sub get_fs_form { local ($in, $zinfo, $fs, $type) = @_; local ($new, $mount); local $form = new WebminUI::Form("save_fs.cgi", "post"); $form->set_input($in); $form->add_hidden("zone", $zinfo->{'name'}); if ($fs->{'dir'}) { $form->add_hidden("old", $fs->{'dir'}); $mount = &get_active_mount($zinfo, $fs); } else { $new = 1; $form->add_hidden("new", 1); $form->add_hidden("type", $type); } local $section = new WebminUI::Section($text{'fs_header'}, 2); $form->add_section($section); $section->add_row($text{'fs_type'}, &mount::fstype_name($type)." (".uc($type).")"); if (!$new) { if ($mount) { ($total, $free) = &mount::disk_space($mount->[2], $mount->[0]); $section->add_row($text{'fs_status'}, $total ? &text('fs_mountedsp', &nice_size($total*1024), &nice_size($free*1024)) : $text{'fs_mounted'}); } else { $section->add_row($text{'fs_status'}, $text{'fs_unmounted'}); } } else { $section->add_row($text{'fs_mount'}, &ui_yesno_radio("mount", $zinfo->{'status'} eq 'running' ? 1 : 0)); } local $dinput = new WebminUI::File("dir", $fs->{'dir'}, 50); $dinput->set_mandatory(1); $dinput->set_validation_func(\&validate_fsdir); $section->add_input($text{'fs_dir'}, $dinput); $main::ui_table_cols = 2; if (&indexof($type, &mount::list_fstypes()) >= 0) { # A supported filesystem, which means we can show nice options local $shtml = "