1 | #!/usr/bin/perl
|
---|
2 | # -T
|
---|
3 | # ipdb/cgi-bin/extras/db2rwhois.pl
|
---|
4 | # Pull data from ipdb and mangle it into RWHOIS
|
---|
5 | # Initial version 03/26/2004 kdeugau against IPDB v1
|
---|
6 | ###
|
---|
7 | # Revision info
|
---|
8 | # $Date: 2005-05-30 20:09:05 +0000 (Mon, 30 May 2005) $
|
---|
9 | # SVN revision $Rev: 253 $
|
---|
10 | # Last update by $Author: kdeugau $
|
---|
11 | ###
|
---|
12 | # Copyright (C) 2004,2005 - Kris Deugau
|
---|
13 |
|
---|
14 | use strict;
|
---|
15 | use warnings;
|
---|
16 | use DBI;
|
---|
17 | use NetAddr::IP;
|
---|
18 | use MyIPDB;
|
---|
19 |
|
---|
20 | $ENV{"PATH"} = "/bin;/usr/bin";
|
---|
21 |
|
---|
22 | my $rwhoisDataPath = "/etc/rwhoisd";
|
---|
23 |
|
---|
24 | # We'll pull this out of the database instead. Just make sure our
|
---|
25 | # master blocks are actually listed.... <g>
|
---|
26 | #@masterblocks = (
|
---|
27 | # (new NetAddr::IP "209.91.128.0/18"),
|
---|
28 | # (new NetAddr::IP "66.186.64.0/19"),
|
---|
29 | # (new NetAddr::IP "192.168.99.0/24")
|
---|
30 | # );
|
---|
31 |
|
---|
32 | my ($dbh,$msg) = connectDB_My;
|
---|
33 |
|
---|
34 | # For WHOIS purposes this may not be very useful. YMMV, we'll see.
|
---|
35 | #initIPDBGlobals($dbh);
|
---|
36 |
|
---|
37 | my @masterblocks;
|
---|
38 |
|
---|
39 | # Fill in data about our master blocks as allocated from ARIN
|
---|
40 | # We open separate files for each of these as appropriate.
|
---|
41 | # Note that this ASS-U-MEs that we do not add master IP blocks-
|
---|
42 | # there should probably be a separate system for doing that.
|
---|
43 | my $sth = $dbh->prepare("select cidr,ctime from masterblocks;");
|
---|
44 | $sth->execute;
|
---|
45 | my $i=0;
|
---|
46 | GETMASTERS: while (my @data = $sth->fetchrow_array()) {
|
---|
47 |
|
---|
48 | # Techically, we only need to exclude 204.138.172.0/24, as we "own" all of the other blocks.
|
---|
49 | if ($data[0] =~ /^(192.168.0.0|172.16.0.0|10.0.0.0|20[456])/) {
|
---|
50 | next GETMASTERS;
|
---|
51 | }
|
---|
52 | $masterblocks[$i] = new NetAddr::IP $data[0];
|
---|
53 | my ($ctime,undef) = split /\s/, $data[1];
|
---|
54 |
|
---|
55 | print "$masterblocks[$i] $data[1]\n";
|
---|
56 |
|
---|
57 | my $date;
|
---|
58 | chomp ($date = `/bin/date +"%Y-%m-%d"`);
|
---|
59 |
|
---|
60 | # Whew! Ugly little varmint.
|
---|
61 | my $masterfilename = "net-".$masterblocks[$i]->addr."-".$masterblocks[$i]->masklen.
|
---|
62 | "/data/network/".$masterblocks[$i]->addr."-".$masterblocks[$i]->masklen.".txt";
|
---|
63 |
|
---|
64 | # Need check here to create tree for netblock?
|
---|
65 |
|
---|
66 | open MASTERFILE,">$rwhoisDataPath/$masterfilename";
|
---|
67 |
|
---|
68 | print MASTERFILE "ID: NETBLK-ISP.$masterblocks[$i]\n".
|
---|
69 | "Auth-Area: $masterblocks[$i]\n".
|
---|
70 | "Network-Name: ISP-".$masterblocks[$i]->network."\n".
|
---|
71 | "IP-Network: $masterblocks[$i]\n".
|
---|
72 | "IP-Network-Block: ".$masterblocks[$i]->range."\n".
|
---|
73 | "Organization: Friendly ISP\n".
|
---|
74 | "Tech-Contact: noc\@example.com\n".
|
---|
75 | "Admin-Contact: ISP-ARIN-HANDLE\n".
|
---|
76 | "Abuse-Contact: abuse\@example.com\n".
|
---|
77 | "Created: $ctime\n".
|
---|
78 | "Updated: $date\n".
|
---|
79 | "Updated-By: noc\@example.com\n";
|
---|
80 |
|
---|
81 | close MASTERFILE;
|
---|
82 | $i++;
|
---|
83 | }
|
---|
84 |
|
---|
85 | # Now read out the data in the "main" delegation list, and check it
|
---|
86 | # with the master blocks. We need to do this to decide which rWHOIS
|
---|
87 | # "net-xxx.xxx.xxx.xxx-mask" tree the data belongs in.
|
---|
88 |
|
---|
89 | # Make sure to remove the private netblocks from this.
|
---|
90 | # No use or point in broadcasting our use of them.
|
---|
91 | $sth = $dbh->prepare("select cidr,custid,type,city,description,createstamp,modifystamp ".
|
---|
92 | "from allocations where ".
|
---|
93 | "not (cidr <<= '192.168.0.0/16') and ".
|
---|
94 | "not (cidr <<= '172.16.0.0/12') and ".
|
---|
95 | "not (cidr <<= '10.0.0.0/8') and ".
|
---|
96 | "masklen(cidr) <=30");
|
---|
97 | #" and (custid='6750400' or custid like '%-RES' or custid like '%-BUS')");
|
---|
98 | $sth->execute;
|
---|
99 |
|
---|
100 | $i=0;
|
---|
101 | while (my ($cidr, $custid, $type, $city, $desc, $ctime, $mtime) = $sth->fetchrow_array) {
|
---|
102 |
|
---|
103 | # We get master block info from @masterblocks.
|
---|
104 | # ID: NETBLK-ISP.10.0.0.0/8
|
---|
105 | # Auth-Area: 10.0.0.0/8
|
---|
106 | # Network-Name: ISP-10.0.2.144
|
---|
107 | # IP-Network: 10.0.2.144.144/29
|
---|
108 | # IP-Network-Block: 10.0.2.144 - 10.0.2.151
|
---|
109 | # Organization: WidgetCorp
|
---|
110 | # Tech-Contact: bob@widgetcorp.com
|
---|
111 | # Admin-Contact: ISP-ARIN-HANDLE
|
---|
112 | # Created: 20040314
|
---|
113 | # Updated: 20040314
|
---|
114 | # Updated-By: noc@example.com
|
---|
115 |
|
---|
116 | # Get the "full" network number
|
---|
117 | my $net = new NetAddr::IP $cidr;
|
---|
118 |
|
---|
119 | # Assumptions: All data in ipdb is public
|
---|
120 | # If not, we need another field to indicate "public/private".
|
---|
121 |
|
---|
122 | foreach my $master (@masterblocks) {
|
---|
123 | if ($master->contains($net)) {
|
---|
124 |
|
---|
125 | # Whew! Ugly little varmint.
|
---|
126 | my $masterfilename = "net-".$master->addr."-".$master->masklen.
|
---|
127 | "/data/network/".$master->addr."-".$master->masklen.".txt";
|
---|
128 |
|
---|
129 | open MASTERFILE,">>$rwhoisDataPath/$masterfilename"
|
---|
130 | or print "File open error: '$!' on '$rwhoisDataPath/$masterfilename'\n";
|
---|
131 |
|
---|
132 | # cidr custid type city description notes maskbits
|
---|
133 |
|
---|
134 | # Creation date in record to eventually be "correct"; near-term will
|
---|
135 | # be master's creation date; immediate is today's date.
|
---|
136 | my $date;
|
---|
137 | chomp ($date = `/bin/date +"%Y%m%d"`);
|
---|
138 | if ($desc =~ /^\s*$/) { $desc = 'Friendly ISP'; }
|
---|
139 | #print "$i:\t$net in $master\n";
|
---|
140 |
|
---|
141 | print MASTERFILE "---\nID: NETBLK-ISP.$master\n".
|
---|
142 | "Auth-Area: $master\n".
|
---|
143 | "Network-Name: ISP-".$net->network."\n".
|
---|
144 | "IP-Network: $net\n".
|
---|
145 | "IP-Network-Block: ".$net->range."\n".
|
---|
146 | "Organization: $desc\n".
|
---|
147 | # "Tech-Contact: $data[9]\n".
|
---|
148 | "Tech-Contact: abuse\@example.com\n".
|
---|
149 | "Admin-Contact: ISP-ARIN-HANDLE\n".
|
---|
150 | "Created: $ctime\n".
|
---|
151 | "Updated: $mtime\n".
|
---|
152 | "Updated-By: noc\@example.com\n";
|
---|
153 | }
|
---|
154 | }
|
---|
155 |
|
---|
156 |
|
---|
157 |
|
---|
158 | # print "$data[0]\t| $data[1]\t| $data[2]\t| $data[3]\t| $data[4]\t| ".
|
---|
159 | # "$data[5]\t| $data[6]\t| $data[7]\t| $data[8]\t| $data[9]\n";
|
---|
160 | # print "$data[0]\t| $data[1]\t| $data[2]\t| $data[3]\t| $data[4]\t| ".
|
---|
161 | # "$data[5]\t| $data[6]\t| $data[7]\t| $data[8]\n";
|
---|
162 | $i++;
|
---|
163 | } # while fetchrow_array()
|
---|
164 |
|
---|
165 |
|
---|
166 | $dbh->disconnect;
|
---|