1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
from django.db import models
#from timedelta import timedelta
from datetime import datetime, timedelta
# Create your models here.
KIND_CHOICES = (
('ConfigFile', 'ConfigFile'),
('Package', 'Package'),
('Service', 'Service'),
('SymLink', 'SymLink'),
('Directory', 'Directory'),
('Permissions','Permissions'),
)
class Client(models.Model):
#This exists for clients that are no longer in the repository even! (timeless)
creation = models.DateTimeField()
name = models.CharField(maxlength=128)
def __str__(self):
return self.name
class Admin:
pass
class Metadata(models.Model):
client = models.ForeignKey(Client)
timestamp = models.DateTimeField()
#INSERT magic interface to Metadata HERE
def __str__(self):
return self.timestamp
class Repository(models.Model):
timestamp = models.DateTimeField()
#INSERT magic interface to any other config info here...
def __str__(self):
return self.timestamp
#models each client-interaction
class Interaction(models.Model):
client = models.ForeignKey(Client, related_name="interactions", core=True)
timestamp = models.DateTimeField()#Timestamp for this record
state = models.CharField(maxlength=32)#good/bad/modified/etc
repo_revision = models.IntegerField()#you got it. the repo in use at time of client interaction
client_version = models.CharField(maxlength=32)#really simple; version of client running
pingable = models.BooleanField()#This is (was-pingable)status as of last attempted interaction
goodcount = models.IntegerField()#of good config-items we store this number, because we don't count the
totalcount = models.IntegerField()#of total config-items specified--grab this from metadata instead?
def __str__(self):
return "With " + self.client.name + " @ " + self.timestamp.isoformat()
def percentgood(self):
return (self.goodcount/self.totalcount)*100
def percentbad(self):
return (self.totalcount-self.goodcount)/(self.totalcount)
def isclean(self):
if (self.bad_items.count() == 0 and self.extra_items.count() == 0 and self.goodcount == self.totalcount):
#if (self.state == "good"):
return True
else:
return False
def isstale(self):
if (self == self.client.interactions.order_by('-timestamp')[0]):#Is Mostrecent
if(datetime.now()-self.timestamp > timedelta(hours=25) ):
return True
else:
return False
else:
#Search for subsequent Interaction for this client
#Check if it happened more than 25 hrs ago.
if (self.client.interactions.filter(timestamp__gt=self.timestamp)
.order_by('timestamp')[0].timestamp - self.timestamp > timedelta(hours=25)):
return True
else:
return False
class Admin:
list_display = ('client', 'timestamp', 'state')
list_filter = ['client', 'timestamp']
pass
class Modified(models.Model):
interaction = models.ForeignKey(Interaction, related_name="modified_items", edit_inline=models.STACKED)
name = models.CharField(maxlength=128, core=True)#name of modified thing.
kind = models.CharField(maxlength=16, choices=KIND_CHOICES)#Service/Package/ConfgFile...
how = models.CharField(maxlength=256)
def __str__(self):
return self.name
class Extra(models.Model):
interaction = models.ForeignKey(Interaction, related_name="extra_items", edit_inline=models.STACKED)
name = models.CharField(maxlength=128, core=True)#name of Extra thing.
kind = models.CharField(maxlength=16, choices=KIND_CHOICES)#Service/Package/ConfgFile...
why = models.CharField(maxlength=256)#current state of some thing...
def __str__(self):
return self.name
class Bad(models.Model):
interaction = models.ForeignKey(Interaction, related_name="bad_items", edit_inline=models.STACKED)
name = models.CharField(maxlength=128, core=True)#name of bad thing.
kind = models.CharField(maxlength=16, choices=KIND_CHOICES)#Service/Package/ConfgFile...
reason = models.CharField(maxlength=256)#that its bad...
def __str__(self):
return self.name
#performance metrics, models a performance-metric-item
class Performance(models.Model):
interaction = models.ForeignKey(Interaction, related_name="performance_items", edit_inline=models.STACKED)
metric = models.CharField(maxlength=128, core=True)
value = models.FloatField(max_digits=32, decimal_places=16)
def __str__(self):
return self.metric
|