-#!/usr/bin/perl
-# +------------------------------------+
-# | Inspire Internet Relay Chat Daemon |
-# +------------------------------------+
+%mode 0750
+#!/usr/bin/env perl
+
+#
+# InspIRCd -- Internet Relay Chat Daemon
+#
+# Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
#
-# InspIRCd: (C) 2002-2009 InspIRCd Development Team
-# See: http://wiki.inspircd.org/Credits
+# This file is part of InspIRCd. InspIRCd is free software: you can
+# redistribute it and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation, version 2.
#
-# This program is free but copyrighted software; see
-# the file COPYING for details.
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
#
-# ---------------------------------------------------
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
+
+
use strict;
use POSIX;
use Fcntl;
my $confpath = "@CONFIG_DIR@/";
my $binpath = "@BINARY_DIR@";
my $runpath = "@BASE_DIR@";
+my $datadir = "@DATA_DIR@";
my $valgrindlogpath = "$basepath/valgrindlogs";
-my $executable = "@EXECUTABLE@";
-my $version = "@VERSION@";
+my $executable = "inspircd";
+my $version = "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@+@VERSION_LABEL@";
+my $uid = "@UID@";
+
+if (!("--runasroot" ~~ @ARGV) && ($< == 0 || $> == 0)) {
+ if ($uid !~ /^\d+$/) {
+ # Named UID, look it up
+ $uid = getpwnam $uid;
+ }
+ if (!$uid) {
+ die "Cannot find a valid UID to change to";
+ }
+ # drop root if we were configured with an ircd UID
+ $< = $uid;
+ $> = $uid;
+ if ($< == 0 || $> == 0) {
+ die "Could not drop root: $!";
+ }
+}
our($pid,$pidfile);
# Lets see what they want to do.. Set the variable (Cause i'm a lazy coder)
checkgdb();
# If we are still alive here.. Try starting the IRCd..
- exec 'gdb', "--command=$basepath/.gdbargs", '--args', "$binpath/$executable", qw(-nofork -debug), @_;
+ exec 'gdb', "--command=$basepath/.gdbargs", '--args', "$binpath/$executable", qw(--nofork --debug), @_;
die "Failed to start GDB: $!\n";
}
# If we are still alive here.. Try starting the IRCd..
print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the gdb output and get a backtrace.\n";
print "Once you're inside the screen session press ^C + d to re-detach from the session\n";
- exec qw(screen -m -d gdb), "--comand=$basepath/.gdbargs", '-args', "$binpath/$executable", qw(-nofork -debug -nolog), @_;
+ exec qw(screen -m -d gdb), "--command=$basepath/.gdbargs", '-args', "$binpath/$executable", qw(--nofork --debug --nolog), @_;
die "Failed to start screen: $!\n";
}
# If we are still alive here.. Try starting the IRCd..
# May want to do something with these args at some point: --suppressions=.inspircd.sup --gen-suppressions=yes
# Could be useful when we want to stop it complaining about things we're sure aren't issues.
- exec qw(valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_;
+ exec qw(valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(--nofork --debug --nolog), @_;
die "Failed to start valgrind: $!\n";
}
exec qw(valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --num-callers=15 --track-fds=yes),
"--suppressions=$binpath/valgrind.sup", qw(--gen-suppressions=all),
qw(--leak-resolution=med --time-stamp=yes --log-fd=2 --),
- "$binpath/$executable", qw(-nofork -debug -nolog), @_;
+ "$binpath/$executable", qw(--nofork --debug --nolog), @_;
die "Can't execute valgrind: $!\n";
}
}
# If we are still alive here.. Try starting the IRCd..
print "Starting InspIRCd in `screen`, type `screen -r` when the ircd crashes to view the valgrind and gdb output and get a backtrace.\n";
print "Once you're inside the screen session press ^C + d to re-detach from the session\n";
- exec qw(screen -m -d valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(-nofork -debug -nolog), @_;
+ exec qw(screen -m -d valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10), "$binpath/$executable", qw(--nofork --debug --nolog), @_;
die "Failed to start screen: $!\n";
}
}
# End of includes / No includes found. Using default.
- $pidfile = $runpath . "/data/inspircd.pid";
+ $pidfile = $datadir . "/inspircd.pid";
}
sub getstatus {
sub getprocessid {
- my $pid;
- open PIDFILE, "< $pidfile" or return 0;
+ my $pid = 0;
+ open PIDFILE, '<', $pidfile or return 0;
while(<PIDFILE>)
{
- $pid = $_;
+ /^(\d+)$/ and $pid = $1;
}
close PIDFILE;
return $pid;
exit;
}
}
-
-sub checkxmllint
-{
- open(FH, "xmllint|") or die "Couldn't start xmllint: $!\n";
-}
-
-sub cmd_checkconf()
-{
- checkxmllint();
- validateconf($conf);
- print "Config check complete\n";
- exit 0;
-}
-
-my %filechecked;
-
-sub validateconf
-{
- my ($file) = @_;
-
- # Are We using a relative path?
- if ($file !~ /^\//) {
- # Convert it to a full path..
- $file = $runpath . $file;
- }
-
- # Have we checked this file before?
- return if $filechecked{$file};
- $filechecked{$file} = 1;
-
- # Open the File..
- open INFILE, "< $file" or die "Unable to open file $file\n";
- # Grab entire file contents..
- my(@lines) = <INFILE>;
- # Close the file
- close INFILE;
-
- # remove trailing spaces
- chomp(@lines);
-
- my @newlines = ();
- my @blanks = ();
- my $conline;
-
- push @newlines, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>";
-# push @newlines, "<!DOCTYPE config SYSTEM \"".$confpath."inspircd.dtd\">";
- push @newlines, "<config>";
-
- for my $i (@lines)
- {
- # remove trailing newlines
- chomp($i);
-
- # convert tabs to spaces
- $i =~ s/\t/ /g;
-
- # remove leading spaces
- $i =~ s/^ *//;
-
- # remove comments
- $i =~ s/^#.*//;
-
- # remove trailing #s
- $i =~ s/(.*)#$/\1/;
-
- # remove trailing comments
- my $line = "";
- my $quote = 0;
- for (my $j = 0; $j < length($i); $j++)
- {
- if (substr($i,$j, 1) eq '"') { $quote = ($quote) ? 0 : 1; } elsif (substr($i,$j, 1) eq "#" && !$quote) { last; }
- $line .= substr($i,$j, 1);
- }
- $i = $line;
-
- # remove trailing spaces
- $i =~ s/ *$//;
-
- # setup incf for include check and clean it up, since this breaks parsing use local var
- my $incf = $i;
- $incf =~ s/[^=]+=\s(.*)/\1/;
-
- # include file?
- if (($incf =~ s/\<include file=\"(.+?)\"\>//i) && ($incf !~ /^#/))
- {
- # yes, process it
- validateconf($1);
- }
-
- if ($i =~ /^<.*/ && $conline =~ /^<.*/)
- {
- push @newlines, $conline;
- push @newlines, @blanks;
- $conline = $i;
- }
-
- if ($i =~ /^<.*>$/)
- {
- $i =~ s/(.*)>$/\1 \/>/;
- push @newlines, $i;
- }
- elsif ($i =~ /.*>$/)
- {
- $conline .= " $i";
- $conline =~ s/(.*)>$/\1 \/>/;
- push @blanks, "";
- push @newlines, $conline;
- push @newlines, @blanks;
- $conline = "";
- undef @blanks;
- }
- elsif ($i =~ /^<.*/)
- {
- $conline = $i;
- }
- elsif ($conline =~ /^<.*/ && $i)
- {
- $conline .= " $i";
- push @blanks, "";
- }
- else
- {
- if ($conline)
- {
- push @blanks, $i;
- }
- else
- {
- push @newlines, $i;
- }
- }
- }
- if ($conline)
- {
- push @newlines, $conline;
- push @newlines, @blanks;
- }
-
- push @newlines, "</config>";
-
- my $tmpfile;
- do
- {
- $tmpfile = tmpnam();
- } until sysopen(TF, $tmpfile, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, 0700);
-
- for my $n (@newlines)
- {
- print TF "$n\n";
- }
- close TF;
-
- my @result = `xmllint -noout $tmpfile 2>&1`;
- chomp(@result);
-
- my $skip = 0;
- for my $n (@result)
- {
- if ($skip)
- {
- $skip = 0;
- next;
- }
- $n =~ s/$tmpfile\:\d*\: *//g;
- if ($n =~ /.*config>.*/)
- {
- $n = "";
- $skip = 1;
- }
-
- if ($n && !$skip)
- {
- if ($n =~ /line \d*/)
- {
- my $lineno = $n;
- $lineno =~ s/.*line (\d*).*/\1/;
- $lineno = $lineno-2;
- $n =~ s/line (\d*)/line $lineno/;
- }
- print "$file : $n\n";
- }
- }
- unlink($tmpfile);
-}