├── .gitignore ├── .golangci.yaml ├── LICENSE ├── README.md ├── build ├── build-all.sh ├── build.sh ├── configs │ ├── .gitignore │ ├── api.template.yaml │ └── db.template.yaml ├── deploy │ └── .gitignore ├── installers │ └── .gitignore ├── logs │ └── .gitignore └── sql.sh ├── cmd ├── edge-api │ └── main.go ├── edge-instance-installer │ ├── .gitignore │ ├── build.sh │ └── main.go ├── installer-dns-helper │ └── main.go ├── installer-helper │ └── main.go ├── sql-dump │ └── main.go └── tt │ └── main.go ├── dist └── .gitignore ├── go.mod ├── go.sum └── internal ├── acme ├── account.go ├── acme_test.go ├── auth_callback.go ├── dns_provider.go ├── http_provider.go ├── key.go ├── providers.go ├── providers_ext.go ├── request.go ├── request_test.go ├── task.go └── user.go ├── apps ├── app_cmd.go ├── directive.go └── log_writer.go ├── configs ├── api_config.go ├── api_config_test.go └── locker.go ├── const ├── build.go ├── const.go ├── const_community.go └── vars.go ├── db ├── db_test.go ├── models │ ├── accounts │ │ ├── order_method_dao.go │ │ ├── order_method_dao_test.go │ │ ├── order_method_model.go │ │ ├── order_method_model_ext.go │ │ ├── user_account_daily_stat_model.go │ │ ├── user_account_daily_stat_model_ext.go │ │ ├── user_account_log_model.go │ │ ├── user_account_log_model_ext.go │ │ ├── user_account_model.go │ │ ├── user_account_model_ext.go │ │ ├── user_order_dao.go │ │ ├── user_order_dao_test.go │ │ ├── user_order_log_dao.go │ │ ├── user_order_log_dao_test.go │ │ ├── user_order_log_model.go │ │ ├── user_order_log_model_ext.go │ │ ├── user_order_model.go │ │ └── user_order_model_ext.go │ ├── acme │ │ ├── acme_authentication_dao.go │ │ ├── acme_authentication_dao_test.go │ │ ├── acme_authentication_model.go │ │ ├── acme_authentication_model_ext.go │ │ ├── acme_provider_account_dao.go │ │ ├── acme_provider_account_dao_test.go │ │ ├── acme_provider_account_model.go │ │ ├── acme_provider_account_model_ext.go │ │ ├── acme_task_dao.go │ │ ├── acme_task_dao_test.go │ │ ├── acme_task_log_dao.go │ │ ├── acme_task_log_dao_test.go │ │ ├── acme_task_log_model.go │ │ ├── acme_task_log_model_ext.go │ │ ├── acme_task_model.go │ │ ├── acme_task_model_ext.go │ │ ├── acme_user_dao.go │ │ ├── acme_user_dao_test.go │ │ ├── acme_user_model.go │ │ └── acme_user_model_ext.go │ ├── ad_network_dao.go │ ├── ad_network_dao_test.go │ ├── ad_network_model.go │ ├── ad_network_model_ext.go │ ├── ad_package_dao.go │ ├── ad_package_dao_test.go │ ├── ad_package_instance_dao.go │ ├── ad_package_instance_dao_test.go │ ├── ad_package_instance_model.go │ ├── ad_package_instance_model_ext.go │ ├── ad_package_model.go │ ├── ad_package_model_ext.go │ ├── ad_package_period_dao.go │ ├── ad_package_period_dao_test.go │ ├── ad_package_period_model.go │ ├── ad_package_period_model_ext.go │ ├── ad_package_price_dao.go │ ├── ad_package_price_dao_test.go │ ├── ad_package_price_model.go │ ├── ad_package_price_model_ext.go │ ├── admin_dao.go │ ├── admin_dao_test.go │ ├── admin_model.go │ ├── admin_model_ext.go │ ├── api_access_token_dao.go │ ├── api_access_token_dao_test.go │ ├── api_access_token_model.go │ ├── api_access_token_model_ext.go │ ├── api_method_stat_dao.go │ ├── api_method_stat_dao_test.go │ ├── api_method_stat_model.go │ ├── api_method_stat_model_ext.go │ ├── api_node_dao.go │ ├── api_node_dao_test.go │ ├── api_node_model.go │ ├── api_node_model_ext.go │ ├── api_token_dao.go │ ├── api_token_dao_test.go │ ├── api_token_model.go │ ├── authority │ │ ├── authority_key_dao.go │ │ ├── authority_key_dao_community.go │ │ ├── authority_key_dao_test.go │ │ ├── authority_key_model.go │ │ ├── authority_key_model_ext.go │ │ ├── authority_node_dao.go │ │ ├── authority_node_dao_test.go │ │ ├── authority_node_model.go │ │ └── authority_node_model_ext.go │ ├── clients │ │ ├── client_agent_dao.go │ │ ├── client_agent_dao_test.go │ │ ├── client_agent_ip_dao.go │ │ ├── client_agent_ip_dao_test.go │ │ ├── client_agent_ip_model.go │ │ ├── client_agent_ip_model_ext.go │ │ ├── client_agent_model.go │ │ ├── client_agent_model_ext.go │ │ ├── client_browser_dao.go │ │ ├── client_browser_dao_test.go │ │ ├── client_browser_model.go │ │ ├── client_browser_model_ext.go │ │ ├── client_system_dao.go │ │ ├── client_system_dao_test.go │ │ ├── client_system_model.go │ │ └── client_system_model_ext.go │ ├── db_node_dao.go │ ├── db_node_dao_test.go │ ├── db_node_initializer.go │ ├── db_node_initializer_ext.go │ ├── db_node_initializer_test.go │ ├── db_node_model.go │ ├── db_node_model_ext.go │ ├── dns │ │ ├── dns_domain_dao.go │ │ ├── dns_domain_dao_test.go │ │ ├── dns_domain_model.go │ │ ├── dns_domain_model_ext.go │ │ ├── dns_provider_dao.go │ │ ├── dns_provider_dao_test.go │ │ ├── dns_provider_model.go │ │ ├── dns_provider_model_ext.go │ │ ├── dns_task_dao.go │ │ ├── dns_task_dao_test.go │ │ ├── dns_task_model.go │ │ ├── dns_task_model_ext.go │ │ └── dnsutils │ │ │ ├── dns_utils.go │ │ │ └── dns_utils_test.go │ ├── errors.go │ ├── file_chunk_dao.go │ ├── file_chunk_dao_test.go │ ├── file_chunk_model.go │ ├── file_chunk_model_ext.go │ ├── file_dao.go │ ├── file_dao_test.go │ ├── file_model.go │ ├── file_model_ext.go │ ├── formal_client_browser_dao.go │ ├── formal_client_browser_dao_test.go │ ├── formal_client_browser_model.go │ ├── formal_client_browser_model_ext.go │ ├── formal_client_system_dao.go │ ├── formal_client_system_dao_test.go │ ├── formal_client_system_model.go │ ├── formal_client_system_model_ext.go │ ├── http_access_log_dao.go │ ├── http_access_log_dao_test.go │ ├── http_access_log_manager.go │ ├── http_access_log_manager_test.go │ ├── http_access_log_model.go │ ├── http_access_log_model_ext.go │ ├── http_access_log_policy_dao.go │ ├── http_access_log_policy_dao_test.go │ ├── http_access_log_policy_model.go │ ├── http_access_log_policy_model_ext.go │ ├── http_auth_policy_dao.go │ ├── http_auth_policy_dao_test.go │ ├── http_auth_policy_model.go │ ├── http_auth_policy_model_ext.go │ ├── http_brotli_policy_dao.go │ ├── http_brotli_policy_dao_test.go │ ├── http_brotli_policy_model.go │ ├── http_brotli_policy_model_ext.go │ ├── http_cache_policy_dao.go │ ├── http_cache_policy_dao_test.go │ ├── http_cache_policy_model.go │ ├── http_cache_policy_model_ext.go │ ├── http_cache_task_dao.go │ ├── http_cache_task_dao_test.go │ ├── http_cache_task_key_dao.go │ ├── http_cache_task_key_dao_test.go │ ├── http_cache_task_key_model.go │ ├── http_cache_task_key_model_ext.go │ ├── http_cache_task_model.go │ ├── http_cache_task_model_ext.go │ ├── http_deflate_policy_dao.go │ ├── http_deflate_policy_dao_test.go │ ├── http_deflate_policy_model.go │ ├── http_deflate_policy_model_ext.go │ ├── http_fastcgi_dao.go │ ├── http_fastcgi_dao_test.go │ ├── http_fastcgi_model.go │ ├── http_fastcgi_model_ext.go │ ├── http_firewall_policy_dao.go │ ├── http_firewall_policy_dao_test.go │ ├── http_firewall_policy_model.go │ ├── http_firewall_policy_model_ext.go │ ├── http_firewall_rule_dao.go │ ├── http_firewall_rule_dao_test.go │ ├── http_firewall_rule_group_dao.go │ ├── http_firewall_rule_group_dao_test.go │ ├── http_firewall_rule_group_model.go │ ├── http_firewall_rule_group_model_ext.go │ ├── http_firewall_rule_model.go │ ├── http_firewall_rule_model_ext.go │ ├── http_firewall_rule_set_dao.go │ ├── http_firewall_rule_set_dao_test.go │ ├── http_firewall_rule_set_model.go │ ├── http_firewall_rule_set_model_ext.go │ ├── http_gzip_dao.go │ ├── http_gzip_dao_test.go │ ├── http_gzip_model.go │ ├── http_gzip_model_ext.go │ ├── http_header_dao.go │ ├── http_header_dao_test.go │ ├── http_header_model.go │ ├── http_header_model_ext.go │ ├── http_header_policy_dao.go │ ├── http_header_policy_dao_test.go │ ├── http_header_policy_model.go │ ├── http_header_policy_model_ext.go │ ├── http_location_dao.go │ ├── http_location_dao_test.go │ ├── http_location_model.go │ ├── http_location_model_ext.go │ ├── http_page_dao.go │ ├── http_page_dao_test.go │ ├── http_page_model.go │ ├── http_page_model_ext.go │ ├── http_rewrite_rule_dao.go │ ├── http_rewrite_rule_dao_test.go │ ├── http_rewrite_rule_model.go │ ├── http_rewrite_rule_model_ext.go │ ├── http_web_dao.go │ ├── http_web_dao_test.go │ ├── http_web_model.go │ ├── http_web_model_ext.go │ ├── http_websocket_dao.go │ ├── http_websocket_dao_test.go │ ├── http_websocket_model.go │ ├── http_websocket_model_ext.go │ ├── init.go │ ├── ip_item_dao.go │ ├── ip_item_dao_test.go │ ├── ip_item_model.go │ ├── ip_item_model_ext.go │ ├── ip_library_artifact_dao.go │ ├── ip_library_artifact_dao_test.go │ ├── ip_library_artifact_model.go │ ├── ip_library_artifact_model_ext.go │ ├── ip_library_dao.go │ ├── ip_library_dao_test.go │ ├── ip_library_file_dao.go │ ├── ip_library_file_dao_test.go │ ├── ip_library_file_model.go │ ├── ip_library_file_model_ext.go │ ├── ip_library_model.go │ ├── ip_library_model_ext.go │ ├── ip_list_dao.go │ ├── ip_list_dao_test.go │ ├── ip_list_model.go │ ├── ip_list_model_ext.go │ ├── latest_item_dao.go │ ├── latest_item_dao_test.go │ ├── latest_item_model.go │ ├── latest_item_model_ext.go │ ├── log_dao.go │ ├── log_dao_test.go │ ├── log_model.go │ ├── log_model_ext.go │ ├── login_dao.go │ ├── login_dao_test.go │ ├── login_model.go │ ├── login_model_ext.go │ ├── login_session_dao.go │ ├── login_session_dao_test.go │ ├── login_session_model.go │ ├── login_session_model_ext.go │ ├── message_dao.go │ ├── message_dao_test.go │ ├── message_media_dao.go │ ├── message_media_dao_test.go │ ├── message_media_instance_dao.go │ ├── message_media_instance_dao_test.go │ ├── message_media_instance_model.go │ ├── message_media_instance_model_ext.go │ ├── message_media_model.go │ ├── message_media_model_ext.go │ ├── message_model.go │ ├── message_model_ext.go │ ├── message_receiver_dao.go │ ├── message_receiver_model.go │ ├── message_receiver_model_ext.go │ ├── message_recipient_dao.go │ ├── message_recipient_dao_test.go │ ├── message_recipient_group_dao.go │ ├── message_recipient_group_dao_test.go │ ├── message_recipient_group_model.go │ ├── message_recipient_group_model_ext.go │ ├── message_recipient_model.go │ ├── message_recipient_model_ext.go │ ├── message_task_dao.go │ ├── message_task_dao_ext.go │ ├── message_task_dao_test.go │ ├── message_task_log_dao.go │ ├── message_task_log_dao_test.go │ ├── message_task_log_model.go │ ├── message_task_log_model_ext.go │ ├── message_task_model.go │ ├── message_task_model_ext.go │ ├── metric_chart_dao.go │ ├── metric_chart_dao_test.go │ ├── metric_chart_model.go │ ├── metric_chart_model_ext.go │ ├── metric_item_dao.go │ ├── metric_item_dao_test.go │ ├── metric_item_model.go │ ├── metric_item_model_ext.go │ ├── metric_stat_dao.go │ ├── metric_stat_dao_test.go │ ├── metric_stat_model.go │ ├── metric_stat_model_ext.go │ ├── metric_sum_stat_dao.go │ ├── metric_sum_stat_dao_test.go │ ├── metric_sum_stat_model.go │ ├── metric_sum_stat_model_ext.go │ ├── nameservers │ │ ├── ns_domain_dao.go │ │ ├── ns_domain_dao_test.go │ │ ├── ns_domain_group_model.go │ │ ├── ns_domain_group_model_ext.go │ │ ├── ns_domain_model.go │ │ ├── ns_domain_model_ext.go │ │ ├── ns_key_model.go │ │ ├── ns_key_model_ext.go │ │ ├── ns_plan_model.go │ │ ├── ns_plan_model_ext.go │ │ ├── ns_question_option_model.go │ │ ├── ns_question_option_model_ext.go │ │ ├── ns_record_dao.go │ │ ├── ns_record_dao_test.go │ │ ├── ns_record_hourly_stat_model.go │ │ ├── ns_record_hourly_stat_model_ext.go │ │ ├── ns_record_model.go │ │ ├── ns_record_model_ext.go │ │ ├── ns_route_category_dao.go │ │ ├── ns_route_category_dao_test.go │ │ ├── ns_route_category_model.go │ │ ├── ns_route_category_model_ext.go │ │ ├── ns_route_dao.go │ │ ├── ns_route_dao_test.go │ │ ├── ns_route_model.go │ │ ├── ns_route_model_ext.go │ │ ├── ns_user_plan_model.go │ │ ├── ns_user_plan_model_ext.go │ │ ├── ns_zone_model.go │ │ └── ns_zone_model_ext.go │ ├── node_action_dao.go │ ├── node_action_dao_test.go │ ├── node_action_model.go │ ├── node_action_model_ext.go │ ├── node_cluster_dao.go │ ├── node_cluster_dao_test.go │ ├── node_cluster_firewall_action_dao.go │ ├── node_cluster_firewall_action_dao_test.go │ ├── node_cluster_firewall_action_model.go │ ├── node_cluster_firewall_action_model_ext.go │ ├── node_cluster_metric_item_dao.go │ ├── node_cluster_metric_item_dao_test.go │ ├── node_cluster_metric_item_model.go │ ├── node_cluster_metric_item_model_ext.go │ ├── node_cluster_model.go │ ├── node_cluster_model_ext.go │ ├── node_dao.go │ ├── node_dao_ext.go │ ├── node_dao_limit.go │ ├── node_dao_test.go │ ├── node_grant_dao.go │ ├── node_grant_dao_test.go │ ├── node_grant_model.go │ ├── node_grant_model_ext.go │ ├── node_group_dao.go │ ├── node_group_dao_test.go │ ├── node_group_model.go │ ├── node_group_model_ext.go │ ├── node_install_status.go │ ├── node_install_status_step.go │ ├── node_ip_address_dao.go │ ├── node_ip_address_dao_community.go │ ├── node_ip_address_dao_test.go │ ├── node_ip_address_group_dao.go │ ├── node_ip_address_group_dao_test.go │ ├── node_ip_address_group_model.go │ ├── node_ip_address_group_model_ext.go │ ├── node_ip_address_log_dao.go │ ├── node_ip_address_log_dao_test.go │ ├── node_ip_address_log_model.go │ ├── node_ip_address_log_model_ext.go │ ├── node_ip_address_model.go │ ├── node_ip_address_model_ext.go │ ├── node_ip_address_threshold_dao.go │ ├── node_ip_address_threshold_dao_test.go │ ├── node_ip_address_threshold_model.go │ ├── node_ip_address_threshold_model_ext.go │ ├── node_log_dao.go │ ├── node_log_dao_ext.go │ ├── node_log_dao_test.go │ ├── node_log_model.go │ ├── node_log_model_ext.go │ ├── node_login_dao.go │ ├── node_login_dao_ext.go │ ├── node_login_dao_test.go │ ├── node_login_model.go │ ├── node_login_model_ext.go │ ├── node_login_params_ssh.go │ ├── node_model.go │ ├── node_model_ext.go │ ├── node_model_ext_schdule.go │ ├── node_price_item_model.go │ ├── node_price_item_model_ext.go │ ├── node_region_dao.go │ ├── node_region_dao_test.go │ ├── node_region_model.go │ ├── node_region_model_ext.go │ ├── node_task_dao.go │ ├── node_task_dao_ext.go │ ├── node_task_dao_test.go │ ├── node_task_model.go │ ├── node_task_model_ext.go │ ├── node_threshold_dao.go │ ├── node_threshold_dao_ext.go │ ├── node_threshold_dao_test.go │ ├── node_threshold_model.go │ ├── node_threshold_model_ext.go │ ├── node_traffic_daily_stat_dao.go │ ├── node_traffic_daily_stat_dao_ext.go │ ├── node_traffic_daily_stat_dao_test.go │ ├── node_traffic_daily_stat_model.go │ ├── node_traffic_daily_stat_model_ext.go │ ├── node_value_dao.go │ ├── node_value_dao_ext.go │ ├── node_value_dao_test.go │ ├── node_value_model.go │ ├── node_value_model_ext.go │ ├── notify_levels.go │ ├── ns_access_log_model.go │ ├── ns_access_log_model_ext.go │ ├── ns_cluster_dao.go │ ├── ns_cluster_dao_test.go │ ├── ns_cluster_model.go │ ├── ns_cluster_model_ext.go │ ├── ns_node_dao.go │ ├── ns_node_dao_test.go │ ├── ns_node_model.go │ ├── ns_node_model_ext.go │ ├── origin_dao.go │ ├── origin_dao_test.go │ ├── origin_model.go │ ├── origin_model_ext.go │ ├── plan_dao.go │ ├── plan_dao_test.go │ ├── plan_model.go │ ├── plan_model_ext.go │ ├── posts │ │ ├── post_category_dao.go │ │ ├── post_category_dao_test.go │ │ ├── post_category_model.go │ │ ├── post_category_model_ext.go │ │ ├── post_dao.go │ │ ├── post_dao_test.go │ │ ├── post_model.go │ │ └── post_model_ext.go │ ├── provider_dao.go │ ├── provider_dao_test.go │ ├── provider_model.go │ ├── provider_model_ext.go │ ├── regions │ │ ├── region_city_dao.go │ │ ├── region_city_dao_test.go │ │ ├── region_city_model.go │ │ ├── region_city_model_ext.go │ │ ├── region_country_dao.go │ │ ├── region_country_dao_test.go │ │ ├── region_country_model.go │ │ ├── region_country_model_ext.go │ │ ├── region_provider_dao.go │ │ ├── region_provider_dao_test.go │ │ ├── region_provider_model.go │ │ ├── region_provider_model_ext.go │ │ ├── region_province_dao.go │ │ ├── region_province_dao_test.go │ │ ├── region_province_model.go │ │ ├── region_province_model_ext.go │ │ ├── region_town_dao.go │ │ ├── region_town_dao_test.go │ │ ├── region_town_model.go │ │ ├── region_town_model_ext.go │ │ └── utils.go │ ├── report_node_dao.go │ ├── report_node_dao_test.go │ ├── report_node_group_dao.go │ ├── report_node_group_dao_test.go │ ├── report_node_group_model.go │ ├── report_node_group_model_ext.go │ ├── report_node_model.go │ ├── report_node_model_ext.go │ ├── report_result_dao.go │ ├── report_result_dao_test.go │ ├── report_result_model.go │ ├── report_result_model_ext.go │ ├── reverse_proxy_dao.go │ ├── reverse_proxy_dao_test.go │ ├── reverse_proxy_model.go │ ├── reverse_proxy_model_ext.go │ ├── script_dao_plus_test.go │ ├── script_history_dao_plus_test.go │ ├── script_history_model.go │ ├── script_history_model_ext.go │ ├── script_model.go │ ├── script_model_ext.go │ ├── server_bandwidth_stat_dao.go │ ├── server_bandwidth_stat_dao_test.go │ ├── server_bandwidth_stat_model.go │ ├── server_bandwidth_stat_model_ext.go │ ├── server_bill_dao.go │ ├── server_bill_dao_test.go │ ├── server_bill_model.go │ ├── server_bill_model_ext.go │ ├── server_daily_stat_dao.go │ ├── server_daily_stat_dao_test.go │ ├── server_daily_stat_model.go │ ├── server_daily_stat_model_ext.go │ ├── server_dao.go │ ├── server_dao_copy_ext.go │ ├── server_dao_ext.go │ ├── server_dao_test.go │ ├── server_group_dao.go │ ├── server_group_dao_test.go │ ├── server_group_model.go │ ├── server_group_model_ext.go │ ├── server_model.go │ ├── server_model_ext.go │ ├── server_stat_board_chart_dao.go │ ├── server_stat_board_chart_dao_test.go │ ├── server_stat_board_chart_model.go │ ├── server_stat_board_chart_model_ext.go │ ├── server_stat_board_dao.go │ ├── server_stat_board_dao_test.go │ ├── server_stat_board_model.go │ ├── server_stat_board_model_ext.go │ ├── ssl_cert_dao.go │ ├── ssl_cert_dao_test.go │ ├── ssl_cert_group_dao.go │ ├── ssl_cert_group_dao_test.go │ ├── ssl_cert_group_model.go │ ├── ssl_cert_group_model_ext.go │ ├── ssl_cert_model.go │ ├── ssl_cert_model_ext.go │ ├── ssl_policy_dao.go │ ├── ssl_policy_dao_test.go │ ├── ssl_policy_model.go │ ├── ssl_policy_model_ext.go │ ├── stats │ │ ├── node_cluster_traffic_daily_stat_dao.go │ │ ├── node_cluster_traffic_daily_stat_dao_test.go │ │ ├── node_cluster_traffic_daily_stat_model.go │ │ ├── node_cluster_traffic_daily_stat_model_ext.go │ │ ├── node_traffic_hourly_stat_dao.go │ │ ├── node_traffic_hourly_stat_dao_test.go │ │ ├── node_traffic_hourly_stat_model.go │ │ ├── node_traffic_hourly_stat_model_ext.go │ │ ├── server_client_browser_monthly_stat_dao.go │ │ ├── server_client_browser_monthly_stat_dao_test.go │ │ ├── server_client_browser_monthly_stat_model.go │ │ ├── server_client_browser_monthly_stat_model_ext.go │ │ ├── server_client_system_monthly_stat_dao.go │ │ ├── server_client_system_monthly_stat_dao_test.go │ │ ├── server_client_system_monthly_stat_model.go │ │ ├── server_client_system_monthly_stat_model_ext.go │ │ ├── server_domain_hourly_stat_dao.go │ │ ├── server_domain_hourly_stat_dao_test.go │ │ ├── server_domain_hourly_stat_model.go │ │ ├── server_domain_hourly_stat_model_ext.go │ │ ├── server_http_firewall_daily_stat_dao.go │ │ ├── server_http_firewall_daily_stat_dao_test.go │ │ ├── server_http_firewall_daily_stat_model.go │ │ ├── server_http_firewall_daily_stat_model_ext.go │ │ ├── server_http_firewall_hourly_stat_dao.go │ │ ├── server_http_firewall_hourly_stat_dao_test.go │ │ ├── server_http_firewall_hourly_stat_model.go │ │ ├── server_http_firewall_hourly_stat_model_ext.go │ │ ├── server_region_city_monthly_stat_dao.go │ │ ├── server_region_city_monthly_stat_dao_test.go │ │ ├── server_region_city_monthly_stat_model.go │ │ ├── server_region_city_monthly_stat_model_ext.go │ │ ├── server_region_country_daily_stat_dao.go │ │ ├── server_region_country_daily_stat_dao_test.go │ │ ├── server_region_country_daily_stat_model.go │ │ ├── server_region_country_daily_stat_model_ext.go │ │ ├── server_region_country_monthly_stat_dao.go │ │ ├── server_region_country_monthly_stat_dao_test.go │ │ ├── server_region_country_monthly_stat_model.go │ │ ├── server_region_country_monthly_stat_model_ext.go │ │ ├── server_region_provider_monthly_stat_dao.go │ │ ├── server_region_provider_monthly_stat_dao_test.go │ │ ├── server_region_provider_monthly_stat_model.go │ │ ├── server_region_provider_monthly_stat_model_ext.go │ │ ├── server_region_province_monthly_stat_dao.go │ │ ├── server_region_province_monthly_stat_dao_test.go │ │ ├── server_region_province_monthly_stat_model.go │ │ ├── server_region_province_monthly_stat_model_ext.go │ │ ├── traffic_daily_stat_dao.go │ │ ├── traffic_daily_stat_dao_test.go │ │ ├── traffic_daily_stat_model.go │ │ ├── traffic_daily_stat_model_ext.go │ │ ├── traffic_hourly_stat_dao.go │ │ ├── traffic_hourly_stat_dao_test.go │ │ ├── traffic_hourly_stat_model.go │ │ └── traffic_hourly_stat_model_ext.go │ ├── sub_user_dao.go │ ├── sub_user_dao_test.go │ ├── sub_user_model.go │ ├── sub_user_model_ext.go │ ├── sys_event_dao.go │ ├── sys_event_dao_test.go │ ├── sys_event_model.go │ ├── sys_event_model_ext.go │ ├── sys_event_types.go │ ├── sys_locker_dao.go │ ├── sys_locker_dao_test.go │ ├── sys_locker_increment.go │ ├── sys_locker_increment_test.go │ ├── sys_locker_model.go │ ├── sys_locker_model_ext.go │ ├── sys_setting_dao.go │ ├── sys_setting_dao_test.go │ ├── sys_setting_model.go │ ├── sys_setting_model_ext.go │ ├── tcp_firewall_policy_dao.go │ ├── tcp_firewall_policy_dao_test.go │ ├── tcp_firewall_policy_model.go │ ├── tcp_firewall_policy_model_ext.go │ ├── traffic_package_dao.go │ ├── traffic_package_dao_test.go │ ├── traffic_package_model.go │ ├── traffic_package_model_ext.go │ ├── traffic_package_period_dao.go │ ├── traffic_package_period_dao_test.go │ ├── traffic_package_period_model.go │ ├── traffic_package_period_model_ext.go │ ├── traffic_package_price_dao.go │ ├── traffic_package_price_dao_test.go │ ├── traffic_package_price_model.go │ ├── traffic_package_price_model_ext.go │ ├── updating_server_list_dao.go │ ├── updating_server_list_dao_test.go │ ├── updating_server_list_model.go │ ├── updating_server_list_model_ext.go │ ├── user_access_key_dao.go │ ├── user_access_key_dao_test.go │ ├── user_access_key_model.go │ ├── user_access_key_model_ext.go │ ├── user_ad_instance_dao.go │ ├── user_ad_instance_dao_test.go │ ├── user_ad_instance_model.go │ ├── user_ad_instance_model_ext.go │ ├── user_bandwidth_stat_dao.go │ ├── user_bandwidth_stat_dao_test.go │ ├── user_bandwidth_stat_model.go │ ├── user_bandwidth_stat_model_ext.go │ ├── user_bill_dao.go │ ├── user_bill_dao_test.go │ ├── user_bill_model.go │ ├── user_bill_model_ext.go │ ├── user_dao.go │ ├── user_dao_ext.go │ ├── user_dao_test.go │ ├── user_email_notification_dao.go │ ├── user_email_notification_dao_test.go │ ├── user_email_notification_model.go │ ├── user_email_notification_model_ext.go │ ├── user_email_verification_dao.go │ ├── user_email_verification_dao_test.go │ ├── user_email_verification_model.go │ ├── user_email_verification_model_ext.go │ ├── user_identity_dao.go │ ├── user_identity_dao_test.go │ ├── user_identity_model.go │ ├── user_identity_model_ext.go │ ├── user_mobile_verification_dao.go │ ├── user_mobile_verification_dao_test.go │ ├── user_mobile_verification_model.go │ ├── user_mobile_verification_model_ext.go │ ├── user_model.go │ ├── user_model_ext.go │ ├── user_node_dao.go │ ├── user_node_dao_test.go │ ├── user_node_model.go │ ├── user_node_model_ext.go │ ├── user_plan_bandwidth_stat_dao.go │ ├── user_plan_bandwidth_stat_dao_test.go │ ├── user_plan_bandwidth_stat_model.go │ ├── user_plan_bandwidth_stat_model_ext.go │ ├── user_plan_dao.go │ ├── user_plan_model.go │ ├── user_plan_model_ext.go │ ├── user_plan_stat_dao.go │ ├── user_plan_stat_dao_community.go │ ├── user_plan_stat_dao_test.go │ ├── user_plan_stat_model.go │ ├── user_plan_stat_model_ext.go │ ├── user_script_dao.go │ ├── user_script_dao_test.go │ ├── user_script_model.go │ ├── user_script_model_ext.go │ ├── user_traffic_bill_model.go │ ├── user_traffic_bill_model_ext.go │ ├── user_traffic_package_dao.go │ ├── user_traffic_package_dao_test.go │ ├── user_traffic_package_model.go │ ├── user_traffic_package_model_ext.go │ ├── user_verify_code_dao.go │ ├── user_verify_code_dao_test.go │ ├── user_verify_code_model.go │ ├── user_verify_code_model_ext.go │ ├── utils.go │ ├── utils_test.go │ ├── version_dao.go │ ├── version_dao_test.go │ ├── version_model.go │ └── version_model_ext.go └── utils │ ├── disk.go │ ├── disk_test.go │ ├── utils.go │ └── utils_test.go ├── dnsclients ├── .gitignore ├── cloudflare │ ├── response_base.go │ ├── response_create_dns_record.go │ ├── response_delete_dns_record.go │ ├── response_get_dns_records.go │ ├── response_interface.go │ ├── response_update_dns_record.go │ └── response_zones.go ├── dnspod │ ├── response_base.go │ ├── response_custom_line_group_list.go │ ├── response_domain_info.go │ ├── response_domain_list.go │ ├── response_interface.go │ ├── response_record_create.go │ ├── response_record_line.go │ ├── response_record_list.go │ ├── response_record_modify.go │ └── response_record_remove.go ├── dnstypes │ ├── record.go │ └── route.go ├── domain_records_cache.go ├── domain_records_cahce_test.go ├── edgeapi │ ├── response_base.go │ ├── response_create_ns_record.go │ ├── response_find_all_ns_routes.go │ ├── response_find_ns_domain_with_name.go │ ├── response_find_ns_record_with_name_and_type.go │ ├── response_find_ns_records_with_name_and_type.go │ ├── response_get_api_access_token.go │ ├── response_interface.go │ ├── response_list_ns_domains.go │ ├── response_list_ns_records.go │ ├── response_success.go │ └── response_update_ns_record.go ├── huaweidns │ ├── response_base.go │ ├── response_custom_lines.go │ ├── response_record_sets.go │ ├── response_zone_record_sets.go │ ├── response_zones.go │ ├── response_zones_create_record_set.go │ ├── response_zones_delete_record_set.go │ └── response_zones_update_record_set.go ├── provider_alidns.go ├── provider_alidns_test.go ├── provider_base.go ├── provider_base_test.go ├── provider_cloud_flare.go ├── provider_cloud_flare_test.go ├── provider_custom_http.go ├── provider_custom_http_test.go ├── provider_dnspod.go ├── provider_dnspod_test.go ├── provider_edge_dns_api.go ├── provider_edge_dns_api_test.go ├── provider_huawei_dns.go ├── provider_huawei_dns_test.go ├── provider_interface.go ├── provider_tencent_dns.go ├── types.go ├── types_ext.go ├── utils.go └── utils_test.go ├── encrypt ├── magic_key.go ├── magic_key_test.go ├── method.go ├── method_aes_128_cfb.go ├── method_aes_128_cfb_test.go ├── method_aes_192_cfb.go ├── method_aes_192_cfb_test.go ├── method_aes_256_cfb.go ├── method_aes_256_cfb_test.go ├── method_raw.go ├── method_raw_test.go ├── method_utils.go └── method_utils_test.go ├── errors ├── detailed_error.go ├── error.go └── error_test.go ├── events ├── events.go └── utils.go ├── goman ├── instance.go ├── lib.go └── lib_test.go ├── installers ├── credentials.go ├── deploy_file.go ├── deploy_file_test.go ├── deploy_manager.go ├── deploy_manager_test.go ├── env.go ├── errors.go ├── helpers │ ├── README.md │ ├── unzip.go │ └── unzip_test.go ├── installer_base.go ├── installer_base_test.go ├── installer_interface.go ├── installer_node.go ├── installer_node_test.go ├── params_node.go ├── queue_node.go ├── queue_node_test.go ├── ssh_client.go ├── ssh_client_test.go ├── upgrade_limiter.go └── upgrade_limiter_test.go ├── instances ├── README.md ├── api_config.go ├── instance.go ├── instance_test.go └── options.go ├── nodes ├── api_node.go ├── api_node_ext.go ├── api_node_services.go ├── api_node_services_hook.go ├── ip_library_updater.go ├── node_status_executor.go ├── node_status_executor_test.go ├── node_status_executor_unix.go ├── node_status_executor_windows.go ├── rest_server.go └── start_issue.go ├── remotelogs ├── dao_interface.go └── utils.go ├── rpc ├── context.go ├── services │ ├── clients │ │ ├── service_client_agent.go │ │ ├── service_client_agent_ip.go │ │ ├── service_formal_client_browser.go │ │ └── service_formal_client_system.go │ ├── reporters │ │ └── utils.go │ ├── service_acme_authentication.go │ ├── service_acme_provider.go │ ├── service_acme_provider_account.go │ ├── service_acme_task.go │ ├── service_acme_user.go │ ├── service_admin.go │ ├── service_admin_ext.go │ ├── service_admin_test.go │ ├── service_api_access_token.go │ ├── service_api_method_stat.go │ ├── service_api_node.go │ ├── service_api_token.go │ ├── service_authority_node.go │ ├── service_base.go │ ├── service_db.go │ ├── service_db_node.go │ ├── service_db_test.go │ ├── service_dns.go │ ├── service_dns_domain.go │ ├── service_dns_provider.go │ ├── service_dns_task.go │ ├── service_file.go │ ├── service_file_chunk.go │ ├── service_firewall.go │ ├── service_http_access_log.go │ ├── service_http_access_log_ext.go │ ├── service_http_auth_policy.go │ ├── service_http_cache_policy.go │ ├── service_http_cache_task.go │ ├── service_http_cache_task_key.go │ ├── service_http_cache_task_test.go │ ├── service_http_fastcgi.go │ ├── service_http_firewall_policy.go │ ├── service_http_firewall_policy_test.go │ ├── service_http_firewall_rule_group.go │ ├── service_http_firewall_rule_set.go │ ├── service_http_header.go │ ├── service_http_header_policy.go │ ├── service_http_location.go │ ├── service_http_page.go │ ├── service_http_rewrite_rule.go │ ├── service_http_web.go │ ├── service_http_web_community.go │ ├── service_http_websocket.go │ ├── service_ip_item.go │ ├── service_ip_library.go │ ├── service_ip_library_artifact.go │ ├── service_ip_library_file.go │ ├── service_ip_list.go │ ├── service_latest_item.go │ ├── service_log.go │ ├── service_login.go │ ├── service_login_session.go │ ├── service_message.go │ ├── service_metric_chart.go │ ├── service_metric_item.go │ ├── service_metric_stat.go │ ├── service_node.go │ ├── service_node_cluster.go │ ├── service_node_cluster_ext.go │ ├── service_node_cluster_firewall_action.go │ ├── service_node_cluster_metric_item.go │ ├── service_node_ext.go │ ├── service_node_grant.go │ ├── service_node_group.go │ ├── service_node_ip_address.go │ ├── service_node_ip_address_log.go │ ├── service_node_ip_address_threshold.go │ ├── service_node_log.go │ ├── service_node_login.go │ ├── service_node_region.go │ ├── service_node_stream.go │ ├── service_node_task.go │ ├── service_node_threshold.go │ ├── service_node_value.go │ ├── service_origin.go │ ├── service_ping.go │ ├── service_plan_community.go │ ├── service_region_city.go │ ├── service_region_country.go │ ├── service_region_provider.go │ ├── service_region_province.go │ ├── service_region_town.go │ ├── service_reverse_proxy.go │ ├── service_server.go │ ├── service_server_.go │ ├── service_server_bandwidth_stat.go │ ├── service_server_client_browser_monthly_stat.go │ ├── service_server_client_system_monthly_stat.go │ ├── service_server_community.go │ ├── service_server_daily_stat.go │ ├── service_server_domain_hourly_stat.go │ ├── service_server_group.go │ ├── service_server_http_firewall_daily_stat.go │ ├── service_server_http_firewall_daily_stat_test.go │ ├── service_server_region_city_monthly_stat.go │ ├── service_server_region_country_monthly_stat.go │ ├── service_server_region_provider_monthly_stat.go │ ├── service_server_region_province_monthly_stat.go │ ├── service_server_stat_board.go │ ├── service_server_stat_board_chart.go │ ├── service_server_test.go │ ├── service_ssl_cert.go │ ├── service_ssl_policy.go │ ├── service_sys_locker.go │ ├── service_sys_setting.go │ ├── service_traffic_daily_stat.go │ ├── service_updating_server_list.go │ ├── service_user_access_key.go │ ├── service_user_identity.go │ ├── service_user_plan_community.go │ ├── sevice_http_gzip.go │ └── users │ │ ├── service_user.go │ │ └── service_user_ext.go ├── tasks │ └── cache_task_manager.go └── utils │ ├── mock_node.go │ ├── mock_node_admin.go │ ├── plain_context.go │ ├── utils.go │ └── utils_ext.go ├── setup ├── config.go ├── setup.go ├── setup_test.go ├── sql.go ├── sql.json ├── sql_dump.go ├── sql_dump_result.go ├── sql_dump_test.go ├── sql_executor.go ├── sql_executor_ext.go ├── sql_executor_test.go ├── sql_field.go ├── sql_index.go ├── sql_record.go ├── sql_records_table.go ├── sql_table.go ├── sql_upgrade.go ├── sql_upgrade_ext.go ├── sql_upgrade_ext_test.go ├── sql_upgrade_test.go ├── utils.go └── utils_test.go ├── tasks ├── dns_task_executor.go ├── dns_task_executor_test.go ├── event_looper.go ├── health_check_cluster_task.go ├── health_check_cluster_task_test.go ├── health_check_executor.go ├── health_check_executor_ext.go ├── health_check_executor_test.go ├── health_check_result.go ├── health_check_task.go ├── health_check_task_test.go ├── log_task.go ├── log_task_test.go ├── message_task.go ├── monitor_item_value_task.go ├── monitor_item_value_task_test.go ├── node_log_cleaner_task.go ├── node_log_cleaner_task_test.go ├── node_monitor_task.go ├── node_monitor_task_test.go ├── node_task_extractor.go ├── server_access_log_cleaner.go ├── server_access_log_cleaner_test.go ├── ssl_cert_expire_check_executor.go ├── ssl_cert_expire_check_executor_test.go ├── ssl_cert_update_ocsp_task.go ├── ssl_cert_update_ocsp_task_test.go ├── task_base.go └── task_interface.go ├── utils ├── cache_map.go ├── cache_map_test.go ├── compare.go ├── compare_test.go ├── domain.go ├── domainutils │ └── utils.go ├── email.go ├── email_test.go ├── errors.go ├── exec │ ├── cmd.go │ ├── cmd_test.go │ ├── look_linux.go │ └── look_others.go ├── expires │ ├── id_key_map.go │ ├── id_key_map_test.go │ ├── list.go │ ├── list_test.go │ └── manager.go ├── firewall.go ├── http.go ├── json.go ├── json_test.go ├── lookup.go ├── lookup_test.go ├── maps │ ├── fixed_map.go │ └── fixed_map_test.go ├── mobile.go ├── mobile_test.go ├── numberutils │ ├── utils.go │ └── utils_test.go ├── progress.go ├── regexputils │ ├── expr.go │ └── expr_test.go ├── rlimit_darwin.go ├── rlimit_linux.go ├── rlimit_others.go ├── service.go ├── service_linux.go ├── service_others.go ├── service_test.go ├── service_windows.go ├── sha1.go ├── sha1_test.go ├── sizes │ ├── sizes.go │ └── sizes_test.go ├── strings.go ├── strings_test.go ├── system.go ├── system_test.go ├── taskutils │ ├── concurrent.go │ └── concurrent_test.go ├── testutils │ └── memory.go ├── ticker.go ├── time.go ├── time_test.go ├── ttlcache │ ├── cache.go │ ├── cache_test.go │ ├── item.go │ ├── manager.go │ ├── option.go │ ├── piece.go │ ├── piece_test.go │ ├── utils.go │ └── utils_test.go ├── unix_time.go ├── unzip.go ├── unzip_test.go ├── version.go └── version_test.go └── zero ├── zero.go └── zero_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | *_plus.go 2 | *-plus.sh 3 | *_plus_test.go -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | GoEdge API节点源码 -------------------------------------------------------------------------------- /build/build-all.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./build.sh linux amd64 4 | ./build.sh linux 386 5 | ./build.sh linux arm64 6 | ./build.sh linux mips64 7 | ./build.sh linux mips64le 8 | ./build.sh darwin amd64 9 | ./build.sh darwin arm64 10 | -------------------------------------------------------------------------------- /build/configs/.gitignore: -------------------------------------------------------------------------------- 1 | api.yaml 2 | db.yaml -------------------------------------------------------------------------------- /build/configs/api.template.yaml: -------------------------------------------------------------------------------- 1 | nodeId: "${nodeId}" 2 | secret: "${secret}" -------------------------------------------------------------------------------- /build/configs/db.template.yaml: -------------------------------------------------------------------------------- 1 | default: 2 | db: "prod" 3 | prefix: "" 4 | 5 | dbs: 6 | prod: 7 | driver: "mysql" 8 | dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge?charset=utf8mb4&timeout=30s" 9 | prefix: "edge" 10 | models: 11 | package: internal/web/models 12 | 13 | 14 | fields: 15 | bool: [ "uamIsOn", "followPort", "requestHostExcludingPort", "autoRemoteStart", "autoInstallNftables", "enableIPLists", "detectAgents", "checkingPorts", "enableRecordHealthCheck", "offlineIsNotified", "http2Enabled", "http3Enabled", "enableHTTP2", "retry50X", "retry40X", "autoSystemTuning", "disableDefaultDB", "autoTrimDisks","enableGlobalPages" ] 16 | 17 | -------------------------------------------------------------------------------- /build/deploy/.gitignore: -------------------------------------------------------------------------------- 1 | *.zip -------------------------------------------------------------------------------- /build/installers/.gitignore: -------------------------------------------------------------------------------- 1 | edge-* -------------------------------------------------------------------------------- /build/logs/.gitignore: -------------------------------------------------------------------------------- 1 | *.log -------------------------------------------------------------------------------- /build/sql.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # generate 'internal/setup/sql.json' file 4 | 5 | CWD="$(dirname "$0")" 6 | 7 | go run "${CWD}"/../cmd/sql-dump/main.go -dir="${CWD}" -------------------------------------------------------------------------------- /cmd/edge-instance-installer/.gitignore: -------------------------------------------------------------------------------- 1 | edge-instance-installer* 2 | prepare.sh -------------------------------------------------------------------------------- /dist/.gitignore: -------------------------------------------------------------------------------- 1 | *.zip 2 | edge-api -------------------------------------------------------------------------------- /internal/acme/account.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package acme 4 | 5 | type Account struct { 6 | EABKid string 7 | EABKey string 8 | } 9 | -------------------------------------------------------------------------------- /internal/acme/auth_callback.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | type AuthCallback func(domain, token, keyAuth string) 4 | -------------------------------------------------------------------------------- /internal/acme/http_provider.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | type HTTPProvider struct { 4 | onAuth AuthCallback 5 | } 6 | 7 | func NewHTTPProvider(onAuth AuthCallback) *HTTPProvider { 8 | return &HTTPProvider{ 9 | onAuth: onAuth, 10 | } 11 | } 12 | 13 | func (this *HTTPProvider) Present(domain, token, keyAuth string) error { 14 | if this.onAuth != nil { 15 | this.onAuth(domain, token, keyAuth) 16 | } 17 | //http01.ChallengePath() 18 | return nil 19 | } 20 | 21 | func (this *HTTPProvider) CleanUp(domain, token, keyAuth string) error { 22 | return nil 23 | } 24 | -------------------------------------------------------------------------------- /internal/acme/key.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | "crypto/x509" 5 | "encoding/base64" 6 | ) 7 | 8 | func ParsePrivateKeyFromBase64(base64String string) (interface{}, error) { 9 | data, err := base64.StdEncoding.DecodeString(base64String) 10 | if err != nil { 11 | return nil, err 12 | } 13 | 14 | return x509.ParsePKCS8PrivateKey(data) 15 | } 16 | -------------------------------------------------------------------------------- /internal/acme/providers.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package acme 4 | 5 | const DefaultProviderCode = "letsencrypt" 6 | 7 | type Provider struct { 8 | Name string `json:"name"` 9 | Code string `json:"code"` 10 | Description string `json:"description"` 11 | APIURL string `json:"apiURL"` 12 | TestAPIURL string `json:"testAPIURL"` 13 | RequireEAB bool `json:"requireEAB"` 14 | EABDescription string `json:"eabDescription"` 15 | } 16 | 17 | func FindProviderWithCode(code string) *Provider { 18 | for _, provider := range FindAllProviders() { 19 | if provider.Code == code { 20 | return provider 21 | } 22 | } 23 | return nil 24 | } 25 | -------------------------------------------------------------------------------- /internal/acme/task.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import "github.com/TeaOSLab/EdgeAPI/internal/dnsclients" 4 | 5 | type AuthType = string 6 | 7 | const ( 8 | AuthTypeDNS AuthType = "dns" 9 | AuthTypeHTTP AuthType = "http" 10 | ) 11 | 12 | type Task struct { 13 | Provider *Provider 14 | Account *Account 15 | User *User 16 | AuthType AuthType 17 | Domains []string 18 | 19 | // DNS相关 20 | DNSProvider dnsclients.ProviderInterface 21 | DNSDomain string 22 | } 23 | -------------------------------------------------------------------------------- /internal/apps/directive.go: -------------------------------------------------------------------------------- 1 | package apps 2 | 3 | type Directive struct { 4 | Arg string 5 | Callback func() 6 | } 7 | -------------------------------------------------------------------------------- /internal/configs/api_config_test.go: -------------------------------------------------------------------------------- 1 | package configs 2 | 3 | import ( 4 | _ "github.com/iwind/TeaGo/bootstrap" 5 | "testing" 6 | ) 7 | 8 | func TestSharedAPIConfig(t *testing.T) { 9 | config, err := SharedAPIConfig() 10 | if err != nil { 11 | t.Fatal(err) 12 | } 13 | t.Log(config) 14 | } 15 | -------------------------------------------------------------------------------- /internal/configs/locker.go: -------------------------------------------------------------------------------- 1 | package configs 2 | 3 | import "sync" 4 | 5 | var sharedLocker = &sync.RWMutex{} 6 | -------------------------------------------------------------------------------- /internal/const/build.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | //go:build !plus 3 | // +build !plus 4 | 5 | package teaconst 6 | 7 | const BuildCommunity = true 8 | const BuildPlus = false 9 | const Tag = "community" 10 | -------------------------------------------------------------------------------- /internal/const/const.go: -------------------------------------------------------------------------------- 1 | package teaconst 2 | 3 | const ( 4 | Version = "1.3.8.2" 5 | 6 | ProductName = "Edge API" 7 | ProcessName = "edge-api" 8 | ProductNameZH = "Edge" 9 | 10 | GlobalProductName = "GoEdge" 11 | 12 | Role = "api" 13 | 14 | EncryptMethod = "aes-256-cfb" 15 | 16 | SystemdServiceName = "edge-api" 17 | 18 | // 其他节点版本号,用来检测是否有需要升级的节点 19 | 20 | NodeVersion = "1.3.8.2" 21 | ) 22 | -------------------------------------------------------------------------------- /internal/const/const_community.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package teaconst 5 | 6 | const ( 7 | // DefaultMaxNodes 节点数限制 8 | DefaultMaxNodes int32 = 50 9 | ) 10 | -------------------------------------------------------------------------------- /internal/db/models/accounts/order_method_dao.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | const ( 10 | OrderMethodStateEnabled = 1 // 已启用 11 | OrderMethodStateDisabled = 0 // 已禁用 12 | ) 13 | 14 | type OrderMethodDAO dbs.DAO 15 | 16 | func NewOrderMethodDAO() *OrderMethodDAO { 17 | return dbs.NewDAO(&OrderMethodDAO{ 18 | DAOObject: dbs.DAOObject{ 19 | DB: Tea.Env, 20 | Table: "edgeOrderMethods", 21 | Model: new(OrderMethod), 22 | PkName: "id", 23 | }, 24 | }).(*OrderMethodDAO) 25 | } 26 | 27 | var SharedOrderMethodDAO *OrderMethodDAO 28 | 29 | func init() { 30 | dbs.OnReady(func() { 31 | SharedOrderMethodDAO = NewOrderMethodDAO() 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /internal/db/models/accounts/order_method_dao_test.go: -------------------------------------------------------------------------------- 1 | package accounts_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/accounts/order_method_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_account_daily_stat_model.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | 3 | // UserAccountDailyStat 账户每日统计 4 | type UserAccountDailyStat struct { 5 | Id uint32 `field:"id"` // ID 6 | Day string `field:"day"` // YYYYMMDD 7 | Month string `field:"month"` // YYYYMM 8 | Income float64 `field:"income"` // 收入 9 | Expense float64 `field:"expense"` // 支出 10 | } 11 | 12 | type UserAccountDailyStatOperator struct { 13 | Id interface{} // ID 14 | Day interface{} // YYYYMMDD 15 | Month interface{} // YYYYMM 16 | Income interface{} // 收入 17 | Expense interface{} // 支出 18 | } 19 | 20 | func NewUserAccountDailyStatOperator() *UserAccountDailyStatOperator { 21 | return &UserAccountDailyStatOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_account_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_account_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_account_model.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | 3 | // UserAccount 用户账号 4 | type UserAccount struct { 5 | Id uint64 `field:"id"` // ID 6 | UserId uint64 `field:"userId"` // 用户ID 7 | Total float64 `field:"total"` // 可用总余额 8 | TotalFrozen float64 `field:"totalFrozen"` // 冻结余额 9 | } 10 | 11 | type UserAccountOperator struct { 12 | Id interface{} // ID 13 | UserId interface{} // 用户ID 14 | Total interface{} // 可用总余额 15 | TotalFrozen interface{} // 冻结余额 16 | } 17 | 18 | func NewUserAccountOperator() *UserAccountOperator { 19 | return &UserAccountOperator{} 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_account_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_dao.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | const ( 10 | UserOrderStateEnabled = 1 // 已启用 11 | UserOrderStateDisabled = 0 // 已禁用 12 | ) 13 | 14 | type UserOrderDAO dbs.DAO 15 | 16 | func NewUserOrderDAO() *UserOrderDAO { 17 | return dbs.NewDAO(&UserOrderDAO{ 18 | DAOObject: dbs.DAOObject{ 19 | DB: Tea.Env, 20 | Table: "edgeUserOrders", 21 | Model: new(UserOrder), 22 | PkName: "id", 23 | }, 24 | }).(*UserOrderDAO) 25 | } 26 | 27 | var SharedUserOrderDAO *UserOrderDAO 28 | 29 | func init() { 30 | dbs.OnReady(func() { 31 | SharedUserOrderDAO = NewUserOrderDAO() 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_dao_test.go: -------------------------------------------------------------------------------- 1 | package accounts_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_log_dao.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type UserOrderLogDAO dbs.DAO 10 | 11 | func NewUserOrderLogDAO() *UserOrderLogDAO { 12 | return dbs.NewDAO(&UserOrderLogDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeUserOrderLogs", 16 | Model: new(UserOrderLog), 17 | PkName: "id", 18 | }, 19 | }).(*UserOrderLogDAO) 20 | } 21 | 22 | var SharedUserOrderLogDAO *UserOrderLogDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedUserOrderLogDAO = NewUserOrderLogDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_log_dao_test.go: -------------------------------------------------------------------------------- 1 | package accounts_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/accounts/user_order_model_ext.go: -------------------------------------------------------------------------------- 1 | package accounts 2 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_authentication_dao_test.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_authentication_model_ext.go: -------------------------------------------------------------------------------- 1 | package acme 2 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_provider_account_dao_test.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_provider_account_model_ext.go: -------------------------------------------------------------------------------- 1 | package acme 2 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_task_dao_test.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_task_log_dao_test.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_task_log_model.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | // ACMETaskLog ACME任务运行日志 4 | type ACMETaskLog struct { 5 | Id uint64 `field:"id"` // ID 6 | TaskId uint64 `field:"taskId"` // 任务ID 7 | IsOk bool `field:"isOk"` // 是否成功 8 | Error string `field:"error"` // 错误信息 9 | CreatedAt uint64 `field:"createdAt"` // 运行时间 10 | } 11 | 12 | type ACMETaskLogOperator struct { 13 | Id interface{} // ID 14 | TaskId interface{} // 任务ID 15 | IsOk interface{} // 是否成功 16 | Error interface{} // 错误信息 17 | CreatedAt interface{} // 运行时间 18 | } 19 | 20 | func NewACMETaskLogOperator() *ACMETaskLogOperator { 21 | return &ACMETaskLogOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_task_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package acme 2 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_task_model_ext.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/logs" 6 | ) 7 | 8 | // DecodeDomains 将域名解析成字符串数组 9 | func (this *ACMETask) DecodeDomains() []string { 10 | if len(this.Domains) == 0 { 11 | return nil 12 | } 13 | result := []string{} 14 | err := json.Unmarshal(this.Domains, &result) 15 | if err != nil { 16 | logs.Error(err) 17 | return nil 18 | } 19 | return result 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_user_dao_test.go: -------------------------------------------------------------------------------- 1 | package acme 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/acme/acme_user_model_ext.go: -------------------------------------------------------------------------------- 1 | package acme 2 | -------------------------------------------------------------------------------- /internal/db/models/ad_network_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ad_network_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ADNetwork 高防线路 4 | type ADNetwork struct { 5 | Id uint32 `field:"id"` // ID 6 | IsOn bool `field:"isOn"` // 是否启用 7 | Name string `field:"name"` // 名称 8 | Description string `field:"description"` // 描述 9 | Order uint32 `field:"order"` // 排序 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type ADNetworkOperator struct { 14 | Id any // ID 15 | IsOn any // 是否启用 16 | Name any // 名称 17 | Description any // 描述 18 | Order any // 排序 19 | State any // 状态 20 | } 21 | 22 | func NewADNetworkOperator() *ADNetworkOperator { 23 | return &ADNetworkOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/ad_network_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_instance_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_instance_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_period_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_period_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ADPackagePeriod 高防产品有效期 4 | type ADPackagePeriod struct { 5 | Id uint32 `field:"id"` // ID 6 | IsOn bool `field:"isOn"` // 是否启用 7 | Count uint32 `field:"count"` // 数量 8 | Unit string `field:"unit"` // 单位:month, year 9 | Months uint32 `field:"months"` // 月数 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type ADPackagePeriodOperator struct { 14 | Id any // ID 15 | IsOn any // 是否启用 16 | Count any // 数量 17 | Unit any // 单位:month, year 18 | Months any // 月数 19 | State any // 状态 20 | } 21 | 22 | func NewADPackagePeriodOperator() *ADPackagePeriodOperator { 23 | return &ADPackagePeriodOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_period_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_price_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type ADPackagePriceDAO dbs.DAO 10 | 11 | func NewADPackagePriceDAO() *ADPackagePriceDAO { 12 | return dbs.NewDAO(&ADPackagePriceDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeADPackagePrices", 16 | Model: new(ADPackagePrice), 17 | PkName: "id", 18 | }, 19 | }).(*ADPackagePriceDAO) 20 | } 21 | 22 | var SharedADPackagePriceDAO *ADPackagePriceDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedADPackagePriceDAO = NewADPackagePriceDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_price_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_price_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ADPackagePrice 流量包价格 4 | type ADPackagePrice struct { 5 | Id uint32 `field:"id"` // ID 6 | PackageId uint32 `field:"packageId"` // 高防产品ID 7 | PeriodId uint32 `field:"periodId"` // 有效期ID 8 | Price float64 `field:"price"` // 价格 9 | DiscountPrice float64 `field:"discountPrice"` // 折后价格 10 | } 11 | 12 | type ADPackagePriceOperator struct { 13 | Id any // ID 14 | PackageId any // 高防产品ID 15 | PeriodId any // 有效期ID 16 | Price any // 价格 17 | DiscountPrice any // 折后价格 18 | } 19 | 20 | func NewADPackagePriceOperator() *ADPackagePriceOperator { 21 | return &ADPackagePriceOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/ad_package_price_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/admin_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/api_access_token_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/api_access_token_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/api_method_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "github.com/iwind/TeaGo/dbs" 7 | "testing" 8 | ) 9 | 10 | func TestAPIMethodStatDAO_CreateStat(t *testing.T) { 11 | var dao = NewAPIMethodStatDAO() 12 | var tx *dbs.Tx 13 | 14 | err := dao.CreateStat(tx, "/pb.Hello/World", "tag", 1.123) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/api_method_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/api_token_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/api_token_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // API令牌管理 4 | type ApiToken struct { 5 | Id uint32 `field:"id"` // ID 6 | NodeId string `field:"nodeId"` // 节点ID 7 | Secret string `field:"secret"` // 节点密钥 8 | Role string `field:"role"` // 节点角色 9 | State uint8 `field:"state"` // 状态 10 | } 11 | 12 | type ApiTokenOperator struct { 13 | Id interface{} // ID 14 | NodeId interface{} // 节点ID 15 | Secret interface{} // 节点密钥 16 | Role interface{} // 节点角色 17 | State interface{} // 状态 18 | } 19 | 20 | func NewApiTokenOperator() *ApiTokenOperator { 21 | return &ApiTokenOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_key_dao.go: -------------------------------------------------------------------------------- 1 | package authority 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type AuthorityKeyDAO dbs.DAO 10 | 11 | func NewAuthorityKeyDAO() *AuthorityKeyDAO { 12 | return dbs.NewDAO(&AuthorityKeyDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeAuthorityKeys", 16 | Model: new(AuthorityKey), 17 | PkName: "id", 18 | }, 19 | }).(*AuthorityKeyDAO) 20 | } 21 | 22 | var SharedAuthorityKeyDAO *AuthorityKeyDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedAuthorityKeyDAO = NewAuthorityKeyDAO() 27 | 28 | // 初始化IsPlus值 29 | _, _ = SharedAuthorityKeyDAO.IsPlus(nil) 30 | }) 31 | } 32 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_key_dao_community.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | //go:build !plus 3 | // +build !plus 4 | 5 | package authority 6 | 7 | import ( 8 | "github.com/iwind/TeaGo/dbs" 9 | ) 10 | 11 | // IsPlus 判断是否为企业版 12 | func (this *AuthorityKeyDAO) IsPlus(tx *dbs.Tx) (bool, error) { 13 | return false, nil 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_key_dao_test.go: -------------------------------------------------------------------------------- 1 | package authority_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_key_model_ext.go: -------------------------------------------------------------------------------- 1 | package authority 2 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_node_dao_test.go: -------------------------------------------------------------------------------- 1 | package authority 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/authority/authority_node_model_ext.go: -------------------------------------------------------------------------------- 1 | package authority 2 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_dao_test.go: -------------------------------------------------------------------------------- 1 | package clients_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_ip_dao_test.go: -------------------------------------------------------------------------------- 1 | package clients_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models/clients" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "testing" 8 | ) 9 | 10 | func TestClientAgentIPDAO_CreateIP(t *testing.T) { 11 | var dao = clients.NewClientAgentIPDAO() 12 | err := dao.CreateIP(nil, 1, "127.0.0.1", "") 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_ip_model.go: -------------------------------------------------------------------------------- 1 | package clients 2 | 3 | // ClientAgentIP Agent IP 4 | type ClientAgentIP struct { 5 | Id uint64 `field:"id"` // ID 6 | AgentId uint32 `field:"agentId"` // Agent ID 7 | IP string `field:"ip"` // IP地址 8 | Ptr string `field:"ptr"` // PTR值 9 | } 10 | 11 | type ClientAgentIPOperator struct { 12 | Id any // ID 13 | AgentId any // Agent ID 14 | IP any // IP地址 15 | Ptr any // PTR值 16 | } 17 | 18 | func NewClientAgentIPOperator() *ClientAgentIPOperator { 19 | return &ClientAgentIPOperator{} 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_ip_model_ext.go: -------------------------------------------------------------------------------- 1 | package clients 2 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_model.go: -------------------------------------------------------------------------------- 1 | package clients 2 | 3 | // ClientAgent Agent库 4 | type ClientAgent struct { 5 | Id uint32 `field:"id"` // ID 6 | Name string `field:"name"` // 名称 7 | Code string `field:"code"` // 代号 8 | Description string `field:"description"` // 介绍 9 | Order uint32 `field:"order"` // 排序 10 | CountIPs uint32 `field:"countIPs"` // IP数量 11 | } 12 | 13 | type ClientAgentOperator struct { 14 | Id any // ID 15 | Name any // 名称 16 | Code any // 代号 17 | Description any // 介绍 18 | Order any // 排序 19 | CountIPs any // IP数量 20 | } 21 | 22 | func NewClientAgentOperator() *ClientAgentOperator { 23 | return &ClientAgentOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_agent_model_ext.go: -------------------------------------------------------------------------------- 1 | package clients 2 | 3 | // NSRouteCode NS线路代号 4 | func (this *ClientAgent) NSRouteCode() string { 5 | return "agent:" + this.Code 6 | } 7 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_browser_model.go: -------------------------------------------------------------------------------- 1 | package clients 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // ClientBrowser 终端浏览器信息 6 | type ClientBrowser struct { 7 | Id uint64 `field:"id"` // ID 8 | Name string `field:"name"` // 浏览器名称 9 | Codes dbs.JSON `field:"codes"` // 代号 10 | CreatedDay string `field:"createdDay"` // 创建日期YYYYMMDD 11 | State uint8 `field:"state"` // 状态 12 | } 13 | 14 | type ClientBrowserOperator struct { 15 | Id any // ID 16 | Name any // 浏览器名称 17 | Codes any // 代号 18 | CreatedDay any // 创建日期YYYYMMDD 19 | State any // 状态 20 | } 21 | 22 | func NewClientBrowserOperator() *ClientBrowserOperator { 23 | return &ClientBrowserOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_browser_model_ext.go: -------------------------------------------------------------------------------- 1 | package clients 2 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_system_dao_test.go: -------------------------------------------------------------------------------- 1 | package clients_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models/clients" 5 | _ "github.com/go-sql-driver/mysql" 6 | "testing" 7 | ) 8 | 9 | func TestClientSystemDAO_CreateSystemIfNotExists(t *testing.T) { 10 | var dao = clients.NewClientSystemDAO() 11 | { 12 | err := dao.CreateSystemIfNotExists(nil, "Mac OS X") 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | } 17 | { 18 | err := dao.CreateSystemIfNotExists(nil, "Mac OS X 2") 19 | if err != nil { 20 | t.Fatal(err) 21 | } 22 | } 23 | } 24 | 25 | func TestClientSystemDAO_Clean(t *testing.T) { 26 | var dao = clients.NewClientSystemDAO() 27 | err := dao.Clean(nil, 30) 28 | if err != nil { 29 | t.Fatal(err) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_system_model.go: -------------------------------------------------------------------------------- 1 | package clients 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // ClientSystem 终端操作系统信息 6 | type ClientSystem struct { 7 | Id uint64 `field:"id"` // ID 8 | Name string `field:"name"` // 系统名称 9 | Codes dbs.JSON `field:"codes"` // 代号 10 | CreatedDay string `field:"createdDay"` // 创建日期YYYYMMDD 11 | State uint8 `field:"state"` // 状态 12 | } 13 | 14 | type ClientSystemOperator struct { 15 | Id any // ID 16 | Name any // 系统名称 17 | Codes any // 代号 18 | CreatedDay any // 创建日期YYYYMMDD 19 | State any // 状态 20 | } 21 | 22 | func NewClientSystemOperator() *ClientSystemOperator { 23 | return &ClientSystemOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/clients/client_system_model_ext.go: -------------------------------------------------------------------------------- 1 | package clients 2 | -------------------------------------------------------------------------------- /internal/db/models/db_node_initializer_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import "github.com/iwind/TeaGo/dbs" 7 | 8 | var nsAccessLogDAOMapping = map[int64]any{} // dbNodeId => DAO 9 | 10 | func initAccessLogDAO(db *dbs.DB, node *DBNode) { 11 | } 12 | -------------------------------------------------------------------------------- /internal/db/models/db_node_initializer_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestDBNodeInitializer_loop(t *testing.T) { 8 | initializer := NewDBNodeInitializer() 9 | err := initializer.loop() 10 | if err != nil { 11 | t.Fatal(err) 12 | } 13 | t.Log(len(accessLogDBMapping), len(httpAccessLogDAOMapping)) 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/db_node_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "github.com/iwind/TeaGo/dbs" 6 | ) 7 | 8 | // 获取数据库配置 9 | func (this *DBNode) DBConfig() *dbs.DBConfig { 10 | dsn := this.Username + ":" + this.Password + "@tcp(" + this.Host + ":" + fmt.Sprintf("%d", this.Port) + ")/" + this.Database + "?charset=utf8mb4&timeout=10s" 11 | 12 | return &dbs.DBConfig{ 13 | Driver: "mysql", 14 | Dsn: dsn, 15 | Prefix: "edge", 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/dns/dns_provider_dao_test.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/dns/dns_provider_model_ext.go: -------------------------------------------------------------------------------- 1 | package dns 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/maps" 6 | ) 7 | 8 | // DecodeAPIParams 获取API参数 9 | func (this *DNSProvider) DecodeAPIParams() (maps.Map, error) { 10 | if len(this.ApiParams) == 0 { 11 | return maps.Map{}, nil 12 | } 13 | result := maps.Map{} 14 | err := json.Unmarshal(this.ApiParams, &result) 15 | return result, err 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/dns/dns_task_dao_test.go: -------------------------------------------------------------------------------- 1 | package dns_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | "time" 10 | ) 11 | 12 | func TestDNSTaskDAO_CreateDNSTask(t *testing.T) { 13 | dbs.NotifyReady() 14 | err := dns.SharedDNSTaskDAO.CreateDNSTask(nil, 1, 2, 3, 0, "cdn", "taskType") 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | 21 | func TestDNSTaskDAO_UpdateClusterDNSTasksDone(t *testing.T) { 22 | var dao = dns.NewDNSTaskDAO() 23 | var tx *dbs.Tx 24 | err := dao.UpdateClusterDNSTasksDone(tx, 46, time.Now().UnixNano()) 25 | if err != nil { 26 | t.Fatal(err) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/dns/dns_task_model_ext.go: -------------------------------------------------------------------------------- 1 | package dns 2 | -------------------------------------------------------------------------------- /internal/db/models/errors.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/TeaOSLab/EdgeAPI/internal/errors" 4 | 5 | var ErrNotFound = errors.New("resource not found") 6 | -------------------------------------------------------------------------------- /internal/db/models/file_chunk_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/file_chunk_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // 4 | type FileChunk struct { 5 | Id uint32 `field:"id"` // ID 6 | FileId uint32 `field:"fileId"` // 文件ID 7 | Data []byte `field:"data"` // 分块内容 8 | } 9 | 10 | type FileChunkOperator struct { 11 | Id interface{} // ID 12 | FileId interface{} // 文件ID 13 | Data interface{} // 分块内容 14 | } 15 | 16 | func NewFileChunkOperator() *FileChunkOperator { 17 | return &FileChunkOperator{} 18 | } 19 | -------------------------------------------------------------------------------- /internal/db/models/file_chunk_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/file_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/file_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_browser_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_browser_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // FormalClientBrowser 终端浏览器信息 6 | type FormalClientBrowser struct { 7 | Id uint32 `field:"id"` // ID 8 | Name string `field:"name"` // 浏览器名称 9 | Codes dbs.JSON `field:"codes"` // 代号 10 | DataId string `field:"dataId"` // 数据ID 11 | State uint8 `field:"state"` // 状态 12 | } 13 | 14 | type FormalClientBrowserOperator struct { 15 | Id any // ID 16 | Name any // 浏览器名称 17 | Codes any // 代号 18 | DataId any // 数据ID 19 | State any // 状态 20 | } 21 | 22 | func NewFormalClientBrowserOperator() *FormalClientBrowserOperator { 23 | return &FormalClientBrowserOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_browser_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | ) 7 | 8 | // DecodeCodes 解析代号 9 | func (this *FormalClientBrowser) DecodeCodes() []string { 10 | if IsNull(this.Codes) { 11 | return nil 12 | } 13 | 14 | var result = []string{} 15 | err := json.Unmarshal(this.Codes, &result) 16 | if err != nil { 17 | remotelogs.Error("FormalClientBrowser.DecodeCodes", err.Error()) 18 | } 19 | 20 | return result 21 | } 22 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_system_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_system_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // FormalClientSystem 终端操作系统信息 6 | type FormalClientSystem struct { 7 | Id uint32 `field:"id"` // ID 8 | Name string `field:"name"` // 系统名称 9 | Codes dbs.JSON `field:"codes"` // 代号 10 | State uint8 `field:"state"` // 状态 11 | DataId string `field:"dataId"` // 数据ID 12 | } 13 | 14 | type FormalClientSystemOperator struct { 15 | Id any // ID 16 | Name any // 系统名称 17 | Codes any // 代号 18 | State any // 状态 19 | DataId any // 数据ID 20 | } 21 | 22 | func NewFormalClientSystemOperator() *FormalClientSystemOperator { 23 | return &FormalClientSystemOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/formal_client_system_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | ) 7 | 8 | // DecodeCodes 解析代号 9 | func (this *FormalClientSystem) DecodeCodes() []string { 10 | if IsNull(this.Codes) { 11 | return nil 12 | } 13 | 14 | var result = []string{} 15 | err := json.Unmarshal(this.Codes, &result) 16 | if err != nil { 17 | remotelogs.Error("FormalClientSystem.DecodeCodes", err.Error()) 18 | } 19 | 20 | return result 21 | } 22 | -------------------------------------------------------------------------------- /internal/db/models/http_access_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 6 | ) 7 | 8 | // ToPB 转换成PB对象 9 | func (this *HTTPAccessLog) ToPB() (*pb.HTTPAccessLog, error) { 10 | p := &pb.HTTPAccessLog{} 11 | err := json.Unmarshal(this.Content, p) 12 | if err != nil { 13 | return nil, err 14 | } 15 | p.RequestId = this.RequestId 16 | p.RequestBody = this.RequestBody 17 | return p, nil 18 | } 19 | -------------------------------------------------------------------------------- /internal/db/models/http_access_log_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_access_log_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_auth_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/http_auth_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_brotli_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/http_brotli_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_cache_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_cache_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_cache_task_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | ) 10 | 11 | func TestHTTPCacheTaskDAO_Clean(t *testing.T) { 12 | dbs.NotifyReady() 13 | 14 | err := models.SharedHTTPCacheTaskDAO.CleanDays(nil, 30) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/http_cache_task_key_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | // DecodeNodes 解析已完成节点信息 6 | func (this *HTTPCacheTaskKey) DecodeNodes() map[string]bool { 7 | var result = map[string]bool{} 8 | var nodesJSON = this.Nodes 9 | if IsNull(nodesJSON) { 10 | return result 11 | } 12 | 13 | err := json.Unmarshal(nodesJSON, &result) 14 | if err != nil { 15 | // ignore error 16 | return result 17 | } 18 | 19 | return result 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/http_cache_task_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_deflate_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/http_deflate_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_fastcgi_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/http_fastcgi_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestHTTPFirewallRuleGroupDAO_FindRuleGroupIdWithRuleSetId(t *testing.T) { 10 | dbs.NotifyReady() 11 | 12 | var tx *dbs.Tx 13 | groupId, err := SharedHTTPFirewallRuleGroupDAO.FindRuleGroupIdWithRuleSetId(tx, 22) 14 | if err != nil { 15 | t.Fatal(err) 16 | } 17 | t.Log("groupId:", groupId) 18 | } -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_set_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestHTTPFirewallRuleSetDAO_FindRuleSetIdWithRuleId(t *testing.T) { 11 | dbs.NotifyReady() 12 | 13 | var tx *dbs.Tx 14 | before := time.Now() 15 | setId, err := SharedHTTPFirewallRuleSetDAO.FindEnabledRuleSetIdWithRuleId(tx, 20) 16 | if err != nil { 17 | t.Fatal(err) 18 | } 19 | t.Log("setId:", setId) 20 | t.Log(time.Since(before).Seconds()*1000, "ms") 21 | } 22 | -------------------------------------------------------------------------------- /internal/db/models/http_firewall_rule_set_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_gzip_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_gzip_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" 6 | ) 7 | 8 | // DecodeMinLength 解析最小长度 9 | func (this *HTTPGzip) DecodeMinLength() (*shared.SizeCapacity, error) { 10 | if len(this.MinLength) == 0 { 11 | return nil, nil 12 | } 13 | capacity := &shared.SizeCapacity{} 14 | err := json.Unmarshal(this.MinLength, capacity) 15 | return capacity, err 16 | } 17 | 18 | // DecodeMaxLength 解析最大长度 19 | func (this *HTTPGzip) DecodeMaxLength() (*shared.SizeCapacity, error) { 20 | if len(this.MaxLength) == 0 { 21 | return nil, nil 22 | } 23 | capacity := &shared.SizeCapacity{} 24 | err := json.Unmarshal(this.MaxLength, capacity) 25 | return capacity, err 26 | } 27 | -------------------------------------------------------------------------------- /internal/db/models/http_header_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_header_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_header_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestHTTPHeaderPolicyDAO_FindHeaderPolicyIdWithHeaderId(t *testing.T) { 10 | dbs.NotifyReady() 11 | var tx *dbs.Tx 12 | policyId, err := SharedHTTPHeaderPolicyDAO.FindHeaderPolicyIdWithHeaderId(tx, 15) 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log("policyId:", policyId) 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/http_header_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_location_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_location_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_page_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_page_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_rewrite_rule_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_rewrite_rule_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_web_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/http_websocket_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/http_websocket_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/init.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/iwind/TeaGo/bootstrap" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/ip_item_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ComposeValue 组合原始值 4 | func (this *IPItem) ComposeValue() string { 5 | if len(this.Value) > 0 { 6 | return this.Value 7 | } 8 | 9 | // 兼容以往版本 10 | if len(this.IpTo) > 0 { 11 | return this.IpFrom + "-" + this.IpTo 12 | } 13 | 14 | return this.IpFrom 15 | } 16 | -------------------------------------------------------------------------------- /internal/db/models/ip_library_artifact_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ip_library_artifact_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ip_library_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/ip_library_file_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | ) 10 | 11 | func TestIPLibraryFileDAO_GenerateIPLibrary(t *testing.T) { 12 | dbs.NotifyReady() 13 | 14 | var tx *dbs.Tx 15 | err := models.SharedIPLibraryFileDAO.GenerateIPLibrary(tx, 4) 16 | if err != nil { 17 | t.Fatal(err) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/ip_library_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ip_list_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/latest_item_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/latest_item_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // LatestItem 最近的条目统计 4 | type LatestItem struct { 5 | Id uint64 `field:"id"` // ID 6 | ItemType string `field:"itemType"` // Item类型 7 | ItemId uint64 `field:"itemId"` // itemID 8 | Count uint64 `field:"count"` // 数量 9 | UpdatedAt uint64 `field:"updatedAt"` // 更新时间 10 | } 11 | 12 | type LatestItemOperator struct { 13 | Id interface{} // ID 14 | ItemType interface{} // Item类型 15 | ItemId interface{} // itemID 16 | Count interface{} // 数量 17 | UpdatedAt interface{} // 更新时间 18 | } 19 | 20 | func NewLatestItemOperator() *LatestItemOperator { 21 | return &LatestItemOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/latest_item_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/log_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestLogDAO_SumLogsSize(t *testing.T) { 10 | dbs.NotifyReady() 11 | 12 | size, err := SharedLogDAO.SumLogsSize() 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log("size:", size) 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/login_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/login_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/login_session_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "time" 4 | 5 | func (this *LoginSession) IsAvailable() bool { 6 | return this.ExpiresAt == 0 || int64(this.ExpiresAt) > time.Now().Unix() 7 | } 8 | -------------------------------------------------------------------------------- /internal/db/models/message_media_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/message_media_instance_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/message_media_instance_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_media_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_receiver_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_recipient_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "github.com/iwind/TeaGo/dbs" 7 | "testing" 8 | ) 9 | 10 | func TestMessageRecipientDAO_FindAllEnabledAndOnRecipientIdsWithGroup(t *testing.T) { 11 | dbs.NotifyReady() 12 | recipientIds, err := SharedMessageRecipientDAO.FindAllEnabledAndOnRecipientIdsWithGroup(nil, 4) 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log(recipientIds) 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/message_recipient_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/message_recipient_group_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // MessageRecipientGroup 消息接收人分组 4 | type MessageRecipientGroup struct { 5 | Id uint32 `field:"id"` // ID 6 | Name string `field:"name"` // 分组名 7 | Order uint32 `field:"order"` // 排序 8 | IsOn bool `field:"isOn"` // 是否启用 9 | State uint8 `field:"state"` // 状态 10 | } 11 | 12 | type MessageRecipientGroupOperator struct { 13 | Id interface{} // ID 14 | Name interface{} // 分组名 15 | Order interface{} // 排序 16 | IsOn interface{} // 是否启用 17 | State interface{} // 状态 18 | } 19 | 20 | func NewMessageRecipientGroupOperator() *MessageRecipientGroupOperator { 21 | return &MessageRecipientGroupOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/message_recipient_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_recipient_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/logs" 6 | ) 7 | 8 | // DecodeGroupIds 解析分组ID 9 | func (this *MessageRecipient) DecodeGroupIds() []int64 { 10 | if len(this.GroupIds) == 0 { 11 | return []int64{} 12 | } 13 | result := []int64{} 14 | err := json.Unmarshal(this.GroupIds, &result) 15 | if err != nil { 16 | logs.Println("MessageRecipient.DecodeGroupIds(): " + err.Error()) 17 | // 不阻断执行 18 | } 19 | return result 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/message_task_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import ( 7 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 8 | "github.com/iwind/TeaGo/dbs" 9 | ) 10 | 11 | // CreateMessageTasks 从集群、节点或者服务中创建任务 12 | func (this *MessageTaskDAO) CreateMessageTasks(tx *dbs.Tx, role nodeconfigs.NodeRole, clusterId int64, nodeId int64, serverId int64, messageType MessageType, subject string, body string) error { 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/message_task_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | ) 10 | 11 | func TestMessageTaskDAO_CleanExpiredMessageTasks(t *testing.T) { 12 | var dao = models.NewMessageTaskDAO() 13 | var tx *dbs.Tx 14 | err := dao.CleanExpiredMessageTasks(tx, 30) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /internal/db/models/message_task_log_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/message_task_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/message_task_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/metric_chart_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/metric_chart_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | func (this *MetricChart) DecodeIgnoredKeys() []string { 6 | if len(this.IgnoredKeys) == 0 { 7 | return []string{} 8 | } 9 | 10 | var result = []string{} 11 | err := json.Unmarshal(this.IgnoredKeys, &result) 12 | if err != nil { 13 | // 这里忽略错误 14 | return result 15 | } 16 | return result 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/metric_item_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "testing" 8 | ) 9 | 10 | func TestMetricStatDAO_Clean(t *testing.T) { 11 | var dao = models.NewMetricStatDAO() 12 | t.Log(dao.Clean(nil)) 13 | } 14 | -------------------------------------------------------------------------------- /internal/db/models/metric_item_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | ) 6 | 7 | // DecodeKeys 解析Key 8 | func (this *MetricItem) DecodeKeys() []string { 9 | var result []string 10 | if len(this.Keys) > 0 { 11 | _ = json.Unmarshal(this.Keys, &result) 12 | } 13 | return result 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/metric_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | // DecodeKeys 解析Key 6 | func (this *MetricStat) DecodeKeys() []string { 7 | var result []string 8 | if len(this.Keys) > 0 { 9 | _ = json.Unmarshal(this.Keys, &result) 10 | } 11 | return result 12 | } 13 | -------------------------------------------------------------------------------- /internal/db/models/metric_sum_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "github.com/iwind/TeaGo/dbs" 8 | timeutil "github.com/iwind/TeaGo/utils/time" 9 | "testing" 10 | ) 11 | 12 | func TestMetricSumStatDAO_FindNodeSum(t *testing.T) { 13 | t.Log(models.NewMetricSumStatDAO().FindNodeSum(nil, 46, timeutil.Format("Ymd"), 1, 1)) 14 | } 15 | 16 | func TestMetricSumStatDAO_Clean(t *testing.T) { 17 | dbs.NotifyReady() 18 | 19 | err := models.NewMetricSumStatDAO().Clean(nil) 20 | if err != nil { 21 | t.Fatal(err) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /internal/db/models/metric_sum_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_domain_dao.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | const ( 10 | NSDomainStateEnabled = 1 // 已启用 11 | NSDomainStateDisabled = 0 // 已禁用 12 | ) 13 | 14 | type NSDomainDAO dbs.DAO 15 | 16 | func NewNSDomainDAO() *NSDomainDAO { 17 | return dbs.NewDAO(&NSDomainDAO{ 18 | DAOObject: dbs.DAOObject{ 19 | DB: Tea.Env, 20 | Table: "edgeNSDomains", 21 | Model: new(NSDomain), 22 | PkName: "id", 23 | }, 24 | }).(*NSDomainDAO) 25 | } 26 | 27 | var SharedNSDomainDAO *NSDomainDAO 28 | 29 | func init() { 30 | dbs.OnReady(func() { 31 | SharedNSDomainDAO = NewNSDomainDAO() 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_domain_dao_test.go: -------------------------------------------------------------------------------- 1 | package nameservers_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_domain_group_model.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | 3 | // NSDomainGroup 域名分组 4 | type NSDomainGroup struct { 5 | Id uint64 `field:"id"` // ID 6 | UserId uint64 `field:"userId"` // 用户ID 7 | Name string `field:"name"` // 分组名称 8 | IsOn bool `field:"isOn"` // 是否启用 9 | Order uint32 `field:"order"` // 排序 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type NSDomainGroupOperator struct { 14 | Id interface{} // ID 15 | UserId interface{} // 用户ID 16 | Name interface{} // 分组名称 17 | IsOn interface{} // 是否启用 18 | Order interface{} // 排序 19 | State interface{} // 状态 20 | } 21 | 22 | func NewNSDomainGroupOperator() *NSDomainGroupOperator { 23 | return &NSDomainGroupOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_domain_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_domain_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 6 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 7 | ) 8 | 9 | func (this *NSDomain) DecodeGroupIds() []int64 { 10 | if models.IsNull(this.GroupIds) { 11 | return nil 12 | } 13 | 14 | var result = []int64{} 15 | err := json.Unmarshal(this.GroupIds, &result) 16 | if err != nil { 17 | remotelogs.Error("NSDomain", "DecodeGroupIds:"+err.Error()) 18 | } 19 | return result 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_key_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_plan_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_question_option_model.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // NSQuestionOption DNS请求选项 6 | type NSQuestionOption struct { 7 | Id uint64 `field:"id"` // ID 8 | Name string `field:"name"` // 选项名 9 | Values dbs.JSON `field:"values"` // 选项值 10 | CreatedAt uint64 `field:"createdAt"` // 创建时间 11 | } 12 | 13 | type NSQuestionOptionOperator struct { 14 | Id interface{} // ID 15 | Name interface{} // 选项名 16 | Values interface{} // 选项值 17 | CreatedAt interface{} // 创建时间 18 | } 19 | 20 | func NewNSQuestionOptionOperator() *NSQuestionOptionOperator { 21 | return &NSQuestionOptionOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_question_option_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_record_dao_test.go: -------------------------------------------------------------------------------- 1 | package nameservers_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_record_hourly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_record_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/types" 6 | ) 7 | 8 | func (this *NSRecord) DecodeRouteIds() []string { 9 | var routeIds = []string{} 10 | if len(this.RouteIds) > 0 { 11 | err := json.Unmarshal(this.RouteIds, &routeIds) 12 | if err != nil { 13 | // 检查是否有旧的数据 14 | var oldRouteIds = []int64{} 15 | err = json.Unmarshal(this.RouteIds, &oldRouteIds) 16 | if err != nil { 17 | return []string{} 18 | } 19 | routeIds = []string{} 20 | for _, routeId := range oldRouteIds { 21 | routeIds = append(routeIds, "id:"+types.String(routeId)) 22 | } 23 | } 24 | } 25 | return routeIds 26 | } 27 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_route_category_dao_test.go: -------------------------------------------------------------------------------- 1 | package nameservers_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_route_category_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_route_dao_test.go: -------------------------------------------------------------------------------- 1 | package nameservers_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_route_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_user_plan_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/nameservers/ns_zone_model_ext.go: -------------------------------------------------------------------------------- 1 | package nameservers 2 | -------------------------------------------------------------------------------- /internal/db/models/node_action_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_action_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestNodeClusterDAO_DisableNodeCluster(t *testing.T) { 10 | dbs.NotifyReady() 11 | 12 | err := SharedNodeClusterDAO.DisableNodeCluster(nil, 46) 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log("ok") 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_firewall_action_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_firewall_action_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/maps" 6 | ) 7 | 8 | // DecodeParams 解析参数 9 | func (this *NodeClusterFirewallAction) DecodeParams() (maps.Map, error) { 10 | if IsNotNull(this.Params) { 11 | params := maps.Map{} 12 | err := json.Unmarshal(this.Params, ¶ms) 13 | if err != nil { 14 | return nil, err 15 | } 16 | return params, nil 17 | } 18 | return maps.Map{}, nil 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_metric_item_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_metric_item_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // NodeClusterMetricItem 集群使用的指标 4 | type NodeClusterMetricItem struct { 5 | Id uint32 `field:"id"` // ID 6 | IsOn bool `field:"isOn"` // 是否启用 7 | ClusterId uint32 `field:"clusterId"` // 集群ID 8 | ItemId uint64 `field:"itemId"` // 指标ID 9 | State uint8 `field:"state"` // 是否启用 10 | } 11 | 12 | type NodeClusterMetricItemOperator struct { 13 | Id interface{} // ID 14 | IsOn interface{} // 是否启用 15 | ClusterId interface{} // 集群ID 16 | ItemId interface{} // 指标ID 17 | State interface{} // 是否启用 18 | } 19 | 20 | func NewNodeClusterMetricItemOperator() *NodeClusterMetricItemOperator { 21 | return &NodeClusterMetricItemOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/node_cluster_metric_item_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_grant_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/node_grant_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/node_group_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // 节点分组 4 | type NodeGroup struct { 5 | Id uint32 `field:"id"` // ID 6 | Name string `field:"name"` // 名称 7 | ClusterId uint32 `field:"clusterId"` // 集群ID 8 | Order uint32 `field:"order"` // 排序 9 | CreatedAt uint64 `field:"createdAt"` // 创建时间 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type NodeGroupOperator struct { 14 | Id interface{} // ID 15 | Name interface{} // 名称 16 | ClusterId interface{} // 集群ID 17 | Order interface{} // 排序 18 | CreatedAt interface{} // 创建时间 19 | State interface{} // 状态 20 | } 21 | 22 | func NewNodeGroupOperator() *NodeGroupOperator { 23 | return &NodeGroupOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/node_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_install_status.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // 节点安装状态 4 | type NodeInstallStatus struct { 5 | IsRunning bool `json:"isRunning"` // 是否在运行 6 | IsFinished bool `json:"isFinished"` // 是否已结束 7 | IsOk bool `json:"isOk"` // 是否正确安装 8 | Error string `json:"error"` // 错误信息 9 | ErrorCode string `json:"errorCode"` // 错误代号 10 | UpdatedAt int64 `json:"updatedAt"` // 更新时间,安装过程中需要每隔N秒钟更新这个状态,以便于让系统知道安装仍在进行中 11 | Steps []*NodeInstallStatusStep `json:"steps"` // 步骤 12 | } 13 | 14 | func NewNodeInstallStatus() *NodeInstallStatus { 15 | return &NodeInstallStatus{} 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/node_install_status_step.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type NodeInstallStatusStep struct { 4 | Name string `json:"name"` 5 | Description string `json:"description"` 6 | Percent int `json:"percent"` 7 | } 8 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_dao_community.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | //go:build !plus 3 | // +build !plus 4 | 5 | package models 6 | 7 | import ( 8 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 9 | "github.com/iwind/TeaGo/dbs" 10 | ) 11 | 12 | // FireThresholds 触发阈值 13 | func (this *NodeIPAddressDAO) FireThresholds(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64) error { 14 | return nil 15 | } 16 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_group_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // NodeIPAddressGroup IP地址分组 4 | type NodeIPAddressGroup struct { 5 | Id uint32 `field:"id"` // ID 6 | Name string `field:"name"` // 分组名 7 | Value string `field:"value"` // IP值 8 | } 9 | 10 | type NodeIPAddressGroupOperator struct { 11 | Id interface{} // ID 12 | Name interface{} // 分组名 13 | Value interface{} // IP值 14 | } 15 | 16 | func NewNodeIPAddressGroupOperator() *NodeIPAddressGroupOperator { 17 | return &NodeIPAddressGroupOperator{} 18 | } 19 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_log_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 5 | _ "github.com/go-sql-driver/mysql" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "testing" 8 | ) 9 | 10 | func TestNodeIPAddressDAO_FindFirstNodeAccessIPAddress(t *testing.T) { 11 | var dao = NewNodeIPAddressDAO() 12 | t.Log(dao.FindFirstNodeAccessIPAddress(nil, 48, true, nodeconfigs.NodeRoleNode)) 13 | t.Log(dao.FindFirstNodeAccessIPAddressId(nil, 48, true, nodeconfigs.NodeRoleNode)) 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_ip_address_threshold_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_log_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import ( 7 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 8 | "github.com/iwind/TeaGo/dbs" 9 | ) 10 | 11 | func (this *NodeLogDAO) deleteNodeLogsWithCluster(tx *dbs.Tx, role nodeconfigs.NodeRole, clusterId int64) error { 12 | return nil 13 | } -------------------------------------------------------------------------------- /internal/db/models/node_log_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/node_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_login_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestNodeLoginDAO_FindFrequentPorts(t *testing.T) { 10 | dbs.NotifyReady() 11 | 12 | ports, err := SharedNodeLoginDAO.FindFrequentPorts(nil) 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log(ports) 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/node_login_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | ) 7 | 8 | // DecodeSSHParams 解析SSH登录参数 9 | func (this *NodeLogin) DecodeSSHParams() (*NodeLoginSSHParams, error) { 10 | if this.Type != NodeLoginTypeSSH { 11 | return nil, errors.New("invalid login type '" + this.Type + "'") 12 | } 13 | 14 | if len(this.Params) == 0 { 15 | return nil, errors.New("'params' should not be empty") 16 | } 17 | 18 | params := &NodeLoginSSHParams{} 19 | err := json.Unmarshal(this.Params, params) 20 | if err != nil { 21 | return nil, err 22 | } 23 | 24 | return params, nil 25 | } 26 | -------------------------------------------------------------------------------- /internal/db/models/node_login_params_ssh.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type NodeLoginSSHParams struct { 4 | GrantId int64 `json:"grantId"` 5 | Host string `json:"host"` 6 | Port int `json:"port"` 7 | } 8 | -------------------------------------------------------------------------------- /internal/db/models/node_model_ext_schdule.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | // HasScheduleSettings 检查是否设置了调度 7 | func (this *Node) HasScheduleSettings() bool { 8 | return false 9 | } -------------------------------------------------------------------------------- /internal/db/models/node_price_item_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_region_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/node_region_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | func (this *NodeRegion) DecodePriceMap() map[int64]float64 { 6 | var m = map[int64]float64{} 7 | if len(this.Prices) == 0 { 8 | return m 9 | } 10 | 11 | err := json.Unmarshal(this.Prices, &m) 12 | if err != nil { 13 | // 忽略错误 14 | return m 15 | } 16 | 17 | return m 18 | } 19 | -------------------------------------------------------------------------------- /internal/db/models/node_task_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import "github.com/iwind/TeaGo/dbs" 7 | 8 | // ExtractNSClusterTask 分解NS节点集群任务 9 | func (this *NodeTaskDAO) ExtractNSClusterTask(tx *dbs.Tx, clusterId int64, taskType NodeTaskType) error { 10 | return nil 11 | } 12 | -------------------------------------------------------------------------------- /internal/db/models/node_task_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_threshold_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import "github.com/iwind/TeaGo/dbs" 7 | 8 | // FireNodeThreshold 触发相关阈值设置 9 | func (this *NodeThresholdDAO) FireNodeThreshold(tx *dbs.Tx, role string, nodeId int64, item string) error { 10 | // stub 11 | return nil 12 | } 13 | -------------------------------------------------------------------------------- /internal/db/models/node_threshold_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/node_threshold_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_traffic_daily_stat_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import ( 7 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 8 | "github.com/iwind/TeaGo/dbs" 9 | ) 10 | 11 | // 增加日统计Hook 12 | func (this *NodeTrafficDailyStatDAO) increaseDailyStatHook(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64) error { 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/node_traffic_daily_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/node_traffic_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/node_value_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import ( 7 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 8 | "github.com/iwind/TeaGo/dbs" 9 | ) 10 | 11 | // 节点值变更Hook 12 | func (this *NodeValueDAO) nodeValueHook(tx *dbs.Tx, role nodeconfigs.NodeRole, nodeId int64, item nodeconfigs.NodeValueItem, valueJSON []byte) error { 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /internal/db/models/node_value_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/iwind/TeaGo/maps" 6 | ) 7 | 8 | func (this *NodeValue) DecodeMapValue() maps.Map { 9 | if len(this.Value) == 0 { 10 | return maps.Map{} 11 | } 12 | var m = maps.Map{} 13 | err := json.Unmarshal(this.Value, &m) 14 | if err != nil { 15 | // 忽略错误 16 | return m 17 | } 18 | return m 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/notify_levels.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | const ( 4 | LevelDebug = "debug" 5 | LevelInfo = "info" 6 | LevelWarning = "warning" 7 | LevelError = "error" 8 | LevelSuccess = "success" 9 | 10 | LogTypeAdmin = "admin" 11 | LogTypeUser = "user" 12 | ) 13 | -------------------------------------------------------------------------------- /internal/db/models/ns_access_log_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 6 | ) 7 | 8 | // ToPB 转换成PB对象 9 | func (this *NSAccessLog) ToPB() (*pb.NSAccessLog, error) { 10 | p := &pb.NSAccessLog{} 11 | err := json.Unmarshal(this.Content, p) 12 | if err != nil { 13 | return nil, err 14 | } 15 | p.RequestId = this.RequestId 16 | return p, nil 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/ns_cluster_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "github.com/iwind/TeaGo/dbs" 7 | "testing" 8 | ) 9 | 10 | 11 | func TestNSClusterDAO_DisableNodeCluster(t *testing.T) { 12 | dbs.NotifyReady() 13 | 14 | err := SharedNSClusterDAO.DisableNSCluster(nil, 7) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | -------------------------------------------------------------------------------- /internal/db/models/ns_node_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/ns_node_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/origin_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestOriginServerDAO_ComposeOriginConfig(t *testing.T) { 10 | var tx *dbs.Tx 11 | config, err := SharedOriginDAO.ComposeOriginConfig(tx, 1, nil, nil) 12 | if err != nil { 13 | t.Fatal(err) 14 | } 15 | t.Log(config) 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/plan_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/plan_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/posts/post_category_dao_test.go: -------------------------------------------------------------------------------- 1 | package posts_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/posts/post_category_model_ext.go: -------------------------------------------------------------------------------- 1 | package posts 2 | -------------------------------------------------------------------------------- /internal/db/models/posts/post_dao_test.go: -------------------------------------------------------------------------------- 1 | package posts_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/posts/post_model_ext.go: -------------------------------------------------------------------------------- 1 | package posts 2 | -------------------------------------------------------------------------------- /internal/db/models/provider_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/provider_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/regions/region_city_dao_test.go: -------------------------------------------------------------------------------- 1 | package regions 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/regions/region_provider_dao_test.go: -------------------------------------------------------------------------------- 1 | package regions 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/regions/region_town_dao_test.go: -------------------------------------------------------------------------------- 1 | package regions_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/regions/utils.go: -------------------------------------------------------------------------------- 1 | package regions 2 | 3 | import "sync" 4 | 5 | var SharedCacheLocker = sync.RWMutex{} 6 | -------------------------------------------------------------------------------- /internal/db/models/report_node_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/report_node_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/report_node_group_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ReportNodeGroup 监控终端区域 4 | type ReportNodeGroup struct { 5 | Id uint32 `field:"id"` // ID 6 | Name string `field:"name"` // 名称 7 | State uint8 `field:"state"` // 状态 8 | IsOn bool `field:"isOn"` // 是否启用 9 | } 10 | 11 | type ReportNodeGroupOperator struct { 12 | Id interface{} // ID 13 | Name interface{} // 名称 14 | State interface{} // 状态 15 | IsOn interface{} // 是否启用 16 | } 17 | 18 | func NewReportNodeGroupOperator() *ReportNodeGroupOperator { 19 | return &ReportNodeGroupOperator{} 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/report_node_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/report_node_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | ) 7 | 8 | func (this *ReportNode) DecodeAllowIPs() []string { 9 | var result = []string{} 10 | if len(this.AllowIPs) > 0 { 11 | err := json.Unmarshal(this.AllowIPs, &result) 12 | if err != nil { 13 | remotelogs.Error("ReportNode.DecodeGroupIds", err.Error()) 14 | } 15 | } 16 | return result 17 | } 18 | 19 | func (this *ReportNode) DecodeGroupIds() []int64 { 20 | var result = []int64{} 21 | if len(this.GroupIds) > 0 { 22 | err := json.Unmarshal(this.GroupIds, &result) 23 | if err != nil { 24 | remotelogs.Error("ReportNode.DecodeGroupIds", err.Error()) 25 | } 26 | } 27 | return result 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/report_result_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/report_result_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/reverse_proxy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestReverseProxyDAO_ComposeReverseProxyConfig(t *testing.T) { 10 | var tx *dbs.Tx 11 | config, err := SharedReverseProxyDAO.ComposeReverseProxyConfig(tx, 1, nil, nil) 12 | if err != nil { 13 | t.Fatal(err) 14 | } 15 | t.Log(config) 16 | } 17 | 18 | func TestReverseProxyDAO_FindReverseProxyContainsOriginId(t *testing.T) { 19 | dbs.NotifyReady() 20 | 21 | var tx *dbs.Tx 22 | reverseProxyId, err := SharedReverseProxyDAO.FindReverseProxyContainsOriginId(tx, 68) 23 | if err != nil { 24 | t.Fatal(err) 25 | } 26 | t.Log("reverseProxyId:", reverseProxyId) 27 | } 28 | -------------------------------------------------------------------------------- /internal/db/models/script_dao_plus_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/script_history_dao_plus_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/script_history_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // ScriptHistory 脚本历史记录 4 | type ScriptHistory struct { 5 | Id uint32 `field:"id"` // ID 6 | UserId uint64 `field:"userId"` // 用户ID 7 | ScriptId uint64 `field:"scriptId"` // 脚本ID 8 | Filename string `field:"filename"` // 文件名 9 | Code string `field:"code"` // 代码 10 | Version uint64 `field:"version"` // 版本号 11 | } 12 | 13 | type ScriptHistoryOperator struct { 14 | Id interface{} // ID 15 | UserId interface{} // 用户ID 16 | ScriptId interface{} // 脚本ID 17 | Filename interface{} // 文件名 18 | Code interface{} // 代码 19 | Version interface{} // 版本号 20 | } 21 | 22 | func NewScriptHistoryOperator() *ScriptHistoryOperator { 23 | return &ScriptHistoryOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/script_history_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/script_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/server_bandwidth_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/server_bill_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "github.com/iwind/TeaGo/dbs" 7 | timeutil "github.com/iwind/TeaGo/utils/time" 8 | "testing" 9 | ) 10 | 11 | func TestServerBillDAO_CreateOrUpdateServerBill(t *testing.T) { 12 | var dao = NewServerBillDAO() 13 | var tx *dbs.Tx 14 | var month = timeutil.Format("Y02") 15 | err := dao.CreateOrUpdateServerBill(tx, 1, 2, month, 4, 5, 6, 7, 95, "", 100) 16 | if err != nil { 17 | t.Fatal(err) 18 | } 19 | t.Log("ok") 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/server_bill_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/server_dao_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import "github.com/iwind/TeaGo/dbs" 7 | 8 | // ResetServersTrafficLimitStatusWithUserPlanId 重置用户套餐相关网站限流状态 9 | func (this *ServerDAO) ResetServersTrafficLimitStatusWithUserPlanId(tx *dbs.Tx, userPlanId int64) error { 10 | // stub 11 | return nil 12 | } 13 | -------------------------------------------------------------------------------- /internal/db/models/server_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/server_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/server_stat_board_chart_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/server_stat_board_chart_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/server_stat_board_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/server_stat_board_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ssl_cert_group_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/ssl_cert_group_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/ssl_cert_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | func (this *SSLCert) DecodeDNSNames() []string { 6 | if len(this.DnsNames) == 0 { 7 | return nil 8 | } 9 | 10 | var result = []string{} 11 | var err = json.Unmarshal(this.DnsNames, &result) 12 | if err != nil { 13 | return nil 14 | } 15 | 16 | return result 17 | } 18 | 19 | func (this *SSLCert) DecodeCommonNames() []string { 20 | if len(this.CommonNames) == 0 { 21 | return nil 22 | } 23 | 24 | var result = []string{} 25 | var err = json.Unmarshal(this.CommonNames, &result) 26 | if err != nil { 27 | return nil 28 | } 29 | 30 | return result 31 | } 32 | -------------------------------------------------------------------------------- /internal/db/models/ssl_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/ssl_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs" 7 | ) 8 | 9 | func (this *SSLPolicy) DecodeCerts() []*sslconfigs.SSLCertRef { 10 | if len(this.Certs) == 0 { 11 | return nil 12 | } 13 | 14 | var refs = []*sslconfigs.SSLCertRef{} 15 | err := json.Unmarshal(this.Certs, &refs) 16 | if err != nil { 17 | remotelogs.Error("SSLPolicy_DecodeCerts", err.Error()) 18 | } 19 | return refs 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/stats/node_cluster_traffic_daily_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/stats/node_cluster_traffic_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/node_traffic_hourly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/stats/node_traffic_hourly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_client_browser_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "github.com/iwind/TeaGo/dbs" 7 | "testing" 8 | ) 9 | 10 | func TestServerClientBrowserMonthlyStatDAO_IncreaseMonthlyCount(t *testing.T) { 11 | dbs.NotifyReady() 12 | 13 | var tx *dbs.Tx 14 | err := SharedServerClientBrowserMonthlyStatDAO.IncreaseMonthlyCount(tx, 1, 1, "1.0", "202101", 1) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | 21 | func TestServerClientBrowserMonthlyStatDAO_Clean(t *testing.T) { 22 | var dao = NewServerClientBrowserMonthlyStatDAO() 23 | err := dao.Clean(nil) 24 | if err != nil { 25 | t.Fatal(err) 26 | } 27 | t.Log("ok") 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_client_browser_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_client_system_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "testing" 6 | ) 7 | 8 | func TestServerClientSystemMonthlyStatDAO_Clean(t *testing.T) { 9 | var dao = NewServerClientSystemMonthlyStatDAO() 10 | err := dao.Clean(nil) 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | t.Log("ok") 15 | } 16 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_client_system_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_domain_hourly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_http_firewall_daily_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_http_firewall_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_http_firewall_hourly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_http_firewall_hourly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_city_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "testing" 6 | ) 7 | 8 | func TestServerRegionCityMonthlyStatDAO_Clean(t *testing.T) { 9 | var dao = NewServerRegionCityMonthlyStatDAO() 10 | err := dao.Clean(nil) 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | t.Log("ok") 15 | } 16 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_city_monthly_stat_model.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | // 服务用户省份分布统计(按天) 4 | type ServerRegionCityMonthlyStat struct { 5 | Id uint64 `field:"id"` // ID 6 | ServerId uint32 `field:"serverId"` // 服务ID 7 | CityId uint32 `field:"cityId"` // 城市ID 8 | Month string `field:"month"` // 月份YYYYMM 9 | Count uint64 `field:"count"` // 数量 10 | } 11 | 12 | type ServerRegionCityMonthlyStatOperator struct { 13 | Id interface{} // ID 14 | ServerId interface{} // 服务ID 15 | CityId interface{} // 城市ID 16 | Month interface{} // 月份YYYYMM 17 | Count interface{} // 数量 18 | } 19 | 20 | func NewServerRegionCityMonthlyStatOperator() *ServerRegionCityMonthlyStatOperator { 21 | return &ServerRegionCityMonthlyStatOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_city_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_country_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_country_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_country_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_provider_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "testing" 6 | ) 7 | 8 | 9 | func TestServerRegionProviderMonthlyStatDAO_Clean(t *testing.T) { 10 | var dao = NewServerRegionProviderMonthlyStatDAO() 11 | err := dao.Clean(nil) 12 | if err != nil { 13 | t.Fatal(err) 14 | } 15 | t.Log("ok") 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_provider_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_province_monthly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/stats/server_region_province_monthly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/traffic_daily_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/stats/traffic_hourly_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package stats 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/dbs" 6 | timeutil "github.com/iwind/TeaGo/utils/time" 7 | "testing" 8 | "time" 9 | ) 10 | 11 | func TestTrafficHourlyStatDAO_IncreaseDayBytes(t *testing.T) { 12 | dbs.NotifyReady() 13 | 14 | now := time.Now() 15 | err := SharedTrafficHourlyStatDAO.IncreaseHourlyStat(nil, timeutil.Format("YmdH"), 1, 1, 1, 1, 1, 1) 16 | if err != nil { 17 | t.Fatal(err) 18 | } 19 | t.Log("ok", time.Since(now).Seconds()*1000, "ms") 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/stats/traffic_hourly_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package stats 2 | -------------------------------------------------------------------------------- /internal/db/models/sub_user_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/sub_user_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/sys_event_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "testing" 6 | ) 7 | 8 | func TestSysEvent_DecodeEvent(t *testing.T) { 9 | event := &SysEvent{ 10 | Type: "serverChange", 11 | } 12 | eventObj, err := event.DecodeEvent() 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log(eventObj) 17 | } 18 | -------------------------------------------------------------------------------- /internal/db/models/sys_event_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // SysEvent 系统事件 6 | type SysEvent struct { 7 | Id uint64 `field:"id"` // ID 8 | Type string `field:"type"` // 类型 9 | Params dbs.JSON `field:"params"` // 参数 10 | CreatedAt uint64 `field:"createdAt"` // 创建时间 11 | } 12 | 13 | type SysEventOperator struct { 14 | Id interface{} // ID 15 | Type interface{} // 类型 16 | Params interface{} // 参数 17 | CreatedAt interface{} // 创建时间 18 | } 19 | 20 | func NewSysEventOperator() *SysEventOperator { 21 | return &SysEventOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/sys_event_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "reflect" 7 | ) 8 | 9 | // DecodeEvent 解码事件 10 | func (this *SysEvent) DecodeEvent() (EventInterface, error) { 11 | // 解析数据类型 12 | t, isOk := eventTypeMapping[this.Type] 13 | if !isOk { 14 | return nil, errors.New("can not found event type '" + this.Type + "'") 15 | } 16 | ptr := reflect.New(t).Interface().(EventInterface) 17 | 18 | // 解析参数 19 | if IsNotNull(this.Params) { 20 | err := json.Unmarshal(this.Params, ptr) 21 | if err != nil { 22 | return nil, err 23 | } 24 | } 25 | 26 | return ptr, nil 27 | } 28 | -------------------------------------------------------------------------------- /internal/db/models/sys_event_types.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "reflect" 5 | ) 6 | 7 | var eventTypeMapping = map[string]reflect.Type{} // eventType => reflect type 8 | 9 | func init() { 10 | for _, event := range []EventInterface{ 11 | // Event列表 12 | } { 13 | eventTypeMapping[event.Type()] = reflect.ValueOf(event).Elem().Type() 14 | } 15 | } 16 | 17 | // 接口 18 | type EventInterface interface { 19 | Type() string 20 | Run() error 21 | } 22 | -------------------------------------------------------------------------------- /internal/db/models/sys_locker_increment_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package models_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 7 | "testing" 8 | ) 9 | 10 | func TestNewSysLockerIncrement(t *testing.T) { 11 | var increment = models.NewSysLockerIncrement(10) 12 | increment.Push("key", 1, 10) 13 | t.Log(increment.MaxValue("key")) 14 | for i := 0; i < 11; i++ { 15 | result, value := increment.Pop("key") 16 | t.Log(i, "=>", result, value) 17 | } 18 | 19 | for i := 0; i < 11; i++ { 20 | result, value := increment.Pop("key1") 21 | t.Log(i, "=>", result, value) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /internal/db/models/sys_locker_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // 并发锁 4 | type SysLocker struct { 5 | Id uint64 `field:"id"` // ID 6 | Key string `field:"key"` // 键值 7 | Version uint64 `field:"version"` // 版本号 8 | TimeoutAt uint64 `field:"timeoutAt"` // 超时时间 9 | } 10 | 11 | type SysLockerOperator struct { 12 | Id interface{} // ID 13 | Key interface{} // 键值 14 | Version interface{} // 版本号 15 | TimeoutAt interface{} // 超时时间 16 | } 17 | 18 | func NewSysLockerOperator() *SysLockerOperator { 19 | return &SysLockerOperator{} 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/sys_locker_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/sys_setting_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // SysSetting 系统配置 6 | type SysSetting struct { 7 | Id uint32 `field:"id"` // ID 8 | UserId uint32 `field:"userId"` // 用户ID 9 | Code string `field:"code"` // 代号 10 | Value dbs.JSON `field:"value"` // 配置值 11 | } 12 | 13 | type SysSettingOperator struct { 14 | Id any // ID 15 | UserId any // 用户ID 16 | Code any // 代号 17 | Value any // 配置值 18 | } 19 | 20 | func NewSysSettingOperator() *SysSettingOperator { 21 | return &SysSettingOperator{} 22 | } 23 | -------------------------------------------------------------------------------- /internal/db/models/sys_setting_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/tcp_firewall_policy_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/tcp_firewall_policy_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // TCP防火墙 4 | type TCPFirewallPolicy struct { 5 | Id uint32 `field:"id"` // ID 6 | AdminId int32 `field:"adminId"` // 管理员ID 7 | UserId uint32 `field:"userId"` // 用户ID 8 | TemplateId uint32 `field:"templateId"` // 模版ID 9 | } 10 | 11 | type TCPFirewallPolicyOperator struct { 12 | Id interface{} // ID 13 | AdminId interface{} // 管理员ID 14 | UserId interface{} // 用户ID 15 | TemplateId interface{} // 模版ID 16 | } 17 | 18 | func NewTCPFirewallPolicyOperator() *TCPFirewallPolicyOperator { 19 | return &TCPFirewallPolicyOperator{} 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/tcp_firewall_policy_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // TrafficPackage 流量包 4 | type TrafficPackage struct { 5 | Id uint32 `field:"id"` // ID 6 | Size uint32 `field:"size"` // 尺寸 7 | Unit string `field:"unit"` // 单位(gb|tb等) 8 | Bytes uint64 `field:"bytes"` // 字节 9 | IsOn bool `field:"isOn"` // 是否启用 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type TrafficPackageOperator struct { 14 | Id any // ID 15 | Size any // 尺寸 16 | Unit any // 单位(gb|tb等) 17 | Bytes any // 字节 18 | IsOn any // 是否启用 19 | State any // 状态 20 | } 21 | 22 | func NewTrafficPackageOperator() *TrafficPackageOperator { 23 | return &TrafficPackageOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_period_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_period_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // TrafficPackagePeriod 流量包有效期 4 | type TrafficPackagePeriod struct { 5 | Id uint32 `field:"id"` // ID 6 | IsOn bool `field:"isOn"` // 是否启用 7 | Count uint32 `field:"count"` // 数量 8 | Unit string `field:"unit"` // 单位:month, year 9 | Months uint32 `field:"months"` // 月数 10 | State uint8 `field:"state"` // 状态 11 | } 12 | 13 | type TrafficPackagePeriodOperator struct { 14 | Id any // ID 15 | IsOn any // 是否启用 16 | Count any // 数量 17 | Unit any // 单位:month, year 18 | Months any // 月数 19 | State any // 状态 20 | } 21 | 22 | func NewTrafficPackagePeriodOperator() *TrafficPackagePeriodOperator { 23 | return &TrafficPackagePeriodOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_period_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_price_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type TrafficPackagePriceDAO dbs.DAO 10 | 11 | func NewTrafficPackagePriceDAO() *TrafficPackagePriceDAO { 12 | return dbs.NewDAO(&TrafficPackagePriceDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeTrafficPackagePrices", 16 | Model: new(TrafficPackagePrice), 17 | PkName: "id", 18 | }, 19 | }).(*TrafficPackagePriceDAO) 20 | } 21 | 22 | var SharedTrafficPackagePriceDAO *TrafficPackagePriceDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedTrafficPackagePriceDAO = NewTrafficPackagePriceDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_price_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/traffic_package_price_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/updating_server_list_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/updating_server_list_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "github.com/iwind/TeaGo/dbs" 4 | 5 | // UpdatingServerList 待更新服务列表 6 | type UpdatingServerList struct { 7 | Id uint64 `field:"id"` // ID 8 | ClusterId uint32 `field:"clusterId"` // 集群ID 9 | UniqueId string `field:"uniqueId"` // 唯一ID 10 | ServerIds dbs.JSON `field:"serverIds"` // 服务IDs 11 | Day string `field:"day"` // 创建日期 12 | } 13 | 14 | type UpdatingServerListOperator struct { 15 | Id any // ID 16 | ClusterId any // 集群ID 17 | UniqueId any // 唯一ID 18 | ServerIds any // 服务IDs 19 | Day any // 创建日期 20 | } 21 | 22 | func NewUpdatingServerListOperator() *UpdatingServerListOperator { 23 | return &UpdatingServerListOperator{} 24 | } 25 | -------------------------------------------------------------------------------- /internal/db/models/updating_server_list_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | ) 7 | 8 | func (this *UpdatingServerList) DecodeServerIds() []int64 { 9 | if len(this.ServerIds) == 0 { 10 | return nil 11 | } 12 | 13 | var serverIds = []int64{} 14 | err := json.Unmarshal(this.ServerIds, &serverIds) 15 | if err != nil { 16 | remotelogs.Error("UpdatingServerList", "DecodeServerIds(): "+err.Error()) 17 | } 18 | 19 | return serverIds 20 | } 21 | -------------------------------------------------------------------------------- /internal/db/models/user_access_key_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/user_access_key_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_ad_instance_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_ad_instance_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_bandwidth_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_bill_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type UserBillDAO dbs.DAO 10 | 11 | func NewUserBillDAO() *UserBillDAO { 12 | return dbs.NewDAO(&UserBillDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeUserBills", 16 | Model: new(UserBill), 17 | PkName: "id", 18 | }, 19 | }).(*UserBillDAO) 20 | } 21 | 22 | var SharedUserBillDAO *UserBillDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedUserBillDAO = NewUserBillDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/user_bill_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_bill_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_email_notification_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_email_notification_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_email_verification_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_email_verification_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_identity_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_identity_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import "encoding/json" 4 | 5 | func (this *UserIdentity) DecodeFileIds() []int64 { 6 | if len(this.FileIds) == 0 { 7 | return []int64{} 8 | } 9 | 10 | var result = []int64{} 11 | err := json.Unmarshal(this.FileIds, &result) 12 | if err != nil { 13 | // ignore error 14 | } 15 | return result 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/user_mobile_verification_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_mobile_verification_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 6 | ) 7 | 8 | // DecodeModules 解析模块 9 | func (this *User) DecodeModules() []string { 10 | if len(this.Modules) == 0 { 11 | return nil 12 | } 13 | 14 | var result = []string{} 15 | err := json.Unmarshal(this.Modules, &result) 16 | if err != nil { 17 | remotelogs.Error("User.DecodeModules", err.Error()) 18 | } 19 | 20 | return result 21 | } 22 | -------------------------------------------------------------------------------- /internal/db/models/user_node_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_bandwidth_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // UserPlan 用户的套餐 4 | type UserPlan struct { 5 | Id uint64 `field:"id"` // ID 6 | UserId uint32 `field:"userId"` // 用户ID 7 | PlanId uint32 `field:"planId"` // 套餐ID 8 | IsOn bool `field:"isOn"` // 是否启用 9 | Name string `field:"name"` // 名称 10 | DayTo string `field:"dayTo"` // 结束日期 11 | State uint8 `field:"state"` // 状态 12 | } 13 | 14 | type UserPlanOperator struct { 15 | Id interface{} // ID 16 | UserId interface{} // 用户ID 17 | PlanId interface{} // 套餐ID 18 | IsOn interface{} // 是否启用 19 | Name interface{} // 名称 20 | DayTo interface{} // 结束日期 21 | State interface{} // 状态 22 | } 23 | 24 | func NewUserPlanOperator() *UserPlanOperator { 25 | return &UserPlanOperator{} 26 | } 27 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import timeutil "github.com/iwind/TeaGo/utils/time" 4 | 5 | // IsExpired 判断套餐是否过期 6 | func (this *UserPlan) IsExpired() bool { 7 | return len(this.DayTo) == 0 || this.DayTo < timeutil.Format("Y-m-d") 8 | } 9 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_stat_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type UserPlanStatDAO dbs.DAO 10 | 11 | func NewUserPlanStatDAO() *UserPlanStatDAO { 12 | return dbs.NewDAO(&UserPlanStatDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeUserPlanStats", 16 | Model: new(UserPlanStat), 17 | PkName: "id", 18 | }, 19 | }).(*UserPlanStatDAO) 20 | } 21 | 22 | var SharedUserPlanStatDAO *UserPlanStatDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedUserPlanStatDAO = NewUserPlanStatDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_stat_dao_community.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package models 5 | 6 | import "github.com/iwind/TeaGo/dbs" 7 | 8 | func (this *UserPlanStatDAO) IncreaseUserPlanStat(tx *dbs.Tx, userPlanId int64, trafficBytes int64, countRequests int64, countWebsocketConnections int64) error { 9 | // stub 10 | return nil 11 | } 12 | 13 | func (this *UserPlanStatDAO) ResetUserPlanStatsWithUserPlanId(tx *dbs.Tx, userPlanId int64) error { 14 | // stub 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_stat_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_plan_stat_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_script_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | const ( 10 | UserScriptStateEnabled = 1 // 已启用 11 | UserScriptStateDisabled = 0 // 已禁用 12 | ) 13 | 14 | type UserScriptDAO dbs.DAO 15 | 16 | func NewUserScriptDAO() *UserScriptDAO { 17 | return dbs.NewDAO(&UserScriptDAO{ 18 | DAOObject: dbs.DAOObject{ 19 | DB: Tea.Env, 20 | Table: "edgeUserScripts", 21 | Model: new(UserScript), 22 | PkName: "id", 23 | }, 24 | }).(*UserScriptDAO) 25 | } 26 | 27 | var SharedUserScriptDAO *UserScriptDAO 28 | 29 | func init() { 30 | dbs.OnReady(func() { 31 | SharedUserScriptDAO = NewUserScriptDAO() 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /internal/db/models/user_script_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_script_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_traffic_bill_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_traffic_package_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_traffic_package_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/user_verify_code_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type UserVerifyCodeDAO dbs.DAO 10 | 11 | func NewUserVerifyCodeDAO() *UserVerifyCodeDAO { 12 | return dbs.NewDAO(&UserVerifyCodeDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeUserVerifyCodes", 16 | Model: new(UserVerifyCode), 17 | PkName: "id", 18 | }, 19 | }).(*UserVerifyCodeDAO) 20 | } 21 | 22 | var SharedUserVerifyCodeDAO *UserVerifyCodeDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedUserVerifyCodeDAO = NewUserVerifyCodeDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/user_verify_code_dao_test.go: -------------------------------------------------------------------------------- 1 | package models_test 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | ) 7 | -------------------------------------------------------------------------------- /internal/db/models/user_verify_code_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/models/version_dao.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | "github.com/iwind/TeaGo/Tea" 6 | "github.com/iwind/TeaGo/dbs" 7 | ) 8 | 9 | type VersionDAO dbs.DAO 10 | 11 | func NewVersionDAO() *VersionDAO { 12 | return dbs.NewDAO(&VersionDAO{ 13 | DAOObject: dbs.DAOObject{ 14 | DB: Tea.Env, 15 | Table: "edgeVersions", 16 | Model: new(Version), 17 | PkName: "id", 18 | }, 19 | }).(*VersionDAO) 20 | } 21 | 22 | var SharedVersionDAO *VersionDAO 23 | 24 | func init() { 25 | dbs.OnReady(func() { 26 | SharedVersionDAO = NewVersionDAO() 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /internal/db/models/version_dao_test.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "github.com/go-sql-driver/mysql" 5 | ) 6 | -------------------------------------------------------------------------------- /internal/db/models/version_model.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // 数据库结构版本 4 | type Version struct { 5 | Id uint64 `field:"id"` // ID 6 | Version string `field:"version"` // 7 | } 8 | 9 | type VersionOperator struct { 10 | Id interface{} // ID 11 | Version interface{} // 12 | } 13 | 14 | func NewVersionOperator() *VersionOperator { 15 | return &VersionOperator{} 16 | } 17 | -------------------------------------------------------------------------------- /internal/db/models/version_model_ext.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /internal/db/utils/disk_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dbutils_test 4 | 5 | import ( 6 | dbutils "github.com/TeaOSLab/EdgeAPI/internal/db/utils" 7 | _ "github.com/iwind/TeaGo/bootstrap" 8 | "testing" 9 | ) 10 | 11 | func TestHasFreeSpace(t *testing.T) { 12 | t.Log(dbutils.CheckHasFreeSpace()) 13 | t.Log(dbutils.LocalDatabaseDataDir) 14 | } 15 | -------------------------------------------------------------------------------- /internal/dnsclients/.gitignore: -------------------------------------------------------------------------------- 1 | *_plus_test.go -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_base.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type BaseResponse struct { 6 | Success bool `json:"success"` 7 | Errors []struct { 8 | Code int `json:"code"` 9 | Message string `json:"message"` 10 | } `json:"errors"` 11 | } 12 | 13 | func (this *BaseResponse) IsOk() bool { 14 | return this.Success 15 | } 16 | 17 | func (this *BaseResponse) LastError() (code int, message string) { 18 | if len(this.Errors) == 0 { 19 | return 0, "" 20 | } 21 | return this.Errors[0].Code, this.Errors[0].Message 22 | } 23 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_create_dns_record.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type CreateDNSRecordResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_delete_dns_record.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type DeleteDNSRecordResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_get_dns_records.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type GetDNSRecordsResponse struct { 6 | BaseResponse 7 | 8 | Result []struct { 9 | Id string `json:"id"` 10 | Type string `json:"type"` 11 | Name string `json:"name"` 12 | Content string `json:"content"` 13 | Ttl int `json:"ttl"` 14 | ZoneId string `json:"zoneId"` 15 | ZoneName string `json:"zoneName"` 16 | } `json:"result"` 17 | } 18 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_interface.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type ResponseInterface interface { 6 | IsOk() bool 7 | LastError() (code int, message string) 8 | } 9 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_update_dns_record.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type UpdateDNSRecordResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/cloudflare/response_zones.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package cloudflare 4 | 5 | type ZonesResponse struct { 6 | BaseResponse 7 | 8 | Result []struct { 9 | Id string `json:"id"` 10 | Name string `json:"name"` 11 | } `json:"result"` 12 | } 13 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_base.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package dnspod 4 | 5 | type BaseResponse struct { 6 | Status struct { 7 | Code string `json:"code"` 8 | Message string `json:"message"` 9 | } `json:"status"` 10 | } 11 | 12 | func (this *BaseResponse) IsOk() bool { 13 | return this.Status.Code == "1" 14 | } 15 | 16 | func (this *BaseResponse) LastError() (code string, message string) { 17 | return this.Status.Code, this.Status.Message 18 | } 19 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_custom_line_group_list.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type CustomLineGroupListResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | LineGroups []struct { 10 | Name string `json:"name"` 11 | } `json:"line_groups"` 12 | Info struct { 13 | NowTotal int `json:"now_total"` 14 | Total int `json:"total"` 15 | } `json:"info"` 16 | } `json:"data"` 17 | } 18 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_domain_info.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type DomainInfoResponse struct { 6 | BaseResponse 7 | 8 | Domain struct { 9 | Id any `json:"id"` 10 | Name string `json:"name"` 11 | Grade string `json:"grade"` 12 | } `json:"domain"` 13 | } 14 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_domain_list.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type DomainListResponse struct { 6 | BaseResponse 7 | 8 | Info struct { 9 | DomainTotal int `json:"domain_total"` 10 | AllTotal int `json:"all_total"` 11 | MineTotal int `json:"mine_total"` 12 | } `json:"info"` 13 | 14 | Domains []struct { 15 | Name string `json:"name"` 16 | } `json:"domains"` 17 | } 18 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_interface.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package dnspod 4 | 5 | type ResponseInterface interface { 6 | IsOk() bool 7 | LastError() (code string, message string) 8 | } 9 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_record_create.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type RecordCreateResponse struct { 6 | BaseResponse 7 | 8 | Record struct { 9 | Id any `json:"id"` 10 | Name string `json:"name"` 11 | Status string `json:"status"` 12 | } `json:"record"` 13 | } 14 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_record_line.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type RecordLineResponse struct { 6 | BaseResponse 7 | 8 | Lines []string `json:"lines"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_record_list.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type RecordListResponse struct { 6 | BaseResponse 7 | 8 | Info struct { 9 | SubDomains string `json:"sub_domains"` 10 | RecordTotal string `json:"record_total"` 11 | RecordsNum string `json:"records_num"` 12 | } `json:"info"` 13 | 14 | Records []struct { 15 | Id any `json:"id"` 16 | Name string `json:"name"` 17 | Type string `json:"type"` 18 | Value string `json:"value"` 19 | Line string `json:"line"` 20 | LineId string `json:"line_id"` 21 | TTL string `json:"ttl"` 22 | } `json:"records"` 23 | } 24 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_record_modify.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type RecordModifyResponse struct { 6 | BaseResponse 7 | 8 | Record struct { 9 | Id any `json:"id"` 10 | Name string `json:"name"` 11 | Value string `json:"value"` 12 | Status string `json:"status"` 13 | } `json:"record"` 14 | } 15 | -------------------------------------------------------------------------------- /internal/dnsclients/dnspod/response_record_remove.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package dnspod 4 | 5 | type RecordRemoveResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/dnstypes/route.go: -------------------------------------------------------------------------------- 1 | package dnstypes 2 | 3 | // Route 线路描述 4 | type Route struct { 5 | Name string `json:"name"` 6 | Code string `json:"code"` 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_base.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | import ( 6 | "errors" 7 | "github.com/iwind/TeaGo/types" 8 | ) 9 | 10 | type BaseResponse struct { 11 | Code int `json:"code"` 12 | Message string `json:"message"` 13 | } 14 | 15 | func (this *BaseResponse) IsValid() bool { 16 | return this.Code == 200 17 | } 18 | 19 | func (this *BaseResponse) Error() error { 20 | return errors.New("code: " + types.String(this.Code) + ", message: " + this.Message) 21 | } 22 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_create_ns_record.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type CreateNSRecordResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSRecordId int64 `json:"nsRecordId"` 10 | } `json:"data"` 11 | } 12 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_find_all_ns_routes.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type FindAllNSRoutesResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSRoutes []struct { 10 | Name string `json:"name"` 11 | Code string `json:"code"` 12 | } `json:"nsRoutes"` 13 | } `json:"data"` 14 | } 15 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_find_ns_domain_with_name.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type FindDomainWithNameResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSDomain struct { 10 | Id int64 `json:"id"` 11 | Name string `json:"name"` 12 | } 13 | } `json:"data"` 14 | } 15 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_find_ns_record_with_name_and_type.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type FindNSRecordWithNameAndTypeResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSRecord struct { 10 | Id int64 `json:"id"` 11 | Name string `json:"name"` 12 | Type string `json:"type"` 13 | Value string `json:"value"` 14 | TTL int32 `json:"ttl"` 15 | NSRoutes []struct { 16 | Name string `json:"name"` 17 | Code string `json:"code"` 18 | } `json:"nsRoutes"` 19 | } `json:"nsRecord"` 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_find_ns_records_with_name_and_type.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type FindNSRecordsWithNameAndTypeResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSRecords []struct { 10 | Id int64 `json:"id"` 11 | Name string `json:"name"` 12 | Type string `json:"type"` 13 | Value string `json:"value"` 14 | TTL int32 `json:"ttl"` 15 | NSRoutes []struct { 16 | Name string `json:"name"` 17 | Code string `json:"code"` 18 | } `json:"nsRoutes"` 19 | } `json:"nsRecords"` 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_get_api_access_token.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type GetAPIAccessToken struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | Token string `json:"token"` 10 | ExpiresAt int64 `json:"expiresAt"` 11 | } `json:"data"` 12 | } 13 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_interface.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type ResponseInterface interface { 6 | IsValid() bool 7 | Error() error 8 | } 9 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_list_ns_domains.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type ListNSDomainsResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSDomains []struct { 10 | Id int64 `json:"id"` 11 | Name string `json:"name"` 12 | IsOn bool `json:"isOn"` 13 | IsDeleted bool `json:"isDeleted"` 14 | } `json:"nsDomains"` 15 | } `json:"data"` 16 | } 17 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_list_ns_records.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type ListNSRecordsResponse struct { 6 | BaseResponse 7 | 8 | Data struct { 9 | NSRecords []struct { 10 | Id int64 `json:"id"` 11 | Name string `json:"name"` 12 | Value string `json:"value"` 13 | TTL int32 `json:"ttl"` 14 | Type string `json:"type"` 15 | NSRoutes []struct { 16 | Name string `json:"name"` 17 | Code string `json:"code"` 18 | } `json:"nsRoutes"` 19 | } `json:"nsRecords"` 20 | } `json:"data"` 21 | } 22 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_success.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type SuccessResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/edgeapi/response_update_ns_record.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package edgeapi 4 | 5 | type UpdateNSRecordResponse struct { 6 | BaseResponse 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_base.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type BaseResponse struct { 6 | } 7 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_custom_lines.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type CustomLinesResponse struct { 6 | Lines []struct { 7 | LineId string `json:"line_id"` 8 | Name string `json:"name"` 9 | } `json:"lines"` 10 | } 11 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_record_sets.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type RecordSetsResponse struct { 6 | RecordSets []struct { 7 | Id string `json:"id"` 8 | Name string `json:"name"` 9 | Type string `json:"type"` 10 | Ttl int `json:"ttl"` 11 | Line string `json:"line"` 12 | Records []string `json:"records"` 13 | } `json:"recordsets"` 14 | } 15 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_zone_record_sets.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type ZoneRecordSetsResponse struct { 6 | RecordSets []struct { 7 | Id string `json:"id"` 8 | Name string `json:"name"` 9 | Type string `json:"type"` 10 | Ttl int `json:"ttl"` 11 | Records []string `json:"records"` 12 | Line string `json:"line"` 13 | } `json:"recordsets"` 14 | Metadata struct { 15 | TotalCount int `json:"total_count"` 16 | } `json:"metadata"` 17 | } 18 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_zones.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type ZonesResponse struct { 6 | Links struct{} `json:"links"` 7 | Zones []struct { 8 | Id string `json:"id"` 9 | Name string `json:"name"` 10 | ZoneType string `json:"zone_type"` 11 | Status string `json:"status"` 12 | RecordNum int `json:"record_num"` 13 | } `json:"zones"` 14 | Metadata struct { 15 | TotalCount int `json:"total_count"` 16 | } `json:"metadata"` 17 | } 18 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_zones_create_record_set.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type ZonesCreateRecordSetResponse struct { 6 | Id string `json:"id"` 7 | Line string `json:"line"` 8 | Records []string `json:"records"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_zones_delete_record_set.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type ZonesDeleteRecordSetResponse struct { 6 | Id string `json:"id"` 7 | } 8 | -------------------------------------------------------------------------------- /internal/dnsclients/huaweidns/response_zones_update_record_set.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package huaweidns 4 | 5 | type ZonesUpdateRecordSetResponse struct { 6 | Id string `json:"id"` 7 | Line string `json:"line"` 8 | Records []string `json:"records"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/dnsclients/provider_base.go: -------------------------------------------------------------------------------- 1 | package dnsclients 2 | 3 | import ( 4 | "fmt" 5 | "github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes" 6 | ) 7 | 8 | type BaseProvider struct{} 9 | 10 | // WrapError 封装解析相关错误 11 | func (this *BaseProvider) WrapError(err error, domain string, record *dnstypes.Record) error { 12 | if err == nil { 13 | return nil 14 | } 15 | 16 | if record == nil { 17 | return err 18 | } 19 | 20 | var fullname string 21 | if len(record.Name) == 0 { 22 | fullname = domain 23 | } else { 24 | fullname = record.Name + "." + domain 25 | } 26 | return fmt.Errorf("record operation failed: '%s %s %s %d': %w", fullname, record.Type, record.Value, record.TTL, err) 27 | } 28 | -------------------------------------------------------------------------------- /internal/encrypt/magic_key_test.go: -------------------------------------------------------------------------------- 1 | package encrypt 2 | 3 | import "testing" 4 | 5 | func TestMagicKeyEncode(t *testing.T) { 6 | dst := MagicKeyEncode([]byte("Hello,World")) 7 | t.Log("dst:", string(dst)) 8 | 9 | src := MagicKeyDecode(dst) 10 | t.Log("src:", string(src)) 11 | } 12 | -------------------------------------------------------------------------------- /internal/encrypt/method.go: -------------------------------------------------------------------------------- 1 | package encrypt 2 | 3 | type MethodInterface interface { 4 | // 初始化 5 | Init(key []byte, iv []byte) error 6 | 7 | // 加密 8 | Encrypt(src []byte) (dst []byte, err error) 9 | 10 | // 解密 11 | Decrypt(dst []byte) (src []byte, err error) 12 | } 13 | -------------------------------------------------------------------------------- /internal/encrypt/method_raw.go: -------------------------------------------------------------------------------- 1 | package encrypt 2 | 3 | type RawMethod struct { 4 | } 5 | 6 | func (this *RawMethod) Init(key, iv []byte) error { 7 | return nil 8 | } 9 | 10 | func (this *RawMethod) Encrypt(src []byte) (dst []byte, err error) { 11 | if len(src) == 0 { 12 | return 13 | } 14 | dst = make([]byte, len(src)) 15 | copy(dst, src) 16 | return 17 | } 18 | 19 | func (this *RawMethod) Decrypt(dst []byte) (src []byte, err error) { 20 | if len(dst) == 0 { 21 | return 22 | } 23 | src = make([]byte, len(dst)) 24 | copy(src, dst) 25 | return 26 | } 27 | -------------------------------------------------------------------------------- /internal/encrypt/method_raw_test.go: -------------------------------------------------------------------------------- 1 | package encrypt 2 | 3 | import "testing" 4 | 5 | func TestRawMethod_Encrypt(t *testing.T) { 6 | method, err := NewMethodInstance("raw", "abc", "123") 7 | if err != nil { 8 | t.Fatal(err) 9 | } 10 | src := []byte("Hello, World") 11 | dst, err := method.Encrypt(src) 12 | if err != nil { 13 | t.Fatal(err) 14 | } 15 | dst = dst[:len(src)] 16 | t.Log("dst:", string(dst)) 17 | 18 | src, err = method.Decrypt(dst) 19 | if err != nil { 20 | t.Fatal(err) 21 | } 22 | t.Log("src:", string(src)) 23 | } 24 | -------------------------------------------------------------------------------- /internal/encrypt/method_utils_test.go: -------------------------------------------------------------------------------- 1 | package encrypt 2 | 3 | import "testing" 4 | 5 | func TestFindMethodInstance(t *testing.T) { 6 | t.Log(NewMethodInstance("a", "b", "")) 7 | t.Log(NewMethodInstance("aes-256-cfb", "123456", "")) 8 | } 9 | -------------------------------------------------------------------------------- /internal/errors/detailed_error.go: -------------------------------------------------------------------------------- 1 | package errors 2 | 3 | type DetailedError struct { 4 | msg string 5 | code string 6 | } 7 | 8 | func (this *DetailedError) Error() string { 9 | return this.msg 10 | } 11 | 12 | func (this *DetailedError) Code() string { 13 | return this.code 14 | } 15 | 16 | func NewDetailedError(code string, errString string) *DetailedError { 17 | return &DetailedError{ 18 | msg: errString, 19 | code: code, 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /internal/errors/error_test.go: -------------------------------------------------------------------------------- 1 | package errors 2 | 3 | import ( 4 | "errors" 5 | "testing" 6 | ) 7 | 8 | func TestNew(t *testing.T) { 9 | t.Log(New("hello")) 10 | t.Log(Wrap(errors.New("hello"))) 11 | t.Log(testError1()) 12 | t.Log(Wrap(testError1())) 13 | t.Log(Wrap(testError2())) 14 | } 15 | 16 | func testError1() error { 17 | return New("test error1") 18 | } 19 | 20 | func testError2() error { 21 | return Wrap(testError1()) 22 | } 23 | -------------------------------------------------------------------------------- /internal/events/events.go: -------------------------------------------------------------------------------- 1 | package events 2 | 3 | type Event = string 4 | 5 | const ( 6 | EventStart Event = "start" // start loading 7 | EventLoaded Event = "loaded" // first load 8 | EventQuit Event = "quit" // quit node gracefully 9 | EventReload Event = "reload" // reload config 10 | ) 11 | -------------------------------------------------------------------------------- /internal/events/utils.go: -------------------------------------------------------------------------------- 1 | package events 2 | 3 | import "sync" 4 | 5 | var eventsMap = map[string][]func(){} // event => []callbacks 6 | var locker = sync.Mutex{} 7 | 8 | // On 增加事件回调 9 | func On(event string, callback func()) { 10 | locker.Lock() 11 | defer locker.Unlock() 12 | 13 | var callbacks = eventsMap[event] 14 | callbacks = append(callbacks, callback) 15 | eventsMap[event] = callbacks 16 | } 17 | 18 | // Notify 通知事件 19 | func Notify(event string) { 20 | locker.Lock() 21 | var callbacks = eventsMap[event] 22 | locker.Unlock() 23 | 24 | for _, callback := range callbacks { 25 | callback() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /internal/goman/instance.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package goman 4 | 5 | import "time" 6 | 7 | type Instance struct { 8 | Id uint64 9 | CreatedTime time.Time 10 | File string 11 | Line int 12 | } 13 | -------------------------------------------------------------------------------- /internal/goman/lib_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package goman 4 | 5 | import ( 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestNew(t *testing.T) { 11 | New(func() { 12 | t.Log("Hello") 13 | 14 | t.Log(List()) 15 | }) 16 | 17 | time.Sleep(1 * time.Second) 18 | t.Log(List()) 19 | 20 | time.Sleep(1 * time.Second) 21 | } 22 | 23 | func TestNewWithArgs(t *testing.T) { 24 | NewWithArgs(func(args ...interface{}) { 25 | t.Log(args[0], args[1]) 26 | }, 1, 2) 27 | time.Sleep(1 * time.Second) 28 | } 29 | -------------------------------------------------------------------------------- /internal/installers/credentials.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | type Credentials struct { 4 | Host string 5 | Port int 6 | Username string 7 | Password string 8 | PrivateKey string 9 | Passphrase string 10 | Method string 11 | Sudo bool 12 | } 13 | -------------------------------------------------------------------------------- /internal/installers/deploy_manager_test.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | import "testing" 4 | 5 | func TestDeployManager_LoadNodeFiles(t *testing.T) { 6 | files := NewDeployManager().LoadNodeFiles() 7 | for _, file := range files { 8 | t.Logf("%#v", file) 9 | } 10 | } 11 | 12 | 13 | func TestDeployManager_LoadNSNodeFiles(t *testing.T) { 14 | files := NewDeployManager().LoadNSNodeFiles() 15 | for _, file := range files { 16 | t.Logf("%#v", file) 17 | } 18 | } 19 | 20 | func TestDeployManager_FindNSNodeFile(t *testing.T) { 21 | file := NewDeployManager().FindNSNodeFile("linux", "amd64") 22 | t.Log(file) 23 | 24 | } -------------------------------------------------------------------------------- /internal/installers/env.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | type Env struct { 4 | OS string 5 | Arch string 6 | HelperPath string 7 | } 8 | -------------------------------------------------------------------------------- /internal/installers/errors.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package installers 4 | 5 | type GrantError struct { 6 | err string 7 | } 8 | 9 | func newGrantError(err string) *GrantError { 10 | return &GrantError{err: err} 11 | } 12 | 13 | func (this *GrantError) Error() string { 14 | return this.err 15 | } 16 | 17 | func (this *GrantError) String() string { 18 | return this.err 19 | } 20 | 21 | func IsGrantError(err error) bool { 22 | if err == nil { 23 | return false 24 | } 25 | _, ok := err.(*GrantError) 26 | return ok 27 | } 28 | -------------------------------------------------------------------------------- /internal/installers/helpers/README.md: -------------------------------------------------------------------------------- 1 | 远程安装依赖文件,单独放在一个目录防止安装包过大 -------------------------------------------------------------------------------- /internal/installers/helpers/unzip_test.go: -------------------------------------------------------------------------------- 1 | package helpers_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/installers/helpers" 5 | "github.com/iwind/TeaGo/Tea" 6 | _ "github.com/iwind/TeaGo/bootstrap" 7 | "testing" 8 | ) 9 | 10 | func TestUnzip_Run(t *testing.T) { 11 | var unzip = helpers.NewUnzip(Tea.Root+"/deploy/edge-node-v0.0.1.zip", Tea.Root+"/deploy/") 12 | err := unzip.Run() 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log("OK") 17 | } 18 | -------------------------------------------------------------------------------- /internal/installers/installer_base_test.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | import ( 4 | _ "github.com/iwind/TeaGo/bootstrap" 5 | "testing" 6 | ) 7 | 8 | func TestBaseInstaller_LookupLatest(t *testing.T) { 9 | installer := &BaseInstaller{} 10 | result, err := installer.LookupLatestInstaller("edge-node-linux-amd64") 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | if len(result) == 0 { 15 | t.Log("not found") 16 | return 17 | } 18 | 19 | t.Log("result:", result) 20 | } 21 | -------------------------------------------------------------------------------- /internal/installers/installer_interface.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | import "github.com/TeaOSLab/EdgeAPI/internal/db/models" 4 | 5 | type InstallerInterface interface { 6 | // 登录SSH服务 7 | Login(credentials *Credentials) error 8 | 9 | // 安装 10 | Install(dir string, params interface{}, installStatus *models.NodeInstallStatus) error 11 | 12 | // 关闭连接的SSH服务 13 | Close() error 14 | } 15 | -------------------------------------------------------------------------------- /internal/installers/queue_node_test.go: -------------------------------------------------------------------------------- 1 | package installers 2 | 3 | import ( 4 | "testing" 5 | "time" 6 | ) 7 | 8 | func TestQueue_InstallNode(t *testing.T) { 9 | queue := NewNodeQueue() 10 | err := queue.InstallNodeProcess(16, false) 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | 15 | time.Sleep(1 * time.Second) 16 | 17 | t.Log("OK") 18 | 19 | } 20 | -------------------------------------------------------------------------------- /internal/instances/README.md: -------------------------------------------------------------------------------- 1 | # 实例 2 | 3 | ## 目录结构: 4 | ~~~ 5 | /opt/cache 6 | /usr/local/goedge/ 7 | edge-admin/ 8 | configs/ 9 | api_admin.yaml 10 | api_db.yaml 11 | server.yaml 12 | edge-api/ 13 | configs/api.yaml 14 | configs/db.yaml 15 | api-node/ 16 | configs/api_node.yaml 17 | api-user/ 18 | configs/api_user.yaml 19 | src/ 20 | /usr/bin/ 21 | edge-admin -> ... 22 | edge-api -> ... 23 | edge-node -> ... 24 | edge-user -> ... 25 | /usr/local/mysql 26 | ~~~ 27 | 28 | * 其中 `->` 表示软链接。 29 | * `src/` 目录下放置zip格式的待安装压缩包 30 | 31 | ## 端口 32 | * Admin:7788 33 | * API:8001 34 | * API HTTP:8002 35 | * User: 7799 36 | * Server: 8080 37 | 38 | ## 数据库 39 | 数据库名称为 `edges` -------------------------------------------------------------------------------- /internal/instances/api_config.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package instances 4 | 5 | import "gopkg.in/yaml.v3" 6 | 7 | type APIConfig struct { 8 | RPCEndpoints []string `yaml:"rpc.endpoints,flow,omitempty" json:"rpc.endpoints"` 9 | RPCDisableUpdate bool `yaml:"rpc.disableUpdate,omitempty" json:"rpc.disableUpdate"` 10 | NodeId string `yaml:"nodeId" json:"nodeId"` 11 | Secret string `yaml:"secret" json:"secret"` 12 | } 13 | 14 | func (this *APIConfig) AsYAML() ([]byte, error) { 15 | return yaml.Marshal(this) 16 | } 17 | -------------------------------------------------------------------------------- /internal/instances/options.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package instances 4 | 5 | type Options struct { 6 | IsTesting bool 7 | Verbose bool 8 | Cacheable bool 9 | 10 | WorkDir string 11 | SrcDir string 12 | DB struct { 13 | Host string 14 | Port int 15 | Username string 16 | Password string 17 | Name string 18 | } 19 | AdminNode struct { 20 | Port int 21 | } 22 | APINode struct { 23 | HTTPPort int 24 | RestHTTPPort int 25 | } 26 | Node struct { 27 | HTTPPort int 28 | } 29 | UserNode struct { 30 | HTTPPort int 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /internal/nodes/api_node_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package nodes 5 | 6 | func (this *APINode) startAccessLogStorages() { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /internal/nodes/api_node_services_hook.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | //go:build !plus 3 | // +build !plus 4 | 5 | package nodes 6 | 7 | import "google.golang.org/grpc" 8 | 9 | func APINodeServicesRegister(node *APINode, server *grpc.Server) { 10 | } 11 | -------------------------------------------------------------------------------- /internal/nodes/node_status_executor_test.go: -------------------------------------------------------------------------------- 1 | package nodes 2 | 3 | import ( 4 | "github.com/shirou/gopsutil/v3/cpu" 5 | "testing" 6 | "time" 7 | ) 8 | 9 | func TestNodeStatusExecutor_CPU(t *testing.T) { 10 | countLogicCPU, err := cpu.Counts(true) 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | t.Log("logic count:", countLogicCPU) 15 | 16 | countPhysicalCPU, err := cpu.Counts(false) 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | t.Log("physical count:", countPhysicalCPU) 21 | 22 | percents, err := cpu.Percent(100 * time.Millisecond, false) 23 | if err != nil { 24 | t.Fatal(err) 25 | } 26 | t.Log(percents) 27 | } 28 | -------------------------------------------------------------------------------- /internal/nodes/start_issue.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package nodes 4 | 5 | type StartIssue struct { 6 | Code string `json:"code"` 7 | Message string `json:"message"` 8 | Suggestion string `json:"suggestion"` 9 | } 10 | 11 | func NewStartIssue(code string, message string, suggestion string) *StartIssue { 12 | return &StartIssue{ 13 | Code: code, 14 | Message: message, 15 | Suggestion: suggestion, 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /internal/remotelogs/dao_interface.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package remotelogs 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" 7 | "github.com/iwind/TeaGo/dbs" 8 | ) 9 | 10 | type DAOInterface interface { 11 | CreateLog(tx *dbs.Tx, nodeRole nodeconfigs.NodeRole, nodeId int64, serverId int64, originId int64, level string, tag string, description string, createdAt int64, logType string, paramsJSON []byte) error 12 | } 13 | -------------------------------------------------------------------------------- /internal/rpc/services/service_admin_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package services 5 | 6 | import ( 7 | "context" 8 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 9 | "github.com/iwind/TeaGo/dbs" 10 | ) 11 | 12 | // ComposeAdminDashboard方法扩展 13 | func (this *AdminService) composeAdminDashboardExt(tx *dbs.Tx, ctx context.Context, result *pb.ComposeAdminDashboardResponse) error { 14 | return nil 15 | } 16 | -------------------------------------------------------------------------------- /internal/rpc/services/service_db_test.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | "github.com/iwind/TeaGo/dbs" 5 | "github.com/iwind/TeaGo/logs" 6 | "testing" 7 | ) 8 | 9 | func TestDBService_FindAllDBTables(t *testing.T) { 10 | db, err := dbs.Default() 11 | if err != nil { 12 | t.Fatal(err) 13 | } 14 | ones, _, err := db.FindPreparedOnes("SELECT * FROM information_schema.`TABLES` WHERE TABLE_SCHEMA=?", db.Name()) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | logs.PrintAsJSON(ones, t) 19 | } 20 | -------------------------------------------------------------------------------- /internal/rpc/services/service_http_access_log_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package services 5 | 6 | import "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 7 | 8 | func (this *HTTPAccessLogService) canWriteAccessLogsToDB() bool { 9 | return true 10 | } 11 | 12 | func (this *HTTPAccessLogService) writeAccessLogsToPolicy(pbAccessLogs []*pb.HTTPAccessLog) error { 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /internal/rpc/services/service_ping.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package services 4 | 5 | import ( 6 | "context" 7 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 8 | ) 9 | 10 | // PingService Ping服务 11 | // 用来测试连接是否可用 12 | type PingService struct { 13 | BaseService 14 | } 15 | 16 | // Ping 发起Ping 17 | func (this *PingService) Ping(ctx context.Context, req *pb.PingRequest) (*pb.PingResponse, error) { 18 | _, _, err := this.ValidateNodeId(ctx) 19 | if err != nil { 20 | return nil, err 21 | } 22 | return &pb.PingResponse{}, nil 23 | } 24 | -------------------------------------------------------------------------------- /internal/rpc/services/service_server_community.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | //go:build !plus 3 | // +build !plus 4 | 5 | package services 6 | 7 | import ( 8 | "context" 9 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 10 | ) 11 | 12 | // UpdateServerUAM 修改服务UAM设置 13 | func (this *ServerService) UpdateServerUAM(ctx context.Context, req *pb.UpdateServerUAMRequest) (*pb.RPCSuccess, error) { 14 | return this.Success() 15 | } 16 | 17 | // FindEnabledServerUAM 查找服务UAM设置 18 | func (this *ServerService) FindEnabledServerUAM(ctx context.Context, req *pb.FindEnabledServerUAMRequest) (*pb.FindEnabledServerUAMResponse, error) { 19 | return &pb.FindEnabledServerUAMResponse{ 20 | UamJSON: nil, 21 | }, nil 22 | } 23 | -------------------------------------------------------------------------------- /internal/rpc/services/service_server_http_firewall_daily_stat_test.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" 5 | "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" 6 | "github.com/iwind/TeaGo/dbs" 7 | "github.com/iwind/TeaGo/logs" 8 | "testing" 9 | ) 10 | 11 | func TestServerHTTPFirewallDailyStatService_ComposeServerHTTPFirewallDashboard(t *testing.T) { 12 | dbs.NotifyReady() 13 | 14 | service := new(ServerHTTPFirewallDailyStatService) 15 | resp, err := service.ComposeServerHTTPFirewallDashboard(rpcutils.NewMockAdminNodeContext(1), &pb.ComposeServerHTTPFirewallDashboardRequest{}) 16 | if err != nil { 17 | t.Fatal(err) 18 | } 19 | logs.PrintAsJSON(resp, t) 20 | } 21 | -------------------------------------------------------------------------------- /internal/rpc/utils/mock_node.go: -------------------------------------------------------------------------------- 1 | package rpcutils 2 | 3 | import "context" 4 | 5 | type MockNodeContext struct { 6 | context.Context 7 | 8 | NodeId int64 9 | } 10 | 11 | func NewMockNodeContext(nodeId int64) context.Context { 12 | return &MockNodeContext{NodeId: nodeId} 13 | } 14 | -------------------------------------------------------------------------------- /internal/rpc/utils/mock_node_admin.go: -------------------------------------------------------------------------------- 1 | package rpcutils 2 | 3 | import "context" 4 | 5 | type MockAdminNodeContext struct { 6 | context.Context 7 | 8 | AdminId int64 9 | } 10 | 11 | func NewMockAdminNodeContext(adminId int64) context.Context { 12 | return &MockAdminNodeContext{AdminId: adminId} 13 | } 14 | -------------------------------------------------------------------------------- /internal/rpc/utils/utils.go: -------------------------------------------------------------------------------- 1 | package rpcutils 2 | 3 | import ( 4 | "errors" 5 | "fmt" 6 | ) 7 | 8 | type UserType = string 9 | 10 | const ( 11 | UserTypeNone = "none" 12 | UserTypeAdmin = "admin" 13 | UserTypeUser = "user" 14 | UserTypeProvider = "provider" 15 | UserTypeNode = "node" 16 | UserTypeCluster = "cluster" 17 | UserTypeStat = "stat" 18 | UserTypeDNS = "dns" 19 | UserTypeLog = "log" 20 | UserTypeAPI = "api" 21 | UserTypeAuthority = "authority" 22 | UserTypeReport = "report" 23 | ) 24 | 25 | // Wrap 包装错误 26 | func Wrap(description string, err error) error { 27 | if err == nil { 28 | return errors.New(description) 29 | } 30 | return fmt.Errorf("%s: %w", description, err) 31 | } 32 | -------------------------------------------------------------------------------- /internal/setup/config.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | type Config struct { 4 | APINodeProtocol string 5 | APINodeHost string 6 | APINodePort int 7 | } 8 | -------------------------------------------------------------------------------- /internal/setup/setup_test.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | import ( 4 | _ "github.com/iwind/TeaGo/bootstrap" 5 | "testing" 6 | ) 7 | 8 | func TestSetup_Run(t *testing.T) { 9 | setup := NewSetup(&Config{ 10 | APINodeProtocol: "http", 11 | APINodeHost: "127.0.0.1", 12 | APINodePort: 8003, 13 | }) 14 | err := setup.Run() 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("OK") 19 | } 20 | -------------------------------------------------------------------------------- /internal/setup/sql.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | import ( 4 | _ "embed" 5 | ) 6 | 7 | //go:embed sql.json 8 | var sqlData []byte 9 | -------------------------------------------------------------------------------- /internal/setup/sql_dump_result.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | import "strings" 4 | 5 | type SQLDumpResult struct { 6 | Tables []*SQLTable `json:"tables"` 7 | } 8 | 9 | func (this *SQLDumpResult) FindTable(tableName string) *SQLTable { 10 | for _, table := range this.Tables { 11 | if strings.EqualFold(table.Name, tableName) { 12 | return table 13 | } 14 | } 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /internal/setup/sql_executor_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package setup 5 | 6 | import ( 7 | "github.com/iwind/TeaGo/dbs" 8 | ) 9 | 10 | // 检查自建DNS全局设置 11 | func (this *SQLExecutor) checkNS(db *dbs.DB) error { 12 | return nil 13 | } 14 | -------------------------------------------------------------------------------- /internal/setup/sql_field.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | import "regexp" 4 | 5 | type SQLField struct { 6 | Name string `json:"name"` 7 | Definition string `json:"definition"` 8 | } 9 | 10 | func (this *SQLField) EqualDefinition(definition2 string) bool { 11 | if this.Definition == definition2 { 12 | return true 13 | } 14 | 15 | // 针对MySQL v8.0.17以后 16 | def1 := regexp.MustCompile(`(?)(tinyint|smallint|mediumint|int|bigint)\(\d+\)`). 17 | ReplaceAllString(this.Definition, "${1}") 18 | return def1 == definition2 19 | } 20 | -------------------------------------------------------------------------------- /internal/setup/sql_index.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | type SQLIndex struct { 4 | Name string `json:"name"` 5 | Definition string `json:"definition"` 6 | } 7 | -------------------------------------------------------------------------------- /internal/setup/sql_records_table.go: -------------------------------------------------------------------------------- 1 | package setup 2 | 3 | type SQLRecordsTable struct { 4 | TableName string 5 | UniqueFields []string 6 | ExceptFields []string 7 | IgnoreId bool // 是否可以排除ID 8 | } 9 | -------------------------------------------------------------------------------- /internal/tasks/dns_task_executor_test.go: -------------------------------------------------------------------------------- 1 | //go:build !plus 2 | 3 | package tasks_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | "time" 10 | ) 11 | 12 | func TestDNSTaskExecutor_Loop(t *testing.T) { 13 | dbs.NotifyReady() 14 | 15 | var task = tasks.NewDNSTaskExecutor(10 * time.Second) 16 | err := task.Loop() 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | t.Log("ok") 21 | } 22 | -------------------------------------------------------------------------------- /internal/tasks/health_check_cluster_task_test.go: -------------------------------------------------------------------------------- 1 | package tasks_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | ) 8 | 9 | func TestHealthCheckClusterTask_Loop(t *testing.T) { 10 | dbs.NotifyReady() 11 | var task = tasks.NewHealthCheckClusterTask(10, nil) 12 | err := task.Loop() 13 | if err != nil { 14 | t.Fatal(err) 15 | } 16 | t.Log("ok") 17 | } 18 | -------------------------------------------------------------------------------- /internal/tasks/health_check_executor_ext.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !plus 3 | 4 | package tasks 5 | 6 | // 触发节点动作 7 | func (this *HealthCheckExecutor) fireNodeActions(nodeId int64) error { 8 | return nil 9 | } 10 | -------------------------------------------------------------------------------- /internal/tasks/health_check_executor_test.go: -------------------------------------------------------------------------------- 1 | //go:build plus 2 | // +build plus 3 | 4 | package tasks_test 5 | 6 | import ( 7 | teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" 8 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 9 | "github.com/iwind/TeaGo/dbs" 10 | "testing" 11 | ) 12 | 13 | func TestHealthCheckExecutor_Run(t *testing.T) { 14 | teaconst.IsPlus = true 15 | dbs.NotifyReady() 16 | 17 | var executor = tasks.NewHealthCheckExecutor(42) 18 | results, err := executor.Run() 19 | if err != nil { 20 | t.Fatal(err) 21 | } 22 | for _, result := range results { 23 | t.Log(result.Node.Name, "addr:", result.NodeAddr, "isOk:", result.IsOk, "error:", result.Error) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /internal/tasks/health_check_result.go: -------------------------------------------------------------------------------- 1 | package tasks 2 | 3 | import "github.com/TeaOSLab/EdgeAPI/internal/db/models" 4 | 5 | // HealthCheckResult 健康检查结果 6 | type HealthCheckResult struct { 7 | Node *models.Node 8 | NodeAddr string // 节点IP地址 9 | NodeAddrId int64 // 节点IP地址ID 10 | IsOk bool 11 | Error string 12 | CostMs float64 13 | } 14 | -------------------------------------------------------------------------------- /internal/tasks/health_check_task_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package tasks_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 7 | "testing" 8 | "time" 9 | ) 10 | 11 | func TestNewHealthCheckTask(t *testing.T) { 12 | var task = tasks.NewHealthCheckTask(1 * time.Minute) 13 | err := task.Loop() 14 | if err != nil { 15 | t.Fatal(err) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /internal/tasks/log_task_test.go: -------------------------------------------------------------------------------- 1 | package tasks_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestLogTask_LoopClean(t *testing.T) { 11 | dbs.NotifyReady() 12 | 13 | var task = tasks.NewLogTask(24*time.Hour, 1*time.Minute) 14 | err := task.LoopClean() 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | 21 | func TestLogTask_LoopMonitor(t *testing.T) { 22 | dbs.NotifyReady() 23 | 24 | var task = tasks.NewLogTask(24*time.Hour, 1*time.Minute) 25 | err := task.LoopMonitor() 26 | if err != nil { 27 | t.Fatal(err) 28 | } 29 | t.Log("ok") 30 | } 31 | -------------------------------------------------------------------------------- /internal/tasks/monitor_item_value_task_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package tasks_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | "time" 10 | ) 11 | 12 | func TestMonitorItemValueTask_Loop(t *testing.T) { 13 | dbs.NotifyReady() 14 | 15 | var task = tasks.NewMonitorItemValueTask(1 * time.Minute) 16 | err := task.Loop() 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | t.Log("ok") 21 | } 22 | -------------------------------------------------------------------------------- /internal/tasks/node_log_cleaner_task_test.go: -------------------------------------------------------------------------------- 1 | package tasks_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestNodeLogCleaner_loop(t *testing.T) { 11 | dbs.NotifyReady() 12 | 13 | var cleaner = tasks.NewNodeLogCleanerTask(24 * time.Hour) 14 | err := cleaner.Loop() 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("OK") 19 | } 20 | -------------------------------------------------------------------------------- /internal/tasks/server_access_log_cleaner_test.go: -------------------------------------------------------------------------------- 1 | package tasks_test 2 | 3 | import ( 4 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 5 | "github.com/iwind/TeaGo/dbs" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestServerAccessLogCleaner_Loop(t *testing.T) { 11 | dbs.NotifyReady() 12 | 13 | var task = tasks.NewServerAccessLogCleaner(24 * time.Hour) 14 | err := task.Loop() 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | t.Log("ok") 19 | } 20 | -------------------------------------------------------------------------------- /internal/tasks/ssl_cert_update_ocsp_task_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package tasks_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/tasks" 7 | "github.com/iwind/TeaGo/dbs" 8 | "testing" 9 | "time" 10 | ) 11 | 12 | func TestSSLCertUpdateOCSPTask_Loop(t *testing.T) { 13 | dbs.NotifyReady() 14 | 15 | var task = tasks.NewSSLCertUpdateOCSPTask(1 * time.Minute) 16 | err := task.Loop() 17 | if err != nil { 18 | t.Fatal(err) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /internal/tasks/task_base.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package tasks 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/db/models" 7 | "github.com/TeaOSLab/EdgeAPI/internal/remotelogs" 8 | ) 9 | 10 | type BaseTask struct { 11 | } 12 | 13 | func (this *BaseTask) logErr(taskType string, errString string) { 14 | remotelogs.Error("TASK", "run '"+taskType+"' failed: "+errString) 15 | } 16 | 17 | func (this *BaseTask) IsPrimaryNode() bool { 18 | return models.SharedAPINodeDAO.CheckAPINodeIsPrimaryWithoutErr() 19 | } 20 | -------------------------------------------------------------------------------- /internal/tasks/task_interface.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package tasks 4 | 5 | type TaskInterface interface { 6 | Start() error 7 | Loop() error 8 | Stop() error 9 | } 10 | -------------------------------------------------------------------------------- /internal/utils/cache_map_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package utils 4 | 5 | import ( 6 | "github.com/iwind/TeaGo/assert" 7 | "testing" 8 | ) 9 | 10 | func TestNewCacheMap(t *testing.T) { 11 | var a = assert.NewAssertion(t) 12 | 13 | m := NewCacheMap() 14 | { 15 | m.Put("Hello", "World") 16 | v, ok := m.Get("Hello") 17 | a.IsTrue(ok) 18 | a.IsTrue(v == "World") 19 | } 20 | 21 | { 22 | v, ok := m.Get("Hello1") 23 | a.IsFalse(ok) 24 | a.IsTrue(v == nil) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /internal/utils/compare.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | import ( 6 | "bytes" 7 | "encoding/json" 8 | ) 9 | 10 | // EqualConfig 使用JSON对比配置 11 | func EqualConfig(config1 any, config2 any) bool { 12 | config1JSON, _ := json.Marshal(config1) 13 | config2JSON, _ := json.Marshal(config2) 14 | return bytes.Equal(config1JSON, config2JSON) 15 | } 16 | -------------------------------------------------------------------------------- /internal/utils/domain.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | import ( 6 | "regexp" 7 | "strings" 8 | ) 9 | 10 | var cacheKeyDomainReg1 = regexp.MustCompile(`^(?i)(?:http|https)://([\w-.*]+)`) // 这里支持 *.example.com 11 | var cacheKeyDomainReg2 = regexp.MustCompile(`^([\w-.]+)`) 12 | 13 | // ParseDomainFromKey 从Key中获取域名 14 | func ParseDomainFromKey(key string) (domain string) { 15 | var pieces = cacheKeyDomainReg1.FindStringSubmatch(key) 16 | if len(pieces) > 1 { 17 | return strings.ToLower(pieces[1]) 18 | } 19 | 20 | pieces = cacheKeyDomainReg2.FindStringSubmatch(key) 21 | if len(pieces) > 1 { 22 | return strings.ToLower(pieces[1]) 23 | } 24 | 25 | return "" 26 | } 27 | -------------------------------------------------------------------------------- /internal/utils/email.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | import "regexp" 6 | 7 | var emailReg = regexp.MustCompile(`(?i)^[a-z\d]+([._+-]*[a-z\d]+)*@([a-z\d]+[a-z\d-]*[a-z\d]+\.)+[a-z\d]+$`) 8 | 9 | // ValidateEmail 校验电子邮箱格式 10 | func ValidateEmail(email string) bool { 11 | return emailReg.MatchString(email) 12 | } 13 | -------------------------------------------------------------------------------- /internal/utils/errors.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "github.com/iwind/TeaGo/logs" 5 | ) 6 | 7 | // 打印错误 8 | func PrintError(err error) { 9 | // TODO 记录调用的文件名、行数 10 | logs.Println("[ERROR]" + err.Error()) 11 | } 12 | -------------------------------------------------------------------------------- /internal/utils/exec/look_others.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | //go:build !linux 3 | 4 | package executils 5 | 6 | import "os/exec" 7 | 8 | func LookPath(file string) (string, error) { 9 | return exec.LookPath(file) 10 | } 11 | -------------------------------------------------------------------------------- /internal/utils/mobile.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | import "regexp" 6 | 7 | var mobileRegex = regexp.MustCompile(`^1\d{10}$`) 8 | 9 | // IsValidMobile validate mobile number 10 | func IsValidMobile(mobile string) bool { 11 | return mobileRegex.MatchString(mobile) 12 | } 13 | -------------------------------------------------------------------------------- /internal/utils/mobile_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils" 7 | "github.com/iwind/TeaGo/assert" 8 | "testing" 9 | ) 10 | 11 | func TestIsValidMobile(t *testing.T) { 12 | var a = assert.NewAssertion(t) 13 | a.IsFalse(utils.IsValidMobile("138")) 14 | a.IsFalse(utils.IsValidMobile("1382222")) 15 | a.IsFalse(utils.IsValidMobile("1381234567890")) 16 | a.IsTrue(utils.IsValidMobile("13812345678")) 17 | } 18 | -------------------------------------------------------------------------------- /internal/utils/progress.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | // Progress 进度表示 6 | type Progress struct { 7 | Name string `json:"name"` 8 | Description string `json:"description"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/utils/regexputils/expr.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package regexputils 4 | 5 | import "regexp" 6 | 7 | var ( 8 | YYYYMMDDHH = regexp.MustCompile(`^\d{10}$`) 9 | YYYYMMDD = regexp.MustCompile(`^\d{8}$`) 10 | YYYYMM = regexp.MustCompile(`^\d{6}$`) 11 | ) 12 | 13 | var ( 14 | HTTPProtocol = regexp.MustCompile("^(?i)(http|https)://") 15 | ) 16 | -------------------------------------------------------------------------------- /internal/utils/regexputils/expr_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package regexputils_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils/regexputils" 7 | "github.com/iwind/TeaGo/assert" 8 | "testing" 9 | ) 10 | 11 | func TestExpr(t *testing.T) { 12 | var a = assert.NewAssertion(t) 13 | 14 | a.IsTrue(regexputils.YYYYMMDD.MatchString("20221011")) 15 | a.IsFalse(regexputils.YYYYMMDD.MatchString("202210")) 16 | 17 | a.IsTrue(regexputils.YYYYMM.MatchString("202210")) 18 | a.IsFalse(regexputils.YYYYMM.MatchString("20221011")) 19 | } 20 | -------------------------------------------------------------------------------- /internal/utils/rlimit_darwin.go: -------------------------------------------------------------------------------- 1 | // +build darwin 2 | 3 | package utils 4 | 5 | import ( 6 | "syscall" 7 | ) 8 | 9 | // set resource limit 10 | func SetRLimit(limit uint64) error { 11 | rLimit := &syscall.Rlimit{} 12 | err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, rLimit) 13 | if err != nil { 14 | return err 15 | } 16 | 17 | if rLimit.Cur < limit { 18 | rLimit.Cur = limit 19 | } 20 | if rLimit.Max < limit { 21 | rLimit.Max = limit 22 | } 23 | return syscall.Setrlimit(syscall.RLIMIT_NOFILE, rLimit) 24 | } 25 | 26 | // set best resource limit value 27 | func SetSuitableRLimit() { 28 | _ = SetRLimit(4096 * 100) // 1M=100Files 29 | } 30 | -------------------------------------------------------------------------------- /internal/utils/rlimit_linux.go: -------------------------------------------------------------------------------- 1 | // +build linux 2 | 3 | package utils 4 | 5 | import ( 6 | "syscall" 7 | ) 8 | 9 | // set resource limit 10 | func SetRLimit(limit uint64) error { 11 | rLimit := &syscall.Rlimit{} 12 | err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, rLimit) 13 | if err != nil { 14 | return err 15 | } 16 | 17 | if rLimit.Cur < limit { 18 | rLimit.Cur = limit 19 | } 20 | if rLimit.Max < limit { 21 | rLimit.Max = limit 22 | } 23 | return syscall.Setrlimit(syscall.RLIMIT_NOFILE, rLimit) 24 | } 25 | 26 | // set best resource limit value 27 | func SetSuitableRLimit() { 28 | SetRLimit(4096 * 100) // 1M=100Files 29 | } 30 | -------------------------------------------------------------------------------- /internal/utils/rlimit_others.go: -------------------------------------------------------------------------------- 1 | // +build !linux,!darwin 2 | 3 | package utils 4 | 5 | // set resource limit 6 | func SetRLimit(limit uint64) error { 7 | return nil 8 | } 9 | 10 | // set best resource limit value 11 | func SetSuitableRLimit() { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /internal/utils/service_others.go: -------------------------------------------------------------------------------- 1 | // +build !linux,!windows 2 | 3 | package utils 4 | 5 | // 安装服务 6 | func (this *ServiceManager) Install(exePath string, args []string) error { 7 | return nil 8 | } 9 | 10 | // 启动服务 11 | func (this *ServiceManager) Start() error { 12 | return nil 13 | } 14 | 15 | // 删除服务 16 | func (this *ServiceManager) Uninstall() error { 17 | return nil 18 | } 19 | -------------------------------------------------------------------------------- /internal/utils/service_test.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" 5 | "testing" 6 | ) 7 | 8 | func TestServiceManager_Log(t *testing.T) { 9 | manager := NewServiceManager(teaconst.ProductName, teaconst.ProductName+" Server") 10 | manager.Log("Hello, World") 11 | manager.LogError("Hello, World") 12 | } 13 | -------------------------------------------------------------------------------- /internal/utils/sha1.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils 4 | 5 | import ( 6 | "crypto/sha1" 7 | "fmt" 8 | "github.com/iwind/TeaGo/rands" 9 | "github.com/iwind/TeaGo/types" 10 | "sync/atomic" 11 | "time" 12 | ) 13 | 14 | const sha1RandomPrefix = "SHA1_RANDOM" 15 | 16 | var sha1Id int64 = 0 17 | 18 | func Sha1RandomString() string { 19 | var s = sha1RandomPrefix + types.String(time.Now().UnixNano()) + "@" + types.String(rands.Int64()) + "@" + types.String(atomic.AddInt64(&sha1Id, 1)) 20 | return fmt.Sprintf("%x", sha1.Sum([]byte(s))) 21 | } 22 | -------------------------------------------------------------------------------- /internal/utils/sha1_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package utils_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils" 7 | "github.com/iwind/TeaGo/types" 8 | "testing" 9 | ) 10 | 11 | func TestSha1Random(t *testing.T) { 12 | for i := 0; i < 10; i++ { 13 | var s = utils.Sha1RandomString() 14 | t.Log("["+types.String(len(s))+"]", s) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /internal/utils/sizes/sizes.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package sizes 4 | 5 | const ( 6 | K int64 = 1024 7 | M = 1024 * K 8 | G = 1024 * M 9 | T = 1024 * G 10 | ) 11 | -------------------------------------------------------------------------------- /internal/utils/sizes/sizes_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package sizes_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils/sizes" 7 | "github.com/iwind/TeaGo/assert" 8 | "testing" 9 | ) 10 | 11 | func TestSizes(t *testing.T) { 12 | var a = assert.NewAssertion(t) 13 | a.IsTrue(sizes.K == 1024) 14 | a.IsTrue(sizes.M == 1024*1024) 15 | a.IsTrue(sizes.G == 1024*1024*1024) 16 | a.IsTrue(sizes.T == 1024*1024*1024*1024) 17 | } 18 | -------------------------------------------------------------------------------- /internal/utils/system.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package utils 4 | 5 | import ( 6 | "github.com/shirou/gopsutil/v3/mem" 7 | ) 8 | 9 | var systemTotalMemory = -1 10 | 11 | func init() { 12 | _ = SystemMemoryGB() 13 | } 14 | 15 | func SystemMemoryGB() int { 16 | if systemTotalMemory > 0 { 17 | return systemTotalMemory 18 | } 19 | 20 | stat, err := mem.VirtualMemory() 21 | if err != nil { 22 | return 0 23 | } 24 | 25 | systemTotalMemory = int(stat.Total / 1024 / 1024 / 1024) 26 | return systemTotalMemory 27 | } 28 | -------------------------------------------------------------------------------- /internal/utils/system_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package utils_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils" 7 | "testing" 8 | ) 9 | 10 | func TestSystemMemoryGB(t *testing.T) { 11 | t.Log(utils.SystemMemoryGB()) 12 | t.Log(utils.SystemMemoryGB()) 13 | t.Log(utils.SystemMemoryGB()) 14 | } 15 | -------------------------------------------------------------------------------- /internal/utils/taskutils/concurrent_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . 2 | 3 | package taskutils_test 4 | 5 | import ( 6 | "github.com/TeaOSLab/EdgeAPI/internal/utils/taskutils" 7 | "sync" 8 | "testing" 9 | ) 10 | 11 | func TestRunConcurrent(t *testing.T) { 12 | err := taskutils.RunConcurrent([]string{"a", "b", "c", "d", "e"}, 3, func(task any, locker *sync.RWMutex) { 13 | t.Log("run", task) 14 | }) 15 | if err != nil { 16 | t.Fatal(err) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /internal/utils/ticker.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "time" 4 | 5 | type Ticker struct { 6 | raw *time.Ticker 7 | isDone bool 8 | done chan bool 9 | } 10 | 11 | func NewTicker(duration time.Duration) *Ticker { 12 | return &Ticker{ 13 | raw: time.NewTicker(duration), 14 | done: make(chan bool), 15 | } 16 | } 17 | 18 | func (this *Ticker) Wait() bool { 19 | select { 20 | case <-this.raw.C: 21 | return true 22 | case <-this.done: 23 | this.isDone = true 24 | return false 25 | } 26 | } 27 | 28 | func (this *Ticker) Stop() { 29 | if this.isDone { 30 | return 31 | } 32 | this.done <- true 33 | this.raw.Stop() 34 | } 35 | -------------------------------------------------------------------------------- /internal/utils/ttlcache/item.go: -------------------------------------------------------------------------------- 1 | package ttlcache 2 | 3 | type Item struct { 4 | Value interface{} 5 | expiredAt int64 6 | } 7 | -------------------------------------------------------------------------------- /internal/utils/ttlcache/option.go: -------------------------------------------------------------------------------- 1 | package ttlcache 2 | 3 | type OptionInterface interface { 4 | } 5 | 6 | type PiecesOption struct { 7 | Count int 8 | } 9 | 10 | func NewPiecesOption(count int) *PiecesOption { 11 | return &PiecesOption{Count: count} 12 | } 13 | 14 | type MaxItemsOption struct { 15 | Count int 16 | } 17 | 18 | func NewMaxItemsOption(count int) *MaxItemsOption { 19 | return &MaxItemsOption{Count: count} 20 | } 21 | -------------------------------------------------------------------------------- /internal/utils/ttlcache/utils.go: -------------------------------------------------------------------------------- 1 | package ttlcache 2 | 3 | import "github.com/cespare/xxhash" 4 | 5 | func HashKey(key []byte) uint64 { 6 | return xxhash.Sum64(key) 7 | } 8 | -------------------------------------------------------------------------------- /internal/utils/ttlcache/utils_test.go: -------------------------------------------------------------------------------- 1 | package ttlcache 2 | 3 | import ( 4 | "runtime" 5 | "testing" 6 | ) 7 | 8 | func BenchmarkHashKey(b *testing.B) { 9 | runtime.GOMAXPROCS(1) 10 | for i := 0; i < b.N; i++ { 11 | HashKey([]byte("HELLO,WORLDHELLO,WORLDHELLO,WORLDHELLO,WORLDHELLO,WORLDHELLO,WORLD")) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /internal/utils/unzip_test.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "github.com/iwind/TeaGo/Tea" 5 | _ "github.com/iwind/TeaGo/bootstrap" 6 | "testing" 7 | ) 8 | 9 | func TestUnzip_Run(t *testing.T) { 10 | unzip := NewUnzip(Tea.Root+"/deploy/edge-node-v0.0.1.zip", Tea.Root+"/deploy/") 11 | err := unzip.Run() 12 | if err != nil { 13 | t.Fatal(err) 14 | } 15 | t.Log("OK") 16 | } 17 | -------------------------------------------------------------------------------- /internal/utils/version.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "encoding/binary" 5 | "net" 6 | "strings" 7 | ) 8 | 9 | // VersionToLong 计算版本代号 10 | func VersionToLong(version string) uint32 { 11 | var countDots = strings.Count(version, ".") 12 | if countDots == 2 { 13 | version += ".0" 14 | } else if countDots == 1 { 15 | version += ".0.0" 16 | } else if countDots == 0 { 17 | version += ".0.0.0" 18 | } 19 | var ip = net.ParseIP(version) 20 | if ip == nil || ip.To4() == nil { 21 | return 0 22 | } 23 | return binary.BigEndian.Uint32(ip.To4()) 24 | } 25 | -------------------------------------------------------------------------------- /internal/utils/version_test.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "testing" 4 | 5 | func TestNodeStatus_ComputerBuildVersionCode(t *testing.T) { 6 | { 7 | t.Log("", VersionToLong("")) 8 | } 9 | 10 | { 11 | t.Log("0.0.6", VersionToLong("0.0.6")) 12 | } 13 | 14 | { 15 | t.Log("0.0.6.1", VersionToLong("0.0.6.1")) 16 | } 17 | 18 | { 19 | t.Log("0.0.7", VersionToLong("0.0.7")) 20 | } 21 | 22 | { 23 | t.Log("0.7", VersionToLong("0.7")) 24 | } 25 | { 26 | t.Log("7", VersionToLong("7")) 27 | } 28 | { 29 | t.Log("7.0.1", VersionToLong("7.0.1")) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /internal/zero/zero.go: -------------------------------------------------------------------------------- 1 | // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. 2 | 3 | package zero 4 | 5 | type Zero = struct{} 6 | 7 | func New() Zero { 8 | return Zero{} 9 | } 10 | --------------------------------------------------------------------------------