X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=.inspircd.inc;h=71eb3a75430be6a377555347b0b40b59fdb855dc;hb=fd8932217922ea291f4102dffbfd66de4d5e9827;hp=e86ad18d482fc067b9bb44375f540e7c357dac0f;hpb=3f839fc4ed8652014ef2c377ebe36f4ccd065108;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/.inspircd.inc b/.inspircd.inc index e86ad18d4..71eb3a754 100644 --- a/.inspircd.inc +++ b/.inspircd.inc @@ -15,17 +15,23 @@ # I HATE PERL.. kthxbye # --------------------------------------------------- -$ENV{"LD_LIBRARY_PATH"} = $ENV{"LD_LIBRARY_PATH"} . ":/usr/local/lib/mysql:/usr/lib/mysql"; - -my $conffile = "@CONFIG_DIR@/inspircd.conf"; -my $binpath = "@BINARY_DIR@/inspircd"; +my $basepath = "@BASE_DIR@"; +my $confpath = "@CONFIG_DIR@/"; +my $binpath = "@BINARY_DIR@"; +my $libpath = "@LIBRARY_DIR@"; +my $executable = "@EXECUTABLE@"; +my $version = "@VERSION@"; +my @filesparsed; # Lets see what they want to do.. Set the variable (Cause i'm a lazy coder) my $arg = $ARGV[0]; -getpidfile(); +getpidfile($confpath."inspircd.conf"); if ($arg eq "start") { start(); exit(); } if ($arg eq "debug") { debug(); exit(); } +if ($arg eq "screendebug") { screendebug(); exit() } +if ($arg eq "valdebug") { valdebug(); exit(); } +if ($arg eq "screenvaldebug") { screenvaldebug(); exit(); } if ($arg eq "stop") { stop(); exit(); } if ($arg eq "status") { if (getstatus() == 1) { @@ -41,7 +47,7 @@ if ($arg eq "rehash") { if (getstatus() == 1) { my $pid = getprocessid(); system("kill -HUP $pid >/dev/null 2>&1"); - print "InspIRCd rehashed.\n"; + print "InspIRCd rehashed (pid: $pid).\n"; exit(); } else { print "InspIRCd is not running. (Or PID File not found)\n"; @@ -54,8 +60,14 @@ if ($arg eq "cron") { exit(); } +if ($arg eq "version") { + print "InspIRCd version: $version\n"; + exit(); +} + if ($arg eq "restart") { stop(); + unlink($pidfile) if (-e $pidfile); start(); # kthxbye(); exit(); @@ -71,7 +83,7 @@ if ($arg eq "Cheese-Sandwich") { # If we get here.. bad / no parameters. ### print "Invalid Argument: $arg\n"; -print "Usage: inspircd (start|stop|restart|rehash|status|cron)\n"; +print "Usage: inspircd (start|stop|restart|rehash|status|cron|version)\n"; exit(); ### @@ -82,63 +94,168 @@ sub start { # Check to see its not 'running' already. if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } # If we are still alive here.. Try starting the IRCd.. - system($binpath); - sleep 1; - if (getstatus() == 0) { - print "InspIRCd Seemingly not started, Log follows:\n"; - system("tail ircd.log"); - } else { - # We're good! - return 1; - } + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + system("$binpath/$executable"); + return 1; } sub debug { - # Check to see its not 'running' already. - if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } - # If we are still alive here.. Try starting the IRCd.. - system("gdb --args $binpath -nofork -debug"); - sleep 1; - if (getstatus() == 0) { - print "InspIRCd Seemingly not started, Log follows:\n"; - system("tail ircd.log"); - } else { - # We're good! - return 1; - } + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + # Check we have gdb + checkgdb(); + + # If we are still alive here.. Try starting the IRCd.. + system("gdb --command=$basepath/.gdbargs --args $binpath/$executable -nofork -debug -nolog"); } +sub screendebug +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + #Check we have gdb + checkgdb(); + checkscreen(); + + # 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"; + system("screen -m -d gdb --command=$basepath/.gdbargs --args $binpath/$executable -nofork -debug -nolog"); +} + +sub valdebug +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + # Check we have valgrind and gdb + checkvalgrind(); + checkgdb(); + + # 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. + system("valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10 $binpath/$executable -nofork -debug -nolog"); +} + +sub screenvaldebug +{ + # Check to see its not 'running' already. + if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; } + + print "$binpath/$executable doesn't exist\n" and return 0 unless(-e "$binpath/$executable"); + + #Check we have gdb + checkvalgrind(); + checkgdb(); + checkscreen(); + + # 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"; + system("screen -m -d valgrind -v --tool=memcheck --leak-check=yes --db-attach=yes --num-callers=10 $binpath/$executable -nofork -debug -nolog"); +} sub stop { - if (getstatus() == 0) { print "InspIRCd is not running. (Or PID File not found)"; return 0; } + if (getstatus() == 0) { print "InspIRCd is not running. (Or PID File not found)\n"; return 0; } # Get to here, we have something to kill. my $pid = getprocessid(); - print "Stopping InspIRCd...\n"; + print "Stopping InspIRCd (pid: $pid)...\n"; system("kill -TERM $pid >/dev/null 2>&1"); - sleep 2; + # Give it a second to exit + sleep(1); if (getstatus() == 1) { - print "InspIRCd not dying Quietly -- Forcing Kill\n"; + print "InspIRCd not dying quietly -- forcing kill\n"; system("kill -9 $pid >/dev/null 2>&1"); } print "InspIRCd Stopped.\n"; } +# GetPidfile Version 2 - Now With Include Support.. +# I beg for months for include support in insp, then.. +# when it is added, it comes around and BITES ME IN THE ASS, +# because i then have to code support into this script.. Evil. + +# Craig got bitten in the ass again -- +# in 1.1 beta the include file is manditory, therefore +# if we cant find it, default to %conf%/inspircd.pid. +# Note, this also contains a fix for when the pid file is +# defined, but defined in a comment (line starts with #) +# -- Brain sub getpidfile { - open INFILE, "< $conffile" or die "Couldn't open $conffile"; - my(@lines) = ; - close INFILE; - chomp(@lines); + my ($file) = @_; + # Before we start, do we have a PID already? (Should never occur) + if ($pid ne "") { + return; + } + # Are We using a relative path? + if ($file !~ /^\//) { + # Convert it to a full path.. + $file = $confpath . $file; + } - foreach $i (@lines) { - $i =~ s/[^=]+=\s(.*)/\1/; - } + # Have we checked this file before? + for (my $i = 0; $i < $filesparsed; $i++) { + if ($filesparsed[$i] eq $file) { + # Already Parsed, Possible recursive loop.. + return; + } + } + + # If we get here, Mark as 'Read' + $filesparsed[$filesparsed] = $file; + + # Open the File.. + open INFILE, "< $file" or die "Unable to open file $file\n"; + # Grab entire file contents.. + my(@lines) = ; + # Close the file + close INFILE; + + # Clean up the file, no newlines etc.. + chomp(@lines); + foreach $i (@lines) { + $i =~ s/[^=]+=\s(.*)/\1/; + } + my $tmp = join("",@lines); - my $tmp = join("",@lines); - $tmp =~ //i; + # Does this file have a pid? + if (($tmp =~ //i) && ($tmp !~ /^#/)) + { + # Set the PID file and return. + $pidfile = $1; + return; + } - $pidfile = $1; + # If we get here, NO PID FILE! -- Check for includes (Seeing as we will eventually return, + # The while (1) is safe.) + while (1) { + if (($tmp =~ s/\//i) && ($tmp !~ /^#/)) + { + # Decend into that file, and check for PIDs.. (that sounds like an STD ;/) + getpidfile($1); + # Was a PID found? + if ($pidfile ne "") { + # Yes, Return. + return; + } + } else { + # End of includes / No includes found. + $pidfile = $confpath . "inspircd.pid"; + return; + } + } } sub getstatus { @@ -160,3 +277,30 @@ sub getprocessid { close PIDFILE; return $pid; } + +sub checkvalgrind +{ + unless(`valgrind --version`) + { + print "Couldn't start valgrind: $!\n"; + exit; + } +} + +sub checkgdb +{ + unless(`gdb --version`) + { + print "Couldn't start gdb: $!\n"; + exit; + } +} + +sub checkscreen +{ + unless(`screen --version`) + { + print "Couldn't start screen: $!\n"; + exit; + } +}