From 3595c874f8e476e58b98b7ab6d86918d4dbb1d5c Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 17 Sep 2002 09:19:42 +0000 Subject: [PATCH 1/1] remove svc_acct_sm --- FS/FS.pm | 2 - FS/FS/InitHandler.pm | 1 - FS/FS/cust_pkg.pm | 14 +- FS/FS/part_export.pm | 2 - FS/FS/part_svc.pm | 27 +--- FS/FS/svc_acct.pm | 9 +- FS/FS/svc_acct_sm.pm | 260 -------------------------------- FS/MANIFEST | 2 - FS/t/svc_acct_sm.t | 5 - httemplate/docs/schema.dia | Bin 14414 -> 14438 bytes httemplate/docs/schema.html | 9 +- httemplate/edit/part_svc.cgi | 8 +- httemplate/edit/process/part_svc.cgi | 2 +- httemplate/edit/process/svc_acct_sm.cgi | 34 ----- httemplate/edit/svc_acct_sm.cgi | 178 ---------------------- httemplate/index.html | 1 - httemplate/misc/link.cgi | 1 - httemplate/search/svc_acct_sm.cgi | 84 ----------- httemplate/search/svc_acct_sm.html | 23 --- httemplate/search/svc_domain.cgi | 12 -- httemplate/view/svc_acct_sm.cgi | 58 ------- 21 files changed, 12 insertions(+), 720 deletions(-) delete mode 100644 FS/FS/svc_acct_sm.pm delete mode 100644 FS/t/svc_acct_sm.t delete mode 100755 httemplate/edit/process/svc_acct_sm.cgi delete mode 100755 httemplate/edit/svc_acct_sm.cgi delete mode 100755 httemplate/search/svc_acct_sm.cgi delete mode 100755 httemplate/search/svc_acct_sm.html delete mode 100755 httemplate/view/svc_acct_sm.cgi diff --git a/FS/FS.pm b/FS/FS.pm index 963c73548..c22557a2d 100644 --- a/FS/FS.pm +++ b/FS/FS.pm @@ -62,8 +62,6 @@ L - DNS zone entries L - Mail forwarding class -L - (Depreciated) Vitual mail alias class - L - Web virtual host class. L - Service definition class diff --git a/FS/FS/InitHandler.pm b/FS/FS/InitHandler.pm index 0216615da..5038cf352 100644 --- a/FS/FS/InitHandler.pm +++ b/FS/FS/InitHandler.pm @@ -52,7 +52,6 @@ sub handler { use FS::session; use FS::svc_acct; use FS::svc_acct_pop; - use FS::svc_acct_sm; use FS::svc_domain; use FS::svc_forward; use FS::svc_www; diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index 12508e1aa..0c71435e1 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -14,7 +14,6 @@ use FS::pkg_svc; # setup } # because they load configuraion by setting FS::UID::callback (see TODO) use FS::svc_acct; -use FS::svc_acct_sm; use FS::svc_domain; use FS::svc_www; use FS::svc_forward; @@ -679,7 +678,7 @@ sub order { =head1 VERSION -$Id: cust_pkg.pm,v 1.23 2002-08-26 20:40:55 ivan Exp $ +$Id: cust_pkg.pm,v 1.24 2002-09-17 09:19:06 ivan Exp $ =head1 BUGS @@ -690,11 +689,12 @@ In sub order, the @pkgparts array (passed by reference) is clobbered. Also in sub order, no money is adjusted. Once FS::part_pkg defines a standard method to pass dates to the recur_prog expression, it should do so. -FS::svc_acct, FS::svc_acct_sm, and FS::svc_domain are loaded via 'use' at -compile time, rather than via 'require' in sub { setup, suspend, unsuspend, -cancel } because they use %FS::UID::callback to load configuration values. -Probably need a subroutine which decides what to do based on whether or not -we've fetched the user yet, rather than a hash. See FS::UID and the TODO. +FS::svc_acct, FS::svc_domain, FS::svc_www and FS::svc_forward are loaded via +'use' at compile time, rather than via 'require' in sub +{ setup, suspend, unsuspend, cancel } because they use %FS::UID::callback to +load configuration values. Probably need a subroutine which decides what to +do based on whether or not we've fetched the user yet, rather than a hash. +See FS::UID and the TODO. Now that things are transactional should the check in the insert method be moved to check ? diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 69cd8058b..647666b86 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -819,8 +819,6 @@ tie my %sqlmail_options, 'Tie::IxHash', }, - 'svc_acct_sm' => {}, - 'svc_forward' => { 'sqlmail' => { 'desc' => 'Real-time export to SQL-backed mail server', diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm index 959a3f887..7c6acdbcd 100644 --- a/FS/FS/part_svc.pm +++ b/FS/FS/part_svc.pm @@ -254,31 +254,6 @@ sub check { my @fields = eval { fields( $recref->{svcdb} ) }; #might die return "Unknown svcdb!" unless @fields; -##REPLACED BY part_svc_column -# my $svcdb; -# foreach $svcdb ( qw( -# svc_acct svc_acct_sm svc_domain -# ) ) { -# my @rows = map { /^${svcdb}__(.*)$/; $1 } -# grep ! /_flag$/, -# grep /^${svcdb}__/, -# fields('part_svc'); -# foreach my $row (@rows) { -# unless ( $svcdb eq $recref->{svcdb} ) { -# $recref->{$svcdb.'__'.$row}=''; -# $recref->{$svcdb.'__'.$row.'_flag'}=''; -# next; -# } -# $recref->{$svcdb.'__'.$row.'_flag'} =~ /^([DF]?)$/ -# or return "Illegal flag for $svcdb $row"; -# $recref->{$svcdb.'__'.$row.'_flag'} = $1; -# -# my $error = $self->ut_anything($svcdb.'__'.$row); -# return $error if $error; -# -# } -# } - ''; #no error } @@ -325,7 +300,7 @@ sub part_export { =head1 VERSION -$Id: part_svc.pm,v 1.13 2002-04-11 22:05:31 ivan Exp $ +$Id: part_svc.pm,v 1.14 2002-09-17 09:19:06 ivan Exp $ =head1 BUGS diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index f73ab82da..bd348f8ed 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -18,11 +18,9 @@ use FS::UID qw( datasrc ); use FS::Conf; use FS::Record qw( qsearch qsearchs fields dbh ); use FS::svc_Common; -use Net::SSH; use FS::cust_svc; use FS::part_svc; use FS::svc_acct_pop; -use FS::svc_acct_sm; use FS::cust_main_invoice; use FS::svc_domain; use FS::raddb; @@ -410,11 +408,6 @@ The corresponding FS::cust_svc record will be deleted as well. sub delete { my $self = shift; - if ( defined( $FS::Record::dbdef->table('svc_acct_sm') ) ) { - return "Can't delete an account which has (svc_acct_sm) mail aliases!" - if $self->uid && qsearch( 'svc_acct_sm', { 'domuid' => $self->uid } ); - } - return "Can't delete an account which is a (svc_forward) source!" if qsearch( 'svc_forward', { 'srcsvc' => $self->svcnum } ); @@ -1148,7 +1141,7 @@ probably live somewhere else... L, edit/part_svc.cgi from an installed web interface, export.html from the base documentation, L, L, L, L, L, L, -L), L, L, L, +L), L, schema.html from the base documentation. =cut diff --git a/FS/FS/svc_acct_sm.pm b/FS/FS/svc_acct_sm.pm deleted file mode 100644 index c92f1421f..000000000 --- a/FS/FS/svc_acct_sm.pm +++ /dev/null @@ -1,260 +0,0 @@ -package FS::svc_acct_sm; - -use strict; -use vars qw( @ISA $nossh_hack $conf $shellmachine @qmailmachines ); -use FS::Record qw( fields qsearch qsearchs ); -use FS::svc_Common; -use FS::cust_svc; -use Net::SSH qw(ssh); -use FS::Conf; -use FS::svc_acct; -use FS::svc_domain; - -@ISA = qw( FS::svc_Common ); - -#ask FS::UID to run this stuff for us later -#$FS::UID::callback{'FS::svc_acct_sm'} = sub { -# $conf = new FS::Conf; -# $shellmachine = $conf->exists('qmailmachines') -# ? $conf->config('shellmachine') -# : ''; -#}; - -=head1 NAME - -FS::svc_acct_sm - Object methods for svc_acct_sm records - -=head1 SYNOPSIS - - use FS::svc_acct_sm; - - $record = new FS::svc_acct_sm \%hash; - $record = new FS::svc_acct_sm { 'column' => 'value' }; - - $error = $record->insert; - - $error = $new_record->replace($old_record); - - $error = $record->delete; - - $error = $record->check; - - $error = $record->suspend; - - $error = $record->unsuspend; - - $error = $record->cancel; - -=head1 WARNING - -FS::svc_acct_sm is B. This class is only included for migration -purposes. See L. - -=head1 DESCRIPTION - -An FS::svc_acct_sm object represents a virtual mail alias. FS::svc_acct_sm -inherits from FS::Record. The following fields are currently supported: - -=over 4 - -=item svcnum - primary key (assigned automatcially for new accounts) - -=item domsvc - svcnum of the virtual domain (see L) - -=item domuid - uid of the target account (see L) - -=item domuser - virtual username - -=back - -=head1 METHODS - -=over 4 - -=item new HASHREF - -Creates a new virtual mail alias. To add the virtual mail alias to the -database, see L<"insert">. - -=cut - -sub table { 'svc_acct_sm'; } - -=item insert - -Adds this virtual mail alias to the database. If there is an error, returns -the error, otherwise returns false. - -The additional fields pkgnum and svcpart (see L) should be -defined. An FS::cust_svc record will be created and inserted. - - #If the configuration values (see L) shellmachine and qmailmachines - #exist, and domuser is `*' (meaning a catch-all mailbox), the command: - # - # [ -e $dir/.qmail-$qdomain-default ] || { - # touch $dir/.qmail-$qdomain-default; - # chown $uid:$gid $dir/.qmail-$qdomain-default; - # } - # - #is executed on shellmachine via ssh (see L). - #This behaviour can be surpressed by setting $FS::svc_acct_sm::nossh_hack true. - -=cut - -sub insert { - my $self = shift; - my $error; - - local $SIG{HUP} = 'IGNORE'; - local $SIG{INT} = 'IGNORE'; - local $SIG{QUIT} = 'IGNORE'; - local $SIG{TERM} = 'IGNORE'; - local $SIG{TSTP} = 'IGNORE'; - local $SIG{PIPE} = 'IGNORE'; - - $error=$self->check; - return $error if $error; - - return "Domain username (domuser) in use for this domain (domsvc)" - if qsearchs('svc_acct_sm',{ 'domuser'=> $self->domuser, - 'domsvc' => $self->domsvc, - } ); - - return "First domain username (domuser) for domain (domsvc) must be " . - qq='*' (catch-all)!= - if $self->domuser ne '*' - && ! qsearch('svc_acct_sm',{ 'domsvc' => $self->domsvc } ) - && ! $conf->exists('maildisablecatchall'); - - $error = $self->SUPER::insert; - return $error if $error; - - #my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } ); - #my $svc_acct = qsearchs( 'svc_acct', { 'uid' => $self->domuid } ); - #my ( $uid, $gid, $dir, $domain ) = ( - # $svc_acct->uid, - # $svc_acct->gid, - # $svc_acct->dir, - # $svc_domain->domain, - #); - #my $qdomain = $domain; - #$qdomain =~ s/\./:/g; #see manpage for 'dot-qmail': EXTENSION ADDRESSES - #ssh("root\@$shellmachine","[ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }") - # if ( ! $nossh_hack && $shellmachine && $dir && $self->domuser eq '*' ); - - ''; #no error - -} - -=item delete - -Deletes this virtual mail alias from the database. If there is an error, -returns the error, otherwise returns false. - -The corresponding FS::cust_svc record will be deleted as well. - -=item replace OLD_RECORD - -Replaces OLD_RECORD with this one in the database. If there is an error, -returns the error, otherwise returns false. - -=cut - -sub replace { - my ( $new, $old ) = ( shift, shift ); - my $error; - - return "Domain username (domuser) in use for this domain (domsvc)" - if ( $old->domuser ne $new->domuser - || $old->domsvc != $new->domsvc - ) && qsearchs('svc_acct_sm',{ - 'domuser'=> $new->domuser, - 'domsvc' => $new->domsvc, - } ) - ; - - $new->SUPER::replace($old); - -} - -=item suspend - -Just returns false (no error) for now. - -Called by the suspend method of FS::cust_pkg (see L). - -=item unsuspend - -Just returns false (no error) for now. - -Called by the unsuspend method of FS::cust_pkg (see L). - -=item cancel - -Just returns false (no error) for now. - -Called by the cancel method of FS::cust_pkg (see L). - -=item check - -Checks all fields to make sure this is a valid virtual mail alias. If there is -an error, returns the error, otherwise returns false. Called by the insert and -replace methods. - -Sets any fixed values; see L. - -=cut - -sub check { - my $self = shift; - my $error; - - my $x = $self->setfixed; - return $x unless ref($x); - #my $part_svc = $x; - - my($recref) = $self->hashref; - - $recref->{domuser} =~ /^(\*|[a-z0-9_\-]{2,32})$/ - or return "Illegal domain username (domuser)"; - $recref->{domuser} = $1; - - $recref->{domsvc} =~ /^(\d+)$/ or return "Illegal domsvc"; - $recref->{domsvc} = $1; - my($svc_domain); - return "Unknown domsvc" unless - $svc_domain=qsearchs('svc_domain',{'svcnum'=> $recref->{domsvc} } ); - - $recref->{domuid} =~ /^(\d+)$/ or return "Illegal uid"; - $recref->{domuid} = $1; - my($svc_acct); - return "Unknown uid" unless - $svc_acct=qsearchs('svc_acct',{'uid'=> $recref->{domuid} } ); - - ''; #no error -} - -=back - -=head1 VERSION - -$Id: svc_acct_sm.pm,v 1.5 2001-09-06 20:41:59 ivan Exp $ - -=head1 BUGS - -The remote commands should be configurable. - -The $recref stuff in sub check should be cleaned up. - -=head1 SEE ALSO - -L - -L, L, L, L, L, -L, L, L, L, L, -schema.html from the base documentation. - -=cut - -1; - diff --git a/FS/MANIFEST b/FS/MANIFEST index 4a250d77b..3cf4c2ba3 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -87,7 +87,6 @@ FS/pkg_svc.pm FS/svc_Common.pm FS/svc_acct.pm FS/svc_acct_pop.pm -FS/svc_acct_sm.pm FS/svc_broadband.pm FS/svc_domain.pm FS/type_pkgs.pm @@ -165,7 +164,6 @@ t/radius_usergroup.t t/session.t t/svc_acct.t t/svc_acct_pop.t -t/svc_acct_sm.t t/svc_Common.t t/svc_domain.t t/svc_forward.t diff --git a/FS/t/svc_acct_sm.t b/FS/t/svc_acct_sm.t deleted file mode 100644 index 1082f2cdb..000000000 --- a/FS/t/svc_acct_sm.t +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN { $| = 1; print "1..1\n" } -END {print "not ok 1\n" unless $loaded;} -use FS::svc_acct_sm; -$loaded=1; -print "ok 1\n"; diff --git a/httemplate/docs/schema.dia b/httemplate/docs/schema.dia index 092d2f88bcb39aaf8370be48d4543024e7cc7976..c0842a60278d00905b511fb4b5f55ec06e94cb5e 100644 GIT binary patch literal 14438 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
  • svcpart - primary key
  • svc - name of this service -
  • svcdb - table used for this service: svc_acct, svc_acct_sm, svc_forward, svc_domain, svc_charge or svc_wo +
  • svcdb - table used for this service: svc_acct, svc_forward, svc_domain, svc_charge or svc_wo
  • disabled - Disabled flag, empty or `Y' -<% - -my $conf = new FS::Conf; -my $mydomain = $conf->config('domain'); - -my($svcnum, $pkgnum, $svcpart, $part_svc, $svc_acct_sm ); -if ( $cgi->param('error') ) { - $svc_acct_sm = new FS::svc_acct_sm ( { - map { $_, scalar($cgi->param($_)) } fields('svc_acct_sm') - } ); - $svcnum = $svc_acct_sm->svcnum; - $pkgnum = $cgi->param('pkgnum'); - $svcpart = $cgi->param('svcpart'); - #$part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - #die "No part_svc entry!" unless $part_svc; -} else { - my($query) = $cgi->keywords; - if ( $query =~ /^(\d+)$/ ) { #editing - $svcnum=$1; - $svc_acct_sm=qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}) - or die "Unknown (svc_acct_sm) svcnum!"; - - my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}) - or die "Unknown (cust_svc) svcnum!"; - - $pkgnum=$cust_svc->pkgnum; - $svcpart=$cust_svc->svcpart; - - #$part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - #die "No part_svc entry!" unless $part_svc; - - } else { #adding - - $svc_acct_sm = new FS::svc_acct_sm({}); - - foreach $_ (split(/-/,$query)) { #get & untaint pkgnum & svcpart - $pkgnum=$1 if /^pkgnum(\d+)$/; - $svcpart=$1 if /^svcpart(\d+)$/; - } - my $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); - die "No part_svc entry!" unless $part_svc; - - $svcnum=''; - - #set fixed and default fields from part_svc - foreach my $part_svc_column ( - grep { $_->columnflag } $part_svc->all_part_svc_column - ) { - $svc_acct_sm->setfield( $part_svc_column->columnname, - $part_svc_column->columnvalue, - ); - } - - } -} -my $action = $svc_acct_sm->svcnum ? 'Edit' : 'Add'; - -my %username = (); -my %domain = (); -if ($pkgnum) { - - #find all possible uids (and usernames) - - my @u_acct_svcparts = (); - foreach my $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) { - push @u_acct_svcparts,$u_part_svc->getfield('svcpart'); - } - - my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - my($custnum)=$cust_pkg->getfield('custnum'); - foreach my $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) { - my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum'); - my($acct_svcpart); - foreach $acct_svcpart (@u_acct_svcparts) { #now find the corresponding - #record(s) in cust_svc ( for this - #pkgnum ! ) - my($i_cust_svc); - foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) { - my($svc_acct)=qsearchs('svc_acct',{'svcnum'=>$i_cust_svc->getfield('svcnum')}); - $username{$svc_acct->getfield('uid')}=$svc_acct->getfield('username'); - } - } - } - - #find all possible domains (and domsvc's) - - my @d_acct_svcparts = (); - foreach my $d_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_domain'}) ) { - push @d_acct_svcparts,$d_part_svc->getfield('svcpart'); - } - - foreach $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) { - my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum'); - my($acct_svcpart); - foreach $acct_svcpart (@d_acct_svcparts) { - my($i_cust_svc); - foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) { - my($svc_domain)=qsearch('svc_domain',{'svcnum'=>$i_cust_svc->getfield('svcnum')}); - $domain{$svc_domain->getfield('svcnum')}=$svc_domain->getfield('domain'); - } - } - } - -} elsif ( $action eq 'Edit' ) { - - my($svc_acct)=qsearchs('svc_acct',{'uid'=>$svc_acct_sm->domuid}); - $username{$svc_acct_sm->uid} = $svc_acct->username; - - my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$svc_acct_sm->domsvc}); - $domain{$svc_acct_sm->domsvc} = $svc_domain->domain; - -} else { - die "\$action eq Add, but \$pkgnum is null!\n"; -} - -my $p1 = popurl(1); -print header("Mail Alias $action", ''); - -print qq!Error: !, $cgi->param('error'), - "" - if $cgi->param('error'); - -print qq!
    !; - -#display - - #formatting - print "
    ";
    -
    -#svcnum
    -print qq!!;
    -print qq!Service #!, $svcnum ? $svcnum : " (NEW)", "";
    -
    -#pkgnum
    -print qq!!;
    - 
    -#svcpart
    -print qq!!;
    -
    -my($domuser,$domsvc,$domuid)=(
    -  $svc_acct_sm->domuser,
    -  $svc_acct_sm->domsvc,
    -  $svc_acct_sm->domuid,
    -);
    -
    -#domuser
    -print qq!\n\nMail to  ( * for anything )!;
    -
    -#domsvc
    -print qq! \@ ";
    -
    -#uid
    -print qq!\nforwards to \@$mydomain mailbox.";
    -
    -	#formatting
    -	print "
    \n"; - -print qq!
    !; - -print < - - -END - -%> diff --git a/httemplate/index.html b/httemplate/index.html index 2cb707326..f17639d44 100644 --- a/httemplate/index.html +++ b/httemplate/index.html @@ -34,7 +34,6 @@ Phone #
    Username or all accounts by username or uid

    Domain or all domains
    -
    diff --git a/httemplate/misc/link.cgi b/httemplate/misc/link.cgi index efc762cc5..79adce88c 100755 --- a/httemplate/misc/link.cgi +++ b/httemplate/misc/link.cgi @@ -4,7 +4,6 @@ my %link_field = ( 'svc_acct' => 'username', 'svc_domain' => 'domain', - 'svc_acct_sm' => '', 'svc_charge' => '', 'svc_wo' => '', ); diff --git a/httemplate/search/svc_acct_sm.cgi b/httemplate/search/svc_acct_sm.cgi deleted file mode 100755 index 4ee300612..000000000 --- a/httemplate/search/svc_acct_sm.cgi +++ /dev/null @@ -1,84 +0,0 @@ -<% - -my $conf = new FS::Conf; -my $mydomain = $conf->config('domain'); - -$cgi->param('domuser') =~ /^([a-z0-9_\-]{0,32})$/; -my $domuser = $1; - -$cgi->param('domain') =~ /^([\w\-\.]+)$/ or die "Illegal domain"; -my $svc_domain = qsearchs('svc_domain',{'domain'=>$1}) - or die "Unknown domain"; -my $domsvc = $svc_domain->svcnum; - -my @svc_acct_sm; -if ($domuser) { - @svc_acct_sm=qsearch('svc_acct_sm',{ - 'domuser' => $domuser, - 'domsvc' => $domsvc, - }); -} else { - @svc_acct_sm=qsearch('svc_acct_sm',{'domsvc' => $domsvc}); -} - -if ( scalar(@svc_acct_sm) == 1 ) { - my($svcnum)=$svc_acct_sm[0]->svcnum; - print $cgi->redirect(popurl(2). "view/svc_acct_sm.cgi?$svcnum"); -} elsif ( scalar(@svc_acct_sm) > 1 ) { -%> - -<% - print header('Mail Alias Search Results'), &table(), < - Mail to
    (click to view mail alias) - Forwards to
    (click to view account) - -END - - my($svc_acct_sm); - foreach $svc_acct_sm (@svc_acct_sm) { - my($svcnum,$domuser,$domuid,$domsvc)=( - $svc_acct_sm->svcnum, - $svc_acct_sm->domuser, - $svc_acct_sm->domuid, - $svc_acct_sm->domsvc, - ); - - my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $domsvc } ); - if ( $svc_domain ) { - my $domain = $svc_domain->domain; - - print qq!!, - #print '', ( ($domuser eq '*') ? "(anything)" : $domuser ); - ( ($domuser eq '*') ? "(anything)" : $domuser ), - qq!\@$domain !, - ; - } else { - my $warning = "couldn't find svc_domain.svcnum $svcnum ( svc_acct_sm.svcnum $svcnum"; - warn $warning; - print "WARNING: $warning"; - } - - my $svc_acct = qsearchs( 'svc_acct', { 'uid' => $domuid } ); - if ( $svc_acct ) { - my $username = $svc_acct->username; - my $svc_acct_svcnum =$svc_acct->svcnum; - print qq!$username\@$mydomain!, - qq!! - ; - } else { - my $warning = "couldn't find svc_acct.uid $domuid (svc_acct_sm.svcnum $svcnum)!"; - warn $warning; - print "WARNING: $warning"; - } - - } - - print ''; - -} else { #error - idiot("Mail Alias not found"); -} - -%> diff --git a/httemplate/search/svc_acct_sm.html b/httemplate/search/svc_acct_sm.html deleted file mode 100755 index 0719856db..000000000 --- a/httemplate/search/svc_acct_sm.html +++ /dev/null @@ -1,23 +0,0 @@ - - - Mail Alias Search - - -
    -

    Mail Alias Search

    -
    -
    -
    - Search for mail alias: - (opt.) @ - (req.) - -

    - -

    - -
    - - - - diff --git a/httemplate/search/svc_domain.cgi b/httemplate/search/svc_domain.cgi index fb372db14..0bb39f191 100755 --- a/httemplate/search/svc_domain.cgi +++ b/httemplate/search/svc_domain.cgi @@ -67,18 +67,6 @@ END $svc_domain->svcnum, $svc_domain->domain, ); - #my($malias); - #if ( qsearch('svc_acct_sm',{'domsvc'=>$svcnum}) ) { - # $malias=( - # qq|
    |. - # qq||. - # qq||. - # qq||. - # qq|
    | - # ); - #} else { - # $malias=''; - #} my @svc_acct=qsearch('svc_acct',{'domsvc' => $svcnum}); my $rowspan = 0; diff --git a/httemplate/view/svc_acct_sm.cgi b/httemplate/view/svc_acct_sm.cgi deleted file mode 100755 index 4e5acc427..000000000 --- a/httemplate/view/svc_acct_sm.cgi +++ /dev/null @@ -1,58 +0,0 @@ - -<% - -my $conf = new FS::Conf; -my $mydomain = $conf->config('domain'); - -my($query) = $cgi->keywords; -$query =~ /^(\d+)$/; -my $svcnum = $1; -my $svc_acct_sm = qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}); -die "Unknown svcnum" unless $svc_acct_sm; - -my $cust_svc = qsearchs('cust_svc',{'svcnum'=>$svcnum}); -my $pkgnum = $cust_svc->getfield('pkgnum'); -my($cust_pkg, $custnum); -if ($pkgnum) { - $cust_pkg=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); - $custnum=$cust_pkg->getfield('custnum'); -} else { - $cust_pkg = ''; - $custnum = ''; -} - -my $part_svc = qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } ) - or die "Unkonwn svcpart"; - -print header('Mail Alias View', menubar( - ( ( $pkgnum || $custnum ) - ? ( "View this package (#$pkgnum)" => "${p}view/cust_pkg.cgi?$pkgnum", - "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum", - ) - : ( "Cancel this (unaudited) account" => - "${p}misc/cancel-unaudited.cgi?$svcnum" ) - ), - "Main menu" => $p, -)); - -my($domsvc,$domuid,$domuser) = ( - $svc_acct_sm->domsvc, - $svc_acct_sm->domuid, - $svc_acct_sm->domuser, -); -my $svc = $part_svc->svc; -my $svc_domain = qsearchs('svc_domain',{'svcnum'=>$domsvc}) - or die "Corrupted database: no svc_domain.svcnum matching domsvc $domsvc"; -my $domain = $svc_domain->domain; -my $svc_acct = qsearchs('svc_acct',{'uid'=>$domuid}) - or die "Corrupted database: no svc_acct.uid matching domuid $domuid"; -my $username = $svc_acct->username; - -print qq!Edit this information!, - "
    Service #$svcnum", - "
    Service: $svc", - qq!
    Mail to !, ( ($domuser eq '*') ? "(anything)" : $domuser ) , qq!\@$domain forwards to $username\@$mydomain mailbox.!, - '' -; - -%> -- 2.11.0