This source file includes following definitions.
- status2char
- event2status
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <crm_internal.h>
15
16 #include <string.h>
17 #include <stdio.h>
18 #include <time.h>
19 #include <errno.h>
20 #include <servicelog.h>
21 #include <syslog.h>
22 #include <unistd.h>
23 #include <inttypes.h>
24
25 #ifndef PCMK__CONFIG_H
26 # define PCMK__CONFIG_H
27 # include <config.h>
28 #endif
29
30 #include <crm/common/xml.h>
31 #include <crm/common/util.h>
32 #include <crm/common/attrd_internal.h>
33
34 typedef enum { STATUS_GREEN = 1, STATUS_YELLOW, STATUS_RED } STATUS;
35
36 const char *status2char(STATUS status);
37 STATUS event2status(struct sl_event *event);
38
39 const char *
40 status2char(STATUS status)
41 {
42 switch (status) {
43 default:
44 case STATUS_GREEN:
45 return "green";
46 case STATUS_YELLOW:
47 return "yellow";
48 case STATUS_RED:
49 return "red";
50 }
51 }
52
53 STATUS
54 event2status(struct sl_event * event)
55 {
56 STATUS status = STATUS_GREEN;
57
58 crm_debug("Severity = %d, Disposition = %d", event->severity, event->disposition);
59
60
61 if (event->severity == SL_SEV_WARNING) {
62 status = STATUS_YELLOW;
63 }
64
65 if (event->disposition == SL_DISP_UNRECOVERABLE) {
66 status = STATUS_RED;
67 }
68
69 return status;
70 }
71
72 static pcmk__cli_option_t long_options[] = {
73
74 {
75 "help", no_argument, NULL, '?',
76 "\tThis text", pcmk__option_default
77 },
78 {
79 "version", no_argument, NULL, '$',
80 "\tVersion information", pcmk__option_default
81 },
82 {
83 "-spacer-", no_argument, NULL, '-',
84 "\nUsage: notifyServicelogEvent event_id", pcmk__option_paragraph
85 },
86 {
87 "-spacer-", no_argument, NULL, '-',
88 "Where event_id is a unique unsigned event identifier which is "
89 "then passed into servicelog",
90 pcmk__option_paragraph
91 },
92 { 0, 0, 0, 0 }
93 };
94
95 int
96 main(int argc, char *argv[])
97 {
98 int argerr = 0;
99 int flag;
100 int index = 0;
101 int rc = 0;
102 servicelog *slog = NULL;
103 struct sl_event *event = NULL;
104 uint64_t event_id = 0;
105
106 pcmk__cli_init_logging("notifyServicelogEvent", 0);
107 pcmk__set_cli_options(NULL, "<event_id>", long_options,
108 "handle events written to servicelog database");
109
110 if (argc < 2) {
111 argerr++;
112 }
113
114 while (1) {
115 flag = pcmk__next_cli_option(argc, argv, &index, NULL);
116 if (flag == -1)
117 break;
118
119 switch (flag) {
120 case '?':
121 case '$':
122 pcmk__cli_help(flag, CRM_EX_OK);
123 break;
124 default:
125 ++argerr;
126 break;
127 }
128 }
129
130 if (argc - optind != 1) {
131 ++argerr;
132 }
133
134 if (argerr) {
135 pcmk__cli_help('?', CRM_EX_USAGE);
136 }
137
138 openlog("notifyServicelogEvent", LOG_NDELAY, LOG_USER);
139
140 if (sscanf(argv[optind], "%" U64TS, &event_id) != 1) {
141 crm_err("Error: could not read event_id from args!");
142
143 rc = 1;
144 goto done;
145 }
146
147 if (event_id == 0) {
148 crm_err("Error: event_id is 0!");
149
150 rc = 1;
151 goto done;
152 }
153
154 rc = servicelog_open(&slog, 0);
155
156 if (!slog) {
157 crm_err("Error: servicelog_open failed, rc = %d", rc);
158
159 rc = 1;
160 goto done;
161 }
162
163 if (slog) {
164 rc = servicelog_event_get(slog, event_id, &event);
165 }
166
167 if (rc == 0) {
168 STATUS status = STATUS_GREEN;
169 const char *health_component = "#health-ipmi";
170 const char *health_status = NULL;
171
172 crm_debug("Event id = %" U64T ", Log timestamp = %s, Event timestamp = %s",
173 event_id, ctime(&(event->time_logged)), ctime(&(event->time_event)));
174
175 status = event2status(event);
176
177 health_status = status2char(status);
178
179 if (health_status) {
180 int attrd_rc;
181
182
183 attrd_rc = pcmk__node_attr_request(NULL, 'v', NULL,
184 health_component, health_status,
185 NULL, NULL, NULL, NULL,
186 pcmk__node_attr_none);
187 crm_debug("Updating attribute ('%s', '%s') = %d",
188 health_component, health_status, attrd_rc);
189 } else {
190 crm_err("Error: status2char failed, status = %d", status);
191 rc = 1;
192 }
193 } else {
194 crm_err("Error: servicelog_event_get failed, rc = %d", rc);
195 }
196
197 done:
198 if (event) {
199 servicelog_event_free(event);
200 }
201
202 if (slog) {
203 servicelog_close(slog);
204 }
205
206 closelog();
207
208 return rc;
209 }