[! use strict; use Proxmox::Form; use Proxmox::Utils; use Proxmox::Config::System; use Proxmox::ConfigServer; use Proxmox::License; use Proxmox::HTMLTable; use Proxmox::HTMLDropDown; !] [- my $system_cfg = $fdat{__system_config}; my $lic = $system_cfg->{license}; my $out = ""; if ($lic->demo_msg ()) { my $msg = $lic->demo_msg (); $out = "

" . __('Unsupported feature!') . "


"; $out .= "

$msg

"; print OUT $out; return; } $fdat{host} = Proxmox::Utils::trim ($fdat{host}) if $fdat{host}; my $frm = Proxmox::Form->new (\%fdat); my $conn = Proxmox::ConfigClient::connect (); my $tmap = $conn->get_transport_map ()->result || []; if ($frm->submit) { if ($udat{AM} eq 'w') { my $err; my $dtext = $fdat{domains}; $dtext =~ s/[,;]/ /g; $dtext =~ s/\s+/,/g; my @domains = (); my $de = {}; foreach my $d (split ( /,/, $dtext)) { if ($d =~ m/[\[\]\(\);:]/) { $err = sprintf (__("domain '%s' contains illegal character"), $d); last; } push @domains, $d if $d && !$de->{$d}; $de->{$d} = 1; } my $host = $fdat{host}; my $port = Proxmox::Utils::trim ($fdat{port}); if (my $tmperr = Proxmox::Utils::validate_dnsname_or_ip (__("Host/IP"), $host, 1)) { $err = $tmperr; } $err = __("invalid port number specified") if !$err && $port !~ m/^\d{0,5}$/; $err = __("no domains specified") if !$err && !scalar(@domains); my $key = "$host:$port"; my ($t) = grep { $_->{transport} eq $key } @$tmap; if (!$err && $fdat{aa} && $fdat{aa} ne $key && $t) { $err = sprintf (__("transport '%s' already exists"), $key); } if (!$err && !$fdat{aa} && $t) { $err = sprintf (__("transport '%s' already exists"), $key); } if (!$err) { my $dd = join (' ', grep { my $d = $_; grep { $_->{transport} ne $fdat{aa} && grep { $d eq $_ } @{$_->{domains}}; } @$tmap; } @domains); $err = "duplicate domains '$dd'" if $dd; } if (!$err) { @$tmap = grep { $_->{transport} ne $fdat{aa} } @$tmap; push @$tmap, { domains => \@domains, nomx => $fdat{nomx}, host => $host, port => $port, transport => $key, }; $conn->set_transport_map ($tmap); $conn->rewrite_config_postfix (); $conn->service_cmd ('postfix', 'reload'); } else { $fdat{edit} = $fdat{mode}; $udat{popup_error} = $err; } } else { $udat{popup_error} = Proxmox::Utils::msg ('nowr'); } } else { if ($udat{action} eq 'delitem') { if ($udat{AM} eq 'w') { @$tmap = grep { $_->{transport} ne $fdat{aa} } @$tmap; $conn->set_transport_map ($tmap); $conn->rewrite_config_postfix (); $conn->service_cmd ('postfix', 'reload'); } else { $udat{popup_error} = Proxmox::Utils::msg ('nowr'); } } } if ($fdat{edit} == 1 || ($fdat{edit} == 2 && $udat{AM} eq 'w')) { my ($host, $port, $nomx, $domains); if ($fdat{aa}) { $frm->add_element("section1", "hsection", undef, __("Edit SMTP Transport")); my ($t) = grep { $_->{transport} eq $fdat{aa} } @$tmap; if ($t) { $host = $t->{host}; $port = $t->{port}; $nomx = $t->{nomx}; $domains = join ("\n", sort @{$t->{domains}}); } } else { $frm->add_element("section1", "hsection", undef, __("Add SMTP Transport")); } $frm->add_element('host', "text", $host, __("Host/IP")); $frm->add_element('nomx', "bool", $nomx, __("Disable MX lookup")); $frm->add_element('port', "port", $port || '25', __("SMTP Port")); $frm->add_element('domains', "largetextarea", $domains, __("Domains")); $frm->add_element("m3", "hidden"); $frm->add_element("aa", "hidden", $fdat{aa}); $frm->add_element("mode", "hidden", $fdat{edit}); $out .= $frm->out_form; } else { if ($fdat{edit}) { $udat{popup_error} = Proxmox::Utils::msg ('nowr'); } my @header = ('1', '20px', ' ', '1', '10px', ' ', '1', '150px', __('Host/IP'), '1', '100px', 'MX', '1', '100px', 'Port', '1', '350px', __('Domains')); my @cellwidth = ('20px', '10px', '150px', '100px','100px', '350px'); my $table = Proxmox::HTMLTable->new (\@cellwidth); $table->add_headline (\@header); my $ddown = Proxmox::HTMLDropDown->new (); $ddown->add_item ("menu", "?edit=2", __("Add SMTP Transport")); $ddown->add_item ("item", "?edit=1", __("Edit")); $ddown->add_item ('item', "?action=delitem", __('Delete')); foreach my $t (sort { $a->{transport} cmp $b->{transport} } @$tmap) { my $dl = join ",", @{$t->{domains}}; my $menu = $ddown->out_symbol ('item', '', "&aa=$t->{transport}"); $table->set_row_link ("?edit=1&aa=$t->{transport}"); my $usemx = $t->{nomx} ? "no" : "yes"; $usemx = "-" if $t->{host} =~ m/^\d+\.\d+\.\d+\.\d+$/; $table->add_row ('' ,$menu, '', $t->{host}, $usemx, $t->{port}, join ('
', sort @{$t->{domains}})); } $out .= $ddown->out_dropdown_menu("menu"); $out .= "

" . $ddown->out_symbol("menu", "iarrdown") . " " . __("SMTP Transports") . "


"; $out .= $ddown->out_dropdown_menu ("item"); $out .= $table->out_table (); } print OUT $out; -]