from django.db import models from datetime import date from django.utils import timezone UPTIME_OK = 100 UPTIME_CRITICAL = 365 UPDATES_OK = 20 UPDATES_CRITICAL = 100 class Os(models.Model): distribution = models.CharField(max_length=20) version = models.CharField(max_length=10) end_of_support = models.DateField('End of support date', blank=True, null=True) def __str__(self): return self.distribution + " " + self.version def maintained_status(self): if date.today() > self.support_end_date: return 3 elif (self.support_end_date - date.today()).days < 365: return 2 else: return 1 class Meta: unique_together = ('distribution', 'version') verbose_name = "OS" verbose_name_plural = "OS" class Group(models.Model): name = models.CharField(max_length=50, unique=True) full_name = models.CharField(max_length=50, null=True) def __str__(self): if self.full_name: return self.full_name else: return self.name class Team(models.Model): name = models.CharField(max_length=20) color = models.CharField(max_length=20, unique=True) def __str__(self): return self.name class Server(models.Model): hostname = models.CharField(max_length=200, unique=True) os = models.ForeignKey(Os, null=True, related_name="servers", on_delete=models.SET_NULL) group = models.ForeignKey(Group, null=True, blank=True, related_name="groups", on_delete=models.SET_NULL) team = models.ForeignKey(Team, null=True, related_name="teams", on_delete=models.SET_NULL) def __str__(self): return self.hostname class PackageStatus(models.Model): server = models.ForeignKey(Server, related_name="packages", on_delete=models.CASCADE) package_name = models.CharField(max_length=50) package_version = models.CharField(max_length=50) def __str__(self): return str(self.server) + '-' + self.package_name + '-' + self.package_version class ServerStatus(models.Model): AUTO_UPDATES_CHOICES = ( ('UNK', 'Unknown'), ('OK', 'Ok'), ('ERR', 'Error'), ('OUT', 'Outdated'), ('NA', 'N/A'), ) date = models.DateField(default=timezone.now) uptime = models.IntegerField(null=True) updates = models.IntegerField(null=True) server = models.ForeignKey(Server, related_name="status", on_delete=models.CASCADE) auto_updates = models.CharField(max_length=3, choices=AUTO_UPDATES_CHOICES, default='UNK') def __str__(self): return str(self.date) + '-' + self.server.hostname def os_status(self): if self.server.os.end_of_support is None: return 0 elif self.date > self.server.os.end_of_support: return 3 elif (self.server.os.end_of_support - self.date).days < 365: return 2 else: return 1 def updates_status(self): if self.updates is None: return 0 elif self.updates < UPDATES_OK: return 1 elif self.updates < UPDATES_CRITICAL: return 2 else: return 3 def uptime_status(self): if self.uptime is None: return 0 elif self.uptime < UPTIME_OK: return 1 elif self.uptime < UPTIME_CRITICAL: return 2 else: return 3 def auto_updates_status(self): if self.auto_updates == 'OK': return 1 elif self.auto_updates == 'UNK': return 2 elif self.auto_updates == 'ERR' or self.auto_updates == 'OUT': return 3 else: return 0 class Meta: unique_together = ('date', 'server') verbose_name_plural = "Server status" class Document_Servers(models.Model): description = models.CharField(max_length=255, blank=True) docfile = models.FileField(upload_to='results/') uploaded_at = models.DateTimeField(auto_now_add=True) class Document_Packages(models.Model): description = models.CharField(max_length=255, blank=True) docfile = models.FileField(upload_to='results-packages/') uploaded_at = models.DateTimeField(auto_now_add=True)