]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - .inspircd.inc
More cleanup
[user/henk/code/inspircd.git] / .inspircd.inc
1 #!/usr/bin/perl
2 #       +------------------------------------+
3 #       | Inspire Internet Relay Chat Daemon |
4 #       +------------------------------------+
5 #
6 #  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
7 #                       E-mail:
8 #                <brain@chatspike.net>
9 #                <Craig@chatspike.net>
10 #
11 # Written by Craig Edwards, Craig McLure, and others.
12 # This program is free but copyrighted software; see
13 #            the file COPYING for details.
14 #
15 #               I HATE PERL.. kthxbye
16 # ---------------------------------------------------
17
18 my $confpath = "@CONFIG_DIR@/";
19 my $binpath = "@BINARY_DIR@";
20 my $libpath = "@LIBRARY_DIR@";
21 my $executable = "@EXECUTABLE@";
22 my @filesparsed;
23
24 # Lets see what they want to do.. Set the variable (Cause i'm a lazy coder)
25 my $arg = $ARGV[0];
26 getpidfile($confpath."inspircd.conf");
27
28 if ($arg eq "start") { start(); exit(); }
29 if ($arg eq "debug") { debug(); exit(); }
30 if ($arg eq "stop") { stop(); exit(); }
31 if ($arg eq "status") {
32         if (getstatus() == 1) { 
33                 my $pid = getprocessid();
34                 print "InspIRCd is running (PID: $pid)\n";
35                 exit();
36         } else {
37                 print "InspIRCd is not running. (Or PID File not found)\n";
38                 exit();
39         }
40 }
41 if ($arg eq "rehash") {
42         if (getstatus() == 1) {
43                 my $pid = getprocessid();
44                 system("kill -HUP $pid >/dev/null 2>&1");
45                 print "InspIRCd rehashed.\n";
46                 exit();
47         } else {
48                 print "InspIRCd is not running. (Or PID File not found)\n";
49                 exit();
50         }
51 }
52
53 if ($arg eq "cron") {
54         if (getstatus() == 0) { start(); }
55         exit();
56 }
57
58 if ($arg eq "restart") {
59         stop();
60         start();
61         # kthxbye();
62         exit();
63 }
64
65 if ($arg eq "Cheese-Sandwich") {
66         print "Creating Cheese Sandwich..\n";
67         print "Done.\n";
68         exit();
69 }
70
71 ###
72 # If we get here.. bad / no parameters.
73 ###
74 print "Invalid Argument: $arg\n";
75 print "Usage: inspircd (start|stop|restart|rehash|status|cron)\n";
76 exit();
77
78 ###
79 # Generic Helper Functions.
80 ###
81
82 sub start {
83         # Check to see its not 'running' already.
84         if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; }
85         # If we are still alive here.. Try starting the IRCd..
86         system("$binpath/$executable");
87         return 1;
88 }
89
90 sub debug {
91         # Check to see its not 'running' already.
92         if (getstatus() == 1) { print "InspIRCd is already running.\n"; return 0; }
93         # If we are still alive here.. Try starting the IRCd..
94         system("gdb --eval-command=\"handle SIGPIPE pass nostop noprint\" --eval-command=\"run\" --args $binpath/$executable -nofork -debug");
95 }
96
97
98 sub stop {
99         if (getstatus() == 0) { print "InspIRCd is not running. (Or PID File not found)\n"; return 0; }
100         # Get to here, we have something to kill.
101         my $pid = getprocessid();
102         print "Stopping InspIRCd...\n";
103         system("kill -TERM $pid >/dev/null 2>&1");
104         if (getstatus() == 1)
105         {
106                 print "InspIRCd not dying Quietly -- Forcing Kill\n";
107                 system("kill -9 $pid >/dev/null 2>&1");
108         }
109         print "InspIRCd Stopped.\n";
110 }
111
112 # GetPidfile Version 2 - Now With Include Support..
113 # I beg for months for include support in insp, then.. 
114 # when it is added, it comes around and BITES ME IN THE ASS,
115 # because i then have to code support into this script.. Evil.
116
117 sub getpidfile {
118   my ($file) = @_;
119   # Before we start, do we have a PID already? (Should never occur)
120   if ($pid ne "") {
121     return;
122   }
123   # Are We using a relative path?
124   if ($file !~ /^\//) {
125     # Convert it to a full path..
126     $file = $confpath . $file;
127   }
128
129   # Have we checked this file before?
130   for (my $i = 0; $i < $filesparsed; $i++) {
131     if ($filesparsed[$i] eq $file) {
132       # Already Parsed, Possible recursive loop..
133       return;
134     }
135   }
136   
137   # If we get here, Mark as 'Read'
138   $filesparsed[$filesparsed] = $file;
139
140   # Open the File..
141   open INFILE, "< $file" or die "Unable to Open file $file\n";
142   # Grab entire file contents..
143   my(@lines) = <INFILE>;
144   # Close the file
145   close INFILE;
146
147   # Clean up the file, no newlines etc..
148   chomp(@lines);
149   foreach $i (@lines) {
150     $i =~ s/[^=]+=\s(.*)/\1/;
151   }
152   my $tmp = join("",@lines);
153
154   # Does this file have a pid?
155   if ($tmp =~ /<pid file=\"(\S+)\">/i) {
156     # Set the PID file and return.
157     $pidfile = $1;
158     return;
159   }
160
161   # If we get here, NO PID FILE! -- Check for includes (Seeing as we will eventually return,
162   # The while (1) is safe.)
163   while (1) {
164     if ($tmp =~ s/\<include file=\"(.+?)\"\>//i)
165     {
166       # Decend into that file, and check for PIDs.. (that sounds like an STD ;/)
167       getpidfile($1);
168       # Was a PID found?
169       if ($pidfile ne "") {
170         # Yes, Return.
171         return;
172       }
173     } else {
174       # End of includes / No includes found.
175       return;
176     }
177   }
178 }
179
180 sub getstatus {
181         my $pid = getprocessid();
182         if ($pid == 0) { return 0; }
183         $status = system("kill -0 $pid >/dev/null 2>&1") / 256;
184         if ($status == 0) { return 1; }
185         else { return 0; }
186 }
187
188
189 sub getprocessid {
190         my $pid;
191         open PIDFILE, "< $pidfile" or return 0;
192         while($i = <PIDFILE>)
193         {
194                 $pid = $i;
195         }
196         close PIDFILE;
197         return $pid;
198 }