diff --git a/doc/FAQ.md b/doc/FAQ.md index 64ba9f3c..50c68dac 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -103,10 +103,10 @@ You can change where CLixon looks for the configuration FILE as follows: ## Can I run Clixon as docker containers? Yes, the example works as docker containers as well. There should be a -prepared container in docker hib for the example where the backend and +prepared container in docker hub for the example where the backend and CLI is bundled. ``` -sudo docker run -ti --rm olofhagsand/clixon_example +sudo docker run -td olofhagsand/clixon_example ``` Look in the example documentation for more info. diff --git a/docker/Dockerfile b/docker/Dockerfile index c8c488ec..6bdadc9c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -40,8 +40,6 @@ RUN apt-get update && apt-get install -y \ libfcgi-dev \ libcurl4-openssl-dev -RUN groupadd clicon - # Create a directory to hold source-code, dependencies etc RUN mkdir /clixon WORKDIR /clixon diff --git a/docker/Makefile.in b/docker/Makefile.in index 58905f5b..7eaed4cc 100644 --- a/docker/Makefile.in +++ b/docker/Makefile.in @@ -56,6 +56,7 @@ distclean: clean docker: sudo docker build -t $(IMAGE) . + @echo "cd ../example; make docker to build example application" push: sudo docker push $(IMAGE) diff --git a/example/Dockerfile b/example/Dockerfile index 24403dc5..08314bf8 100644 --- a/example/Dockerfile +++ b/example/Dockerfile @@ -34,8 +34,11 @@ FROM olofhagsand/clixon MAINTAINER Olof Hagsand -RUN apt-get update && apt-get install -y \ - procps # ps for debugging +#RUN apt-get update && apt-get install -y procps # ps for debugging + +# The example uses "clicon" group +RUN groupadd clicon + # Create a directory to hold source-code, dependencies etc RUN mkdir /example WORKDIR /example @@ -53,7 +56,8 @@ RUN make RUN make install RUN install example.xml /usr/local/etc/clixon.xml -CMD /usr/local/sbin/clixon_backend && /usr/local/bin/clixon_cli +# Log to stderr. Add -D 1 for debug +CMD /usr/local/sbin/clixon_backend -F -a IPv4 -u 0.0.0.0 -s init -l e diff --git a/example/README.md b/example/README.md index 0c6d6356..11ed13cf 100644 --- a/example/README.md +++ b/example/README.md @@ -198,19 +198,13 @@ The example contains some stubs for authorization according to [RFC8341(NACM)](h Example systemd files for backend and restconf daemons are found under the systemd directory. Install them under /etc/systemd/system for example. -## Run as docker container - -(Note not updated) -``` -cd docker -# look in README -``` - ## Docker -Run the example as a docker container as follows: +Run the example as a docker container and access it from a host CLI as follows: ``` -sudo docker run -ti --rm olofhagsand/clixon_example +ID=$(sudo docker run -td olofhagsand/clixon_example) +IP=$(sudo docker inspect -f '{{.NetworkSettings.IPAddress }}' $ID) +clixon_cli -a IPv4 -u $IP -f ./example.xml ``` Build the container and push yourself: First change the IMAGE variable in Makefile (eg to "you/clixon_example). Then build and push: @@ -220,5 +214,9 @@ make push sudo docker run -ti --rm you/clixon_example ``` +Note that the configuration database is internal in the container, so +it is deleted if the container is restarted. To make the configuration +database persistent, you need to mount running_db using `-v` + diff --git a/lib/src/clixon_file.c b/lib/src/clixon_file.c index 160d3145..22998553 100644 --- a/lib/src/clixon_file.c +++ b/lib/src/clixon_file.c @@ -112,8 +112,7 @@ clicon_file_dirent(const char *dir, char errbuf[128]; char filename[MAXPATHLEN]; struct stat st; - struct dirent dent; - struct dirent *dresp; + struct dirent *dent; struct dirent *tmp; struct dirent *new = NULL; struct dirent *dvecp = NULL; @@ -132,22 +131,15 @@ clicon_file_dirent(const char *dir, clicon_err(OE_UNIX, errno, "opendir(%s)", dir); goto quit; } - for (res = readdir_r(dirp, &dent, &dresp); - dresp; - res = readdir_r(dirp, &dent, &dresp)) { - if (res != 0) { - clicon_err(OE_UNIX, 0, "readdir: %s", strerror(errno)); - goto quit; - } - + while((dent = readdir(dirp)) != NULL) { /* Filename matching */ if (regexp) { - if (regexec(&re, dent.d_name, (size_t) 0, NULL, 0) != 0) + if (regexec(&re, dent->d_name, (size_t) 0, NULL, 0) != 0) continue; } /* File type matching */ if (type) { - snprintf(filename, MAXPATHLEN-1, "%s/%s", dir, dent.d_name); + snprintf(filename, MAXPATHLEN-1, "%s/%s", dir, dent->d_name); res = lstat(filename, &st); if (res != 0) { clicon_err(OE_UNIX, 0, "lstat: %s", strerror(errno)); @@ -161,7 +153,7 @@ clicon_file_dirent(const char *dir, goto quit; } new = tmp; - memcpy(&new[nent], &dent, sizeof(dent)); + memcpy(&new[nent], dent, sizeof(*dent)); nent++; } /* while */