blob: 01b14daecce1351741b38236d6dd479cc667bc14 [file] [log] [blame]
Jayashree Dhanapalb6779842022-10-07 13:34:16 +05301#include "argument.hpp"
2#include "interfaces/internal_interface.hpp"
3
4#include <phosphor-logging/lg2.hpp>
5#include <sdbusplus/bus.hpp>
6
7#include <filesystem>
8
9static constexpr auto devPath = "/sys/class/leds/";
10
11std::string rootPathVerify(std::string path)
12{
13 if (!path.starts_with(devPath))
14 {
15 lg2::error("Invalid sys path - {PATH}", "PATH", path);
16 throw std::invalid_argument("Invalid argument");
17 }
18
19 if (!std::filesystem::exists(path))
20 {
21 lg2::error("Path does not exist - {PATH}", "PATH", path);
22 throw std::invalid_argument("Invalid argument");
23 }
24
25 std::string led = path.substr(strlen(devPath));
26
27 // path can contain multiple path separators, e.g.
28 // /sys/class/leds//identify
29
30 while (led.starts_with("/"))
31 {
32 led = led.substr(1);
33 }
34
35 return led;
36}
37
38void addLed(std::string ledName)
39{
40 lg2::debug("Adding LED name - {LEDNAME}", "LEDNAME", ledName);
41 try
42 {
43 auto bus = sdbusplus::bus::new_default();
44 auto method = bus.new_method_call(busName, ledPath, internalInterface,
45 ledAddMethod);
46
47 method.append(ledName);
48 bus.call(method);
49 }
50 catch (const std::exception& e)
51 {
52 lg2::error("Unable to add LED name - {LEDNAME}", "LEDNAME", ledName);
53 throw e;
54 }
55}
56
57/* Each LED udev event will trigger systemd service (sysfs-led@.service)
58 * Systemd service will invoke the binary (add-led-action) by passing LED
59 * name as argument.
60 *
61 * Usage: /usr/libexec/phosphor-led-sysfs/add-led-action [options]
62 * Options:
63 * --help Print this menu
64 * --path=<path> absolute path of LED in sysfs; like /sys/class/leds/<name>
65 *
66 */
67
68int main(int argc, char* argv[])
69{
70 // Read arguments.
71 auto options = phosphor::led::ArgumentParser(argc, argv);
72
73 // Parse out Path argument.
74 const auto& path = options["path"];
75
76 if (path.empty())
77 {
78 phosphor::led::ArgumentParser::usage(argv);
79
80 lg2::error("Argument parser error : Path not specified");
81 throw std::invalid_argument("Invalid argument");
82 }
83
84 std::string name = rootPathVerify(path);
85
86 addLed(name);
87
88 return 0;
89}