14b1b1ae7SBrad Fitzpatrick#!/usr/bin/perl -w 24b1b1ae7SBrad Fitzpatrick 34b1b1ae7SBrad Fitzpatrick# start-memcached 46fb61adaSJay Bonci# 2003/2004 - Jay Bonci <[email protected]> 54b1b1ae7SBrad Fitzpatrick# This script handles the parsing of the /etc/memcached.conf file 64b1b1ae7SBrad Fitzpatrick# and was originally created for the Debian distribution. 74b1b1ae7SBrad Fitzpatrick# Anyone may use this little script under the same terms as 84b1b1ae7SBrad Fitzpatrick# memcached itself. 94b1b1ae7SBrad Fitzpatrick 10e04ca9b7SClint Byrumuse POSIX qw(setsid); 114b1b1ae7SBrad Fitzpatrickuse strict; 124b1b1ae7SBrad Fitzpatrick 134b1b1ae7SBrad Fitzpatrickif($> != 0 and $< != 0) 144b1b1ae7SBrad Fitzpatrick{ 154b1b1ae7SBrad Fitzpatrick print STDERR "Only root wants to run start-memcached.\n"; 164b1b1ae7SBrad Fitzpatrick exit; 174b1b1ae7SBrad Fitzpatrick} 184b1b1ae7SBrad Fitzpatrick 194b1b1ae7SBrad Fitzpatrickmy $params; my $etchandle; my $etcfile = "/etc/memcached.conf"; 206fb61adaSJay Bonci 216fb61adaSJay Bonci# This script assumes that memcached is located at /usr/bin/memcached, and 226fb61adaSJay Bonci# that the pidfile is writable at /var/run/memcached.pid 236fb61adaSJay Bonci 244b1b1ae7SBrad Fitzpatrickmy $memcached = "/usr/bin/memcached"; 254b1b1ae7SBrad Fitzpatrickmy $pidfile = "/var/run/memcached.pid"; 264b1b1ae7SBrad Fitzpatrick 271e52a254SGordon Frankeif (scalar(@ARGV) == 2) { 281e52a254SGordon Franke $etcfile = shift(@ARGV); 291e52a254SGordon Franke $pidfile = shift(@ARGV); 301e52a254SGordon Franke} 311e52a254SGordon Franke 326fb61adaSJay Bonci# If we don't get a valid logfile parameter in the /etc/memcached.conf file, 336fb61adaSJay Bonci# we'll just throw away all of our in-daemon output. We need to re-tie it so 346fb61adaSJay Bonci# that non-bash shells will not hang on logout. Thanks to Michael Renner for 356fb61adaSJay Bonci# the tip 366fb61adaSJay Boncimy $fd_reopened = "/dev/null"; 376fb61adaSJay Bonci 386fb61adaSJay Boncisub handle_logfile 396fb61adaSJay Bonci{ 406fb61adaSJay Bonci my ($logfile) = @_; 416fb61adaSJay Bonci $fd_reopened = $logfile; 426fb61adaSJay Bonci} 436fb61adaSJay Bonci 446fb61adaSJay Boncisub reopen_logfile 456fb61adaSJay Bonci{ 466fb61adaSJay Bonci my ($logfile) = @_; 476fb61adaSJay Bonci 486fb61adaSJay Bonci open *STDERR, ">>$logfile"; 496fb61adaSJay Bonci open *STDOUT, ">>$logfile"; 506fb61adaSJay Bonci open *STDIN, ">>/dev/null"; 516fb61adaSJay Bonci $fd_reopened = $logfile; 526fb61adaSJay Bonci} 536fb61adaSJay Bonci 546fb61adaSJay Bonci# This is set up in place here to support other non -[a-z] directives 556fb61adaSJay Bonci 566fb61adaSJay Boncimy $conf_directives = { 576fb61adaSJay Bonci "logfile" => \&handle_logfile, 586fb61adaSJay Bonci}; 596fb61adaSJay Bonci 604b1b1ae7SBrad Fitzpatrickif(open $etchandle, $etcfile) 614b1b1ae7SBrad Fitzpatrick{ 624b1b1ae7SBrad Fitzpatrick foreach my $line (<$etchandle>) 634b1b1ae7SBrad Fitzpatrick { 644b1b1ae7SBrad Fitzpatrick $line ||= ""; 654b1b1ae7SBrad Fitzpatrick $line =~ s/\#.*//g; 664b1b1ae7SBrad Fitzpatrick $line =~ s/\s+$//g; 674b1b1ae7SBrad Fitzpatrick $line =~ s/^\s+//g; 684b1b1ae7SBrad Fitzpatrick next unless $line; 696fb61adaSJay Bonci next if $line =~ /^\-[dh]/; 706fb61adaSJay Bonci 716fb61adaSJay Bonci if($line =~ /^[^\-]/) 726fb61adaSJay Bonci { 736fb61adaSJay Bonci my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/; 746fb61adaSJay Bonci $conf_directives->{$directive}->($arg); 756fb61adaSJay Bonci next; 766fb61adaSJay Bonci } 774b1b1ae7SBrad Fitzpatrick 784b1b1ae7SBrad Fitzpatrick push @$params, $line; 794b1b1ae7SBrad Fitzpatrick } 804b1b1ae7SBrad Fitzpatrick 814b1b1ae7SBrad Fitzpatrick}else{ 824b1b1ae7SBrad Fitzpatrick $params = []; 834b1b1ae7SBrad Fitzpatrick} 844b1b1ae7SBrad Fitzpatrick 854b1b1ae7SBrad Fitzpatrickpush @$params, "-u root" unless(grep "-u", @$params); 864b1b1ae7SBrad Fitzpatrick$params = join " ", @$params; 874b1b1ae7SBrad Fitzpatrick 884b1b1ae7SBrad Fitzpatrickif(-e $pidfile) 894b1b1ae7SBrad Fitzpatrick{ 904b1b1ae7SBrad Fitzpatrick open PIDHANDLE, "$pidfile"; 914b1b1ae7SBrad Fitzpatrick my $localpid = <PIDHANDLE>; 924b1b1ae7SBrad Fitzpatrick close PIDHANDLE; 934b1b1ae7SBrad Fitzpatrick 944b1b1ae7SBrad Fitzpatrick chomp $localpid; 954b1b1ae7SBrad Fitzpatrick if(-d "/proc/$localpid") 964b1b1ae7SBrad Fitzpatrick { 974b1b1ae7SBrad Fitzpatrick print STDERR "memcached is already running.\n"; 984b1b1ae7SBrad Fitzpatrick exit; 994b1b1ae7SBrad Fitzpatrick }else{ 100*00b34fd9SCameron Norman unlink $pidfile; 1014b1b1ae7SBrad Fitzpatrick } 1024b1b1ae7SBrad Fitzpatrick 1034b1b1ae7SBrad Fitzpatrick} 1044b1b1ae7SBrad Fitzpatrick 1054b1b1ae7SBrad Fitzpatrickmy $pid = fork(); 1064b1b1ae7SBrad Fitzpatrick 1074b1b1ae7SBrad Fitzpatrickif($pid == 0) 1084b1b1ae7SBrad Fitzpatrick{ 109e04ca9b7SClint Byrum # setsid makes us the session leader 110e04ca9b7SClint Byrum setsid(); 1116fb61adaSJay Bonci reopen_logfile($fd_reopened); 112e04ca9b7SClint Byrum # must fork again now that tty is closed 113e04ca9b7SClint Byrum $pid = fork(); 114e04ca9b7SClint Byrum if ($pid) { 1154b1b1ae7SBrad Fitzpatrick if(open PIDHANDLE,">$pidfile") 1164b1b1ae7SBrad Fitzpatrick { 1174b1b1ae7SBrad Fitzpatrick print PIDHANDLE $pid; 1184b1b1ae7SBrad Fitzpatrick close PIDHANDLE; 1194b1b1ae7SBrad Fitzpatrick }else{ 1204b1b1ae7SBrad Fitzpatrick 1214b1b1ae7SBrad Fitzpatrick print STDERR "Can't write pidfile to $pidfile.\n"; 1224b1b1ae7SBrad Fitzpatrick } 12332cb4949SNate exit(0); 12432cb4949SNate } 12532cb4949SNate exec "$memcached $params"; 12632cb4949SNate exit(0); 12732cb4949SNate 1284b1b1ae7SBrad Fitzpatrick} 129