#include #include #include #include #include // Testing and training using augeas with C++ // https://github.com/hercules-team/augeas/blob/master/tests/test-api.c static const char *abs_top_srcdir; static const char *root = "../root"; static const char *loadpath = "/opt/homebrew/share/augeas/lenses/dist"; static void testGet() { int r; const char *value; const char *label; struct augeas *aug; char *s; aug = aug_init(root, loadpath, AUG_NO_STDINC | AUG_NO_LOAD); r = aug_load_file(aug, "/etc/hosts"); r = aug_source(aug, "/files/etc/hosts/1/ipaddr", NULL); std::cout << "The value read from node: " << s << std::endl; aug_close(aug); } // This prints the actual file static void printPreview(const std::string& matchPath, const std::string& filePath) { struct augeas *aug; int r; char *s; char *etc_hosts_fn = NULL; FILE *hosts_fp = NULL; char *hosts_txt = NULL; aug = aug_init(root, loadpath, AUG_NO_STDINC | AUG_NO_LOAD); r = aug_load_file(aug, filePath.c_str()); r = aug_preview(aug, matchPath.c_str(), &s); std::cout << s << std::endl; free(hosts_txt); free(s); aug_close(aug); } /// Get the tree of the /etc/hosts file printed in the console /// Implementation based on https://github.com/Nexenta/node-augeas/blob/756276c432cc9e506836800ac9d217bedbbef55c/libaugeas.cc#L784 static void printAugTree(const std::string& matchPath, const std::string& filePath) { struct augeas *aug; int r; FILE *out = tmpfile(); aug = aug_init(root, loadpath, AUG_NO_STDINC | AUG_NO_LOAD); r = aug_load_file(aug, filePath.c_str()); r = aug_print(aug, out,matchPath.c_str()); std::map stdBindList; std::map ::iterator pos; char line[256]; rewind(out); while (fgets(line, 256, out) != NULL) { // remove end of line line[strlen(line) - 1] = '\0'; std::string s = line; ; // skip comments if (s.find("#comment") != std::string::npos) continue; s = s.substr(matchPath.length() - 1); // split by '=' sign size_t eqpos = s.find(" = "); if (eqpos == std::string::npos) continue; // extract key and value std::string key = s.substr(0, eqpos); std::string value = s.substr(eqpos + 3); // remove '"' sign from around value value.erase(value.begin()); value.erase(value.end() - 1); stdBindList.insert(std::pair(key,value)); // 2 } fclose(out); for (pos = stdBindList.begin();pos!=stdBindList.end();pos++) { std::cout << "Key: " << pos->first << ";" << " Value: " << pos->second << std::endl; } aug_close(aug); } int main(int argc, char *argv[]) { //testGet(); printPreview("/files/etc/hosts/1", "/etc/hosts"); //printPreview("/files/etc/ssh/sshd_config/*", "/etc/ssh/sshd_config"); printAugTree("/files/etc/hosts/*", "/etc/hosts"); printAugTree("/files/etc/ssh/sshd_config/*", "/etc/ssh/sshd_config"); return 0; }