#!/usr/bin/env python
# encoding: utf-8
# Created by Chris AtLee on 2008-11-04
"""count_and_reboot.py [-n maxcount] -f countfile

Increments the value in countfile, and reboots the machine once the count
reaches or exceeds maxcount."""

import os
import sys
import time

if sys.platform in ('darwin', 'linux2'):
    def reboot():
        # -S means to accept password from stdin, which we then redirect from
        # /dev/null
        # This results in sudo not waiting forever for a password.  If sudoers
        # isn't set up properly, this will fail immediately
        os.system("sudo -S reboot < /dev/null")
        # After starting the shutdown, we go to sleep since the system can
        # take a few minutes to shut everything down and reboot
        time.sleep(600)

elif sys.platform == "win32":
    # Windows
    def reboot():
        os.system("shutdown -f -r -t 0")
        # After starting the shutdown, we go to sleep since the system can
        # take a few minutes to shut everything down and reboot
        time.sleep(600)


def increment_count(fname):
    try:
        current_count = int(open(fname).read())
    except:
        current_count = 0
    current_count += 1
    open(fname, "w").write("%i\n" % current_count)
    return current_count

if __name__ == '__main__':
    from optparse import OptionParser

    parser = OptionParser(__doc__)
    parser.add_option("-n", "--max-count", dest="maxcount", default=10,
                      help="reboot after <maxcount> runs", type="int")
    parser.add_option("-f", "--count-file", dest="countfile", default=None,
                      help="file to record count in")
    parser.add_option("-z", "--zero-count", dest="zero", default=False,
                      action="store_true", help="zero out the counter before rebooting")

    options, args = parser.parse_args()

    if not options.countfile:
        parser.error("countfile is required")

    if increment_count(options.countfile) >= options.maxcount:
        if options.zero:
            open(options.countfile, "w").write("0\n")
        print "************************************************************************************************"
        print "*********** END OF RUN - NOW DOING SCHEDULED REBOOT; FOLLOWING ERROR MESSAGE EXPECTED **********"
        print "************************************************************************************************"
        sys.stdout.flush()
        reboot()
