diff options
| author | Guilhem Moulin <guilhem.moulin@fripost.org> | 2012-06-03 22:20:58 +0200 | 
|---|---|---|
| committer | Guilhem Moulin <guilhem.moulin@fripost.org> | 2012-06-03 22:20:58 +0200 | 
| commit | a3684346f4d60715512c7ca30ba9fc7bb270c38e (patch) | |
| tree | b6c4d3a5223faf5801f5e5e7860110fca5efa521 /fripost-newdomain | |
| parent | 0461d89edb3f8e272697726208ab7747c30a81df (diff) | |
Merge everything into a single executable.
Diffstat (limited to 'fripost-newdomain')
| -rwxr-xr-x | fripost-newdomain | 263 | 
1 files changed, 0 insertions, 263 deletions
| diff --git a/fripost-newdomain b/fripost-newdomain deleted file mode 100755 index 2f204ee..0000000 --- a/fripost-newdomain +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/perl - -use 5.010_000; -use warnings; -use strict; -use utf8; - -=head1 NAME - -fripost-newdomain - Add a new domain to the system - -=head1 SYNOPSIS - -B<fripost-newdomain> [B<--verbose>] [B<--debug>] [B<--pretend>] -[B<--owner=>I<username>] [I<domain>] - -=head1 DESCRIPTION - -B<fripost-newdomain> adds a new virtual domain to the system, unless -B<--pretend> is set. -If I<domain> is not given, the user is prompted for it. -By default, B<fripost-newdomain> prompts for the owner of the new -domain; Use B<--owner=>I<''> to create a "global" domain, only managed -by the administrators. -Several users can manage the same domain together. -If B<fripost-newdomain> warns if it is asked to register an existing -domain to a new owner. - -=head1 OPTIONS - -=over 8 - -=item B<--pretend> - -Only simulates the insertion. (But still query the LDAP server to ensure -that I<domain> is not already in the database, and that the owner -exists.) - -=item B<--owner=>I<username> - -By default, the user is prompted for the owner of the new domain. It is -possible to use this option instead. Also, to create a domain that is -not owned by anyone, hence only managed by the administrators, use -B<--owner=>I<''>. - -=item B<--server_host=>I<host> - -The LDAP URI to connect to. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--bind_dn=>I<binddn> - -The Distinguished Name (DN) to bind to the LDAP directory. -(If not set, B<fripost-newdomain> binds anonymously.) -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--bind_pw=>I<password> - -The password to to bind with. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--base_dn=>I<basedn> - -The root DN for everything done by B<fripost-newdomain>. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<-v>, B<--verbose> - -Verbose mode. - -=item B<--debug> - -Debug mode. - -=back - -=head1 CONFIGURATION - -The configuration is read from the file C<$HOME/.fripost.yml>. -Valid keys include: - -=over 4 - -=item I<server_host> - -The LDAP URI to connect to. Defaults to C<ldap://127.0.0.1:389>. - -=item I<bind_dn> - -The Distinguished Name (DN) to bind to the LDAP directory. -(If not set, B<fripost-newdomain> binds anonymously.) - -=item I<bind_pw> - -The password to to bind with. - -=item I<base_dn> - -The root DN for everything done by B<fripost-newdomain>. - -=back - -=cut - -use FindBin qw($Bin); -use lib "$Bin/lib"; - -use Env qw /HOME/; -use File::Spec::Functions; - -use Data::Dumper; -use Fripost::Password; -use Fripost::Prompt; -use Fripost::Schema; -use Getopt::Long qw /:config noauto_abbrev no_ignore_case -                             gnu_compat bundling permute nogetopt_compat -                             auto_version auto_help/; -use Pod::Usage; -use Email::Valid; -use IO::Prompter; -use YAML::Syck; - -## Get command line options -our $conf = LoadFile( catfile ($HOME, '.fripost.yml') ); - -GetOptions( -    'server_host=s' => \$conf->{server_host}, -    'base_dn=s'     => \$conf->{base_dn}, -    'bind_dn=s'     => \$conf->{bind_dn}, -    'bind_pw=s'     => \$conf->{bind_pw}, -    'pretend'       => \$conf->{pretend}, -    'owner=s'       => \$conf->{owner}, -    'debug'         => \$conf->{debug}, -    'v|verbose'     => \$conf->{verbose}, -    'man'           => sub { pod2usage(-exitstatus => 0, -                                       -verbose => 2) } -) or pod2usage(2); - -sub vsay { say STDERR @_ if $conf->{verbose} || $conf->{debug}; } - - -# Connect to the LDAP server -my $ldap = Fripost::Schema->new( $conf ); - - -# Define the domain that is to be added. -my %domain; -$domain{domain}   = $ARGV[0]; -$domain{domain} //= prompt "Domain name: "; -$domain{isActive} = 'TRUE'; - -# Ensure that the domain is valid. -Email::Valid->address('fake@'.$domain{domain}) -    or die "Error: Invalid domain `$domain{domain}'.\n"; - -if (defined $conf->{owner}) { -    if ($conf->{owner} eq '') { -        $domain{owner} = undef -    } -    else { -        Email::Valid->address($conf->{owner}) -            or die "Error: $conf->{owner} is not a valid e-mail.\n"; -        $domain{owner} = $conf->{owner}; -    } -} -else { -    $domain{owner} = prompt_email("Belongs to user: ", 'is_user'); -} - - -{ -    # Check that the owner exists. -    die "Error: Unknown user `" .$domain{owner}. "'.\n" -        unless (not defined $domain{owner}) -            or $ldap->user->search({ username => $domain{owner} })->count; - -    # Check that the owner doesn't already own this very domain, or that the -    # domain isn't an existing "global" domain. -    if ($ldap->domain->search(\%domain)->count) { -        print STDERR "Error: Domain `" .$domain{domain}. "' already exists"; -        print STDERR " for user `" .$domain{owner}. "'" if defined $domain{owner}; -        say STDERR "."; -        exit 1; -    } - -    # If the domain exists (but is eg, owned by someone else), produce a -    # warning. -    my $res = $ldap->domain->search({ domain => $domain{domain} }); -    if ($res->count) { -        print STDERR "WARN: Domain `" .$domain{domain}. "' already exists."; -        my @owners; -        map { push @owners, @{$_->{owner}} if defined $_->{owner} } $res->entries; -        if (@owners) { -            print STDERR " (Owned by "; -            print STDERR (join ', ', map { '`' .$_. "'"} @owners); -            print STDERR ".)"; -        } -        print STDERR "\n"; -    } -} - - -if ($conf->{pretend}) { -    vsay "Nothing to do since we are only pretending..."; -    exit 0; -} - - -# Add the domain. -$ldap->domain->add(\%domain); -if (defined $domain{owner}) { -    print "New domain `" .$domain{domain}. "' added"; -    print " for user `" .$domain{owner}. "'" if defined $domain{owner}; -    say "."; -} -else { -    say "New non self-managed domain `" .$domain{domain}. "' added."; -} - - -# Create aliases. -sub create_alias { -    my ($ldap, $from, $to) = @_; - -    my %alias = (address => $from, goto => $to); - -    my $res = $ldap->alias->search(\%alias); -    if ($res->count) { -        print STDERR "WARN: Alias $alias{address} already exists."; -        print STDERR "(Targetting to "; -        print STDERR (join ', ', map { $_->{goto} } $res->entries); -        say STDERR ".)"; -        return unless grep { $_->{goto} eq $alias{goto} } $res->entries; -    } - -    $alias{isActive} = 'TRUE'; -    $ldap->alias->add( \%alias ); -    say "Created alias from $from to $to."; -} - -create_alias($ldap, 'abuse@' . $domain{domain}     ,'abuse@fripost.org'); -create_alias($ldap, 'postmaster@' . $domain{domain},'postmaster@fripost.org');  -$ldap->unbind(); - - -=head1 AUTHOR - -Stefan Kangas C<< <skangas at skangas.se> >> - -Guilhem Moulin C<< <guilhem at fripost.org> >> - -=head1 COPYRIGHT - -Copyright 2010,2011 Stefan Kangas. - -Copyright 2012 Guilhem Moulin. - -=head1 LICENSE - -This program is free software; you can redistribute it and/or modify it -under the same terms as perl itself. - -=cut | 
