#!/usr/bin/perl use 5.010_000; use strict; use warnings; use utf8; =head1 NAME fripost-searchalias - List matching aliases =head1 SYNOPSIS B [B<--debug>] [B<--from>] [B<--goto>] [I] =head1 DESCRIPTION B list virtual aliases matching exactly I, targetting to I. Wildcards I<*> can appear in the login part of I, to match zero or more characters. If no I is given, list all aliases whose target matches I. If neither I nor I are given, B list all existing virtual aliases. =head1 OPTIONS =over 8 =item B<--server_host=>I The LDAP URI to connect to. The default value is read from the configuration file, see B. =item B<--bind_dn=>I The Distinguished Name (DN) to bind to the LDAP directory. (If not set, B binds anonymously.) The default value is read from the configuration file, see B. =item B<--bind_pw=>I The password to to bind with. The default value is read from the configuration file, see B. =item B<--base_dn=>I The root DN for everything done by B. The default value is read from the configuration file, see B. =item B<--debug> Debug mode. =item B<--from> Match on 'from' addresses. The default is to match both the 'from' and 'goto' address. =item B<--goto> Match on 'goto' addresses. The default is to match both the 'from' and 'goto' address. =back =head1 CONFIGURATION The configuration is read from the file C<$HOME/.fripost.yml>. Valid keys include: =over 4 =item I The LDAP URI to connect to. Defaults to C. =item I The Distinguished Name (DN) to bind to the LDAP directory. (If not set, B binds anonymously.) =item I The password to to bind with. =item I The root DN for everything done by B. =back =cut use FindBin qw($Bin); use lib "$Bin/lib"; use Env qw /HOME/; use File::Spec::Functions; 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 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}, 'debug' => \$conf->{debug}, 'from' => \$conf->{from}, 'goto' => \$conf->{goto}, 'man' => sub { pod2usage(-exitstatus => 0, -verbose => 2) } ) or pod2usage(2); # Connect to the LDAP server my $ldap = Fripost::Schema->new( $conf ); sub perform_search { my %alias = @_; foreach my $alias ($ldap->alias->search( \%alias )->entries) { say "From: " . (join ', ', @{$alias->{address}}); say "Goto: " . $alias->{goto}; say "IsActive: " . $alias->{isActive}; say "--------------------------------" } } my $f = $conf->{from}; my $g = $conf->{goto}; my $from = $f || !$f && !$g; my $goto = $g || !$f && !$g; if ($from) { say " Searchin 'from'"; perform_search(address => $ARGV[0]); my ($u,$d) = split /\@/, $ARGV[0], 2; $d = $u if (defined $u) and not (defined $d); $ldap->domain->search({ domain => $d })->count or die "Error: Unknown domain `$d'.\n"; } if ($goto) { say " Searchin 'goto'"; perform_search(goto => $ARGV[0]); } $ldap->unbind(); =head1 AUTHOR Guilhem Moulin C<< >> =head1 COPYRIGHT 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