#!/usr/bin/env python
import argparse
import imp
import inspect
import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
sys.path.append("/opt/planetstack")
from planetstack.config import Config
from util.logger import Logger, logging
from observer.syncstep import SyncStep

try:
    from django import setup as django_setup # django 1.7
except:
    django_setup = False

logger = Logger(level=logging.INFO)

class PlanetStackConsistencyCheck:
	def __init__(self):
                self.sync_steps = []
		self.load_sync_step_modules()

	def load_sync_step_modules(self, step_dir=None):
		if step_dir is None:
			if hasattr(Config(), "observer_steps_dir"):
				step_dir = Config().observer_steps_dir
			else:
				step_dir = "/opt/planetstack/observer/steps"

		for fn in os.listdir(step_dir):
			pathname = os.path.join(step_dir,fn)
			if os.path.isfile(pathname) and fn.endswith(".py") and (fn!="__init__.py"):
				module = imp.load_source(fn[:-3],pathname)
				for classname in dir(module):
					c = getattr(module, classname, None)

					# make sure 'c' is a descendent of SyncStep and has a
					# provides field (this eliminates the abstract base classes
					# since they don't have a provides)

					if inspect.isclass(c) and issubclass(c, SyncStep) and hasattr(c,"provides") and (c not in self.sync_steps):
						self.sync_steps.append(c)
		logger.info('loaded sync steps: %s' % ",".join([x.__name__ for x in self.sync_steps]))

        def run(self):
            updated = True
            while updated:
                updated = False

                for step in self.sync_steps:
                    if hasattr(step, "consistency_check"):
                        updated = updated or step(driver=None).consistency_check()

                if updated:
                    logger.info('re-running consistency checks because something changed')

def main():
    if not "-C" in sys.argv:
        print >> sys.stderr, "You probably wanted to use -C /opt/planetstack/hpc_observer/hpc_observer_config"

    # Generate command line parser
    parser = argparse.ArgumentParser(usage='%(prog)s [options]')
    # smbaker: util/config.py parses sys.argv[] directly to get config file name; include the option here to avoid
    #   throwing unrecognized argument exceptions
    parser.add_argument('-C', '--config', dest='config_file', action='store', default="/opt/planetstack/plstackapi_config",
                        help='Name of config file.')
    args = parser.parse_args()

    if django_setup: # 1.7
        django_setup()

    cc = PlanetStackConsistencyCheck()
    cc.run()

if __name__ == '__main__':
    main()

