Commit Diff


commit - 36684717edbce0c82962bfe1cc406d07e1e53bc6
commit + b2b6fd905726aa542457f819ce4acd7799e198cc
blob - edd59f3042d5a57f11bf0ccbb9734409e0cbada1
blob + ff2df436c956bc21160f1837c8f91c7df654b8a1
--- BNC.pm
+++ BNC.pm
@@ -29,6 +29,9 @@ my $sslport = $conf{sslport};
 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" };
 
@@ -58,6 +61,36 @@ main::cbind("msgm", "-", "*", \&mcontrolpanel);
 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 $!";
@@ -66,6 +99,7 @@ sub init {
 	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";
@@ -74,6 +108,11 @@ sub init {
 	#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)
@@ -262,7 +301,7 @@ sub mforeach {
 	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");
 		}
 	}
@@ -363,7 +402,7 @@ LoadModule cloneuser chansaver
 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