From c5bf9702410adb5b6a0a54480d2a40ec7a97038e Mon Sep 17 00:00:00 2001 From: Oskari Rauta Date: Sun, 28 May 2023 13:47:30 +0300 Subject: [PATCH] speedtestcpp: add new package speedtestcpp is a fork of Taganaka's speedtest, rewritten. It has some improvements such as - interactive result show - use server recommended profiles, which makes it faster (can be disabled) - and more.. It also provides it's functions in shared and static libraries and offers development headers for integrating speedtest to features to another projects. This commit replaces speedtestpp since this fork has all the same features + more. Signed-off-by: Oskari Rauta --- net/speedtestcpp/Makefile | 66 +++++ net/speedtestpp/Makefile | 42 --- .../patches/01-remove-libxml-dependency.patch | 239 ------------------ 3 files changed, 66 insertions(+), 281 deletions(-) create mode 100644 net/speedtestcpp/Makefile delete mode 100644 net/speedtestpp/Makefile delete mode 100644 net/speedtestpp/patches/01-remove-libxml-dependency.patch diff --git a/net/speedtestcpp/Makefile b/net/speedtestcpp/Makefile new file mode 100644 index 000000000..95e8dc382 --- /dev/null +++ b/net/speedtestcpp/Makefile @@ -0,0 +1,66 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=speedtestcpp +PKG_VERSION:=1.20.2 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/oskarirauta/speedtestcpp/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=7d5c85f1d9a46f7d8a3ac4261ef1f92e53c511430bae096f7ec6f12a33d38904 + +PKG_MAINTAINER:=Oskari Rauta +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE + +include $(INCLUDE_DIR)/package.mk + +define Package/libspeedtestcpp + SECTION:=libs + CATEGORY:=Libraries + TITLE:=library for ookla's speedtest + DEPENDS:=+libcurl +libstdcpp + URL:=https://github.com/oskarirauta/speedtestcpp +endef + +define Package/libspeedtestcpp/description + Shared library that provides support for ookla's speedtest +endef + +define Package/speedtestcpp + SECTION:=net + CATEGORY:=Network + TITLE:=SpeedTest++ + DEPENDS:=+libspeedtestcpp +libstdcpp + URL:=https://github.com/oskarirauta/speedtestcpp + PROVIDES:=speedtestpp +endef + +define Package/speedtestcpp/description + Yet another unofficial speedtest.net client cli interface + forked from taganaka's SpeedTest with few improments and + lesser depends. +endef + +TARGET_CXXFLAGS += --std=c++23 -fPIC + +define Build/Configure +endef + +define Package/libspeedtestcpp/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.so* $(1)/usr/lib/ +endef + +define Package/speedtestcpp/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/speedtest $(1)/usr/bin/ +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/lib $(1)/usr/include/speedtest + $(CP) $(PKG_BUILD_DIR)/libspeedtestcpp.{so*,a} $(1)/usr/lib/ + $(CP) $(PKG_BUILD_DIR)/include/speedtest/*.hpp $(1)/usr/include/speedtest/ +endef + +$(eval $(call BuildPackage,libspeedtestcpp)) +$(eval $(call BuildPackage,speedtestcpp)) diff --git a/net/speedtestpp/Makefile b/net/speedtestpp/Makefile deleted file mode 100644 index 41cbd1d71..000000000 --- a/net/speedtestpp/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=speedtestpp -PKG_VERSION:=1.14 -PKG_RELEASE:=2 - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://github.com/taganaka/SpeedTest.git -PKG_SOURCE_DATE:=2021-12-06 -PKG_SOURCE_VERSION:=0f63cfbf7ce8d64ea803bf143b957eae76323405 -PKG_MIRROR_HASH:=4221584dc3e1e31f2560ef347298a2bcca3ac2331049970b7bd7d742e4e1825f - -PKG_MAINTAINER:=Oskari Rauta -PKG_LICENSE:=MIT - -CMAKE_INSTALL:=1 - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk -include $(INCLUDE_DIR)/cmake.mk - -CMAKE_OPTIONS += -DCMAKE_BUILD_TYPE=Release . - -define Package/speedtestpp - SECTION:=net - CATEGORY:=Network - TITLE:=speedtest++ - DEPENDS:=+libcurl +libopenssl +libstdcpp $(ICONV_DEPENDS) - CONFLICTS:=python3-speedtest-cli - URL:=https://github.com/taganaka/SpeedTest -endef - -define Package/speedtestpp/description - Yet another unofficial speedtest.net client cli interface -endef - -define Package/speedtestpp/install - $(INSTALL_DIR) $(1)/usr/bin - $(CP) $(PKG_INSTALL_DIR)/usr/bin/SpeedTest $(1)/usr/bin/speedtest -endef - -$(eval $(call BuildPackage,speedtestpp)) diff --git a/net/speedtestpp/patches/01-remove-libxml-dependency.patch b/net/speedtestpp/patches/01-remove-libxml-dependency.patch deleted file mode 100644 index c7ef9f763..000000000 --- a/net/speedtestpp/patches/01-remove-libxml-dependency.patch +++ /dev/null @@ -1,239 +0,0 @@ -From b7db370449cfe2b453c22b74a660701f78bd7ce3 Mon Sep 17 00:00:00 2001 -From: Anatolii Lapytskyi -Date: Tue, 6 Sep 2022 15:59:27 +0200 -Subject: [PATCH] Remove dependency on libxml2 - ---- - CMakeLists.txt | 5 +- - README.md | 5 +- - SpeedTest.cpp | 136 ++++++++++++++----------------------------------- - SpeedTest.h | 2 - - 4 files changed, 41 insertions(+), 107 deletions(-) - ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -44,7 +44,6 @@ add_executable(SpeedTest ${SOURCE_FILES} - - INCLUDE (CheckIncludeFiles) - find_package(CURL REQUIRED) --find_package(LibXml2 REQUIRED) - - if (NOT (APPLE)) - find_package(OpenSSL REQUIRED) -@@ -52,7 +51,7 @@ else() - CHECK_INCLUDE_FILES("CommonCrypto/CommonDigest.h" HAVE_COMMON_DIGEST_H) - endif() - --include_directories(${CURL_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR}) --target_link_libraries(SpeedTest ${CURL_LIBRARIES} ${LIBXML2_LIBRARIES} -lpthread ${OPENSSL_LIBRARIES}) -+include_directories(${CURL_INCLUDE_DIRS}) -+target_link_libraries(SpeedTest ${CURL_LIBRARIES} -lpthread ${OPENSSL_LIBRARIES}) - - install(TARGETS SpeedTest RUNTIME DESTINATION bin) ---- a/README.md -+++ b/README.md -@@ -26,7 +26,6 @@ It supports the new (undocumented) raw T - 2. cmake - 3. libcurl - 4. libssl --5. libxml2 - - ### On Mac OS X - -@@ -40,7 +39,7 @@ $ make install - ### On Ubuntu/Debian - - ``` --$ sudo apt-get install build-essential libcurl4-openssl-dev libxml2-dev libssl-dev cmake -+$ sudo apt-get install build-essential libcurl4-openssl-dev libssl-dev cmake - $ git clone https://github.com/taganaka/SpeedTest - $ cd SpeedTest - $ cmake -DCMAKE_BUILD_TYPE=Release . -@@ -50,7 +49,7 @@ $ sudo make install - ### On OpenSuse - - ``` --$ sudo zypper install cmake gcc-c++ libcurl-devel libxml2-devel libopenssl-devel git -+$ sudo zypper install cmake gcc-c++ libcurl-devel libopenssl-devel git - $ git clone https://github.com/taganaka/SpeedTest - $ cd SpeedTest - $ cmake -DCMAKE_BUILD_TYPE=Release . ---- a/SpeedTest.cpp -+++ b/SpeedTest.cpp -@@ -353,67 +353,16 @@ std::vector SpeedTest::spli - - } - --ServerInfo SpeedTest::processServerXMLNode(xmlTextReaderPtr reader) { -- -- auto name = xmlTextReaderConstName(reader); -- auto nodeName = std::string((char*)name); -- -- if (!name || nodeName != "server"){ -- return ServerInfo(); -- } -- -- if (xmlTextReaderAttributeCount(reader) > 0){ -- auto info = ServerInfo(); -- auto server_url = xmlTextReaderGetAttribute(reader, BAD_CAST "url"); -- auto server_lat = xmlTextReaderGetAttribute(reader, BAD_CAST "lat"); -- auto server_lon = xmlTextReaderGetAttribute(reader, BAD_CAST "lon"); -- auto server_name = xmlTextReaderGetAttribute(reader, BAD_CAST "name"); -- auto server_county = xmlTextReaderGetAttribute(reader, BAD_CAST "country"); -- auto server_cc = xmlTextReaderGetAttribute(reader, BAD_CAST "cc"); -- auto server_host = xmlTextReaderGetAttribute(reader, BAD_CAST "host"); -- auto server_id = xmlTextReaderGetAttribute(reader, BAD_CAST "id"); -- auto server_sponsor = xmlTextReaderGetAttribute(reader, BAD_CAST "sponsor"); -- -- if (server_name) -- info.name.append((char*)server_name); -- -- if (server_url) -- info.url.append((char*)server_url); -- -- if (server_county) -- info.country.append((char*)server_county); -- -- if (server_cc) -- info.country_code.append((char*)server_cc); -- -- if (server_host) -- info.host.append((char*)server_host); -- -- if (server_sponsor) -- info.sponsor.append((char*)server_sponsor); -- -- if (server_id) -- info.id = std::atoi((char*)server_id); -- -- if (server_lat) -- info.lat = std::stof((char*)server_lat); -- -- if (server_lon) -- info.lon = std::stof((char*)server_lon); -- -- xmlFree(server_url); -- xmlFree(server_lat); -- xmlFree(server_lon); -- xmlFree(server_name); -- xmlFree(server_county); -- xmlFree(server_cc); -- xmlFree(server_host); -- xmlFree(server_id); -- xmlFree(server_sponsor); -- return info; -- } -- -- return ServerInfo(); -+std::string getAttributeValue(const std::string& data, const size_t offset, const size_t max_pos, const std::string& attribute_name) { -+ size_t pos = data.find(attribute_name + "=\"", offset); -+ if (pos == std::string::npos) -+ return ""; -+ if (pos >= max_pos) -+ return ""; -+ size_t value_pos = pos + attribute_name.length() + 2; -+ size_t end = data.find("\"", value_pos); -+ std::string s = data.substr(pos + attribute_name.length() + 2, end - value_pos); -+ return s; - } - - bool SpeedTest::fetchServers(const std::string& url, std::vector& target, int &http_code) { -@@ -441,53 +390,42 @@ bool SpeedTest::fetchServers(const std:: - http_code = 200; - } - -- size_t len = oss.str().length(); -- auto *xmlbuff = (char*)calloc(len + 1, sizeof(char)); -- if (!xmlbuff){ -- std::cerr << "Unable to calloc" << std::endl; -+ IPInfo ipInfo; -+ if (!SpeedTest::ipInfo(ipInfo)){ - curl_easy_cleanup(curl); -+ std::cerr << "OOPS!" <(len), nullptr, nullptr, 0); -+ std::string data = oss.str(); - -- if (reader != nullptr) { -- IPInfo ipInfo; -- if (!SpeedTest::ipInfo(ipInfo)){ -- curl_easy_cleanup(curl); -- free(xmlbuff); -- xmlFreeTextReader(reader); -- std::cerr << "OOPS!" <", server_tag_begin); -+ -+ auto info = ServerInfo(); -+ info.name = getAttributeValue(data, server_tag_begin, server_tag_end, "name"); -+ info.url = getAttributeValue(data, server_tag_begin, server_tag_end, "url"); -+ info.country = getAttributeValue(data, server_tag_begin, server_tag_end, "country"); -+ info.country_code = getAttributeValue(data, server_tag_begin, server_tag_end, "cc"); -+ info.host = getAttributeValue(data, server_tag_begin, server_tag_end, "host"); -+ info.sponsor = getAttributeValue(data, server_tag_begin, server_tag_end, "sponsor"); -+ info.id = atoi(getAttributeValue(data, server_tag_begin, server_tag_end, "id").c_str()); -+ info.lat = std::stof(getAttributeValue(data, server_tag_begin, server_tag_end, "lat")); -+ info.lon = std::stof(getAttributeValue(data, server_tag_begin, server_tag_end, "lon")); -+ -+ if (!info.url.empty()){ -+ info.distance = harversine(std::make_pair(ipInfo.lat, ipInfo.lon), std::make_pair(info.lat, info.lon)); -+ target.push_back(info); - } -- } else { -- std::cerr << "Unable to initialize xml parser" << std::endl; -- curl_easy_cleanup(curl); -- free(xmlbuff); -- return false; -+ -+ server_tag_begin = data.find(server_tag_start, server_tag_begin + 1); - } - -+ - curl_easy_cleanup(curl); -- free(xmlbuff); -- xmlCleanupParser(); - std::sort(target.begin(), target.end(), [](const ServerInfo &a, const ServerInfo &b) -> bool { - return a.distance < b.distance; - }); ---- a/SpeedTest.h -+++ b/SpeedTest.h -@@ -7,7 +7,6 @@ - - #include "SpeedTestConfig.h" - #include "SpeedTestClient.h" --#include - #include - #include - #include -@@ -50,7 +49,6 @@ private: - const ServerInfo findBestServerWithin(const std::vector& serverList, long& latency, int sample_size = 5, std::function cb = nullptr); - static CURL* curl_setup(CURL* curl = nullptr); - static size_t writeFunc(void* buf, size_t size, size_t nmemb, void* userp); -- static ServerInfo processServerXMLNode(xmlTextReaderPtr reader); - double execute(const ServerInfo &server, const TestConfig &config, const opFn &fnc, std::function cb = nullptr); - template - static T deg2rad(T n);