forked from .cyb/cyberman
Initial version of WHOIS server
This commit is contained in:
parent
4be5a07e86
commit
32c5b712d7
|
@ -35,6 +35,12 @@ Once you've got all that, just run `plackup` to start a development server. You
|
||||||
|
|
||||||
You can deploy cyberman however you want, using Plack. Just make sure you pass `-E production` - this disables detailed error pages which could be a security risk, and tones down the logging.
|
You can deploy cyberman however you want, using Plack. Just make sure you pass `-E production` - this disables detailed error pages which could be a security risk, and tones down the logging.
|
||||||
|
|
||||||
|
## WHOIS server
|
||||||
|
|
||||||
|
The WHOIS server is written in Perl 6 (what do you think I am, a luddite?!) so you need to install that first, along with Panda, a package manager. Then, install the dependencies for the WHOIS server: `cat whoissrv/DEPENDENCIES | xargs -n 1 panda install`. Edit the values in the `whoissrv` section of `config.yml` and then start the server as root.
|
||||||
|
|
||||||
|
The WHOIS server is not supported on Windows at this time.
|
||||||
|
|
||||||
## Questions, fan mail, etc
|
## Questions, fan mail, etc
|
||||||
|
|
||||||
Feel free to join `#cyb` on `irc.cyberia.is`!
|
Feel free to join `#cyb` on `irc.cyberia.is`!
|
||||||
|
|
10
config.yml
10
config.yml
|
@ -48,3 +48,13 @@ mail:
|
||||||
# Currently, the local MTA is used and there's no config option
|
# Currently, the local MTA is used and there's no config option
|
||||||
from: 'cybnic@uptime.party'
|
from: 'cybnic@uptime.party'
|
||||||
baseurl: 'http://opennic.cyb'
|
baseurl: 'http://opennic.cyb'
|
||||||
|
|
||||||
|
whoissrv:
|
||||||
|
# Only required if whoissrv is going to be run
|
||||||
|
bind: "0.0.0.0"
|
||||||
|
port: 43
|
||||||
|
logging: 1
|
||||||
|
motdfile: "motd.txt"
|
||||||
|
drop-uid: 999
|
||||||
|
drop-gid: 999
|
||||||
|
registrar-urls: "http://opennic.cyb, https://cyb.uptime.party"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<% FOREACH d IN domains %>
|
<% FOREACH d IN domains %>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<% d.name | html_entity %>.cyb
|
<% d.name | html_entity %>.<% vars.config.tld %>
|
||||||
</td>
|
</td>
|
||||||
<td id="owneremail-<% d.name | html_entity %>">
|
<td id="owneremail-<% d.name | html_entity %>">
|
||||||
[ <a class="bracketButton" onclick="showOwnerEmail('<% d.name | html_entity %>')" style="cursor:pointer">show</a> ]
|
[ <a class="bracketButton" onclick="showOwnerEmail('<% d.name | html_entity %>')" style="cursor:pointer">show</a> ]
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
POSIX
|
||||||
|
YAMLish
|
||||||
|
DBIish
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
Welcome to the cybNIC registry!
|
||||||
|
The following information is presented in the hopes that it will be useful,
|
||||||
|
but cybNIC makes ABSOLUTELY NO GUARANTEE as to its accuracy.
|
||||||
|
|
||||||
|
Queries made to this service may be logged. IP addresses will not be logged.
|
|
@ -0,0 +1,86 @@
|
||||||
|
#!/usr/bin/env perl6
|
||||||
|
use v6.c;
|
||||||
|
use POSIX;
|
||||||
|
use YAMLish;
|
||||||
|
use DBIish;
|
||||||
|
|
||||||
|
my $yamldata = slurp "../config.yml";
|
||||||
|
my $config = load-yaml($yamldata);
|
||||||
|
|
||||||
|
my $listener = IO::Socket::Async.listen($config.{'whoissrv'}.{'bind'}, $config.{'whoissrv'}.{'port'});
|
||||||
|
|
||||||
|
my $motd = slurp $config.{"whoissrv"}.{"motdfile"};
|
||||||
|
|
||||||
|
my $dbh = connect-db();
|
||||||
|
|
||||||
|
$listener.tap( -> $conn {
|
||||||
|
log("New connection");
|
||||||
|
$conn.Supply.tap( -> $in {
|
||||||
|
my $q = $in.chomp;
|
||||||
|
log "Query: $q";
|
||||||
|
await $conn.write: ($motd~"\n").encode("utf-8");
|
||||||
|
|
||||||
|
my $tld = $config.{"tld"};
|
||||||
|
if ($q !~~ m/\.$tld$/) {
|
||||||
|
await $conn.write: "This WHOIS server does not provide data for that TLD.\n".encode("utf-8");
|
||||||
|
log("Data not provided; connection closed");
|
||||||
|
$conn.close;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
$q ~~ s/\.$tld$//;
|
||||||
|
$q = $q.lc;
|
||||||
|
|
||||||
|
my $sth = $dbh.prepare("select * from domain where name = ?");
|
||||||
|
$sth.execute($q);
|
||||||
|
my $data = $sth.row(:hash);
|
||||||
|
|
||||||
|
if (!$data) {
|
||||||
|
await $conn.write: "$q.$tld is not recognised by this WHOIS server.\n".encode("utf-8");
|
||||||
|
log("Domain not known; connection closed");
|
||||||
|
$conn.close;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $regdate = DateTime.new($data.{"since"});
|
||||||
|
my $regurl = $config.{"whoissrv"}.{"registrar-urls"};
|
||||||
|
|
||||||
|
await $conn.write: qq:heredoc/end/.encode("UTF-8");
|
||||||
|
Domain: $q.$tld
|
||||||
|
Domain Registered: $regdate
|
||||||
|
Domain Updated: < data currently unavailable >
|
||||||
|
Domain Expires: < data currently unavailable >
|
||||||
|
Domain Status: ACTIVE
|
||||||
|
Registrar URL(s): $regurl
|
||||||
|
|
||||||
|
Registrant Name: < withheld >
|
||||||
|
Registrant Email: < withheld >
|
||||||
|
end
|
||||||
|
|
||||||
|
$conn.close;
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
drop();
|
||||||
|
|
||||||
|
await Promise.new;
|
||||||
|
|
||||||
|
sub log ($msg) {
|
||||||
|
return 1 unless $config.{'whoissrv'}.{'logging'};
|
||||||
|
my $stamp = DateTime.now(formatter => { sprintf "[%04d-%02d-%02d %02d:%02d]", .year, .month, .day, .hour, .minute });
|
||||||
|
say "$stamp $msg";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub drop {
|
||||||
|
log("Dropping priviliges: uid=" ~ $config.{'whoissrv'}.{'drop-uid'} ~ ", gid=" ~ $config.{'whoissrv'}.{'drop-gid'});
|
||||||
|
setuid($config.{'whoissrv'}.{'drop-uid'});
|
||||||
|
setgid($config.{'whoissrv'}.{'drop-gid'});
|
||||||
|
}
|
||||||
|
|
||||||
|
sub connect-db {
|
||||||
|
my $dbtype = $config.{"plugins"}.{"Database"}.{"driver"};
|
||||||
|
die "Unsupported database type: $dbtype" unless $dbtype eq "SQLite";
|
||||||
|
|
||||||
|
my $dbh = DBIish.connect($dbtype, database => "../" ~ $config.{"plugins"}.{"Database"}.{"dbname"});
|
||||||
|
return $dbh;
|
||||||
|
}
|
Loading…
Reference in New Issue