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