diff --git a/Dockerfile.dropshell-build b/Dockerfile.dropshell-build index 402f100..b4c72e7 100644 --- a/Dockerfile.dropshell-build +++ b/Dockerfile.dropshell-build @@ -34,10 +34,66 @@ RUN apk add --no-cache \ elfutils-dev \ elfutils-libelf \ binutils \ - binutils-dev - + binutils-dev \ + pipx \ + openssl-dev \ + sqlite-dev \ + libpq-dev \ + mariadb-connector-c-dev \ + c-ares-dev \ + jsoncpp-dev \ + ninja \ + util-linux-dev \ + util-linux-static \ + perl + #RUN apk add --no-cache --update --repository=https://dl-cdn.alpinelinux.org/alpine/v3.16/main/ libexecinfo-dev +SHELL ["/bin/bash", "-c"] + + +# Build OpenSSL statically with musl +ARG OPENSSL_VERSION=3.3.0 +WORKDIR /tmp +RUN curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \ + tar xzf openssl-${OPENSSL_VERSION}.tar.gz && \ + cd openssl-${OPENSSL_VERSION} && \ + ./Configure no-shared no-dso no-tests no-async linux-x86_64 \ + --prefix=/usr/local/openssl-musl \ + -static -fPIC && \ + make -j$(nproc) && \ + make install_sw && \ + cd / && rm -rf /tmp/openssl-${OPENSSL_VERSION} /tmp/openssl-${OPENSSL_VERSION}.tar.gz + + +#ARG DROGON_VERSION=1.9.5 +RUN git clone --recurse-submodules https://github.com/drogonframework/drogon.git /tmp/drogon && \ +#RUN git clone --branch v${DROGON_VERSION} --depth 1 https://github.com/drogonframework/drogon.git /tmp/drogon && \ + mkdir -p /tmp/drogon/build && \ + cd /tmp/drogon/build && \ + cmake .. \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_CXX_FLAGS="-static -static-libgcc -static-libstdc++" \ + -DCMAKE_EXE_LINKER_FLAGS="-static" \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \ + -DUSE_MONGODB=OFF \ + -DUSE_POSTGRESQL=ON \ + -DUSE_MYSQL=ON \ + -DUSE_SQLITE3=ON \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=OFF \ + -DUUID_LIBRARY=/usr/lib/libuuid.a \ + -DOPENSSL_ROOT_DIR=/usr/local/openssl-musl \ + -DOPENSSL_USE_STATIC_LIBS=TRUE \ + &&\ + make -j$(nproc) && \ + make install && \ + cd / && rm -rf /tmp/drogon + + # Set working directory WORKDIR /app @@ -78,3 +134,4 @@ ARG PROJECT # Copy the actual binary from the regular directory COPY --from=builder /output/${PROJECT} /${PROJECT} + diff --git a/conanfile.txt b/conanfile.txt deleted file mode 100644 index 0e5f07b..0000000 --- a/conanfile.txt +++ /dev/null @@ -1,18 +0,0 @@ -[requires] -drogon/1.9.1 - -[generators] -cmake_find_package -cmake_paths -cmake_find_package_multi - -[options] -drogon:with_orm=True -drogon:with_postgres=True -drogon:with_sqlite3=True -drogon:with_redis=True -drogon:with_brotli=True -drogon:with_zlib=True - -[build_requires] -cmake/3.28.3 diff --git a/ipdemo/CMakeLists.txt b/ipdemo/CMakeLists.txt index 13c5e1c..2a6d52d 100644 --- a/ipdemo/CMakeLists.txt +++ b/ipdemo/CMakeLists.txt @@ -72,6 +72,8 @@ target_include_directories(${PROJECT_EXE_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen ) + + # Add nlohmann/json FetchContent_Declare( nlohmann_json @@ -93,9 +95,20 @@ set(EXTRA_LIBS -ldl # For dladdr ) + +########## +# If you include the drogon source code locally in your project, use this method to add drogon +# add_subdirectory(external/drogon) +# target_link_libraries(${PROJECT_NAME} PRIVATE drogon) +########## +find_package(Drogon CONFIG REQUIRED) +target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon) + + # Link libraries target_link_libraries(${PROJECT_EXE_NAME} PRIVATE nlohmann_json::nlohmann_json + Drogon::Drogon ${EXTRA_LIBS} ) diff --git a/ipdemo/src/main.cpp b/ipdemo/src/main.cpp index a661efe..3d8ed7d 100644 --- a/ipdemo/src/main.cpp +++ b/ipdemo/src/main.cpp @@ -1,7 +1,7 @@ #include #include -#include "httplib.hpp" +#include #include "version.hpp" #include "assert.hpp" @@ -14,14 +14,30 @@ int main() { std::cout << std::endl; std::cout << "Retrieving IP address..." << std::endl; - httplib::Client cli("http://ipinfo.io"); - auto res = cli.Get("/ip"); + auto loop = trantor::EventLoop::getEventLoopOfCurrentThread(); + auto client = drogon::HttpClient::newHttpClient("http://ipinfo.io", loop); + auto req = drogon::HttpRequest::newHttpRequest(); + req->setMethod(drogon::Get); + req->setPath("/ip"); + std::string ip_body; + int status = 0; + bool done = false; + client->sendRequest(req, [&](drogon::ReqResult result, const drogon::HttpResponsePtr &resp) { + if (result == drogon::ReqResult::Ok && resp) { + ip_body = resp->body(); + status = resp->statusCode(); + } else { + status = 0; + } + done = true; + }); + while (!done) loop->loopOnce(); - ASSERT(res->status == 200, "Failed to get IP"); + ASSERT(status == 200, "Failed to get IP"); nlohmann::json j; - j["ip"] = res->body; - j["status"] = res->status; + j["ip"] = ip_body; + j["status"] = status; std::cout << j.dump(4) << std::endl;