|
|
@@ -0,0 +1,115 @@
|
|
|
+#!@l_prefix@/bin/perl
|
|
|
+##
|
|
|
+## ircii.pl -- ircII command line wrapper (for optional SSL support)
|
|
|
+##
|
|
|
+
|
|
|
+require 5.008;
|
|
|
+use strict;
|
|
|
+use warnings;
|
|
|
+use IO::File;
|
|
|
+use Getopt::Long;
|
|
|
+use File::Temp qw(tempfile tempdir);
|
|
|
+
|
|
|
+# external programs
|
|
|
+my $irc = '@l_prefix@/libexec/ircii/irc';
|
|
|
+my $stunnel = '@l_prefix@/sbin/stunnel';
|
|
|
+
|
|
|
+# define command line options
|
|
|
+my $opt = {};
|
|
|
+my %options = (
|
|
|
+ # standard ircII options
|
|
|
+ 'c=s' => \$opt->{-c},
|
|
|
+ 'p=s' => \$opt->{-p},
|
|
|
+ 'P=s' => \$opt->{-P},
|
|
|
+ 'f' => \$opt->{-f},
|
|
|
+ 'F' => \$opt->{-F},
|
|
|
+ 'r' => \$opt->{-r},
|
|
|
+ 's' => \$opt->{-s},
|
|
|
+ 'S' => \$opt->{-S},
|
|
|
+ 'h=s' => \$opt->{-h},
|
|
|
+ 'H=s' => \$opt->{-H},
|
|
|
+ 'd' => \$opt->{-d},
|
|
|
+ 'q' => \$opt->{-q},
|
|
|
+ 'a' => \$opt->{-a},
|
|
|
+ 'b' => \$opt->{-b},
|
|
|
+ 'l=s' => \$opt->{-l},
|
|
|
+ 'I=s' => \$opt->{-I},
|
|
|
+ 't' => \$opt->{-t},
|
|
|
+ 'T' => \$opt->{-T},
|
|
|
+ 'i=s' => \$opt->{-i},
|
|
|
+ 'help' => \$opt->{-help},
|
|
|
+ # add-on wrapper options
|
|
|
+ 'ssl' => \$opt->{-ssl},
|
|
|
+);
|
|
|
+
|
|
|
+# parse command line options
|
|
|
+{
|
|
|
+ local @ARGV = @ARGV;
|
|
|
+ my $p = new Getopt::Long::Parser;
|
|
|
+ $p->configure("bundling");
|
|
|
+ $p->getoptions(%options) || die "option parsing failed";
|
|
|
+}
|
|
|
+
|
|
|
+# remove add-on option
|
|
|
+if (defined($opt->{-ssl})) {
|
|
|
+ for (my $i = 0; $i < @ARGV; $i++) {
|
|
|
+ if ($ARGV[$i] eq '--ssl') {
|
|
|
+ splice(@ARGV, $i, 1);
|
|
|
+ last;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+if (defined($opt->{-ssl})) {
|
|
|
+ # encrypted IRC-over-SSL connection
|
|
|
+ if (not -x $stunnel) {
|
|
|
+ print STDERR "irc:ERROR: stunnel(1) required -- please install \"stunnel\" package.\n";
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ # determine parameters
|
|
|
+ srand(time() ^ $$);
|
|
|
+ my $lhost = $opt->{-h};
|
|
|
+ my $lport = 60000 + int(rand() * 1000);
|
|
|
+ my $rhost = ((defined($ARGV[-1]) and $ARGV[-1] !~ m|^-|) ? $ARGV[-1] : "irc");
|
|
|
+ my $rport = ($opt->{-p} || 6667);
|
|
|
+
|
|
|
+ # start an SSL tunnel
|
|
|
+ my $tmpdir = tempdir("/tmp/ircII-XXXXXX", CLEANUP => 1);
|
|
|
+ my $pidfile = "$tmpdir/stunnel.pid";
|
|
|
+ my $logfile = "$tmpdir/stunnel.log";
|
|
|
+ my $cfgfile = "$tmpdir/stunnel.cfg";
|
|
|
+ my $io = new IO::File ">$cfgfile" || die;
|
|
|
+ $io->print(
|
|
|
+ "client = yes\n" .
|
|
|
+ "pid = $pidfile\n" .
|
|
|
+ "output = $logfile\n" .
|
|
|
+ "[ircs]\n" .
|
|
|
+ (defined($lhost) ?
|
|
|
+ "local = $lhost\n" : "") .
|
|
|
+ "accept = localhost:$lport\n" .
|
|
|
+ "connect = $rhost:$rport\n"
|
|
|
+ );
|
|
|
+ $io->close();
|
|
|
+ system $stunnel, $cfgfile;
|
|
|
+ sleep(1);
|
|
|
+
|
|
|
+ # manipulate ircII command line arguments
|
|
|
+ unshift(@ARGV, "-p", $lport);
|
|
|
+ $ARGV[-1] = "localhost";
|
|
|
+
|
|
|
+ # start ircII through SSL tunnel
|
|
|
+ my $rc = system $irc, @ARGV;
|
|
|
+
|
|
|
+ # shutdown SSL tunnel
|
|
|
+ system("kill `cat $pidfile 2>/dev/null`");
|
|
|
+ undef $tmpdir;
|
|
|
+
|
|
|
+ # exit with ircII return code
|
|
|
+ exit($rc);
|
|
|
+}
|
|
|
+else {
|
|
|
+ # unencrypted IRC connection
|
|
|
+ exec $irc, @ARGV;
|
|
|
+}
|
|
|
+
|