Read a config file, populate the linked list (chain the BgFetchRule's)
| 82 | |
| 83 | // Read a config file, populate the linked list (chain the BgFetchRule's) |
| 84 | bool |
| 85 | BgFetchConfig::readConfig(const char *config_file) |
| 86 | { |
| 87 | if (nullptr == config_file) { |
| 88 | TSError("[%s] invalid config file", PLUGIN_NAME); |
| 89 | return false; |
| 90 | } |
| 91 | |
| 92 | swoc::file::path path(config_file); |
| 93 | |
| 94 | Dbg(Bg_dbg_ctl, "trying to open config file in this path: %s", config_file); |
| 95 | |
| 96 | if (!path.is_absolute()) { |
| 97 | path = swoc::file::path(TSConfigDirGet()) / path; |
| 98 | } |
| 99 | Dbg(Bg_dbg_ctl, "chosen config file is at: %s", path.c_str()); |
| 100 | |
| 101 | std::error_code ec; |
| 102 | auto content = swoc::file::load(path, ec); |
| 103 | if (ec) { |
| 104 | swoc::bwprint(ts::bw_dbg, "[{}] invalid config file: {} {}", PLUGIN_NAME, path, ec); |
| 105 | TSError("%s", ts::bw_dbg.c_str()); |
| 106 | Dbg(Bg_dbg_ctl, "%s", ts::bw_dbg.c_str()); |
| 107 | return false; |
| 108 | } |
| 109 | |
| 110 | swoc::TextView text{content}; |
| 111 | while (text) { |
| 112 | auto line = text.take_prefix_at('\n').ltrim_if(&isspace); |
| 113 | |
| 114 | if (line.empty() || line.front() == '#') { |
| 115 | continue; |
| 116 | } |
| 117 | |
| 118 | auto cfg_type = line.take_prefix_if(&isspace); |
| 119 | if (cfg_type.empty()) { |
| 120 | continue; |
| 121 | } |
| 122 | |
| 123 | Dbg(Bg_dbg_ctl, "setting background_fetch exclusion criterion based on string: %.*s", int(cfg_type.size()), cfg_type.data()); |
| 124 | |
| 125 | bool exclude = false; |
| 126 | if (0 == strcasecmp(cfg_type, "exclude")) { |
| 127 | exclude = true; |
| 128 | } else if (0 != strcasecmp(cfg_type, "include")) { |
| 129 | swoc::bwprint(ts::bw_dbg, "[{}] invalid specifier {}, skipping config line", PLUGIN_NAME, cfg_type); |
| 130 | TSError("%s", ts::bw_dbg.c_str()); |
| 131 | continue; |
| 132 | } |
| 133 | |
| 134 | if (auto cfg_name = line.take_prefix_if(&isspace); !cfg_name.empty()) { |
| 135 | if (auto cfg_value = line.take_prefix_if(&isspace); !cfg_value.empty()) { |
| 136 | if ("Client-IP"_tv == cfg_name) { |
| 137 | swoc::IPRange r; |
| 138 | // '*' is special - match any address. Signalled by empty range. |
| 139 | if (cfg_value.size() != 1 || cfg_value.front() == '*') { |
| 140 | if (!r.load(cfg_value)) { // assume if it loads, it's not empty. |
| 141 | TSError("[%s] invalid IP address range %.*s, skipping config value", PLUGIN_NAME, int(cfg_value.size()), |
no test coverage detected