#!/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. '
                           'Eg: leasing.skia.org')
  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 = 'http://%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())
