#!/usr/bin/env perl

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

use strict;
use warnings;

use Cwd qw/realpath/;
use Fcntl;
use File::Basename;
use FindBin;
use Getopt::Long qw/:config require_order gnu_compat/;

sub usage
{
  die "usage: $0 (--restart <service> | --tail <service> | --down) [-d <var dir>]\n";
}

# Parse arguments
my %opt = (
  'vardir' => realpath("$FindBin::Bin/../var"),
);

usage() unless GetOptions(\%opt, 'command=s', 'restart=s', 'down', 'tail=s', 'vardir|d=s');

my $svdir = "$opt{vardir}/sv";
my $command;

if ($opt{command}) {
  usage() if $command;
  $command = $opt{command};
}

if ($opt{down}) {
  usage() if $command;
  $command = 'd';
}

if ($opt{restart}) {
  usage() if $command;
  $command = "k $opt{restart}";
}

if ($opt{tail}) {
  usage() if $command;
  exec "tail", "-f", "$svdir/$opt{tail}.log"
    or die "exec failed: $!\n";
}

usage() unless $command;

my $fifofile = "$svdir/.ctrl";
sysopen my $fifofh, $fifofile, O_WRONLY or die "Can't open control fifo, perhaps supervise is not running: $!\n";
print $fifofh "$command\n";
close $fifofh;
