static PyObject * _CgVar_type_set(CgVar *self, PyObject *args) { enum cv_type type; cg_var *cv; assert(self->cv); if (!PyArg_ParseTuple(args, "i", &type)) return NULL; if (type != cv_type_get(self->cv)) { /* Clean-up by creating new cg_var and free old */ if ((cv = cv_new(type)) == NULL || (cv_name_get(self->cv) && !cv_name_set(cv, cv_name_get(self->cv)))){ PyErr_SetString(PyExc_MemoryError, "cv_new"); return NULL; } cv_free(self->cv); self->cv = cv; } return PyLong_FromLong(type); }
/* * This is a generic callback printing the variable vector and argument */ int cb(cligen_handle h, cvec *vars, cg_var *arg) { int i=1; cg_var *cv; char buf[64]; fprintf(stderr, "variables:\n"); cv = NULL; while ((cv = cvec_each1(vars, cv)) != NULL) { cv2str(cv, buf, sizeof(buf)-1); fprintf(stderr, "\t%d name:%s type:%s value:%s\n", i, cv_name_get(cv), cv_type2str(cv_type_get(cv)), buf ); } if (arg){ cv2str(arg, buf, sizeof(buf)-1); fprintf(stderr, "argument: %s\n", buf); } return 0; }
/*! CLI generic callback printing the variable vector and argument */ int callback(cligen_handle handle, cvec *cvv, cvec *argv) { int i = 1; cg_var *cv; char buf[64]; fprintf(stderr, "function: %s\n", cligen_fn_str_get(handle)); fprintf(stderr, "variables:\n"); cv = NULL; while ((cv = cvec_each1(cvv, cv)) != NULL) { cv2str(cv, buf, sizeof(buf)-1); fprintf(stderr, "\t%d name:%s type:%s value:%s\n", i++, cv_name_get(cv), cv_type2str(cv_type_get(cv)), buf ); } if (argv){ cv = NULL; i=0; while ((cv = cvec_each(argv, cv)) != NULL) { cv2str(cv, buf, sizeof(buf)-1); fprintf(stderr, "arg %d: %s\n", i++, buf); } } return 0; }
/*! General callback for executing shells. * The argument is a command followed by arguments as defined in the input syntax. * Simple example: * CLIgen input syntax: <a type:int32>, cligen_exec_cb("ls ${a}"); * CLI input: > 42 * Shell command: ls 42 * More advanced example: * CLIgen input syntax: [<a type:int> | <b type:ipv4addr>], * cligen_exec_cb("foo.sh ${a:-99} ${b:-1.2.3.4}"); * CLI input: > 22 * Shell command: foo.sh 22 1.2.3.4 * CLI input: > 2.3.4.5 * Shell command: foo.sh 99 1.2.3.4. */ int cligen_exec_cb(cligen_handle handle, cvec *cvv, cvec *argv) { cg_var *cv = NULL; char buf[64]; int pid; int ret; int status; if (argv == NULL) return 0; if ((pid = fork()) == 0){ /* child */ while ((cv = cvec_each1(cvv, cv)) != NULL) { if (cv_const_get(cv)) continue; cv2str(cv, buf, sizeof(buf)-1); setenv(cv_name_get(cv), buf, 1 ); } cv2str(cvec_i(argv, 0), buf, sizeof(buf)-1); ret = system(buf); exit(0); } /* Wait for child to finish */ if(waitpid (pid, &status, 0) == pid) ret = WEXITSTATUS(status); else ret = -1; return ret; }
static PyObject * _CgVar_name_get(CgVar *self) { char *str; assert(self->cv); str = cv_name_get(self->cv); if (str == NULL) Py_RETURN_NONE; return StringFromString(str); }
/* * generic_validate * * key values are checked for validity independent of user-defined callbacks * They are checked as follows: * 1. If no value and default value defined, add it. * 2. If no value and mandatory flag set in spec, report error. * 3. Validate value versus spec, and report error if no match. Currently only int ranges and * string regexp checked. */ static int generic_validate(clicon_handle h, char *dbname, const struct dbdiff *dd) { int i, j; char *key; cvec *cvec = NULL; cg_var *cv; cg_varspec *cs; int retval = -1; cg_obj *co; cg_obj *cov; parse_tree *dbspec_co; char *reason = NULL; parse_tree *pt; if ((dbspec_co = clicon_dbspec_pt(h)) == NULL) goto done; /* dd->df_ents[].dfe_key1 (running), dd->df_ents[].dfe_key2 (candidate) */ for (i = 0; i < dd->df_nr; i++) { if ((key = dd->df_ents[i].dfe_key2) == NULL) continue; if ((co = key2spec_co(dbspec_co, key)) == NULL) continue; /* read variable list from db */ if ((cvec = dbkey2cvec(dbname, key)) == NULL) goto done; /* Loop over all co:s children (spec) and check if actual values in db(cv) satisfies them */ pt = &co->co_pt; for (j=0; j<pt->pt_len; j++){ if ((cov = pt->pt_vec[j]) == NULL) continue; if (cov->co_type == CO_VARIABLE){ /* There is no db-value, but dbspec has default value */ if ((cv = dbspec_default_get(cov)) != NULL && cvec_find(cvec, cov->co_command) == NULL){ cv_flag_set(cv, V_DEFAULT); /* mark it as default XXX not survive DB */ /* add default value to cvec */ if (cvec_add_cv(cvec, cv) < 0){ clicon_err(OE_CFG, 0, "cvec_add_cv"); goto done; } /* Write to database */ if (cvec2dbkey(dbname, key, cvec) < 0) goto done; } else if (!dbspec_optional_get(cov) && cvec_find(cvec, cov->co_command) == NULL){ clicon_err(OE_CFG, 0, "key %s: Missing mandatory variable: %s\n", key, cov->co_command); goto done; } } } cv = NULL; /* Loop over all actual db/cv:s och check their validity */ while ((cv = cvec_each(cvec, cv))) { if ((cov = co_find_one(*pt, cv_name_get(cv))) == NULL){ clicon_err(OE_CFG, 0, "key %s: variable %s not found in co-spec", key, cv_name_get(cv)); goto done; } if ((cs = co2varspec(cov)) == NULL) continue; if (cv_validate(cv, cs, &reason) != 1){ /* We ignore errors */ clicon_err(OE_DB, 0, "key %s: validation of %s failed\n", key, cov->co_command); goto done; } } if (cvec){ cvec_free(cvec); cvec = NULL; } } /* for */ retval = 0; done: if (cvec) cvec_free(cvec); if (reason) free(reason); return retval; }