commit - 36684717edbce0c82962bfe1cc406d07e1e53bc6
commit + b2b6fd905726aa542457f819ce4acd7799e198cc
blob - edd59f3042d5a57f11bf0ccbb9734409e0cbada1
blob + ff2df436c956bc21160f1837c8f91c7df654b8a1
--- BNC.pm
+++ BNC.pm
my $plainport = $conf{plainport};
my $mailfrom = $conf{mailfrom};
my $mailname = $conf{mailname};
+# File containing IRC networks
+my $netpath = "networks";
+my @networks;
#my $zncconfpath = $conf{zncconfpath} || "$zncdir/.znc/configs/znc.conf";
my $znctree = { Node => "root" };
main::cbind("msg", "-", "taillog", \&mtaillog);
main::cbind("msg", "-", "lastseen", \&mlastseen);
+# Return list of networks from filename
+# To add multiple servers for a single network, simply create a new entry with
+# the same net name; znc ignores addnetwork commands when a network already exists
+sub readnetworks {
+ my ($filename) = @_;
+ my @lines = main::readarray($filename);
+ my @networks;
+ foreach my $line (@lines) {
+ if ($line =~ /^#/ or $line =~ /^\s*$/) { # skip comments and whitespace
+ next;
+ } elsif ($line =~ /^\s*([-a-zA-Z0-9]+)\s*([-_.:a-zA-Z0-9]+)\s*(~|\+)?([0-9]+)\s*$/) {
+ my ($name, $server, $port) = ($1, $2, $4);
+ my $trustcerts;
+ if (!defined($3)) {
+ $trustcerts = 0;
+ } elsif ($3 eq "~") { # Use SSL but trust all certs
+ $port = "+".$port;
+ $trustcerts = 1;
+ } else { # Use SSL and verify certs
+ $port = "+".$port;
+ $trustcerts = 0;
+ }
+ push(@networks, {"name" => $name, "server" => $server, "port" => $port, "trustcerts" => $trustcerts });
+ } else {
+ die "network format invalid: $line\n";
+ }
+ }
+ return @networks;
+}
+
sub init {
#znc.conf file
#unveil("$zncconfpath", "r") or die "Unable to unveil $!";
unveil("/usr/lib/libc.so.95.1", "r") or die "Unable to unveil $!";
unveil("/usr/libexec/ld.so", "r") or die "Unable to unveil $!";
unveil("/usr/bin/tail", "rx") or die "Unable to unveil $!";
+ unveil("$netpath", "r") or die "Unable to unveil $!";
#znc.log file
#unveil("$znclog", "r") or die "Unable to unveil $!";
#print treeget($znctree, "AnonIPLimit")."\n";
#print "treeget\n";
#print Dumper \treeget($znctree, "User", "Node");
#print Dumper \treeget($znctree, "User", "Network", "Node");
+
+ @networks = readnetworks($netpath);
+
+ # networks must be sorted to avoid multiple connections
+ @networks = sort @networks;
}
# parseml($tree, @lines)
if ($staff !~ /$nick/) { return; }
if ($text =~ /^network\s+del\s+([[:graph:]]+)\s+(#[[:graph:]]+)$/) {
my ($user, $chan) = ($1, $2);
- foreach my $n (@main::networks) {
+ foreach my $n (@networks) {
main::putserv($bot, "PRIVMSG *controlpanel :delchan $user $n->{name} $chan");
}
}
EOF
#LoadModule cloneuser buffextras
main::putserv($bot, "PRIVMSG *controlpanel :$msg");
- foreach my $n (@main::networks) {
+ foreach my $n (@networks) {
my $net = $n->{name};
my $server = $n->{server};
my $port = $n->{port};
blob - 456d4c05620636017f5740d85390d00f0e1b00ea
blob + dcf14b3a7a1e6dbc1c1f984d43bbcc5cad7b271f
Binary files botnow and botnow differ