#!/usr/bin/env python
# Copyright (c) 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""This script should be run on a Swarming bot as part of leasing.skia.org."""

import argparse
import json
import os
import sys
import time
import urllib2


POLLING_WAIT_TIME_SECS = 60


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('-s', '--leasing-server', required=True, type=str,
                      help='The leasing server this script will poll.')
  parser.add_argument('-t', '--task-id', required=True, type=str,
                      help='The taskID of this swarming task.')
  parser.add_argument('-o', '--os-type', required=True, type=str,
                      help='The Os Type this script is running on.')
  parser.add_argument('-c', '--debug-command', required=True, type=str,
                      help='The command users can use to run the debug task.')
  parser.add_argument('-r', '--command-relative-dir', required=True, type=str,
                      help='The directory the command should be run in.')
  args = parser.parse_args()

  if args.debug_command:
    print 'Files are mapped into: '
    print os.getcwd()
    print
    print 'Original command: '
    print args.debug_command
    print
    print 'Dir to run command in: '
    print os.path.join(os.getcwd(), args.command_relative_dir)
    print
  print
  print ('Please cleanup after you are done debugging or when you get the '
         '15 min warning email!')
  sys.stdout.flush()

  while True:
    get_task_status_url = '%s/_/get_task_status?task=%s' % (
        args.leasing_server, args.task_id)
    try:
      resp = urllib2.urlopen(get_task_status_url)
      output = json.load(resp)
      if output['Expired']:
        break
    except urllib2.HTTPError as e:
      print 'Could not contact the leasing server: %s' % e

    time.sleep(POLLING_WAIT_TIME_SECS)

  print 'The lease time has expired.'
  print 'Failing the task so that swarming reboots the host.'
  # Fail the task so that swarming reboots the host. This will force all SSH'ed
  # users to disconnect.
  return 1


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