def bootstrap(command, conf, vars): """Import pickled database dump.""" appsupport_dir = tg.config.get("appsupport_dir") dump_path = os.path.join(appsupport_dir, "Dump") for item in glob.iglob("%s/*.pickle" % (dump_path)): print "Importing %s" % item with open(item, "rb") as f: pickled_client = pickle.load(f) client = Client() for prop in dir(Client): attr = getattr(Client, prop) if isinstance(attr, sqlalchemy.orm.attributes.InstrumentedAttribute): try: value = pickled_client[prop] except KeyError: print "Warning: no pickled '%s' attribute" % prop else: v = repr(value) if len(v) > (70 - len(prop)): v = v[:67] + "..." # print "client.%s = %s" % (prop, v) setattr(client, prop, value) client.update_report(pickled_client["report_plist"]) # print client DBSession.add(client) DBSession.flush() transaction.commit()
def main(argv): try: dbpath = argv[1] dest_dir = argv[2] except IndexError: usage() return 1 try: engine = sqlalchemy.create_engine('sqlite:///%s' % dbpath) DBSession.configure(bind=engine) except BaseException as e: print >>sys.stderr, "Couldn't open sqlite database %s: %s" % (dbpath, e) if not os.path.exists(dest_dir): try: os.makedirs(dest_dir) except BaseException as e: print >>sys.stderr, "Couldn't create dump directory %s: %s" % (dest_dir, e) return 2 for client in DBSession.query(Client).all(): print "%d %s %s %s" % (client.id, client.name, client.mac, client.remote_ip) c = dict() for prop in dir(Client): attr = getattr(Client, prop) if isinstance(attr, sqlalchemy.orm.attributes.InstrumentedAttribute): c[prop] = getattr(client, prop) with open("%s/%s.pickle" % (dest_dir, client.mac), "wb") as f: pickle.dump(c, f, pickle.HIGHEST_PROTOCOL) return 0
def index(self, order_by=None, reverse=None): """Report overview.""" if reverse is None: reverse = True if not order_by: order_by = u"time" sort_keys = { u"name": Client.name, u"user": Client.console_user, u"addr": Client.remote_ip, u"mani": Client.manifest, u"div": Client.div, u"time": Client.timestamp, } sort_key = sort_keys[order_by] error_clients=DBSession.query(Client).filter(Client.errors > 0).order_by(sort_key).all() warning_clients=DBSession.query(Client).filter(Client.errors == 0).filter(Client.warnings > 0).order_by(sort_key).all() activity_clients=DBSession.query(Client).filter(Client.activity != None).order_by(sort_key).all() if reverse: error_clients.reverse() warning_clients.reverse() activity_clients.reverse() return dict( page="reports", order_by=order_by, reverse=reverse, error_clients=error_clients, warning_clients=warning_clients, activity_clients=activity_clients )
def postflight(self, runtype=None, mac=None, name=None, serial=None, manifest=None, base64bz2report=None): """Log postflight.""" # Decode report # FIXME: there has to be a better way to submit a binary blob try: base64bz2report = base64bz2report.replace(" ", "+") bz2report = base64.b64decode(base64bz2report) report = bz2.decompress(bz2report) except BaseException as e: print "Can't decode report from %s (%s): %s" % (request.environ['REMOTE_ADDR'], mac, str(e)) abort(403) # Parse plist with plistlib, as Objective-C objects can't be pickled. try: plist = plistlib.readPlistFromString(report) except BaseException as e: print "Received invalid plist from %s (%s): %s" % (request.environ['REMOTE_ADDR'], mac, str(e)) abort(403) #plist, format, error = \ # NSPropertyListSerialization.propertyListFromData_mutabilityOption_format_errorDescription_( # buffer(report), # NSPropertyListMutableContainers, # None, # None # ) #if error: # print "error:", error # abort(401) # Create client if needed. client = Client.by_serial(serial) if not client: print "postflight running without preflight for %s" % mac client = Client() client.serial = serial DBSession.add(client) # Update client attributes. client.runtype = runtype if name: client.name = name else: client.name = "<NO NAME>" # Get manifest id from plist client.mac = mac client.manifest = manifest client.runstate = u"done" client.timestamp = datetime.now() client.remote_ip = unicode(request.environ['REMOTE_ADDR']) # Save report, updating activity, errors, warnings, and console_user. client.update_report(plist) DBSession.flush() return "postflight logged for %s\n" % name
def report_broken_client(self, runtype=None, mac=None, name=None): """Log report_broken_client.""" client = Client.by_mac(mac) if not client: client = Client() client.mac = mac DBSession.add(client) client.runtype = runtype client.name = name client.runstate = u"broken client" client.timestamp = datetime.now() client.remote_ip = unicode(request.environ['REMOTE_ADDR']) client.report_plist = None client.errors = 1 client.warnings = 0 DBSession.flush() return "report_broken_client logged for %s\n" % name
def preflight(self, runtype=None, mac=None, name=None): """Log preflight.""" client = Client.by_mac(mac) if not client: client = Client() client.mac = mac DBSession.add(client) client.runtype = runtype if name: client.name = name else: client.name = "<NO NAME>" client.runstate = u"in progress" client.timestamp = datetime.now() client.remote_ip = unicode(request.environ['REMOTE_ADDR']) client.activity = {"Updating": "preflight"} DBSession.flush() return "preflight logged for %s\n" % name
def manifest_list(self, order_by=None, reverse=None): """List all manifests.""" if reverse is None: reverse = True if not order_by: order_by = u"mani" sort_keys = { u"mani": Client.manifest, } manifests=DBSession.query(Client.manifest).distinct() return dict( page="manifests", manifests=manifests, order_by=order_by, reverse=reverse, )
def division_list(self, order_by=None, reverse=None): """List all Divisions.""" if reverse is None: reverse = True if not order_by: order_by = u"div" sort_keys = { u"div": Client.div, } divisions=DBSession.query(Client.div).distinct() return dict( page="divisions", divisions=divisions, order_by=order_by, reverse=reverse, )
def setUp(self): """Prepare model test fixture.""" try: new_attrs = {} new_attrs.update(self.attrs) new_attrs.update(self.do_get_dependencies()) self.obj = self.klass(**new_attrs) DBSession.add(self.obj) DBSession.flush() return self.obj except: DBSession.rollback() raise
def manifest(self, manifest=None, order_by=None, reverse=None): """List all clients.""" if reverse is None: reverse = True if not order_by: order_by = u"time" sort_keys = { u"name": Client.name, u"div": Client.div, u"user": Client.console_user, u"addr": Client.remote_ip, u"time": Client.timestamp, } sort_key = sort_keys[order_by] clients=DBSession.query(Client).filter_by(manifest=manifest).order_by(sort_key).all() if reverse: clients.reverse() return dict( page="manifests", order_by=order_by, reverse=reverse, clients=clients, )
def by_mac(c, mac): return DBSession.query(c).filter_by(mac=mac).first()
def test_query_obj(self): """Model objects can be queried""" obj = DBSession.query(self.klass).one() for key, value in self.attrs.iteritems(): assert_equals(getattr(obj, key), value)
def tearDown(self): """Finish model test fixture.""" DBSession.rollback()
def by_manifest(c, manifest): return DBSession.query(c).filter_by(manifest=manifest).first()
def by_serial(c, serial): return DBSession.query(c).filter_by(serial=serial).first()