Initial commit
[opendmarc.git] / usr / sbin / opendmarc-params
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2012, 2013, The Trusted Domain Project. All rights reserved.
4 #
5 # Script to apply manual changes to DMARC reporting parameters.
6
7 ###
8 ### Setup
9 ###
10
11 use strict;
12 use warnings;
13
14 use Switch;
15
16 use DBI;
17 use File::Basename;
18 use Getopt::Long;
19 use POSIX;
20
21 require DBD::mysql;
22
23 # general
24 my $progname = basename($0);
25 my $version = "1.3.1";
26 my $verbose = 0;
27 my $helponly = 0;
28 my $showversion = 0;
29
30 # DB parameters
31 my $def_dbhost = "localhost";
32 my $def_dbname = "opendmarc";
33 my $def_dbuser = "opendmarc";
34 my $def_dbpasswd = "opendmarc";
35 my $def_dbport = "3306";
36 my $dbhost;
37 my $dbname;
38 my $dbuser;
39 my $dbpasswd;
40 my $dbport;
41
42 my $dbscheme = "mysql";
43
44 my $dbi_a;
45 my $dbi_h;
46 my $dbi_t;
47
48 my $domain;
49 my $domainid;
50 my $requestid;
51 my $rua;
52 my $unlock;
53
54 sub get_table_id
55 {
56 my $name;
57 my $table;
58 my $column;
59 my $out;
60
61 ($name, $table, $column) = @_;
62
63 if (!defined($name) || !defined($table))
64 {
65 return undef;
66 }
67
68 if (!defined($column))
69 {
70 $column = "name";
71 }
72
73 $dbi_t = $dbi_h->prepare("SELECT id FROM $table WHERE $column = ?");
74 if (!$dbi_t->execute($name))
75 {
76 print STDERR "$progname: failed to retrieve table ID: " . $dbi_h->errstr . "\n";
77 return undef;
78 }
79
80 undef $out;
81 while ($dbi_a = $dbi_t->fetchrow_arrayref())
82 {
83 if (defined($dbi_a->[0]))
84 {
85 $out = $dbi_a->[0];
86 }
87 }
88
89 $dbi_t->finish;
90
91 if (!defined($out))
92 {
93 $dbi_t = $dbi_h->prepare("INSERT INTO $table ($column) VALUES(?)");
94 if (!$dbi_t->execute($name))
95 {
96 print STDERR "$progname: failed to create table ID: " . $dbi_h->errstr . "\n";
97 return undef;
98 }
99
100 $dbi_t = $dbi_h->prepare("SELECT LAST_INSERT_ID()");
101 if (!$dbi_t->execute())
102 {
103 print STDERR "$progname: failed to retrieve created table ID: " . $dbi_h->errstr . "\n";
104 return undef;
105 }
106
107 while ($dbi_a = $dbi_t->fetchrow_arrayref())
108 {
109 if (defined($dbi_a->[0]))
110 {
111 $out = $dbi_a->[0];
112 }
113 }
114
115 $dbi_t->finish;
116
117 if (!defined($out))
118 {
119 print STDERR "$progname: failed to retrieve created table ID: " . $dbi_h->errstr . "\n";
120 return undef;
121 }
122 }
123
124 return $out;
125 }
126
127 sub usage
128 {
129 print STDERR "$progname: usage: $progname [options] domain\n";
130 print STDERR "\t--dbhost=host database host [$def_dbhost]\n";
131 print STDERR "\t--dbname=name database name [$def_dbname]\n";
132 print STDERR "\t--dbpasswd=passwd database password [$def_dbpasswd]\n";
133 print STDERR "\t--dbport=port database port [$def_dbport]\n";
134 print STDERR "\t--dbuser=user database user [$def_dbuser]\n";
135 print STDERR "\t--rua=string aggregate report URI(s)\n";
136 print STDERR "\t--help print help and exit\n";
137 print STDERR "\t--unlock unlocks named record\n";
138 print STDERR "\t--verbose verbose output\n";
139 print STDERR "\t--version print version and exit\n";
140 }
141
142 # parse command line arguments
143 my $opt_retval = &Getopt::Long::GetOptions ('dbhost=s' => \$dbhost,
144 'dbname=s' => \$dbname,
145 'dbpasswd=s' => \$dbpasswd,
146 'dbport=s' => \$dbport,
147 'dbuser=s' => \$dbuser,
148 'help!' => \$helponly,
149 'rua=s' => \$rua,
150 'unlock!' => \$unlock,
151 'verbose!' => \$verbose,
152 'version!' => \$showversion,
153 );
154
155 $domain = $ARGV[0];
156
157 if (!$opt_retval || $helponly || !defined($domain))
158 {
159 usage();
160
161 if ($helponly)
162 {
163 exit(0);
164 }
165 else
166 {
167 exit(1);
168 }
169 }
170
171 if ($showversion)
172 {
173 print STDOUT "$progname v$version\n";
174 exit(0);
175 }
176
177 # apply defaults
178 if (!defined($dbhost))
179 {
180 if (defined($ENV{'OPENDMARC_DBHOST'}))
181 {
182 $dbhost = $ENV{'OPENDMARC_DBHOST'};
183 }
184 else
185 {
186 $dbhost = $def_dbhost;
187 }
188 }
189
190 if (!defined($dbname))
191 {
192 if (defined($ENV{'OPENDMARC_DB'}))
193 {
194 $dbname = $ENV{'OPENDMARC_DB'};
195 }
196 else
197 {
198 $dbname = $def_dbname;
199 }
200 }
201
202 if (!defined($dbpasswd))
203 {
204 if (defined($ENV{'OPENDMARC_PASSWORD'}))
205 {
206 $dbpasswd = $ENV{'OPENDMARC_PASSWORD'};
207 }
208 else
209 {
210 $dbpasswd = $def_dbpasswd;
211 }
212 }
213
214 if (!defined($dbport))
215 {
216 if (defined($ENV{'OPENDMARC_PORT'}))
217 {
218 $dbport = $ENV{'OPENDMARC_PORT'};
219 }
220 else
221 {
222 $dbport = $def_dbport;
223 }
224 }
225
226 if (!defined($dbuser))
227 {
228 if (defined($ENV{'OPENDMARC_USER'}))
229 {
230 $dbuser = $ENV{'OPENDMARC_USER'};
231 }
232 else
233 {
234 $dbuser = $def_dbuser;
235 }
236 }
237
238 if ($verbose)
239 {
240 print STDERR "$progname: started at " . localtime() . "\n";
241 }
242
243 my $dbi_dsn = "DBI:" . $dbscheme . ":database=" . $dbname .
244 ";host=" . $dbhost . ";port=" . $dbport;
245
246 $dbi_h = DBI->connect($dbi_dsn, $dbuser, $dbpasswd, { PrintError => 0 });
247 if (!defined($dbi_h))
248 {
249 print STDERR "$progname: unable to connect to database: $DBI::errstr\n";
250 exit(1);
251 }
252
253 if ($verbose)
254 {
255 print STDERR "$progname: connected to database\n";
256 }
257
258 $domainid = get_table_id($domain, "domains", "name");
259 $requestid = get_table_id($domainid, "requests", "domain");
260
261 if ($unlock)
262 {
263 $dbi_t = $dbi_h->prepare("UPDATE requests SET locked = 0 WHERE id = ?");
264 if (!$dbi_t->execute($requestid))
265 {
266 print STDERR "$progname: failed to update requests table for $domain: " . $dbi_h->errstr . "\n";
267 }
268 }
269 else
270 {
271 $dbi_t = $dbi_h->prepare("UPDATE requests SET locked = 1, repuri = ? WHERE id = ?");
272 if (!$dbi_t->execute($rua, $requestid))
273 {
274 print STDERR "$progname: failed to update requests table for $domain: " . $dbi_h->errstr . "\n";
275 }
276 }
277
278 #
279 # all done!
280 #
281
282 $dbi_h->disconnect;
283
284 exit(0);