Example #1
0
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()
Example #2
0
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
Example #3
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
     )
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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
Example #7
0
 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,
     )
Example #8
0
 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,
     )
Example #9
0
 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
Example #10
0
 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,
     )
Example #11
0
 def by_mac(c, mac):
     return DBSession.query(c).filter_by(mac=mac).first()
Example #12
0
 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)
Example #13
0
 def tearDown(self):
     """Finish model test fixture."""
     DBSession.rollback()
Example #14
0
 def by_manifest(c, manifest):
     return DBSession.query(c).filter_by(manifest=manifest).first()
Example #15
0
 def by_serial(c, serial):
     return DBSession.query(c).filter_by(serial=serial).first()