summaryrefslogtreecommitdiffstats
path: root/sensors/buildjson.cpp
blob: 482173dee506b4aa4e85303654079063f84709c7 (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
/**
 * Copyright 2019 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "sensors/buildjson.hpp"

#include "conf.hpp"
#include "sensors/sensor.hpp"

#include <cstdio>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

namespace conf
{
void from_json(const json& j, conf::SensorConfig& s)
{
    j.at("type").get_to(s.type);
    j.at("readPath").get_to(s.readPath);

    /* The writePath field is optional in a configuration */
    auto writePath = j.find("writePath");
    if (writePath == j.end())
    {
        s.writePath = "";
    }
    else
    {
        j.at("writePath").get_to(s.writePath);
    }

    /* Default to not ignore dbus MinValue/MaxValue - only used by passive
     * sensors.
     */
    s.ignoreDbusMinMax = false;
    s.min = 0;
    s.max = 0;

    auto ignore = j.find("ignoreDbusMinMax");
    if (ignore != j.end())
    {
        j.at("ignoreDbusMinMax").get_to(s.ignoreDbusMinMax);
    }

    /* The min field is optional in a configuration. */
    auto min = j.find("min");
    if (min != j.end())
    {
        if (s.type == "fan")
        {
            j.at("min").get_to(s.min);
        }
        else
        {
            std::fprintf(stderr, "Non-fan types ignore min value specified\n");
        }
    }

    /* The max field is optional in a configuration. */
    auto max = j.find("max");
    if (max != j.end())
    {
        if (s.type == "fan")
        {
            j.at("max").get_to(s.max);
        }
        else
        {
            std::fprintf(stderr, "Non-fan types ignore max value specified\n");
        }
    }

    /* The timeout field is optional in a configuration. */
    auto timeout = j.find("timeout");
    if (timeout == j.end())
    {
        s.timeout = Sensor::getDefaultTimeout(s.type);
    }
    else
    {
        j.at("timeout").get_to(s.timeout);
    }
}
} // namespace conf

std::map<std::string, struct conf::SensorConfig>
    buildSensorsFromJson(const json& data)
{
    std::map<std::string, struct conf::SensorConfig> config;
    auto sensors = data["sensors"];

    /* TODO: If no sensors, this is invalid, and we should except here or during
     * parsing.
     */
    for (const auto& sensor : sensors)
    {
        config[sensor["name"]] = sensor.get<struct conf::SensorConfig>();
    }

    return config;
}
OpenPOWER on IntegriCloud