diff options
| -rw-r--r-- | FS/FS/Conf.pm | 8 | ||||
| -rw-r--r-- | FS/FS/part_export/sqlradius.pm | 2 | ||||
| -rw-r--r-- | FS/FS/svc_acct.pm | 106 | 
3 files changed, 79 insertions, 37 deletions
| diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 3aaa66739..3e159fa19 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2242,6 +2242,14 @@ worry that config_items is freeside-specific and icky.    },    { +    'key'         => 'overlimit_groups', +    'section'     => '', +    'description' => 'RADIUS group (or comma-separated groups) to assign to svc_acct which has exceeded its bandwidth or time limit.', +    'type'        => 'text', +    'per_agent'   => 1, +  }, + +  {      'key'         => 'cust-fields',      'section'     => 'UI',      'description' => 'Which customer fields to display on reports by default', diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm index 20475c5a5..4f67ac6c3 100644 --- a/FS/FS/part_export/sqlradius.pm +++ b/FS/FS/part_export/sqlradius.pm @@ -34,7 +34,7 @@ tie %options, 'Tie::IxHash',      type  => 'checkbox',      label => 'Show the Called-Station-ID on session reports',    }, -  'overlimit_groups' => { label => 'Radius groups to assign to svc_acct which has exceeded its bandwidth or time limit', } , +  'overlimit_groups' => { label => 'Radius groups to assign to svc_acct which has exceeded its bandwidth or time limit (if not overridden by overlimit_groups global or per-agent config)', } ,    'groups_susp_reason' => { label =>                               'Radius group mapping to reason (via template user) (svcnum|username|username@domain  reasonnum|reason)',                              type  => 'textarea', diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index efe66505e..53b9fd682 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -1947,26 +1947,13 @@ sub _op_usage {          ( $action eq 'suspend'   && !$self->overlimit          || $action eq 'unsuspend' &&  $self->overlimit )        ) { -    foreach my $part_export ( $self->cust_svc->part_svc->part_export ) { -      if ($part_export->option('overlimit_groups')) { -        my ($new,$old); -        my $other = new FS::svc_acct $self->hashref; -        my $groups = &{ $self->_fieldhandlers->{'usergroup'} } -                       ($self, $part_export->option('overlimit_groups')); -        $other->usergroup( $groups ); -        if ($action eq 'suspend'){ -          $new = $other; $old = $self; -        }else{ -          $new = $self; $old = $other; -        } -        my $error = $part_export->export_replace($new, $old); -        $error ||= $self->overlimit($action); -        if ( $error ) { -          $dbh->rollback if $oldAutoCommit; -          return "Error replacing radius groups in export, ${op}: $error"; -        } -      } + +    my $error = $self->_op_overlimit($action); +    if ( $error ) { +      $dbh->rollback if $oldAutoCommit; +      return $error;      } +    }    if ( $conf->exists("svc_acct-usage_$action") @@ -2011,6 +1998,61 @@ sub _op_usage {  } +sub _op_overlimit { +  my( $self, $action ) = @_; + +  local $SIG{HUP} = 'IGNORE'; +  local $SIG{INT} = 'IGNORE'; +  local $SIG{QUIT} = 'IGNORE'; +  local $SIG{TERM} = 'IGNORE'; +  local $SIG{TSTP} = 'IGNORE'; +  local $SIG{PIPE} = 'IGNORE'; + +  my $oldAutoCommit = $FS::UID::AutoCommit; +  local $FS::UID::AutoCommit = 0; +  my $dbh = dbh; + +  my $cust_pkg = $self->cust_svc->cust_pkg; + +  my $agent_overlimit = +    $cust_pkg +      ? $conf->config('overlimit_groups', $cust_pkg->cust_main->agentnum ) +      : ''; + +  foreach my $part_export ( $self->cust_svc->part_svc->part_export ) { + +    my $groups = $agent_overlimit || $part_export->option('overlimit_groups'); +    next unless $groups; + +    my $gref = &{ $self->_fieldhandlers->{'usergroup'} }( $self, $groups ); + +    my $other = new FS::svc_acct $self->hashref; +    $other->usergroup( $gref ); + +    my($new,$old); +    if ($action eq 'suspend') { +      $new = $other; +      $old = $self; +    } else { # $action eq 'unsuspend' +      $new = $self; +      $old = $other; +    } + +    my $error = $part_export->export_replace($new, $old) +                || $self->overlimit($action); + +    if ( $error ) { +      $dbh->rollback if $oldAutoCommit; +      return "Error replacing radius groups: $error"; +    } + +  } + +  $dbh->commit or die $dbh->errstr if $oldAutoCommit; +  ''; + +} +  sub set_usage {    my( $self, $valueref, %options ) = @_; @@ -2083,28 +2125,20 @@ sub set_usage {    }    if ( $reset ) { -    my $error; - -    if ($self->overlimit) { -      $error = $self->overlimit('unsuspend'); -      foreach my $part_export ( $self->cust_svc->part_svc->part_export ) { -        if ($part_export->option('overlimit_groups')) { -          my $old = new FS::svc_acct $self->hashref; -          my $groups = &{ $self->_fieldhandlers->{'usergroup'} } -                         ($self, $part_export->option('overlimit_groups')); -          $old->usergroup( $groups ); -          $error ||= $part_export->export_replace($self, $old); -        } -      } -    } -    if ( $conf->exists("svc_acct-usage_unsuspend")) { -      $error ||= $self->cust_svc->cust_pkg->unsuspend; -    } +    my $error = ''; + +    $error = $self->_op_overlimit('unsuspend') +      if $self->overlimit;; + +    $error ||= $self->cust_svc->cust_pkg->unsuspend +      if $conf->exists("svc_acct-usage_unsuspend"); +      if ( $error ) {        $dbh->rollback if $oldAutoCommit;        return "Error unsuspending: $error";      } +    }    warn "$me update successful; committing\n" | 
