X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fpart_export%2Fshellcommands.pm;h=6e9168a6d5b83c243c9868be06358632f43c92d1;hb=fc3483c8679daf2e00467db05342e9fcd314d541;hp=ca04e3869c1a2715f52e54ed456d07792e18b9fa;hpb=30ceabb9d40844452fae8e7c5535fd6a6738b0cd;p=freeside.git diff --git a/FS/FS/part_export/shellcommands.pm b/FS/FS/part_export/shellcommands.pm index ca04e3869..6e9168a6d 100644 --- a/FS/FS/part_export/shellcommands.pm +++ b/FS/FS/part_export/shellcommands.pm @@ -4,6 +4,7 @@ use vars qw(@ISA %info); use Tie::IxHash; use String::ShellQuote; use FS::part_export; +use FS::Record qw( qsearch qsearchs ); @ISA = qw(FS::part_export); @@ -38,7 +39,7 @@ tie my %options, 'Tie::IxHash', type =>'textarea', default=>'', }, - 'usermod_pwonly' => { label=>'Disallow username, domain, uid, gid, dir and RADIUS group changes', + 'usermod_pwonly' => { label=>'Disallow username, domain, uid, gid, and dir changes', #and RADIUS group changes', type =>'checkbox', }, 'usermod_nousername' => { label=>'Disallow just username changes', @@ -60,6 +61,10 @@ tie my %options, 'Tie::IxHash', type=>'select', options=>[qw(crypt md5)], default => 'crypt', }, + 'groups_susp_reason' => { label => + 'Radius group mapping to reason (via template user)', + type => 'textarea', + }, ; %info = ( @@ -162,11 +167,22 @@ old_ for replace operations):
  • $shell
  • $quota
  • @radius_groups +
  • $reasonnum (when suspending) +
  • $reasontext (when suspending) +
  • $reasontypenum (when suspending) +
  • $reasontypetext (when suspending)
  • All other fields in svc_acct are also available. END ); +sub _groups_susp_reason_map { shift->_map('groups_susp_reason'); } + +sub _map { + my $self = shift; + map { reverse(/^\s*(\S+)\s*(.*)\s*$/) } split("\n", $self->option(shift) ); +} + sub rebless { shift; } sub _export_insert { @@ -239,6 +255,39 @@ sub _export_command { @radius_groups = $svc_acct->radius_groups; + my ($reasonnum, $reasontext, $reasontypenum, $reasontypetext); + if ( $cust_pkg && $action eq 'suspend' && (my $r = $cust_pkg->last_reason)){ + $reasonnum = $r->reasonnum; + $reasontext = $r->reason; + $reasontypenum = $r->reason_type; + $reasontypetext = $r->reasontype->type; + + my %reasonmap = $self->_groups_susp_reason_map; + my $userspec = ''; + $userspec = $reasonmap{$reasonnum} + if exists($reasonmap{$reasonnum}); + $userspec = $reasonmap{$reasontext} + if (!$userspec && exists($reasonmap{$reasontext})); + + my $suspend_user; + if ($userspec =~ /^\d+$/ ){ + $suspend_user = qsearchs( 'svc_acct', { 'svcnum' => $userspec } ); + }elsif ($userspec =~ /^\S+\@\S+$/){ + my ($username,$domain) = split(/\@/, $userspec); + for my $user (qsearch( 'svc_acct', { 'username' => $username } )){ + $suspend_user = $user if $userspec eq $user->email; + } + }elsif ($userspec){ + $suspend_user = qsearchs( 'svc_acct', { 'username' => $userspec } ); + } + + @radius_groups = $suspend_user->radius_groups + if $suspend_user; + + }else{ + $reasonnum = $reasontext = $reasontypenum = $reasontypetext = ''; + } + $self->shellcommands_queue( $svc_acct->svcnum, user => $self->option('user')||'root', host => $self->machine, @@ -257,7 +306,7 @@ sub _export_replace { ${"old_$_"} = $old->getfield($_) foreach $old->fields; ${"new_$_"} = $new->getfield($_) foreach $new->fields; } - $new_finger =~ /^(.*)\s+(\S+)$/ or $finger =~ /^((.*))$/; + $new_finger =~ /^(.*)\s+(\S+)$/ or $new_finger =~ /^((.*))$/; ($new_first, $new_last ) = ( $1, $2 ); $new_first = shell_quote $new_first; $new_last = shell_quote $new_last; @@ -292,10 +341,10 @@ sub _export_replace { if ( $old_dir ne $new_dir ) { $error ||= "can't change dir"; } - if ( join("\n", sort @old_radius_groups) ne - join("\n", sort @new_radius_groups) ) { - $error ||= "can't change RADIUS groups"; - } + #if ( join("\n", sort @old_radius_groups) ne + # join("\n", sort @new_radius_groups) ) { + # $error ||= "can't change RADIUS groups"; + #} } return $error. ' ('. $self->exporttype. ' to '. $self->machine. ')' if $error;