#!/usr/bin/env ruby

require 'fileutils'

require 'grpc'

require_relative '../lib/gitaly_server.rb'

def main
  if ARGV.length != 2
    abort "Usage: #{$0} PPID /path/to/socket"
  end
  ppid, socket_path = ARGV

  ppid_i = ppid.to_i
  abort "invalid PPID: #{ppid.inspect}" unless ppid_i > 0
  start_parent_watcher(ppid_i)

  FileUtils.rm_f(socket_path)
  socket_dir = File.dirname(socket_path)
  FileUtils.mkdir_p(socket_dir)
  File.chmod(0700, socket_dir)

  s = GRPC::RpcServer.new
  port = 'unix:' + socket_path
  s.add_http2_port(port, :this_port_is_insecure)
  GRPC.logger.info("... running insecurely on #{port}")

  GitalyServer.register_handlers(s)

  s.run_till_terminated
end

def start_parent_watcher(original_ppid)
  Thread.new do
    loop do
      if Process.ppid != original_ppid
        # Our original parent is gone. Self-terminate.
        Process.kill(9, Process.pid)
      end

      sleep 1
    end
  end
end

main
