Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

glpi / src / plugins / vigilo / vigilo_hooks.php @ f1634ea8

History | View | Annotate | Download (7.49 KB)

1 166be9d2 Francois POIROTTE
<?php
2
3
class VigiloHooks
4
{
5
    // Callbacks pour différents événements
6
    // concernant les équipements supportés.
7
    public function preItemUpdate($item)
8
    {
9 925171f8 Francois POIROTTE
        $index = PluginVigiloTemplate::getTemplateIndexForItem($item);
10
        $item->fields['vigilo_template'] = (int) $index;
11 166be9d2 Francois POIROTTE
    }
12
13
    public function itemAddOrUpdate($item)
14
    {
15
        global $DB;
16
17
        $templates  = PluginVigiloTemplate::getTemplates();
18
        $tplId      = (int) $item->input['vigilo_template'];
19
20
        if ($tplId > 0 && $tplId < count($templates)) {
21
            $id         = $item->getID();
22
            $template   = $DB->escape($templates[$tplId]);
23
            $query      = <<<SQL
24 cdde5484 Francois POIROTTE
INSERT INTO `glpi_plugin_vigilo_template`(`id`, `template`)
25 166be9d2 Francois POIROTTE
VALUES ($id, '$template')
26
ON DUPLICATE KEY UPDATE `template` = '$template';
27
SQL;
28
            $DB->query($query);
29
        }
30
31 e1c378c0 Francois POIROTTE
        // Si la mise à jour modifie le technicien associé à la machine,
32
        // il peut-être nécessaire de mettre à jour les groupes de Vigilo.
33
        if (!empty($item->fields['users_id_tech'])) {
34
            $this->updateGroups(null);
35
        }
36
37 166be9d2 Francois POIROTTE
        $this->update($item);
38
    }
39
40
    public function itemPurge($item)
41
    {
42
        global $DB;
43
44
        $id         = $item->getID();
45 cdde5484 Francois POIROTTE
        $query      = "DELETE FROM `glpi_plugin_vigilo_template` WHERE `id` = $id;";
46 166be9d2 Francois POIROTTE
        $DB->query($query);
47
        $this->unmonitor($item->getField('name'));
48 e1c378c0 Francois POIROTTE
49
        // Si la mise à jour modifie le technicien associé à la machine,
50
        // il peut-être nécessaire de mettre à jour les groupes de Vigilo.
51
        if (!empty($item->fields['users_id_tech'])) {
52
            $this->updateGroups(null);
53
        }
54 166be9d2 Francois POIROTTE
    }
55
56
    // Méthodes outils / annexes
57
    public function writeVigiloConfig($obj, $objtype)
58
    {
59
        $dirs       = array(VIGILO_CONFDIR, $objtype, "managed");
60
        $confdir    = implode(DIRECTORY_SEPARATOR, $dirs);
61
        $file       = $confdir . DIRECTORY_SEPARATOR . $obj->getName() . ".xml";
62
63
        if (!file_exists($confdir)) {
64
            mkdir($confdir, 0770, true);
65
        }
66
67 92b19eed Francois POIROTTE
        $outXML = new DOMDocument();
68
        $outXML->preserveWhiteSpace = false;
69
        $outXML->formatOutput       = true;
70
        $outXML->loadXML((string) $obj);
71
        $res = file_put_contents($file, $outXML->saveXML(), LOCK_EX);
72 166be9d2 Francois POIROTTE
        if (false !== $res) {
73 0ff49d9f Francois POIROTTE
            @chgrp($file, "vigiconf");
74
            @chmod($file, 0660);
75 166be9d2 Francois POIROTTE
        }
76
    }
77
78
    // Méthodes d'ajout / mise à jour / suppression de la supervision
79
    // pour un objet équipement supporté.
80
    public function delete($computer)
81
    {
82
        global $DB;
83
84
        $this->unmonitor($computer->fields["name"]);
85
86
        $query = "UPDATE `glpi_plugin_vigilo_config` SET `value` = 1 WHERE `key` = 'needs_deploy';";
87
        $DB->query($query);
88
    }
89
90
    public function update($item)
91
    {
92
        global $DB;
93
94
        if (isset($item->oldvalues["name"])) {
95
            $this->unmonitor($item->oldvalues["name"]);
96
        }
97
98
        $query = "UPDATE `glpi_plugin_vigilo_config` SET `value` = 1 WHERE `key` = 'needs_deploy';";
99
        $DB->query($query);
100
101 c13f1c28 Francois POIROTTE
        // "is_template" vaut "1" (sous forme de chaîne de caractères)
102
        // lorsque l'objet passé fait référence à un modèle dans GLPI,
103
        // et "0" lorsque ce n'est pas le cas.
104
        // MAIS, il peut aussi valoir NOT_AVAILABLE ("N/A") lors de la création
105
        // d'un nouvel objet (car l'attribut n'est pas encore défini).
106
        // Le cast sur le champ permet de gérer ces 3 cas.
107
        if ((int) $item->getField("is_template")) {
108 166be9d2 Francois POIROTTE
            return;
109
        }
110
111
        $cls = "PluginVigiloMonitored" . $item->getType();
112
        if (class_exists($cls, true)) {
113
            $obj = new $cls($item);
114 92b19eed Francois POIROTTE
115
            // Ecriture du fichier de configuration principal (host).
116 166be9d2 Francois POIROTTE
            $this->writeVigiloConfig($obj, "hosts");
117 92b19eed Francois POIROTTE
118 b49c5b3e Francois POIROTTE
            /*
119
            @FIXME  Ce code pose encore des problèmes, et le fait de n'afficher
120
                    que l'état de l'hôte sur les cartes auto-générées est un
121
                    point bloquant. Cf. ticket #1593.
122

123 92b19eed Francois POIROTTE
            // Création d'un service de haut niveau "services:<nom>"
124
            // qui affichera le pire état des services de la machine "<nom>",
125
            // et d'un service "machine:<nom>" qui affichera le pire état
126
            // entre l'état de la machine "<nom>" et de ses services.
127
            $hls = new PluginVigiloHls($obj);
128
            $this->writeVigiloConfig($hls, "hlservices");
129 b49c5b3e Francois POIROTTE
            */
130 166be9d2 Francois POIROTTE
        }
131
    }
132
133
    public function unmonitor($host)
134
    {
135 22344d19 Francois POIROTTE
        $dirs = array(
136
            array(VIGILO_CONFDIR, "hosts", "managed", $host . ".xml"),
137
            array(VIGILO_CONFDIR, "hlservices", "managed", $host . ".xml"),
138
        );
139
        foreach ($dirs as $components) {
140
            $filename = implode(DIRECTORY_SEPARATOR, $components);
141
            if (file_exists($filename)) {
142
                unlink($filename);
143
            }
144 166be9d2 Francois POIROTTE
        }
145
    }
146
147
    // Méthodes de mise à jour d'un équipement
148
    // lorsque l'un de ses composants change.
149 09aac931 Francois POIROTTE
150
    // Mise à jour de la version d'un logiciel associé à un ordinateur
151
    public function refreshComputerSoftwareVersion($version)
152 166be9d2 Francois POIROTTE
    {
153
        $computer = new Computer();
154
        $computer->getFromDB($version->getField("computers_id"));
155
        $this->update($computer);
156
    }
157
158 09aac931 Francois POIROTTE
    // Mise à jour (d'une version) d'un logiciel associé à un ordinateur
159 166be9d2 Francois POIROTTE
    public function refreshSoftware($software)
160
    {
161 09aac931 Francois POIROTTE
        if ($software instanceof SoftwareVersion) {
162
            $versions = array(
163
                array('id' => $software->getID())
164
            );
165
        } else {
166
            $softwareVer    = new SoftwareVersion();
167
            $versions       = $softwareVer->find('softwares_id=' . $software->getID());
168
        }
169
170 c60a37ae Francois POIROTTE
        foreach ($versions as $version) {
171
            if (!$version['id']) {
172 166be9d2 Francois POIROTTE
                continue;
173
            }
174
175 c60a37ae Francois POIROTTE
            $installations  = new Computer_SoftwareVersion();
176
            $filter         = 'softwareversions_id=' . $version['id'];
177
            $installations  = $installations->find($filter);
178
            foreach ($installations as $installation) {
179
                if (-1 === $installation['computers_id']) {
180 166be9d2 Francois POIROTTE
                    continue;
181
                }
182
183
                $computer = new Computer();
184 c60a37ae Francois POIROTTE
                $computer->getFromDB($installation['computers_id']);
185 166be9d2 Francois POIROTTE
                $this->update($computer);
186
            }
187
        }
188
    }
189
190 09aac931 Francois POIROTTE
    // Mise à jour d'un volume associé à un ordinateur
191 166be9d2 Francois POIROTTE
    public function refreshDisk($disk)
192
    {
193
        $id = $disk->getField('computers_id');
194
        $computer = new Computer();
195
        $computer->getFromDB($id);
196
        $this->update($computer);
197
    }
198
199 09aac931 Francois POIROTTE
    // Mise à jour d'une adresse IP associées à un ordinateur
200 166be9d2 Francois POIROTTE
    public function refreshAddress($address)
201
    {
202
        $id         = $address->getField('mainitems_id');
203
        $itemtype   = $address->getField('mainitemtype');
204
        $item       = new $itemtype();
205
        $item->getFromDB($id);
206
        $this->update($item);
207
    }
208
209 09aac931 Francois POIROTTE
    // Mise à jour d'un périphérique associé à un ordinateur
210 166be9d2 Francois POIROTTE
    public function refreshDevice($device)
211
    {
212
        $id         = $device->getField('items_id');
213
        $itemtype   = $device->getField('itemtype');
214
        $item       = new $itemtype();
215
        $item->getFromDB($id);
216
        $this->update($item);
217
    }
218
219
    // Méthode de mise à jour en cas d'évolution de l'emplacement,
220
    // de l'entité ou du fabricant d'un équipement.
221
    public function updateGroups($obj)
222
    {
223
        $groups = new PluginVigiloGroups();
224
        $this->writeVigiloConfig($groups, "groups");
225
    }
226
}