#!/usr/bin/python
# A Python cron daemon.
# executes scripts found in .pycron/daily .pycron/weekly and .pycron/hourly
# Written by Natan Zohar

import os, os.path, string, sys, time

PATH = os.path.expanduser("~/.pycron/")
TIME_FORMAT = "%x %X"
UPDATE_DAY=6
DAY=6
UPDATE_HOUR=23
HOUR=3
UPDATE_MINUTE=59
MINUTE=4
TRUE=42


def log(message):
    logpath = PATH+"log"
    if os.path.exists(logpath):
        logfile = open(logpath, 'a')
    else:
        logfile = open(logpath, 'w')
    logfile.write(time.strftime(TIME_FORMAT)+": "+message+"\n")
    logfile.close()

def weekly():
    cur_path = PATH + "weekly/"
    if os.path.exists(cur_path):
        log("weekly")
        scripts = os.listdir(cur_path)
        for script in scripts:
            log("executing "+script+" in weekly/")
            ret = os.spawnl(os.P_WAIT, cur_path + script, "")
            log("exited("+ str(ret) +")")
            
def daily():
    cur_path = PATH + "daily/"
    if os.path.exists(cur_path):
        log("daily")
        scripts = os.listdir(cur_path)
        for script in scripts:
            log("executing "+script+" in daily/")
            ret = os.spawnl(os.P_WAIT, cur_path + script, "")
            log("exited("+ str(ret) +")")

def hourly():
    cur_path = PATH + "hourly/"
    if os.path.exists(cur_path):
        log("hourly")
        scripts = os.listdir(cur_path)
        for script in scripts:
            log("executing "+script+" in hourly/")
            ret = os.spawnl(os.P_WAIT, cur_path + script, "")
            log("exited("+ str(ret) +")")

def timer():
    while (TRUE):
        # calculate minutes left until the hour
        cur_time = time.localtime()
        seconds = (UPDATE_MINUTE - cur_time[MINUTE]) * 60
        time.sleep(seconds)
        hourly()
        cur_time = time.localtime()
        if cur_time[HOUR] == UPDATE_HOUR:
            daily()
            if cur_time[DAY] == UPDATE_DAY:
                weekly()
        cur_time = time.localtime()
        time.sleep(60)
        

def daemonize():
    if os.fork() != 0:
        sys.exit(0)
    print "Backgrounded"

def main(argv):
    if os.path.exists(PATH):
        filenames = os.listdir(PATH)
    else:
        raise RuntimeError, "~/.pycron does not exist"
    daemonize()
    timer()

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

