blob: 5b477c7ab22ff49e67893d2be1490e130ff157fe (
plain)
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
129
130
131
132
133
134
135
136
137
138
|
<?php
/* Icinga Web 2 | (c) 2013 Icinga Development Team | GPLv2+ */
namespace Icinga\Data;
use Icinga\Application\Config;
use Icinga\Util\ConfigAwareFactory;
use Icinga\Exception\ConfigurationError;
use Icinga\Data\Db\DbConnection;
use Icinga\Protocol\Ldap\LdapConnection;
use Icinga\Protocol\File\FileReader;
/**
* Create resources from names or resource configuration
*/
class ResourceFactory implements ConfigAwareFactory
{
/**
* Resource configuration
*
* @var Config
*/
private static $resources;
/**
* Set resource configurations
*
* @param Config $config
*/
public static function setConfig($config)
{
self::$resources = $config;
}
/**
* Get the configuration for a specific resource
*
* @param $resourceName String The resource's name
*
* @return ConfigObject The configuration of the resource
*
* @throws ConfigurationError
*/
public static function getResourceConfig($resourceName)
{
self::assertResourcesExist();
$resourceConfig = self::$resources->getSection($resourceName);
if ($resourceConfig->isEmpty()) {
throw new ConfigurationError(
'Cannot load resource config "%s". Resource does not exist',
$resourceName
);
}
return $resourceConfig;
}
/**
* Get the configuration of all existing resources, or all resources of the given type
*
* @param string $type Filter for resource type
*
* @return Config The resources configuration
*/
public static function getResourceConfigs($type = null)
{
self::assertResourcesExist();
if ($type === null) {
return self::$resources;
}
$resources = array();
foreach (self::$resources as $name => $resource) {
if ($resource->get('type') === $type) {
$resources[$name] = $resource;
}
}
return Config::fromArray($resources);
}
/**
* Check if the existing resources are set. If not, load them from resources.ini
*
* @throws ConfigurationError
*/
private static function assertResourcesExist()
{
if (self::$resources === null) {
self::$resources = Config::app('resources');
}
}
/**
* Create and return a resource based on the given configuration
*
* @param ConfigObject $config The configuration of the resource to create
*
* @return Selectable The resource
* @throws ConfigurationError In case of an unsupported type or invalid configuration
*/
public static function createResource(ConfigObject $config)
{
switch (strtolower($config->type)) {
case 'db':
$resource = new DbConnection($config);
break;
case 'ldap':
if (empty($config->root_dn)) {
throw new ConfigurationError('LDAP root DN missing');
}
$resource = new LdapConnection($config);
break;
case 'file':
$resource = new FileReader($config);
break;
case 'ini':
$resource = Config::fromIni($config->ini);
break;
default:
throw new ConfigurationError(
'Unsupported resource type "%s"',
$config->type
);
}
return $resource;
}
/**
* Create a resource from name
*
* @param string $resourceName
* @return DbConnection|LdapConnection
*/
public static function create($resourceName)
{
return self::createResource(self::getResourceConfig($resourceName));
}
}
|