#!{{ python_executable }}
# -*- coding: utf-8 -*-

import sys
import os
import subprocess
import json
from cStringIO import StringIO

def main():
  if len(sys.argv) < 4:
    print("Usage: %s <pid_path> <output_path> <command...>" % sys.argv[0])
    return 2
  pid_path=sys.argv[1]
  output_path=sys.argv[2]
  if os.path.exists(pid_path):
    with open(pid_path, "r") as pidfile:
      try:
        pid = int(pidfile.read(6))
      except ValueError:
        pid = None
      if pid and os.path.exists("/proc/" + str(pid)):
        print("A process is already running with pid " + str(pid))
        return 1
  with open(pid_path, "w") as pidfile:
    process = executeCommand(sys.argv[3:])
    pidfile.write(str(process.pid))
  status_json = generateStatusJsonFromProcess(process)
  with open(output_path, "w") as outputfile:
    json.dump(status_json, outputfile)
  os.remove(pid_path)


def generateStatusJsonFromProcess(process):
  stdout, stderr = process.communicate()
  try:
    status_json = json.loads(stdout)
  except ValueError:
    status_json = {}
  if process.returncode != 0:
    status_json["status"] = "error"
  elif not status_json.get("status"):
    status_json["status"] = "OK"
  if stderr:
    status_json["error"] = stderr
  return status_json


def executeCommand(args):
  return subprocess.Popen(
    args,
    #cwd=instance_path,
    #env=None if sys.platform == 'cygwin' else {},
    stdin=None,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
  )

if __name__ == "__main__":
  sys.exit(main())
