additional debugging/profiling info for billing, RT#30238
[freeside.git] / FS / bin / freeside-sqlradius-dedup-group
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw( %seen @dups );
5 use Getopt::Std;
6 use FS::UID qw(adminsuidsetup);
7 use FS::Record qw(qsearch qsearchs);
8 use FS::part_export;
9
10 my %allowed_types = map { $_ => 1 } qw ( sqlradius sqlradius_withdomain );
11
12 my $user = shift or die &usage;
13 adminsuidsetup $user;
14
15 my $export_x = shift;
16 my @part_export;
17 if ( !defined($export_x) ) {
18   @part_export = qsearch('part_export', {} );
19 } elsif ( $export_x =~ /^(\d+)$/ ) {
20   @part_export = qsearchs('part_export', { exportnum=>$1 } )
21     or die "exportnum $export_x not found\n";
22 } else {
23   @part_export = qsearch('part_export', { exporttype=>$export_x } )
24     or die "no exports of type $export_x found\n";
25 }
26
27 @part_export = grep { $allowed_types{$_->exporttype} } @part_export
28   or die "No sqlradius exports specified.";
29
30 foreach my $part_export ( @part_export ) {
31   my $dbh = DBI->connect( map $part_export->option($_),
32                            qw ( datasrc username password ) );
33
34   my $sth = $dbh->prepare("SELECT id,username,groupname
35                            FROM usergroup ORDER By username,groupname,id")
36     or die $dbh->errstr;
37   $sth->execute() or die $sth->errstr;
38
39   @dups = (); %seen = ();
40   while (my $row = $sth->fetchrow_arrayref ) {
41     my ($userid, $username, $groupname) = @$row;
42     unless ( exists($seen{$username}{$groupname}) ) {
43       $seen{$username}{$groupname} = $userid;
44       next;
45     }
46     push @dups, $userid;
47   }
48
49   $sth = $dbh->prepare("DELETE FROM usergroup WHERE id = ?")
50     or die $dbh->errstr;
51
52   foreach (@dups) {
53     $sth->execute($_) or die $sth->errstr;
54   }
55
56 }
57
58
59 sub usage {
60   die "Usage:\n\n  freeside-sqlradius-dedup-group user [ exportnum|exporttype ]\n";
61 }
62
63 =head1 NAME
64
65 freeside-sqlradius-dedup-group - Command line tool to eliminate duplicate usergroup entries from radius tables
66
67 =head1 SYNOPSIS
68
69   freeside-sqlradius-dedup-group user [ exportnum|exporttype ]
70
71 =head1 DESCRIPTION
72
73   Removes all but one username groupname pair when duplicate entries exist
74   for the specified export (selected by exportnum or exporttype) or all
75   exports if none are specified.
76
77 =head1 SEE ALSO
78
79 L<freeside-reexport>, L<freeside-sqlradius-reset>, L<FS::part_export> 
80
81 =cut
82