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