# -*- coding: utf-8 -*- """ Barbican Models ~~~~~~~~~~~~~~~ The models for Barbican. :copyright: (c) 2013 by Jarret Raim :license: Apache 2.0, see LICENSE for details """ from uuid import uuid4 from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean from sqlalchemy.orm import relationship, backref from sqlalchemy.schema import ForeignKey from database import Base class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50), unique=True) email = Column(String(120), unique=True) password = Column(String(50)) def is_authenticated(self): return True def is_active(self): return True def is_anonymous(self): return False def get_id(self): return self.id def __init__(self, name=None, email=None, password=None): self.name = name self.email = email self.password = password def __repr__(self): return '' % self.name class Tenant(Base): __tablename__ = 'tenants' id = Column(Integer, primary_key=True) uuid = Column(String(36), unique=True) def __init__(self, uuid=None, id=None): self.id = id if uuid is None: self.uuid = str(uuid4()) else: self.uuid = uuid def __repr__(self): return '' % self.uuid class Key(Base): __tablename__ = 'keys' id = Column(Integer, primary_key=True) uuid = Column(String(36), unique=True) filename = Column(String(128)) mime_type = Column(String(128)) expiration = Column(DateTime) secret = Column(Text) owner = Column(String(33)) group = Column(String(33)) cacheable = Column(Boolean) policy_id = Column(Integer, ForeignKey('policies.id')) policy = relationship("Policy", backref=backref('keys')) def __init__(self, uuid=None, filename=None, mime_type=None, expiration=None, secret=None, owner=None, group=None, cacheable=None, policy_id=None): if uuid is None: self.uuid = str(uuid4()) else: self.uuid = uuid self.filename = filename self.mime_type = mime_type self.expiration = expiration self.secret = secret self.owner = owner self.group = group self.cacheable = cacheable self.policy_id = policy_id def __repr__(self): return '' % self.uuid def as_dict(self): json = { 'uuid': self.uuid, 'filename': self.filename, 'mime_type': self.mime_type, 'expiration': self.expiration.isoformat(), 'secret': self.secret, 'owner': self.owner, 'group': self.group, 'cachecable': self.cacheable } return json class Agent(Base): __tablename__ = 'agents' id = Column(Integer, primary_key=True) uuid = Column(String(36), unique=True) tenant_id = Column(Integer, ForeignKey('tenants.id')) tenant = relationship("Tenant", backref=backref('agents', order_by=id)) def __init__(self, tenant=None, uuid=None): self.tenant = tenant if uuid is None: self.uuid = str(uuid4()) else: self.uuid = uuid def __repr__(self): return '' % self.uuid def as_dict(self): agent = { 'tenant_id': self.tenant_id, 'uuid': self.uuid } return agent class Policy(Base): __tablename__ = 'policies' id = Column(Integer, primary_key=True) uuid = Column(String(36), unique=True) name = Column(String(100)) directory_name = Column(String(254)) max_key_accesses = Column(Integer) time_available_after_reboot = Column(Integer) tenant_id = Column(Integer, ForeignKey('tenants.id')) tenant = relationship("Tenant", backref=backref('policies', order_by=id)) def __init__(self, uuid=None, name=None, directory_name=None, max_key_accesses=None, time_available_after_reboot=None, tenant_id=None): if uuid is None: self.uuid = str(uuid4()) else: self.uuid = uuid self.name = name self.directory_name = directory_name self.max_key_accesses = max_key_accesses self.time_available_after_reboot = time_available_after_reboot self.tenant_id = tenant_id def __repr__(self): return '' % self.uuid def as_dict(self): keys = map(Key.as_dict, self.keys) json = { 'uuid': self.uuid, 'name': self.name, 'directory_name': self.directory_name, 'max_key_accesses': self.max_key_accesses, 'time_available_after_reboot': self.time_available_after_reboot, 'tenant_id': self.tenant_id, 'keys': keys } return json class Event(Base): __tablename__ = 'events' id = Column(Integer, primary_key=True) agent_id = Column(String(36)) received_on = Column(DateTime()) severity = Column(String(10)) message = Column(Text()) tenant_id = Column(Integer, ForeignKey('tenants.id')) tenant = relationship("Tenant", backref=backref('events', order_by=id)) key_id = Column(Integer, ForeignKey('keys.id')) key = relationship("Key", backref=backref('events', order_by=id)) def __init__(self, tenant_id=None, agent_id=None, received_on=None, severity=None, message=None, tenant=None, key=None): self.tenant_id = tenant_id self.agent_id = agent_id self.received_on = received_on self.severity = severity self.message = message self.key = key self.tenant = tenant def __repr__(self): return '' % (self.received_on, self.severity, self.message[:25]) def as_dict(self): json = { 'id': self.id, 'agent_id': self.agent_id, 'received_on': self.received_on.isoformat(), 'severity': self.severity, 'tenant_id': self.tenant_id, 'key_id': self.key_id, 'message': self.message } return json