Compare commits
	
		
			60 Commits
		
	
	
		
			master
			...
			conansuppo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 366cc46ecf | |||
| 87c9b932ff | |||
| e01697f7ad | |||
| 7f9d039f94 | |||
| 38e38fb878 | |||
| d12817feae | |||
| 5f65ca528f | |||
| 9d91779f15 | |||
| 0679c0a5fe | |||
| 916bdb7358 | |||
| b5aa78a59f | |||
| d364bc2ed8 | |||
| 1f2dabfa82 | |||
| e4861adbc2 | |||
| 17a3722d7a | |||
| 2b00bc61cf | |||
| 0d5c7a61b4 | |||
| eb66222304 | |||
| 3e8b00f23e | |||
| 826006dcba | |||
| 3f4de8ec42 | |||
| 220275a617 | |||
| deb54c4f3a | |||
| 154b71f50f | |||
| bda51e6b24 | |||
| 789e4c9458 | |||
| c904c0701c | |||
| be8299e294 | |||
| e9e63e1c27 | |||
| 9bfddef920 | |||
| 3d29ab4b17 | |||
| d4d9b13b20 | |||
| 20bd14ad95 | |||
| 3e5ffff839 | |||
| 37ba7dce21 | |||
| 05f3600613 | |||
| 2e3e4986f6 | |||
| 346875312b | |||
| ed08771107 | |||
| ad11f040f2 | |||
| a81c69f833 | |||
| 9de1729c52 | |||
| 726009a379 | |||
| d7fb231705 | |||
| 9a628d60f6 | |||
| 40110b13ca | |||
| b3da9b64fa | |||
| fd14c07fe8 | |||
| 819803835c | |||
| a140f74119 | |||
| 17c5a38a0c | |||
| d6564f5647 | |||
| 1254466e66 | |||
| fda91c380f | |||
| 2cbbc7fe92 | |||
| f64ebed804 | |||
| 36a945eb1d | |||
| 4a040d6a85 | |||
| 41a8e8e7e1 | |||
| e7cc041bc4 | 
							
								
								
									
										106
									
								
								.gitlab-ci.yml
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								.gitlab-ci.yml
									
									
									
									
									
								
							@@ -1,95 +1,43 @@
 | 
				
			|||||||
 | 
					include: '/Docker/Windows_Conan/.gitlab-ci.yml'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					image: conanio/gcc10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stages:
 | 
					stages:
 | 
				
			||||||
  - cmake
 | 
					  - docker
 | 
				
			||||||
  - build
 | 
					  - build
 | 
				
			||||||
  - post
 | 
					  - packageing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Unix Build
 | 
					cache:
 | 
				
			||||||
cmake:
 | 
					 | 
				
			||||||
  stage: cmake
 | 
					 | 
				
			||||||
  image: luki42/dynuiprefresher_build:latest
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - cmake -S . -B build -D WinBuild=OFF -D GUI=OFF
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
  paths:
 | 
					  paths:
 | 
				
			||||||
      - build/
 | 
					    - .conan/
 | 
				
			||||||
      - inc/
 | 
					 | 
				
			||||||
      - postinst
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
build:
 | 
					conan_linux:
 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
  image: luki42/dynuiprefresher_build:latest
 | 
					  before_script:
 | 
				
			||||||
 | 
					    - conan profile new default --detect --force # Generates default profile detecting GCC and sets old ABI
 | 
				
			||||||
 | 
					    - conan profile update settings.compiler.libcxx=libstdc++11 default  # Sets libcxx to C++11 ABI
 | 
				
			||||||
 | 
					    - mkdir -p build # create build folder
 | 
				
			||||||
 | 
					    - CONAN_SYSREQUIRES_MODE=enabled CONAN_SYSREQUIRES_SUDO=0 conan install . --build=missing -g cmake -if build
 | 
				
			||||||
  script:
 | 
					  script:
 | 
				
			||||||
 | 
					    - cmake -S . -B build -D WinBuild=OFF #cmake project
 | 
				
			||||||
    - cd build
 | 
					    - cd build
 | 
				
			||||||
    - make dynuiprefresher
 | 
					    - make -j4 #build
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - build/
 | 
					      - build/bin/
 | 
				
			||||||
      - inc/
 | 
					    expire_in: 1 days
 | 
				
			||||||
      - postinst
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    - cmake
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					conan_windows:
 | 
				
			||||||
build_package:
 | 
					 | 
				
			||||||
  stage: post
 | 
					 | 
				
			||||||
  image: luki42/dynuiprefresher_build:latest
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - cd build
 | 
					 | 
				
			||||||
    - make package
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
    paths:
 | 
					 | 
				
			||||||
      - build/
 | 
					 | 
				
			||||||
      - inc/
 | 
					 | 
				
			||||||
      - postinst
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    - build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test:
 | 
					 | 
				
			||||||
  stage: post
 | 
					 | 
				
			||||||
  image: luki42/dynuiprefresher_build:latest
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - cd build
 | 
					 | 
				
			||||||
    - make build-test
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
    reports:
 | 
					 | 
				
			||||||
      junit: build/*.xml
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    - build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Windows Build
 | 
					 | 
				
			||||||
cmake_win64:
 | 
					 | 
				
			||||||
  stage: cmake
 | 
					 | 
				
			||||||
  image: luki42/dynuiprefresher_build:windows
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - cmake -S . -B build -D WinBuild=ON
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
    paths:
 | 
					 | 
				
			||||||
      - build/
 | 
					 | 
				
			||||||
      - inc/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build_win64:
 | 
					 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
  image: luki42/dynuiprefresher_build:windows
 | 
					  image: luki42/dynuiprefresher_build:conanbuild
 | 
				
			||||||
 | 
					  before_script:
 | 
				
			||||||
 | 
					    - mkdir -p build # create build folder
 | 
				
			||||||
 | 
					    - CONAN_SYSREQUIRES_MODE=enabled CONAN_SYSREQUIRES_SUDO=0 conan install . --build=missing -g cmake -if build --profile mingw64.profile
 | 
				
			||||||
  script:
 | 
					  script:
 | 
				
			||||||
 | 
					    - cmake -S . -B build -D WinBuild=ON #cmake project
 | 
				
			||||||
    - cd build
 | 
					    - cd build
 | 
				
			||||||
    - make dynuiprefresher
 | 
					    - make -j4 #build
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - build/
 | 
					      - build/bin/
 | 
				
			||||||
      - inc/
 | 
					    expire_in: 1 days
 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    - cmake_win64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build_package_win64:
 | 
					 | 
				
			||||||
  stage: post
 | 
					 | 
				
			||||||
  image: luki42/dynuiprefresher_build:windows
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - cd build
 | 
					 | 
				
			||||||
    - make package
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
    paths:
 | 
					 | 
				
			||||||
      - build/
 | 
					 | 
				
			||||||
      - inc/
 | 
					 | 
				
			||||||
  dependencies:
 | 
					 | 
				
			||||||
    - build_win64
 | 
					 | 
				
			||||||
							
								
								
									
										192
									
								
								CMakeLists.txt
									
									
									
									
									
								
							
							
						
						
									
										192
									
								
								CMakeLists.txt
									
									
									
									
									
								
							@@ -13,14 +13,13 @@ project(dynuiprefresher DESCRIPTION "Dynu ip refresher" LANGUAGES)
 | 
				
			|||||||
SET(PROJECT_VERSION 1.3.4)
 | 
					SET(PROJECT_VERSION 1.3.4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# CONFIGURATION
 | 
					# CONFIGURATION
 | 
				
			||||||
SET(CMAKE_BUILD_TYPE Release) # manually SET build type (Release / Debug)
 | 
					SET(CMAKE_BUILD_TYPE Debug) # manually SET build type (Release / Debug)
 | 
				
			||||||
SET(LIB_METHOD STATIC) #SHARED / STATIC
 | 
					SET(LIB_METHOD STATIC) #SHARED / STATIC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
option(BUILD_DOC "Build documentation" ON) # additional dependency for Doxygen
 | 
					option(BUILD_DOC "Build documentation" ON) # additional dependency for Doxygen
 | 
				
			||||||
option(PACKAGING "Allow Packaging to <exe>, <deb> or <rpm>" ON) # additional dependencies for RPMbuild,dpkg  or NSIS
 | 
					option(PACKAGING "Allow Packaging to <exe>, <deb> or <rpm>" ON) # additional dependencies for RPMbuild,dpkg  or NSIS
 | 
				
			||||||
option(TESTS "Build Tests" ON) # additional dependencies for GTEST - to build tests
 | 
					option(TESTS "Build Tests" ON) # additional dependencies for GTEST - to build tests
 | 
				
			||||||
option(GUI "Build GUI elements" ON) # additional dependencies to QT libraries needed
 | 
					option(WinBuild "cross compile for Windows Platform" OFF)
 | 
				
			||||||
option(WinBuild "cross compile for Windows Platform" ON)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# helper variables
 | 
					# helper variables
 | 
				
			||||||
SET(CMAKE_CXX_STANDARD 17)
 | 
					SET(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
@@ -39,33 +38,6 @@ if (${WinBuild})
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    set(CMAKE_SYSTEM_NAME WindowsStore)
 | 
					    set(CMAKE_SYSTEM_NAME WindowsStore)
 | 
				
			||||||
    set(CMAKE_SYSTEM_VERSION 10.0)
 | 
					    set(CMAKE_SYSTEM_VERSION 10.0)
 | 
				
			||||||
    set(TOOLCHAIN_PREFIX x86_64-w64-mingw32) # x64 build toolchain
 | 
					 | 
				
			||||||
    #set(TOOLCHAIN_PREFIX i686-w64-mingw32)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # cross compilers to use for C and C++
 | 
					 | 
				
			||||||
    set(CMAKE_C_COMPILER /usr/bin/${TOOLCHAIN_PREFIX}-gcc)
 | 
					 | 
				
			||||||
    set(CMAKE_CXX_COMPILER /usr/bin/${TOOLCHAIN_PREFIX}-g++)
 | 
					 | 
				
			||||||
    set(CMAKE_RC_COMPILER /usr/bin/${TOOLCHAIN_PREFIX}-windres)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # target environment on the build host system
 | 
					 | 
				
			||||||
    set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # modify default behavior of FIND_XXX() commands to
 | 
					 | 
				
			||||||
    # search for headers/libs in the target environment and
 | 
					 | 
				
			||||||
    # search for programs in the build host environment
 | 
					 | 
				
			||||||
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
 | 
					 | 
				
			||||||
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 | 
					 | 
				
			||||||
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 | 
					 | 
				
			||||||
    set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CSS_STANDARD_LIBRARIES}")
 | 
					 | 
				
			||||||
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
 | 
					 | 
				
			||||||
    # currently libs are dynamically linked eg. dlls have to be copied to same folder
 | 
					 | 
				
			||||||
    # todo link dynamically.
 | 
					 | 
				
			||||||
    # maybe so: set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++ -static")
 | 
					 | 
				
			||||||
    # or set(CMAKE_CXX_STANDARD_LIBRARIES -lcurl -lpthread -static-libgcc -static-libstdc++ -lcrypto -lssl -lws2_32 -static -DCURL_STATICLIB)
 | 
					 | 
				
			||||||
    # or add_definitions(-DCURL_STATICLIB)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # windows config path is in %appdata% folder of user
 | 
					    # windows config path is in %appdata% folder of user
 | 
				
			||||||
    set(CONFIG_PATH "std::string(std::getenv(\"USERPROFILE\")) + \"\\\\AppData\\\\Roaming\\\\DynuIPrefresher\\\\\"")
 | 
					    set(CONFIG_PATH "std::string(std::getenv(\"USERPROFILE\")) + \"\\\\AppData\\\\Roaming\\\\DynuIPrefresher\\\\\"")
 | 
				
			||||||
@@ -93,74 +65,16 @@ enable_language(C)
 | 
				
			|||||||
# config libs
 | 
					# config libs
 | 
				
			||||||
message("")
 | 
					message("")
 | 
				
			||||||
message(STATUS "Config of Libraries")
 | 
					message(STATUS "Config of Libraries")
 | 
				
			||||||
# libcurl
 | 
					 | 
				
			||||||
if (${WinBuild})
 | 
					 | 
				
			||||||
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
 | 
					 | 
				
			||||||
    # configure libcurl
 | 
					 | 
				
			||||||
    FIND_PATH(CURL_INCLUDE_DIRS curl/curl.h /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/include/) # search for libconfig include headers
 | 
					 | 
				
			||||||
    FIND_LIBRARY(CURL_LIBRARIES NAMES libcurl.dll.a HINTS /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/lib) # search for actual lib
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    message(STATUS "Using CURL include dir(s): ${CURL_INCLUDE_DIRS}")
 | 
					# include conan libraries
 | 
				
			||||||
    message(STATUS "Using CURL lib(s): ${CURL_LIBRARIES}")
 | 
					include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
 | 
				
			||||||
    message(STATUS "")
 | 
					conan_basic_setup(TARGETS)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    include_directories(${CURL_INCLUDE_DIRS})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # configure libconfig
 | 
					 | 
				
			||||||
    FIND_PATH(LIBCONFIG++_INCLUDE_DIRS libconfig.h++ /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/include/) # search for libconfig include headers
 | 
					 | 
				
			||||||
    FIND_LIBRARY(LIBCONFIG++_LIBRARIES NAMES libconfig++.dll.a HINTS /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/lib) # search for actual lib
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    message(STATUS "Using LIBCONFIG++ include dir(s): ${LIBCONFIG++_INCLUDE_DIRS}")
 | 
					 | 
				
			||||||
    message(STATUS "Using LIBCONFIG++ lib(s): ${LIBCONFIG++_LIBRARIES}")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (${GUI})
 | 
					 | 
				
			||||||
        set(CMAKE_PREFIX_PATH "/usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/lib/cmake")
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    include_directories(${LIBCONFIG++_INCLUDE_DIRS})
 | 
					 | 
				
			||||||
else ()
 | 
					 | 
				
			||||||
    find_package(CURL REQUIRED)
 | 
					 | 
				
			||||||
    if (CURL_INCLUDE_DIRS AND CURL_LIBRARIES)
 | 
					 | 
				
			||||||
        message(STATUS "Found CURL version: ${CURL_VERSION_STRING}")
 | 
					 | 
				
			||||||
        message(STATUS "Using CURL include dir(s): ${CURL_INCLUDE_DIRS}")
 | 
					 | 
				
			||||||
        message(STATUS "Using CURL lib(s): ${CURL_LIBRARIES}")
 | 
					 | 
				
			||||||
    else ()
 | 
					 | 
				
			||||||
        message(FATAL_ERROR "Could not find CURL")
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
    include_directories(${CURL_INCLUDE_DIR})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    message("")
 | 
					 | 
				
			||||||
    # libconfig
 | 
					 | 
				
			||||||
    FIND_PATH(LIBCONFIG++_INCLUDE_DIRS
 | 
					 | 
				
			||||||
            NAMES libconfig.h++
 | 
					 | 
				
			||||||
            PATHS /usr/include /usr/local/include) # search for libconfig include headers
 | 
					 | 
				
			||||||
    FIND_LIBRARY(LIBCONFIG++_LIBRARIES
 | 
					 | 
				
			||||||
            NAMES config++
 | 
					 | 
				
			||||||
            PATHS /usr/lib /usr/local/lib) # search for actual lib
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (LIBCONFIG++_INCLUDE_DIRS AND LIBCONFIG++_LIBRARIES)
 | 
					 | 
				
			||||||
        message(STATUS "Fount libconfig!")
 | 
					 | 
				
			||||||
        message(STATUS "Using libconfig include dir(s): ${LIBCONFIG++_INCLUDE_DIRS}")
 | 
					 | 
				
			||||||
        message(STATUS "Using libconfig lib(s): ${LIBCONFIG++_LIBRARIES}")
 | 
					 | 
				
			||||||
    else ()
 | 
					 | 
				
			||||||
        message(FATAL_ERROR "Could not find LIBCONFIG")
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    include_directories(${LIBCONFIG_INCLUDE_DIRS})
 | 
					 | 
				
			||||||
endif ()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if (${GUI})
 | 
					 | 
				
			||||||
    set(CMAKE_AUTOMOC ON)
 | 
					 | 
				
			||||||
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    find_package(Qt5Widgets REQUIRED)
 | 
					 | 
				
			||||||
    find_package(Qt5PrintSupport REQUIRED)
 | 
					 | 
				
			||||||
    find_package(Qt5Sql REQUIRED)
 | 
					 | 
				
			||||||
endif ()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
include_directories(inc)
 | 
					include_directories(inc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# include the library headers created by conan
 | 
				
			||||||
 | 
					include_directories(${CONAN_INCLUDE_DIRS})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message("")
 | 
					message("")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#read sample config
 | 
					#read sample config
 | 
				
			||||||
@@ -188,6 +102,7 @@ namespace StaticData {
 | 
				
			|||||||
}"
 | 
					}"
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define libraries with sources here
 | 
				
			||||||
add_library(api ${LIB_METHOD}
 | 
					add_library(api ${LIB_METHOD}
 | 
				
			||||||
        src/api/API.cpp
 | 
					        src/api/API.cpp
 | 
				
			||||||
        src/api/TelegramAPI.cpp
 | 
					        src/api/TelegramAPI.cpp
 | 
				
			||||||
@@ -196,44 +111,16 @@ add_library(api ${LIB_METHOD}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
add_library(libdynuiprefresher ${LIB_METHOD}
 | 
					add_library(libdynuiprefresher ${LIB_METHOD}
 | 
				
			||||||
        src/IPRefresher.cpp
 | 
					        src/IPRefresher.cpp
 | 
				
			||||||
        src/Config.cpp
 | 
					 | 
				
			||||||
        src/IpHelper.cpp
 | 
					        src/IpHelper.cpp
 | 
				
			||||||
        src/FileLogger.cpp
 | 
					        src/FileLogger.cpp
 | 
				
			||||||
        src/Logger.cpp
 | 
					        src/Logger.cpp
 | 
				
			||||||
        )
 | 
					        src/Config.cpp
 | 
				
			||||||
 | 
					        src/CMDParser.cpp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_executable(${Application_Name} src/main.cpp)
 | 
					add_executable(${Application_Name} src/main.cpp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# LINK generated LIBS #
 | 
					# LINK generated LIBS #
 | 
				
			||||||
target_link_libraries(${Application_Name} libdynuiprefresher api ${CURL_LIBRARIES} ${LIBCONFIG++_LIBRARIES})
 | 
					target_link_libraries(${Application_Name} libdynuiprefresher api CONAN_PKG::libcurl)
 | 
				
			||||||
 | 
					 | 
				
			||||||
if (${GUI})
 | 
					 | 
				
			||||||
    set(QT5_LIBRARIES Qt5::Widgets Qt5::PrintSupport Qt5::Sql)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    set(UI_SOURCES
 | 
					 | 
				
			||||||
            src/gui/mainwindow.ui
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #
 | 
					 | 
				
			||||||
    # Generate necessary headers from .ui files. (qmake lets `uic` do this job.)
 | 
					 | 
				
			||||||
    # hint from [Cross-platform Qt5 project using cmake](http://stackoverflow.com/questions/21174586/cross-platform-qt5-project-using-cmake)
 | 
					 | 
				
			||||||
    #
 | 
					 | 
				
			||||||
    qt5_wrap_ui(UI_GENERATED_HEADERS ${UI_SOURCES})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    add_executable(${Application_Name}-gui
 | 
					 | 
				
			||||||
            src/maingui.cpp
 | 
					 | 
				
			||||||
            src/gui/MainWindow.cpp
 | 
					 | 
				
			||||||
            inc/gui/MainWindow.h
 | 
					 | 
				
			||||||
            ${UI_GENERATED_HEADERS})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (${WinBuild})
 | 
					 | 
				
			||||||
        # hide console window when starting ui on windows
 | 
					 | 
				
			||||||
        set_target_properties(${Application_Name}-gui PROPERTIES LINK_FLAGS "-mwindows")
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # LINK generated LIBS #
 | 
					 | 
				
			||||||
    target_link_libraries(${Application_Name}-gui -lpthread libdynuiprefresher api ${CURL_LIBRARIES} ${LIBCONFIG++_LIBRARIES} ${QT5_LIBRARIES})
 | 
					 | 
				
			||||||
endif ()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# setting install targets
 | 
					# setting install targets
 | 
				
			||||||
IF (NOT ${WinBuild})
 | 
					IF (NOT ${WinBuild})
 | 
				
			||||||
@@ -249,14 +136,6 @@ IF (NOT ${WinBuild})
 | 
				
			|||||||
            FILES service/${Application_Name}.service
 | 
					            FILES service/${Application_Name}.service
 | 
				
			||||||
            DESTINATION lib/systemd/system
 | 
					            DESTINATION lib/systemd/system
 | 
				
			||||||
            COMPONENT ${Application_Name})
 | 
					            COMPONENT ${Application_Name})
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (${GUI})
 | 
					 | 
				
			||||||
        # install binaries
 | 
					 | 
				
			||||||
        install(
 | 
					 | 
				
			||||||
                TARGETS ${Application_Name}-gui
 | 
					 | 
				
			||||||
                DESTINATION usr/bin
 | 
					 | 
				
			||||||
                COMPONENT ${Application_Name}gui)
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
ELSE ()
 | 
					ELSE ()
 | 
				
			||||||
    # INSTALL to Windows SYSTEM #
 | 
					    # INSTALL to Windows SYSTEM #
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -266,53 +145,6 @@ ELSE ()
 | 
				
			|||||||
            TARGETS ${Application_Name}
 | 
					            TARGETS ${Application_Name}
 | 
				
			||||||
            DESTINATION .
 | 
					            DESTINATION .
 | 
				
			||||||
            COMPONENT ${Application_Name})
 | 
					            COMPONENT ${Application_Name})
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # install .dll dependencies
 | 
					 | 
				
			||||||
    # todo check if files exist...
 | 
					 | 
				
			||||||
    SET(LIBBINARYPATH "/usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/bin")
 | 
					 | 
				
			||||||
    install(FILES /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/bin/libcurl-4.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libssh2-1.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libstdc++-6.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libgcc_s_seh-1.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libcrypto-1_1-x64.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libssl-1_1-x64.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libwinpthread-1.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/zlib1.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libidn2-0.dll
 | 
					 | 
				
			||||||
            ${LIBBINARYPATH}/libconfig++-11.dll
 | 
					 | 
				
			||||||
            DESTINATION .
 | 
					 | 
				
			||||||
            COMPONENT ${Application_Name})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (${GUI})
 | 
					 | 
				
			||||||
        # install binaries
 | 
					 | 
				
			||||||
        set_target_properties(${Application_Name}-gui PROPERTIES SUFFIX ".exe")
 | 
					 | 
				
			||||||
        install(
 | 
					 | 
				
			||||||
                TARGETS ${Application_Name}-gui
 | 
					 | 
				
			||||||
                DESTINATION .
 | 
					 | 
				
			||||||
                COMPONENT ${Application_Name}gui)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # install .dll dependencies
 | 
					 | 
				
			||||||
        install(FILES
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/Qt5Widgets.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/Qt5Core.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/Qt5Gui.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/iconv.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libpcre2-16-0.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libpng16-16.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libharfbuzz-0.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libglib-2.0-0.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libintl-8.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libpcre-1.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libbz2-1.dll
 | 
					 | 
				
			||||||
                ${LIBBINARYPATH}/libfreetype-6.dll
 | 
					 | 
				
			||||||
                DESTINATION .
 | 
					 | 
				
			||||||
                COMPONENT ${Application_Name}gui)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        install(FILES
 | 
					 | 
				
			||||||
                /usr/${TOOLCHAIN_PREFIX}/sys-root/mingw/lib/qt5/plugins/platforms/qwindows.dll
 | 
					 | 
				
			||||||
                DESTINATION ./platforms
 | 
					 | 
				
			||||||
                COMPONENT ${Application_Name}gui)
 | 
					 | 
				
			||||||
    endif ()
 | 
					 | 
				
			||||||
ENDIF ()
 | 
					ENDIF ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (${PACKAGING})
 | 
					if (${PACKAGING})
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								Docker/Linux_Conan/.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Docker/Linux_Conan/.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# trigger docker rebuild if changes where made
 | 
				
			||||||
 | 
					docker_linux:
 | 
				
			||||||
 | 
					  stage: docker
 | 
				
			||||||
 | 
					  image: docker:latest
 | 
				
			||||||
 | 
					  tags:
 | 
				
			||||||
 | 
					    - dind
 | 
				
			||||||
 | 
					  services:
 | 
				
			||||||
 | 
					    - name: docker:dind
 | 
				
			||||||
 | 
					      entrypoint: ["env", "-u", "DOCKER_HOST"]
 | 
				
			||||||
 | 
					      command: ["dockerd-entrypoint.sh"]
 | 
				
			||||||
 | 
					  variables:
 | 
				
			||||||
 | 
					    DOCKER_HOST: tcp://docker:2375/
 | 
				
			||||||
 | 
					    DOCKER_DRIVER: overlay2
 | 
				
			||||||
 | 
					    # See https://github.com/docker-library/docker/pull/166
 | 
				
			||||||
 | 
					    DOCKER_TLS_CERTDIR: ""
 | 
				
			||||||
 | 
					  script:
 | 
				
			||||||
 | 
					    - docker build -t luki42/dynuiprefresher_build:conanbuild Docker/Linux_Conan
 | 
				
			||||||
 | 
					    - docker login -p $DockerPWD -u luki42
 | 
				
			||||||
 | 
					    - docker push luki42/dynuiprefresher_build:conanbuild
 | 
				
			||||||
 | 
					  only:
 | 
				
			||||||
 | 
					    changes:
 | 
				
			||||||
 | 
					      - Docker/Linux_Conan/*
 | 
				
			||||||
							
								
								
									
										9
									
								
								Docker/Linux_Conan/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Docker/Linux_Conan/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					FROM mwaeckerlin/mingw:latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPY ./build.sh /tmp/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN bash /tmp/build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Expose /home as workin dir
 | 
				
			||||||
 | 
					WORKDIR /home
 | 
				
			||||||
 | 
					VOLUME ["/home"]
 | 
				
			||||||
							
								
								
									
										23
									
								
								Docker/Linux_Conan/build.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Docker/Linux_Conan/build.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					apt-get update
 | 
				
			||||||
 | 
					apt-get install cmake python3-pip -y -qq
 | 
				
			||||||
 | 
					pip3 install conan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://gitlab.heili.eu/lukas/dynuiprefresher.git
 | 
				
			||||||
 | 
					cd dynuiprefresher || exit
 | 
				
			||||||
 | 
					git checkout conansupport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					conan profile new default --detect --force # Generates default profile detecting GCC and sets old ABI
 | 
				
			||||||
 | 
					conan profile update settings.compiler.libcxx=libstdc++11 default  # Sets libcxx to C++11 ABI
 | 
				
			||||||
 | 
					mkdir -p build # create build folder
 | 
				
			||||||
 | 
					CONAN_SYSREQUIRES_MODE=enabled CONAN_SYSREQUIRES_SUDO=0 conan install . --build=missing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# cleanup
 | 
				
			||||||
 | 
					conan remove "*" -s -b -f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ..
 | 
				
			||||||
 | 
					rm -Rf ./dynuiprefresher
 | 
				
			||||||
 | 
					rm -rf /var/lib/apt/lists/*
 | 
				
			||||||
 | 
					rm /tmp/build.sh
 | 
				
			||||||
							
								
								
									
										23
									
								
								Docker/Windows_Conan/.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Docker/Windows_Conan/.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# trigger docker rebuild if changes where made
 | 
				
			||||||
 | 
					docker_linux:
 | 
				
			||||||
 | 
					  stage: docker
 | 
				
			||||||
 | 
					  image: docker:latest
 | 
				
			||||||
 | 
					  tags:
 | 
				
			||||||
 | 
					    - dind
 | 
				
			||||||
 | 
					  services:
 | 
				
			||||||
 | 
					    - name: docker:dind
 | 
				
			||||||
 | 
					      entrypoint: ["env", "-u", "DOCKER_HOST"]
 | 
				
			||||||
 | 
					      command: ["dockerd-entrypoint.sh"]
 | 
				
			||||||
 | 
					  variables:
 | 
				
			||||||
 | 
					    DOCKER_HOST: tcp://docker:2375/
 | 
				
			||||||
 | 
					    DOCKER_DRIVER: overlay2
 | 
				
			||||||
 | 
					    # See https://github.com/docker-library/docker/pull/166
 | 
				
			||||||
 | 
					    DOCKER_TLS_CERTDIR: ""
 | 
				
			||||||
 | 
					  script:
 | 
				
			||||||
 | 
					    - docker build -t luki42/dynuiprefresher_build:conanbuild Docker/Windows_Conan
 | 
				
			||||||
 | 
					    - docker login -p $DockerPWD -u luki42
 | 
				
			||||||
 | 
					    - docker push luki42/dynuiprefresher_build:conanbuild
 | 
				
			||||||
 | 
					  only:
 | 
				
			||||||
 | 
					    changes:
 | 
				
			||||||
 | 
					      - Docker/Windows_Conan/*
 | 
				
			||||||
							
								
								
									
										10
									
								
								Docker/Windows_Conan/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Docker/Windows_Conan/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					FROM fedora:33
 | 
				
			||||||
 | 
					MAINTAINER luki42
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPY ./build.sh /tmp/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN bash /tmp/build.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Expose /home as workin dir
 | 
				
			||||||
 | 
					WORKDIR /home
 | 
				
			||||||
 | 
					VOLUME ["/home"]
 | 
				
			||||||
							
								
								
									
										25
									
								
								Docker/Windows_Conan/build.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Docker/Windows_Conan/build.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Install texlive
 | 
				
			||||||
 | 
					echo "instaling cmake" && \
 | 
				
			||||||
 | 
					dnf install -y mingw64-gcc-c++ cmake make mingw32-nsis gtest gtest-devel python3 python3-pip git perl
 | 
				
			||||||
 | 
					#cleanup
 | 
				
			||||||
 | 
					dnf clean dbcache && dnf clean packages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# install conan
 | 
				
			||||||
 | 
					pip3 install conan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					git clone https://gitlab.heili.eu/lukas/dynuiprefresher.git
 | 
				
			||||||
 | 
					cd dynuiprefresher || exit
 | 
				
			||||||
 | 
					git checkout conansupport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir -p build # create build folder
 | 
				
			||||||
 | 
					CONAN_SYSREQUIRES_MODE=enabled CONAN_SYSREQUIRES_SUDO=0 conan install . --build=missing --profile mingw64.profile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# cleanup
 | 
				
			||||||
 | 
					conan remove "*" -s -b -f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ..
 | 
				
			||||||
 | 
					rm -Rf ./dynuiprefresher
 | 
				
			||||||
 | 
					rm /tmp/build.sh
 | 
				
			||||||
							
								
								
									
										6
									
								
								conanfile.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								conanfile.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					[requires]
 | 
				
			||||||
 | 
					libcurl/7.72.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[generators]
 | 
				
			||||||
 | 
					cmake
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -3,10 +3,10 @@
 | 
				
			|||||||
# Lukas Heiligenbrunner
 | 
					# Lukas Heiligenbrunner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## DYNU API Config
 | 
					## DYNU API Config
 | 
				
			||||||
dynuapikey = ""
 | 
					dynuapikey=
 | 
				
			||||||
domainid = ""
 | 
					domainid=
 | 
				
			||||||
domainname = ""
 | 
					domainname=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Telegram API Config (optional)
 | 
					## Telegram API Config (optional)
 | 
				
			||||||
#telegramApiKey = ""
 | 
					#telegramApiKey=
 | 
				
			||||||
#chatId = ""
 | 
					#chatId=
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								inc/CMDParser.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								inc/CMDParser.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by lukas on 15.03.21.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CMDParser {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    class Arguments {
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					        // enable loop mode
 | 
				
			||||||
 | 
					        bool loop = false;
 | 
				
			||||||
 | 
					        bool force = false;
 | 
				
			||||||
 | 
					        // enable currentIP mode
 | 
				
			||||||
 | 
					        bool currentIP = false;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Arguments* parseArguments(int argc, char *argv[]);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    Arguments args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void processParameter(char *arg);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -97,6 +97,9 @@ private:
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    Config() = default;
 | 
					    Config() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static void writeDefaultConfig();
 | 
				
			||||||
 | 
					    static void setParam(const std::string key, const std::string value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * helper variable for managing telegram Support
 | 
					     * helper variable for managing telegram Support
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ public:
 | 
				
			|||||||
     * @param ip ip address to test
 | 
					     * @param ip ip address to test
 | 
				
			||||||
     * @return validity
 | 
					     * @return validity
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    static bool isIpValid(std::string ip);
 | 
					    static bool isIpValid(const std::string& ip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,63 +0,0 @@
 | 
				
			|||||||
/**
 | 
					 | 
				
			||||||
 * Main GUI controller - User IO handlings
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @author Lukas Heiligenbrunner
 | 
					 | 
				
			||||||
 * @date 09.05.2020
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <QtWidgets/QMainWindow>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace Ui {
 | 
					 | 
				
			||||||
    class MainWindow;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class MainWindow : public QMainWindow {
 | 
					 | 
				
			||||||
Q_OBJECT
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * constructor with basic initializations
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    explicit MainWindow();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * destruct all gui elements
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    ~MainWindow();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    Ui::MainWindow *ui;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * all static initializations of custom gui elements
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void initGui();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private slots:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * executed click handler for config button
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void checkConfigBtn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * executed click handler for refresh btn
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void refreshIPBtn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * executed click handler for save config btn
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void saveConfigBtn();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
signals:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * append a String line to the Log field
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param QString string to be appended
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void appendLogField(QString);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
							
								
								
									
										28
									
								
								mingw64.profile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								mingw64.profile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					toolchain=/usr/x86_64-w64-mingw32 # Adjust this path
 | 
				
			||||||
 | 
					target_host=x86_64-w64-mingw32
 | 
				
			||||||
 | 
					cc_compiler=gcc
 | 
				
			||||||
 | 
					cxx_compiler=g++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[env]
 | 
				
			||||||
 | 
					CONAN_CMAKE_FIND_ROOT_PATH=$toolchain  # Optional, for CMake to find things in that folder
 | 
				
			||||||
 | 
					CONAN_CMAKE_SYSROOT=$toolchain  # Optional, if we want to define sysroot
 | 
				
			||||||
 | 
					CHOST=$target_host
 | 
				
			||||||
 | 
					AR=$target_host-ar
 | 
				
			||||||
 | 
					AS=$target_host-as
 | 
				
			||||||
 | 
					RANLIB=$target_host-ranlib
 | 
				
			||||||
 | 
					CC=$target_host-$cc_compiler
 | 
				
			||||||
 | 
					CXX=$target_host-$cxx_compiler
 | 
				
			||||||
 | 
					STRIP=$target_host-strip
 | 
				
			||||||
 | 
					RC=$target_host-windres
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[settings]
 | 
				
			||||||
 | 
					# We are cross-building to Windows
 | 
				
			||||||
 | 
					os=Windows
 | 
				
			||||||
 | 
					arch=x86_64
 | 
				
			||||||
 | 
					compiler=gcc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Adjust to the gcc version of your MinGW package
 | 
				
			||||||
 | 
					compiler.version=10
 | 
				
			||||||
 | 
					compiler.libcxx=libstdc++11
 | 
				
			||||||
 | 
					compiler.threads=posix
 | 
				
			||||||
 | 
					build_type=Release
 | 
				
			||||||
							
								
								
									
										42
									
								
								src/CMDParser.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/CMDParser.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by lukas on 15.03.21.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <Logger.h>
 | 
				
			||||||
 | 
					#include <StaticData.h>
 | 
				
			||||||
 | 
					#include "CMDParser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CMDParser::Arguments* CMDParser::parseArguments(int argc, char **argv) {
 | 
				
			||||||
 | 
					    for (int i = 1; i < argc; i++) {
 | 
				
			||||||
 | 
					        this->processParameter(argv[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return &args;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void CMDParser::processParameter(char *arg) {
 | 
				
			||||||
 | 
					    const std::string param = std::string(arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (param == "-h" || param == "--help") {
 | 
				
			||||||
 | 
					        std::cout << "help page: " << std::endl << "[-h] [--help]  print this help page" << std::endl
 | 
				
			||||||
 | 
					                  << "[-v] [--version] print the software version" << std::endl
 | 
				
			||||||
 | 
					                  << "[-f] [--force] force refresh of ip" << std::endl
 | 
				
			||||||
 | 
					                  << "[-l] [--loop] infinite loop to refresh ip every five minutes" << std::endl
 | 
				
			||||||
 | 
					                  << "[-c] [--checkconfig] validate configuration" << std::endl
 | 
				
			||||||
 | 
					                  << "[-ip] [--currentip] get current global ip" << std::endl
 | 
				
			||||||
 | 
					                  << "[no argument] normal ip check and refresh" << std::endl;
 | 
				
			||||||
 | 
					        exit(0);
 | 
				
			||||||
 | 
					    } else if (param == "-v" || param == "--version") {
 | 
				
			||||||
 | 
					        std::cout << "Version " << StaticData::VERSION << std::endl;
 | 
				
			||||||
 | 
					        exit(0);
 | 
				
			||||||
 | 
					    } else if (param == "-f" || param == "--force") {
 | 
				
			||||||
 | 
					        args.force = true;
 | 
				
			||||||
 | 
					    } else if (param == "-l" || param == "--loop") {
 | 
				
			||||||
 | 
					        args.loop = true;
 | 
				
			||||||
 | 
					    } else if (param == "-ip" || param == "--currentip") {
 | 
				
			||||||
 | 
					        args.currentIP = true;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        Logger::message("unknown argument: " + param + "!  -h for help");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										261
									
								
								src/Config.cpp
									
									
									
									
									
								
							
							
						
						
									
										261
									
								
								src/Config.cpp
									
									
									
									
									
								
							@@ -5,8 +5,8 @@
 | 
				
			|||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <cstring>
 | 
					#include <cstring>
 | 
				
			||||||
#include <fstream>
 | 
					#include <fstream>
 | 
				
			||||||
#include <libconfig.h++>
 | 
					 | 
				
			||||||
#include <sys/stat.h>
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string Config::dynuapikey;
 | 
					std::string Config::dynuapikey;
 | 
				
			||||||
std::string Config::domainid; //id of the dynu domain
 | 
					std::string Config::domainid; //id of the dynu domain
 | 
				
			||||||
@@ -18,11 +18,130 @@ std::string Config::chatId;
 | 
				
			|||||||
bool Config::telegramSupport;
 | 
					bool Config::telegramSupport;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool Config::readConfig() {
 | 
					bool Config::readConfig() {
 | 
				
			||||||
    libconfig::Config cfg;
 | 
					    // Read from the text file
 | 
				
			||||||
    try {
 | 
					    std::ifstream MyReadFile;
 | 
				
			||||||
        cfg.readFile(std::string(StaticData::ConfigDir + StaticData::ConfName).c_str());
 | 
					    MyReadFile.open(std::string(StaticData::ConfigDir + StaticData::ConfName));
 | 
				
			||||||
 | 
					    if (!MyReadFile) {
 | 
				
			||||||
 | 
					        // file does not exist
 | 
				
			||||||
 | 
					        writeDefaultConfig();
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch (const libconfig::FileIOException &fioex) {
 | 
					
 | 
				
			||||||
 | 
					    std::string line;
 | 
				
			||||||
 | 
					    while (getline(MyReadFile, line)) {
 | 
				
			||||||
 | 
					        // ignore line if it starts with #
 | 
				
			||||||
 | 
					        if(line.rfind('#', 0) == 0 || line.empty()){
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        std::istringstream is_line(line);
 | 
				
			||||||
 | 
					        std::string key;
 | 
				
			||||||
 | 
					        if (std::getline(is_line, key, '=')) {
 | 
				
			||||||
 | 
					            std::string value;
 | 
				
			||||||
 | 
					            if (std::getline(is_line, value))
 | 
				
			||||||
 | 
					                setParam(key, value);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Close the file
 | 
				
			||||||
 | 
					    MyReadFile.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // check if needed values aren't empty
 | 
				
			||||||
 | 
					    return !(Config::dynuapikey.empty() || Config::domainid.empty() || Config::domainname.empty());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Config::saveConfig() {
 | 
				
			||||||
 | 
					    // todo save config
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Config::validateConfig() {
 | 
				
			||||||
 | 
					//    libconfig::Config cfg;
 | 
				
			||||||
 | 
					//    try {
 | 
				
			||||||
 | 
					//        Logger::message("reading config file: " + std::string(StaticData::ConfigDir + StaticData::ConfName));
 | 
				
			||||||
 | 
					//        cfg.readFile(std::string(StaticData::ConfigDir + StaticData::ConfName).c_str());
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    catch (const libconfig::FileIOException &fioex) {
 | 
				
			||||||
 | 
					//        Logger::warning("config file doesn't exist or permission denied!");
 | 
				
			||||||
 | 
					//        return false;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    catch (const libconfig::ParseException &pex) {
 | 
				
			||||||
 | 
					//        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
 | 
				
			||||||
 | 
					//                  << " - " << pex.getError() << std::endl;
 | 
				
			||||||
 | 
					//        return false;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    Logger::message("Syntax and Permission is OK");
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//    try {
 | 
				
			||||||
 | 
					//        // needed parameters
 | 
				
			||||||
 | 
					//        if (((std::string) cfg.lookup("dynuapikey")).empty()) {
 | 
				
			||||||
 | 
					//            Logger::warning("required parameter \"dynuapikey\" seems to be empty.");
 | 
				
			||||||
 | 
					//            return false;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        if (((std::string) cfg.lookup("domainid")).empty()) {
 | 
				
			||||||
 | 
					//            Logger::warning("required parameter \"domainid\" seems to be empty.");
 | 
				
			||||||
 | 
					//            return false;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        if (((std::string) cfg.lookup("domainname")).empty()) {
 | 
				
			||||||
 | 
					//            Logger::warning("required parameter \"domainname\" seems to be empty.");
 | 
				
			||||||
 | 
					//            return false;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//        // optional parameters
 | 
				
			||||||
 | 
					//        cfg.lookup("telegramApiKey");
 | 
				
			||||||
 | 
					//        cfg.lookup("chatId");
 | 
				
			||||||
 | 
					//        telegramSupport = true;
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    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 false;
 | 
				
			||||||
 | 
					//        } else {
 | 
				
			||||||
 | 
					//            Logger::message("no Telegram support - fields in config not set");
 | 
				
			||||||
 | 
					//            telegramSupport = false;
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Config::isTelegramSupported() {
 | 
				
			||||||
 | 
					    return telegramSupport;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string &Config::getDynuapikey() {
 | 
				
			||||||
 | 
					    return dynuapikey;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string &Config::getDomainid() {
 | 
				
			||||||
 | 
					    return domainid;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string &Config::getDomainname() {
 | 
				
			||||||
 | 
					    return domainname;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string &Config::getTelegramApiKey() {
 | 
				
			||||||
 | 
					    return telegramApiKey;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const std::string &Config::getChatId() {
 | 
				
			||||||
 | 
					    return chatId;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Config::setValues(const std::string &domainname, const std::string &dynuapikey, const std::string &domainid) {
 | 
				
			||||||
 | 
					    Config::domainname = domainname;
 | 
				
			||||||
 | 
					    Config::dynuapikey = dynuapikey;
 | 
				
			||||||
 | 
					    Config::domainid = domainid;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Config::setValues(const std::string &domainname, const std::string &dynuapikey, const std::string &domainid,
 | 
				
			||||||
 | 
					                       const std::string &telegramApiKey, const std::string &chatId) {
 | 
				
			||||||
 | 
					    setValues(domainname, dynuapikey, domainid);
 | 
				
			||||||
 | 
					    Config::telegramApiKey = telegramApiKey;
 | 
				
			||||||
 | 
					    Config::chatId = chatId;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Config::writeDefaultConfig() {
 | 
				
			||||||
    std::cout << "I/O error while reading config file." << std::endl << "creating new config file!" << std::endl;
 | 
					    std::cout << "I/O error while reading config file." << std::endl << "creating new config file!" << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // check if config folder exists
 | 
					    // check if config folder exists
 | 
				
			||||||
@@ -59,124 +178,22 @@ bool Config::readConfig() {
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        Logger::error("error creating file");
 | 
					        Logger::error("error creating file");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return false;
 | 
					void Config::setParam(const std::string key, const std::string value) {
 | 
				
			||||||
    }
 | 
					    if (key == "dynuapikey")
 | 
				
			||||||
    catch (const libconfig::ParseException &pex) {
 | 
					        dynuapikey = value;
 | 
				
			||||||
        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
 | 
					    else if (key == "domainid")
 | 
				
			||||||
                  << " - " << pex.getError() << std::endl;
 | 
					        domainid = value;
 | 
				
			||||||
        return false;
 | 
					    else if (key == "domainname")
 | 
				
			||||||
    }
 | 
					        domainname = value;
 | 
				
			||||||
 | 
					    else if (key == "telegramApiKey")
 | 
				
			||||||
 | 
					        telegramApiKey = value;
 | 
				
			||||||
 | 
					    else if (key == "chatId")
 | 
				
			||||||
 | 
					        chatId = value;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        Logger::warning("unkown key in config file: " + key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    if (!telegramApiKey.empty())
 | 
				
			||||||
        // 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");
 | 
					 | 
				
			||||||
        telegramSupport = true;
 | 
					        telegramSupport = true;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    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;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            Logger::message("no Telegram support - fields in config not set");
 | 
					 | 
				
			||||||
            telegramSupport = false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // check if needed values aren't empty
 | 
					 | 
				
			||||||
    return !(Config::dynuapikey.empty() || Config::domainid.empty() || Config::domainname.empty());
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool Config::saveConfig() {
 | 
					 | 
				
			||||||
    // todo save config
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool Config::validateConfig() {
 | 
					 | 
				
			||||||
    libconfig::Config cfg;
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
        Logger::message("reading config file");
 | 
					 | 
				
			||||||
        cfg.readFile(std::string(StaticData::ConfigDir + StaticData::ConfName).c_str());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    catch (const libconfig::FileIOException &fioex) {
 | 
					 | 
				
			||||||
        Logger::warning("config file doesn't exist or permission denied!");
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    catch (const libconfig::ParseException &pex) {
 | 
					 | 
				
			||||||
        std::cerr << "Parse error at " << pex.getFile() << ":" << pex.getLine()
 | 
					 | 
				
			||||||
                  << " - " << pex.getError() << std::endl;
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Logger::message("Syntax and Permission is OK");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    try {
 | 
					 | 
				
			||||||
        // needed parameters
 | 
					 | 
				
			||||||
        if (((std::string) cfg.lookup("dynuapikey")).empty()) {
 | 
					 | 
				
			||||||
            Logger::warning("required parameter \"dynuapikey\" seems to be empty.");
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (((std::string) cfg.lookup("domainid")).empty()) {
 | 
					 | 
				
			||||||
            Logger::warning("required parameter \"domainid\" seems to be empty.");
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (((std::string) cfg.lookup("domainname")).empty()) {
 | 
					 | 
				
			||||||
            Logger::warning("required parameter \"domainname\" seems to be empty.");
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // optional parameters
 | 
					 | 
				
			||||||
        cfg.lookup("telegramApiKey");
 | 
					 | 
				
			||||||
        cfg.lookup("chatId");
 | 
					 | 
				
			||||||
        telegramSupport = true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    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 false;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            Logger::message("no Telegram support - fields in config not set");
 | 
					 | 
				
			||||||
            telegramSupport = false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool Config::isTelegramSupported() {
 | 
					 | 
				
			||||||
    return telegramSupport;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string &Config::getDynuapikey() {
 | 
					 | 
				
			||||||
    return dynuapikey;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string &Config::getDomainid() {
 | 
					 | 
				
			||||||
    return domainid;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string &Config::getDomainname() {
 | 
					 | 
				
			||||||
    return domainname;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string &Config::getTelegramApiKey() {
 | 
					 | 
				
			||||||
    return telegramApiKey;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const std::string &Config::getChatId() {
 | 
					 | 
				
			||||||
    return chatId;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Config::setValues(const std::string &domainname, const std::string &dynuapikey, const std::string &domainid) {
 | 
					 | 
				
			||||||
    Config::domainname = domainname;
 | 
					 | 
				
			||||||
    Config::dynuapikey = dynuapikey;
 | 
					 | 
				
			||||||
    Config::domainid = domainid;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void Config::setValues(const std::string &domainname, const std::string &dynuapikey, const std::string &domainid, const std::string &telegramApiKey, const std::string &chatId) {
 | 
					 | 
				
			||||||
    setValues(domainname, dynuapikey, domainid);
 | 
					 | 
				
			||||||
    Config::telegramApiKey = telegramApiKey;
 | 
					 | 
				
			||||||
    Config::chatId = chatId;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
 | 
					#include <regex>
 | 
				
			||||||
#include "IpHelper.h"
 | 
					#include "IpHelper.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool IpHelper::isIpValid(std::string ip) {
 | 
					bool IpHelper::isIpValid(const std::string& ip) {
 | 
				
			||||||
    return (ip.find('.') != SIZE_MAX);
 | 
					    const std::regex rgx(R"(^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)");
 | 
				
			||||||
 | 
					    return (std::regex_match(ip, rgx));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,11 @@
 | 
				
			|||||||
 | 
					#include <IpHelper.h>
 | 
				
			||||||
 | 
					#include <Logger.h>
 | 
				
			||||||
#include "api/IPAPI.h"
 | 
					#include "api/IPAPI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::string IPAPI::getGlobalIp() {
 | 
					std::string IPAPI::getGlobalIp() {
 | 
				
			||||||
    return request("https://api.ipify.org");
 | 
					    const std::string ip = request("https://api.ipify.org");
 | 
				
			||||||
 | 
					    if(!IpHelper::isIpValid(ip))
 | 
				
			||||||
 | 
					        Logger::warning("no valid ip returned from ipapi");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ip;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,129 +0,0 @@
 | 
				
			|||||||
#include "inc/gui/MainWindow.h"
 | 
					 | 
				
			||||||
#include "ui_mainwindow.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "api/IPAPI.h"
 | 
					 | 
				
			||||||
#include "IPRefresher.h"
 | 
					 | 
				
			||||||
#include "Config.h"
 | 
					 | 
				
			||||||
#include "Logger.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <thread>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MainWindow::MainWindow() : QMainWindow(), ui(new Ui::MainWindow) {
 | 
					 | 
				
			||||||
    ui->setupUi(this);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // initialize gui with start parameters
 | 
					 | 
				
			||||||
    initGui();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connect(ui->buttonCheckConfig, SIGNAL(clicked()), this, SLOT(checkConfigBtn()));
 | 
					 | 
				
			||||||
    connect(ui->buttonRefreshIP, SIGNAL(clicked()), this, SLOT(refreshIPBtn()));
 | 
					 | 
				
			||||||
    connect(ui->buttonSaveConfig, SIGNAL(clicked()), this, SLOT(saveConfigBtn()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    connect(this, SIGNAL(appendLogField(QString)), ui->textLog, SLOT(appendPlainText(QString)));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MainWindow::~MainWindow() {
 | 
					 | 
				
			||||||
    // todo check if disconnects are really necessary
 | 
					 | 
				
			||||||
    disconnect(ui->buttonCheckConfig);
 | 
					 | 
				
			||||||
    disconnect(ui->buttonRefreshIP);
 | 
					 | 
				
			||||||
    this->destroy();
 | 
					 | 
				
			||||||
    delete ui;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void MainWindow::checkConfigBtn() {
 | 
					 | 
				
			||||||
    Logger::message("checking config!");
 | 
					 | 
				
			||||||
    appendLogField("checking config!");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (Config::validateConfig()) {
 | 
					 | 
				
			||||||
        Logger::message("Config file is OK");
 | 
					 | 
				
			||||||
        appendLogField("Config file is OK");
 | 
					 | 
				
			||||||
        ui->labelConfig->setText("Config is: OK");
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        Logger::error("There are errors in config file!");
 | 
					 | 
				
			||||||
        appendLogField("There are errors in config file!");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    appendLogField("");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void MainWindow::refreshIPBtn() {
 | 
					 | 
				
			||||||
    Logger::message("start refreshing Dynu IP.");
 | 
					 | 
				
			||||||
    appendLogField("");
 | 
					 | 
				
			||||||
    appendLogField("start refreshing Dynu IP.");
 | 
					 | 
				
			||||||
    new std::thread([this]() {
 | 
					 | 
				
			||||||
        if (Config::readConfig()) {
 | 
					 | 
				
			||||||
            int code = IPRefresher::checkIPAdress(false);
 | 
					 | 
				
			||||||
            switch (code) {
 | 
					 | 
				
			||||||
                case IPRefresher::Status_Code::SUCCESS:
 | 
					 | 
				
			||||||
                    appendLogField("successfully refreshed IP!");
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case IPRefresher::Status_Code::NOREFRESH:
 | 
					 | 
				
			||||||
                    appendLogField("IP is already correct.");
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case IPRefresher::Status_Code::ERROR_NO_INTERNET:
 | 
					 | 
				
			||||||
                    appendLogField("Error: No Internet connection");
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                case IPRefresher::Status_Code::ERROR:
 | 
					 | 
				
			||||||
                    appendLogField("An error occured while refreshing.");
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                default:
 | 
					 | 
				
			||||||
                    appendLogField("An unknown error code occured");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            std::cout << "incorrect credentials!" << std::endl;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Logger::message("Finished refreshing Dynu IP.");
 | 
					 | 
				
			||||||
        this->appendLogField("Finished refreshing Dynu IP.");
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void MainWindow::saveConfigBtn() {
 | 
					 | 
				
			||||||
    if (ui->telegramsupportCheckbox->isChecked()) {
 | 
					 | 
				
			||||||
        Config::setValues(
 | 
					 | 
				
			||||||
                ui->domainnameedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->dynuapikeyedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->domainidedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->telegramapikeyedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->chatidedit->text().toStdString());
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        Config::setValues(
 | 
					 | 
				
			||||||
                ui->domainnameedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->dynuapikeyedit->text().toStdString(),
 | 
					 | 
				
			||||||
                ui->domainidedit->text().toStdString());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Config::saveConfig();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void MainWindow::initGui() {
 | 
					 | 
				
			||||||
    // needs to be defined with new -- would be termintated after the constructor call.
 | 
					 | 
				
			||||||
    new std::thread([this]() {
 | 
					 | 
				
			||||||
        IPAPI ipapi;
 | 
					 | 
				
			||||||
        std::string ip = ipapi.getGlobalIp();
 | 
					 | 
				
			||||||
        Logger::message("Current global IP: " + ip);
 | 
					 | 
				
			||||||
        std::string msg = "Your current global IP: " + ip;
 | 
					 | 
				
			||||||
        this->ui->labelCurrentIP->setText(msg.c_str());
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set config info label and initial check if config is valid
 | 
					 | 
				
			||||||
    ui->labelConfig->setText(Config::validateConfig() ? "Config is: OK" : "Config is: NOT OK");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (Config::readConfig()) {
 | 
					 | 
				
			||||||
        ui->dynuapikeyedit->setText(Config::getDynuapikey().c_str());
 | 
					 | 
				
			||||||
        ui->domainidedit->setText(Config::getDomainid().c_str());
 | 
					 | 
				
			||||||
        ui->domainnameedit->setText(Config::getDomainname().c_str());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (Config::isTelegramSupported()) {
 | 
					 | 
				
			||||||
            ui->telegramsupportCheckbox->setCheckState(Qt::Checked);
 | 
					 | 
				
			||||||
            ui->telegramapikeyedit->setText(Config::getTelegramApiKey().c_str());
 | 
					 | 
				
			||||||
            ui->chatidedit->setText(Config::getChatId().c_str());
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            ui->telegramsupportCheckbox->setCheckState(Qt::Unchecked);
 | 
					 | 
				
			||||||
            ui->telegramapikeyedit->setDisabled(true);
 | 
					 | 
				
			||||||
            ui->chatidedit->setDisabled(true);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        // todo duplicate code with above
 | 
					 | 
				
			||||||
        ui->telegramsupportCheckbox->setCheckState(Qt::Unchecked);
 | 
					 | 
				
			||||||
        ui->telegramapikeyedit->setDisabled(true);
 | 
					 | 
				
			||||||
        ui->chatidedit->setDisabled(true);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,320 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<ui version="4.0">
 | 
					 | 
				
			||||||
 <class>MainWindow</class>
 | 
					 | 
				
			||||||
 <widget class="QMainWindow" name="MainWindow">
 | 
					 | 
				
			||||||
  <property name="geometry">
 | 
					 | 
				
			||||||
   <rect>
 | 
					 | 
				
			||||||
    <x>0</x>
 | 
					 | 
				
			||||||
    <y>0</y>
 | 
					 | 
				
			||||||
    <width>823</width>
 | 
					 | 
				
			||||||
    <height>618</height>
 | 
					 | 
				
			||||||
   </rect>
 | 
					 | 
				
			||||||
  </property>
 | 
					 | 
				
			||||||
  <property name="cursor">
 | 
					 | 
				
			||||||
   <cursorShape>ArrowCursor</cursorShape>
 | 
					 | 
				
			||||||
  </property>
 | 
					 | 
				
			||||||
  <property name="windowTitle">
 | 
					 | 
				
			||||||
   <string>MainWindow</string>
 | 
					 | 
				
			||||||
  </property>
 | 
					 | 
				
			||||||
  <property name="styleSheet">
 | 
					 | 
				
			||||||
   <string notr="true">/*background-color: rgb(69, 196, 255);</string>
 | 
					 | 
				
			||||||
  </property>
 | 
					 | 
				
			||||||
  <widget class="QWidget" name="centralwidget">
 | 
					 | 
				
			||||||
   <widget class="QPlainTextEdit" name="textLog">
 | 
					 | 
				
			||||||
    <property name="enabled">
 | 
					 | 
				
			||||||
     <bool>false</bool>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
    <property name="geometry">
 | 
					 | 
				
			||||||
     <rect>
 | 
					 | 
				
			||||||
      <x>40</x>
 | 
					 | 
				
			||||||
      <y>410</y>
 | 
					 | 
				
			||||||
      <width>741</width>
 | 
					 | 
				
			||||||
      <height>191</height>
 | 
					 | 
				
			||||||
     </rect>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
    <property name="cursor" stdset="0">
 | 
					 | 
				
			||||||
     <cursorShape>IBeamCursor</cursorShape>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
   </widget>
 | 
					 | 
				
			||||||
   <widget class="QLabel" name="label_2">
 | 
					 | 
				
			||||||
    <property name="geometry">
 | 
					 | 
				
			||||||
     <rect>
 | 
					 | 
				
			||||||
      <x>40</x>
 | 
					 | 
				
			||||||
      <y>380</y>
 | 
					 | 
				
			||||||
      <width>64</width>
 | 
					 | 
				
			||||||
      <height>17</height>
 | 
					 | 
				
			||||||
     </rect>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
    <property name="text">
 | 
					 | 
				
			||||||
     <string>Log:</string>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
   </widget>
 | 
					 | 
				
			||||||
   <widget class="QTabWidget" name="tabWidget">
 | 
					 | 
				
			||||||
    <property name="geometry">
 | 
					 | 
				
			||||||
     <rect>
 | 
					 | 
				
			||||||
      <x>40</x>
 | 
					 | 
				
			||||||
      <y>20</y>
 | 
					 | 
				
			||||||
      <width>741</width>
 | 
					 | 
				
			||||||
      <height>351</height>
 | 
					 | 
				
			||||||
     </rect>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
    <property name="currentIndex">
 | 
					 | 
				
			||||||
     <number>0</number>
 | 
					 | 
				
			||||||
    </property>
 | 
					 | 
				
			||||||
    <widget class="QWidget" name="basic">
 | 
					 | 
				
			||||||
     <attribute name="title">
 | 
					 | 
				
			||||||
      <string>Basic</string>
 | 
					 | 
				
			||||||
     </attribute>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="labelCurrentIP">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>20</x>
 | 
					 | 
				
			||||||
        <y>30</y>
 | 
					 | 
				
			||||||
        <width>301</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Your current global IP:</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="labelConfig">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>20</x>
 | 
					 | 
				
			||||||
        <y>70</y>
 | 
					 | 
				
			||||||
        <width>141</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Config is: undefined</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QGroupBox" name="groupBox">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>20</x>
 | 
					 | 
				
			||||||
        <y>120</y>
 | 
					 | 
				
			||||||
        <width>231</width>
 | 
					 | 
				
			||||||
        <height>151</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="title">
 | 
					 | 
				
			||||||
       <string>Actions</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <widget class="QPushButton" name="buttonCheckConfig">
 | 
					 | 
				
			||||||
       <property name="geometry">
 | 
					 | 
				
			||||||
        <rect>
 | 
					 | 
				
			||||||
         <x>30</x>
 | 
					 | 
				
			||||||
         <y>50</y>
 | 
					 | 
				
			||||||
         <width>91</width>
 | 
					 | 
				
			||||||
         <height>33</height>
 | 
					 | 
				
			||||||
        </rect>
 | 
					 | 
				
			||||||
       </property>
 | 
					 | 
				
			||||||
       <property name="cursor">
 | 
					 | 
				
			||||||
        <cursorShape>ArrowCursor</cursorShape>
 | 
					 | 
				
			||||||
       </property>
 | 
					 | 
				
			||||||
       <property name="text">
 | 
					 | 
				
			||||||
        <string>Check Config</string>
 | 
					 | 
				
			||||||
       </property>
 | 
					 | 
				
			||||||
      </widget>
 | 
					 | 
				
			||||||
      <widget class="QPushButton" name="buttonRefreshIP">
 | 
					 | 
				
			||||||
       <property name="geometry">
 | 
					 | 
				
			||||||
        <rect>
 | 
					 | 
				
			||||||
         <x>30</x>
 | 
					 | 
				
			||||||
         <y>100</y>
 | 
					 | 
				
			||||||
         <width>91</width>
 | 
					 | 
				
			||||||
         <height>33</height>
 | 
					 | 
				
			||||||
        </rect>
 | 
					 | 
				
			||||||
       </property>
 | 
					 | 
				
			||||||
       <property name="text">
 | 
					 | 
				
			||||||
        <string>Refresh IP</string>
 | 
					 | 
				
			||||||
       </property>
 | 
					 | 
				
			||||||
      </widget>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
    </widget>
 | 
					 | 
				
			||||||
    <widget class="QWidget" name="config">
 | 
					 | 
				
			||||||
     <attribute name="title">
 | 
					 | 
				
			||||||
      <string>Config</string>
 | 
					 | 
				
			||||||
     </attribute>
 | 
					 | 
				
			||||||
     <widget class="QCheckBox" name="telegramsupportCheckbox">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>120</y>
 | 
					 | 
				
			||||||
        <width>181</width>
 | 
					 | 
				
			||||||
        <height>21</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Telegram Notifications</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QPushButton" name="buttonSaveConfig">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>630</x>
 | 
					 | 
				
			||||||
        <y>270</y>
 | 
					 | 
				
			||||||
        <width>91</width>
 | 
					 | 
				
			||||||
        <height>33</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Save Config</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>20</y>
 | 
					 | 
				
			||||||
        <width>101</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Dynu API Key</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label_3">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>460</x>
 | 
					 | 
				
			||||||
        <y>20</y>
 | 
					 | 
				
			||||||
        <width>111</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Domain ID</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label_4">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>170</y>
 | 
					 | 
				
			||||||
        <width>131</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Telegram API Key</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label_5">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>240</y>
 | 
					 | 
				
			||||||
        <width>64</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Chat ID</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLineEdit" name="dynuapikeyedit">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>40</y>
 | 
					 | 
				
			||||||
        <width>211</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLineEdit" name="domainidedit">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>460</x>
 | 
					 | 
				
			||||||
        <y>40</y>
 | 
					 | 
				
			||||||
        <width>113</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLineEdit" name="chatidedit">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>260</y>
 | 
					 | 
				
			||||||
        <width>113</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLineEdit" name="telegramapikeyedit">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>30</x>
 | 
					 | 
				
			||||||
        <y>190</y>
 | 
					 | 
				
			||||||
        <width>311</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLineEdit" name="domainnameedit">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>280</x>
 | 
					 | 
				
			||||||
        <y>40</y>
 | 
					 | 
				
			||||||
        <width>161</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="placeholderText">
 | 
					 | 
				
			||||||
       <string>domain.dynu.net</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label_6">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>280</x>
 | 
					 | 
				
			||||||
        <y>20</y>
 | 
					 | 
				
			||||||
        <width>111</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Domainname</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
    </widget>
 | 
					 | 
				
			||||||
    <widget class="QWidget" name="settings">
 | 
					 | 
				
			||||||
     <attribute name="title">
 | 
					 | 
				
			||||||
      <string>Settings</string>
 | 
					 | 
				
			||||||
     </attribute>
 | 
					 | 
				
			||||||
     <widget class="QLabel" name="label_7">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>20</x>
 | 
					 | 
				
			||||||
        <y>30</y>
 | 
					 | 
				
			||||||
        <width>161</width>
 | 
					 | 
				
			||||||
        <height>17</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
      <property name="text">
 | 
					 | 
				
			||||||
       <string>Select your language:</string>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
     <widget class="QComboBox" name="languageComboBox">
 | 
					 | 
				
			||||||
      <property name="geometry">
 | 
					 | 
				
			||||||
       <rect>
 | 
					 | 
				
			||||||
        <x>20</x>
 | 
					 | 
				
			||||||
        <y>60</y>
 | 
					 | 
				
			||||||
        <width>94</width>
 | 
					 | 
				
			||||||
        <height>31</height>
 | 
					 | 
				
			||||||
       </rect>
 | 
					 | 
				
			||||||
      </property>
 | 
					 | 
				
			||||||
     </widget>
 | 
					 | 
				
			||||||
    </widget>
 | 
					 | 
				
			||||||
   </widget>
 | 
					 | 
				
			||||||
  </widget>
 | 
					 | 
				
			||||||
  <widget class="QStatusBar" name="statusbar"/>
 | 
					 | 
				
			||||||
 </widget>
 | 
					 | 
				
			||||||
 <resources/>
 | 
					 | 
				
			||||||
 <connections/>
 | 
					 | 
				
			||||||
</ui>
 | 
					 | 
				
			||||||
							
								
								
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
#include "StaticData.h"
 | 
					#include <CMDParser.h>
 | 
				
			||||||
 | 
					#include <Logger.h>
 | 
				
			||||||
#include "IPRefresher.h"
 | 
					#include "IPRefresher.h"
 | 
				
			||||||
#include "Logger.h"
 | 
					 | 
				
			||||||
#include "Config.h"
 | 
					#include "Config.h"
 | 
				
			||||||
#include "api/IPAPI.h"
 | 
					#include "api/IPAPI.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -8,47 +8,26 @@
 | 
				
			|||||||
 * application entry point
 | 
					 * application entry point
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int main(int argc, char *argv[]) {
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
    if (argc > 1) {
 | 
					    CMDParser parser;
 | 
				
			||||||
        std::string firstarg(argv[1]);
 | 
					    CMDParser::Arguments *args = parser.parseArguments(argc, argv);
 | 
				
			||||||
        if (firstarg == "-h" || firstarg == "--help") {
 | 
					
 | 
				
			||||||
            std::cout << "help page: " << std::endl << "[-h] [--help]  print this help page" << std::endl
 | 
					    if (args->currentIP) {
 | 
				
			||||||
                      << "[-v] [--version] print the software version" << std::endl
 | 
					        IPAPI ipapi;
 | 
				
			||||||
                      << "[-f] [--force] force refresh of ip" << std::endl
 | 
					        const std::string ip = ipapi.getGlobalIp();
 | 
				
			||||||
                      << "[-l] [--loop] infinite loop to refresh ip every five minutes" << std::endl
 | 
					
 | 
				
			||||||
                      << "[-c] [--checkconfig] validate configuration" << std::endl
 | 
					        std::cout << "Current global IP: " << ip << std::endl;
 | 
				
			||||||
                      << "[-ip] [--currentip] get current global ip" << std::endl
 | 
					        return 0;
 | 
				
			||||||
                      << "[no argument] normal ip check and refresh" << std::endl;
 | 
					 | 
				
			||||||
        } else if (firstarg == "-v" || firstarg == "--version") {
 | 
					 | 
				
			||||||
            std::cout << "Version " << StaticData::VERSION << std::endl;
 | 
					 | 
				
			||||||
        } else if (firstarg == "-f" || firstarg == "--force") {
 | 
					 | 
				
			||||||
            if (Config::readConfig()) {
 | 
					 | 
				
			||||||
                IPRefresher::checkIPAdress(true);
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                std::cout << "incorrect credentials!" << std::endl;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } else if (firstarg == "-l" || firstarg == "--loop") {
 | 
					    // loop mode
 | 
				
			||||||
 | 
					    if (args->loop)
 | 
				
			||||||
        IPRefresher::startUpService(true);
 | 
					        IPRefresher::startUpService(true);
 | 
				
			||||||
        } else if (firstarg == "-c" || firstarg == "--checkconfig") {
 | 
					
 | 
				
			||||||
            if (Config::validateConfig()) {
 | 
					    // default mode
 | 
				
			||||||
                Logger::message("Config file is OK");
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                Logger::error("There are errors in config file!");
 | 
					 | 
				
			||||||
                return -1;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else if (firstarg == "-ip" || firstarg == "--currentip") {
 | 
					 | 
				
			||||||
            IPAPI ipapi;
 | 
					 | 
				
			||||||
            std::cout << "Current global IP: " << ipapi.getGlobalIp() << std::endl;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            Logger::message("wrong arguments!  -h for help");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        Logger::message("starting check");
 | 
					 | 
				
			||||||
    if (Config::readConfig()) {
 | 
					    if (Config::readConfig()) {
 | 
				
			||||||
            IPRefresher::checkIPAdress(false);
 | 
					        IPRefresher::checkIPAdress(args->force);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
            std::cout << "incorrect credentials!" << std::endl;
 | 
					        Logger::error("incorrect credentials!");
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
#include <QApplication>
 | 
					 | 
				
			||||||
#include "gui/MainWindow.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * application entry point
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int main(int argc, char *argv[]) {
 | 
					 | 
				
			||||||
    QApplication a(argc, argv);
 | 
					 | 
				
			||||||
    MainWindow w;
 | 
					 | 
				
			||||||
    w.setWindowTitle("Dynu IP Refresher");
 | 
					 | 
				
			||||||
    w.show();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return QApplication::exec();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user