commit - 27bfd2c38619a7c831b1fd4f42fda665aa0d8d9e
commit + d15f745e78985e5677b797fd69c5275bd5c5ed61
blob - a5adf897916a4e983103004c327023809f1eda4b
blob + 477a6714b33871d20c56e6f87ac098c46cff12f3
--- bin/cliNow.pl
+++ bin/cliNow.pl
use IRCNOW::Database;
use IRCNOW::IO::IRC;
-use IRCNOW::Acct;
+use IRCNOW::Acct::DNS;
use IRCNOW::IO qw(:DEBUG);
#my $acct=new IRCNOW::Acct();
#print $acct->newpass() . "\n";
-my $irc = new IRCNOW::IO::IRC(
- localnet => 'ircnow',
- staff => 'izzyb',
- nick => 'cliNow',
- host => '127.0.0.1',
- port => 6667,
- pass => 'secret',
- expires => 1800,
- networks => 'ircnow',
- chans => '#bottest',
- teamchans => '',
-);
-$irc->run();
-
blob - /dev/null
blob + 51099211f36246a4e0ae6e89e847f95783b93ddf (mode 755)
--- /dev/null
+++ bin/dnsTest.pl
+#!/usr/bin/perl
+#
+
+use strict;
+use warnings;
+#use OpenBSD::Pledge;
+#use OpenBSD::Unveil;
+
+use lib qw(./lib);
+use IRCNOW::Database;
+
+use IRCNOW::IO::IRC;
+use IRCNOW::Acct::DNS;
+
+
+# Load debug modules and set path for auto backups.
+use IRCNOW::IO qw(:DEBUG);
+$verbosity=ALL; # verbosity is exported via :DEBUG sets the debug level
+$IRCNOW::IO::backupspath = 'zones/';
+
+#my $dbase='/var/www/botnow/botnow.db';
+#debug(INFO, "Loading Database $dbase");
+#my $botnowDB = IRCNOW::Database->new(dbpath=>$dbase);
+
+use Data::Dumper;
+
+#my $acct=new IRCNOW::Acct();
+#print $acct->newpass() . "\n";
+
+my $dnsAcct=new IRCNOW::Acct::DNS();
+$dnsAcct->init();
+#unveil() or die "Unable to lock unveil $!";
+
+$dnsAcct->nextdns('izzyb');
+
+
+=pod
+
+=head1 NAME
+
+bin/dnsTest.pl
+
+=head1 SYNOPSIS
+
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+# Load debug modules and set path for auto backups.
+use IRCNOW::IO qw(:DEBUG :FILEIO);
+$verbosity=ALL; # verbosity is exported via :DEBUG sets the debug level
+$IRCNOW::IO::backupspath = 'zones/';
+
+# DNS commands related to IRCNOW accounts.
+use IRCNOW::Acct::DNS;
+
+=head1 DESCRIPTION
+
+This script provides example usage of the IRCNOW::Acct::DNS module.
+
+=cut
+
blob - /dev/null
blob + a5adf897916a4e983103004c327023809f1eda4b (mode 755)
--- /dev/null
+++ bin/ircTest.pl
+#!/usr/bin/perl
+#
+
+use strict;
+use warnings;
+
+use lib qw(./lib);
+use IRCNOW::Database;
+
+use IRCNOW::IO::IRC;
+use IRCNOW::Acct;
+
+
+use IRCNOW::IO qw(:DEBUG);
+$verbosity=ALL;
+#my $dbase='/var/www/botnow/botnow.db';
+#debug(INFO, "Loading Database $dbase");
+#my $botnowDB = IRCNOW::Database->new(dbpath=>$dbase);
+
+use Data::Dumper;
+
+#my $acct=new IRCNOW::Acct();
+#print $acct->newpass() . "\n";
+
+my $irc = new IRCNOW::IO::IRC(
+ localnet => 'ircnow',
+ staff => 'izzyb',
+ nick => 'cliNow',
+ host => '127.0.0.1',
+ port => 6667,
+ pass => 'secret',
+ expires => 1800,
+ networks => 'ircnow',
+ chans => '#bottest',
+ teamchans => '',
+);
+
+$irc->run();
+
blob - 87f37ddfb4ad05db8b3015fc376edc2eeabae6e4
blob + 91dae8a4dc2e7e0e1a5166a7b9fad5b50a203b41
--- lib/IRCNOW/Acct/DNS.pm
+++ lib/IRCNOW/Acct/DNS.pm
use strict;
use warnings;
-use OpenBSD::Pledge;
-use OpenBSD::Unveil;
+use Carp;
+#use OpenBSD::Pledge;
+#use OpenBSD::Unveil;
use lib qw(./lib);
-use IRCNOW::IO qw(readarray writefile appendfile);
+use IRCNOW::IO qw(:DEBUG readarray writefile appendfile);
use File::Copy qw(copy);
-my %conf = %main::conf;
-my $chans = $conf{chans};
-my $staff = $conf{staff};
-my $key = $conf{key};
-my $hash = $conf{hash};
-my $hostname = $conf{hostname};
-my $verbose = $conf{verbose};
-my $ip4 = $conf{ip4};
-my $ip6 = $conf{ip6};
-my $ip6subnet = $conf{ip6subnet};
-my $zonedir = $conf{zonedir};
-my $hostnameif = $conf{hostnameif};
-if (host($hostname) =~ /(\d+\.){3,}\d+/) {
- $ip4 = $&;
+
+# Global vars needed by this library can be passed via this
+# packages global $conf var if not using the OOP interface.
+# Calling libraries should set a local var to this packages
+# config hash like this:
+#
+# my $dnsConf=$IRCNOW::Acct::DNS::conf;
+#
+# Changes can be made as needed before calling functions then.
+# In OOP mode, $self is set using $conf in new();
+our $conf = {
+ hostname => undef,
+ hostnameif => "hostname.vio0",
+ ip4 => undef,
+ ip6 => undef,
+ ip6subnet => 48,
+ zonedir => 'zones',
+};
+
+
+sub verifyConf {
+ my $self = shift || $conf;
+
+ if (not defined $self->{hostname}) {
+ $self->{hostname} = `hostname`; # default to system call for hostname
+ chomp($self->{hostname});
+ }
+ if (not defined $self->{ip4} or not defined $self->{ip6}) {
+ ($self->{ip4}, $self->{ip6}) = split (" ", host($self->{hostname}))
+ }
}
+
+sub new {
+ my ($class,%options) = @_;
+ my $self=$conf; #us defaults from global
+
+ # Copy needed passed params
+ for my $param (qw{ hostname hostnameif ip4 ip6 ip6subnet zonedir }) {
+ $self->{$param} = $options{$param} if (exists $options{$param});
+ }
+
+ bless $self, $class;
+
+ $self->verifyConf();
+
+ return $self;
+}
+
sub init {
- unveil("$zonedir", "rwc") or die "Unable to unveil $!";
- unveil("/usr/bin/doas", "rx") or die "Unable to unveil $!";
- unveil("/usr/bin/host", "rx") or die "Unable to unveil $!";
- unveil("$hostnameif", "rwc") or die "Unable to unveil $!";
+ my $self= shift || $conf;
+ # unveil($self->{zonedir}, "rwc") or die "Unable to unveil $!";
+ # unveil("/usr/bin/doas", "rx") or die "Unable to unveil $!";
+ # unveil("/usr/bin/host", "rx") or die "Unable to unveil $!";
+ # unveil($self->{hostnameif}, "rwc") or die "Unable to unveil $!";
}
# Return list of ipv6 addresses from filename
return @ipv6s;
}
+
# set rdns of $ip6 to $hostname given $subnet
# return true on success; false on failure
sub setrdns {
# if $value is missing, delete $domain
# returns true upon success, false upon failure
sub setdns {
+ my $self = shift;
+ # Verify we were called in object mode or return $self to the param list
+ if (not UNIVERSAL::isa($self, 'IRCNOW::Acct::DNS')) {
+ unshift @_, $self;
+ $self = $conf;
+ }
+
my ($name, $origin, $type, $value) = @_;
- my $filename = "$zonedir/$origin";
+ debug(ALL,"SUB: setdns($name, $origin, $type, $value)");
+ my $filename = $self->{zonedir} ."/$origin";
my @lines = readarray($filename);
foreach my $line (@lines) {
# increment the zone's serial number
push(@lines, "$name 3600 IN $type $value");
}
# trailing newline necessary
- writefile("$filename.bak", join("\n", @lines)."\n");
- copy "$filename.bak", $filename;
+ writefile("$filename", join("\n", @lines)."\n");
+ debug(ALL, 'Running: doas -u _nsd nsd-control reload');
if (system("doas -u _nsd nsd-control reload")) {
return 0;
} else {
# Returns the network part of the first IPv6 address (indicated by subnet)
# with the host part of the second IPv6 address
sub ip6mask {
- my ($ip6net, $subnet, $ip6host) = @_;
- my $netdigits = ip6full($ip6net);
- $netdigits =~ tr/://d;
- my $hostdigits = ip6full($ip6host);
- $hostdigits =~ tr/://d;
- my $digits = substr($netdigits,0,($subnet/4)).substr($hostdigits,($subnet/4));
- my $ip6;
- for (my $n = 0; $n < 32; $n++) {
- if ($n > 0 && $n % 4 == 0) {
- $ip6 .= ":";
- }
- $ip6 .= substr($digits,$n,1);
- }
- return $ip6;
+ my ($ip6net, $subnet, $ip6host) = @_;
+ my $netdigits = ip6full($ip6net);
+ $netdigits =~ tr/://d;
+ my $hostdigits = ip6full($ip6host);
+ $hostdigits =~ tr/://d;
+ my $digits = substr($netdigits,0,($subnet/4)).substr($hostdigits,($subnet/4));
+ my $ip6;
+ for (my $n = 0; $n < 32; $n++) {
+ if ($n > 0 && $n % 4 == 0) {
+ $ip6 .= ":";
+ }
+ $ip6 .= substr($digits,$n,1);
+ }
+ return $ip6;
}
+
+
sub randip6 {
return join ':', map { sprintf '%04x', rand 0x10000 } (1 .. 8);
}
# create A and AAAA records for subdomain, set the rDNS,
# and return the new ipv6 address
sub nextdns {
+ my $self = shift;
+ # Verify we were called in object mode or return $self to the param list
+ if (not UNIVERSAL::isa($self, 'IRCNOW::Acct::DNS')) {
+ unshift @_, $self;
+ $self = $conf;
+ }
+
my ($subdomain) = @_;
- my $newip6 = $ip6;
- my @allip6s = readip6s($hostnameif);
+ my $newip6 = $self->{ip6};
+ my @allip6s = readip6s($self->{hostnameif});
while (grep(/$newip6/, @allip6s)) {
- $newip6 = ip6mask($ip6, $ip6subnet,randip6());
+ $newip6 = ip6mask($self->{ip6}, $self->{ip6subnet},randip6());
}
- appendfile($hostnameif, "inet6 alias $newip6 48\n");
+ appendfile($self->{hostnameif}, "inet6 alias $newip6 48\n");
+ # activate new ip as an alias
`doas ifconfig vio0 inet6 $newip6/48`;
- if (setdns($subdomain, $hostname, "A", $ip4) && setdns($subdomain, $hostname, "AAAA", $newip6) && setrdns($newip6, $ip6subnet, "$subdomain.$hostname")) {
+ if (setdns($subdomain, $self->{hostname}, "A", $self->{ip4})
+ && setdns($subdomain, $self->{hostname}, "AAAA", $newip6)
+ && setrdns($newip6, $self->{ip6subnet}, "$subdomain." . $self->{hostname})) {
return "$newip6";
}
return "false";
blob - 168758b950c0800feb0cee47239e4e1d5bceab38
blob + 01042fc74779dccdcd0d41343dd48b45dc84c389
--- lib/IRCNOW/IO.pm
+++ lib/IRCNOW/IO.pm
package IRCNOW::IO;
use strict;
use warnings;
-
+use Carp;
use Exporter 'import';
our @EXPORT_OK = qw(
# Read from filename and return array of lines without trailing newlines
sub readarray {
my ($filename) = @_;
- open(my $fh, '<', $filename) or die "Could not read file '$filename' $!";
+ open(my $fh, '<', $filename) or carp "Could not read file '$filename' $!";
chomp(my @lines = <$fh>);
close $fh;
return @lines;
# Read from filename and return as string
sub readstr {
my ($filename) = @_;
- open(my $fh, '<', $filename) or die "Could not read file '$filename' $!";
+ open(my $fh, '<', $filename) or carp "Could not read file '$filename' $!";
my $str = do { local $/; <$fh> };
close $fh;
return $str;
sub writefile {
my ($filename, $str) = @_;
my $date = date();
- copy($filename, $backupspath.basename($filename).".".date()) or die "Could not make backup of $filename";
- open(my $fh, '>', "$filename") or die "Could not write to $filename";
+ copy($filename, $backupspath.basename($filename).".".date()) or carp "Could not make backup of $filename - $!";
+ open(my $fh, '>', "$filename") or carp "Could not write to $filename";
print $fh $str;
close $fh;
}
# Append str to filename
sub appendfile {
my ($filename, $str) = @_;
- open(my $fh, '>>', "$filename") or die "Could not append to $filename";
+ open(my $fh, '>>', "$filename") or carp "Could not append to $filename";
print $fh $str;
close $fh;
}
$body
EOF
-open(my $fh, "| /usr/sbin/sendmail -tv -F '$fromname' -f $from") or die "Could not send mail $!";
+open(my $fh, "| /usr/sbin/sendmail -tv -F '$fromname' -f $from") or carp "Could not send mail $!";
print $fh $msg;
close $fh;
return "true";