| 249 | | if (stat(sensord_args.rrdFile, &tmp)) { |
| 250 | | if (errno == ENOENT) { |
| 251 | | char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF]; |
| 252 | | int argc = 4, num; |
| 253 | | const char *argv[6 + MAX_RRD_SENSORS] = { |
| 254 | | "sensord", sensord_args.rrdFile, "-s", stepBuff |
| 255 | | }; |
| 256 | | |
| 257 | | sensorLog(LOG_INFO, "creating round robin database"); |
| 258 | | num = rrdGetSensors(argv + argc); |
| 259 | | if (num == 0) { |
| 260 | | sensorLog(LOG_ERR, |
| 261 | | "Error creating RRD: %s: %s", |
| 262 | | sensord_args.rrdFile, |
| 263 | | "No sensors detected"); |
| 264 | | ret = 2; |
| 265 | | } else if (num < 0) { |
| 266 | | ret = -num; |
| 267 | | } else { |
| 268 | | sprintf(stepBuff, "%d", sensord_args.rrdTime); |
| 269 | | sprintf(rraBuff, "RRA:%s:%f:%d:%d", |
| 270 | | sensord_args.rrdNoAverage ? "LAST" : |
| 271 | | "AVERAGE", |
| 272 | | 0.5 /* fraction of non-unknown samples needed per entry */, |
| 273 | | 1 /* samples per entry */, |
| 274 | | 7 * 24 * 60 * 60 / |
| 275 | | sensord_args.rrdTime /* 1 week */); |
| 276 | | |
| 277 | | argc += num; |
| 278 | | argv[argc ++] = rraBuff; |
| 279 | | argv[argc] = NULL; |
| 280 | | if ((ret = rrd_create(argc, |
| 281 | | (char **) /* WEAK */ argv))) { |
| 282 | | sensorLog(LOG_ERR, |
| 283 | | "Error creating RRD file: %s: %s", |
| 284 | | sensord_args.rrdFile, |
| 285 | | rrd_get_error()); |
| 286 | | } |
| 287 | | } |
| 288 | | } else { |
| 289 | | sensorLog(LOG_ERR, "Error stat()ing RRD: %s: %s", |
| 290 | | sensord_args.rrdFile, strerror(errno)); |
| 291 | | ret = 1; |
| 292 | | } |
| 293 | | } |
| 294 | | sensorLog(LOG_DEBUG, "sensor RRD inited"); |
| 295 | | |
| 296 | | return ret; |
| | 254 | |
| | 255 | /* Create RRD if it does not exist. */ |
| | 256 | if (stat(sensord_args.rrdFile, &sb)) { |
| | 257 | if (errno != ENOENT) { |
| | 258 | sensorLog(LOG_ERR, "Could not stat rrd file: %s\n", |
| | 259 | sensord_args.rrdFile); |
| | 260 | return -1; |
| | 261 | } |
| | 262 | sensorLog(LOG_INFO, "Creating round robin database"); |
| | 263 | |
| | 264 | num = rrdGetSensors(argv + argc); |
| | 265 | if (num < 1) { |
| | 266 | sensorLog(LOG_ERR, "Error creating RRD: %s: %s", |
| | 267 | sensord_args.rrdFile, "No sensors detected"); |
| | 268 | return -1; |
| | 269 | } |
| | 270 | |
| | 271 | sprintf(stepBuff, "%d", sensord_args.rrdTime); |
| | 272 | sprintf(rraBuff, "RRA:%s:%f:%d:%d", |
| | 273 | sensord_args.rrdNoAverage ? "LAST" :"AVERAGE", |
| | 274 | 0.5, 1, 7 * 24 * 60 * 60 / sensord_args.rrdTime); |
| | 275 | |
| | 276 | argc += num; |
| | 277 | argv[argc++] = rraBuff; |
| | 278 | argv[argc] = NULL; |
| | 279 | |
| | 280 | ret = rrd_create(argc, (char**) argv); |
| | 281 | if (ret == -1) { |
| | 282 | sensorLog(LOG_ERR, "Error creating RRD file: %s: %s", |
| | 283 | sensord_args.rrdFile, rrd_get_error()); |
| | 284 | return -1; |
| | 285 | } |
| | 286 | } |
| | 287 | |
| | 288 | sensorLog(LOG_DEBUG, "sensor RRD initialized"); |
| | 289 | return 0; |