#!/usr/bin/python3

import argparse
import os
import time

from grove import config as grove_config
from grove import deploy as grove_deploy
from grove import dirs as grove_dirs
from grove import util as grove_util

parser = argparse.ArgumentParser(description='Run a service command.')
parser.add_argument('--root', action='store_true', help='run as root instead of changing uid/gid')
parser.add_argument('--no-environment', action='store_true', help='skip setting up service environment')
parser.add_argument('argv', nargs='*')
args = parser.parse_args()

if len(args.argv) < 1:
  raise Exception("expected at least one argument")

config = grove_config.load_config()
homedir = config["homedir"]
user = config["user"]
group = config.get("group", None)
service_yaml, service_type = grove_deploy.read_deploy_json(grove_dirs.deployjson(homedir))

# Set up environment
if not args.no_environment:
  for var, value in grove_deploy.build_environment(service_yaml, service_type).items():
    os.environ[var] = value

# Sleep 2 seconds to prevent spinning
time.sleep(2)

# Set uid/gid
if not args.root:
  (uid, gid) = grove_util.getuidgid(user, group)
  os.setgid(gid)
  os.setuid(uid)

# Run command
command = args.argv
os.chdir(grove_dirs.deploydir(homedir))
os.execvpe(command[0], command, os.environ)
