summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am5
-rw-r--r--src/priority.c132
2 files changed, 135 insertions, 2 deletions
diff --git a/Makefile.am b/Makefile.am
index 217de7e..14a6cda 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,14 +27,15 @@ CLEANFILES = src/cli_parse.c src/cli_parse.h src/cli_def.c src/cli_val.c
LDADD = src/libvyatta-cfg.la
LDADD += /usr/lib/libglib-2.0.la
-
-sbin_PROGRAMS = src/my_commit1
+sbin_PROGRAMS = src/priority
+sbin_PROGRAMS += src/my_commit1
sbin_PROGRAMS += src/my_commit2
sbin_PROGRAMS += src/exe_action
sbin_PROGRAMS += src/dump
sbin_PROGRAMS += src/my_delete
sbin_PROGRAMS += src/my_set
sbin_PROGRAMS += src/check_tmpl
+src_priority_SOURCES = src/priority.c
src_my_commit1_SOURCES = src/commit.c
src_my_commit2_SOURCES = src/commit2.c
src_exe_action_SOURCES = src/exe_action.c
diff --git a/src/priority.c b/src/priority.c
new file mode 100644
index 0000000..3b113f3
--- /dev/null
+++ b/src/priority.c
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <dirent.h>
+#include <sys/time.h>
+#include <string.h>
+
+
+void recurse(char *cur_dir,FILE *out);
+
+/**
+ *
+ *
+ **/
+void
+usage(void)
+{
+ printf("priority: recurses templates and generates priority file\n");
+ printf("\t-h\thelp\n");
+ printf("\t-f\toutput file\n");
+}
+
+
+/**
+ *
+ *
+ **/
+int
+main(int argc, char** argv)
+{
+ int ch;
+ char *filename = NULL;
+
+ //grab inputs
+ while ((ch = getopt(argc, argv, "hf:")) != -1) {
+ switch (ch) {
+ case 'h':
+ usage();
+ exit(0);
+ case 'f':
+ filename = optarg;
+ //GET OUT FILE HERE
+ }
+
+ if (filename == NULL) {
+ strcpy(filename,"priority");
+ }
+
+ FILE *fp = fopen(filename,"w");
+ if (fp == NULL) {
+ printf("cannot open priority file. exiting...\n");
+ }
+
+ char root_dir[2048] = "";
+ recurse(root_dir,fp);
+ fclose(fp);
+ }
+}
+
+
+/**
+ * On each priority node write out location and value and continue recursion
+ *
+ **/
+void
+recurse(char *cur_dir,FILE *out)
+{
+ char root_path[] = "/opt/vyatta/share/vyatta-cfg/templates";
+ char str[2048];
+ //open and scan node.def
+
+ char file[2048];
+ sprintf(file,"%s/%s/node.def",root_path,cur_dir);
+ FILE *fp = fopen(file,"r");
+ // printf("found node.def at: %s\n",file);
+
+ if (fp != NULL) {
+ while (fgets(str, 1024, fp) != 0) {
+ if (strncmp("priority:",str,9) == 0) {
+ //retrieve value and write out...
+
+ const char delimiters[] = " ";
+ char *running;
+ char *token;
+
+ running = strdup(str);
+ token = strsep(&running, delimiters);
+ token = strsep(&running, delimiters);
+
+ unsigned long val = strtoul(token,NULL,10);
+ if (val > 0 && val <= 1000) {
+ fwrite(token,1,strlen(token)-1,out);
+ fwrite(" ",1,1,out);
+
+ //remove fixed path
+ //offset by 1 to remove the leading slash
+ fwrite(cur_dir+1,1,strlen(cur_dir)-1,out);
+ fwrite("\n",1,1,out);
+ }
+ break;
+ }
+ }
+ fclose(fp);
+ }
+
+
+ //now recurse the other directories here.
+ //iterate over directory here
+
+ char path[2048];
+ sprintf(path,"%s/%s",root_path,cur_dir);
+ DIR *dp;
+ if ((dp = opendir(path)) == NULL) {
+ return;
+ }
+
+ //finally iterate over valid child directory entries
+ struct dirent *dirp = NULL;
+ while ((dirp = readdir(dp)) != NULL) {
+ if (strcmp(dirp->d_name, ".") != 0 &&
+ strcmp(dirp->d_name, "..") != 0 &&
+ strcmp(dirp->d_name, "node.def") != 0) {
+ char local_dir[2048];
+ strcpy(local_dir,cur_dir);
+ strcat(local_dir,"/");
+ strcat(local_dir,dirp->d_name);
+ recurse(local_dir,out);
+ }
+ }
+ closedir(dp);
+}