initial commit of file from CVS for e-smith-domains on Thu 26 Oct 11:21:08 BST 2023

This commit is contained in:
2023-10-26 11:21:08 +01:00
parent 2b48ca96f2
commit d997dac820
16 changed files with 1687 additions and 2 deletions

View File

@@ -0,0 +1,24 @@
{
# vim: ft=perl ts=4 sw=4 et:
foreach my $domain ( $DB->get_all )
{
my $lc_key = lc( $domain->key );
next if ( $lc_key eq $domain->key );
my $rec = $DB->get($lc_key);
if ($rec)
{
warn "DomainsDB: "
. $domain->key
. " NOT migrated as $lc_key exists\n";
next;
}
$rec = $DB->new_record($lc_key);
$rec->merge_props( $domain->props );
$domain->delete;
}
}

View File

@@ -0,0 +1,30 @@
{
# vim: ft=perl ts=4 sw=4 et:
use esmith::ConfigDB;
my $db = esmith::ConfigDB->open_ro;
for my $domain ( $DB->get_all )
{
my %props = $domain->props;
if (exists $props{Nameserver})
{
$props{Nameservers} ||= $props{Nameserver};
$domain->delete_prop("Nameserver");
}
if (($props{Nameservers} || '') eq 'corporate')
{
$props{Nameservers} = ''
unless ($db->get_prop('dnscache', 'Forwarder'));
}
$props{Nameservers} ||= (($props{SystemPrimaryDomain}||'no') eq 'yes') ?
'localhost' : 'internet';
$domain->merge_props(%props);
}
}

View File

@@ -0,0 +1,240 @@
<!-- vim: ft=xml ts=4 sw=4 et:
-->
<lexicon lang="en-us" params="getExtraParams()">
<entry>
<base>FORM_TITLE</base>
<trans>
Manage domains
</trans>
</entry>
<entry>
<base>FORM_DESCRIPTION</base>
<trans>
<![CDATA[
<p>When you create a domain, your server will be able to
receive e-mail for that domain and will also be able to host a
web site for that domain.</p>
<p><a class="button-like"
href="domains?page=0&page_stack=&Next=Next&wherenext=DOMAINS_PAGE_CREATE">Add domain</a>
]]>
</trans>
</entry>
<entry>
<base>NO_VIRTUAL_DOMAINS</base>
<trans>
There are no domains in the system.
</trans>
</entry>
<entry>
<base>CURRENT_LIST_OF_DOMAINS</base>
<trans>
Current list of domains
</trans>
</entry>
<entry>
<base>PRIMARY_SITE</base>
<trans>
primary site
</trans>
</entry>
<entry>
<base>CONTENT</base>
<trans>
{$content} i-bay
</trans>
</entry>
<entry>
<base>CREATE_TITLE</base>
<trans>
Create a new domain
</trans>
</entry>
<entry>
<base>CONTENT_FIELD_DESCRIPTION</base>
<trans>
For the web site, you may choose your primary web site or any
i-bay as the content.
</trans>
</entry>
<entry>
<base>DOMAIN_NAME_VALIDATION_ERROR</base>
<trans>
Error: unexpected or missing characters in domain name
{$domainName}. The domain name should contain one or more
letters, numbers, periods and minus signs. Did not create new
domain.
</trans>
</entry>
<entry>
<base>DOMAIN_DESCRIPTION_VALIDATION_ERROR</base>
<trans>
Error: unexpected or missing characters in domain description
{$domainDesc}. Did not create new domain.
</trans>
</entry>
<entry>
<base>DOMAIN_IN_USE_ERROR</base>
<trans>
Error: domain {$domainName} is already in use. Did not create
new domain.
</trans>
</entry>
<entry>
<base>SYSTEM_DOMAIN_ERROR</base>
<trans>
Error: domain {$domainName} is your system domain name. You
cannot have a domain with the same name. Did not create
new domain.
</trans>
</entry>
<entry>
<base>SUCCESSFULLY_CREATED</base>
<trans>
Successfully created domain {$domainName}. Your web
server is now being restarted. The links on this page will be
inactive until the web server restart is complete.
</trans>
</entry>
<entry>
<base>MODIFY_TITLE</base>
<trans>
Modify domain
</trans>
</entry>
<entry>
<base>NONEXISTENT_DOMAIN_ERROR</base>
<trans>
Error: {$domainName} is not an existing domain.
</trans>
</entry>
<entry>
<base>SUCCESSFULLY_MODIFIED</base>
<trans>
Successfully modified domain {$domainName}. Your web
server is now being restarted. The links on this page will be
inactive until the web server restart is complete.
</trans>
</entry>
<entry>
<base>REMOVE_TITLE</base>
<trans>
Remove domain
</trans>
</entry>
<entry>
<base>REMOVE_DESCRIPTION</base>
<trans>
<![CDATA[
<p>
You are about to remove the domain {$domain}
({$domainDesc}).
</p>
<p>
<b>Are you sure you wish to remove this domain?</b>
</p>
]]>
</trans>
</entry>
<entry>
<base>ERROR_WHILE_REMOVING_DOMAIN</base>
<trans>
Error: internal failure while removing domain
{$domain}.
</trans>
</entry>
<entry>
<base>SUCCESSFULLY_DELETED</base>
<trans>
Successfully deleted domain {$domain}. Your web server
is now being restarted. The links on this page will be inactive
until the web server restart is complete.
</trans>
</entry>
<entry>
<base>DESC_CORPORATE_DNS_CURRENT</base>
<trans> <![CDATA[
<hr class="sectionbar" /><h2>Corporate DNS Settings</h2>
]]>
</trans>
</entry>
<entry>
<base>BUTTON_CORPORATE_DNS</base>
<trans> <![CDATA[
<p>If this server does not have access to the Internet, or you have special
requirements for DNS resolution, enter the DNS server IP address here.
You should not enter the address of your ISP's DNS servers here, as the server
is capable of resolving all Internet DNS names without this additional
configuration.</p>
<p> <a class="button-like"
href="domains?page=0&page_stack=&Next=Next&wherenext=DOMAINS_PAGE_CORPORATE_DNS">Modify corporate DNS settings</a>
]]>
</trans>
</entry>
<entry>
<base>DESC_CORPORATE_DNS</base>
<trans>
If this server does not have access to the Internet, or
you have special requirements for DNS resolution,
enter the DNS server IP addresses here.
These fields should be left blank unless
you have a specific reason to configure other DNS servers.
You should not enter the address of your ISP's DNS servers
here, as the server is capable of resolving all
Internet DNS names without this additional configuration.
</trans>
</entry>
<entry>
<base>LABEL_CORPORATE_DNS_PRIMARY</base>
<trans>Primary corporate DNS server</trans>
</entry>
<entry>
<base>LABEL_CORPORATE_DNS_SECONDARY</base>
<trans>Secondary corporate DNS server</trans>
</entry>
<entry>
<base>DESC_NAMESERVERS</base>
<trans>
You can select whether this domain is resolved locally,
passed to the corporate DNS servers, or resolved by
the Internet DNS servers. The default will be correct
for most networks.
</trans>
</entry>
<entry>
<base>LABEL_NAMESERVERS</base>
<trans>Domain DNS servers</trans>
</entry>
<entry>
<base>localhost</base>
<trans>Resolve locally</trans>
</entry>
<entry>
<base>internet</base>
<trans>Internet DNS servers</trans>
</entry>
<entry>
<base>corporate</base>
<trans>Corporate DNS servers</trans>
</entry>
<entry>
<base>REMOVE_DESC</base>
<trans>You are about to remove the domain </trans>
</entry>
<entry>
<base>REMOVE_DESC2</base>
<trans> Are you sure you wish to remove this Domain ? </trans>
</entry>
</lexicon>

View File

View File

@@ -0,0 +1,186 @@
#!/usr/bin/perl -wT
# vim: ts=4 sw=4 et:
#----------------------------------------------------------------------
# heading : Configuration
# description : DOMAINS
# navigation : 6000 6600
#----------------------------------------------------------------------
#----------------------------------------------------------------------
# copyright (C) 1999-2005 Mitel Networks Corporation
# Copyright 2005 Gordon Rowell <gordonr@gormand.com.au>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#----------------------------------------------------------------------
use strict;
use esmith::TestUtils;
use esmith::FormMagick::Panel::domains;
my $fm = esmith::FormMagick::Panel::domains->new();
$fm->display();
=pod
=head1 NAME
domains -- create/modify/delete domains
=head2 DESCRIPTION
This screen allows the administrator to create, modify or delete
domains.
=begin testing
=end testing
=cut
__DATA__
<form title="FORM_TITLE"
header="/etc/e-smith/web/common/head.tmpl"
footer="/etc/e-smith/web/common/foot.tmpl">
<page name="First" pre-event="print_status_message()">
<description>FORM_DESCRIPTION</description>
<subroutine src="print_domains_table()" />
<field type="literal" >
<description>DESC_CORPORATE_DNS_CURRENT</description>
</field>
<field type="literal" id="Forwarder"
value="get_prop('dnscache', 'Forwarder')"
display="get_prop('dnscache', 'Forwarder')" >
<label>LABEL_CORPORATE_DNS_PRIMARY</label>
</field>
<field type="literal" id="Forwarder2"
value="get_prop('dnscache', 'Forwarder2')"
display="get_prop('dnscache', 'Forwarder2')" >
<label>LABEL_CORPORATE_DNS_SECONDARY</label>
</field>
<field type="literal" value="" id="button_corporate_dns" >
<description>BUTTON_CORPORATE_DNS</description>
</field>
</page>
<page name="DOMAINS_PAGE_CREATE"
pre-event="turn_off_buttons()"
post-event="create_modify_domain('create')" >
<description>CREATE_TITLE</description>
<field type="text" id="Domain" validation="validate_Domain">
<label>DOMAIN_NAME</label>
</field>
<field type="text" id="Description" validation="nonblank">
<label>DESCRIPTION_BRIEF</label>
</field>
<field type="select" id="Content"
options="get_content_options()"
value="get_content_value()">
<label>CONTENT</label>
<description>CONTENT_FIELD_DESCRIPTION</description>
</field>
<field type="select" id="Nameservers"
options="get_nameserver_options()"
value="get_nameserver_value()">
<label>LABEL_NAMESERVERS</label>
<description>DESC_NAMESERVERS</description>
</field>
<subroutine src="print_button('ADD')" />
</page>
<page name="DOMAINS_PAGE_MODIFY"
pre-event="turn_off_buttons()"
post-event="create_modify_domain('modify')" >
<description>MODIFY_TITLE</description>
<field type="literal" id="Domain" >
<label>DOMAIN_NAME</label>
</field>
<field type="text" id="Description"
value="get_description_value()"
validation="nonblank">
<label>DESCRIPTION_BRIEF</label>
</field>
<field type="select" id="Content"
options="get_content_options()"
value="get_content_value()">
<label>CONTENT</label>
<description>CONTENT_FIELD_DESCRIPTION</description>
</field>
<field type="select" id="Nameservers"
options="get_nameserver_options()"
value="get_nameserver_value()" >
<label>LABEL_NAMESERVERS</label>
<description>DESC_NAMESERVERS</description>
</field>
<subroutine src="print_button('MODIFY')" />
</page>
<page name="DOMAINS_PAGE_REMOVE"
pre-event="turn_off_buttons()"
post-event="delete_domain()" >
<description>REMOVE_TITLE</description>
<subroutine src="print_page_description('remove')" />
<subroutine src="print_button('REMOVE')" />
</page>
<page name="DOMAINS_PAGE_CORPORATE_DNS"
pre-event="turn_off_buttons()"
post-event="modify_dns" >
<field type="text" id="Forwarder" size="15"
value="get_prop('dnscache', 'Forwarder')"
validation="ip_number_or_blank">
<label>LABEL_CORPORATE_DNS_PRIMARY</label>
<description>DESC_CORPORATE_DNS</description>
</field>
<field type="text" id="Forwarder2" size="15"
value="get_prop('dnscache', 'Forwarder2')"
validation="ip_number_or_blank">
<label>LABEL_CORPORATE_DNS_SECONDARY</label>
</field>
<subroutine src="print_button('SAVE')" />
</page>
</form>

View File

View File

View File

View File

@@ -0,0 +1,484 @@
#!/usr/bin/perl -w
#----------------------------------------------------------------------
# $Id: domains.pm,v 1.1 2005/08/25 17:51:33 charlieb Exp $
#----------------------------------------------------------------------
# copyright (C) 1999-2005 Mitel Networks Corporation
# Copyright 2005 Gordon Rowell <gordonr@gormand.com.au>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#----------------------------------------------------------------------
package esmith::FormMagick::Panel::domains;
use strict;
use esmith::FormMagick;
use esmith::AccountsDB;
use esmith::DomainsDB;
use esmith::ConfigDB;
use Exporter;
use Carp qw(verbose);
use HTML::Tabulate;
our @ISA = qw(esmith::FormMagick Exporter);
our @EXPORT = qw( getExtraParams );
our $VERSION = sprintf '%d.%03d', q$Revision: 1.1 $ =~ /: (\d+).(\d+)/;
our $db = esmith::ConfigDB->open();
our $ddb = esmith::DomainsDB->open();
our $adb = esmith::AccountsDB->open_ro();
our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+);
=pod
=head1 NAME
esmith::FormMagick::Panels::domains - Domains panel functions
=head1 SYNOPSIS
use esmith::FormMagick::Panels::domains;
my $panel = esmith::FormMagick::Panel::domains->new();
$panel->display();
=head1 DESCRIPTION
=head2 new();
Exactly as for esmith::FormMagick
=begin testing
$ENV{ESMITH_DOMAINS_DB} = "10e-smith-base/domains.conf";
$ENV{ESMITH_CONFIG_DB} = "10e-smith-base/configuration.conf";
open DATA, "echo '<form></form>'|";
use_ok('esmith::FormMagick::Panel::domains');
use vars qw($panel);
ok($panel = esmith::FormMagick::Panel::domains->new(),
"Create panel object");
close DATA;
isa_ok($panel, 'esmith::FormMagick::Panel::domains');
$panel->{cgi} = CGI->new();
$panel->parse_xml();
{ package esmith::FormMagick::Panel::domains;
our $domainsdb;
::isa_ok($domainsdb, 'esmith::DomainsDB');
}
=end testing
=cut
sub new {
shift;
my $self = esmith::FormMagick->new();
$self->{calling_package} = (caller)[0];
bless $self;
return $self;
}
=head1 HTML GENERATION ROUTINES
Routines for generating chunks of HTML needed by the panel.
=head2 print_domains_table
Prints out the domains table on the front page.
=cut
sub print_domains_table
{
my $self = shift;
my $q = $self->{cgi};
my $domains_table =
{
title => $self->localise('CURRENT_LIST_OF_DOMAINS'),
#stripe => '#D4D0C8',
fields => [ qw(Domain Description Content Nameservers Modify Remove) ],
labels => 1,
field_attr => {
Domain => { label_escape => 0, escape => 0, label =>
$self->localise('DOMAIN_NAME') },
Description => { label_escape => 0, escape => 0, label =>
$self->localise('DESCRIPTION_BRIEF') },
Content => { label_escape => 0, escape => 0, label => $self->localise('CONTENT') },
Nameservers => { label_escape => 0, escape => 0, label => $self->localise('LABEL_NAMESERVERS') },
Modify => { label_escape => 0, escape => 0, label => $self->localise('MODIFY'),
link => \&modify_link },
Remove => { label_escape => 0, escape => 0, label => $self->localise('REMOVE'),
link => \&remove_link,
value => \&remove_value },
},
table => {class=> "sme-border"},
th => {class => "sme-border"},
tr => {class => "sme-border"},
td => {class => "sme-border"},
};
my @data = ();
my $modify = $self->localise('MODIFY');
my $remove = $self->localise('REMOVE');
for ($ddb->domains)
{
my $ns = $_->prop('Nameservers') || 'internet';
push @data,
{ Domain => $_->key, $_->props,
Modify => $modify, Remove => $remove,
Nameservers => $self->localise($ns),
}
}
my $t = HTML::Tabulate->new($domains_table);
$t->render(\@data, $domains_table);
}
sub modify_link
{
my ($data_item, $row, $field) = @_;
return "domains?page=0&page_stack=&Next=Next&Domain=" .
$row->{Domain} . "&wherenext=DOMAINS_PAGE_MODIFY";
}
sub remove_link
{
my ($data_item, $row, $field) = @_;
return undef if (($row->{Removable} || "yes") eq "no");
return "domains?page=0&page_stack=&Next=Next&Domain=" .
$row->{Domain} . "&wherenext=DOMAINS_PAGE_REMOVE";
}
sub remove_value
{
my ($data_item, $row, $field) = @_;
return "" if (($row->{Removable} || "yes") eq "no");
return $row->{Remove};
}
sub get_content_options
{
my $self = shift;
# We do some subversion here to localize the label of "Primary".
my %options = map { $_->key => $_->prop('Name') }
grep { $_->key ne "Primary" } $adb->ibays;
$options{'Primary'} = $self->localise('PRIMARY_SITE');
return \%options
}
sub get_content_value
{
my $self = shift;
my $q = $self->{cgi};
my $domain = $q->param('Domain') || undef;
return $domain ? $ddb->get_prop($domain, 'Content') : 'Primary';
}
sub get_description_value
{
my $self = shift;
my $q = $self->{cgi};
my $domain = $q->param('Domain') || undef;
return $ddb->get_prop($domain, 'Description');
}
sub get_nameserver_options
{
my $self = shift;
my $q = $self->{cgi};
my $domain = $q->param('Domain') || undef;
my @options = qw(localhost internet);
push @options, 'corporate' if ($db->get_prop('dnscache', 'Forwarder'));
my $ns = ($ddb->get_prop($domain, 'Nameservers') || 'internet');
push @options, $ns unless scalar grep { /^$ns$/ } @options;
return \@options;
}
sub get_nameserver_value
{
my $self = shift;
my $q = $self->{cgi};
my $domain = $q->param('Domain') || undef;
return ($ddb->get_prop($domain, 'Nameservers') || 'internet');
}
sub validate_Domain
{
my $self = shift;
my $domain = lc shift;
return ($domain =~ /^($REGEXP_DOMAIN)$/) ? 'OK' :
'DOMAIN_NAME_VALIDATION_ERROR';
}
sub validate_Description
{
# XXX - FIXME - NOTREACHED
# We used to use the Description in the Appletalk volume name
# which meant it needed validation. I don't see any reason to
# do this any more
my $self = shift;
my $description = shift;
return ($description =~ /^([\-\'\w][\-\'\w\s\.]*)$/) ? 'OK' :
'DOMAIN_DESCRIPTION_VALIDATION_ERROR';
}
sub ip_number_or_blank
{
# XXX - FIXME - we should push this down into CGI::FormMagick
my $self = shift;
my $ip = shift;
if (!defined($ip) || $ip eq "")
{
return 'OK';
}
return CGI::FormMagick::Validator::ip_number($self, $ip);
}
=head2 get_prop ITEM PROP
A simple accessor for esmith::ConfigDB::Record::prop
=cut
sub get_prop
{
# XXX - FIXME - we should push this down to esmith::FormMagick
my ($self, $item, $prop, $default) = @_;
return $db->get_prop($item, $prop) || $default;
}
sub modify_dns
{
my ($fm) = @_;
my $q = $fm->{'cgi'};
my $forwarder = $q->param('Forwarder') || '';
my $forwarder2 = $q->param('Forwarder2') || '';
my $dnscache = $db->get('dnscache');
($forwarder, $forwarder2) = ($forwarder2, '')
if ($forwarder2 and not $forwarder);
if ($forwarder)
{
$dnscache->set_prop('Forwarder', $forwarder);
}
else
{
$dnscache->delete_prop('Forwarder');
}
if ($forwarder2)
{
$dnscache->set_prop('Forwarder2', $forwarder2);
}
else
{
$dnscache->delete_prop('Forwarder2');
}
unless ( system( "/sbin/e-smith/signal-event", "dns-update" ) == 0 )
{
$fm->error('ERROR_UPDATING');
return undef;
}
return $fm->success('SUCCESS');
}
sub create_modify_domain
{
my ($fm, $action) = @_;
my $q = $fm->{'cgi'};
my $domain = $q->param('Domain');
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
unless ($domain)
{
$fm->error($action eq 'create' ? 'ERROR_CREATING_DOMAIN'
: 'ERROR_MODIFYING_DOMAIN');
return undef;
}
my $rec = $ddb->get($domain);
if ($rec and $action eq 'create')
{
$fm->error('DOMAIN_IN_USE_ERROR');
return undef;
}
if (not $rec and $action eq 'modify')
{
$fm->error('NONEXISTENT_DOMAIN_ERROR');
return undef;
}
$rec ||= $ddb->new_record($domain, { type => 'domain' });
my %props;
$props{$_} = $q->param($_) for ( qw(Content Description Nameservers) );
$rec->merge_props(%props);
my $status = system( "/sbin/e-smith/signal-event",
"domain-$action", "$domain" );
if ($status)
{
$fm->error($action eq 'create' ? 'ERROR_CREATING_DOMAIN'
: 'ERROR_MODIFYING_DOMAIN');
return undef;
}
$fm->success($action eq 'create' ? 'SUCCESSFULLY_CREATED'
: 'SUCCESSFULLY_MODIFIED');
}
sub delete_domain
{
my ($fm, $action) = @_;
my $q = $fm->{'cgi'};
my $domain = $q->param('Domain');
$domain = $1 if ($domain =~ /^($REGEXP_DOMAIN)$/);
unless ($domain)
{
$fm->error('ERROR_WHILE_REMOVING_DOMAIN');
return undef;
}
my $rec = $ddb->get($domain);
if (not $rec)
{
$fm->error('NONEXISTENT_DOMAIN_ERROR');
return undef;
}
$rec->set_prop('type', 'domain-deleted');
if (system("/sbin/e-smith/signal-event", "domain-delete", "$domain") == 0)
{
$rec->delete;
return $fm->success('SUCCESSFULLY_DELETED');
}
return $fm->error('ERROR_WHILE_REMOVING_DOMAIN');
}
=head2 print_page_description($self, "remove")
Generates the page description for the Remove Domain page.
=cut
sub print_page_description {
my ($self, $pagename) = @_;
unless (grep /^$pagename$/, qw(remove)) {
warn "Can't generate page description for invalid pagename $pagename\n";
return;
}
$pagename = uc($pagename);
my $desc = $self->localise("${pagename}_DESC");
my $desc2 = $self->localise("${pagename}_DESC2");
my ($fm, $action) = @_;
my $q = $fm->{'cgi'};
my $domain = $q->param('Domain');
my $domain_description = $ddb->get_prop("$domain",'Description');
print qq{
<tr><td colspan="2">
<p>$desc "$domain" ($domain_description)</p>
<b>$desc2</b>
</td></tr>
};
return;
}
=head2 getExtraParams()
Sets variables used in the lexicon to their required values.
=for testing
$panel->{cgi}->param(-name=>'name', -value=>'foo');
my %ret = $panel->getExtraParams();
is($ret{name}, 'foo', ' .. name field is foo');
isnt($ret{description}, undef, ' .. description field isnt undef');
=cut
sub getExtraParams
{
my $self = shift;
my $q = $self->{cgi};
my $domain= $q->param('Domain');
my $domaindesc = $ddb->get_prop($domain, 'Description');
return (domain => $domain, domainDesc => $domaindesc, domainName => $domain);
}
1;