1 |
#!/home/jsoc/bin/linux_x86_64/activeperl |
2 |
|
3 |
use strict; |
4 |
use warnings; |
5 |
use File::Basename; |
6 |
use FindBin qw($Bin); |
7 |
use DBI; |
8 |
use DBD::Pg; |
9 |
use lib "$Bin/../../../base/libs/perl"; |
10 |
use Data::Dumper; |
11 |
use drmsArgs; |
12 |
use drmsRunProg; |
13 |
|
14 |
# Arguments |
15 |
use constant kArgDbname => "dbname"; |
16 |
use constant kArgDbhost => "dbhost"; |
17 |
use constant kArgDbport => "dbport"; |
18 |
use constant kArgDbuser => "dbuser"; |
19 |
use constant kArgPword => "password"; |
20 |
use constant kOptDoit => "doit"; |
21 |
|
22 |
# Return values |
23 |
use constant kRetSuccess => 0; |
24 |
use constant kRetInvalidArgs => 1; |
25 |
use constant kRetDbconnect => 2; |
26 |
use constant kRetDbQuery => 3; |
27 |
|
28 |
my($argsinH); |
29 |
my($optsinH); |
30 |
my(@args); |
31 |
my($opts); |
32 |
my($dsn); |
33 |
my($dbh); |
34 |
my($dbname); # name of the db instance to connect to |
35 |
my($dbhost); # name of the db host on which the db instance resides |
36 |
my($dbport); # port on $dbhost through which connections are made |
37 |
my($dbuser); # database user name (to log-in as) |
38 |
my($pass); # the password to test |
39 |
my($doit); # If set, then modify database |
40 |
my($stmnt); |
41 |
my($rows); |
42 |
my(@rowarr); |
43 |
my($tstdbh); |
44 |
my($user); |
45 |
my($rv); |
46 |
|
47 |
$rv = &kRetSuccess; |
48 |
|
49 |
# Collect arguments |
50 |
$argsinH = |
51 |
{ |
52 |
&kArgDbname => 's', |
53 |
&kArgDbhost => 's', |
54 |
&kArgDbport => 's', |
55 |
&kArgDbuser => 's', |
56 |
&kArgPword => 's' |
57 |
}; |
58 |
|
59 |
@args = GetArgs($argsinH); |
60 |
|
61 |
$optsinH = |
62 |
{ |
63 |
&kOptDoit => 'noval' |
64 |
}; |
65 |
|
66 |
$opts = GetOpts($optsinH); |
67 |
|
68 |
if (@args) |
69 |
{ |
70 |
($dbname, $dbhost, $dbport, $dbuser, $pass) = @args; |
71 |
|
72 |
$doit = 0; |
73 |
if (defined($opts)) |
74 |
{ |
75 |
$doit = $opts->Get(&kOptDoit); |
76 |
if (!defined($doit)) |
77 |
{ |
78 |
$doit = 0; |
79 |
} |
80 |
} |
81 |
|
82 |
$dsn = "dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport"; |
83 |
$dbh = DBI->connect($dsn, $dbuser, '', {AutoCommit => 0}); # will need to put pass in .pg_pass |
84 |
|
85 |
if (defined($dbh)) |
86 |
{ |
87 |
# Get a list of all db users |
88 |
$stmnt = "SELECT rolname FROM pg_catalog.pg_roles"; |
89 |
|
90 |
$rows = $dbh->selectall_arrayref($stmnt, undef); |
91 |
if (NoErr($rows, \$dbh, $stmnt)) |
92 |
{ |
93 |
@rowarr = @$rows; |
94 |
foreach my $row (@rowarr) |
95 |
{ |
96 |
$user = $row->[0]; |
97 |
|
98 |
# Try to login as $user. |
99 |
$tstdbh = DBI->connect($dsn, $user, $pass, {AutoCommit => 0, PrintError => 0}); |
100 |
if (defined($tstdbh)) |
101 |
{ |
102 |
print "!!! User $user has bad password '$pass' !!!\n"; |
103 |
$tstdbh->rollback(); |
104 |
} |
105 |
} |
106 |
} |
107 |
else |
108 |
{ |
109 |
print STDERR "Unable to obtain user names from db.\n"; |
110 |
$rv = &kRetDbquery; |
111 |
} |
112 |
|
113 |
if ($rv == &kRetSuccess && $doit) |
114 |
{ |
115 |
# Commit the db changes. |
116 |
print "Committing changes.\n"; |
117 |
$dbh->commit(); |
118 |
} |
119 |
else |
120 |
{ |
121 |
print "Rolling back changes, error code $rv.\n"; |
122 |
$dbh->rollback(); |
123 |
} |
124 |
} |
125 |
else |
126 |
{ |
127 |
print STDERR "Unable to connect to db to get user names.\n"; |
128 |
$rv = &kRetDbconnect; |
129 |
} |
130 |
|
131 |
exit($rv); |
132 |
} |
133 |
|
134 |
sub GetArgs |
135 |
{ |
136 |
my($argsinH) = @_; |
137 |
my($args); |
138 |
my($arg); |
139 |
my(@rv); |
140 |
|
141 |
$args = new drmsArgs($argsinH, 1); |
142 |
|
143 |
if (defined($args)) |
144 |
{ |
145 |
$arg = $args->Get(&kArgDbname); |
146 |
if (defined($arg)) |
147 |
{ |
148 |
push(@rv, $arg); |
149 |
$arg = $args->Get(&kArgDbhost); |
150 |
if (defined($arg)) |
151 |
{ |
152 |
push(@rv, $arg); |
153 |
$arg = $args->Get(&kArgDbport); |
154 |
if (defined($arg)) |
155 |
{ |
156 |
push(@rv, $arg); |
157 |
$arg = $args->Get(&kArgDbuser); |
158 |
if (defined($arg)) |
159 |
{ |
160 |
push(@rv, $arg); |
161 |
$arg = $args->Get(&kArgPword); |
162 |
if (defined($arg)) |
163 |
{ |
164 |
push(@rv, $arg); |
165 |
} |
166 |
} |
167 |
} |
168 |
} |
169 |
} |
170 |
} |
171 |
|
172 |
return @rv; |
173 |
} |
174 |
|
175 |
sub GetOpts |
176 |
{ |
177 |
my($argsinH) = @_; |
178 |
my($rv); |
179 |
|
180 |
$rv = new drmsArgs($optsinH, 0); |
181 |
} |
182 |
|
183 |
sub NoErr |
184 |
{ |
185 |
my($rv) = $_[0]; |
186 |
my($dbh) = $_[2]; |
187 |
my($stmnt) = $_[2]; |
188 |
my($ok) = 1; |
189 |
|
190 |
if (!defined($rv) || !$rv) |
191 |
{ |
192 |
if (defined($$dbh) && defined($$dbh->err)) |
193 |
{ |
194 |
print STDERR "Error " . $$dbh->errstr . ": Statement '$stmnt' failed.\n"; |
195 |
} |
196 |
|
197 |
$ok = 0; |
198 |
} |
199 |
|
200 |
return $ok; |
201 |
} |
202 |
|
203 |
sub ExeStmnt |
204 |
{ |
205 |
my($dbh, $stmnt, $doit, $printit, $diag) = @_; |
206 |
my($rsp); |
207 |
my($res); |
208 |
my($rv); |
209 |
|
210 |
$rv = &kRetSuccess; |
211 |
|
212 |
if ($doit) |
213 |
{ |
214 |
if ($printit) |
215 |
{ |
216 |
print $diag; |
217 |
} |
218 |
|
219 |
$res = $dbh->do($stmnt); |
220 |
if (!NoErr($res, $dbh, $stmnt)) |
221 |
{ |
222 |
$rv = &kRetDbQuery; |
223 |
} |
224 |
} |
225 |
else |
226 |
{ |
227 |
print $diag; |
228 |
} |
229 |
|
230 |
return $rv; |
231 |
} |