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
|
import os
import sys
from UserDict import DictMixin
from django.db import models
import Bcfg2.Server.Lint
import Bcfg2.Server.Plugin
from Bcfg2.Server.Plugins.Metadata import *
class MetadataClientModel(models.Model,
Bcfg2.Server.Plugin.PluginDatabaseModel):
hostname = models.CharField(max_length=255, primary_key=True)
version = models.CharField(max_length=31, null=True)
class ClientVersions(DictMixin):
def __getitem__(self, key):
try:
return MetadataClientModel.objects.get(hostname=key).version
except MetadataClientModel.DoesNotExist:
raise KeyError(key)
def __setitem__(self, key, value):
client = MetadataClientModel.objects.get_or_create(hostname=key)[0]
client.version = value
client.save()
def keys(self):
return [c.hostname for c in MetadataClientModel.objects.all()]
def __contains__(self, key):
try:
client = MetadataClientModel.objects.get(hostname=key)
return True
except MetadataClientModel.DoesNotExist:
return False
class DBMetadata(Metadata, Bcfg2.Server.Plugin.DatabaseBacked):
__files__ = ["groups.xml"]
experimental = True
conflicts = ['Metadata']
def __init__(self, core, datastore, watch_clients=True):
Metadata.__init__(self, core, datastore, watch_clients=watch_clients)
Bcfg2.Server.Plugin.DatabaseBacked.__init__(self)
if os.path.exists(os.path.join(self.data, "clients.xml")):
self.logger.warning("DBMetadata: clients.xml found, parsing in "
"compatibility mode")
self._handle_file("clients.xml")
self.versions = ClientVersions()
def add_group(self, group_name, attribs):
msg = "DBMetadata does not support adding groups"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def add_bundle(self, bundle_name):
msg = "DBMetadata does not support adding bundles"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def add_client(self, client_name):
"""Add client to clients database."""
client = MetadataClientModel(hostname=client_name)
client.save()
self.clients = self.list_clients()
return client
def update_group(self, group_name, attribs):
msg = "DBMetadata does not support updating groups"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def update_bundle(self, bundle_name):
msg = "DBMetadata does not support updating bundles"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def update_client(self, client_name, attribs):
msg = "DBMetadata does not support updating clients"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def list_clients(self):
""" List all clients in client database """
return set([c.hostname for c in MetadataClientModel.objects.all()])
def remove_group(self, group_name, attribs):
msg = "DBMetadata does not support removing groups"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def remove_bundle(self, bundle_name):
msg = "DBMetadata does not support removing bundles"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def remove_client(self, client_name):
"""Remove a client"""
try:
client = MetadataClientModel.objects.get(hostname=client_name)
except MetadataClientModel.DoesNotExist:
msg = "Client %s does not exist" % client_name
self.logger.warning(msg)
raise MetadataConsistencyError(msg)
client.delete()
self.clients = self.list_clients()
def _set_profile(self, client, profile, addresspair):
if client not in self.clients:
# adding a new client
self.add_client(client)
if client not in self.clientgroups:
self.clientgroups[client] = [profile]
else:
msg = "DBMetadata does not support asserting client profiles"
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
def _handle_clients_xml_event(self, event):
# clients.xml is parsed and the options specified in it are
# understood, but it does _not_ assert client existence.
Metadata._handle_clients_xml_event(self, event)
self.clients = self.list_clients()
class DBMetadataLint(MetadataLint):
pass
|