1 package FS::svc_Radius_Mixin;
2 use base qw( FS::m2m_Common FS::svc_Common );
5 use FS::Record qw( qsearch dbh );
7 use FS::radius_usergroup;
8 use Carp qw( confess );
10 # not really a mixin since it overrides insert/replace/delete and has svc_Common
11 # as a base class, should probably be renamed svc_Radius_Common
15 FS::svc_Radius_Mixin - partial base class for services with RADIUS groups
26 local $SIG{HUP} = 'IGNORE';
27 local $SIG{INT} = 'IGNORE';
28 local $SIG{QUIT} = 'IGNORE';
29 local $SIG{TERM} = 'IGNORE';
30 local $SIG{TSTP} = 'IGNORE';
31 local $SIG{PIPE} = 'IGNORE';
33 my $oldAutoCommit = $FS::UID::AutoCommit;
34 local $FS::UID::AutoCommit = 0;
37 my $error = $self->SUPER::insert(@_)
38 || $self->process_m2m(
39 'link_table' => 'radius_usergroup',
40 'target_table' => 'radius_group',
41 'params' => $self->usergroup,
45 $dbh->rollback if $oldAutoCommit;
49 $dbh->commit or die $dbh->errstr if $oldAutoCommit;
56 $old = $new->replace_old if !defined($old);
58 local $SIG{HUP} = 'IGNORE';
59 local $SIG{INT} = 'IGNORE';
60 local $SIG{QUIT} = 'IGNORE';
61 local $SIG{TERM} = 'IGNORE';
62 local $SIG{TSTP} = 'IGNORE';
63 local $SIG{PIPE} = 'IGNORE';
65 my $oldAutoCommit = $FS::UID::AutoCommit;
66 local $FS::UID::AutoCommit = 0;
69 $old->usergroup; # make sure this is cached for exports
71 my $error = $new->process_m2m(
72 'link_table' => 'radius_usergroup',
73 'target_table' => 'radius_group',
74 'params' => $new->usergroup,
76 || $new->SUPER::replace($old, @_);
79 $dbh->rollback if $oldAutoCommit;
83 $dbh->commit or die $dbh->errstr if $oldAutoCommit;
90 local $SIG{HUP} = 'IGNORE';
91 local $SIG{INT} = 'IGNORE';
92 local $SIG{QUIT} = 'IGNORE';
93 local $SIG{TERM} = 'IGNORE';
94 local $SIG{TSTP} = 'IGNORE';
95 local $SIG{PIPE} = 'IGNORE';
97 my $oldAutoCommit = $FS::UID::AutoCommit;
98 local $FS::UID::AutoCommit = 0;
101 my $error = $self->SUPER::delete(@_)
102 || $self->process_m2m(
103 'link_table' => 'radius_usergroup',
104 'target_table' => 'radius_group',
109 $dbh->rollback if $oldAutoCommit;
113 $dbh->commit or die $dbh->errstr if $oldAutoCommit;
120 if ( defined $value ) {
122 return $self->set('usergroup', $value);
125 return $self->set('usergroup', [ split(/\s*,\s*/, $value) ]);
128 $self->get('usergroup') ||
129 # if no argument is passed and usergroup is not set already,
130 # fetch this service's group assignments
131 $self->set('usergroup',
132 [ map { $_->groupnum }
133 qsearch('radius_usergroup', { svcnum => $self->svcnum }) ]
139 'usergroup' => \&usergroup
143 =item radius_groups METHOD
145 Returns a list of RADIUS groups for this service (see L<FS::radius_usergroup>).
146 METHOD is the field to return, and can be any method on L<FS::radius_group>.
147 Useful values for METHOD include 'groupnum', 'groupname', and
148 'long_description'. Defaults to 'groupname' for historical reasons.
154 my $method = shift || 'groupname';
155 my $groups = join(',', @{$self->usergroup}) || return ();
156 my @groups = qsearch({'table' => 'radius_group',
157 'extra_sql' => "where groupnum in ($groups)"});
158 return map {$_->$method} @groups;