from django.utils import timezone from django.db import models from django.conf import settings from macaddress.fields import MACAddressField import uuid import glob import os from datetime import datetime def getRandom(): return str(uuid.uuid4().hex) class Organization(models.Model): name = models.CharField( "Organization Name", max_length=300 ) users = models.ManyToManyField( settings.AUTH_USER_MODEL ) userlimit = models.IntegerField( "User Limit", null=True, blank=True ) def __str__(self): return self.name def orgausers(self): return self.users.filter(is_superuser=False) class Network(models.Model): name = models.CharField( max_length=64, blank=True, null=True ) extip = models.CharField( "External/Public IP", max_length=15, unique=True ) intip = models.CharField( "Internal/Private IP", max_length=15, unique=True ) organization = models.ManyToManyField( Organization ) def __str__(self): return "%s" % self.intip + (" (%s)" % self.name if self.name else "") class Model(models.Model): name = models.CharField( "Model Name", max_length=100, unique=True ) extname = models.CharField( "Manufacturer Model Name", max_length=100 ) config = models.TextField( "OpenWRT Compile Config", blank=True, null=True ) firmware = models.DateTimeField( "Last Firmware Change", auto_now=True ) wwan = models.BooleanField( "Supports WWAN (External WiFi)", default=False ) deprecated = models.BooleanField( "Outdated device type", default=False ) def __str__(self): return self.name class Wifi(models.Model): serial = models.CharField( "Device Serial Number", max_length=12, unique=True ) organization = models.ForeignKey( Organization, on_delete=models.CASCADE ) ssid = models.CharField( "WiFi SSID", max_length=32 ) bssid = models.CharField( "WiFi BSSID", max_length=64, blank=True, null=True ) key = models.CharField( "WiFi key", max_length=32 ) ip = models.GenericIPAddressField( "Configuration IP", protocol="ipv4", blank=True, null=True ) user = models.CharField( "Configuration User Name", max_length=32, blank=True, null=True ) password = models.CharField( "Configuration Password", max_length=32, blank=True, null=True ) def __str__(this): return "%s (%s)" % (this.serial, this.ssid) class Device(models.Model): serial = models.CharField( "Device Serial Number", max_length=12, unique=True ) name = models.CharField( "Common Name", max_length=100, default="", blank=True, null=True ) model = models.ForeignKey( Model, on_delete=models.CASCADE ) organization = models.ForeignKey( Organization, on_delete=models.CASCADE ) network = models.ForeignKey( Network, on_delete=models.SET_NULL, blank=True, null=True ) wifi = models.ManyToManyField( Wifi, blank=True ) curip = models.GenericIPAddressField( "Current IP Address", protocol="ipv4", blank=True, null=True ) lasttime = models.DateTimeField( "Last Received IP", blank=True, null=True, editable=False ) lastbeat = models.DateTimeField( "Last Received Timestamp", blank=True, null=True, editable=False ) secret = models.CharField( "Secret", default=getRandom, max_length=128 ) password = models.CharField( "Device Password", default=getRandom, max_length=128 ) vpnconfig = models.TextField( "VPN Configuration", blank=True, null=True, editable=False ) update = models.BooleanField( "Trigger Firmware Update", default=False ) reboot = models.BooleanField( "Trigger Reboot", default=False ) changed = models.DateTimeField( "Last Change of Device Config", auto_now_add=True ) wireless = models.DateTimeField( "Last Update of Wireless Config", blank=True, null=True, editable=False ) ssid = models.CharField( "Broadcast SSID", max_length=32, blank=True, null=True ) key = models.CharField( "Broadcast WPA2 Key", max_length=64, blank=True, null=True ) mac = MACAddressField( "Device MAC", null=True, blank=True ) def __str__(self): return "%s%s" % (self.serial, " (%s)" % self.ssid if self.ssid else "") def firmware(self): FWDIR = "/opt/vpnmanager/images/" try: fwfile = glob.glob(FWDIR + str(self.id) + ".bin")[0] tz = timezone.get_current_timezone() return datetime.fromtimestamp(os.path.getmtime(fwfile), tz) except Exception: return None def upgrade_available(self): if self.firmware(): return self.firmware() < self.model.firmware return True class DeviceLog(models.Model): ADD = 0 REMOVE = 1 NAME = 2 NET = 3 REBOOT = 4 UPDATE = 5 STATUS = 6 INTERNALIP = 7 WIFI = 8 ORGA = 9 ACTION_CHOICES = ( (ADD, "ADD"), (REMOVE, "REMOVE"), (NAME, "NAME"), (NET, "NET"), (REBOOT, "REBOOT"), (UPDATE, "UPDATE"), (STATUS, "STATUS"), (INTERNALIP, "INTERNALIP"), (WIFI, "WIFI"), (ORGA, "ORGA") ) objid = models.CharField( "Device ID", max_length=64 ) user = models.CharField( "User Name", max_length=128, null=True ) date = models.DateTimeField( "Action Date", auto_now_add=True ) action = models.IntegerField( "Action", choices=ACTION_CHOICES ) oldvalue = models.CharField( "Old Value", max_length=256, blank=True, null=True ) newvalue = models.CharField( "New Value", max_length=256, blank=True, null=True ) class UserLog(models.Model): ADD = 0 REMOVE = 1 NAME = 2 MAIL = 3 STAFF = 4 SUPERUSER = 5 ORGA = 6 ACTION_CHOICES = ( (ADD, "ADD"), (REMOVE, "REMOVE"), (NAME, "NAME"), (MAIL, "MAIL"), (STAFF, "STAFF"), (SUPERUSER, "SUPERUSER"), (ORGA, "ORGA") ) objid = models.CharField( "Target User Name", max_length=64 ) user = models.CharField( "Source User Name", max_length=128, null=True ) date = models.DateTimeField( "Action Date", auto_now_add=True ) action = models.IntegerField( "Action", choices=ACTION_CHOICES ) oldvalue = models.CharField( "Old Value", max_length=256, blank=True, null=True ) newvalue = models.CharField( "New Value", max_length=256, blank=True, null=True ) class WifiLog(models.Model): ADD = 0 REMOVE = 1 NAME = 2 SSID = 3 KEY = 4 ORGA = 5 ACTION_CHOICES = ( (ADD, "ADD"), (REMOVE, "REMOVE"), (NAME, "NAME"), (SSID, "SSID"), (KEY, "KEY"), (ORGA, "ORGA") ) objid = models.CharField( "Wifi Name", max_length=64 ) user = models.CharField( "User Name", max_length=128, null=True ) date = models.DateTimeField( "Action Date", auto_now_add=True ) action = models.IntegerField( "Action", choices=ACTION_CHOICES ) oldvalue = models.CharField( "Old Value", max_length=256, blank=True, null=True ) newvalue = models.CharField( "New Value", max_length=256, blank=True, null=True ) class Notification(models.Model): NOTICE = 0 ALERT = 1 EMERGENCY = 2 STATUS_CHOICES = ( (NOTICE, "NOTICE"), (ALERT, "ALERT"), (EMERGENCY, "EMERGENCY") ) status = models.IntegerField( "Status", choices=STATUS_CHOICES ) text = models.CharField( "Notification Text", max_length=1024 ) expiry = models.DateTimeField( "Notification Expiry", null=True, blank=True ) on_login = models.BooleanField( "Display Notification on Login Screen", default=False ) class UserStatus(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE ) last_action = models.DateTimeField( null=True, blank=True ) orga = models.ForeignKey( Organization, on_delete=models.SET_NULL, null=True )