diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..7f519ab
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b67c9d1..f991a69 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_BUILD_TYPE Release) # manually set build type (Release / Debug)
set(LIB_METHOD STATIC) #SHARED / STATIC
set(WinBuild false)
-set(PROJECT_VERSION 1.2.2)
+set(PROJECT_VERSION 1.2.3)
option(BUILD_DOC "Build documentation" ON)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@@ -59,9 +59,32 @@ if (CURL_FOUND)
else ()
message(FATAL_ERROR "Could not find CURL")
endif ()
-message("")
include_directories(${CURL_INCLUDE_DIR} inc)
+# libconfig
+FIND_PATH(CONFIG++_INCLUDE_DIR libconfig.h++ /usr/include /usr/local/include)
+
+FIND_LIBRARY(CONFIG++_LIBRARY NAMES config++ PATH /usr/lib /usr/local/lib)
+
+IF (CONFIG++_INCLUDE_DIR AND CONFIG++_LIBRARY)
+ SET(CONFIG++_FOUND TRUE)
+ENDIF ( CONFIG++_INCLUDE_DIR AND CONFIG++_LIBRARY)
+
+IF (CONFIG++_FOUND)
+ MESSAGE(STATUS "Found Config++: ${CONFIG++_LIBRARY}")
+ELSE(CONFIG++_FOUND)
+ IF (Config++_FIND_REQUIRED)
+ IF(NOT CONFIG++_INCLUDE_DIR)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig++ header file!")
+ ENDIF(NOT CONFIG++_INCLUDE_DIR)
+
+ IF(NOT CONFIG++_LIBRARY)
+ MESSAGE(FATAL_ERROR "Could not find LibConfig++ library file!")
+ ENDIF(NOT CONFIG++_LIBRARY)
+ ENDIF (Config++_FIND_REQUIRED)
+ENDIF (CONFIG++_FOUND)
+message("")
+
#add version header
FILE(WRITE ${CMAKE_SOURCE_DIR}/inc/Version.h
"\#pragma once\nclass Version {\npublic:\n static const std::string VERSION;\n};\n\nstd::string const Version::VERSION = \"${PROJECT_VERSION}\";"
@@ -91,12 +114,13 @@ set(SOURCE
add_executable(iprefresher ${SOURCE})
# LINK generated LIBS #
-target_link_libraries(iprefresher api logger ${CURL_LIBRARIES})
+target_link_libraries(iprefresher api logger ${CURL_LIBRARIES} config++)
# INSTALL to SYSTEM #
set(CMAKE_INSTALL_PREFIX "/")
install(TARGETS iprefresher DESTINATION usr/local/bin)
-install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/iprefresher.service DESTINATION lib/systemd/system)
+install(FILES service/iprefresher.service DESTINATION lib/systemd/system)
+install(FILES config/iprefresher.cfg DESTINATION etc)
IF (UNIX)
diff --git a/config/iprefresher.cfg b/config/iprefresher.cfg
new file mode 100644
index 0000000..74ee30f
--- /dev/null
+++ b/config/iprefresher.cfg
@@ -0,0 +1,12 @@
+# Dynu IP refresher config
+# 2020
+# Lukas Heiligenbrunner
+
+## DYNU API Config
+dynuapikey = "12345"
+domainid = "dd"
+#domainname = "jj"
+
+## Telegram API Config
+#telegramApiKey = ""
+#chatId =""
diff --git a/inc/Credentials.h b/inc/Credentials.h
index 3bbc1c8..db0acc5 100644
--- a/inc/Credentials.h
+++ b/inc/Credentials.h
@@ -16,7 +16,7 @@ public:
static std::string telegramApiKey;
static std::string chatId;
- static bool checkCredentialValidity();
+ static bool readCredentials();
private:
};
\ No newline at end of file
diff --git a/iprefresher.service b/service/iprefresher.service
similarity index 100%
rename from iprefresher.service
rename to service/iprefresher.service
diff --git a/src/Credentials.cpp b/src/Credentials.cpp
index 9ae7227..b944d3a 100644
--- a/src/Credentials.cpp
+++ b/src/Credentials.cpp
@@ -3,14 +3,50 @@
//
#include
+#include
+#include
-std::string Credentials::dynuapikey = "";
-std::string Credentials::domainid = ""; //id of the dynu domain
-std::string Credentials::domainname = "";
+#include "libconfig.h++"
-std::string Credentials::telegramApiKey = "";
-std::string Credentials::chatId = "";
+std::string Credentials::dynuapikey;
+std::string Credentials::domainid; //id of the dynu domain
+std::string Credentials::domainname;
-bool Credentials::checkCredentialValidity() {
+std::string Credentials::telegramApiKey;
+std::string Credentials::chatId;
+
+bool Credentials::readCredentials() {
+ libconfig::Config cfg;
+ try {
+ cfg.readFile("/etc/iprefresher.cfg");
+ }
+ catch (const libconfig::FileIOException &fioex) {
+ std::cout << "I/O error while reading config file." << std::endl << "creating new config file!" << std::endl;
+ cfg.writeFile("/etc/iprefresher.cfg");
+ return false;
+ }
+ catch (const libconfig::ParseException &pex) {
+ std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
+ << " - " << pex.getError() << std::endl;
+ return false;
+ }
+
+ // Get the store name.
+ try {
+ // needed parameters
+ dynuapikey = (std::string) cfg.lookup("dynuapikey");
+ domainid = (std::string) cfg.lookup("domainid");
+ domainname = (std::string) cfg.lookup("domainname");
+ // optional parameters
+ telegramApiKey = (std::string) cfg.lookup("telegramApiKey");
+ chatId = (std::string) cfg.lookup("chatId");
+ std::cout << "Store name: " << dynuapikey << std::endl;
+ }
+ catch (const libconfig::SettingNotFoundException &nfex) {
+ // triggered if setting is missing in config
+ if (!(std::strcmp("telegramApiKey", nfex.getPath()) == 0 || std::strcmp("chatId", nfex.getPath()) == 0)) {
+ std::cerr << "No '" << nfex.getPath() << "' setting in configuration file." << std::endl;
+ }
+ }
return !(Credentials::dynuapikey.empty() || Credentials::domainid.empty() || Credentials::domainname.empty());
}
diff --git a/src/main.cpp b/src/main.cpp
index e6aea6e..654bb47 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,7 +5,7 @@
#include
int main(int argc, char *argv[]) {
- if (!Credentials::checkCredentialValidity()) {
+ if (!Credentials::readCredentials()) {
std::cout << "incorrect credentials!" << std::endl;
return -1;
}