| #include <iostream> |
| |
| #include "ubus-cxx.hpp" |
| |
| inline void example_for_checking_if_there_is_a_key() |
| { |
| if (ubus::call("service", "list").filter("cron")) { |
| std::cout << "Cron is active (with or without instances) " << std::endl; |
| } |
| } |
| |
| inline void example_for_getting_values() |
| { |
| auto lan_status = ubus::call("network.interface.lan", "status"); |
| for (const auto* t : lan_status.filter("ipv6-address", "", "address")) { |
| // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) |
| auto* x = const_cast<blob_attr*>(t); |
| std::cout << "[" << blobmsg_get_string(x) << "] "; |
| } |
| for (const auto* t : lan_status.filter("ipv4-address", "").filter("address")) { |
| // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) |
| auto* x = const_cast<blob_attr*>(t); |
| std::cout << blobmsg_get_string(x) << " "; |
| } |
| std::cout << std::endl; |
| } |
| |
| inline void example_for_sending_message() |
| { |
| auto set_arg = [](blob_buf* buf) -> int { return blobmsg_add_string(buf, "config", "nginx"); }; |
| for (const auto* t : ubus::call("uci", "get", set_arg).filter("values")) { |
| // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) |
| auto* x = const_cast<blob_attr*>(t); |
| std::cout << blobmsg_get_string(x) << "\n"; |
| } |
| } |
| |
| inline void example_for_exploring() |
| { |
| ubus::strings keys{"ipv4-address", "", ""}; |
| for (const auto* t : ubus::call("network.interface.lan", "status").filter(keys)) { |
| // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) |
| auto* x = const_cast<blob_attr*>(t); |
| std::cout << blobmsg_name(x) << ": "; |
| switch (blob_id(x)) { |
| case BLOBMSG_TYPE_UNSPEC: std::cout << "[unspecified]"; break; |
| case BLOBMSG_TYPE_ARRAY: std::cout << "[array]"; break; |
| case BLOBMSG_TYPE_TABLE: std::cout << "[table]"; break; |
| case BLOBMSG_TYPE_STRING: std::cout << blobmsg_get_string(x); break; |
| case BLOBMSG_TYPE_INT64: std::cout << blobmsg_get_u64(x); break; |
| case BLOBMSG_TYPE_INT32: std::cout << blobmsg_get_u32(x); break; |
| case BLOBMSG_TYPE_INT16: std::cout << blobmsg_get_u16(x); break; |
| case BLOBMSG_TYPE_BOOL: std::cout << blobmsg_get_bool(x); break; |
| case BLOBMSG_TYPE_DOUBLE: std::cout << blobmsg_get_double(x); break; |
| default: std::cout << "[unknown]"; |
| } |
| std::cout << std::endl; |
| } |
| } |
| |
| inline void example_for_recursive_exploring() |
| { // output like from the original ubus call: |
| const auto explore = [](auto message) -> void { |
| auto end = message.end(); |
| auto explore_internal = [&end](auto& explore_ref, auto it, size_t depth = 1) -> void { |
| std::cout << std::endl; |
| bool first = true; |
| for (; it != end; ++it) { |
| // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) |
| auto* attr = const_cast<blob_attr*>(*it); |
| if (first) { |
| first = false; |
| } |
| else { |
| std::cout << ",\n"; |
| } |
| std::cout << std::string(depth, '\t'); |
| std::string name = blobmsg_name(attr); |
| if (!name.empty()) { |
| std::cout << "\"" << name << "\": "; |
| } |
| switch (blob_id(attr)) { |
| case BLOBMSG_TYPE_UNSPEC: std::cout << "(unspecified)"; break; |
| case BLOBMSG_TYPE_ARRAY: |
| std::cout << "["; |
| explore_ref(explore_ref, ubus::iterator{attr}, depth + 1); |
| std::cout << "\n" << std::string(depth, '\t') << "]"; |
| break; |
| case BLOBMSG_TYPE_TABLE: |
| std::cout << "{"; |
| explore_ref(explore_ref, ubus::iterator{attr}, depth + 1); |
| std::cout << "\n" << std::string(depth, '\t') << "}"; |
| break; |
| case BLOBMSG_TYPE_STRING: |
| std::cout << "\"" << blobmsg_get_string(attr) << "\""; |
| break; |
| case BLOBMSG_TYPE_INT64: std::cout << blobmsg_get_u64(attr); break; |
| case BLOBMSG_TYPE_INT32: std::cout << blobmsg_get_u32(attr); break; |
| case BLOBMSG_TYPE_INT16: std::cout << blobmsg_get_u16(attr); break; |
| case BLOBMSG_TYPE_BOOL: |
| std::cout << (blobmsg_get_bool(attr) ? "true" : "false"); |
| break; |
| case BLOBMSG_TYPE_DOUBLE: std::cout << blobmsg_get_double(attr); break; |
| default: std::cout << "(unknown)"; break; |
| } |
| } |
| }; |
| std::cout << "{"; |
| explore_internal(explore_internal, message.begin()); |
| std::cout << "\n}" << std::endl; |
| }; |
| explore(ubus::call("network.interface.lan", "status")); |
| } |
| |
| auto main() -> int |
| { |
| try { |
| example_for_checking_if_there_is_a_key(); |
| |
| example_for_getting_values(); |
| |
| example_for_sending_message(); |
| |
| example_for_exploring(); |
| |
| example_for_recursive_exploring(); |
| |
| return 0; |
| } |
| |
| catch (const std::exception& e) { |
| std::cerr << e.what() << std::endl; |
| } |
| |
| catch (...) { |
| perror("main error"); |
| } |
| |
| return 1; |
| } |