]> git.itanic.dy.fi Git - rrdd/blob - onewire_parser.c
debug: Add support for log files
[rrdd] / onewire_parser.c
1 #include <stdio.h>
2 #include <ownetapi.h>
3
4 #include "parser.h"
5 #include "debug.h"
6 #include "string.h"
7 #include "utils.h"
8 #include "plugin.h"
9 #include "version.h"
10
11 static int parse_opts(const char *str, char *ow_path, size_t pathlen, double *offset)
12 {
13         char *endptr;
14         const char *start_str = str;
15         const char offset_str[] = "offset=";
16
17         if (!offset)
18                 return 0;
19
20         /*
21          * Skip the onewire path entry. Options begin after the first
22          * white space
23          */
24         for (; *str; str++)
25                 if (isspace(*str))
26                         break;
27
28         /* Copy the onewire path without options */
29         strncpy(ow_path, start_str, pathlen);
30         ow_path[str - start_str] = '\0';
31
32         /* Get the next non-space, which is where the argument begins */
33         for (; *str; str++)
34                 if (!isspace(*str))
35                         break;
36
37         if (strncmp(str, offset_str, sizeof(offset_str) - 1))
38                 return 0;
39         str += sizeof(offset_str) - 1;
40
41         *offset = strtod(str, &endptr);
42
43         if (str != endptr)
44                 return 1;
45
46         return 0;
47 }
48
49 static int onewire_parser(char *rrd_data, const char **parser_data)
50 {
51         OWNET_HANDLE h;
52         const char *server_addr;
53         char buf[24], *tmp;
54         int i = 1, ret;
55         int max_str = RRD_DATA_MAX_LEN;
56
57         if (!parser_data) {
58                 pr_err("No parser data available\n");
59                 return -1;
60         }
61
62         server_addr = parser_data[0];
63
64         if (!server_addr) {
65                 pr_err("Server address not specified\n");
66                 return -1;
67         }
68
69         h = OWNET_init(server_addr);
70         if (h < 0) {
71                 pr_err("Failed to connect to server %s\n", server_addr);
72                 return -1;
73         }
74
75         while (parser_data[i]) {
76                 double offset = 0, data;
77                 char *endptr;
78                 char ow_path[1024];
79
80                 if (!strcmp("U", parser_data[i])) {
81 undefined:
82                         ret = snprintf(rrd_data, max_str, "U");
83                         max_str -= ret;
84                         rrd_data += ret;
85                         goto next;
86                 }
87
88                 parse_opts(parser_data[i], ow_path, sizeof(ow_path), &offset);
89
90                 pr_info("Reading data for entry %s with offset of %.2f\n",
91                         ow_path, offset);
92                 ret = OWNET_read(h, ow_path, &tmp);
93                 if (ret < 0) {
94                         pr_err("Failed to read entry %s\n", parser_data[i]);
95                         goto undefined;
96                 }
97
98                 /* The data from OWNET_read appears to not be NULL terminated */
99                 memcpy(buf, tmp, MIN(ret, sizeof(buf) -1));
100                 free(tmp);
101                 buf[ret] = 0;
102
103                 data = strtod(buf, &endptr);
104
105                 if (endptr == buf) {
106                         pr_err("Failed to parse data %s\n", buf);
107                         goto undefined;
108                 }
109
110                 data += offset;
111
112                 ret = snprintf(rrd_data, max_str, "%f", data);
113                 max_str -= ret;
114                 rrd_data += ret;
115
116 next:
117                 i++;
118                 if (!parser_data[i])
119                         break;
120
121                 ret = snprintf(rrd_data, max_str, ":");
122                 max_str -= ret;
123                 rrd_data += ret;
124         }
125         rrd_data = 0;
126
127         OWNET_finish();
128         return 0;
129 }
130
131 static struct parser_info onewire_parser_info = {
132         .name = "onewire",
133         .parse = onewire_parser,
134 };
135
136 static int init_onewire_parser(void)
137 {
138         return register_parser(&onewire_parser_info);
139 }
140
141 struct plugin_info plugin_info = {
142         .name = "onewire_parser",
143         .init = init_onewire_parser,
144         .version = RRDD_VERSION,
145 };