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 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 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 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