Import of working code base

Signed-off-by: martin f. krafft <madduck@madduck.net>
diff --git a/reclass.py b/reclass.py
new file mode 100755
index 0000000..f0c24ce
--- /dev/null
+++ b/reclass.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# reclass — recursive external node classifier
+#
+# Copyright © 2007–13 martin f. krafft <madduck@madduck.net>
+# Released under the terms of the Artistic Licence 2.0
+#
+__prog__ = 'reclass'
+__description__ = 'classify nodes based on an external data source'
+__version__ = '1.0'
+__author__ = 'martin f. krafft <madduck@madduck.net>'
+__copyright__ = 'Copyright © 2007–13 ' + __author__
+__licence__ = 'Artistic Licence 2.0'
+
+import sys, os, posix, time
+import config
+from output import OutputLoader
+from storage import StorageBackendLoader
+
+def get_options(config_file=None):
+    return config.get_options(__name__, __version__, __description__, config_file)
+
+def get_data(storage_type, nodes_uri, classes_uri, node):
+    storage_class = StorageBackendLoader(storage_type).load()
+    storage = storage_class(os.path.abspath(os.path.expanduser(nodes_uri)),
+                            os.path.abspath(os.path.expanduser(classes_uri)))
+    if node is False:
+        ret = storage.inventory()
+    else:
+        ret = storage.nodeinfo(node)
+        ret['RECLASS']['timestamp'] = time.strftime('%c')
+
+    return ret
+
+def output(data, fmt, pretty_print=False):
+    output_class = OutputLoader(fmt).load()
+    outputter = output_class()
+    return outputter.dump(data, pretty_print=pretty_print)
+
+if __name__ == '__main__':
+    __name__ = __prog__
+    config_file = None
+    for d in (os.getcwd(), os.path.dirname(sys.argv[0])):
+        f = os.path.join(d, __name__ + '-config.yml')
+        if os.access(f, os.R_OK):
+            config_file = f
+            break
+    options = get_options(config_file)
+    data = get_data(options.storage_type, options.nodes_uri,
+                    options.classes_uri, options.node)
+    print output(data, options.output, options.pretty_print)
+    sys.exit(posix.EX_OK)