diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d249baf1c3..d5dbdcc05e 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -45,6 +45,10 @@ endif () if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -fPIC -DELPP_THREAD_SAFE") + if (GPU_VERSION STREQUAL "ON") + set(ENABLE_LICENSE "ON") + add_definitions("-DENABLE_LICENSE") + endif () else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fPIC -DELPP_THREAD_SAFE") endif() diff --git a/cpp/conf/server_config.yaml b/cpp/conf/server_config.yaml index d91161830b..cd66e0efb5 100644 --- a/cpp/conf/server_config.yaml +++ b/cpp/conf/server_config.yaml @@ -10,6 +10,9 @@ db_config: db_flush_interval: 5 #unit: second idmapper_max_open_file: 128 +license_config: + license_path: "/tmp/megasearch/abc.license" + log_config: global: format: "%datetime | %level | %logger | %msg" diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt index 8fab8929cb..61918b562b 100644 --- a/cpp/src/CMakeLists.txt +++ b/cpp/src/CMakeLists.txt @@ -12,8 +12,13 @@ aux_source_directory(db db_files) aux_source_directory(wrapper wrapper_files) set(license_check_files - ${CMAKE_CURRENT_SOURCE_DIR}/license/LicenseLibrary.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/license/LicenseLibrary.h + license/LicenseLibrary.cpp + license/LicenseCheck.cpp + ) + +set(license_generator_src + license/LicenseGenerator.cpp + license/LicenseLibrary.cpp ) set(service_files @@ -29,11 +34,8 @@ set(vecwise_engine_src ${wrapper_files} ) -set(license_generator_src - ${CMAKE_CURRENT_SOURCE_DIR}/license/LicenseGenerator.cpp) - set(get_sys_info_src - ${CMAKE_CURRENT_SOURCE_DIR}/license/GetSysInfo.cpp) + license/GetSysInfo.cpp) include_directories(/usr/include) include_directories(/usr/local/cuda/include) @@ -60,13 +62,32 @@ else() libgfortran.a libquadmath.a libsqlite3.a - ) + ) endif () -cuda_add_library(vecwise_engine STATIC ${vecwise_engine_src}) +if (ENABLE_LICENSE STREQUAL "ON") + link_directories(/usr/local/cuda/lib64/stubs) + link_directories(/usr/local/cuda/lib64) + set(license_libs + nvidia-ml + libboost_system.a + libboost_filesystem.a + libboost_serialization.a + crypto + cudart + cublas + ) +endif () + +cuda_add_library(vecwise_engine STATIC ${vecwise_engine_src}) target_link_libraries(vecwise_engine ${engine_libs}) +if (ENABLE_LICENSE STREQUAL "ON") + add_library(vecwise_license STATIC ${license_check_files}) + target_link_libraries(vecwise_license ${license_libs}) +endif () + add_executable(vecwise_server ${config_files} ${server_files} @@ -91,12 +112,17 @@ set(server_libs dl ) -target_link_libraries(vecwise_server ${server_libs}) +if (ENABLE_LICENSE STREQUAL "ON") + target_link_libraries(vecwise_server ${server_libs} vecwise_license) +else () + target_link_libraries(vecwise_server ${server_libs}) +endif() -add_executable(license_generator ${license_generator_src}) -<<<<<<< b84d32553f910adf71e4ee069889e1d9fdd8a09f +if (ENABLE_LICENSE STREQUAL "ON") + add_executable(license_generator ${license_generator_src}) + add_executable(get_sys_info ${get_sys_info_src}) + target_link_libraries(get_sys_info ${license_libs} vecwise_license) + target_link_libraries(license_generator ${license_libs}) +endif () -install(TARGETS vecwise_server DESTINATION bin) -======= -add_executable(get_sys_info ${get_sys_info_src}) ->>>>>>> Refactor code +install(TARGETS vecwise_server DESTINATION bin) \ No newline at end of file diff --git a/cpp/src/license/BoostArchive.h b/cpp/src/license/BoostArchive.h deleted file mode 100644 index 4074cc0758..0000000000 --- a/cpp/src/license/BoostArchive.h +++ /dev/null @@ -1,133 +0,0 @@ -// -// Created by zilliz on 19-5-10. -// - -#ifndef VECWISE_ENGINE_BOOSTARCHIVE_H -#define VECWISE_ENGINE_BOOSTARCHIVE_H -#include -#include -#include -#include -#include - -using std::list; -using std::ifstream; -using std::ofstream; -using std::string; -using std::map; - -template -class BoostArchive -{ -public: - typedef T entity_type; - typedef boost::archive::binary_iarchive InputArchive; - typedef boost::archive::binary_oarchive OutputArchive; - - BoostArchive(const string & archive_file_path) - : _file_path_name(archive_file_path) - , _p_ofs(NULL) - , _p_output_archive(NULL) - , _entity_nums(0) - { - load_arvhive_info(); - } - ~BoostArchive() - { - close_output(); - } - //存储一个对象,序列化 - void store(const entity_type & entity); - - //反序列化, 提取所有对象 - bool restore(list & entitys); - - size_t size() const - { - return _entity_nums; - } - -private: - void save_archive_info() //保存已序列化的对象个数信息 - { - ofstream ofs; - ofs.open(get_archive_info_file_path(),std::ios::out | std::ios::trunc); - if (ofs.is_open()) - { - ofs << _entity_nums; - } - ofs.close(); - } - - void load_arvhive_info()//读取已序列化的对象个数信息 - { - ifstream ifs; - ifs.open(get_archive_info_file_path(),std::ios_base::in); - if (ifs.is_open() && !ifs.eof()) - { - int enity_num = 0; - ifs >> enity_num; - _entity_nums = enity_num; - } - ifs.close(); - } - - string get_archive_info_file_path() - { - return "/tmp/vecwise_engine.meta"; - } - - void close_output() - { - if (NULL != _p_output_archive) - { - delete _p_output_archive; - _p_output_archive = NULL; - save_archive_info(); - } - if (NULL != _p_ofs) - { - delete _p_ofs; - _p_ofs = NULL; - } - } - -private: - size_t _entity_nums; - string _file_path_name; - ofstream * _p_ofs; - OutputArchive * _p_output_archive; -}; - -template -bool BoostArchive::restore( list & entitys ) -{ - close_output(); - load_arvhive_info(); - ifstream ifs(_file_path_name); - if (ifs) - { - InputArchive ia(ifs); - for (size_t cnt = 0; cnt < _entity_nums; ++cnt) - { - entity_type entity; - ia & entity; - entitys.push_back(entity); - } - return true; - } - return false; -} - -template -void BoostArchive::store( const entity_type & entity ) -{ - if (NULL == _p_output_archive) - { - _p_ofs = new ofstream(_file_path_name); - _p_output_archive = new OutputArchive(*_p_ofs); - } - (*_p_output_archive) & entity; - ++_entity_nums; -} -#endif //VECWISE_ENGINE_BOOSTARCHIVE_H diff --git a/cpp/src/license/GetSysInfo.cpp b/cpp/src/license/GetSysInfo.cpp index added44360..4ddf671485 100644 --- a/cpp/src/license/GetSysInfo.cpp +++ b/cpp/src/license/GetSysInfo.cpp @@ -1,51 +1,83 @@ + +#include "utils/Log.h" +#include "LicenseLibrary.h" +#include "utils/Error.h" + #include #include #include - // Not provide path: current work path will be used and system.info. +using namespace zilliz::vecwise; void print_usage(const std::string &app_name) { printf("\n Usage: %s [OPTIONS]\n\n", app_name.c_str()); printf(" Options:\n"); printf(" -h --help Print this help\n"); - printf(" -d --sysinfo filename Generate system info file as given name\n"); + printf(" -s --sysinfo filename Generate system info file as given name\n"); printf("\n"); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { std::string app_name = argv[0]; - if(argc != 1 && argc != 3) { + if (argc != 1 && argc != 3) { print_usage(app_name); return EXIT_FAILURE; } - static struct option long_options[] = {{"system_info", required_argument, 0, 'd'}, + static struct option long_options[] = {{"system_info", required_argument, 0, 's'}, {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0}}; int value = 0; int option_index = 0; std::string system_info_filename = "./system.info"; - while ((value = getopt_long(argc, argv, "d:h", long_options, &option_index)) != -1) { + while ((value = getopt_long(argc, argv, "s:h", long_options, &option_index)) != -1) { switch (value) { - case 'd': { + case 's': { char *system_info_filename_ptr = strdup(optarg); system_info_filename = system_info_filename_ptr; free(system_info_filename_ptr); // printf("Generate system info file: %s\n", system_info_filename.c_str()); break; } - case 'h': - print_usage(app_name); + case 'h':print_usage(app_name); return EXIT_SUCCESS; - case '?': - print_usage(app_name); + case '?':print_usage(app_name); return EXIT_FAILURE; - default: - print_usage(app_name); + default:print_usage(app_name); break; } } + int device_count = 0; + server::ServerError err = server::LicenseLibrary::GetDeviceCount(device_count); + if (err != server::SERVER_SUCCESS) return -1; + + // 2. Get All GPU UUID + std::vector uuid_array; + err = server::LicenseLibrary::GetUUID(device_count, uuid_array); + if (err != server::SERVER_SUCCESS) return -1; + + // 3. Get UUID SHA256 + std::vector uuid_sha256_array; + err = server::LicenseLibrary::GetUUIDSHA256(device_count, uuid_array, uuid_sha256_array); + if (err != server::SERVER_SUCCESS) return -1; + + // 4. Generate GPU ID map with GPU UUID + std::map uuid_encrption_map; + for (int i = 0; i < device_count; ++i) { + uuid_encrption_map[i] = uuid_sha256_array[i]; + } + + + // 6. Generate GPU_info File + err = server::LicenseLibrary::GPUinfoFileSerialization(system_info_filename, + device_count, + uuid_encrption_map); + if (err != server::SERVER_SUCCESS) return -1; + + printf("Generate GPU_info File Success\n"); + + return 0; } \ No newline at end of file diff --git a/cpp/src/license/LicenseCheck.cpp b/cpp/src/license/LicenseCheck.cpp index 1566f4e951..7c3e4a30de 100644 --- a/cpp/src/license/LicenseCheck.cpp +++ b/cpp/src/license/LicenseCheck.cpp @@ -1,28 +1,137 @@ #include "LicenseCheck.h" +#include +#include +#include +//#include +//#include +#include +#include +#include + namespace zilliz { namespace vecwise { namespace server { -class LicenseCheck { - public: - static LicenseCheck& - GetInstance() { - static LicenseCheck instance; - return instance; + +//ServerError +//LicenseCheck::IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path) { +// +// std::string file_md5; +// LicenseLibrary::GetFileMD5(license_file_path, file_md5); +// time_t update_time; +// off_t file_size; +// LicenseLibrary::GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); +// time_t system_time; +// LicenseLibrary::GetSystemTime(system_time); +// +// std::string output_file_md5; +// time_t output_update_time; +// off_t output_file_size; +// time_t output_starting_time; +// time_t output_end_time; +// LicenseLibrary::SecretFileDeserialization(secret_file_path, +// output_update_time, +// output_file_size, +// output_starting_time, +// output_end_time, +// output_file_md5); +// if (file_md5 != output_file_md5) { +// printf("License file has been modified\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (update_time != output_update_time) { +// printf("update_time is wrong\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (file_size != output_file_size) { +// printf("file_size is wrong\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (system_time < output_starting_time || system_time > output_end_time) { +// printf("License expired\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// return SERVER_SUCCESS; +//} + +// Part 1: Legality check + +ServerError +LicenseCheck::LegalityCheck(const std::string &license_file_path) { + + int device_count; + LicenseLibrary::GetDeviceCount(device_count); + std::vector uuid_array; + LicenseLibrary::GetUUID(device_count, uuid_array); + + std::vector sha_array; + LicenseLibrary::GetUUIDSHA256(device_count, uuid_array, sha_array); + + int output_device_count; + std::map uuid_encryption_map; + time_t starting_time; + time_t end_time; + ServerError err = LicenseLibrary::LicenseFileDeserialization(license_file_path, + output_device_count, + uuid_encryption_map, + starting_time, + end_time); + if(err !=SERVER_SUCCESS) + { + printf("License check error: 01\n"); + return SERVER_UNEXPECTED_ERROR; } + time_t system_time; + LicenseLibrary::GetSystemTime(system_time); - ServerError - Check(); + if (device_count != output_device_count) { + printf("License check error: 02\n"); + return SERVER_UNEXPECTED_ERROR; + } + for (int i = 0; i < device_count; ++i) { + if (sha_array[i] != uuid_encryption_map[i]) { + printf("License check error: 03\n"); + return SERVER_UNEXPECTED_ERROR; + } + } + if (system_time < starting_time || system_time > end_time) { + printf("License check error: 04\n"); + return SERVER_UNEXPECTED_ERROR; + } + printf("Legality Check Success\n"); + return SERVER_SUCCESS; +} - ServerError - PeriodicUpdate(); +// Part 2: Timing check license - private: - LicenseCheck() {}; +ServerError +LicenseCheck::AlterFile(const std::string &license_file_path, + const boost::system::error_code &ec, + boost::asio::deadline_timer *pt) { + ServerError err = LegalityCheck(license_file_path); + if(err!=SERVER_SUCCESS) + { + exit(1); + } + printf("---runing---\n"); + pt->expires_at(pt->expires_at() + boost::posix_time::hours(1)); + pt->async_wait(boost::bind(AlterFile, license_file_path, boost::asio::placeholders::error, pt)); + return SERVER_SUCCESS; -}; +} + +ServerError +LicenseCheck::StartCountingDown(const std::string &license_file_path) { + + if (!LicenseLibrary::IsFileExistent(license_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; + boost::asio::io_service io; + boost::asio::deadline_timer t(io, boost::posix_time::hours(1)); + t.async_wait(boost::bind(AlterFile, license_file_path, boost::asio::placeholders::error, &t)); + io.run(); + return SERVER_SUCCESS; +} } } diff --git a/cpp/src/license/LicenseCheck.h b/cpp/src/license/LicenseCheck.h index 4078a45e4c..e3c5b3ac32 100644 --- a/cpp/src/license/LicenseCheck.h +++ b/cpp/src/license/LicenseCheck.h @@ -1,11 +1,47 @@ #pragma once #include "utils/Error.h" +#include "LicenseLibrary.h" + +#include +#include +#include + namespace zilliz { namespace vecwise { namespace server { +class LicenseCheck { + public: + static LicenseCheck & + GetInstance() { + static LicenseCheck instance; + return instance; + }; + +// static ServerError +// IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path); + + // Part 1: Legality check + static ServerError + LegalityCheck(const std::string &license_file_path); + + + // Part 2: Timing check license + static ServerError + AlterFile(const std::string &license_file_path, + const boost::system::error_code &ec, + boost::asio::deadline_timer *pt); + + + static ServerError + StartCountingDown(const std::string &license_file_path); + + private: + + +}; } } diff --git a/cpp/src/license/LicenseCreateTime.cpp b/cpp/src/license/LicenseCreateTime.cpp deleted file mode 100644 index f14d6bb7a5..0000000000 --- a/cpp/src/license/LicenseCreateTime.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// Created by zilliz on 19-5-11. -// - -#include -#include -#include - -#include "utils/Error.h" -#include "license/LicenseCheck.h" -#include "license/LicensePublic.h" - -using namespace zilliz::vecwise; - - - -//TEST(LicenseTest, LICENSE_TEST) { -// -// std::string path1 = "/tmp/vecwise_engine.sha"; -// std::string path2 = "/tmp/vecwise_engine.license"; -// std::string path3 = "/tmp/vecwise_engine2.license"; -// -// std::cout << "This is create licenseTime " << std::endl; -// -// server::ServerError err; -// int deviceCount=0; -// -// std::vector shas; -// err = server::LicenseLoad(path1,deviceCount,shas); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -// std::map uuidEncryption; -// std::cout<< "deviceCount : " << deviceCount << std::endl; -// for(int i=0;i> RemainingTime ; -// -// err = server::LiSave(path2,deviceCount,uuidEncryption,RemainingTime); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -//// int64_t RemainingTimecheck; -//// std::map uuidEncryptioncheck; -//// int deviceCountcheck; -//// err = server::LiLoad(path2,deviceCountcheck,uuidEncryptioncheck,RemainingTimecheck); -//// -//// printf("\n deviceCountcheck = %d\n",deviceCountcheck); -//// std::cout<< "RemainingTimecheck: " << RemainingTimecheck<< std::endl; -// -// time_t update_time; -// off_t file_size; -// std::string filemd5; -// -// server::LicenseGetfiletime(path2,update_time); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// server::LicenseGetfilesize(path2,file_size); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// server::LicenseGetfilemd5(path2,filemd5); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -// -// err = server::LifileSave(path3,update_time,file_size,filemd5); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -// std::cout<< "success" << std::endl; -// -//} diff --git a/cpp/src/license/LicenseCreateuuidshafile.cpp b/cpp/src/license/LicenseCreateuuidshafile.cpp deleted file mode 100644 index 9476c89bd7..0000000000 --- a/cpp/src/license/LicenseCreateuuidshafile.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by zilliz on 19-5-11. -// -#include -#include - -#include "utils/Error.h" -#include "license/LicenseCheck.h" - - -using namespace zilliz::vecwise; - -// -//TEST(LicenseTest, LICENSE_TEST) { -// -// std::string path1 = "/tmp/vecwise_engine.sha"; -// std::cout << "This is create uuidshafile " << std::endl; -// -// server::ServerError err; -// int deviceCount=0; -// std::vector uuids; -// -// err = server::LicenseGetuuid(deviceCount,uuids); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -// std::vector shas; -// err = server::LicenseGetuuidsha(deviceCount,uuids,shas); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -// err = server::LicenseSave(path1,deviceCount,shas); -// ASSERT_EQ(err, server::SERVER_SUCCESS); -// -//} \ No newline at end of file diff --git a/cpp/src/license/LicenseFile.h b/cpp/src/license/LicenseFile.h index 322cea8b85..bf076b0d68 100644 --- a/cpp/src/license/LicenseFile.h +++ b/cpp/src/license/LicenseFile.h @@ -10,12 +10,19 @@ #include #include + class LicenseFile { public: LicenseFile() = default; - LicenseFile(const int &device_count, const std::map &uuid_encryption_map, const int64_t &remaining_hour) - : device_count_(device_count), uuid_encryption_map_(uuid_encryption_map), remaining_hour_(remaining_hour) {} + LicenseFile(const int &device_count, + const std::map &uuid_encryption_map, + const time_t &starting_time, + const time_t &end_time) + : device_count_(device_count), + uuid_encryption_map_(uuid_encryption_map), + starting_time_(starting_time), + end_time_(end_time) {} int get_device_count() { return device_count_; @@ -23,8 +30,11 @@ class LicenseFile { std::map &get_uuid_encryption_map() { return uuid_encryption_map_; } - int64_t get_remaining_hour() { - return remaining_hour_; + time_t get_starting_time() { + return starting_time_; + } + time_t get_end_time() { + return end_time_; } public: @@ -34,30 +44,32 @@ class LicenseFile { void serialize(Archive &ar, const unsigned int version) { ar & device_count_; ar & uuid_encryption_map_; - ar & remaining_hour_; + ar & starting_time_; + ar & end_time_; } public: int device_count_ = 0; std::map uuid_encryption_map_; - int64_t remaining_hour_ = 0; + time_t starting_time_ = 0; + time_t end_time_ = 0; }; class SerializedLicenseFile { public: ~SerializedLicenseFile() { - if(license_file_ != nullptr) { - delete(license_file_); + if (license_file_ != nullptr) { + delete (license_file_); license_file_ = nullptr; } } void - set_license_file(LicenseFile* license_file) { + set_license_file(LicenseFile *license_file) { license_file_ = license_file; } - LicenseFile* get_license_file() { + LicenseFile *get_license_file() { return license_file_; } private: diff --git a/cpp/src/license/LicenseGenerator.cpp b/cpp/src/license/LicenseGenerator.cpp index 278c132962..2160c916ad 100644 --- a/cpp/src/license/LicenseGenerator.cpp +++ b/cpp/src/license/LicenseGenerator.cpp @@ -1,6 +1,136 @@ + #include -int main() { - std::cout << "This is license generator" << std::endl; +#include +#include + +#include "utils/Log.h" +#include "license/LicenseLibrary.h" +#include "utils/Error.h" + + +using namespace zilliz::vecwise; +// Not provide path: current work path will be used and system.info. + +void +print_usage(const std::string &app_name) { + printf("\n Usage: %s [OPTIONS]\n\n", app_name.c_str()); + printf(" Options:\n"); + printf(" -h --help Print this help\n"); + printf(" -s --sysinfo filename sysinfo file location\n"); + printf(" -l --license filename Generate license file as given name\n"); + printf(" -b --starting time Set start time Similar to year-month-day\n"); + printf(" -e --end time Set end time Similar to year-month-day \n"); + printf("\n"); +} + +int main(int argc, char *argv[]) { + std::string app_name = argv[0]; +// if (argc != 1 && argc != 3) { +// print_usage(app_name); +// return EXIT_FAILURE; +// } + static struct option long_options[] = {{"system_info", required_argument, 0, 's'}, + {"license", optional_argument, 0, 'l'}, + {"help", no_argument, 0, 'h'}, + {"starting_time", required_argument, 0, 'b'}, + {"end_time", required_argument, 0, 'e'}, + {NULL, 0, 0, 0}}; + server::ServerError err; + int value = 0; + int option_index = 0; + std::string system_info_filename = "./system.info"; + std::string license_filename = "./system.license"; + char *string_starting_time = NULL; + char *string_end_time = NULL; + time_t starting_time = 0; + time_t end_time = 0; + int flag_s = 1; + int flag_b = 1; + int flag_e = 1; + while ((value = getopt_long(argc, argv, "hl:s:b:e:", long_options, NULL)) != -1) { + switch (value) { + case 's': { + flag_s = 0; + system_info_filename = (std::string) (optarg); +// char *system_info_filename_ptr = strdup(optarg); +// system_info_filename = system_info_filename_ptr; +// free(system_info_filename_ptr); +// printf("Generate system info file: %s\n", system_info_filename.c_str()); + break; + } + case 'b': { + flag_b = 0; + string_starting_time = optarg; +// char *time = strdup(optarg); +// err = server::LicenseLibrary::GetDateTime(time, starting_time); +// if (err != server::SERVER_SUCCESS) return -1; +// free(time); + break; + } + case 'e': { + flag_e = 0; + string_end_time = optarg; +// char *time = strdup(optarg); +// err = server::LicenseLibrary::GetDateTime(time, end_time); +// if (err != server::SERVER_SUCCESS) return -1; +// free(time); + break; + } + case 'l': { + license_filename = (std::string) (optarg); +// char *system_info_filename_ptr = strdup(optarg); +// license_filename = system_info_filename_ptr; +// free(system_info_filename_ptr); + break; + } + case 'h':print_usage(app_name); + return EXIT_SUCCESS; + case '?':print_usage(app_name); + return EXIT_FAILURE; + default:print_usage(app_name); + break; + } + + } + if (flag_s) { + printf("Error: sysinfo file location must be entered\n"); + return 1; + } + if (flag_b) { + printf("Error: start time must be entered\n"); + return 1; + } + if (flag_e) { + printf("Error: end time must be entered\n"); + return 1; + } + + err = server::LicenseLibrary::GetDateTime(string_starting_time, starting_time); + if (err != server::SERVER_SUCCESS) return -1; + + err = server::LicenseLibrary::GetDateTime(string_end_time, end_time); + if (err != server::SERVER_SUCCESS) return -1; + + + int output_info_device_count = 0; + std::map output_info_uuid_encrption_map; + + + err = server::LicenseLibrary::GPUinfoFileDeserialization(system_info_filename, + output_info_device_count, + output_info_uuid_encrption_map); + if (err != server::SERVER_SUCCESS) return -1; + + + err = server::LicenseLibrary::LicenseFileSerialization(license_filename, + output_info_device_count, + output_info_uuid_encrption_map, + starting_time, + end_time); + if (err != server::SERVER_SUCCESS) return -1; + + + printf("Generate License File Success\n"); return 0; -} \ No newline at end of file +} diff --git a/cpp/src/license/LicenseLibrary.cpp b/cpp/src/license/LicenseLibrary.cpp index 237f1679b8..f891ed113d 100644 --- a/cpp/src/license/LicenseLibrary.cpp +++ b/cpp/src/license/LicenseLibrary.cpp @@ -27,7 +27,7 @@ namespace server { constexpr int LicenseLibrary::sha256_length_; bool -LicenseLibrary::IsFileExistent(const std::string& path) { +LicenseLibrary::IsFileExistent(const std::string &path) { boost::system::error_code error; auto file_status = boost::filesystem::status(path, error); @@ -133,12 +133,19 @@ LicenseLibrary::GetUUIDSHA256(const int &device_count, return SERVER_SUCCESS; } +ServerError +LicenseLibrary::GetSystemTime(time_t &system_time) { + system_time = time(NULL); + return SERVER_SUCCESS; +} + // Part 2: Handle License File ServerError LicenseLibrary::LicenseFileSerialization(const std::string &path, int device_count, const std::map &uuid_encrption_map, - int64_t remaining_hour) { + time_t starting_time, + time_t end_time) { std::ofstream file(path); boost::archive::binary_oarchive oa(file); @@ -146,7 +153,10 @@ LicenseLibrary::LicenseFileSerialization(const std::string &path, SerializedLicenseFile serialized_license_file; - serialized_license_file.set_license_file(new LicenseFile(device_count, uuid_encrption_map, remaining_hour)); + serialized_license_file.set_license_file(new LicenseFile(device_count, + uuid_encrption_map, + starting_time, + end_time)); oa << serialized_license_file; file.close(); @@ -157,9 +167,9 @@ ServerError LicenseLibrary::LicenseFileDeserialization(const std::string &path, int &device_count, std::map &uuid_encrption_map, - int64_t &remaining_hour) { - if(!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; - + time_t &starting_time, + time_t &end_time) { + if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; std::ifstream file(path); boost::archive::binary_iarchive ia(file); ia.register_type(); @@ -169,55 +179,62 @@ LicenseLibrary::LicenseFileDeserialization(const std::string &path, device_count = serialized_license_file.get_license_file()->get_device_count(); uuid_encrption_map = serialized_license_file.get_license_file()->get_uuid_encryption_map(); - remaining_hour = serialized_license_file.get_license_file()->get_remaining_hour(); + starting_time = serialized_license_file.get_license_file()->get_starting_time(); + end_time = serialized_license_file.get_license_file()->get_end_time(); file.close(); return SERVER_SUCCESS; } -ServerError -LicenseLibrary::SecretFileSerialization(const std::string &path, - const time_t &update_time, - const off_t &file_size, - const std::string &file_md5) { - std::ofstream file(path); - boost::archive::binary_oarchive oa(file); - oa.register_type(); - - SerializedSecretFile serialized_secret_file; - - serialized_secret_file.set_secret_file(new SecretFile(update_time, file_size, file_md5)); - oa << serialized_secret_file; - - file.close(); - return SERVER_SUCCESS; -} - -ServerError -LicenseLibrary::SecretFileDeserialization(const std::string &path, - time_t &update_time, - off_t &file_size, - std::string &file_md5) { - if(!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; - - std::ifstream file(path); - boost::archive::binary_iarchive ia(file); - ia.register_type(); - SerializedSecretFile serialized_secret_file; - - ia >> serialized_secret_file; - update_time = serialized_secret_file.get_secret_file()->get_update_time(); - file_size = serialized_secret_file.get_secret_file()->get_file_size(); - file_md5 = serialized_secret_file.get_secret_file()->get_file_md5(); - file.close(); - return SERVER_SUCCESS; -} +//ServerError +//LicenseLibrary::SecretFileSerialization(const std::string &path, +// const time_t &update_time, +// const off_t &file_size, +// const time_t &starting_time, +// const time_t &end_time, +// const std::string &file_md5) { +// std::ofstream file(path); +// boost::archive::binary_oarchive oa(file); +// oa.register_type(); +// +// SerializedSecretFile serialized_secret_file; +// +// serialized_secret_file.set_secret_file(new SecretFile(update_time, file_size, starting_time, end_time, file_md5)); +// oa << serialized_secret_file; +// +// file.close(); +// return SERVER_SUCCESS; +//} +// +//ServerError +//LicenseLibrary::SecretFileDeserialization(const std::string &path, +// time_t &update_time, +// off_t &file_size, +// time_t &starting_time, +// time_t &end_time, +// std::string &file_md5) { +// if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; +// +// std::ifstream file(path); +// boost::archive::binary_iarchive ia(file); +// ia.register_type(); +// SerializedSecretFile serialized_secret_file; +// +// ia >> serialized_secret_file; +// update_time = serialized_secret_file.get_secret_file()->get_update_time(); +// file_size = serialized_secret_file.get_secret_file()->get_file_size(); +// starting_time = serialized_secret_file.get_secret_file()->get_starting_time(); +// end_time = serialized_secret_file.get_secret_file()->get_end_time(); +// file_md5 = serialized_secret_file.get_secret_file()->get_file_md5(); +// file.close(); +// return SERVER_SUCCESS; +//} // Part 3: File attribute: UpdateTime Time/ Size/ MD5 ServerError LicenseLibrary::GetFileUpdateTimeAndSize(const std::string &path, time_t &update_time, off_t &file_size) { - if(!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; + if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; struct stat buf; int err_no = stat(path.c_str(), &buf); @@ -235,7 +252,7 @@ LicenseLibrary::GetFileUpdateTimeAndSize(const std::string &path, time_t &update ServerError LicenseLibrary::GetFileMD5(const std::string &path, std::string &filemd5) { - if(!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; + if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; filemd5.clear(); @@ -287,7 +304,7 @@ ServerError LicenseLibrary::GPUinfoFileDeserialization(const std::string &path, int &device_count, std::map &uuid_encrption_map) { - if(!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; + if (!IsFileExistent(path)) return SERVER_LICENSE_FILE_NOT_EXIST; std::ifstream file(path); boost::archive::binary_iarchive ia(file); @@ -303,115 +320,143 @@ LicenseLibrary::GPUinfoFileDeserialization(const std::string &path, return SERVER_SUCCESS; } +ServerError +LicenseLibrary::GetDateTime(char *cha, time_t &data_time) { + tm tm_; + int year, month, day; + sscanf(cha, "%d-%d-%d", &year, &month, &day); + tm_.tm_year = year - 1900; + tm_.tm_mon = month - 1; + tm_.tm_mday = day; + tm_.tm_hour = 0; + tm_.tm_min = 0; + tm_.tm_sec = 0; + tm_.tm_isdst = 0; + data_time = mktime(&tm_); + return SERVER_SUCCESS; + +} // Part 5: Integrity check and Legality check -ServerError -LicenseLibrary::IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path) { +//ServerError +//LicenseLibrary::IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path) { +// +// std::string file_md5; +// GetFileMD5(license_file_path, file_md5); +// time_t update_time; +// off_t file_size; +// GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); +// time_t system_time; +// GetSystemTime(system_time); +// +// std::string output_file_md5; +// time_t output_update_time; +// off_t output_file_size; +// time_t output_starting_time; +// time_t output_end_time; +// SecretFileDeserialization(secret_file_path, +// output_update_time, +// output_file_size, +// output_starting_time, +// output_end_time, +// output_file_md5); +// if (file_md5 != output_file_md5) { +// printf("License file has been modified\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (update_time != output_update_time) { +// printf("update_time is wrong\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (file_size != output_file_size) { +// printf("file_size is wrong\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// if (system_time < output_starting_time || system_time > output_end_time) { +// printf("License expired\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// return SERVER_SUCCESS; +//} +// +//ServerError +//LicenseLibrary::LegalityCheck(const std::string &license_file_path) { +// +// int device_count; +// GetDeviceCount(device_count); +// std::vector uuid_array; +// GetUUID(device_count, uuid_array); +// +// std::vector sha_array; +// GetUUIDSHA256(device_count, uuid_array, sha_array); +// +// int output_device_count; +// std::map uuid_encryption_map; +// int64_t remaining_time; +// LicenseFileDeserialization(license_file_path, output_device_count, uuid_encryption_map, remaining_time); +// +// if (device_count != output_device_count) { +// printf("device_count is wrong\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// for (int i = 0; i < device_count; ++i) { +// if (sha_array[i] != uuid_encryption_map[i]) { +// printf("uuid_encryption_map %d is wrong\n", i); +// return SERVER_UNEXPECTED_ERROR; +// } +// } +// if (remaining_time <= 0) { +// printf("License expired\n"); +// return SERVER_UNEXPECTED_ERROR; +// } +// std::cout << "Legality Check Success" << std::endl; +// return SERVER_SUCCESS; +//} - std::string file_md5; - GetFileMD5(license_file_path, file_md5); - time_t update_time; - off_t file_size; - GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); - - std::string output_file_md5; - time_t output_update_time; - off_t output_file_size; - SecretFileDeserialization(secret_file_path, output_update_time, output_file_size, output_file_md5); - if (file_md5 != output_file_md5) { - printf("License file has been modified\n"); - return SERVER_UNEXPECTED_ERROR; - } - if (update_time != output_update_time) { - printf("update_time is wrong\n"); - return SERVER_UNEXPECTED_ERROR; - } - if (file_size != output_file_size) { - printf("file_size is wrong\n"); - return SERVER_UNEXPECTED_ERROR; - } - - return SERVER_SUCCESS; -} - -ServerError -LicenseLibrary::LegalityCheck(const std::string &license_file_path) { - - int device_count; - GetDeviceCount(device_count); - std::vector uuid_array; - GetUUID(device_count, uuid_array); - - std::vector sha_array; - GetUUIDSHA256(device_count, uuid_array, sha_array); - - int output_device_count; - std::map uuid_encryption_map; - int64_t remaining_time; - LicenseFileDeserialization(license_file_path, output_device_count, uuid_encryption_map, remaining_time); - - if (device_count != output_device_count) { - printf("device_count is wrong\n"); - return SERVER_UNEXPECTED_ERROR; - } - for (int i = 0; i < device_count; ++i) { - if (sha_array[i] != uuid_encryption_map[i]) { - printf("uuid_encryption_map %d is wrong\n", i); - return SERVER_UNEXPECTED_ERROR; - } - } - if (remaining_time <= 0) { - printf("License expired\n"); - return SERVER_UNEXPECTED_ERROR; - } - std::cout << "Legality Check Success" << std::endl; - return SERVER_SUCCESS; -} - -// Part 6: Timer -ServerError -LicenseLibrary::AlterFile(const std::string &license_file_path, - const std::string &secret_file_path, - const boost::system::error_code &ec, - boost::asio::deadline_timer *pt) { - int device_count; - std::map uuid_encryption_map; - int64_t remaining_time; - LicenseFileDeserialization(license_file_path, device_count, uuid_encryption_map, remaining_time); - - std::cout << "remaining_time: " << remaining_time << std::endl; - - if (remaining_time <= 0) { - std::cout << "License expired" << std::endl; - exit(1); - } - --remaining_time; - LicenseFileSerialization(license_file_path, device_count, uuid_encryption_map, remaining_time); - - time_t update_time; - off_t file_size; - GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); - std::string file_md5; - GetFileMD5(license_file_path, file_md5); - SecretFileSerialization(secret_file_path, update_time, file_size, file_md5); - - pt->expires_at(pt->expires_at() + boost::posix_time::hours(1)); - pt->async_wait(boost::bind(AlterFile, license_file_path, secret_file_path, boost::asio::placeholders::error, pt)); - return SERVER_SUCCESS; -} - -ServerError -LicenseLibrary::StartCountingDown(const std::string &license_file_path, const std::string &secret_file_path) { - - if(!IsFileExistent(license_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; - if(!IsFileExistent(secret_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; - - boost::asio::io_service io; - boost::asio::deadline_timer t(io, boost::posix_time::hours(1)); - t.async_wait(boost::bind(AlterFile, license_file_path, secret_file_path, boost::asio::placeholders::error, &t)); - std::cout << "Timing begins" << std::endl; - io.run(); - return SERVER_SUCCESS; -} +//// Part 6: Timer +//ServerError +//LicenseLibrary::AlterFile(const std::string &license_file_path, +// const std::string &secret_file_path, +// const boost::system::error_code &ec, +// boost::asio::deadline_timer *pt) { +// int device_count; +// std::map uuid_encryption_map; +// int64_t remaining_time; +// LicenseFileDeserialization(license_file_path, device_count, uuid_encryption_map, remaining_time); +// +// std::cout << "remaining_time: " << remaining_time << std::endl; +// +// if (remaining_time <= 0) { +// std::cout << "License expired" << std::endl; +// exit(1); +// } +// --remaining_time; +// LicenseFileSerialization(license_file_path, device_count, uuid_encryption_map, remaining_time); +// +// time_t update_time; +// off_t file_size; +// GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); +// std::string file_md5; +// GetFileMD5(license_file_path, file_md5); +// SecretFileSerialization(secret_file_path, update_time, file_size, file_md5); +// +// pt->expires_at(pt->expires_at() + boost::posix_time::hours(1)); +// pt->async_wait(boost::bind(AlterFile, license_file_path, secret_file_path, boost::asio::placeholders::error, pt)); +// return SERVER_SUCCESS; +//} +// +//ServerError +//LicenseLibrary::StartCountingDown(const std::string &license_file_path, const std::string &secret_file_path) { +// +// if (!IsFileExistent(license_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; +// if (!IsFileExistent(secret_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; +// +// boost::asio::io_service io; +// boost::asio::deadline_timer t(io, boost::posix_time::hours(1)); +// t.async_wait(boost::bind(AlterFile, license_file_path, secret_file_path, boost::asio::placeholders::error, &t)); +// std::cout << "Timing begins" << std::endl; +// io.run(); +// return SERVER_SUCCESS; +//} } } diff --git a/cpp/src/license/LicenseLibrary.h b/cpp/src/license/LicenseLibrary.h index dd78c221ad..3fd27a41c6 100644 --- a/cpp/src/license/LicenseLibrary.h +++ b/cpp/src/license/LicenseLibrary.h @@ -1,7 +1,6 @@ #pragma once #include "LicenseFile.h" -#include "SecretFile.h" #include "GPUInfoFile.h" #include "utils/Error.h" @@ -12,6 +11,7 @@ #include #include +#include namespace zilliz { @@ -22,7 +22,7 @@ class LicenseLibrary { public: // Part 0: File check static bool - IsFileExistent(const std::string& path); + IsFileExistent(const std::string &path); // Part 1: Get GPU Info static ServerError @@ -40,26 +40,39 @@ class LicenseLibrary { std::vector &uuid_array, std::vector &sha_array); + static ServerError + GetSystemTime(time_t &system_time); + // Part 2: Handle License File static ServerError LicenseFileSerialization(const std::string &path, int device_count, - const std::map &uuid_encrption_map, int64_t remaining_hour); + const std::map &uuid_encrption_map, + time_t starting_time, + time_t end_time); static ServerError LicenseFileDeserialization(const std::string &path, int &device_count, std::map &uuid_encrption_map, - int64_t &remaining_hour); + time_t &starting_time, + time_t &end_time); - static ServerError - SecretFileSerialization(const std::string &path, - const time_t &update_time, - const off_t &file_size, - const std::string &file_md5); - - static ServerError - SecretFileDeserialization(const std::string &path, time_t &update_time, off_t &file_size, std::string &file_md5); +// static ServerError +// SecretFileSerialization(const std::string &path, +// const time_t &update_time, +// const off_t &file_size, +// const time_t &starting_time, +// const time_t &end_time, +// const std::string &file_md5); +// +// static ServerError +// SecretFileDeserialization(const std::string &path, +// time_t &update_time, +// off_t &file_size, +// time_t &starting_time, +// time_t &end_time, +// std::string &file_md5); // Part 3: File attribute: UpdateTime Time/ Size/ MD5 static ServerError @@ -78,22 +91,25 @@ class LicenseLibrary { int &device_count, std::map &uuid_encrption_map); - // Part 5: Integrity check and Legality check static ServerError - IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path); + GetDateTime(char *cha, time_t &data_time); - static ServerError - LegalityCheck(const std::string &license_file_path); + // Part 5: Integrity check and Legality check +// static ServerError +// IntegrityCheck(const std::string &license_file_path, const std::string &secret_file_path); +// +// static ServerError +// LegalityCheck(const std::string &license_file_path); // Part 6: Timer - static ServerError - AlterFile(const std::string &license_file_path, - const std::string &secret_file_path, - const boost::system::error_code &ec, - boost::asio::deadline_timer *pt); - - static ServerError - StartCountingDown(const std::string &license_file_path, const std::string &secret_file_path); +// static ServerError +// AlterFile(const std::string &license_file_path, +// const std::string &secret_file_path, +// const boost::system::error_code &ec, +// boost::asio::deadline_timer *pt); +// +// static ServerError +// StartCountingDown(const std::string &license_file_path, const std::string &secret_file_path); private: diff --git a/cpp/src/license/LicensePublic.cpp b/cpp/src/license/LicensePublic.cpp deleted file mode 100644 index 186c502ac1..0000000000 --- a/cpp/src/license/LicensePublic.cpp +++ /dev/null @@ -1,357 +0,0 @@ -// -// Created by zilliz on 19-5-10. -// - -#include "LicensePublic.h" -#include "license/LicenseCheck.h" -//#include "BoostArchive.h" -#define RTime 100 - -using std::string; -using std::map; -namespace zilliz { -namespace vecwise { -namespace server { - -// GET /tmp/vecwise_engine.license -class Licensedata1 -{ -public: - Licensedata1() - :_deviceCount(0) - ,_RemainingTime(RTime) - {} - - Licensedata1(const int& deviceCount,const map& uuidEncryption) - :_deviceCount(deviceCount) - ,_uuidEncryption(uuidEncryption) - ,_RemainingTime(RTime) - {} - - Licensedata1(const int& deviceCount,const map& uuidEncryption,const int64_t& RemainingTime) - :_deviceCount(deviceCount) - ,_uuidEncryption(uuidEncryption) - ,_RemainingTime(RemainingTime) - {} - - int GetdeviceCount() - { - return _deviceCount; - } - map GetuuidEncryption() - { - return _uuidEncryption; - } - int64_t GetRemainingTime() - { - return _RemainingTime; - } - -private: - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int version) - { - ar & _deviceCount; - ar & _uuidEncryption; - ar & _RemainingTime; - } - -public: - int _deviceCount; - map _uuidEncryption; - int64_t _RemainingTime; -}; - - -class STLlicensedata -{ -private: - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int version) - { - ar & m_licensedata; - } - -public: - Licensedata1* m_licensedata; -}; - - -ServerError -LiSave(const string& path,const int& deviceCount,const map& uuidEncryption) -{ - std::ofstream file(path); - boost::archive::binary_oarchive oa(file); - oa.register_type(); - STLlicensedata stllicensedata; - - Licensedata1 *p = new Licensedata1(deviceCount,uuidEncryption); - stllicensedata.m_licensedata = p; - oa << stllicensedata; - - delete p; - file.close(); - return SERVER_SUCCESS; -} - -ServerError -LiSave(const string& path,const int& deviceCount,const map& uuidEncryption, const int64_t& RemainingTime) -{ - std::ofstream file(path); - boost::archive::binary_oarchive oa(file); - oa.register_type(); - STLlicensedata stllicensedata; - - Licensedata1 *p = new Licensedata1(deviceCount,uuidEncryption,RemainingTime); - stllicensedata.m_licensedata = p; - oa << stllicensedata; - - delete p; - file.close(); - return SERVER_SUCCESS; -} - -ServerError -LiLoad(const string& path,int& deviceCount,map& uuidEncryption,int64_t& RemainingTime) -{ - std::ifstream file(path); - boost::archive::binary_iarchive ia(file); - ia.register_type(); - STLlicensedata stllicensedata; - ia >> stllicensedata; - deviceCount = stllicensedata.m_licensedata->GetdeviceCount(); - uuidEncryption = stllicensedata.m_licensedata->GetuuidEncryption(); - RemainingTime = stllicensedata.m_licensedata->GetRemainingTime(); - file.close(); - return SERVER_SUCCESS; -} - - -// GET /tmp/vecwise_engine2.license - -class Licensefiledata -{ -public: - Licensefiledata() - :_update_time(0) - ,_file_size(0) - ,_filemd5("") - {} - - Licensefiledata(const time_t& update_time,const off_t& file_size,const string& filemd5) - :_update_time(update_time) - ,_file_size(file_size) - ,_filemd5(filemd5) - {} - - time_t Getupdate_time() - { - return _update_time; - } - off_t Getfile_size() - { - return _file_size; - } - string Getfilemd5() - { - return _filemd5; - } - -private: - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int version) - { - ar & _update_time; - ar & _file_size; - ar & _filemd5; - } - -public: - time_t _update_time; - off_t _file_size; - string _filemd5; -}; - - -class STLlicensefiledata -{ -private: - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int version) - { - ar & m_licensefiledata; - } - -public: - Licensefiledata* m_licensefiledata; -}; - - -ServerError -LifileSave(const string& path,const time_t& update_time,const off_t& file_size,const string& filemd5) -{ - std::ofstream file(path); - boost::archive::binary_oarchive oa(file); - oa.register_type(); - STLlicensefiledata stllicensefiledata; - - Licensefiledata *p = new Licensefiledata(update_time,file_size,filemd5); - stllicensefiledata.m_licensefiledata = p; - oa << stllicensefiledata; - - delete p; - file.close(); - return SERVER_SUCCESS; -} - -ServerError -LifileLoad(const string& path,time_t& update_time,off_t& file_size,string& filemd5) - { - std::ifstream file(path); - boost::archive::binary_iarchive ia(file); - ia.register_type(); - STLlicensefiledata stllicensefiledata; - ia >> stllicensefiledata; - update_time = stllicensefiledata.m_licensefiledata->Getupdate_time(); - file_size = stllicensefiledata.m_licensefiledata->Getfile_size(); - filemd5 = stllicensefiledata.m_licensefiledata->Getfilemd5(); - file.close(); - return SERVER_SUCCESS; - } - -ServerError -LicenseLegality_check(const std::string& path) -{ - int deviceCount; - std::vector uuids; - LicenseGetuuid(deviceCount,uuids); - - std::vector shas; - LicenseGetuuidsha(deviceCount,uuids,shas); - - - int deviceCountcheck; - std::map uuidEncryption; - int64_t RemainingTime; - LiLoad(path,deviceCountcheck,uuidEncryption,RemainingTime); - - if(deviceCount!=deviceCountcheck) - { - printf("deviceCount is wrong\n"); - return SERVER_UNEXPECTED_ERROR; - } - for(int i=0;i uuidEncryption; - int64_t RemainingTime; - LiLoad(path1,deviceCount,uuidEncryption,RemainingTime); - - std::cout<< "RemainingTime: " << RemainingTime < uuidEncryptioncheck; - int64_t RemainingTimecheck; - LiLoad(path1,deviceCountcheck,uuidEncryptioncheck,RemainingTimecheck); - - std::cout<< "RemainingTimecheck: " << RemainingTimecheck <expires_at(pt->expires_at() + boost::posix_time::hours(1)) ; - pt->async_wait(boost::bind(Alterfile,path1,path2, boost::asio::placeholders::error, pt)); - -} -void Runtime(const string &path1, const string &path2 ) -{ - boost::asio::io_service io; - boost::asio::deadline_timer t(io, boost::posix_time::hours(1)); - t.async_wait(boost::bind(Alterfile,path1,path2, boost::asio::placeholders::error, &t)); - io.run(); - return;; -} - -} -} -} \ No newline at end of file diff --git a/cpp/src/license/LicensePublic.h b/cpp/src/license/LicensePublic.h deleted file mode 100644 index a40b6266c5..0000000000 --- a/cpp/src/license/LicensePublic.h +++ /dev/null @@ -1,88 +0,0 @@ -// -// Created by zilliz on 19-5-10. -// - -#pragma once - -#include "utils/Error.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - - -namespace zilliz { -namespace vecwise { -namespace server { - -class - BoostArchive; - -class - Licensedata1; - - -class - Licensefiledata; - -class - STLlicensefiledata; - - -ServerError -LiSave(const std::string &path, const int &deviceCount, const std::map &uuidEncryption); - -ServerError -LiLoad(const std::string &path, int &deviceCount, std::map &uuidEncryption, int64_t &RemainingTime); - -ServerError -LifileSave(const std::string &path, const time_t &update_time, const off_t &file_size, const std::string &filemd5); - -ServerError -LifileLoad(const std::string &path, time_t &update_time, off_t &file_size, std::string &filemd5); - -ServerError -LiSave(const std::string &path, - const int &deviceCount, - const std::map &uuidEncryption, - const int64_t &RemainingTime); - -ServerError -LicenseIntegrity_check(const std::string &path, const std::string &path2); - -ServerError -LicenseLegality_check(const std::string &path); - -void -Alterfile(const std::string &path1, - const std::string &path2, - const boost::system::error_code &ec, - boost::asio::deadline_timer *pt); - -void -Runtime(const std::string &path1, const std::string &path2); - - -} -} -} \ No newline at end of file diff --git a/cpp/src/license/LicenseRun.cpp b/cpp/src/license/LicenseRun.cpp deleted file mode 100644 index dd06a64540..0000000000 --- a/cpp/src/license/LicenseRun.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// Created by zilliz on 19-5-11. -// -#include -#include -#include - -#include "utils/Error.h" -#include "license/LicenseCheck.h" -#include "license/LicensePublic.h" - - -using namespace zilliz::vecwise; - -//TEST(LicenseTest, LICENSE_TEST) { -// -// std::string path1 = "/tmp/vecwise_engine.license"; -// std::string path2 = "/tmp/vecwise_engine2.license"; -// std::cout << "This is run " << std::endl; -// -// server::ServerError err; -// -// err = server::Licensefileread(path1); -// if(err!=server::SERVER_SUCCESS) -// { -// exit(1); -// } -// err = server::LicenseIntegrity_check(path1,path2); -// if(err!=server::SERVER_SUCCESS) -// { -// std::cout << "Integrity_check is wrong " << std::endl; -// exit(1); -// } -// err = server::LicenseLegality_check(path1); -// if(err!=server::SERVER_SUCCESS) -// { -// std::cout << "Legality_check is wrong " << std::endl; -// exit(1); -// } -// std::cout << " runing " << std::endl; -// server::Runtime(path1,path2); -//} \ No newline at end of file diff --git a/cpp/src/license/SecretFile.h b/cpp/src/license/SecretFile.h deleted file mode 100644 index 08f196a5b3..0000000000 --- a/cpp/src/license/SecretFile.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited. - * Proprietary and confidential. - ******************************************************************************/ -#pragma once -#include - -class SecretFile { - public: - SecretFile() = default; - - SecretFile(const time_t &update_time, const off_t &file_size, const std::string &file_md5) - : update_time_(update_time), file_size_(file_size), file_md5_(file_md5) {} - - time_t get_update_time() { - return update_time_; - } - off_t get_file_size() { - return file_size_; - } - std::string get_file_md5() { - return file_md5_; - } - - private: - friend class boost::serialization::access; - - template - void serialize(Archive &ar, const unsigned int version) { - ar & update_time_; - ar & file_size_; - ar & file_md5_; - } - - public: - time_t update_time_ = 0; - off_t file_size_ = 0; - std::string file_md5_; -}; - -class SerializedSecretFile { - public: - ~SerializedSecretFile() { - if(secret_file_ != nullptr) { - delete secret_file_; - secret_file_ = nullptr; - } - } - - void - set_secret_file(SecretFile* secret_file) { - secret_file_ = secret_file; - } - - SecretFile* get_secret_file() { - return secret_file_; - } - - private: - friend class boost::serialization::access; - - template - void serialize(Archive &ar, const unsigned int version) { - ar & secret_file_; - } - - private: - SecretFile *secret_file_ = nullptr; -}; - - diff --git a/cpp/src/server/Server.cpp b/cpp/src/server/Server.cpp index 876771fafd..8c79c5a215 100644 --- a/cpp/src/server/Server.cpp +++ b/cpp/src/server/Server.cpp @@ -133,12 +133,6 @@ Server::Daemonize() { int Server::Start() { - std::string license_file_path = "/tmp/vecwise.license"; - if(LicenseValidate(license_file_path) != SERVER_SUCCESS) { - SERVER_LOG_ERROR << "License check failed"; - return 1; - } - if (daemonized_) { Daemonize(); } @@ -157,6 +151,21 @@ Server::Start() { //print config into console and log config.PrintAll(); +#ifdef ENABLE_LICENSE + ConfigNode license_config = config.GetConfig(CONFIG_LICENSE); + std::string license_file_path = license_config.GetValue(CONFIG_LICENSE_PATH); + SERVER_LOG_INFO << "License path: " << license_file_path; + if(server::LicenseCheck::LegalityCheck(license_file_path) != SERVER_SUCCESS) { + SERVER_LOG_ERROR << "License check failed"; + exit(1); + } + + if(server::LicenseCheck::StartCountingDown(license_file_path) != SERVER_SUCCESS) { + SERVER_LOG_ERROR << "License counter start error"; + exit(1); + } +#endif + // Handle Signal signal(SIGINT, SignalUtil::HandleSignal); signal(SIGHUP, SignalUtil::HandleSignal); diff --git a/cpp/src/server/ServerConfig.h b/cpp/src/server/ServerConfig.h index b8c5ae8c19..d840077e15 100644 --- a/cpp/src/server/ServerConfig.h +++ b/cpp/src/server/ServerConfig.h @@ -32,6 +32,9 @@ static const std::string CONFIG_CACHE = "cache_config"; static const std::string CONFIG_CPU_CACHE_CAPACITY = "cpu_cache_capacity"; static const std::string CONFIG_GPU_CACHE_CAPACITY = "gpu_cache_capacity"; +static const std::string CONFIG_LICENSE = "license_config"; +static const std::string CONFIG_LICENSE_PATH = "license_path"; + class ServerConfig { public: static ServerConfig &GetInstance(); diff --git a/cpp/unittest/license/CMakeLists.txt b/cpp/unittest/license/CMakeLists.txt index 2d2ed15fc7..cc7e5ba930 100644 --- a/cpp/unittest/license/CMakeLists.txt +++ b/cpp/unittest/license/CMakeLists.txt @@ -19,15 +19,18 @@ link_directories(/usr/local/cuda/targets/x86_64-linux/lib/stubs/) set(require_files ../../src/license/LicenseLibrary.cpp + ../../src/license/LicenseCheck.cpp # ../../src/license/License.cpp -# ../../src/license/LicensePublic.cpp -# ../../src/license/LicenseCreateuuidshafile.cpp ) + set(db_test_src # license_tests.cpp license_library_tests.cpp + license_check_test.cpp + + ${require_files}) cuda_add_executable(license_test ${db_test_src}) diff --git a/cpp/unittest/license/license_check_test.cpp b/cpp/unittest/license/license_check_test.cpp new file mode 100644 index 0000000000..f47afff357 --- /dev/null +++ b/cpp/unittest/license/license_check_test.cpp @@ -0,0 +1,68 @@ +// +// Created by zilliz on 19-5-13. +// + +#include "utils/Log.h" +#include "license/LicenseCheck.h" +#include "utils/Error.h" + +#include +#include + + +using namespace zilliz::vecwise; + +TEST(LicenseLibraryTest, CHECK_TEST) { + + server::ServerError err; + + std::string license_file_path("/tmp/megasearch/abc.license"); + + + int device_count; + std::map uuid_encryption_map; +// +// err = server::LicenseLibrary::GPUinfoFileDeserialization(sys_info_file_path, device_count, uuid_encryption_map); +// ASSERT_EQ(err, server::SERVER_SUCCESS); +// std::cout << " device_count: " << device_count << std::endl; +// for (int i = 0; i < device_count; i++) { +// std::cout << " uuid_encryption_map: " << i << " " << uuid_encryption_map[i] << std::endl; +// } +// + time_t starting_time; + time_t end_time; + err = server::LicenseLibrary::LicenseFileDeserialization(license_file_path, + device_count, + uuid_encryption_map, + starting_time, + end_time); + ASSERT_EQ(err, server::SERVER_SUCCESS); +// +// std::cout << "device_count: " << device_count << std::endl; +// for (int i = 0; i < device_count; i++) { +// std::cout << " uuid_encryption_map: " << i << " " << uuid_encryption_map[i] << std::endl; +// } +// std::cout << "starting_time: " << starting_time << std::endl; +// std::cout << "end_time: " << end_time << std::endl; + + + time_t system_time; + err = server::LicenseLibrary::GetSystemTime(system_time); + ASSERT_EQ(err, server::SERVER_SUCCESS); + + system_time+=111100; + err = server::LicenseLibrary::LicenseFileSerialization(license_file_path, + device_count, + uuid_encryption_map, + system_time, + end_time); +// ASSERT_EQ(err, server::SERVER_SUCCESS); + // 19. Legality check + err = server::LicenseCheck::LegalityCheck(license_file_path); + ASSERT_EQ(err, server::SERVER_SUCCESS); + + // 20. Start counting down + +// err = server::LicenseCheck::StartCountingDown(license_file_path); +// ASSERT_EQ(err, server::SERVER_SUCCESS); +} diff --git a/cpp/unittest/license/license_library_tests.cpp b/cpp/unittest/license/license_library_tests.cpp index ec9ee9fac0..0f4e84a947 100644 --- a/cpp/unittest/license/license_library_tests.cpp +++ b/cpp/unittest/license/license_library_tests.cpp @@ -12,6 +12,7 @@ #include #include + using namespace zilliz::vecwise; TEST(LicenseLibraryTest, FILE_EXISTENT_TEST) { @@ -55,6 +56,12 @@ TEST(LicenseLibraryTest, GPU_INFO_TEST) { std::cout << "Device Id: " << i << ", UUID: " << uuid_array[i] << ", UUID_SHA256: " << uuid_sha256_array[i] << std::endl; } + + time_t systemtime; + err = server::LicenseLibrary::GetSystemTime(systemtime); + ASSERT_EQ(err, server::SERVER_SUCCESS); + std::cout << "System Time: " << systemtime << std::endl; + } TEST(LicenseLibraryTest, LICENSE_FILE_TEST) { @@ -112,27 +119,40 @@ TEST(LicenseLibraryTest, LICENSE_FILE_TEST) { ASSERT_EQ(uuid_encrption_map[i], output_info_uuid_encrption_map[i]); } + + // 16. Get System Time/starting_time ans End Time + time_t starting_time; + err = server::LicenseLibrary::GetSystemTime(starting_time); + ASSERT_EQ(err, server::SERVER_SUCCESS); + time_t end_time; + end_time = starting_time + (long) (60 * 60 * 24 * 7); + // 11. Generate License File err = server::LicenseLibrary::LicenseFileSerialization(license_file_path, device_count, uuid_encrption_map, - remaining_hour); + starting_time, + end_time); ASSERT_EQ(err, server::SERVER_SUCCESS); // 12. Define output var int output_device_count = 0; std::map output_uuid_encrption_map; - int64_t output_remaining_hour; + time_t output_starting_time; + time_t output_end_time; // 13. Read License File err = server::LicenseLibrary::LicenseFileDeserialization(license_file_path, output_device_count, output_uuid_encrption_map, - output_remaining_hour); + output_starting_time, + output_end_time); ASSERT_EQ(err, server::SERVER_SUCCESS); ASSERT_EQ(device_count, output_device_count); - ASSERT_EQ(remaining_hour, output_remaining_hour); + ASSERT_EQ(starting_time, output_starting_time); + ASSERT_EQ(end_time, output_end_time); + for (int i = 0; i < device_count; ++i) { ASSERT_EQ(uuid_encrption_map[i], output_uuid_encrption_map[i]); } @@ -148,53 +168,49 @@ TEST(LicenseLibraryTest, LICENSE_FILE_TEST) { err = server::LicenseLibrary::GetFileMD5(license_file_path, file_md5); ASSERT_EQ(err, server::SERVER_SUCCESS); + + // 16. Generate Secret File - std::string secret_file_path("/tmp/megasearch.secret"); - err = server::LicenseLibrary::SecretFileSerialization(secret_file_path, update_time, file_size, file_md5); - ASSERT_EQ(err, server::SERVER_SUCCESS); +// std::string secret_file_path("/tmp/megasearch.secret"); +// err = server::LicenseLibrary::SecretFileSerialization(secret_file_path, +// update_time, +// file_size, +// starting_time, +// end_time, +// file_md5); +// ASSERT_EQ(err, server::SERVER_SUCCESS); // 17. Define output var - time_t output_update_time; - off_t output_file_size; - std::string output_file_md5; +// time_t output_update_time; +// off_t output_file_size; +// time_t output_starting_time; +// time_t output_end_time; +// std::string output_file_md5; // 18. Read License File - err = server::LicenseLibrary::SecretFileDeserialization(secret_file_path, - output_update_time, - output_file_size, - output_file_md5); - ASSERT_EQ(err, server::SERVER_SUCCESS); - - ASSERT_EQ(update_time, output_update_time); - ASSERT_EQ(file_size, output_file_size); - ASSERT_EQ(file_md5, output_file_md5); +// err = server::LicenseLibrary::SecretFileDeserialization(secret_file_path, +// output_update_time, +// output_file_size, +// output_starting_time, +// output_end_time, +// output_file_md5); +// ASSERT_EQ(err, server::SERVER_SUCCESS); +// +// ASSERT_EQ(update_time, output_update_time); +// ASSERT_EQ(file_size, output_file_size); +// ASSERT_EQ(starting_time, output_starting_time); +// ASSERT_EQ(end_time, output_end_time); +// ASSERT_EQ(file_md5, output_file_md5); // 19. Integrity check and Legality check - err = server::LicenseLibrary::IntegrityCheck(license_file_path, secret_file_path); - ASSERT_EQ(err, server::SERVER_SUCCESS); - - err = server::LicenseLibrary::LegalityCheck(license_file_path); - ASSERT_EQ(err, server::SERVER_SUCCESS); +// err = server::LicenseLibrary::IntegrityCheck(license_file_path, secret_file_path); +// ASSERT_EQ(err, server::SERVER_SUCCESS); +// +// err = server::LicenseLibrary::LegalityCheck(license_file_path); +// ASSERT_EQ(err, server::SERVER_SUCCESS); } -TEST(LicenseLibraryTest, Timer_TEST) { - - server::ServerError err; - std::string license_file_path("/tmp/megasearch.license"); - std::string secret_file_path("/tmp/megasearch.secret"); - - // 19. Integrity check and Legality check - err = server::LicenseLibrary::IntegrityCheck(license_file_path, secret_file_path); - ASSERT_EQ(err, server::SERVER_SUCCESS); - - err = server::LicenseLibrary::LegalityCheck(license_file_path); - ASSERT_EQ(err, server::SERVER_SUCCESS); - - // 20. Start counting down - err = server::LicenseLibrary::StartCountingDown(license_file_path, secret_file_path); - ASSERT_EQ(err, server::SERVER_SUCCESS); -} TEST(LicenseLibraryTest, GET_GPU_INFO_FILE) { @@ -250,39 +266,64 @@ TEST(LicenseLibraryTest, GET_LICENSE_FILE) { output_info_uuid_encrption_map); ASSERT_EQ(err, server::SERVER_SUCCESS); - // 5. Enter time - int64_t remaining_hour = 24*7 ; - std::cout << "Please enter the authorization time (hours)" << std::endl; -// std::cin >> remaining_hour; + time_t system_time; + err = server::LicenseLibrary::GetSystemTime(system_time); + ASSERT_EQ(err, server::SERVER_SUCCESS); + time_t starting_time = system_time; + time_t end_time = system_time + (long) (60 * 60 * 24 * 7); + err = server::LicenseLibrary::LicenseFileSerialization(license_file_path, output_info_device_count, output_info_uuid_encrption_map, - remaining_hour); + starting_time, + end_time); ASSERT_EQ(err, server::SERVER_SUCCESS); std::cout << "Generate License File Success" << std::endl; } -TEST(LicenseLibraryTest, GET_SECRET_FILE) { - +TEST(LicenseLibraryTest, GET_DATA_TIME) { server::ServerError err; - std::string license_file_path("/tmp/megasearch.license"); - std::string secret_file_path("/tmp/megasearch.secret"); - - // 14. Get License File Attribute - time_t update_time; - off_t file_size; - err = server::LicenseLibrary::GetFileUpdateTimeAndSize(license_file_path, update_time, file_size); + char * a ="2018-03-06"; + time_t pp; + err = server::LicenseLibrary::GetDateTime(a,pp); ASSERT_EQ(err, server::SERVER_SUCCESS); + std::cout << pp <