diff --git a/.gitignore b/.gitignore index a257dec6..c260c28b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,8 @@ pihole-FTL # Versioning files (generated by Makefile) version* -# CMake files +# CMake files generated during compilation +/cmake/ /cmake-build-debug/ /cmake-build-release/ diff --git a/src/api/socket.c b/src/api/socket.c index d034db7d..a5fb901d 100644 --- a/src/api/socket.c +++ b/src/api/socket.c @@ -34,6 +34,29 @@ bool dualstack = false; bool ipv4telnet = false, ipv6telnet = false, sock_avail = false; bool istelnet[MAXCONNS]; +void saveport(int port) +{ + FILE *f; + // Open "w" for truncation/creating file + if((f = fopen(FTLfiles.port, "w")) == NULL) + { + // Opening failed (permissions, path does not exist, etc.) + logg("WARNING: Unable to write used port to file"); + logg(" (API might not find the port)"); + } + else if(port > 0) + { + // Save port to file + fprintf(f, "%i", port); + fclose(f); + } + else + { + // FTL is terminating: Leave file truncated + fclose(f); + } +} + static bool bind_to_telnet_port_IPv4(int *socketdescriptor) { // IPv4 socket diff --git a/src/api/socket.h b/src/api/socket.h index 15d54231..630ba960 100644 --- a/src/api/socket.h +++ b/src/api/socket.h @@ -10,6 +10,7 @@ #ifndef SOCKET_H #define SOCKET_H +void saveport(int port); void close_telnet_socket(void); void close_unix_socket(bool unlink_file); void seom(const int sock); diff --git a/src/config.c b/src/config.c index f0355d3c..12a75d9b 100644 --- a/src/config.c +++ b/src/config.c @@ -15,6 +15,8 @@ #include "log.h" // nice() #include +// saveport() +#include "api/socket.h" ConfigStruct config; FTLFileNamesStruct FTLfiles = { @@ -29,6 +31,7 @@ FTLFileNamesStruct FTLfiles = { NULL, NULL, NULL, + NULL, NULL }; @@ -300,6 +303,10 @@ void read_FTLconf(void) // PIDFILE getpath(fp, "PIDFILE", "/run/pihole-FTL.pid", &FTLfiles.pid); + // PORTFILE + getpath(fp, "PORTFILE", "/run/pihole-FTL.port", &FTLfiles.port); + saveport(config.port); + // SOCKETFILE getpath(fp, "SOCKETFILE", "/run/pihole/FTL.sock", &FTLfiles.socketfile); diff --git a/src/config.h b/src/config.h index 503850f2..429d724b 100644 --- a/src/config.h +++ b/src/config.h @@ -50,6 +50,7 @@ typedef struct { const char* snapConf; char* log; char* pid; + char* port; char* socketfile; char* FTL_db; char* gravity_db; diff --git a/src/main.c b/src/main.c index 2fa4ea95..98d5a243 100644 --- a/src/main.c +++ b/src/main.c @@ -112,6 +112,9 @@ int main (int argc, char* argv[]) close_telnet_socket(); close_unix_socket(true); + // Empty API port file, port 0 = truncate file + saveport(0); + // Close gravity database connection gravityDB_close(); diff --git a/test/run.sh b/test/run.sh index bf64b9f5..32322aa1 100755 --- a/test/run.sh +++ b/test/run.sh @@ -11,8 +11,16 @@ if ! id -u pihole &> /dev/null; then useradd -m -s /usr/sbin/nologin pihole fi +# Kill possibly running pihole-FTL process +while pidof -s pihole-FTL > /dev/null; do + pid="$(pidof -s pihole-FTL)" + echo "Terminating running pihole-FTL process with PID ${pid}" + kill $pid + sleep 1 +done + # Clean up possible old files from earlier test runs -rm -f /etc/pihole/gravity.db /etc/pihole/pihole-FTL.db /var/log/pihole.log /var/log/pihole-FTL.log +rm -f /etc/pihole/gravity.db /etc/pihole/pihole-FTL.db /var/log/pihole.log /var/log/pihole-FTL.log /dev/shm/FTL-* # Create necessary directories and files mkdir -p /etc/pihole /run/pihole /var/log diff --git a/test/test_suite.bats b/test/test_suite.bats index 82e1e15d..8fe60ab6 100644 --- a/test/test_suite.bats +++ b/test/test_suite.bats @@ -456,3 +456,9 @@ printf "%s\n" "${lines[@]}" [[ ${lines[0]} == "2" ]] } + +@test "Port file exists and contains expected API port" { + run bash -c 'cat /run/pihole-FTL.port' + printf "%s\n" "${lines[@]}" + [[ ${lines[0]} == "4711" ]] +}