Showing preview only (3,633K chars total). Download the full file or copy to clipboard to get everything.
Repository: crawlab-team/crawlab
Branch: main
Commit: 0485310def8b
Files: 766
Total size: 3.3 MB
Directory structure:
gitextract_torsj7ae/
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report_zh.md
│ │ ├── feature_request.md
│ │ └── feature_request_zh.md
│ └── workflows/
│ ├── docker-crawlab-tencent.yml
│ └── docker-crawlab.yml
├── .gitignore
├── CHANGELOG-zh.md
├── CHANGELOG.md
├── DISCLAIMER-zh.md
├── DISCLAIMER.md
├── Dockerfile
├── LICENSE
├── README-zh.md
├── README.md
├── SECURITY.md
├── backend/
│ ├── .air.master.conf
│ ├── .air.worker.conf
│ ├── .editorconfig
│ ├── Dockerfile
│ ├── README.md
│ ├── Taskfile.yml
│ ├── bin/
│ │ ├── semver.sh
│ │ ├── update-deps.sh
│ │ └── update-ver.sh
│ ├── conf/
│ │ └── config.yml
│ ├── go.mod
│ ├── go.mod.dev
│ ├── go.mod.local
│ ├── go.sum
│ ├── main.go
│ └── test/
│ ├── config-master.json
│ ├── config-worker-01.json
│ ├── config-worker-02.json
│ ├── config-worker-03.json
│ └── config-worker-invalid-auth-key.json
├── bin/
│ ├── docker-init.sh
│ ├── gen-ver.sh
│ └── update_docker_js_api_address.py
├── changelog/
│ ├── v0.6.0-zh.md
│ └── v0.6.0.md
├── core/
│ ├── .editorconfig
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── apps/
│ │ ├── api_v2.go
│ │ ├── docker.go
│ │ ├── interfaces.go
│ │ ├── server_v2.go
│ │ └── utils.go
│ ├── cmd/
│ │ ├── root.go
│ │ ├── server.go
│ │ └── server_test.go
│ ├── color/
│ │ └── service.go
│ ├── config/
│ │ ├── base.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ └── path.go
│ ├── constants/
│ │ ├── action.go
│ │ ├── anchor.go
│ │ ├── auth.go
│ │ ├── cache.go
│ │ ├── channels.go
│ │ ├── common.go
│ │ ├── config_spider.go
│ │ ├── data_collection.go
│ │ ├── data_field.go
│ │ ├── database.go
│ │ ├── delegate.go
│ │ ├── ds.go
│ │ ├── encrypt.go
│ │ ├── errors.go
│ │ ├── event.go
│ │ ├── export.go
│ │ ├── file.go
│ │ ├── filer.go
│ │ ├── filter.go
│ │ ├── git.go
│ │ ├── grpc.go
│ │ ├── http.go
│ │ ├── log.go
│ │ ├── message.go
│ │ ├── node.go
│ │ ├── notification.go
│ │ ├── pagination.go
│ │ ├── register.go
│ │ ├── results.go
│ │ ├── rpc.go
│ │ ├── schedule.go
│ │ ├── scrapy.go
│ │ ├── signal.go
│ │ ├── sort.go
│ │ ├── system.go
│ │ ├── task.go
│ │ ├── user.go
│ │ └── variable.go
│ ├── container/
│ │ └── container.go
│ ├── controllers/
│ │ ├── base_file_v2.go
│ │ ├── base_v2.go
│ │ ├── base_v2_test.go
│ │ ├── export_v2.go
│ │ ├── filter_v2.go
│ │ ├── http.go
│ │ ├── login_v2.go
│ │ ├── project_v2.go
│ │ ├── result_v2.go
│ │ ├── router_v2.go
│ │ ├── router_v2_test.go
│ │ ├── schedule_v2.go
│ │ ├── setting_v2.go
│ │ ├── spider_v2.go
│ │ ├── spider_v2_test.go
│ │ ├── stats_v2.go
│ │ ├── sync_v2.go
│ │ ├── system_info_v2.go
│ │ ├── task_v2.go
│ │ ├── token_v2.go
│ │ ├── user_v2.go
│ │ ├── user_v2_test.go
│ │ ├── utils_context.go
│ │ ├── utils_filter.go
│ │ ├── utils_http.go
│ │ ├── utils_pagination.go
│ │ ├── utils_sort.go
│ │ └── ws_writer.go
│ ├── data/
│ │ └── colors.go
│ ├── database/
│ │ ├── entity/
│ │ │ └── database.go
│ │ ├── interfaces/
│ │ │ ├── database_registry_service.go
│ │ │ └── database_service.go
│ │ └── registry_service.go
│ ├── docker-compose.yml
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── api/
│ │ │ ├── index.html
│ │ │ └── openapi.yaml
│ │ ├── package.json
│ │ └── scripts/
│ │ └── publish.js
│ ├── ds/
│ │ ├── cockroachdb.go
│ │ ├── default.go
│ │ ├── es.go
│ │ ├── kafka.go
│ │ ├── mongo.go
│ │ ├── mssql.go
│ │ ├── mssql_test.go
│ │ ├── mysql.go
│ │ ├── options.go
│ │ ├── postgresql.go
│ │ ├── service.go
│ │ ├── sql.go
│ │ ├── sql_options.go
│ │ └── sqlite.go
│ ├── entity/
│ │ ├── address.go
│ │ ├── color.go
│ │ ├── common.go
│ │ ├── config_spider.go
│ │ ├── data_field.go
│ │ ├── dependency.go
│ │ ├── doc.go
│ │ ├── es.go
│ │ ├── event.go
│ │ ├── export.go
│ │ ├── filter.go
│ │ ├── filter_select_option.go
│ │ ├── fs_file_info.go
│ │ ├── git.go
│ │ ├── grpc_base_service_message.go
│ │ ├── grpc_base_service_params.go
│ │ ├── grpc_delegate_message.go
│ │ ├── grpc_event_service_message.go
│ │ ├── grpc_subscribe.go
│ │ ├── http.go
│ │ ├── model_delegate.go
│ │ ├── model_info.go
│ │ ├── node.go
│ │ ├── notification_variable.go
│ │ ├── pagination.go
│ │ ├── result.go
│ │ ├── rpc.go
│ │ ├── sort.go
│ │ ├── spider.go
│ │ ├── stats.go
│ │ ├── system_info.go
│ │ ├── task.go
│ │ ├── translation.go
│ │ ├── ttl_map.go
│ │ └── version.go
│ ├── errors/
│ │ ├── base.go
│ │ ├── controller.go
│ │ ├── ds.go
│ │ ├── event.go
│ │ ├── filter.go
│ │ ├── fs.go
│ │ ├── git.go
│ │ ├── grpc.go
│ │ ├── http.go
│ │ ├── model.go
│ │ ├── node.go
│ │ ├── process.go
│ │ ├── result.go
│ │ ├── schedule.go
│ │ ├── spider.go
│ │ ├── stats.go
│ │ ├── store.go
│ │ ├── task.go
│ │ └── user.go
│ ├── event/
│ │ ├── func.go
│ │ ├── options.go
│ │ └── service.go
│ ├── export/
│ │ ├── csv_service.go
│ │ ├── csv_service_test.go
│ │ └── json_service.go
│ ├── fs/
│ │ ├── default.go
│ │ ├── service_v2.go
│ │ └── service_v2_test.go
│ ├── go.mod
│ ├── go.sum
│ ├── grpc/
│ │ ├── client/
│ │ │ ├── client.go
│ │ │ ├── client_v2.go
│ │ │ ├── options.go
│ │ │ ├── pool.go
│ │ │ └── utils_proto.go
│ │ ├── middlewares/
│ │ │ └── auth_token.go
│ │ ├── payload/
│ │ │ └── model_service_v2_payload.go
│ │ └── server/
│ │ ├── dependencies_server_v2.go
│ │ ├── message_server.go
│ │ ├── metrics_server_v2.go
│ │ ├── model_base_service_binder.go
│ │ ├── model_base_service_server.go
│ │ ├── model_base_service_v2_server.go
│ │ ├── model_delegate_binder.go
│ │ ├── model_delegate_server.go
│ │ ├── node_server.go
│ │ ├── node_server_v2.go
│ │ ├── server_v2.go
│ │ ├── task_server_v2.go
│ │ └── utils_handle.go
│ ├── i18n/
│ │ └── service.go
│ ├── interfaces/
│ │ ├── address.go
│ │ ├── color.go
│ │ ├── color_service.go
│ │ ├── controller_params.go
│ │ ├── data_source_service.go
│ │ ├── entity.go
│ │ ├── event_data.go
│ │ ├── event_service.go
│ │ ├── export.go
│ │ ├── export_service.go
│ │ ├── filter.go
│ │ ├── filter_condition.go
│ │ ├── fs_file_info.go
│ │ ├── fs_service.go
│ │ ├── fs_service_options.go
│ │ ├── fs_service_v2.go
│ │ ├── grpc_base.go
│ │ ├── grpc_base_service_params.go
│ │ ├── grpc_client.go
│ │ ├── grpc_client_model_base_service.go
│ │ ├── grpc_client_model_delegate.go
│ │ ├── grpc_client_model_environment_service.go
│ │ ├── grpc_client_model_node_service.go
│ │ ├── grpc_client_model_service.go
│ │ ├── grpc_client_model_spider_service.go
│ │ ├── grpc_client_model_task_service.go
│ │ ├── grpc_client_model_task_stat_service.go
│ │ ├── grpc_client_pool.go
│ │ ├── grpc_model_base_service_message.go
│ │ ├── grpc_model_binder.go
│ │ ├── grpc_model_delegate_message.go
│ │ ├── grpc_model_list_binder.go
│ │ ├── grpc_server.go
│ │ ├── grpc_stream.go
│ │ ├── grpc_subscribe.go
│ │ ├── i18n_service.go
│ │ ├── injectable.go
│ │ ├── list.go
│ │ ├── model.go
│ │ ├── model_artifact.go
│ │ ├── model_artifact_sys.go
│ │ ├── model_base_service.go
│ │ ├── model_binder.go
│ │ ├── model_delegate.go
│ │ ├── model_environment.go
│ │ ├── model_extra_value.go
│ │ ├── model_git.go
│ │ ├── model_list_binder.go
│ │ ├── model_node.go
│ │ ├── model_node_delegate.go
│ │ ├── model_permission.go
│ │ ├── model_result.go
│ │ ├── model_role.go
│ │ ├── model_schedule.go
│ │ ├── model_service_v2.go
│ │ ├── model_spider.go
│ │ ├── model_tag.go
│ │ ├── model_task.go
│ │ ├── model_task_stat.go
│ │ ├── model_user.go
│ │ ├── model_user_group.go
│ │ ├── module.go
│ │ ├── node_config_service.go
│ │ ├── node_master_service.go
│ │ ├── node_service.go
│ │ ├── node_service_option.go
│ │ ├── node_worker_service.go
│ │ ├── options.go
│ │ ├── process_daemon.go
│ │ ├── provide.go
│ │ ├── result_service.go
│ │ ├── result_service_mongo.go
│ │ ├── result_service_registry.go
│ │ ├── schedule_service.go
│ │ ├── spider_admin_service.go
│ │ ├── spider_service_options.go
│ │ ├── stats_service.go
│ │ ├── task_base_service.go
│ │ ├── task_handler_service.go
│ │ ├── task_hook_service.go
│ │ ├── task_runner.go
│ │ ├── task_scheduler_service.go
│ │ ├── task_stats_service.go
│ │ ├── test.go
│ │ ├── translation.go
│ │ ├── user_service.go
│ │ ├── user_service_options.go
│ │ ├── with_address.go
│ │ ├── with_config_path.go
│ │ └── with_model_id.go
│ ├── main.go
│ ├── middlewares/
│ │ ├── auth.go
│ │ ├── auth_v2.go
│ │ ├── cors.go
│ │ ├── filer_auth.go
│ │ └── middlewares.go
│ ├── models/
│ │ ├── client/
│ │ │ ├── binder_basic.go
│ │ │ ├── binder_list.go
│ │ │ ├── model_base_service.go
│ │ │ ├── model_delegate.go
│ │ │ ├── model_environment_service.go
│ │ │ ├── model_node_delegate.go
│ │ │ ├── model_node_service.go
│ │ │ ├── model_service.go
│ │ │ ├── model_service_v2.go
│ │ │ ├── model_service_v2_test.go
│ │ │ ├── model_spider_service.go
│ │ │ ├── model_task_service.go
│ │ │ ├── model_task_stat_service.go
│ │ │ └── options.go
│ │ ├── common/
│ │ │ └── index_service_v2.go
│ │ ├── config_spider/
│ │ │ ├── common.go
│ │ │ └── scrapy.go
│ │ ├── delegate/
│ │ │ ├── base_test.go
│ │ │ ├── model.go
│ │ │ ├── model_node.go
│ │ │ ├── model_node_test.go
│ │ │ ├── model_role_test.go
│ │ │ ├── model_test.go
│ │ │ └── utils_event.go
│ │ ├── models/
│ │ │ ├── artifact.go
│ │ │ ├── artifact_sys.go
│ │ │ ├── base.go
│ │ │ ├── data_collection.go
│ │ │ ├── data_source.go
│ │ │ ├── dependency_setting.go
│ │ │ ├── environment.go
│ │ │ ├── extra_value.go
│ │ │ ├── git.go
│ │ │ ├── job.go
│ │ │ ├── node.go
│ │ │ ├── password.go
│ │ │ ├── permission.go
│ │ │ ├── project.go
│ │ │ ├── result.go
│ │ │ ├── role.go
│ │ │ ├── role_permission.go
│ │ │ ├── schedule.go
│ │ │ ├── setting.go
│ │ │ ├── spider.go
│ │ │ ├── spider_stat.go
│ │ │ ├── tag.go
│ │ │ ├── task.go
│ │ │ ├── task_queue_item.go
│ │ │ ├── task_stat.go
│ │ │ ├── token.go
│ │ │ ├── user.go
│ │ │ ├── user_role.go
│ │ │ ├── utils_binder_legacy.go
│ │ │ ├── utils_col.go
│ │ │ ├── utils_model_map.go
│ │ │ ├── utils_tag.go
│ │ │ ├── v2/
│ │ │ │ ├── base_v2.go
│ │ │ │ ├── data_collection_v2.go
│ │ │ │ ├── database_metric_v2.go
│ │ │ │ ├── database_v2.go
│ │ │ │ ├── dependency_log_v2.go
│ │ │ │ ├── dependency_setting_v2.go
│ │ │ │ ├── dependency_task_v2.go
│ │ │ │ ├── dependency_v2.go
│ │ │ │ ├── environment_v2.go
│ │ │ │ ├── git_v2.go
│ │ │ │ ├── metric_v2.go
│ │ │ │ ├── node_v2.go
│ │ │ │ ├── notification_alert_v2.go
│ │ │ │ ├── notification_channel_v2.go
│ │ │ │ ├── notification_request_v2.go
│ │ │ │ ├── notification_setting_v2.go
│ │ │ │ ├── permission_v2.go
│ │ │ │ ├── project_v2.go
│ │ │ │ ├── role_permission_v2.go
│ │ │ │ ├── role_v2.go
│ │ │ │ ├── schedule_v2.go
│ │ │ │ ├── setting_v2.go
│ │ │ │ ├── spider_stat_v2.go
│ │ │ │ ├── spider_v2.go
│ │ │ │ ├── task_queue_item_v2.go
│ │ │ │ ├── task_stat_v2.go
│ │ │ │ ├── task_v2.go
│ │ │ │ ├── test_v2.go
│ │ │ │ ├── token_v2.go
│ │ │ │ ├── user_role_v2.go
│ │ │ │ ├── user_v2.go
│ │ │ │ └── variable_v2.go
│ │ │ └── variable.go
│ │ └── service/
│ │ ├── artifact_service.go
│ │ ├── base_service.go
│ │ ├── base_service_v2.go
│ │ ├── base_service_v2_test.go
│ │ ├── binder_basic.go
│ │ ├── binder_list.go
│ │ ├── data_collection_service.go
│ │ ├── data_source_service.go
│ │ ├── dependency_setting_service.go
│ │ ├── environment_service.go
│ │ ├── extra_value_service.go
│ │ ├── git_service.go
│ │ ├── interface.go
│ │ ├── job_service.go
│ │ ├── node_service.go
│ │ ├── options.go
│ │ ├── password_service.go
│ │ ├── permission_service.go
│ │ ├── project_service.go
│ │ ├── role_permission_service.go
│ │ ├── role_service.go
│ │ ├── schedule_service.go
│ │ ├── service.go
│ │ ├── setting_service.go
│ │ ├── spider_service.go
│ │ ├── spider_stat_service.go
│ │ ├── tag_service.go
│ │ ├── tag_service_legacy.go
│ │ ├── task_queue_service.go
│ │ ├── task_service.go
│ │ ├── task_stat_service.go
│ │ ├── token_service.go
│ │ ├── user_role_service.go
│ │ ├── user_service.go
│ │ └── variable_service.go
│ ├── node/
│ │ ├── config/
│ │ │ ├── config.go
│ │ │ ├── config_service.go
│ │ │ └── options.go
│ │ └── service/
│ │ ├── master_service_v2.go
│ │ ├── options.go
│ │ └── worker_service_v2.go
│ ├── notification/
│ │ ├── constants.go
│ │ ├── entity.go
│ │ ├── im.go
│ │ ├── mail.go
│ │ ├── mail_gmail.go
│ │ ├── oauth2_gmail.go
│ │ ├── service_v2.go
│ │ ├── service_v2_test.go
│ │ └── theme.go
│ ├── process/
│ │ ├── daemon.go
│ │ ├── daemon_test.go
│ │ ├── manage.go
│ │ └── options.go
│ ├── result/
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_mongo.go
│ │ └── service_registry.go
│ ├── schedule/
│ │ ├── logger.go
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_v2.go
│ │ └── test/
│ │ ├── base.go
│ │ └── schedule_service_test.go
│ ├── spider/
│ │ └── admin/
│ │ ├── options.go
│ │ ├── service.go
│ │ └── service_v2.go
│ ├── stats/
│ │ ├── options.go
│ │ └── service.go
│ ├── sys_exec/
│ │ ├── sys_exec.go
│ │ ├── sys_exec_darwin.go
│ │ ├── sys_exec_linux.go
│ │ └── sys_exec_windows.go
│ ├── system/
│ │ ├── service.go
│ │ └── service_v2.go
│ ├── task/
│ │ ├── handler/
│ │ │ ├── options.go
│ │ │ ├── runner_test.go
│ │ │ ├── runner_v2.go
│ │ │ └── service_v2.go
│ │ ├── log/
│ │ │ ├── constants.go
│ │ │ ├── default.go
│ │ │ ├── driver.go
│ │ │ ├── entity.go
│ │ │ ├── errors.go
│ │ │ ├── file_driver.go
│ │ │ ├── file_driver_test.go
│ │ │ └── interface.go
│ │ ├── scheduler/
│ │ │ ├── options.go
│ │ │ └── service_v2.go
│ │ └── stats/
│ │ ├── options.go
│ │ └── service_v2.go
│ ├── user/
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_v2.go
│ │ └── test/
│ │ ├── base.go
│ │ └── user_service_test.go
│ └── utils/
│ ├── args.go
│ ├── array.go
│ ├── backoff.go
│ ├── binders/
│ │ └── binder_col_name.go
│ ├── bool.go
│ ├── bson.go
│ ├── cache.go
│ ├── chan.go
│ ├── chan_test.go
│ ├── cockroachdb.go
│ ├── cron.go
│ ├── debug.go
│ ├── demo.go
│ ├── di.go
│ ├── docker.go
│ ├── encrypt.go
│ ├── encrypt_test.go
│ ├── es.go
│ ├── file.go
│ ├── file_test.go
│ ├── filter.go
│ ├── git.go
│ ├── hash.go
│ ├── helpers.go
│ ├── http.go
│ ├── init.go
│ ├── json.go
│ ├── kafka.go
│ ├── mongo.go
│ ├── mssql.go
│ ├── mysql.go
│ ├── node.go
│ ├── os.go
│ ├── postgresql.go
│ ├── result.go
│ ├── rpc.go
│ ├── spider.go
│ ├── sql.go
│ ├── sqlite.go
│ ├── stats.go
│ ├── system.go
│ ├── task.go
│ ├── time.go
│ └── uuid.go
├── db/
│ ├── .editorconfig
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── errors/
│ │ ├── base.go
│ │ ├── errors.go
│ │ └── redis.go
│ ├── generic/
│ │ ├── base.go
│ │ ├── list.go
│ │ ├── op.go
│ │ └── sort.go
│ ├── go.mod
│ ├── interfaces.go
│ ├── mongo/
│ │ ├── client.go
│ │ ├── client_options.go
│ │ ├── client_test.go
│ │ ├── col.go
│ │ ├── col_test.go
│ │ ├── db.go
│ │ ├── db_options.go
│ │ ├── db_test.go
│ │ ├── result.go
│ │ └── transaction.go
│ ├── redis/
│ │ ├── client.go
│ │ ├── constants.go
│ │ ├── options.go
│ │ ├── pool.go
│ │ └── test/
│ │ ├── base.go
│ │ └── client_test.go
│ ├── sql/
│ │ └── sql.go
│ └── utils/
│ └── utils.go
├── devops/
│ ├── develop/
│ │ ├── crawlab-master.yaml
│ │ ├── crawlab-worker.yaml
│ │ ├── mongo-pv.yaml
│ │ ├── mongo.yaml
│ │ ├── ns.yaml
│ │ └── redis.yaml
│ ├── master/
│ │ ├── crawlab-master.yaml
│ │ ├── crawlab-worker.yaml
│ │ ├── mongo-pv.yaml
│ │ ├── mongo.yaml
│ │ ├── ns.yaml
│ │ └── redis.yaml
│ └── release/
│ ├── crawlab-master.yaml
│ ├── crawlab-worker.yaml
│ ├── mongo-pv.yaml
│ ├── mongo.yaml
│ ├── ns.yaml
│ └── redis.yaml
├── docker-compose.yml
├── docs/
│ └── config.md
├── frontend/
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .npmrc
│ ├── Dockerfile
│ ├── babel.config.js
│ ├── index.html
│ ├── jest.config.ts
│ ├── package.json
│ ├── public/
│ │ ├── fonts/
│ │ │ └── FontAwesome.otf
│ │ └── js/
│ │ ├── login-canvas.js
│ │ └── vue3-sfc-loader.js
│ ├── src/
│ │ ├── main.ts
│ │ └── shims-vue.d.ts
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── vue.config.js
├── fs/
│ ├── .editorconfig
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── Dockerfile
│ ├── LICENSE
│ ├── README.md
│ ├── bin/
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── constants.go
│ ├── docker-compose.yml
│ ├── errors.go
│ ├── go.mod
│ ├── go.sum
│ ├── interface.go
│ ├── lib/
│ │ └── copy/
│ │ └── copy.go
│ ├── options.go
│ ├── seaweedfs_manager.go
│ ├── test/
│ │ ├── base.go
│ │ ├── bindata.go
│ │ ├── main_test.go
│ │ ├── seaweedfs_test.go
│ │ └── utils.go
│ └── utils.go
├── go.work
├── go.work.sum
├── grpc/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── bin/
│ │ ├── compile.sh
│ │ └── compile_all.sh
│ ├── dependencies_service_v2.pb.go
│ ├── dependencies_service_v2_grpc.pb.go
│ ├── go.mod
│ ├── go.sum
│ ├── message_service.pb.go
│ ├── message_service_grpc.pb.go
│ ├── metrics_service_v2.pb.go
│ ├── metrics_service_v2_grpc.pb.go
│ ├── model_base_service.pb.go
│ ├── model_base_service_grpc.pb.go
│ ├── model_base_service_v2.pb.go
│ ├── model_base_service_v2_grpc.pb.go
│ ├── model_delegate.pb.go
│ ├── model_delegate_grpc.pb.go
│ ├── model_service_v2_request.pb.go
│ ├── node.pb.go
│ ├── node_info.pb.go
│ ├── node_service.pb.go
│ ├── node_service_grpc.pb.go
│ ├── plugin_request.pb.go
│ ├── plugin_service.pb.go
│ ├── plugin_service_grpc.pb.go
│ ├── proto/
│ │ ├── entity/
│ │ │ ├── model_service_v2_request.proto
│ │ │ ├── node_info.proto
│ │ │ ├── plugin_request.proto
│ │ │ ├── request.proto
│ │ │ ├── response.proto
│ │ │ ├── response_code.proto
│ │ │ ├── stream_message.proto
│ │ │ ├── stream_message_code.proto
│ │ │ └── stream_message_data_task.proto
│ │ ├── models/
│ │ │ ├── node.proto
│ │ │ └── task.proto
│ │ └── services/
│ │ ├── dependencies_service_v2.proto
│ │ ├── message_service.proto
│ │ ├── metrics_service_v2.proto
│ │ ├── model_base_service.proto
│ │ ├── model_base_service_v2.proto
│ │ ├── model_delegate.proto
│ │ ├── node_service.proto
│ │ ├── plugin_service.proto
│ │ └── task_service.proto
│ ├── request.pb.go
│ ├── response.pb.go
│ ├── response_code.pb.go
│ ├── stream_message.pb.go
│ ├── stream_message_code.pb.go
│ ├── stream_message_data_task.pb.go
│ ├── task.pb.go
│ ├── task_service.pb.go
│ └── task_service_grpc.pb.go
├── k8s/
│ ├── crawlab-master.yaml
│ ├── crawlab-worker.yaml
│ ├── mongo-pv.yaml
│ ├── mongo.yaml
│ ├── ns.yaml
│ └── redis.yaml
├── nginx/
│ └── crawlab.conf
├── scripts/
│ └── validate-backend.sh
├── template-parser/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── entity.go
│ ├── func.go
│ ├── general_parser.go
│ ├── go.mod
│ ├── go.sum
│ ├── interfaces.go
│ ├── parser.go
│ ├── test/
│ │ └── general_parser_test.go
│ └── variable.go
├── trace/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── go.mod
│ ├── go.sum
│ └── trace.go
├── vcs/
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── constants.go
│ ├── entity.go
│ ├── errors.go
│ ├── git.go
│ ├── git_options.go
│ ├── git_store.go
│ ├── git_utils.go
│ ├── go.mod
│ ├── go.sum
│ ├── interface.go
│ ├── test/
│ │ ├── base.go
│ │ ├── credential.go
│ │ ├── credentials.example.json
│ │ └── git_test.go
│ └── utils.go
└── workspace/
├── .gitignore
├── docker-compose.yml
├── dockerfiles/
│ ├── golang/
│ │ └── Dockerfile
│ └── node/
│ ├── .dockerignore
│ └── Dockerfile
└── localdev/
├── README.md
└── docker-compose.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
.idea
logs
*.log
dist/
**/node_modules/
**/tmp/
**/vendor/
.github/
.devops
k8s
workspace
.git/
================================================
FILE: .gitattributes
================================================
*.md linguist-language=Go
*.yml linguist-language=Go
*.html linguist-language=Go
*.js linguist-language=Go
*.ts linguist-language=Go
*.vue linguist-language=Go
*.xml linguist-language=Go
*.css linguist-language=Go
*.sql linguist-language=Go
*.uml linguist-language=Go
*.cmd linguist-language=Go
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: 'bug'
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_zh.md
================================================
---
name: Bug 报告
about: 创建一份 Bug 报告帮助我们优化产品
title: ''
labels: 'bug'
assignees: ''
---
**Bug 描述**
例如,当 xxx 时,xxx 功能不工作。
**复现步骤**
该 Bug 复现步骤如下
1.
2.
3.
**期望结果**
xxx 能工作。
**截屏**

================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: 'enhancement'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request_zh.md
================================================
---
name: 功能需求
about: 优化和功能需求建议
title: ''
labels: 'enhancement'
assignees: ''
---
**请描述该需求尝试解决的问题**
例如,当 xxx 时,我总是被当前 xxx 的设计所困扰。
**请描述您认为可行的解决方案**
例如,添加 xxx 功能能够解决问题。
**考虑过的替代方案**
例如,如果用 xxx,也能解决该问题。
================================================
FILE: .github/workflows/docker-crawlab-tencent.yml
================================================
name: "Docker Image CI: crawlab (tencent)"
on:
push:
branches: [ develop, main ]
#pull_request:
# branches: [ main ]
release:
types: [ published ]
workflow_dispatch:
repository_dispatch:
types: [ docker-crawlab ]
env:
IMAGE_PATH_CRAWLAB_BACKEND: backend
IMAGE_PATH_CRAWLAB_FRONTEND: frontend
IMAGE_NAME_CRAWLAB: ccr.ccs.tencentyun.com/crawlab/crawlab
IMAGE_NAME_CRAWLAB_BACKEND: crawlabteam/crawlab-backend
IMAGE_NAME_CRAWLAB_FRONTEND: crawlabteam/crawlab-frontend
jobs:
setup:
runs-on: ubuntu-latest
outputs:
is_matched_backend: ${{ steps.check_changed_files.outputs.is_matched_backend }}
is_matched_frontend: ${{ steps.check_changed_files.outputs.is_matched_frontend }}
is_matched_dockerfile: ${{ steps.check_changed_files.outputs.is_matched_dockerfile }}
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed_files
uses: tj-actions/changed-files@v18.7
- id: check_changed_files
name: Check changed files
run: |
# check changed files
is_matched_backend=0
is_matched_frontend=0
is_matched_dockerfile=0
for file in ${{ steps.changed_files.outputs.all_changed_files }}; do
if [[ $file =~ ^${IMAGE_PATH_CRAWLAB_BACKEND}/.* ]]; then
file_backend=$file
is_matched_backend=1
fi
if [[ $file =~ ^${IMAGE_PATH_CRAWLAB_FRONTEND}/.* ]]; then
file_frontend=$file
is_matched_frontend=1
fi
if [[ $file == Dockerfile ]]; then
file_dockerfile=$file
is_matched_dockerfile=1
fi
done
# set outputs
if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
is_matched_backend=1
is_matched_frontend=1
is_matched_dockerfile=1
fi
echo "::set-output name=is_matched_backend::$is_matched_backend"
echo "::set-output name=is_matched_frontend::$is_matched_frontend"
echo "::set-output name=is_matched_dockerfile::$is_matched_dockerfile"
# echo outputs
echo "is_matched_backend=$is_matched_backend, file_backend=$file_backend"
echo "is_matched_frontend=$is_matched_frontend, file_frontend=$file_frontend"
echo "is_matched_dockerfile=$is_matched_dockerfile, file_dockerfile=$file_dockerfile"
- id: version
name: Get version
run: |
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
# Use Docker `latest` tag convention
[ "$VERSION" == "main" ] && VERSION=latest
echo "::set-output name=version::$VERSION"
build-backend:
needs: [ setup ]
if: needs.setup.outputs.is_matched_backend == '1'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v18.7
- name: Build image
run: |
cd $IMAGE_PATH_CRAWLAB_BACKEND
docker build . --file Dockerfile --tag image
- name: Log into registry
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_NAME=$IMAGE_NAME_CRAWLAB_BACKEND
docker tag image $IMAGE_NAME:$IMAGE_VERSION
docker push $IMAGE_NAME:$IMAGE_VERSION
build-frontend:
needs: [ setup ]
if: needs.setup.outputs.is_matched_frontend == '1'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v18.7
- name: Build image
run: |
cd $IMAGE_PATH_CRAWLAB_FRONTEND
docker build . --file Dockerfile --tag image
- name: Log into registry
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_NAME=$IMAGE_NAME_CRAWLAB_FRONTEND
docker tag image $IMAGE_NAME:$IMAGE_VERSION
docker push $IMAGE_NAME:$IMAGE_VERSION
build-crawlab:
if: ${{ always() }}
needs: [ setup, build-backend, build-frontend ]
runs-on: ubuntu-latest
services:
mongo:
image: mongo:4.2
ports:
- 27017:27017
steps:
- uses: actions/checkout@v2
- name: Update Dockerfile
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
if [[ $IMAGE_VERSION != "latest" ]]; then
for n in crawlab-backend crawlab-frontend; do
IMAGE_NAME=$n
sed -i "s/${IMAGE_NAME}:latest/${IMAGE_NAME}:${IMAGE_VERSION}/" Dockerfile
done
fi
- name: Build image
run: docker build . --file Dockerfile --tag image
- name: Test image
run: |
docker run --rm -d --name crawlab_master \
-e CRAWLAB_NODE_MASTER=true \
-e CRAWLAB_DEMO=true \
-e CRAWLAB_MONGO_HOST=localhost \
-e CRAWLAB_MONGO_PORT=27017 \
-p 8080:8080 \
--network host \
image
docker exec crawlab_master env
docker logs -f crawlab_master &
sleep 10
docker ps
cmd='curl http://localhost:8080/api/system-info -s'
echo "cmd: ${cmd}"
res=`${cmd}`
echo "res: ${res}"
if [[ $res =~ "success" ]]; then
:
else
exit 1
fi
docker stop crawlab_master
- name: Set up Python
uses: actions/setup-python@v1
with:
python-version: '3.8'
- name: Test demo
run: |
pip install crawlab-demo
crawlab-demo validate
- name: Log into registry
run: echo ${{ secrets.DOCKER_TENCENT_PASSWORD }} | docker login -u ${{ secrets.DOCKER_TENCENT_USERNAME }} --password-stdin ccr.ccs.tencentyun.com
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_ID=$IMAGE_NAME_CRAWLAB
docker tag image $IMAGE_ID:$IMAGE_VERSION
docker push $IMAGE_ID:$IMAGE_VERSION
================================================
FILE: .github/workflows/docker-crawlab.yml
================================================
name: "Docker Image CI: crawlab"
on:
push:
branches: [ develop, main ]
#pull_request:
# branches: [ main ]
release:
types: [ published ]
workflow_dispatch:
repository_dispatch:
types: [ docker-crawlab ]
env:
IMAGE_PATH_CRAWLAB_BACKEND: backend
IMAGE_PATH_CRAWLAB_FRONTEND: frontend
IMAGE_NAME_CRAWLAB: crawlabteam/crawlab
IMAGE_NAME_CRAWLAB_BACKEND: crawlabteam/crawlab-backend
IMAGE_NAME_CRAWLAB_FRONTEND: crawlabteam/crawlab-frontend
jobs:
setup:
runs-on: ubuntu-latest
outputs:
is_matched_backend: ${{ steps.check_changed_files.outputs.is_matched_backend }}
is_matched_frontend: ${{ steps.check_changed_files.outputs.is_matched_frontend }}
is_matched_dockerfile: ${{ steps.check_changed_files.outputs.is_matched_dockerfile }}
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed_files
uses: tj-actions/changed-files@v18.7
- id: check_changed_files
name: Check changed files
run: |
# check changed files
is_matched_backend=0
is_matched_frontend=0
is_matched_dockerfile=0
for file in ${{ steps.changed_files.outputs.all_changed_files }}; do
if [[ $file =~ ^${IMAGE_PATH_CRAWLAB_BACKEND}/.* ]]; then
file_backend=$file
is_matched_backend=1
fi
if [[ $file =~ ^${IMAGE_PATH_CRAWLAB_FRONTEND}/.* ]]; then
file_frontend=$file
is_matched_frontend=1
fi
if [[ $file == Dockerfile ]]; then
file_dockerfile=$file
is_matched_dockerfile=1
fi
done
# set outputs
if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
is_matched_backend=1
is_matched_frontend=1
is_matched_dockerfile=1
fi
echo "::set-output name=is_matched_backend::$is_matched_backend"
echo "::set-output name=is_matched_frontend::$is_matched_frontend"
echo "::set-output name=is_matched_dockerfile::$is_matched_dockerfile"
# echo outputs
echo "is_matched_backend=$is_matched_backend, file_backend=$file_backend"
echo "is_matched_frontend=$is_matched_frontend, file_frontend=$file_frontend"
echo "is_matched_dockerfile=$is_matched_dockerfile, file_dockerfile=$file_dockerfile"
- id: version
name: Get version
run: |
# Strip git ref prefix from version
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
# Strip "v" prefix from tag name
[[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
# Use Docker `latest` tag convention
[ "$VERSION" == "main" ] && VERSION=latest
echo "::set-output name=version::$VERSION"
build-backend:
needs: [ setup ]
if: needs.setup.outputs.is_matched_backend == '1'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v18.7
- name: Build image
run: |
cd $IMAGE_PATH_CRAWLAB_BACKEND
docker build . --file Dockerfile --tag image
- name: Log into registry
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_NAME=$IMAGE_NAME_CRAWLAB_BACKEND
docker tag image $IMAGE_NAME:$IMAGE_VERSION
docker push $IMAGE_NAME:$IMAGE_VERSION
build-frontend:
needs: [ setup ]
if: needs.setup.outputs.is_matched_frontend == '1'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v18.7
- name: Build image
run: |
cd $IMAGE_PATH_CRAWLAB_FRONTEND
docker build . --file Dockerfile --tag image
- name: Log into registry
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_NAME=$IMAGE_NAME_CRAWLAB_FRONTEND
docker tag image $IMAGE_NAME:$IMAGE_VERSION
docker push $IMAGE_NAME:$IMAGE_VERSION
build-crawlab:
if: ${{ always() }}
needs: [ setup, build-backend, build-frontend ]
runs-on: ubuntu-latest
services:
mongo:
image: mongo:4.2
ports:
- 27017:27017
steps:
- uses: actions/checkout@v2
- name: Update Dockerfile
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
if [[ $IMAGE_VERSION != "latest" ]]; then
for n in crawlab-backend crawlab-frontend; do
IMAGE_NAME=$n
sed -i "s/${IMAGE_NAME}:latest/${IMAGE_NAME}:${IMAGE_VERSION}/" Dockerfile
done
fi
- name: Build image
run: docker build . --file Dockerfile --tag image
- name: Test image
run: |
docker run --rm -d --name crawlab_master \
-e CRAWLAB_NODE_MASTER=true \
-e CRAWLAB_DEMO=true \
-e CRAWLAB_MONGO_HOST=localhost \
-e CRAWLAB_MONGO_PORT=27017 \
-p 8080:8080 \
--network host \
image
docker exec crawlab_master env
docker logs -f crawlab_master &
sleep 10
docker ps
cmd='curl http://localhost:8080/api/system-info -s'
echo "cmd: ${cmd}"
res=`${cmd}`
echo "res: ${res}"
if [[ $res =~ "success" ]]; then
:
else
exit 1
fi
docker stop crawlab_master
- name: Set up Python
uses: actions/setup-python@v1
with:
python-version: '3.8'
- name: Test demo
run: |
pip install crawlab-demo
crawlab-demo validate
- name: Log into registry
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push image
run: |
IMAGE_VERSION=${{needs.setup.outputs.version}}
IMAGE_ID=$IMAGE_NAME_CRAWLAB
docker tag image $IMAGE_ID:$IMAGE_VERSION
docker push $IMAGE_ID:$IMAGE_VERSION
================================================
FILE: .gitignore
================================================
.idea/
.vscode/
.DS_Store
node_modules/
logs/
tmp/
_book/
*.lock
vendor/
.crawlab
dist/
================================================
FILE: CHANGELOG-zh.md
================================================
# 0.6.0 (TBC)
(TBC)
# 0.5.1 (2020-07-31)
### 功能 / 优化
- **加入错误详情信息**.
- **加入 Golang 编程语言支持**.
- **加入 Chrome Driver 和 Firefox 的 Web Driver 安装脚本**.
- **支持系统任务**. "系统任务"跟普通爬虫任务相似,允许用户查看诸如安装语言之类的任务日志.
- **将安装语言从 RPC 更改为系统任务**.
### Bug 修复
- **修复在爬虫市场中第一次下载爬虫时会报500错误**. [#808](https://github.com/crawlab-team/crawlab/issues/808)
- **修复一部分翻译问题**.
- **修复任务详情 500 错误**. [#810](https://github.com/crawlab-team/crawlab/issues/810)
- **修复密码重置问题**. [#811](https://github.com/crawlab-team/crawlab/issues/811)
- **修复无法下载 CSV 问题**. [#812](https://github.com/crawlab-team/crawlab/issues/812)
- **修复无法安装 Node.js 问题**. [#813](https://github.com/crawlab-team/crawlab/issues/813)
- **修复批量添加定时任务时默认为禁用问题**. [#814](https://github.com/crawlab-team/crawlab/issues/814)
# 0.5.0 (2020-07-19)
### 功能 / 优化
- **爬虫市场**. 允许用户下载开源爬虫到 Crawlab.
- **批量操作**. 允许用户与 Crawlab 批量交互,例如批量运行任务、批量删除爬虫等等.
- **迁移 MongoDB 驱动器至 `MongoDriver`**.
- **重构优化节点逻辑代码**.
- **更改默认 `task.workers` 至 16**.
- **更改默认 nginx `client_max_body_size` 为 200m**.
- **支持写日志到 ElasticSearch**.
- **在 Scrapy 页面展示错误详情**.
- **删除挑战页面**.
- **将反馈、免责声明页面移动到顶部**.
### Bug 修复
- **修复由于 TTL 索引未创建导致的日志不过期问题**.
- **设置默认日志过期时间为 1 天**.
- **`task_id` 索引没有创建**.
- **`docker-compose.yml` 修复**.
- **修复 404 页面**.
- **修复无法先创建工作节点问题**.
# 0.4.10 (2020-04-21)
### 功能 / 优化
- **优化日志管理**. 集中化管理日志,储存在 MongoDB,减少对 PubSub 的依赖,允许日志异常检测.
- **自动安装依赖**. 允许从 `requirements.txt` 和 `package.json` 自动安装依赖.
- **API Token**. 允许用户生成 API Token,并利用它们来集成到自己的系统中.
- **Web Hook**. 当任务开始或结束时,触发 Web Hook http 请求到预定义好的 URL.
- **自动生成结果集**. 如果没有设置,自动设置结果集为 `results_<spider_name>`.
- **优化项目列表**. 项目列表中不展示 "No Project".
- **升级 Node.js**. 将 Node.js 版本从 v8.12 升级到 v10.19.
- **定时任务增加运行按钮**. 允许用户在定时任务界面手动运行爬虫任务.
### Bug 修复
- **无法注册**. [#670](https://github.com/crawlab-team/crawlab/issues/670)
- **爬虫定时任务标签 Cron 表达式显示秒**. [#678](https://github.com/crawlab-team/crawlab/issues/678)
- **爬虫每日数据缺失**. [#684](https://github.com/crawlab-team/crawlab/issues/684)
- **结果数量未即时更新**. [#689](https://github.com/crawlab-team/crawlab/issues/689)
# 0.4.9 (2020-03-31)
### 功能 / 优化
- **挑战**. 用户可以完成不同的趣味挑战..
- **更高级的权限控制**. 更细化的权限管理,例如普通用户只能查看或管理自己的爬虫或项目,而管理用户可以查看或管理所有爬虫或项目.
- **反馈**. 允许用户发送反馈和评分给 Crawlab 开发组.
- **更好的主页指标**. 优化主页上的指标展示.
- **可配置爬虫转化为自定义爬虫**. 用户可以将自己的可配置爬虫转化为 Scrapy 自定义爬虫.
- **查看定时任务触发的任务**. 允许用户查看定时任务触发的任务. [#648](https://github.com/crawlab-team/crawlab/issues/648)
- **支持结果去重**. 允许用户配置结果去重. [#579](https://github.com/crawlab-team/crawlab/issues/579)
- **支持任务重试**. 允许任务重新触发历史任务.
### Bug 修复
- **无法注册**. [#670](https://github.com/crawlab-team/crawlab/issues/670)
- **CLI 无法在 Windows 上使用**. [#580](https://github.com/crawlab-team/crawlab/issues/580)
- **重新上传错误**. [#643](https://github.com/crawlab-team/crawlab/issues/643) [#640](https://github.com/crawlab-team/crawlab/issues/640)
- **上传丢失文件目录**. [#646](https://github.com/crawlab-team/crawlab/issues/646)
- **无法在爬虫定时任务标签中添加定时任务**.
# 0.4.8 (2020-03-11)
### 功能 / 优化
- **支持更多编程语言安装**. 现在用户可以安装或预装更多的编程语言,包括 Java、.Net Core、PHP.
- **安装 UI 优化**. 用户能够更好的查看和管理节点列表页的安装.
- **更多 Git 支持**. 允许用户查看 Git Commits 记录,并 Checkout 到相应 Commit.
- **支持用 Hostname 作为节点注册类型**. 用户可以将 hostname 作为节点的唯一识别号.
- **RPC 支持**. 加入 RPC 支持来更好的管理节点通信.
- **是否在主节点运行开关**. 用户可以决定是否在主节点运行,如果为否,则所有任务将在工作节点上运行.
- **默认禁用教程**.
- **加入相关文档侧边栏**.
- **加载页面优化**.
### Bug 修复
- **重复节点**. [#391](https://github.com/crawlab-team/crawlab/issues/391)
- **重复上传爬虫**. [#603](https://github.com/crawlab-team/crawlab/issues/603)
- **节点第三方模块安装失败导致 节点安装第三方部分无法使用**. [#609](https://github.com/crawlab-team/crawlab/issues/609)
- **离线节点也会创建任务**. [#622](https://github.com/crawlab-team/crawlab/issues/622)
# 0.4.7 (2020-02-24)
### 功能 / 优化
- **更好的支持 Scrapy**. 爬虫识别,`settings.py` 配置,日志级别选择,爬虫选择. [#435](https://github.com/crawlab-team/crawlab/issues/435)
- **Git 同步**. 允许用户将 Git 项目同步到 Crawlab.
- **长任务支持**. 用户可以添加长任务爬虫,这些爬虫可以跑长期运行的任务. [425](https://github.com/crawlab-team/crawlab/issues/425)
- **爬虫列表优化**. 分状态任务列数统计,任务列表详情弹出框,图例. [425](https://github.com/crawlab-team/crawlab/issues/425)
- **版本升级检测**. 检测最新版本,通知用户升级.
- **批量操作爬虫**. 允许用户批量运行/停止爬虫任务,以及批量删除爬虫.
- **复制爬虫**. 允许用户复制已存在爬虫来创建新爬虫.
- **微信群二维码**.
### Bug 修复
- **定时任务爬虫选择问题**. 字段不会随着爬虫变化而响应.
- **定时任务冲突问题**. 两个不同的爬虫设置定时任务,时间设置成相同的话,可能会有bug. [#515](https://github.com/crawlab-team/crawlab/issues/515) [#565](https://github.com/crawlab-team/crawlab/issues/565)
- **任务日志问题**. 在同一时间触发的不同任务可能会写入同一个日志文件. [#577](https://github.com/crawlab-team/crawlab/issues/577)
- **任务列表筛选选项不全**.
# 0.4.6 (2020-02-13)
### 功能 / 优化
- **Node.js SDK**. 用户可以将 SDK 应用到他们的 Node.js 爬虫中.
- **日志管理优化**. 日志搜索,错误高亮,自动滚动.
- **任务执行流程优化**. 允许用户在触发任务后跳转到该任务详情页.
- **任务展示优化**. 在爬虫详情页的最近任务表格中加入了“参数”列. [#295](https://github.com/crawlab-team/crawlab/issues/295)
- **爬虫列表优化**. 在爬虫列表页加入"更新时间"和"创建时间". [#505](https://github.com/crawlab-team/crawlab/issues/505)
- **页面加载占位器**.
### Bug 修复
- **定时任务配置失去焦点**. [#519](https://github.com/crawlab-team/crawlab/issues/519)
- **无法用 CLI 工具上传爬虫**. [#524](https://github.com/crawlab-team/crawlab/issues/524)
# 0.4.5 (2020-02-03)
### 功能 / 优化
- **交互式教程**. 引导用户了解 Crawlab 的主要功能.
- **加入全局环境变量**. 可以设置全局环境变量,然后传入到所有爬虫程序中. [#177](https://github.com/crawlab-team/crawlab/issues/177)
- **项目**. 允许用户将爬虫关联到项目上. [#316](https://github.com/crawlab-team/crawlab/issues/316)
- **示例爬虫**. 当初始化时,自动加入示例爬虫. [#379](https://github.com/crawlab-team/crawlab/issues/379)
- **用户管理优化**. 限制管理用户的权限. [#456](https://github.com/crawlab-team/crawlab/issues/456)
- **设置页面优化**.
- **任务结果页面优化**.
### Bug 修复
- **无法找到爬虫文件错误**. [#485](https://github.com/crawlab-team/crawlab/issues/485)
- **点击删除按钮导致跳转**. [#480](https://github.com/crawlab-team/crawlab/issues/480)
- **无法在空爬虫里创建文件**. [#479](https://github.com/crawlab-team/crawlab/issues/479)
- **下载结果错误**. [#465](https://github.com/crawlab-team/crawlab/issues/465)
- **crawlab-sdk CLI 错误**. [#458](https://github.com/crawlab-team/crawlab/issues/458)
- **页面刷新问题**. [#441](https://github.com/crawlab-team/crawlab/issues/441)
- **结果不支持 JSON**. [#202](https://github.com/crawlab-team/crawlab/issues/202)
- **修复“删除爬虫后获取所有爬虫”错误**.
- **修复 i18n 警告**.
# 0.4.4 (2020-01-17)
### 功能 / 优化
- **邮件通知**. 允许用户发送邮件消息通知.
- **钉钉机器人通知**. 允许用户发送钉钉机器人消息通知.
- **企业微信机器人通知**. 允许用户发送企业微信机器人消息通知.
- **API 地址优化**. 在前端加入相对路径,因此用户不需要特别注明 `CRAWLAB_API_ADDRESS`.
- **SDK 兼容**. 允许用户通过 Crawlab SDK 与 Scrapy 或通用爬虫集成.
- **优化文件管理**. 加入树状文件侧边栏,让用户更方便的编辑文件.
- **高级定时任务 Cron**. 允许用户通过 Cron 可视化编辑器编辑定时任务.
### Bug 修复
- **`nil retuened` 错误**.
- **使用 HTTPS 出现的报错**.
- **无法在爬虫列表页运行可配置爬虫**.
- **上传爬虫文件缺少表单验证**.
# 0.4.3 (2020-01-07)
### 功能 / 优化
- **依赖安装**. 允许用户在平台 Web 界面安装/卸载依赖以及添加编程语言(暂时只有 Node.js)。
- **Docker 中预装编程语言**. 允许 Docker 用户通过设置 `CRAWLAB_SERVER_LANG_NODE` 为 `Y` 来预装 `Node.js` 环境.
- **在爬虫详情页添加定时任务列表**. 允许用户在爬虫详情页查看、添加、编辑定时任务. [#360](https://github.com/crawlab-team/crawlab/issues/360)
- **Cron 表达式与 Linux 一致**. 将表达式从 6 元素改为 5 元素,与 Linux 一致.
- **启用/禁用定时任务**. 允许用户启用/禁用定时任务. [#297](https://github.com/crawlab-team/crawlab/issues/297)
- **优化任务管理**. 允许用户批量删除任务. [#341](https://github.com/crawlab-team/crawlab/issues/341)
- **优化爬虫管理**. 允许用户在爬虫列表页对爬虫进行筛选和排序.
- **添加中文版 `CHANGELOG`**.
- **在顶部添加 Github 加星按钮**.
### Bug 修复
- **定时任务问题**. [#423](https://github.com/crawlab-team/crawlab/issues/423)
- **上传爬虫zip文件问题**. [#403](https://github.com/crawlab-team/crawlab/issues/403) [#407](https://github.com/crawlab-team/crawlab/issues/407)
- **因为网络原因导致崩溃**. [#340](https://github.com/crawlab-team/crawlab/issues/340)
- **定时任务无法正常运行**
- **定时任务列表列表错位问题**
- **刷新按钮跳转错误问题**
# 0.4.2 (2019-12-26)
### 功能 / 优化
- **免责声明**. 加入免责声明.
- **通过 API 获取版本号**. [#371](https://github.com/crawlab-team/crawlab/issues/371)
- **通过配置来允许用户注册**. [#346](https://github.com/crawlab-team/crawlab/issues/346)
- **允许添加新用户**.
- **更高级的文件管理**. 允许用户添加、编辑、重命名、删除代码文件. [#286](https://github.com/crawlab-team/crawlab/issues/286)
- **优化爬虫创建流程**. 允许用户在上传 zip 文件前创建空的自定义爬虫.
- **优化任务管理**. 允许用户通过选择条件过滤任务. [#341](https://github.com/crawlab-team/crawlab/issues/341)
### Bug 修复
- **重复节点**. [#391](https://github.com/crawlab-team/crawlab/issues/391)
- **"mongodb no reachable" 错误**. [#373](https://github.com/crawlab-team/crawlab/issues/373)
# 0.4.1 (2019-12-13)
### 功能 / 优化
- **Spiderfile 优化**. 将阶段由数组更换为字典. [#358](https://github.com/crawlab-team/crawlab/issues/358)
- **百度统计更新**.
### Bug 修复
- **无法展示定时任务**. [#353](https://github.com/crawlab-team/crawlab/issues/353)
- **重复节点注册**. [#334](https://github.com/crawlab-team/crawlab/issues/334)
# 0.4.0 (2019-12-06)
### 功能 / 优化
- **可配置爬虫**. 允许用户添加 `Spiderfile` 来配置抓取规则.
- **执行模式**. 允许用户选择 3 种任务执行模式: *所有节点*, *指定节点* and *随机*.
### Bug 修复
- **任务意外被杀死**. [#306](https://github.com/crawlab-team/crawlab/issues/306)
- **文档更正**. [#301](https://github.com/crawlab-team/crawlab/issues/258) [#301](https://github.com/crawlab-team/crawlab/issues/258)
- **直接部署与 Windows 不兼容**. [#288](https://github.com/crawlab-team/crawlab/issues/288)
- **日志文件丢失**. [#269](https://github.com/crawlab-team/crawlab/issues/269)
# 0.3.5 (2019-10-28)
### 功能 / 优化
- **优雅关闭**. [详情](https://github.com/crawlab-team/crawlab/commit/63fab3917b5a29fd9770f9f51f1572b9f0420385)
- **节点信息优化**. [详情](https://github.com/crawlab-team/crawlab/commit/973251a0fbe7a2184ac0da09e0404a17c736aee7)
- **将系统环境变量添加到任务**. [详情](https://github.com/crawlab-team/crawlab/commit/4ab4892471965d6342d30385578ca60dc51f8ad3)
- **自动刷新任务日志**. [详情](https://github.com/crawlab-team/crawlab/commit/4ab4892471965d6342d30385578ca60dc51f8ad3)
- **允许 HTTPS 部署**. [详情](https://github.com/crawlab-team/crawlab/commit/5d8f6f0c56768a6e58f5e46cbf5adff8c7819228)
### Bug 修复
- **定时任务中无法获取爬虫列表**. [详情](https://github.com/crawlab-team/crawlab/commit/311f72da19094e3fa05ab4af49812f58843d8d93)
- **无法获取工作节点信息**. [详情](https://github.com/crawlab-team/crawlab/commit/6af06efc17685a9e232e8c2b5fd819ec7d2d1674)
- **运行爬虫任务时无法选择节点**. [详情](https://github.com/crawlab-team/crawlab/commit/31f8e03234426e97aed9b0bce6a50562f957edad)
- **结果量很大时无法获取结果数量**. [#260](https://github.com/crawlab-team/crawlab/issues/260)
- **定时任务中的节点问题**. [#244](https://github.com/crawlab-team/crawlab/issues/244)
# 0.3.1 (2019-08-25)
### 功能 / 优化
- **Docker 镜像优化**. 将 Docker 镜像进一步分割成 alpine 镜像版本的 master、worker、frontendSplit docker further into master, worker, frontend.
- **单元测试**. 用单元测试覆盖部分后端代码.
- **前端优化**. 登录页、按钮大小、上传 UI 提示.
- **更灵活的节点注册**. 允许用户传一个变量作为注册 key,而不是默认的 MAC 地址.
### Bug 修复
- **上传大爬虫文件错误**. 上传大爬虫文件时的内存崩溃问题. [#150](https://github.com/crawlab-team/crawlab/issues/150)
- **无法同步爬虫**. 通过提高写权限等级来修复同步爬虫文件时的问题. [#114](https://github.com/crawlab-team/crawlab/issues/114)
- **爬虫页问题**. 通过删除 `Site` 字段来修复. [#112](https://github.com/crawlab-team/crawlab/issues/112)
- **节点展示问题**. 当在多个机器上跑 Docker 容器时,节点无法正确展示. [#99](https://github.com/crawlab-team/crawlab/issues/99)
# 0.3.0 (2019-07-31)
### 功能 / 优化
- **Golang 后端**: 将后端由 Python 重构为 Golang,很大的提高了稳定性和性能.
- **节点网络图**: 节点拓扑图可视化.
- **节点系统信息**: 可以查看包括操作系统、CPU数量、可执行文件在内的系统信息.
- **节点监控改进**: 节点通过 Redis 来监控和注册.
- **文件管理**: 可以在线编辑爬虫文件,包括代码高亮.
- **登录页/注册页/用户管理**: 要求用户登录后才能使用 Crawlab, 允许用户注册和用户管理,有一些基于角色的鉴权机制.
- **自动部署爬虫**: 爬虫将被自动部署或同步到所有在线节点.
- **更小的 Docker 镜像**: 瘦身版 Docker 镜像,通过多阶段构建将 Docker 镜像大小从 1.3G 减小到 700M 左右.
### Bug 修复
- **节点状态**. 节点状态不会随着节点下线而更新. [#87](https://github.com/tikazyq/crawlab/issues/87)
- **爬虫部署错误**. 通过自动爬虫部署来修复 [#83](https://github.com/tikazyq/crawlab/issues/83)
- **节点无法显示**. 节点无法显示在线 [#81](https://github.com/tikazyq/crawlab/issues/81)
- **定时任务无法工作**. 通过 Golang 后端修复 [#64](https://github.com/tikazyq/crawlab/issues/64)
- **Flower 错误**. 通过 Golang 后端修复 [#57](https://github.com/tikazyq/crawlab/issues/57)
# 0.2.4 (2019-07-07)
### 功能 / 优化
- **文档**: 更优和更详细的文档.
- **更好的 Crontab**: 通过 UI 界面生成 Cron 表达式.
- **更优的性能**: 从原生 flask 引擎 切换到 `gunicorn`. [#78](https://github.com/tikazyq/crawlab/issues/78)
### Bug 修复
- **删除爬虫**. 删除爬虫时不止在数据库中删除,还应该删除相关的文件夹、任务和定时任务. [#69](https://github.com/tikazyq/crawlab/issues/69)
- **MongoDB 授权**. 允许用户注明 `authenticationDatabase` 来连接 `mongodb`. [#68](https://github.com/tikazyq/crawlab/issues/68)
- **Windows 兼容性**. 加入 `eventlet` 到 `requirements.txt`. [#59](https://github.com/tikazyq/crawlab/issues/59)
# 0.2.3 (2019-06-12)
### 功能 / 优化
- **Docker**: 用户能够运行 Docker 镜像来加快部署.
- **CLI**: 允许用户通过命令行来执行 Crawlab 程序.
- **上传爬虫**: 允许用户上传自定义爬虫到 Crawlab.
- **预览时编辑字段**: 允许用户在可配置爬虫中预览数据时编辑字段.
### Bug 修复
- **爬虫分页**. 爬虫列表页中修复分页问题.
# 0.2.2 (2019-05-30)
### 功能 / 优化
- **自动抓取字段**: 在可配置爬虫列表页种自动抓取字段.
- **下载结果**: 允许下载结果为 CSV 文件.
- **百度统计**: 允许用户选择是否允许向百度统计发送统计数据.
### Bug 修复
- **结果页分页**. [#45](https://github.com/tikazyq/crawlab/issues/45)
- **定时任务重复触发**: 将 Flask DEBUG 设置为 False 来保证定时任务无法重复触发. [#32](https://github.com/tikazyq/crawlab/issues/32)
- **前端环境**: 添加 `VUE_APP_BASE_URL` 作为生产环境模式变量,然后 API 不会永远都是 `localhost` [#30](https://github.com/tikazyq/crawlab/issues/30)
# 0.2.1 (2019-05-27)
- **可配置爬虫**: 允许用户创建爬虫来抓取数据,而不用编写代码.
# 0.2 (2019-05-10)
- **高级数据统计**: 爬虫详情页的高级数据统计.
- **网站数据**: 加入网站列表(中国),允许用户查看 robots.txt、首页响应时间等信息.
# 0.1.1 (2019-04-23)
- **基础统计**: 用户可以查看基础统计数据,包括爬虫和任务页中的失败任务数、结果数.
- **近实时任务信息**: 周期性(5 秒)向服务器轮训数据来实现近实时查看任务信息.
- **定时任务**: 利用 apscheduler 实现定时任务,允许用户设置类似 Cron 的定时任务.
# 0.1 (2019-04-17)
- **首次发布**
================================================
FILE: CHANGELOG.md
================================================
# 0.6.0 (TBC)
(TBC)
# 0.5.1 (2020-07-31)
### Features / Enhancement
- **Added error message details**.
- **Added Golang programming language support**.
- **Added web driver installation scripts for Chrome Driver and Firefox**.
- **Support system tasks**. A "system task" is similar to normal spider task, it allows users to view logs of general tasks such as installing languages.
- **Changed methods of installing languages from RPC to system tasks**.
### Bug Fixes
- **Fixed first download repo 500 error in Spider Market page**. [#808](https://github.com/crawlab-team/crawlab/issues/808)
- **Fixed some translation issues**.
- **Fixed 500 error in task detail page**. [#810](https://github.com/crawlab-team/crawlab/issues/810)
- **Fixed password reset issue**. [#811](https://github.com/crawlab-team/crawlab/issues/811)
- **Fixed unable to download CSV issue**. [#812](https://github.com/crawlab-team/crawlab/issues/812)
- **Fixed unable to install node.js issue**. [#813](https://github.com/crawlab-team/crawlab/issues/813)
- **Fixed disabled status for batch adding schedules**. [#814](https://github.com/crawlab-team/crawlab/issues/814)
# 0.5.0 (2020-07-19)
### Features / Enhancement
- **Spider Market**. Allow users to download open-source spiders into Crawlab.
- **Batch actions**. Allow users to interact with Crawlab in batch fashions, e.g. batch run tasks, batch delete spiders, ect.
- **Migrate MongoDB driver to `MongoDriver`**.
- **Refactor and optmize node-related logics**.
- **Change default `task.workers` to 16**.
- **Change default nginx `client_max_body_size` to 200m**.
- **Support writing logs to ElasticSearch**.
- **Display error details in Scrapy page**.
- **Removed Challenge page**.
- **Moved Feedback and Dislaimer pages to navbar**.
### Bug Fixes
- **Fixed log not expiring issue because of failure to create TTL index**.
- **Set default log expire duration to 1 day**.
- **`task_id` index not created**.
- **`docker-compose.yml` fix**.
- **Fixed 404 page**.
- **Fixed unable to create worker node before master node issue**.
# 0.4.10 (2020-04-21)
### Features / Enhancement
- **Enhanced Log Management**. Centralizing log storage in MongoDB, reduced the dependency of PubSub, allowing log error detection.
- **API Token**. Allow users to generate API tokens and use them to integrate into their own systems.
- **Web Hook**. Trigger a Web Hook http request to pre-defined URL when a task starts or finishes.
- **Auto Install Dependencies**. Allow installing dependencies automatically from `requirements.txt` or `package.json`.
- **Auto Results Collection**. Set results collection to `results_<spider_name>` if it is not set.
- **Optimized Project List**. Not display "No Project" item in the project list.
- **Upgrade Node.js**. Upgrade Node.js version from v8.12 to v10.19.
- **Add Run Button in Schedule Page**. Allow users to manually run task in Schedule Page.
### Bug Fixes
- **Cannot register**. [#670](https://github.com/crawlab-team/crawlab/issues/670)
- **Spider schedule tab cron expression shows second**. [#678](https://github.com/crawlab-team/crawlab/issues/678)
- **Missing daily stats in spider**. [#684](https://github.com/crawlab-team/crawlab/issues/684)
- **Results count not update in time**. [#689](https://github.com/crawlab-team/crawlab/issues/689)
# 0.4.9 (2020-03-31)
### Features / Enhancement
- **Challenges**. Users can achieve different challenges based on their actions.
- **More Advanced Access Control**. More granular access control, e.g. normal users can only view/manage their own spiders/projects and admin users can view/manage all spiders/projects.
- **Feedback**. Allow users to send feedbacks and ratings to Crawlab team.
- **Better Home Page Metrics**. Optimized metrics display on home page.
- **Configurable Spiders Converted to Customized Spiders**. Allow users to convert their configurable spiders into customized spiders which are also Scrapy spiders.
- **View Tasks Triggered by Schedule**. Allow users to view tasks triggered by a schedule. [#648](https://github.com/crawlab-team/crawlab/issues/648)
- **Support Results De-Duplication**. Allow users to configure de-duplication of results. [#579](https://github.com/crawlab-team/crawlab/issues/579)
- **Support Task Restart**. Allow users to re-run historical tasks.
### Bug Fixes
- **CLI unable to use on Windows**. [#580](https://github.com/crawlab-team/crawlab/issues/580)
- **Re-upload error**. [#643](https://github.com/crawlab-team/crawlab/issues/643) [#640](https://github.com/crawlab-team/crawlab/issues/640)
- **Upload missing folders**. [#646](https://github.com/crawlab-team/crawlab/issues/646)
- **Unable to add schedules in Spider Page**.
# 0.4.8 (2020-03-11)
### Features / Enhancement
- **Support Installations of More Programming Languages**. Now users can install or pre-install more programming languages including Java, .Net Core and PHP.
- **Installation UI Optimization**. Users can better view and manage installations on Node List page.
- **More Git Support**. Allow users to view Git Commits record, and allow checkout to corresponding commit.
- **Support Hostname Node Registration Type**. Users can set hostname as the node key as the unique identifier.
- **RPC Support**. Added RPC support to better manage node communication.
- **Run On Master Switch**. Users can determine whether to run tasks on master. If not, all tasks will be run only on worker nodes.
- **Disabled Tutorial by Default**.
- **Added Related Documentation Sidebar**.
- **Loading Page Optimization**.
### Bug Fixes
- **Duplicated Nodes**. [#391](https://github.com/crawlab-team/crawlab/issues/391)
- **Duplicated Spider Upload**. [#603](https://github.com/crawlab-team/crawlab/issues/603)
- **Failure in dependencies installation results in unusable dependency installation functionalities.**. [#609](https://github.com/crawlab-team/crawlab/issues/609)
- **Create Tasks for Offline Nodes**. [#622](https://github.com/crawlab-team/crawlab/issues/622)
# 0.4.7 (2020-02-24)
### Features / Enhancement
- **Better Support for Scrapy**. Spiders identification, `settings.py` configuration, log level selection, spider selection. [#435](https://github.com/crawlab-team/crawlab/issues/435)
- **Git Sync**. Allow users to sync git projects to Crawlab.
- **Long Task Support**. Users can add long-task spiders which is supposed to run without finishing. [#425](https://github.com/crawlab-team/crawlab/issues/425)
- **Spider List Optimization**. Tasks count by status, tasks detail popup, legend. [#425](https://github.com/crawlab-team/crawlab/issues/425)
- **Upgrade Check**. Check latest version and notifiy users to upgrade.
- **Spiders Batch Operation**. Allow users to run/stop spider tasks and delete spiders in batches.
- **Copy Spiders**. Allow users to copy an existing spider to create a new one.
- **Wechat Group QR Code**.
### Bug Fixes
- **Schedule Spider Selection Issue**. Fields not responding to spider change.
- **Cron Jobs Conflict**. Possible bug when two spiders set to the same time of their cron jobs. [#515](https://github.com/crawlab-team/crawlab/issues/515) [#565](https://github.com/crawlab-team/crawlab/issues/565)
- **Task Log Issue**. Different tasks write to the same log file if triggered at the same time. [#577](https://github.com/crawlab-team/crawlab/issues/577)
- **Task List Filter Options Incomplete**.
# 0.4.6 (2020-02-13)
### Features / Enhancement
- **SDK for Node.js**. Users can apply SDK in their Node.js spiders.
- **Log Management Optimization**. Log search, error highlight, auto-scrolling.
- **Task Execution Process Optimization**. Allow users to be redirected to task detail page after triggering a task.
- **Task Display Optimization**. Added "Param" in the Latest Tasks table in the spider detail page. [#295](https://github.com/crawlab-team/crawlab/issues/295)
- **Spider List Optimization**. Added "Update Time" and "Create Time" in spider list page.
- **Page Loading Placeholder**.
### Bug Fixes
- **Lost Focus in Schedule Configuration**. [#519](https://github.com/crawlab-team/crawlab/issues/519)
- **Unable to Upload Spider using CLI**. [#524](https://github.com/crawlab-team/crawlab/issues/524)
# 0.4.5 (2020-02-03)
### Features / Enhancement
- **Interactive Tutorial**. Guide users through the main functionalities of Crawlab.
- **Global Environment Variables**. Allow users to set global environment variables, which will be passed into all spider programs. [#177](https://github.com/crawlab-team/crawlab/issues/177)
- **Project**. Allow users to link spiders to projects. [#316](https://github.com/crawlab-team/crawlab/issues/316)
- **Demo Spiders**. Added demo spiders when Crawlab is initialized. [#379](https://github.com/crawlab-team/crawlab/issues/379)
- **User Admin Optimization**. Restrict privilleges of admin users. [#456](https://github.com/crawlab-team/crawlab/issues/456)
- **Setting Page Optimization**.
- **Task Results Optimization**.
### Bug Fixes
- **Unable to find spider file error**. [#485](https://github.com/crawlab-team/crawlab/issues/485)
- **Click delete button results in redirect**. [#480](https://github.com/crawlab-team/crawlab/issues/480)
- **Unable to create files in an empty spider**. [#479](https://github.com/crawlab-team/crawlab/issues/479)
- **Download results error**. [#465](https://github.com/crawlab-team/crawlab/issues/465)
- **crawlab-sdk CLI error**. [#458](https://github.com/crawlab-team/crawlab/issues/458)
- **Page refresh issue**. [#441](https://github.com/crawlab-team/crawlab/issues/441)
- **Results not support JSON**. [#202](https://github.com/crawlab-team/crawlab/issues/202)
- **Getting all spider after deleting a spider**.
- **i18n warning**.
# 0.4.4 (2020-01-17)
### Features / Enhancement
- **Email Notification**. Allow users to send email notifications.
- **DingTalk Robot Notification**. Allow users to send DingTalk Robot notifications.
- **Wechat Robot Notification**. Allow users to send Wechat Robot notifications.
- **API Address Optimization**. Added relative URL path in frontend so that users don't have to specify `CRAWLAB_API_ADDRESS` explicitly.
- **SDK Compatiblity**. Allow users to integrate Scrapy or general spiders with Crawlab SDK.
- **Enhanced File Management**. Added tree-like file sidebar to allow users to edit files much more easier.
- **Advanced Schedule Cron**. Allow users to edit schedule cron with visualized cron editor.
### Bug Fixes
- **`nil retuened` error**.
- **Error when using HTTPS**.
- **Unable to run Configurable Spiders on Spider List**.
- **Missing form validation before uploading spider files**.
# 0.4.3 (2020-01-07)
### Features / Enhancement
- **Dependency Installation**. Allow users to install/uninstall dependencies and add programming languages (Node.js only for now) on the platform web interface.
- **Pre-install Programming Languages in Docker**. Allow Docker users to set `CRAWLAB_SERVER_LANG_NODE` as `Y` to pre-install `Node.js` environments.
- **Add Schedule List in Spider Detail Page**. Allow users to view / add / edit schedule cron jobs in the spider detail page. [#360](https://github.com/crawlab-team/crawlab/issues/360)
- **Align Cron Expression with Linux**. Change the expression of 6 elements to 5 elements as aligned in Linux.
- **Enable/Disable Schedule Cron**. Allow users to enable/disable the schedule jobs. [#297](https://github.com/crawlab-team/crawlab/issues/297)
- **Better Task Management**. Allow users to batch delete tasks. [#341](https://github.com/crawlab-team/crawlab/issues/341)
- **Better Spider Management**. Allow users to sort and filter spiders in the spider list page.
- **Added Chinese `CHANGELOG`**.
- **Added Github Star Button at Nav Bar**.
### Bug Fixes
- **Schedule Cron Task Issue**. [#423](https://github.com/crawlab-team/crawlab/issues/423)
- **Upload Spider Zip File Issue**. [#403](https://github.com/crawlab-team/crawlab/issues/403) [#407](https://github.com/crawlab-team/crawlab/issues/407)
- **Exit due to Network Failure**. [#340](https://github.com/crawlab-team/crawlab/issues/340)
- **Cron Jobs not Running Correctly**
- **Schedule List Columns Mis-positioned**
- **Clicking Refresh Button Redirected to 404 Page**
# 0.4.2 (2019-12-26)
### Features / Enhancement
- **Disclaimer**. Added page for Disclaimer.
- **Call API to fetch version**. [#371](https://github.com/crawlab-team/crawlab/issues/371)
- **Configure to allow user registration**. [#346](https://github.com/crawlab-team/crawlab/issues/346)
- **Allow adding new users**.
- **More Advanced File Management**. Allow users to add / edit / rename / delete files. [#286](https://github.com/crawlab-team/crawlab/issues/286)
- **Optimized Spider Creation Process**. Allow users to create an empty customized spider before uploading the zip file.
- **Better Task Management**. Allow users to filter tasks by selecting through certian criterions. [#341](https://github.com/crawlab-team/crawlab/issues/341)
### Bug Fixes
- **Duplicated nodes**. [#391](https://github.com/crawlab-team/crawlab/issues/391)
- **"mongodb no reachable" error**. [#373](https://github.com/crawlab-team/crawlab/issues/373)
# 0.4.1 (2019-12-13)
### Features / Enhancement
- **Spiderfile Optimization**. Stages changed from dictionary to array. [#358](https://github.com/crawlab-team/crawlab/issues/358)
- **Baidu Tongji Update**.
### Bug Fixes
- **Unable to display schedule tasks**. [#353](https://github.com/crawlab-team/crawlab/issues/353)
- **Duplicate node registration**. [#334](https://github.com/crawlab-team/crawlab/issues/334)
# 0.4.0 (2019-12-06)
### Features / Enhancement
- **Configurable Spider**. Allow users to add spiders using *Spiderfile* to configure crawling rules.
- **Execution Mode**. Allow users to select 3 modes for task execution: *All Nodes*, *Selected Nodes* and *Random*.
### Bug Fixes
- **Task accidentally killed**. [#306](https://github.com/crawlab-team/crawlab/issues/306)
- **Documentation fix**. [#301](https://github.com/crawlab-team/crawlab/issues/258) [#301](https://github.com/crawlab-team/crawlab/issues/258)
- **Direct deploy incompatible with Windows**. [#288](https://github.com/crawlab-team/crawlab/issues/288)
- **Log files lost**. [#269](https://github.com/crawlab-team/crawlab/issues/269)
# 0.3.5 (2019-10-28)
### Features / Enhancement
- **Graceful Showdown**. [detail](https://github.com/crawlab-team/crawlab/commit/63fab3917b5a29fd9770f9f51f1572b9f0420385)
- **Node Info Optimization**. [detail](https://github.com/crawlab-team/crawlab/commit/973251a0fbe7a2184ac0da09e0404a17c736aee7)
- **Append System Environment Variables to Tasks**. [detail](https://github.com/crawlab-team/crawlab/commit/4ab4892471965d6342d30385578ca60dc51f8ad3)
- **Auto Refresh Task Log**. [detail](https://github.com/crawlab-team/crawlab/commit/4ab4892471965d6342d30385578ca60dc51f8ad3)
- **Enable HTTPS Deployment**. [detail](https://github.com/crawlab-team/crawlab/commit/5d8f6f0c56768a6e58f5e46cbf5adff8c7819228)
### Bug Fixes
- **Unable to fetch spider list info in schedule jobs**. [detail](https://github.com/crawlab-team/crawlab/commit/311f72da19094e3fa05ab4af49812f58843d8d93)
- **Unable to fetch node info from worker nodes**. [detail](https://github.com/crawlab-team/crawlab/commit/6af06efc17685a9e232e8c2b5fd819ec7d2d1674)
- **Unable to select node when trying to run spider tasks**. [detail](https://github.com/crawlab-team/crawlab/commit/31f8e03234426e97aed9b0bce6a50562f957edad)
- **Unable to fetch result count when result volume is large**. [#260](https://github.com/crawlab-team/crawlab/issues/260)
- **Node issue in schedule tasks**. [#244](https://github.com/crawlab-team/crawlab/issues/244)
# 0.3.1 (2019-08-25)
### Features / Enhancement
- **Docker Image Optimization**. Split docker further into master, worker, frontend with alpine image.
- **Unit Tests**. Covered part of the backend code with unit tests.
- **Frontend Optimization**. Login page, button size, hints of upload UI optimization.
- **More Flexible Node Registration**. Allow users to pass a variable as key for node registration instead of MAC by default.
### Bug Fixes
- **Uploading Large Spider Files Error**. Memory crash issue when uploading large spider files. [#150](https://github.com/crawlab-team/crawlab/issues/150)
- **Unable to Sync Spiders**. Fixes through increasing level of write permission when synchronizing spider files. [#114](https://github.com/crawlab-team/crawlab/issues/114)
- **Spider Page Issue**. Fixes through removing the field "Site". [#112](https://github.com/crawlab-team/crawlab/issues/112)
- **Node Display Issue**. Nodes do not display correctly when running docker containers on multiple machines. [#99](https://github.com/crawlab-team/crawlab/issues/99)
# 0.3.0 (2019-07-31)
### Features / Enhancement
- **Golang Backend**: Refactored code from Python backend to Golang, much more stability and performance.
- **Node Network Graph**: Visualization of node typology.
- **Node System Info**: Available to see system info including OS, CPUs and executables.
- **Node Monitoring Enhancement**: Nodes are monitored and registered through Redis.
- **File Management**: Available to edit spider files online, including code highlight.
- **Login/Regiser/User Management**: Require users to login to use Crawlab, allow user registration and user management, some role-based authorization.
- **Automatic Spider Deployment**: Spiders are deployed/synchronized to all online nodes automatically.
- **Smaller Docker Image**: Slimmed Docker image and reduced Docker image size from 1.3G to \~700M by applying Multi-Stage Build.
### Bug Fixes
- **Node Status**. Node status does not change even though it goes offline actually. [#87](https://github.com/tikazyq/crawlab/issues/87)
- **Spider Deployment Error**. Fixed through Automatic Spider Deployment [#83](https://github.com/tikazyq/crawlab/issues/83)
- **Node not showing**. Node not able to show online [#81](https://github.com/tikazyq/crawlab/issues/81)
- **Cron Job not working**. Fixed through new Golang backend [#64](https://github.com/tikazyq/crawlab/issues/64)
- **Flower Error**. Fixed through new Golang backend [#57](https://github.com/tikazyq/crawlab/issues/57)
# 0.2.4 (2019-07-07)
### Features / Enhancement
- **Documentation**: Better and much more detailed documentation.
- **Better Crontab**: Make crontab expression through crontab UI.
- **Better Performance**: Switched from native flask engine to `gunicorn`. [#78](https://github.com/tikazyq/crawlab/issues/78)
### Bugs Fixes
- **Deleting Spider**. Deleting a spider does not only remove record in db but also removing related folder, tasks and schedules. [#69](https://github.com/tikazyq/crawlab/issues/69)
- **MongoDB Auth**. Allow user to specify `authenticationDatabase` to connect to `mongodb`. [#68](https://github.com/tikazyq/crawlab/issues/68)
- **Windows Compatibility**. Added `eventlet` to `requirements.txt`. [#59](https://github.com/tikazyq/crawlab/issues/59)
# 0.2.3 (2019-06-12)
### Features / Enhancement
- **Docker**: User can run docker image to speed up deployment.
- **CLI**: Allow user to use command-line interface to execute Crawlab programs.
- **Upload Spider**: Allow user to upload Customized Spider to Crawlab.
- **Edit Fields on Preview**: Allow user to edit fields when previewing data in Configurable Spider.
### Bugs Fixes
- **Spiders Pagination**. Fixed pagination problem in spider page.
# 0.2.2 (2019-05-30)
### Features / Enhancement
- **Automatic Extract Fields**: Automatically extracting data fields in list pages for configurable spider.
- **Download Results**: Allow downloading results as csv file.
- **Baidu Tongji**: Allow users to choose to report usage info to Baidu Tongji.
### Bug Fixes
- **Results Page Pagination**: Fixes so the pagination of results page is working correctly. [#45](https://github.com/tikazyq/crawlab/issues/45)
- **Schedule Tasks Duplicated Triggers**: Set Flask DEBUG as False so that schedule tasks won't trigger twice. [#32](https://github.com/tikazyq/crawlab/issues/32)
- **Frontend Environment**: Added `VUE_APP_BASE_URL` as production mode environment variable so the API call won't be always `localhost` in deployed env [#30](https://github.com/tikazyq/crawlab/issues/30)
# 0.2.1 (2019-05-27)
- **Configurable Spider**: Allow users to create a spider to crawl data without coding.
# 0.2 (2019-05-10)
- **Advanced Stats**: Advanced analytics in spider detail view.
- **Sites Data**: Added sites list (China) for users to check info such as robots.txt and home page response time/code.
# 0.1.1 (2019-04-23)
- **Basic Stats**: User can view basic stats such as number of failed tasks and number of results in spiders and tasks pages.
- **Near Realtime Task Info**: Periodically (5 sec) polling data from server to allow view task info in a near-realtime fashion.
- **Scheduled Tasks**: Allow users to set up cron-like scheduled/periodical tasks using apscheduler.
# 0.1 (2019-04-17)
- **Initial Release**
================================================
FILE: DISCLAIMER-zh.md
================================================
# 免责声明
本免责及隐私保护声明(以下简称“免责声明”或“本声明”)适用于 Crawlab 开发组 (以下简称“开发组”)研发的系列软件(以下简称"Crawlab") 在您阅读本声明后若不同意此声明中的任何条款,或对本声明存在质疑,请立刻停止使用我们的软件。若您已经开始或正在使用 Crawlab,则表示您已阅读并同意本声明的所有条款之约定。
1. 总则:您通过安装 Crawlab 并使用 Crawlab 提供的服务与功能即表示您已经同意与开发组立本协议。开发组可随时执行全权决定更改“条款”。经修订的“条款”一经在 Github 免责声明页面上公布后,立即自动生效。
2. 本产品是基于Golang的分布式爬虫管理平台,支持Python、NodeJS、Go、Java、PHP等多种编程语言以及多种爬虫框架。
3. 一切因使用 Crawlab 而引致之任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其所造成的损失(包括在非官方站点下载 Crawlab 而感染电脑病毒),Crawlab 开发组概不负责,亦不承担任何法律责任。
4. 用户对使用 Crawlab 自行承担风险,我们不做任何形式的保证, 因网络状况、通讯线路等任何技术原因而导致用户不能正常升级更新,我们也不承担任何法律责任。
5. 用户使用 Crawlab 对目标网站进行抓取时需遵从《网络安全法》等与爬虫相关的法律法规,切勿擅自采集公民个人信息、用 DDoS 等方式造成目标网站瘫痪、不遵从目标网站的 robots.txt 协议等非法手段。
6. Crawlab 尊重并保护所有用户的个人隐私权,不会窃取任何用户计算机中的信息。
7. 系统的版权:Crawlab 开发组对所有开发的或合作开发的产品拥有知识产权,著作权,版权和使用权,这些产品受到适用的知识产权、版权、商标、服务商标、专利或其他法律的保护。
8. 传播:任何公司或个人在网络上发布,传播我们软件的行为都是允许的,但因公司或个人传播软件可能造成的任何法律和刑事事件 Crawlab 开发组不负任何责任。
================================================
FILE: DISCLAIMER.md
================================================
# Disclaimer
This Disclaimer and privacy protection statement (hereinafter referred to as "disclaimer statement" or "this statement") is applicable to the series of software (hereinafter referred to as "crawlab") developed by crawlab development group (hereinafter referred to as "development group") after you read this statement, if you do not agree with any terms in this statement or have doubts about this statement, please stop using our software immediately. If you have started or are using crawlab, you have read and agree to all terms of this statement.
1. General: by installing crawlab and using the services and functions provided by crawlab, you have agreed to establish this agreement with the development team. The developer group may at any time change the terms at its sole discretion. The amended "terms" shall take effect automatically as soon as they are published on the GitHub disclaimer page.
2. This product is a distributed crawler management platform based on golang, supporting python, nodejs, go, Java, PHP and other programming languages as well as a variety of crawler frameworks.
3. The development team of crawlab shall not be responsible for any accident, negligence, contract damage, defamation, copyright or intellectual property infringement caused by the use of crawlab and any loss caused by it (including computer virus infection caused by downloading crawlab on the unofficial site), and shall not bear any legal responsibility.
4. The user shall bear the risk of using crawlab by himself, we do not make any form of guarantee, and we will not bear any legal responsibility for the user's failure to upgrade and update normally due to any technical reasons such as network condition and communication line.
5. When users use crawlab to grab the target website, they need to comply with the laws and regulations related to crawlers, such as the network security law. Do not collect personal information of citizens without authorization, cause the target website to be paralyzed by DDoS, or fail to comply with the robots.txt protocol and other illegal means of the target website.
6. Crawlab respects and protects the personal privacy of all users and will not steal any information from users' computers.
7. Copyright of the system: Crawlab development team owns the intellectual property rights, copyrights, copyrights and use rights for all developed or jointly developed products, which are protected by applicable intellectual property rights, copyrights, trademarks, service trademarks, patents or other laws.
8. Communication: any company or individual who publishes or disseminates our software on the Internet is allowed, but the crawlab development team shall not be responsible for any legal and criminal events that may be caused by the company or individual disseminating the software.
================================================
FILE: Dockerfile
================================================
FROM crawlabteam/crawlab-backend:latest AS backend-build
FROM crawlabteam/crawlab-frontend:latest AS frontend-build
FROM crawlabteam/crawlab-public-plugins:latest AS public-plugins-build
# images
FROM crawlabteam/crawlab-base:latest
# add files
COPY ./backend/conf /app/backend/conf
COPY ./nginx /app/nginx
COPY ./bin /app/bin
# copy backend files
RUN mkdir -p /opt/bin
COPY --from=backend-build /go/bin/crawlab /opt/bin
RUN cp /opt/bin/crawlab /usr/local/bin/crawlab-server
# copy frontend files
COPY --from=frontend-build /app/dist /app/dist
# copy public-plugins files
COPY --from=public-plugins-build /app/plugins /app/plugins
# copy nginx config files
COPY ./nginx/crawlab.conf /etc/nginx/conf.d
# start backend
CMD ["/bin/bash", "/app/bin/docker-init.sh"]
================================================
FILE: LICENSE
================================================
BSD 3-Clause License
Copyright (c) 2020, Crawlab Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README-zh.md
================================================
# Crawlab
<p>
<a href="https://github.com/crawlab-team/crawlab/actions/workflows/docker-crawlab.yml" target="_blank">
<img src="https://github.com/crawlab-team/crawlab/workflows/Docker%20Image%20CI:%20crawlab/badge.svg">
</a>
<a href="https://hub.docker.com/r/tikazyq/crawlab" target="_blank">
<img src="https://img.shields.io/docker/pulls/tikazyq/crawlab?label=pulls&logo=docker">
</a>
<a href="https://github.com/crawlab-team/crawlab/releases" target="_blank">
<img src="https://img.shields.io/github/release/crawlab-team/crawlab.svg?logo=github">
</a>
<a href="https://github.com/crawlab-team/crawlab/commits/main" target="_blank">
<img src="https://img.shields.io/github/last-commit/crawlab-team/crawlab.svg">
</a>
<a href="https://github.com/crawlab-team/crawlab/issues?q=is%3Aissue+is%3Aopen+label%3Abug" target="_blank">
<img src="https://img.shields.io/github/issues/crawlab-team/crawlab/bug.svg?label=bugs&color=red">
</a>
<a href="https://github.com/crawlab-team/crawlab/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement" target="_blank">
<img src="https://img.shields.io/github/issues/crawlab-team/crawlab/enhancement.svg?label=enhancements&color=cyan">
</a>
<a href="https://github.com/crawlab-team/crawlab/blob/main/LICENSE" target="_blank">
<img src="https://img.shields.io/github/license/crawlab-team/crawlab.svg">
</a>
</p>
中文 | [English](https://github.com/crawlab-team/crawlab)
[安装](#安装) | [运行](#运行) | [截图](#截图) | [架构](#架构) | [集成](#与其他框架的集成) | [比较](#与其他框架比较) | [相关文章](#相关文章) | [社区&赞助](#社区--赞助) | [更新日志](https://github.com/crawlab-team/crawlab/blob/main/CHANGELOG-zh.md) | [免责声明](https://github.com/crawlab-team/crawlab/blob/main/DISCLAIMER-zh.md)
基于Golang的分布式爬虫管理平台,支持Python、NodeJS、Go、Java、PHP等多种编程语言以及多种爬虫框架。
[查看演示 Demo](https://demo.crawlab.cn) | [文档](https://docs.crawlab.cn/zh/)
## 安装
您可以参考这个[安装指南](https://docs.crawlab.cn/zh/guide/installation)。
## 快速开始
请打开命令行并执行下列命令。请保证您已经提前安装了 `docker-compose`。
```bash
git clone https://github.com/crawlab-team/examples
cd examples/docker/basic
docker-compose up -d
```
接下来,您可以看看 `docker-compose.yml` (包含详细配置参数),以及参考 [文档](http://docs.crawlab.cn) 来查看更多信息。
## 运行
### Docker
请用`docker-compose`来一键启动,甚至不用配置 MongoDB 数据库,**当然我们推荐这样做**。在当前目录中创建`docker-compose.yml`文件,输入以下内容。
```yaml
version: '3.3'
services:
master:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_master
environment:
CRAWLAB_NODE_MASTER: "Y"
CRAWLAB_MONGO_HOST: "mongo"
volumes:
- "./.crawlab/master:/root/.crawlab"
ports:
- "8080:8080"
depends_on:
- mongo
worker01:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_worker01
environment:
CRAWLAB_NODE_MASTER: "N"
CRAWLAB_GRPC_ADDRESS: "master"
CRAWLAB_FS_FILER_URL: "http://master:8080/api/filer"
volumes:
- "./.crawlab/worker01:/root/.crawlab"
depends_on:
- master
worker02:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_worker02
environment:
CRAWLAB_NODE_MASTER: "N"
CRAWLAB_GRPC_ADDRESS: "master"
CRAWLAB_FS_FILER_URL: "http://master:8080/api/filer"
volumes:
- "./.crawlab/worker02:/root/.crawlab"
depends_on:
- master
mongo:
image: mongo:4.2
container_name: crawlab_example_mongo
restart: always
```
然后执行以下命令,Crawlab主节点、工作节点+MongoDB 就启动了。打开`http://localhost:8080`就能看到界面。
```bash
docker-compose up -d
```
Docker部署的详情,请见[相关文档](https://docs.crawlab.cn/zh/guide/installation/docker.html)。
## 截图
#### 登陆页

#### 主页

#### 节点列表

#### 爬虫列表

#### 爬虫概览

#### 爬虫文件

#### 任务日志

#### 任务结果

#### 定时任务

## 架构
Crawlab的架构包括了一个主节点(Master Node)和多个工作节点(Worker Node),以及 [SeaweedFS](https://github.com/chrislusf/seaweedfs) (分布式文件系统) 和 MongoDB 数据库。

前端应用与主节点 (Master Node) 进行交互,主节点与其他模块(例如 MongoDB、SeaweedFS、工作节点)进行通信。主节点和工作节点 (Worker Nodes) 通过 [gRPC](https://grpc.io) (一种 RPC 框架) 进行通信。任务通过主节点上的任务调度器 (Task Scheduler) 进行调度分发,并被工作节点上的任务处理模块 (Task Handler) 接收,然后分配到任务执行器 (Task Runners) 中。任务执行器实际上是执行爬虫程序的进程,它可以通过 gRPC (内置于 SDK) 发送数据到其他数据源中,例如 MongoDB。
### 主节点
主节点是整个Crawlab架构的核心,属于Crawlab的中控系统。
主节点主要负责以下功能:
1. 爬虫任务调度
2. 工作节点管理和通信
3. 爬虫部署
4. 前端以及API服务
5. 执行任务(可以将主节点当成工作节点)
主节点负责与前端应用进行通信,并将爬虫任务派发给工作节点。同时,主节点会同步(部署)爬虫到分布式文件系统 SeaweedFS,用于工作节点的文件同步。
### 工作节点
工作节点的主要功能是执行爬虫任务和储存抓取数据与日志,并且通过Redis的`PubSub`跟主节点通信。通过增加工作节点数量,Crawlab可以做到横向扩展,不同的爬虫任务可以分配到不同的节点上执行。
### MongoDB
MongoDB是Crawlab的运行数据库,储存有节点、爬虫、任务、定时任务等数据。任务队列也储存在 MongoDB 里。
### SeaweedFS
SeaweedFS 是开源分布式文件系统,由 [Chris Lu](https://github.com/chrislusf) 开发和维护。它能在分布式系统中有效稳定的储存和共享文件。在 Crawlab 中,SeaweedFS 主要用作文件同步和日志存储。
### 前端
Frontend app is built upon [Element-Plus](https://github.com/element-plus/element-plus), a popular [Vue 3](https://github.com/vuejs/vue-next)-based UI framework. It interacts with API hosted on the Master Node, and indirectly controls Worker Nodes.
前端应用是基于 [Element-Plus](https://github.com/element-plus/element-plus) 构建的,它是基于 [Vue 3](https://github.com/vuejs/vue-next) 的 UI 框架。前端应用与主节点上的 API 进行交互,并间接控制工作节点。
## 与其他框架的集成
[Crawlab SDK](https://github.com/crawlab-team/crawlab-sdk) 提供了一些 `helper` 方法来让您的爬虫更好的集成到 Crawlab 中,例如保存结果数据到 Crawlab 中等等。
### 集成 Scrapy
在 `settings.py` 中找到 `ITEM_PIPELINES`(`dict` 类型的变量),在其中添加如下内容。
```python
ITEM_PIPELINES = {
'crawlab.scrapy.pipelines.CrawlabPipeline': 888,
}
```
然后,启动 Scrapy 爬虫,运行完成之后,您就应该能看到抓取结果出现在 **任务详情 -> 数据** 里。
### 通用 Python 爬虫
将下列代码加入到您爬虫中的结果保存部分。
```python
# 引入保存结果方法
from crawlab import save_item
# 这是一个结果,需要为 dict 类型
result = {'name': 'crawlab'}
# 调用保存结果方法
save_item(result)
```
然后,启动爬虫,运行完成之后,您就应该能看到抓取结果出现在 **任务详情 -> 数据** 里。
### 其他框架和语言
爬虫任务实际上是通过 shell 命令执行的。任务 ID (Task ID) 作为环境变量 `CRAWLAB_TASK_ID` 被传入爬虫任务进程中,从而抓取的数据可以跟任务管理。
## 与其他框架比较
现在已经有一些爬虫管理框架了,因此为啥还要用Crawlab?
因为很多现有当平台都依赖于Scrapyd,限制了爬虫的编程语言以及框架,爬虫工程师只能用scrapy和python。当然,scrapy是非常优秀的爬虫框架,但是它不能做一切事情。
Crawlab使用起来很方便,也很通用,可以适用于几乎任何主流语言和框架。它还有一个精美的前端界面,让用户可以方便的管理和运行爬虫。
|框架 | 技术 | 优点 | 缺点 | Github 统计数据 |
|:---|:---|:---|-----| :---- |
| [Crawlab](https://github.com/crawlab-team/crawlab) | Golang + Vue|不局限于 scrapy,可以运行任何语言和框架的爬虫,精美的 UI 界面,天然支持分布式爬虫,支持节点管理、爬虫管理、任务管理、定时任务、结果导出、数据统计、消息通知、可配置爬虫、在线编辑代码等功能|暂时不支持爬虫版本管理|   |
| [ScrapydWeb](https://github.com/my8100/scrapydweb) | Python Flask + Vue|精美的 UI 界面,内置了 scrapy 日志解析器,有较多任务运行统计图表,支持节点管理、定时任务、邮件提醒、移动界面,算是 scrapy-based 中功能完善的爬虫管理平台|不支持 scrapy 以外的爬虫,Python Flask 为后端,性能上有一定局限性|   |
| [Gerapy](https://github.com/Gerapy/Gerapy) | Python Django + Vue|Gerapy 是崔庆才大神开发的爬虫管理平台,安装部署非常简单,同样基于 scrapyd,有精美的 UI 界面,支持节点管理、代码编辑、可配置规则等功能|同样不支持 scrapy 以外的爬虫,而且据使用者反馈,1.0 版本有很多 bug,期待 2.0 版本会有一定程度的改进|   |
| [SpiderKeeper](https://github.com/DormyMo/SpiderKeeper) | Python Flask|基于 scrapyd,开源版 Scrapyhub,非常简洁的 UI 界面,支持定时任务|可能有些过于简洁了,不支持分页,不支持节点管理,不支持 scrapy 以外的爬虫|   |
## 贡献者
<a href="https://github.com/tikazyq">
<img src="https://avatars3.githubusercontent.com/u/3393101?s=460&v=4" height="80">
</a>
<a href="https://github.com/wo10378931">
<img src="https://avatars2.githubusercontent.com/u/8297691?s=460&v=4" height="80">
</a>
<a href="https://github.com/yaziming">
<img src="https://avatars2.githubusercontent.com/u/54052849?s=460&v=4" height="80">
</a>
<a href="https://github.com/hantmac">
<img src="https://avatars2.githubusercontent.com/u/7600925?s=460&v=4" height="80">
</a>
<a href="https://github.com/duanbin0414">
<img src="https://avatars3.githubusercontent.com/u/50389867?s=460&v=4" height="80">
</a>
<a href="https://github.com/zkqiang">
<img src="https://avatars3.githubusercontent.com/u/32983588?s=460&u=83082ddc0a3020279374b94cce70f1aebb220b3d&v=4" height="80">
</a>
## JetBrains 支持
<p align="center">
<a href="https://www.jetbrains.com" target="_blank">
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png" height="360">
</a>
</p>
## 社区
如果您觉得Crawlab对您的日常开发或公司有帮助,请加作者微信 tikazyq1 并注明"Crawlab",作者会将你拉入群。
<p align="center">
<img src="https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/qrcode.png" height="360">
</p>
================================================
FILE: README.md
================================================
# Crawlab
<p>
<a href="https://github.com/crawlab-team/crawlab/actions/workflows/docker-crawlab.yml" target="_blank">
<img src="https://github.com/crawlab-team/crawlab/workflows/Docker%20Image%20CI:%20crawlab/badge.svg">
</a>
<a href="https://github.com/crawlab-team/crawlab/releases" target="_blank">
<img src="https://img.shields.io/github/release/crawlab-team/crawlab.svg?logo=github">
</a>
<a href="https://github.com/crawlab-team/crawlab/commits/main" target="_blank">
<img src="https://img.shields.io/github/last-commit/crawlab-team/crawlab.svg">
</a>
<a href="https://github.com/crawlab-team/crawlab/issues?q=is%3Aissue+is%3Aopen+label%3Abug" target="_blank">
<img src="https://img.shields.io/github/issues/crawlab-team/crawlab/bug.svg?label=bugs&color=red">
</a>
<a href="https://github.com/crawlab-team/crawlab/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement" target="_blank">
<img src="https://img.shields.io/github/issues/crawlab-team/crawlab/enhancement.svg?label=enhancements&color=cyan">
</a>
<a href="https://github.com/crawlab-team/crawlab/blob/main/LICENSE" target="_blank">
<img src="https://img.shields.io/github/license/crawlab-team/crawlab.svg">
</a>
</p>
[中文](https://github.com/crawlab-team/crawlab/blob/main/README-zh.md) | English
[Installation](#installation) | [Run](#run) | [Screenshot](#screenshot) | [Architecture](#architecture) | [Integration](#integration-with-other-frameworks) | [Compare](#comparison-with-other-frameworks) | [Community & Sponsorship](#community--sponsorship) | [CHANGELOG](https://github.com/crawlab-team/crawlab/blob/main/CHANGELOG.md) | [Disclaimer](https://github.com/crawlab-team/crawlab/blob/main/DISCLAIMER.md)
Golang-based distributed web crawler management platform, supporting various languages including Python, NodeJS, Go, Java, PHP and various web crawler frameworks including Scrapy, Puppeteer, Selenium.
[Demo](https://demo.crawlab.cn) | [Documentation](https://docs.crawlab.cn/en/)
## Installation
You can follow the [installation guide](https://docs.crawlab.cn/en/guide/installation/).
## Quick Start
Please open the command line prompt and execute the command below. Make sure you have installed `docker-compose` in advance.
```bash
git clone https://github.com/crawlab-team/examples
cd examples/docker/basic
docker-compose up -d
```
Next, you can look into the `docker-compose.yml` (with detailed config params) and the [Documentation](http://docs.crawlab.cn/en/) for further information.
## Run
### Docker
Please use `docker-compose` to one-click to start up. By doing so, you don't even have to configure MongoDB database. Create a file named `docker-compose.yml` and input the code below.
```yaml
version: '3.3'
services:
master:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_master
environment:
CRAWLAB_NODE_MASTER: "Y"
CRAWLAB_MONGO_HOST: "mongo"
volumes:
- "./.crawlab/master:/root/.crawlab"
ports:
- "8080:8080"
depends_on:
- mongo
worker01:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_worker01
environment:
CRAWLAB_NODE_MASTER: "N"
CRAWLAB_GRPC_ADDRESS: "master"
CRAWLAB_FS_FILER_URL: "http://master:8080/api/filer"
volumes:
- "./.crawlab/worker01:/root/.crawlab"
depends_on:
- master
worker02:
image: crawlabteam/crawlab:latest
container_name: crawlab_example_worker02
environment:
CRAWLAB_NODE_MASTER: "N"
CRAWLAB_GRPC_ADDRESS: "master"
CRAWLAB_FS_FILER_URL: "http://master:8080/api/filer"
volumes:
- "./.crawlab/worker02:/root/.crawlab"
depends_on:
- master
mongo:
image: mongo:4.2
container_name: crawlab_example_mongo
restart: always
```
Then execute the command below, and Crawlab Master and Worker Nodes + MongoDB will start up. Open the browser and enter `http://localhost:8080` to see the UI interface.
```bash
docker-compose up -d
```
For Docker Deployment details, please refer to [relevant documentation](https://docs.crawlab.cn/en/guide/installation/docker.html).
## Screenshot
#### Login

#### Home Page

#### Node List

#### Spider List

#### Spider Overview

#### Spider Files

#### Task Log

#### Task Results

#### Cron Job

## Architecture
The architecture of Crawlab is consisted of a master node, worker nodes, [SeaweedFS](https://github.com/chrislusf/seaweedfs) (a distributed file system) and MongoDB database.

The frontend app interacts with the master node, which communicates with other components such as MongoDB, SeaweedFS and worker nodes. Master node and worker nodes communicate with each other via [gRPC](https://grpc.io) (a RPC framework). Tasks are scheduled by the task scheduler module in the master node, and received by the task handler module in worker nodes, which executes these tasks in task runners. Task runners are actually processes running spider or crawler programs, and can also send data through gRPC (integrated in SDK) to other data sources, e.g. MongoDB.
### Master Node
The Master Node is the core of the Crawlab architecture. It is the center control system of Crawlab.
The Master Node provides below services:
1. Task Scheduling;
2. Worker Node Management and Communication;
3. Spider Deployment;
4. Frontend and API Services;
5. Task Execution (you can regard the Master Node as a Worker Node)
The Master Node communicates with the frontend app, and send crawling tasks to Worker Nodes. In the mean time, the Master Node uploads (deploys) spiders to the distributed file system SeaweedFS, for synchronization by worker nodes.
### Worker Node
The main functionality of the Worker Nodes is to execute crawling tasks and store results and logs, and communicate with the Master Node through gRPC. By increasing the number of Worker Nodes, Crawlab can scale horizontally, and different crawling tasks can be assigned to different nodes to execute.
### MongoDB
MongoDB is the operational database of Crawlab. It stores data of nodes, spiders, tasks, schedules, etc. Task queue is also stored in MongoDB.
### SeaweedFS
SeaweedFS is an open source distributed file system authored by [Chris Lu](https://github.com/chrislusf). It can robustly store and share files across a distributed system. In Crawlab, SeaweedFS mainly plays the role as file synchronization system and the place where task log files are stored.
### Frontend
Frontend app is built upon [Element-Plus](https://github.com/element-plus/element-plus), a popular [Vue 3](https://github.com/vuejs/vue-next)-based UI framework. It interacts with API hosted on the Master Node, and indirectly controls Worker Nodes.
## Integration with Other Frameworks
[Crawlab SDK](https://github.com/crawlab-team/crawlab-sdk) provides some `helper` methods to make it easier for you to integrate your spiders into Crawlab, e.g. saving results.
### Scrapy
In `settings.py` in your Scrapy project, find the variable named `ITEM_PIPELINES` (a `dict` variable). Add content below.
```python
ITEM_PIPELINES = {
'crawlab.scrapy.pipelines.CrawlabPipeline': 888,
}
```
Then, start the Scrapy spider. After it's done, you should be able to see scraped results in **Task Detail -> Data**
### General Python Spider
Please add below content to your spider files to save results.
```python
# import result saving method
from crawlab import save_item
# this is a result record, must be dict type
result = {'name': 'crawlab'}
# call result saving method
save_item(result)
```
Then, start the spider. After it's done, you should be able to see scraped results in **Task Detail -> Data**
### Other Frameworks / Languages
A crawling task is actually executed through a shell command. The Task ID will be passed to the crawling task process in the form of environment variable named `CRAWLAB_TASK_ID`. By doing so, the data can be related to a task.
## Comparison with Other Frameworks
There are existing spider management frameworks. So why use Crawlab?
The reason is that most of the existing platforms are depending on Scrapyd, which limits the choice only within python and scrapy. Surely scrapy is a great web crawl framework, but it cannot do everything.
Crawlab is easy to use, general enough to adapt spiders in any language and any framework. It has also a beautiful frontend interface for users to manage spiders much more easily.
|Framework | Technology | Pros | Cons | Github Stats |
|:---|:---|:---|-----| :---- |
| [Crawlab](https://github.com/crawlab-team/crawlab) | Golang + Vue|Not limited to Scrapy, available for all programming languages and frameworks. Beautiful UI interface. Naturally support distributed spiders. Support spider management, task management, cron job, result export, analytics, notifications, configurable spiders, online code editor, etc.|Not yet support spider versioning|   |
| [ScrapydWeb](https://github.com/my8100/scrapydweb) | Python Flask + Vue|Beautiful UI interface, built-in Scrapy log parser, stats and graphs for task execution, support node management, cron job, mail notification, mobile. Full-feature spider management platform.|Not support spiders other than Scrapy. Limited performance because of Python Flask backend.|   |
| [Gerapy](https://github.com/Gerapy/Gerapy) | Python Django + Vue|Gerapy is built by web crawler guru [Germey Cui](https://github.com/Germey). Simple installation and deployment. Beautiful UI interface. Support node management, code edit, configurable crawl rules, etc.|Again not support spiders other than Scrapy. A lot of bugs based on user feedback in v1.0. Look forward to improvement in v2.0|   |
| [SpiderKeeper](https://github.com/DormyMo/SpiderKeeper) | Python Flask|Open-source Scrapyhub. Concise and simple UI interface. Support cron job.|Perhaps too simplified, not support pagination, not support node management, not support spiders other than Scrapy.|   |
## Contributors
<a href="https://github.com/tikazyq">
<img src="https://avatars3.githubusercontent.com/u/3393101?s=460&v=4" height="80">
</a>
<a href="https://github.com/wo10378931">
<img src="https://avatars2.githubusercontent.com/u/8297691?s=460&v=4" height="80">
</a>
<a href="https://github.com/yaziming">
<img src="https://avatars2.githubusercontent.com/u/54052849?s=460&v=4" height="80">
</a>
<a href="https://github.com/hantmac">
<img src="https://avatars2.githubusercontent.com/u/7600925?s=460&v=4" height="80">
</a>
<a href="https://github.com/duanbin0414">
<img src="https://avatars3.githubusercontent.com/u/50389867?s=460&v=4" height="80">
</a>
<a href="https://github.com/zkqiang">
<img src="https://avatars3.githubusercontent.com/u/32983588?s=460&u=83082ddc0a3020279374b94cce70f1aebb220b3d&v=4" height="80">
</a>
## Supported by JetBrains
<p align="center">
<a href="https://www.jetbrains.com" target="_blank">
<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.png" height="360">
</a>
</p>
## Community
If you feel Crawlab could benefit your daily work or your company, please add the author's Wechat account noting "Crawlab" to enter the discussion group.
<p align="center">
<img src="https://crawlab.oss-cn-hangzhou.aliyuncs.com/gitbook/qrcode.png" height="360">
</p>
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 0.6.x | :white_check_mark: |
| 0.5.x | :white_check_mark: |
| < 0.5 | :x: |
## Reporting a Vulnerability
If you encounter a security vulnerability, please submit an issue with tag "security" and highlight the reasons and impact of the security vulnerability.
================================================
FILE: backend/.air.master.conf
================================================
# Config file for [Air](https://github.com/cosmtrek/air) in TOML format
# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "/tmp"
[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ../tmp/main ./ "
# Binary file yields from `cmd`.
bin = "../tmp/main"
# Customize binary.
full_bin = "../tmp/main master"
# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = ["../libs"]
# Exclude files.
exclude_file = []
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms
[log]
# Show log time
time = false
[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"
[misc]
# Delete tmp directory on exit
clean_on_exit = true
================================================
FILE: backend/.air.worker.conf
================================================
# Config file for [Air](https://github.com/cosmtrek/air) in TOML format
# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "/tmp"
[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ../tmp/main ./ "
# Binary file yields from `cmd`.
bin = "../tmp/main"
# Customize binary.
full_bin = "../tmp/main worker"
# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = ["../libs"]
# Exclude files.
exclude_file = []
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms
[log]
# Show log time
time = false
[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"
[misc]
# Delete tmp directory on exit
clean_on_exit = true
================================================
FILE: backend/.editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
[{*.yml, *.yaml, *.json}]
indent_size = 2
================================================
FILE: backend/Dockerfile
================================================
FROM golang:1.18 AS build
WORKDIR /go/src/app
COPY . .
ENV GO111MODULE on
#ENV GOPROXY https://goproxy.io
RUN go mod tidy \
&& go install -v ./...
FROM alpine:3.14
# copy files
COPY --from=build /go/bin/crawlab /go/bin/crawlab
================================================
FILE: backend/README.md
================================================
# crawlab-backend
Backend (Golang) for Crawlab
================================================
FILE: backend/Taskfile.yml
================================================
version: '3'
tasks:
dev:
desc: Switch to dev mode for local development.
cmds:
- cp -f go.mod.dev go.mod
deploy:
desc: Switch to deploy mode for code publish.
cmds:
- echo 'not implemented'
================================================
FILE: backend/bin/semver.sh
================================================
#!/usr/bin/env bash
# SPDX-License-Identifier: Apache-2.0
set -o errexit -o nounset -o pipefail
NAT='0|[1-9][0-9]*'
ALPHANUM='[0-9]*[A-Za-z-][0-9A-Za-z-]*'
IDENT="$NAT|$ALPHANUM"
FIELD='[0-9A-Za-z-]+'
SEMVER_REGEX="\
^[vV]?\
($NAT)\\.($NAT)\\.($NAT)\
(\\-(${IDENT})(\\.(${IDENT}))*)?\
(\\+${FIELD}(\\.${FIELD})*)?$"
PROG=semver
PROG_VERSION="3.4.0"
USAGE="\
Usage:
$PROG bump major <version>
$PROG bump minor <version>
$PROG bump patch <version>
$PROG bump prerel|prerelease [<prerel>] <version>
$PROG bump build <build> <version>
$PROG bump release <version>
$PROG get major <version>
$PROG get minor <version>
$PROG get patch <version>
$PROG get prerel|prerelease <version>
$PROG get build <version>
$PROG get release <version>
$PROG compare <version> <other_version>
$PROG diff <version> <other_version>
$PROG validate <version>
$PROG --help
$PROG --version
Arguments:
<version> A version must match the following regular expression:
\"${SEMVER_REGEX}\"
In English:
-- The version must match X.Y.Z[-PRERELEASE][+BUILD]
where X, Y and Z are non-negative integers.
-- PRERELEASE is a dot separated sequence of non-negative integers and/or
identifiers composed of alphanumeric characters and hyphens (with
at least one non-digit). Numeric identifiers must not have leading
zeros. A hyphen (\"-\") introduces this optional part.
-- BUILD is a dot separated sequence of identifiers composed of alphanumeric
characters and hyphens. A plus (\"+\") introduces this optional part.
<other_version> See <version> definition.
<prerel> A string as defined by PRERELEASE above. Or, it can be a PRERELEASE
prototype string followed by a dot.
<build> A string as defined by BUILD above.
Options:
-v, --version Print the version of this tool.
-h, --help Print this help message.
Commands:
bump Bump by one of major, minor, patch; zeroing or removing
subsequent parts. \"bump prerel\" (or its synonym \"bump prerelease\")
sets the PRERELEASE part and removes any BUILD part. A trailing dot
in the <prerel> argument introduces an incrementing numeric field
which is added or bumped. If no <prerel> argument is provided, an
incrementing numeric field is introduced/bumped. \"bump build\" sets
the BUILD part. \"bump release\" removes any PRERELEASE or BUILD parts.
The bumped version is written to stdout.
get Extract given part of <version>, where part is one of major, minor,
patch, prerel (alternatively: prerelease), build, or release.
compare Compare <version> with <other_version>, output to stdout the
following values: -1 if <other_version> is newer, 0 if equal, 1 if
older. The BUILD part is not used in comparisons.
diff Compare <version> with <other_version>, output to stdout the
difference between two versions by the release type (MAJOR, MINOR,
PATCH, PRERELEASE, BUILD).
validate Validate if <version> follows the SEMVER pattern (see <version>
definition). Print 'valid' to stdout if the version is valid, otherwise
print 'invalid'.
See also:
https://semver.org -- Semantic Versioning 2.0.0"
function error {
echo -e "$1" >&2
exit 1
}
function usage_help {
error "$USAGE"
}
function usage_version {
echo -e "${PROG}: $PROG_VERSION"
exit 0
}
# normalize the "part" keywords to a canonical string. At present,
# only "prerelease" is normalized to "prerel".
function normalize_part {
if [ "$1" == "prerelease" ]
then
echo "prerel"
else
echo "$1"
fi
}
function validate_version {
local version=$1
if [[ "$version" =~ $SEMVER_REGEX ]]; then
# if a second argument is passed, store the result in var named by $2
if [ "$#" -eq "2" ]; then
local major=${BASH_REMATCH[1]}
local minor=${BASH_REMATCH[2]}
local patch=${BASH_REMATCH[3]}
local prere=${BASH_REMATCH[4]}
local build=${BASH_REMATCH[8]}
eval "$2=(\"$major\" \"$minor\" \"$patch\" \"$prere\" \"$build\")"
else
echo "$version"
fi
else
error "version $version does not match the semver scheme 'X.Y.Z(-PRERELEASE)(+BUILD)'. See help for more information."
fi
}
function is_nat {
[[ "$1" =~ ^($NAT)$ ]]
}
function is_null {
[ -z "$1" ]
}
function order_nat {
[ "$1" -lt "$2" ] && { echo -1 ; return ; }
[ "$1" -gt "$2" ] && { echo 1 ; return ; }
echo 0
}
function order_string {
[[ $1 < $2 ]] && { echo -1 ; return ; }
[[ $1 > $2 ]] && { echo 1 ; return ; }
echo 0
}
# given two (named) arrays containing NAT and/or ALPHANUM fields, compare them
# one by one according to semver 2.0.0 spec. Return -1, 0, 1 if left array ($1)
# is less-than, equal, or greater-than the right array ($2). The longer array
# is considered greater-than the shorter if the shorter is a prefix of the longer.
#
function compare_fields {
local l="$1[@]"
local r="$2[@]"
local leftfield=( "${!l}" )
local rightfield=( "${!r}" )
local left
local right
local i=$(( -1 ))
local order=$(( 0 ))
while true
do
[ $order -ne 0 ] && { echo $order ; return ; }
: $(( i++ ))
left="${leftfield[$i]}"
right="${rightfield[$i]}"
is_null "$left" && is_null "$right" && { echo 0 ; return ; }
is_null "$left" && { echo -1 ; return ; }
is_null "$right" && { echo 1 ; return ; }
is_nat "$left" && is_nat "$right" && { order=$(order_nat "$left" "$right") ; continue ; }
is_nat "$left" && { echo -1 ; return ; }
is_nat "$right" && { echo 1 ; return ; }
{ order=$(order_string "$left" "$right") ; continue ; }
done
}
# shellcheck disable=SC2206 # checked by "validate"; ok to expand prerel id's into array
function compare_version {
local order
validate_version "$1" V
validate_version "$2" V_
# compare major, minor, patch
local left=( "${V[0]}" "${V[1]}" "${V[2]}" )
local right=( "${V_[0]}" "${V_[1]}" "${V_[2]}" )
order=$(compare_fields left right)
[ "$order" -ne 0 ] && { echo "$order" ; return ; }
# compare pre-release ids when M.m.p are equal
local prerel="${V[3]:1}"
local prerel_="${V_[3]:1}"
local left=( ${prerel//./ } )
local right=( ${prerel_//./ } )
# if left and right have no pre-release part, then left equals right
# if only one of left/right has pre-release part, that one is less than simple M.m.p
[ -z "$prerel" ] && [ -z "$prerel_" ] && { echo 0 ; return ; }
[ -z "$prerel" ] && { echo 1 ; return ; }
[ -z "$prerel_" ] && { echo -1 ; return ; }
# otherwise, compare the pre-release id's
compare_fields left right
}
# render_prerel -- return a prerel field with a trailing numeric string
# usage: render_prerel numeric [prefix-string]
#
function render_prerel {
if [ -z "$2" ]
then
echo "${1}"
else
echo "${2}${1}"
fi
}
# extract_prerel -- extract prefix and trailing numeric portions of a pre-release part
# usage: extract_prerel prerel prerel_parts
# The prefix and trailing numeric parts are returned in "prerel_parts".
#
PREFIX_ALPHANUM='[.0-9A-Za-z-]*[.A-Za-z-]'
DIGITS='[0-9][0-9]*'
EXTRACT_REGEX="^(${PREFIX_ALPHANUM})*(${DIGITS})$"
function extract_prerel {
local prefix; local numeric;
if [[ "$1" =~ $EXTRACT_REGEX ]]
then # found prefix and trailing numeric parts
prefix="${BASH_REMATCH[1]}"
numeric="${BASH_REMATCH[2]}"
else # no numeric part
prefix="${1}"
numeric=
fi
eval "$2=(\"$prefix\" \"$numeric\")"
}
# bump_prerel -- return the new pre-release part based on previous pre-release part
# and prototype for bump
# usage: bump_prerel proto previous
#
function bump_prerel {
local proto; local prev_prefix; local prev_numeric;
# case one: no trailing dot in prototype => simply replace previous with proto
if [[ ! ( "$1" =~ \.$ ) ]]
then
echo "$1"
return
fi
proto="${1%.}" # discard trailing dot marker from prototype
extract_prerel "${2#-}" prerel_parts # extract parts of previous pre-release
# shellcheck disable=SC2154
prev_prefix="${prerel_parts[0]}"
prev_numeric="${prerel_parts[1]}"
# case two: bump or append numeric to previous pre-release part
if [ "$proto" == "+" ] # dummy "+" indicates no prototype argument provided
then
if [ -n "$prev_numeric" ]
then
: $(( ++prev_numeric )) # previous pre-release is already numbered, bump it
render_prerel "$prev_numeric" "$prev_prefix"
else
render_prerel 1 "$prev_prefix" # append starting number
fi
return
fi
# case three: set, bump, or append using prototype prefix
if [ "$prev_prefix" != "$proto" ]
then
render_prerel 1 "$proto" # proto not same pre-release; set and start at '1'
elif [ -n "$prev_numeric" ]
then
: $(( ++prev_numeric )) # pre-release is numbered; bump it
render_prerel "$prev_numeric" "$prev_prefix"
else
render_prerel 1 "$prev_prefix" # start pre-release at number '1'
fi
}
function command_bump {
local new; local version; local sub_version; local command;
command="$(normalize_part "$1")"
case $# in
2) case "$command" in
major|minor|patch|prerel|release) sub_version="+."; version=$2;;
*) usage_help;;
esac ;;
3) case "$command" in
prerel|build) sub_version=$2 version=$3 ;;
*) usage_help;;
esac ;;
*) usage_help;;
esac
validate_version "$version" parts
# shellcheck disable=SC2154
local major="${parts[0]}"
local minor="${parts[1]}"
local patch="${parts[2]}"
local prere="${parts[3]}"
local build="${parts[4]}"
case "$command" in
major) new="$((major + 1)).0.0";;
minor) new="${major}.$((minor + 1)).0";;
patch) new="${major}.${minor}.$((patch + 1))";;
release) new="${major}.${minor}.${patch}";;
prerel) new=$(validate_version "${major}.${minor}.${patch}-$(bump_prerel "$sub_version" "$prere")");;
build) new=$(validate_version "${major}.${minor}.${patch}${prere}+${sub_version}");;
*) usage_help ;;
esac
echo "$new"
exit 0
}
function command_compare {
local v; local v_;
case $# in
2) v=$(validate_version "$1"); v_=$(validate_version "$2") ;;
*) usage_help ;;
esac
set +u # need unset array element to evaluate to null
compare_version "$v" "$v_"
exit 0
}
function command_diff {
validate_version "$1" v1_parts
# shellcheck disable=SC2154
local v1_major="${v1_parts[0]}"
local v1_minor="${v1_parts[1]}"
local v1_patch="${v1_parts[2]}"
local v1_prere="${v1_parts[3]}"
local v1_build="${v1_parts[4]}"
validate_version "$2" v2_parts
# shellcheck disable=SC2154
local v2_major="${v2_parts[0]}"
local v2_minor="${v2_parts[1]}"
local v2_patch="${v2_parts[2]}"
local v2_prere="${v2_parts[3]}"
local v2_build="${v2_parts[4]}"
if [ "${v1_major}" != "${v2_major}" ]; then
echo "major"
elif [ "${v1_minor}" != "${v2_minor}" ]; then
echo "minor"
elif [ "${v1_patch}" != "${v2_patch}" ]; then
echo "patch"
elif [ "${v1_prere}" != "${v2_prere}" ]; then
echo "prerelease"
elif [ "${v1_build}" != "${v2_build}" ]; then
echo "build"
fi
}
# shellcheck disable=SC2034
function command_get {
local part version
if [[ "$#" -ne "2" ]] || [[ -z "$1" ]] || [[ -z "$2" ]]; then
usage_help
exit 0
fi
part="$1"
version="$2"
validate_version "$version" parts
local major="${parts[0]}"
local minor="${parts[1]}"
local patch="${parts[2]}"
local prerel="${parts[3]:1}"
local build="${parts[4]:1}"
local release="${major}.${minor}.${patch}"
part="$(normalize_part "$part")"
case "$part" in
major|minor|patch|release|prerel|build) echo "${!part}" ;;
*) usage_help ;;
esac
exit 0
}
function command_validate {
if [[ "$#" -ne "1" ]]; then
usage_help
fi
if [[ "$1" =~ $SEMVER_REGEX ]]; then
echo "valid"
else
echo "invalid"
fi
exit 0
}
case $# in
0) echo "Unknown command: $*"; usage_help;;
esac
case $1 in
--help|-h) echo -e "$USAGE"; exit 0;;
--version|-v) usage_version ;;
bump) shift; command_bump "$@";;
get) shift; command_get "$@";;
compare) shift; command_compare "$@";;
diff) shift; command_diff "$@";;
validate) shift; command_validate "$@";;
*) echo "Unknown arguments: $*"; usage_help;;
esac
================================================
FILE: backend/bin/update-deps.sh
================================================
#!/bin/bash
go get -u github.com/crawlab-team/crawlab/core@main
go mod tidy
================================================
FILE: backend/bin/update-ver.sh
================================================
#!/bin/sh
# update version type (major, minor, patch, prerelease)
update_version_type="prerelease"
if [ -n "$1" ]; then
update_version_type="$1"
fi
# current version
current_version=$(grep -oEi 'version: v([0-9\.?]+)' conf/config.yml | sed -E 's/version: v//g')
# next version
next_version=$(./bin/semver.sh bump $update_version_type $current_version)
# update next version to conf/config.yml
sed -i '' "s/version: v$current_version/version: v$next_version/g" conf/config.yml
================================================
FILE: backend/conf/config.yml
================================================
# Crawlab Configuration File
edition: global.edition.community
version: v0.6.3
mongo:
host: localhost
port: 27017
db: crawlab_test
username: ""
password: ""
authSource: "admin"
server:
host: 0.0.0.0
port: 8000
grpc:
address: localhost:9666
server:
address: 0.0.0.0:9666
authKey: Crawlab2021!
api:
endpoint: http://localhost:8000
log:
path: /var/log/crawlab
================================================
FILE: backend/go.mod
================================================
module crawlab
go 1.22
replace (
github.com/crawlab-team/crawlab/core => ../core
github.com/crawlab-team/crawlab/db => ../db
github.com/crawlab-team/crawlab/fs => ../fs
github.com/crawlab-team/crawlab/grpc => ../grpc
github.com/crawlab-team/crawlab/template-parser => ../template-parser
github.com/crawlab-team/crawlab/trace => ../trace
github.com/crawlab-team/crawlab/vcs => ../vcs
)
require github.com/crawlab-team/crawlab/core v0.0.0-20240614095218-7b4ee8399ab0
require (
dario.cat/mergo v1.0.0 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
)
require (
cloud.google.com/go/compute/metadata v0.3.0 // indirect
github.com/Masterminds/semver v1.4.2 // indirect
github.com/Masterminds/sprig v2.16.0+incompatible // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
github.com/PuerkitoBio/goquery v1.8.0 // indirect
github.com/ReneKroon/ttlcache v1.7.0 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/aokoli/goutils v1.0.1 // indirect
github.com/apex/log v1.9.0 // indirect
github.com/bytedance/sonic v1.9.1 // indirect
github.com/cenkalti/backoff/v4 v4.1.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/crawlab-team/crawlab/db v0.0.0-20240614095218-7b4ee8399ab0 // indirect
github.com/crawlab-team/crawlab/fs v0.0.0-20240614095218-7b4ee8399ab0 // indirect
github.com/crawlab-team/crawlab/grpc v0.0.0-20240614111723-e5b20af9a40b // indirect
github.com/crawlab-team/crawlab/template-parser v0.0.0-20240614095218-7b4ee8399ab0 // indirect
github.com/crawlab-team/crawlab/trace v0.0.0-20240614095218-7b4ee8399ab0 // indirect
github.com/crawlab-team/crawlab/vcs v0.0.0-20240614095218-7b4ee8399ab0 // indirect
github.com/crawlab-team/goseaweedfs v0.6.3 // indirect
github.com/denisenkom/go-mssqldb v0.11.0 // indirect
github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect
github.com/elastic/go-elasticsearch/v8 v8.14.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.5.0 // indirect
github.com/go-git/go-git/v5 v5.12.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/huandu/xstrings v1.2.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/imroc/req v0.3.0 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.11.0 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.3 // indirect
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
github.com/jackc/pgtype v1.10.0 // indirect
github.com/jackc/pgx/v4 v4.18.2 // indirect
github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kevinburke/ssh_config v1.2.0 // indirect
github.com/klauspost/compress v1.17.2 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/lib/pq v1.10.4 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/matcornic/hermes/v2 v2.1.0 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-runewidth v0.0.3 // indirect
github.com/mattn/go-sqlite3 v1.14.9 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/olekukonko/tablewriter v0.0.1 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pierrec/lz4/v4 v4.1.18 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/robertkrimen/otto v0.0.0-20210614181706-373ff5438452 // indirect
github.com/robfig/cron/v3 v3.0.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/segmentio/fasthash v1.0.3 // indirect
github.com/segmentio/kafka-go v0.4.39 // indirect
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/skeema/knownhosts v1.2.2 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/cobra v1.3.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.19.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/thoas/go-funk v0.9.1 // indirect
github.com/tklauser/go-sysconf v0.3.9 // indirect
github.com/tklauser/numcpus v0.3.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
github.com/upper/db/v4 v4.6.0 // indirect
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 // indirect
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
github.com/ztrue/tracerr v0.4.0 // indirect
go.mongodb.org/mongo-driver v1.15.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/dig v1.10.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.23.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/tools v0.20.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
google.golang.org/grpc v1.64.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/sourcemap.v1 v1.0.5 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
================================================
FILE: backend/go.mod.dev
================================================
module crawlab
go 1.16
replace (
github.com/crawlab-team/crawlab/core => ../../crawlab-core
github.com/crawlab-team/crawlab-vcs => ../../crawlab-vcs
github.com/crawlab-team/crawlab/fs => ../../crawlab-fs
github.com/crawlab-team/crawlab/db => ../../crawlab-db
)
require (
github.com/apex/log v1.9.0
github.com/crawlab-team/crawlab/core v0.6.0-beta.20211230.1200
github.com/crawlab-team/crawlab/vcs v0.1.1
github.com/gin-gonic/gin v1.7.1
github.com/spf13/cobra v1.1.3
github.com/spf13/viper v1.7.1
go.uber.org/dig v1.10.0
)
================================================
FILE: backend/go.mod.local
================================================
module crawlab
go 1.16
replace (
github.com/crawlab-team/crawlab/core => /libs/crawlab-team/crawlab-core
github.com/crawlab-team/crawlab-vcs => /libs/crawlab-team/crawlab-vcs
github.com/crawlab-team/crawlab/fs => /libs/crawlab-team/crawlab-fs
github.com/crawlab-team/crawlab/db => /libs/crawlab-team/crawlab-db
)
require (
github.com/apex/log v1.9.0
github.com/crawlab-team/crawlab/core v0.6.0-beta.20211230.1200
github.com/crawlab-team/crawlab/vcs v0.1.1
github.com/gin-gonic/gin v1.7.1
github.com/spf13/cobra v1.1.3
github.com/spf13/viper v1.7.1
go.uber.org/dig v1.10.0
)
================================================
FILE: backend/go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc=
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Masterminds/sprig v2.16.0+incompatible h1:QZbMUPxRQ50EKAq3LFMnxddMu88/EUUG3qmxwtDmPsY=
github.com/Masterminds/sprig v2.16.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78=
github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/ReneKroon/ttlcache v1.7.0 h1:8BkjFfrzVFXyrqnMtezAaJ6AHPSsVV10m6w28N/Fgkk=
github.com/ReneKroon/ttlcache v1.7.0/go.mod h1:8BGGzdumrIjWxdRx8zpK6L3oGMWvIXdvB2GD1cfvd+I=
github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2 h1:ZBbLwSJqkHBuFDA6DUhhse0IGJ7T5bemHyNILUjvOq4=
github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2/go.mod h1:VSw57q4QFiWDbRnjdX8Cb3Ow0SFncRw+bA/ofY6Q83w=
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg=
github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0=
github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA=
github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE=
github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/cenkalti/backoff/v4 v4.1.0 h1:c8LkOFQTzuO0WBM/ae5HdGQuZPfPxp7lqBRwQRm4fSc=
github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crawlab-team/goseaweedfs v0.6.3 h1:f96H2QCLrZpof9na1mhIKouKrv8p32XRUyouSVm4YHU=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI=
github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=
github.com/elastic/go-elasticsearch/v8 v8.14.0 h1:1ywU8WFReLLcxE1WJqii3hTtbPUE2hc38ZK/j4mMFow=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/gavv/httpexpect/v2 v2.16.0 h1:Ty2favARiTYTOkCRZGX7ojXXjGyNAIohM1lZ3vqaEwI=
github.com/gavv/httpexpect/v2 v2.16.0/go.mod h1:uJLaO+hQ25ukBJtQi750PsztObHybNllN+t+MbbW8PY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys=
github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df/go.mod h1:GJr+FCSXshIwgHBtLglIg9M2l2kQSi6QjVAngtzI08Y=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huandu/xstrings v1.2.0 h1:yPeWdRnmynF7p+lLYz0H2tthW9lqhMJrQV/U7yy4wX0=
github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
github.com/imroc/req v0.3.0 h1:3EioagmlSG+z+KySToa+Ylo3pTFZs+jh3Brl7ngU12U=
github.com/imroc/req v0.3.0/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ=
github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns=
github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38=
github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w=
github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw=
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0 h1:xqgexXAGQgY3HAjNPSaCqn5Aahbo5TKsmhp8VRfr1iQ=
github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk=
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/matcornic/hermes/v2 v2.1.0 h1:9TDYFBPFv6mcXanaDmRDEp/RTWj0dTTi+LpFnnnfNWc=
github.com/matcornic/hermes/v2 v2.1.0/go.mod h1:2+ziJeoyRfaLiATIL8VZ7f9hpzH4oDHqTmn0bhrsgVI=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88=
github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/robertkrimen/otto v0.0.0-20210614181706-373ff5438452 h1:ewTtJ72GFy2e0e8uyiDwMG3pKCS5mBh+hdSTYsPKEP8=
github.com/robertkrimen/otto v0.0.0-20210614181706-373ff5438452/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E=
github.com/robfig/cron/v3 v3.0.0/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM=
github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY=
github.com/segmentio/kafka-go v0.4.39 h1:75smaomhvkYRwtuOwqLsdhgCG30B82NsbdkdDfFbvrw=
github.com/segmentio/kafka-go v0.4.39/go.mod h1:T0MLgygYvmqmBvC+s8aCcbVNfJN4znVne5j0Pzowp/Q=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0=
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo=
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M=
github.com/thoas/go-funk v0.9.1/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q=
github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0=
github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=
github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk=
github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc=
github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0=
github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao=
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo=
github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=
github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ=
github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/upper/db/v4 v4.6.0 h1:0VmASnqrl/XN8Ehoq++HBgZ4zRD5j3GXygW8FhP0C5I=
github.com/upper/db/v4 v4.6.0/go.mod h1:2mnRcPf+RcCXmVcD+o04LYlyu3UuF7ubamJia7CkN6s=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4=
github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0=
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04 h1:L0rPdfzq43+NV8rfIx2kA4iSSLRj2jN5ijYHoeXRwvQ=
github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04/go.mod h1:tcnB1voG49QhCrwq1W0w5hhGasvOg+VQp9i9H1rCM1w=
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe h1:9YnI5plmy+ad6BM+JCLJb2ZV7/TNiE5l7SNKfumYKgc=
github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe/go.mod h1:JTFJA/t820uFDoyPpErFQ3rb3amdZoPtxcKervG0OE4=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw=
github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4=
github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ztrue/tracerr v0.4.0 h1:vT5PFxwIGs7rCg9ZgJ/y0NmOpJkPCPFK8x0vVIYzd04=
github.com/ztrue/tracerr v0.4.0/go.mod h1:PaFfYlas0DfmXNpo7Eay4MFhZUONqvXM+T2HyGPpngk=
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=
go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8=
go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY=
go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw=
go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029175232-7e6ffbd03851/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlC
gitextract_torsj7ae/
├── .dockerignore
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report_zh.md
│ │ ├── feature_request.md
│ │ └── feature_request_zh.md
│ └── workflows/
│ ├── docker-crawlab-tencent.yml
│ └── docker-crawlab.yml
├── .gitignore
├── CHANGELOG-zh.md
├── CHANGELOG.md
├── DISCLAIMER-zh.md
├── DISCLAIMER.md
├── Dockerfile
├── LICENSE
├── README-zh.md
├── README.md
├── SECURITY.md
├── backend/
│ ├── .air.master.conf
│ ├── .air.worker.conf
│ ├── .editorconfig
│ ├── Dockerfile
│ ├── README.md
│ ├── Taskfile.yml
│ ├── bin/
│ │ ├── semver.sh
│ │ ├── update-deps.sh
│ │ └── update-ver.sh
│ ├── conf/
│ │ └── config.yml
│ ├── go.mod
│ ├── go.mod.dev
│ ├── go.mod.local
│ ├── go.sum
│ ├── main.go
│ └── test/
│ ├── config-master.json
│ ├── config-worker-01.json
│ ├── config-worker-02.json
│ ├── config-worker-03.json
│ └── config-worker-invalid-auth-key.json
├── bin/
│ ├── docker-init.sh
│ ├── gen-ver.sh
│ └── update_docker_js_api_address.py
├── changelog/
│ ├── v0.6.0-zh.md
│ └── v0.6.0.md
├── core/
│ ├── .editorconfig
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── apps/
│ │ ├── api_v2.go
│ │ ├── docker.go
│ │ ├── interfaces.go
│ │ ├── server_v2.go
│ │ └── utils.go
│ ├── cmd/
│ │ ├── root.go
│ │ ├── server.go
│ │ └── server_test.go
│ ├── color/
│ │ └── service.go
│ ├── config/
│ │ ├── base.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ └── path.go
│ ├── constants/
│ │ ├── action.go
│ │ ├── anchor.go
│ │ ├── auth.go
│ │ ├── cache.go
│ │ ├── channels.go
│ │ ├── common.go
│ │ ├── config_spider.go
│ │ ├── data_collection.go
│ │ ├── data_field.go
│ │ ├── database.go
│ │ ├── delegate.go
│ │ ├── ds.go
│ │ ├── encrypt.go
│ │ ├── errors.go
│ │ ├── event.go
│ │ ├── export.go
│ │ ├── file.go
│ │ ├── filer.go
│ │ ├── filter.go
│ │ ├── git.go
│ │ ├── grpc.go
│ │ ├── http.go
│ │ ├── log.go
│ │ ├── message.go
│ │ ├── node.go
│ │ ├── notification.go
│ │ ├── pagination.go
│ │ ├── register.go
│ │ ├── results.go
│ │ ├── rpc.go
│ │ ├── schedule.go
│ │ ├── scrapy.go
│ │ ├── signal.go
│ │ ├── sort.go
│ │ ├── system.go
│ │ ├── task.go
│ │ ├── user.go
│ │ └── variable.go
│ ├── container/
│ │ └── container.go
│ ├── controllers/
│ │ ├── base_file_v2.go
│ │ ├── base_v2.go
│ │ ├── base_v2_test.go
│ │ ├── export_v2.go
│ │ ├── filter_v2.go
│ │ ├── http.go
│ │ ├── login_v2.go
│ │ ├── project_v2.go
│ │ ├── result_v2.go
│ │ ├── router_v2.go
│ │ ├── router_v2_test.go
│ │ ├── schedule_v2.go
│ │ ├── setting_v2.go
│ │ ├── spider_v2.go
│ │ ├── spider_v2_test.go
│ │ ├── stats_v2.go
│ │ ├── sync_v2.go
│ │ ├── system_info_v2.go
│ │ ├── task_v2.go
│ │ ├── token_v2.go
│ │ ├── user_v2.go
│ │ ├── user_v2_test.go
│ │ ├── utils_context.go
│ │ ├── utils_filter.go
│ │ ├── utils_http.go
│ │ ├── utils_pagination.go
│ │ ├── utils_sort.go
│ │ └── ws_writer.go
│ ├── data/
│ │ └── colors.go
│ ├── database/
│ │ ├── entity/
│ │ │ └── database.go
│ │ ├── interfaces/
│ │ │ ├── database_registry_service.go
│ │ │ └── database_service.go
│ │ └── registry_service.go
│ ├── docker-compose.yml
│ ├── docs/
│ │ ├── .gitignore
│ │ ├── api/
│ │ │ ├── index.html
│ │ │ └── openapi.yaml
│ │ ├── package.json
│ │ └── scripts/
│ │ └── publish.js
│ ├── ds/
│ │ ├── cockroachdb.go
│ │ ├── default.go
│ │ ├── es.go
│ │ ├── kafka.go
│ │ ├── mongo.go
│ │ ├── mssql.go
│ │ ├── mssql_test.go
│ │ ├── mysql.go
│ │ ├── options.go
│ │ ├── postgresql.go
│ │ ├── service.go
│ │ ├── sql.go
│ │ ├── sql_options.go
│ │ └── sqlite.go
│ ├── entity/
│ │ ├── address.go
│ │ ├── color.go
│ │ ├── common.go
│ │ ├── config_spider.go
│ │ ├── data_field.go
│ │ ├── dependency.go
│ │ ├── doc.go
│ │ ├── es.go
│ │ ├── event.go
│ │ ├── export.go
│ │ ├── filter.go
│ │ ├── filter_select_option.go
│ │ ├── fs_file_info.go
│ │ ├── git.go
│ │ ├── grpc_base_service_message.go
│ │ ├── grpc_base_service_params.go
│ │ ├── grpc_delegate_message.go
│ │ ├── grpc_event_service_message.go
│ │ ├── grpc_subscribe.go
│ │ ├── http.go
│ │ ├── model_delegate.go
│ │ ├── model_info.go
│ │ ├── node.go
│ │ ├── notification_variable.go
│ │ ├── pagination.go
│ │ ├── result.go
│ │ ├── rpc.go
│ │ ├── sort.go
│ │ ├── spider.go
│ │ ├── stats.go
│ │ ├── system_info.go
│ │ ├── task.go
│ │ ├── translation.go
│ │ ├── ttl_map.go
│ │ └── version.go
│ ├── errors/
│ │ ├── base.go
│ │ ├── controller.go
│ │ ├── ds.go
│ │ ├── event.go
│ │ ├── filter.go
│ │ ├── fs.go
│ │ ├── git.go
│ │ ├── grpc.go
│ │ ├── http.go
│ │ ├── model.go
│ │ ├── node.go
│ │ ├── process.go
│ │ ├── result.go
│ │ ├── schedule.go
│ │ ├── spider.go
│ │ ├── stats.go
│ │ ├── store.go
│ │ ├── task.go
│ │ └── user.go
│ ├── event/
│ │ ├── func.go
│ │ ├── options.go
│ │ └── service.go
│ ├── export/
│ │ ├── csv_service.go
│ │ ├── csv_service_test.go
│ │ └── json_service.go
│ ├── fs/
│ │ ├── default.go
│ │ ├── service_v2.go
│ │ └── service_v2_test.go
│ ├── go.mod
│ ├── go.sum
│ ├── grpc/
│ │ ├── client/
│ │ │ ├── client.go
│ │ │ ├── client_v2.go
│ │ │ ├── options.go
│ │ │ ├── pool.go
│ │ │ └── utils_proto.go
│ │ ├── middlewares/
│ │ │ └── auth_token.go
│ │ ├── payload/
│ │ │ └── model_service_v2_payload.go
│ │ └── server/
│ │ ├── dependencies_server_v2.go
│ │ ├── message_server.go
│ │ ├── metrics_server_v2.go
│ │ ├── model_base_service_binder.go
│ │ ├── model_base_service_server.go
│ │ ├── model_base_service_v2_server.go
│ │ ├── model_delegate_binder.go
│ │ ├── model_delegate_server.go
│ │ ├── node_server.go
│ │ ├── node_server_v2.go
│ │ ├── server_v2.go
│ │ ├── task_server_v2.go
│ │ └── utils_handle.go
│ ├── i18n/
│ │ └── service.go
│ ├── interfaces/
│ │ ├── address.go
│ │ ├── color.go
│ │ ├── color_service.go
│ │ ├── controller_params.go
│ │ ├── data_source_service.go
│ │ ├── entity.go
│ │ ├── event_data.go
│ │ ├── event_service.go
│ │ ├── export.go
│ │ ├── export_service.go
│ │ ├── filter.go
│ │ ├── filter_condition.go
│ │ ├── fs_file_info.go
│ │ ├── fs_service.go
│ │ ├── fs_service_options.go
│ │ ├── fs_service_v2.go
│ │ ├── grpc_base.go
│ │ ├── grpc_base_service_params.go
│ │ ├── grpc_client.go
│ │ ├── grpc_client_model_base_service.go
│ │ ├── grpc_client_model_delegate.go
│ │ ├── grpc_client_model_environment_service.go
│ │ ├── grpc_client_model_node_service.go
│ │ ├── grpc_client_model_service.go
│ │ ├── grpc_client_model_spider_service.go
│ │ ├── grpc_client_model_task_service.go
│ │ ├── grpc_client_model_task_stat_service.go
│ │ ├── grpc_client_pool.go
│ │ ├── grpc_model_base_service_message.go
│ │ ├── grpc_model_binder.go
│ │ ├── grpc_model_delegate_message.go
│ │ ├── grpc_model_list_binder.go
│ │ ├── grpc_server.go
│ │ ├── grpc_stream.go
│ │ ├── grpc_subscribe.go
│ │ ├── i18n_service.go
│ │ ├── injectable.go
│ │ ├── list.go
│ │ ├── model.go
│ │ ├── model_artifact.go
│ │ ├── model_artifact_sys.go
│ │ ├── model_base_service.go
│ │ ├── model_binder.go
│ │ ├── model_delegate.go
│ │ ├── model_environment.go
│ │ ├── model_extra_value.go
│ │ ├── model_git.go
│ │ ├── model_list_binder.go
│ │ ├── model_node.go
│ │ ├── model_node_delegate.go
│ │ ├── model_permission.go
│ │ ├── model_result.go
│ │ ├── model_role.go
│ │ ├── model_schedule.go
│ │ ├── model_service_v2.go
│ │ ├── model_spider.go
│ │ ├── model_tag.go
│ │ ├── model_task.go
│ │ ├── model_task_stat.go
│ │ ├── model_user.go
│ │ ├── model_user_group.go
│ │ ├── module.go
│ │ ├── node_config_service.go
│ │ ├── node_master_service.go
│ │ ├── node_service.go
│ │ ├── node_service_option.go
│ │ ├── node_worker_service.go
│ │ ├── options.go
│ │ ├── process_daemon.go
│ │ ├── provide.go
│ │ ├── result_service.go
│ │ ├── result_service_mongo.go
│ │ ├── result_service_registry.go
│ │ ├── schedule_service.go
│ │ ├── spider_admin_service.go
│ │ ├── spider_service_options.go
│ │ ├── stats_service.go
│ │ ├── task_base_service.go
│ │ ├── task_handler_service.go
│ │ ├── task_hook_service.go
│ │ ├── task_runner.go
│ │ ├── task_scheduler_service.go
│ │ ├── task_stats_service.go
│ │ ├── test.go
│ │ ├── translation.go
│ │ ├── user_service.go
│ │ ├── user_service_options.go
│ │ ├── with_address.go
│ │ ├── with_config_path.go
│ │ └── with_model_id.go
│ ├── main.go
│ ├── middlewares/
│ │ ├── auth.go
│ │ ├── auth_v2.go
│ │ ├── cors.go
│ │ ├── filer_auth.go
│ │ └── middlewares.go
│ ├── models/
│ │ ├── client/
│ │ │ ├── binder_basic.go
│ │ │ ├── binder_list.go
│ │ │ ├── model_base_service.go
│ │ │ ├── model_delegate.go
│ │ │ ├── model_environment_service.go
│ │ │ ├── model_node_delegate.go
│ │ │ ├── model_node_service.go
│ │ │ ├── model_service.go
│ │ │ ├── model_service_v2.go
│ │ │ ├── model_service_v2_test.go
│ │ │ ├── model_spider_service.go
│ │ │ ├── model_task_service.go
│ │ │ ├── model_task_stat_service.go
│ │ │ └── options.go
│ │ ├── common/
│ │ │ └── index_service_v2.go
│ │ ├── config_spider/
│ │ │ ├── common.go
│ │ │ └── scrapy.go
│ │ ├── delegate/
│ │ │ ├── base_test.go
│ │ │ ├── model.go
│ │ │ ├── model_node.go
│ │ │ ├── model_node_test.go
│ │ │ ├── model_role_test.go
│ │ │ ├── model_test.go
│ │ │ └── utils_event.go
│ │ ├── models/
│ │ │ ├── artifact.go
│ │ │ ├── artifact_sys.go
│ │ │ ├── base.go
│ │ │ ├── data_collection.go
│ │ │ ├── data_source.go
│ │ │ ├── dependency_setting.go
│ │ │ ├── environment.go
│ │ │ ├── extra_value.go
│ │ │ ├── git.go
│ │ │ ├── job.go
│ │ │ ├── node.go
│ │ │ ├── password.go
│ │ │ ├── permission.go
│ │ │ ├── project.go
│ │ │ ├── result.go
│ │ │ ├── role.go
│ │ │ ├── role_permission.go
│ │ │ ├── schedule.go
│ │ │ ├── setting.go
│ │ │ ├── spider.go
│ │ │ ├── spider_stat.go
│ │ │ ├── tag.go
│ │ │ ├── task.go
│ │ │ ├── task_queue_item.go
│ │ │ ├── task_stat.go
│ │ │ ├── token.go
│ │ │ ├── user.go
│ │ │ ├── user_role.go
│ │ │ ├── utils_binder_legacy.go
│ │ │ ├── utils_col.go
│ │ │ ├── utils_model_map.go
│ │ │ ├── utils_tag.go
│ │ │ ├── v2/
│ │ │ │ ├── base_v2.go
│ │ │ │ ├── data_collection_v2.go
│ │ │ │ ├── database_metric_v2.go
│ │ │ │ ├── database_v2.go
│ │ │ │ ├── dependency_log_v2.go
│ │ │ │ ├── dependency_setting_v2.go
│ │ │ │ ├── dependency_task_v2.go
│ │ │ │ ├── dependency_v2.go
│ │ │ │ ├── environment_v2.go
│ │ │ │ ├── git_v2.go
│ │ │ │ ├── metric_v2.go
│ │ │ │ ├── node_v2.go
│ │ │ │ ├── notification_alert_v2.go
│ │ │ │ ├── notification_channel_v2.go
│ │ │ │ ├── notification_request_v2.go
│ │ │ │ ├── notification_setting_v2.go
│ │ │ │ ├── permission_v2.go
│ │ │ │ ├── project_v2.go
│ │ │ │ ├── role_permission_v2.go
│ │ │ │ ├── role_v2.go
│ │ │ │ ├── schedule_v2.go
│ │ │ │ ├── setting_v2.go
│ │ │ │ ├── spider_stat_v2.go
│ │ │ │ ├── spider_v2.go
│ │ │ │ ├── task_queue_item_v2.go
│ │ │ │ ├── task_stat_v2.go
│ │ │ │ ├── task_v2.go
│ │ │ │ ├── test_v2.go
│ │ │ │ ├── token_v2.go
│ │ │ │ ├── user_role_v2.go
│ │ │ │ ├── user_v2.go
│ │ │ │ └── variable_v2.go
│ │ │ └── variable.go
│ │ └── service/
│ │ ├── artifact_service.go
│ │ ├── base_service.go
│ │ ├── base_service_v2.go
│ │ ├── base_service_v2_test.go
│ │ ├── binder_basic.go
│ │ ├── binder_list.go
│ │ ├── data_collection_service.go
│ │ ├── data_source_service.go
│ │ ├── dependency_setting_service.go
│ │ ├── environment_service.go
│ │ ├── extra_value_service.go
│ │ ├── git_service.go
│ │ ├── interface.go
│ │ ├── job_service.go
│ │ ├── node_service.go
│ │ ├── options.go
│ │ ├── password_service.go
│ │ ├── permission_service.go
│ │ ├── project_service.go
│ │ ├── role_permission_service.go
│ │ ├── role_service.go
│ │ ├── schedule_service.go
│ │ ├── service.go
│ │ ├── setting_service.go
│ │ ├── spider_service.go
│ │ ├── spider_stat_service.go
│ │ ├── tag_service.go
│ │ ├── tag_service_legacy.go
│ │ ├── task_queue_service.go
│ │ ├── task_service.go
│ │ ├── task_stat_service.go
│ │ ├── token_service.go
│ │ ├── user_role_service.go
│ │ ├── user_service.go
│ │ └── variable_service.go
│ ├── node/
│ │ ├── config/
│ │ │ ├── config.go
│ │ │ ├── config_service.go
│ │ │ └── options.go
│ │ └── service/
│ │ ├── master_service_v2.go
│ │ ├── options.go
│ │ └── worker_service_v2.go
│ ├── notification/
│ │ ├── constants.go
│ │ ├── entity.go
│ │ ├── im.go
│ │ ├── mail.go
│ │ ├── mail_gmail.go
│ │ ├── oauth2_gmail.go
│ │ ├── service_v2.go
│ │ ├── service_v2_test.go
│ │ └── theme.go
│ ├── process/
│ │ ├── daemon.go
│ │ ├── daemon_test.go
│ │ ├── manage.go
│ │ └── options.go
│ ├── result/
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_mongo.go
│ │ └── service_registry.go
│ ├── schedule/
│ │ ├── logger.go
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_v2.go
│ │ └── test/
│ │ ├── base.go
│ │ └── schedule_service_test.go
│ ├── spider/
│ │ └── admin/
│ │ ├── options.go
│ │ ├── service.go
│ │ └── service_v2.go
│ ├── stats/
│ │ ├── options.go
│ │ └── service.go
│ ├── sys_exec/
│ │ ├── sys_exec.go
│ │ ├── sys_exec_darwin.go
│ │ ├── sys_exec_linux.go
│ │ └── sys_exec_windows.go
│ ├── system/
│ │ ├── service.go
│ │ └── service_v2.go
│ ├── task/
│ │ ├── handler/
│ │ │ ├── options.go
│ │ │ ├── runner_test.go
│ │ │ ├── runner_v2.go
│ │ │ └── service_v2.go
│ │ ├── log/
│ │ │ ├── constants.go
│ │ │ ├── default.go
│ │ │ ├── driver.go
│ │ │ ├── entity.go
│ │ │ ├── errors.go
│ │ │ ├── file_driver.go
│ │ │ ├── file_driver_test.go
│ │ │ └── interface.go
│ │ ├── scheduler/
│ │ │ ├── options.go
│ │ │ └── service_v2.go
│ │ └── stats/
│ │ ├── options.go
│ │ └── service_v2.go
│ ├── user/
│ │ ├── options.go
│ │ ├── service.go
│ │ ├── service_v2.go
│ │ └── test/
│ │ ├── base.go
│ │ └── user_service_test.go
│ └── utils/
│ ├── args.go
│ ├── array.go
│ ├── backoff.go
│ ├── binders/
│ │ └── binder_col_name.go
│ ├── bool.go
│ ├── bson.go
│ ├── cache.go
│ ├── chan.go
│ ├── chan_test.go
│ ├── cockroachdb.go
│ ├── cron.go
│ ├── debug.go
│ ├── demo.go
│ ├── di.go
│ ├── docker.go
│ ├── encrypt.go
│ ├── encrypt_test.go
│ ├── es.go
│ ├── file.go
│ ├── file_test.go
│ ├── filter.go
│ ├── git.go
│ ├── hash.go
│ ├── helpers.go
│ ├── http.go
│ ├── init.go
│ ├── json.go
│ ├── kafka.go
│ ├── mongo.go
│ ├── mssql.go
│ ├── mysql.go
│ ├── node.go
│ ├── os.go
│ ├── postgresql.go
│ ├── result.go
│ ├── rpc.go
│ ├── spider.go
│ ├── sql.go
│ ├── sqlite.go
│ ├── stats.go
│ ├── system.go
│ ├── task.go
│ ├── time.go
│ └── uuid.go
├── db/
│ ├── .editorconfig
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── errors/
│ │ ├── base.go
│ │ ├── errors.go
│ │ └── redis.go
│ ├── generic/
│ │ ├── base.go
│ │ ├── list.go
│ │ ├── op.go
│ │ └── sort.go
│ ├── go.mod
│ ├── interfaces.go
│ ├── mongo/
│ │ ├── client.go
│ │ ├── client_options.go
│ │ ├── client_test.go
│ │ ├── col.go
│ │ ├── col_test.go
│ │ ├── db.go
│ │ ├── db_options.go
│ │ ├── db_test.go
│ │ ├── result.go
│ │ └── transaction.go
│ ├── redis/
│ │ ├── client.go
│ │ ├── constants.go
│ │ ├── options.go
│ │ ├── pool.go
│ │ └── test/
│ │ ├── base.go
│ │ └── client_test.go
│ ├── sql/
│ │ └── sql.go
│ └── utils/
│ └── utils.go
├── devops/
│ ├── develop/
│ │ ├── crawlab-master.yaml
│ │ ├── crawlab-worker.yaml
│ │ ├── mongo-pv.yaml
│ │ ├── mongo.yaml
│ │ ├── ns.yaml
│ │ └── redis.yaml
│ ├── master/
│ │ ├── crawlab-master.yaml
│ │ ├── crawlab-worker.yaml
│ │ ├── mongo-pv.yaml
│ │ ├── mongo.yaml
│ │ ├── ns.yaml
│ │ └── redis.yaml
│ └── release/
│ ├── crawlab-master.yaml
│ ├── crawlab-worker.yaml
│ ├── mongo-pv.yaml
│ ├── mongo.yaml
│ ├── ns.yaml
│ └── redis.yaml
├── docker-compose.yml
├── docs/
│ └── config.md
├── frontend/
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .npmrc
│ ├── Dockerfile
│ ├── babel.config.js
│ ├── index.html
│ ├── jest.config.ts
│ ├── package.json
│ ├── public/
│ │ ├── fonts/
│ │ │ └── FontAwesome.otf
│ │ └── js/
│ │ ├── login-canvas.js
│ │ └── vue3-sfc-loader.js
│ ├── src/
│ │ ├── main.ts
│ │ └── shims-vue.d.ts
│ ├── tsconfig.json
│ ├── vite.config.ts
│ └── vue.config.js
├── fs/
│ ├── .editorconfig
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── Dockerfile
│ ├── LICENSE
│ ├── README.md
│ ├── bin/
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── constants.go
│ ├── docker-compose.yml
│ ├── errors.go
│ ├── go.mod
│ ├── go.sum
│ ├── interface.go
│ ├── lib/
│ │ └── copy/
│ │ └── copy.go
│ ├── options.go
│ ├── seaweedfs_manager.go
│ ├── test/
│ │ ├── base.go
│ │ ├── bindata.go
│ │ ├── main_test.go
│ │ ├── seaweedfs_test.go
│ │ └── utils.go
│ └── utils.go
├── go.work
├── go.work.sum
├── grpc/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── bin/
│ │ ├── compile.sh
│ │ └── compile_all.sh
│ ├── dependencies_service_v2.pb.go
│ ├── dependencies_service_v2_grpc.pb.go
│ ├── go.mod
│ ├── go.sum
│ ├── message_service.pb.go
│ ├── message_service_grpc.pb.go
│ ├── metrics_service_v2.pb.go
│ ├── metrics_service_v2_grpc.pb.go
│ ├── model_base_service.pb.go
│ ├── model_base_service_grpc.pb.go
│ ├── model_base_service_v2.pb.go
│ ├── model_base_service_v2_grpc.pb.go
│ ├── model_delegate.pb.go
│ ├── model_delegate_grpc.pb.go
│ ├── model_service_v2_request.pb.go
│ ├── node.pb.go
│ ├── node_info.pb.go
│ ├── node_service.pb.go
│ ├── node_service_grpc.pb.go
│ ├── plugin_request.pb.go
│ ├── plugin_service.pb.go
│ ├── plugin_service_grpc.pb.go
│ ├── proto/
│ │ ├── entity/
│ │ │ ├── model_service_v2_request.proto
│ │ │ ├── node_info.proto
│ │ │ ├── plugin_request.proto
│ │ │ ├── request.proto
│ │ │ ├── response.proto
│ │ │ ├── response_code.proto
│ │ │ ├── stream_message.proto
│ │ │ ├── stream_message_code.proto
│ │ │ └── stream_message_data_task.proto
│ │ ├── models/
│ │ │ ├── node.proto
│ │ │ └── task.proto
│ │ └── services/
│ │ ├── dependencies_service_v2.proto
│ │ ├── message_service.proto
│ │ ├── metrics_service_v2.proto
│ │ ├── model_base_service.proto
│ │ ├── model_base_service_v2.proto
│ │ ├── model_delegate.proto
│ │ ├── node_service.proto
│ │ ├── plugin_service.proto
│ │ └── task_service.proto
│ ├── request.pb.go
│ ├── response.pb.go
│ ├── response_code.pb.go
│ ├── stream_message.pb.go
│ ├── stream_message_code.pb.go
│ ├── stream_message_data_task.pb.go
│ ├── task.pb.go
│ ├── task_service.pb.go
│ └── task_service_grpc.pb.go
├── k8s/
│ ├── crawlab-master.yaml
│ ├── crawlab-worker.yaml
│ ├── mongo-pv.yaml
│ ├── mongo.yaml
│ ├── ns.yaml
│ └── redis.yaml
├── nginx/
│ └── crawlab.conf
├── scripts/
│ └── validate-backend.sh
├── template-parser/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── entity.go
│ ├── func.go
│ ├── general_parser.go
│ ├── go.mod
│ ├── go.sum
│ ├── interfaces.go
│ ├── parser.go
│ ├── test/
│ │ └── general_parser_test.go
│ └── variable.go
├── trace/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── go.mod
│ ├── go.sum
│ └── trace.go
├── vcs/
│ ├── .github/
│ │ └── workflows/
│ │ └── test.yml
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── constants.go
│ ├── entity.go
│ ├── errors.go
│ ├── git.go
│ ├── git_options.go
│ ├── git_store.go
│ ├── git_utils.go
│ ├── go.mod
│ ├── go.sum
│ ├── interface.go
│ ├── test/
│ │ ├── base.go
│ │ ├── credential.go
│ │ ├── credentials.example.json
│ │ └── git_test.go
│ └── utils.go
└── workspace/
├── .gitignore
├── docker-compose.yml
├── dockerfiles/
│ ├── golang/
│ │ └── Dockerfile
│ └── node/
│ ├── .dockerignore
│ └── Dockerfile
└── localdev/
├── README.md
└── docker-compose.yml
Showing preview only (1,392K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5898 symbols across 580 files)
FILE: backend/main.go
function main (line 7) | func main() {
FILE: core/apps/api_v2.go
function init (line 18) | func init() {
type ApiV2 (line 27) | type ApiV2 struct
method Init (line 38) | func (app *ApiV2) Init() {
method Start (line 46) | func (app *ApiV2) Start() {
method Wait (line 76) | func (app *ApiV2) Wait() {
method Stop (line 80) | func (app *ApiV2) Stop() {
method GetGinEngine (line 89) | func (app *ApiV2) GetGinEngine() *gin.Engine {
method GetHttpServer (line 93) | func (app *ApiV2) GetHttpServer() *http.Server {
method Ready (line 97) | func (app *ApiV2) Ready() (ok bool) {
method initModuleWithApp (line 101) | func (app *ApiV2) initModuleWithApp(name string, fn func(app *gin.Engi...
function NewApiV2 (line 107) | func NewApiV2() *ApiV2 {
function GetApiV2 (line 117) | func GetApiV2() *ApiV2 {
FILE: core/apps/docker.go
type Docker (line 18) | type Docker struct
method Init (line 31) | func (app *Docker) Init() {
method Start (line 50) | func (app *Docker) Start() {
method Wait (line 57) | func (app *Docker) Wait() {
method Stop (line 61) | func (app *Docker) Stop() {
method GetParent (line 64) | func (app *Docker) GetParent() (parent ServerApp) {
method SetParent (line 68) | func (app *Docker) SetParent(parent ServerApp) {
method Ready (line 72) | func (app *Docker) Ready() (ok bool) {
method replacePaths (line 77) | func (app *Docker) replacePaths() (err error) {
method _replacePath (line 116) | func (app *Docker) _replacePath(text, path, baseUrl string) (res strin...
method startNginx (line 121) | func (app *Docker) startNginx() {
method startSeaweedFs (line 134) | func (app *Docker) startSeaweedFs() {
method importDemo (line 170) | func (app *Docker) importDemo() {
function NewDocker (line 180) | func NewDocker(svr ServerApp) *Docker {
function GetDocker (line 193) | func GetDocker(svr ServerApp) *Docker {
FILE: core/apps/interfaces.go
type App (line 9) | type App interface
type ApiApp (line 16) | type ApiApp interface
type NodeApp (line 23) | type NodeApp interface
type ServerApp (line 28) | type ServerApp interface
type DockerApp (line 34) | type DockerApp interface
FILE: core/apps/server_v2.go
type ServerV2 (line 15) | type ServerV2 struct
method Init (line 31) | func (app *ServerV2) Init() {
method Start (line 39) | func (app *ServerV2) Start() {
method Wait (line 54) | func (app *ServerV2) Wait() {
method Stop (line 58) | func (app *ServerV2) Stop() {
method GetApi (line 63) | func (app *ServerV2) GetApi() ApiApp {
method GetNodeService (line 67) | func (app *ServerV2) GetNodeService() interfaces.NodeService {
method logNodeInfo (line 71) | func (app *ServerV2) logNodeInfo() {
method initPprof (line 78) | func (app *ServerV2) initPprof() {
function NewServerV2 (line 86) | func NewServerV2() (app NodeApp) {
function GetServerV2 (line 120) | func GetServerV2() NodeApp {
FILE: core/apps/utils.go
function Start (line 10) | func Start(app App) {
function start (line 14) | func start(app App) {
function DefaultWait (line 21) | func DefaultWait() {
function initModule (line 25) | func initModule(name string, fn func() error) (err error) {
FILE: core/cmd/root.go
function Execute (line 22) | func Execute() error {
function init (line 26) | func init() {
FILE: core/cmd/server.go
function init (line 8) | func init() {
FILE: core/cmd/server_test.go
function TestCmdServer (line 9) | func TestCmdServer(t *testing.T) {
FILE: core/color/service.go
function NewService (line 16) | func NewService() (svc interfaces.ColorService, err error) {
type Service (line 34) | type Service struct
method Inject (line 39) | func (svc *Service) Inject() (err error) {
method GetByName (line 43) | func (svc *Service) GetByName(name string) (res interfaces.Color, err ...
method GetRandom (line 51) | func (svc *Service) GetRandom() (res interfaces.Color, err error) {
method getRandomColorHex (line 64) | func (svc *Service) getRandomColorHex() (res string, err error) {
method getRandomHexChar (line 76) | func (svc *Service) getRandomHexChar() (res string, err error) {
FILE: core/config/base.go
constant configDirName (line 11) | configDirName = ".crawlab"
constant configName (line 13) | configName = "config.json"
function GetConfigPath (line 15) | func GetConfigPath() string {
FILE: core/config/config.go
function init (line 11) | func init() {
type Config (line 28) | type Config struct
method WatchConfig (line 36) | func (c *Config) WatchConfig() {
method Init (line 43) | func (c *Config) Init() (err error) {
method initLogLevel (line 75) | func (c *Config) initLogLevel() {
type InitConfigOptions (line 32) | type InitConfigOptions struct
FILE: core/config/config_test.go
function TestInitConfig (line 8) | func TestInitConfig(t *testing.T) {
FILE: core/config/path.go
type PathService (line 7) | type PathService struct
method GetConfigPath (line 11) | func (svc *PathService) GetConfigPath() (path string) {
method SetConfigPath (line 15) | func (svc *PathService) SetConfigPath(path string) {
function NewConfigPathService (line 19) | func NewConfigPathService() (svc interfaces.WithConfigPath) {
FILE: core/constants/action.go
constant ActionTypeVisit (line 4) | ActionTypeVisit = "visit"
constant ActionTypeInstallDep (line 5) | ActionTypeInstallDep = "install_dep"
constant ActionTypeInstallLang (line 6) | ActionTypeInstallLang = "install_lang"
constant ActionTypeViewDisclaimer (line 7) | ActionTypeViewDisclaimer = "view_disclaimer"
FILE: core/constants/anchor.go
constant AnchorStartStage (line 4) | AnchorStartStage = "START_STAGE"
constant AnchorStartUrl (line 5) | AnchorStartUrl = "START_URL"
constant AnchorItems (line 6) | AnchorItems = "ITEMS"
constant AnchorParsers (line 7) | AnchorParsers = "PARSERS"
FILE: core/constants/auth.go
constant OwnerTypeAll (line 4) | OwnerTypeAll = "all"
constant OwnerTypeMe (line 5) | OwnerTypeMe = "me"
constant OwnerTypePublic (line 6) | OwnerTypePublic = "public"
FILE: core/constants/cache.go
constant CacheColName (line 4) | CacheColName = "cache"
constant CacheColKey (line 5) | CacheColKey = "k"
constant CacheColValue (line 6) | CacheColValue = "v"
constant CacheColTime (line 7) | CacheColTime = "t"
FILE: core/constants/channels.go
constant ChannelAllNode (line 4) | ChannelAllNode = "nodes:public"
constant ChannelWorkerNode (line 6) | ChannelWorkerNode = "nodes:"
constant ChannelMasterNode (line 8) | ChannelMasterNode = "nodes:master"
FILE: core/constants/common.go
constant ASCENDING (line 4) | ASCENDING = "asc"
constant DESCENDING (line 5) | DESCENDING = "dsc"
FILE: core/constants/config_spider.go
constant EngineScrapy (line 4) | EngineScrapy = "scrapy"
constant EngineColly (line 5) | EngineColly = "colly"
FILE: core/constants/data_collection.go
constant DataCollectionKey (line 4) | DataCollectionKey = "_col"
FILE: core/constants/data_field.go
constant DataFieldTypeGeneral (line 4) | DataFieldTypeGeneral = "general"
constant DataFieldTypeNumeric (line 5) | DataFieldTypeNumeric = "numeric"
constant DataFieldTypeDate (line 6) | DataFieldTypeDate = "date"
constant DataFieldTypeCurrency (line 7) | DataFieldTypeCurrency = "currency"
constant DataFieldTypeUrl (line 8) | DataFieldTypeUrl = "url"
constant DataFieldTypeImage (line 9) | DataFieldTypeImage = "image"
constant DataFieldTypeAudio (line 10) | DataFieldTypeAudio = "audio"
constant DataFieldTypeVideo (line 11) | DataFieldTypeVideo = "video"
FILE: core/constants/database.go
constant ColJob (line 4) | ColJob = "jobs"
FILE: core/constants/ds.go
constant DataSourceTypeMongo (line 4) | DataSourceTypeMongo = "mongo"
constant DataSourceTypeMysql (line 5) | DataSourceTypeMysql = "mysql"
constant DataSourceTypePostgresql (line 6) | DataSourceTypePostgresql = "postgresql"
constant DataSourceTypeMssql (line 7) | DataSourceTypeMssql = "mssql"
constant DataSourceTypeSqlite (line 8) | DataSourceTypeSqlite = "sqlite"
constant DataSourceTypeCockroachdb (line 9) | DataSourceTypeCockroachdb = "cockroachdb"
constant DataSourceTypeElasticSearch (line 10) | DataSourceTypeElasticSearch = "elasticsearch"
constant DataSourceTypeKafka (line 11) | DataSourceTypeKafka = "kafka"
constant DefaultHost (line 15) | DefaultHost = "localhost"
constant DefaultMongoPort (line 19) | DefaultMongoPort = 27017
constant DefaultMysqlPort (line 20) | DefaultMysqlPort = 3306
constant DefaultPostgresqlPort (line 21) | DefaultPostgresqlPort = 5432
constant DefaultMssqlPort (line 22) | DefaultMssqlPort = 1433
constant DefaultCockroachdbPort (line 23) | DefaultCockroachdbPort = 26257
constant DefaultElasticsearchPort (line 24) | DefaultElasticsearchPort = 9200
constant DefaultKafkaPort (line 25) | DefaultKafkaPort = 9092
constant DataSourceStatusOnline (line 29) | DataSourceStatusOnline = "on"
constant DataSourceStatusOffline (line 30) | DataSourceStatusOffline = "off"
FILE: core/constants/encrypt.go
constant DefaultEncryptServerKey (line 4) | DefaultEncryptServerKey = "0123456789abcdef"
FILE: core/constants/event.go
constant GrpcEventServiceTypeRegister (line 4) | GrpcEventServiceTypeRegister = "register"
constant GrpcEventServiceTypeSend (line 5) | GrpcEventServiceTypeSend = "send"
FILE: core/constants/export.go
constant ExportTypeCsv (line 4) | ExportTypeCsv = "csv"
constant ExportTypeJson (line 5) | ExportTypeJson = "json"
FILE: core/constants/file.go
constant EmptyFileData (line 3) | EmptyFileData = " "
constant FsKeepFileName (line 5) | FsKeepFileName = ".gitkeep"
FILE: core/constants/filer.go
constant DefaultFilerAuthKey (line 4) | DefaultFilerAuthKey = "Crawlab2021!"
FILE: core/constants/filter.go
constant FilterQueryFieldConditions (line 4) | FilterQueryFieldConditions = "conditions"
constant FilterQueryFieldAll (line 5) | FilterQueryFieldAll = "all"
constant FilterObjectTypeString (line 9) | FilterObjectTypeString = "string"
constant FilterObjectTypeNumber (line 10) | FilterObjectTypeNumber = "number"
constant FilterObjectTypeBoolean (line 11) | FilterObjectTypeBoolean = "boolean"
constant FilterOpNotSet (line 15) | FilterOpNotSet = "ns"
constant FilterOpContains (line 16) | FilterOpContains = "c"
constant FilterOpNotContains (line 17) | FilterOpNotContains = "nc"
constant FilterOpRegex (line 18) | FilterOpRegex = "r"
constant FilterOpEqual (line 19) | FilterOpEqual = "eq"
constant FilterOpNotEqual (line 20) | FilterOpNotEqual = "ne"
constant FilterOpIn (line 21) | FilterOpIn = "in"
constant FilterOpNotIn (line 22) | FilterOpNotIn = "nin"
constant FilterOpGreaterThan (line 23) | FilterOpGreaterThan = "gt"
constant FilterOpLessThan (line 24) | FilterOpLessThan = "lt"
constant FilterOpGreaterThanEqual (line 25) | FilterOpGreaterThanEqual = "gte"
constant FilterOpLessThanEqual (line 26) | FilterOpLessThanEqual = "lte"
constant FilterOpSearch (line 27) | FilterOpSearch = "s"
FILE: core/constants/git.go
constant GitAuthTypeHttp (line 4) | GitAuthTypeHttp = "http"
constant GitAuthTypeSsh (line 5) | GitAuthTypeSsh = "ssh"
constant GitRemoteNameUpstream (line 9) | GitRemoteNameUpstream = "upstream"
constant GitRemoteNameOrigin (line 10) | GitRemoteNameOrigin = "origin"
constant GitBranchMaster (line 14) | GitBranchMaster = "master"
constant GitBranchMain (line 15) | GitBranchMain = "main"
FILE: core/constants/grpc.go
constant DefaultGrpcServerHost (line 4) | DefaultGrpcServerHost = ""
constant DefaultGrpcServerPort (line 5) | DefaultGrpcServerPort = "9666"
constant DefaultGrpcClientRemoteHost (line 6) | DefaultGrpcClientRemoteHost = "localhost"
constant DefaultGrpcClientRemotePort (line 7) | DefaultGrpcClientRemotePort = DefaultGrpcServerPort
constant DefaultGrpcAuthKey (line 8) | DefaultGrpcAuthKey = "Crawlab2021!"
constant GrpcHeaderAuthorization (line 12) | GrpcHeaderAuthorization = "authorization"
constant GrpcSubscribeTypeNode (line 16) | GrpcSubscribeTypeNode = "node"
FILE: core/constants/http.go
constant HttpResponseStatusOk (line 4) | HttpResponseStatusOk = "ok"
constant HttpResponseMessageSuccess (line 5) | HttpResponseMessageSuccess = "success"
constant HttpResponseMessageError (line 6) | HttpResponseMessageError = "error"
constant HttpContentTypeApplicationJson (line 10) | HttpContentTypeApplicationJson = "application/json"
FILE: core/constants/log.go
constant ErrorRegexPattern (line 4) | ErrorRegexPattern = "(?:[ :,.]|^)((?:error|exception|traceback)s?)(?:[ :...
FILE: core/constants/message.go
constant MsgTypeGetLog (line 4) | MsgTypeGetLog = "get-log"
constant MsgTypeGetSystemInfo (line 5) | MsgTypeGetSystemInfo = "get-sys-info"
constant MsgTypeCancelTask (line 6) | MsgTypeCancelTask = "cancel-task"
constant MsgTypeRemoveLog (line 7) | MsgTypeRemoveLog = "remove-log"
constant MsgTypeRemoveSpider (line 8) | MsgTypeRemoveSpider = "remove-spider"
FILE: core/constants/node.go
constant NodeStatusUnregistered (line 4) | NodeStatusUnregistered = "u"
constant NodeStatusRegistered (line 5) | NodeStatusRegistered = "r"
constant NodeStatusOnline (line 6) | NodeStatusOnline = "on"
constant NodeStatusOffline (line 7) | NodeStatusOffline = "off"
FILE: core/constants/notification.go
constant NotificationTriggerPatternTask (line 4) | NotificationTriggerPatternTask = "^task"
constant NotificationTriggerPatternNode (line 5) | NotificationTriggerPatternNode = "^node"
constant NotificationTriggerTaskFinish (line 9) | NotificationTriggerTaskFinish = "task_finish"
constant NotificationTriggerTaskError (line 10) | NotificationTriggerTaskError = "task_error"
constant NotificationTriggerTaskEmptyResults (line 11) | NotificationTriggerTaskEmptyResults = "task_empty_results"
constant NotificationTriggerNodeStatusChange (line 12) | NotificationTriggerNodeStatusChange = "node_status_change"
constant NotificationTriggerNodeOnline (line 13) | NotificationTriggerNodeOnline = "node_online"
constant NotificationTriggerNodeOffline (line 14) | NotificationTriggerNodeOffline = "node_offline"
constant NotificationTriggerAlert (line 15) | NotificationTriggerAlert = "alert"
constant NotificationTemplateModeRichText (line 19) | NotificationTemplateModeRichText = "rich-text"
constant NotificationTemplateModeMarkdown (line 20) | NotificationTemplateModeMarkdown = "markdown"
FILE: core/constants/register.go
constant RegisterTypeMac (line 4) | RegisterTypeMac = "mac"
constant RegisterTypeIp (line 5) | RegisterTypeIp = "ip"
constant RegisterTypeHostname (line 6) | RegisterTypeHostname = "hostname"
constant RegisterTypeCustomName (line 7) | RegisterTypeCustomName = "customName"
FILE: core/constants/results.go
constant HashKey (line 4) | HashKey = "_h"
constant DedupTypeIgnore (line 8) | DedupTypeIgnore = "ignore"
constant DedupTypeOverwrite (line 9) | DedupTypeOverwrite = "overwrite"
FILE: core/constants/rpc.go
constant RpcInstallLang (line 4) | RpcInstallLang = "install_lang"
constant RpcInstallDep (line 5) | RpcInstallDep = "install_dep"
constant RpcUninstallDep (line 6) | RpcUninstallDep = "uninstall_dep"
constant RpcGetInstalledDepList (line 7) | RpcGetInstalledDepList = "get_installed_dep_list"
constant RpcGetLang (line 8) | RpcGetLang = "get_lang"
constant RpcCancelTask (line 9) | RpcCancelTask = "cancel_task"
constant RpcGetSystemInfoService (line 10) | RpcGetSystemInfoService = "get_system_info"
constant RpcRemoveSpider (line 11) | RpcRemoveSpider = "remove_spider"
FILE: core/constants/schedule.go
constant ScheduleStatusStop (line 4) | ScheduleStatusStop = "stopped"
constant ScheduleStatusRunning (line 5) | ScheduleStatusRunning = "running"
constant ScheduleStatusError (line 6) | ScheduleStatusError = "error"
constant ScheduleStatusErrorNotFoundNode (line 8) | ScheduleStatusErrorNotFoundNode = "Not Found Node"
constant ScheduleStatusErrorNotFoundSpider (line 9) | ScheduleStatusErrorNotFoundSpider = "Not Found Spider"
FILE: core/constants/scrapy.go
constant ScrapyProtectedStageNames (line 3) | ScrapyProtectedStageNames = ""
constant ScrapyProtectedFieldNames (line 5) | ScrapyProtectedFieldNames = "_id,task_id,ts"
FILE: core/constants/signal.go
constant SignalQuit (line 4) | SignalQuit = iota
FILE: core/constants/sort.go
constant SortQueryField (line 4) | SortQueryField = "sort"
FILE: core/constants/system.go
constant Windows (line 4) | Windows = "windows"
constant Linux (line 5) | Linux = "linux"
constant Darwin (line 6) | Darwin = "darwin"
constant Python (line 10) | Python = "python"
constant Nodejs (line 11) | Nodejs = "node"
constant Java (line 12) | Java = "java"
constant InstallStatusNotInstalled (line 16) | InstallStatusNotInstalled = "not-installed"
constant InstallStatusInstalling (line 17) | InstallStatusInstalling = "installing"
constant InstallStatusInstallingOther (line 18) | InstallStatusInstallingOther = "installing-other"
constant InstallStatusInstalled (line 19) | InstallStatusInstalled = "installed"
constant LangTypeLang (line 23) | LangTypeLang = "lang"
constant LangTypeWebDriver (line 24) | LangTypeWebDriver = "webdriver"
FILE: core/constants/task.go
constant TaskStatusPending (line 4) | TaskStatusPending = "pending"
constant TaskStatusRunning (line 5) | TaskStatusRunning = "running"
constant TaskStatusFinished (line 6) | TaskStatusFinished = "finished"
constant TaskStatusError (line 7) | TaskStatusError = "error"
constant TaskStatusCancelled (line 8) | TaskStatusCancelled = "cancelled"
constant TaskStatusAbnormal (line 9) | TaskStatusAbnormal = "abnormal"
constant RunTypeAllNodes (line 13) | RunTypeAllNodes = "all-nodes"
constant RunTypeRandom (line 14) | RunTypeRandom = "random"
constant RunTypeSelectedNodes (line 15) | RunTypeSelectedNodes = "selected-nodes"
constant TaskTypeSpider (line 19) | TaskTypeSpider = "spider"
constant TaskTypeSystem (line 20) | TaskTypeSystem = "system"
type TaskSignal (line 23) | type TaskSignal
constant TaskSignalFinish (line 26) | TaskSignalFinish TaskSignal = iota
constant TaskSignalCancel (line 27) | TaskSignalCancel
constant TaskSignalError (line 28) | TaskSignalError
constant TaskSignalLost (line 29) | TaskSignalLost
constant TaskListQueuePrefixPublic (line 33) | TaskListQueuePrefixPublic = "tasks:public"
constant TaskListQueuePrefixNodes (line 34) | TaskListQueuePrefixNodes = "tasks:nodes"
constant TaskKey (line 38) | TaskKey = "_tid"
FILE: core/constants/user.go
constant RoleAdmin (line 4) | RoleAdmin = "admin"
constant RoleNormal (line 5) | RoleNormal = "normal"
constant DefaultAdminUsername (line 9) | DefaultAdminUsername = "admin"
constant DefaultAdminPassword (line 10) | DefaultAdminPassword = "admin"
constant UserContextKey (line 14) | UserContextKey = "user"
FILE: core/constants/variable.go
constant String (line 4) | String = "string"
constant Number (line 5) | Number = "number"
constant Boolean (line 6) | Boolean = "boolean"
constant Array (line 7) | Array = "array"
constant Object (line 8) | Object = "object"
FILE: core/container/container.go
function GetContainer (line 9) | func GetContainer() *dig.Container {
FILE: core/controllers/base_file_v2.go
function GetBaseFileListDir (line 17) | func GetBaseFileListDir(rootPath string, c *gin.Context) {
function GetBaseFileFile (line 37) | func GetBaseFileFile(rootPath string, c *gin.Context) {
function GetBaseFileFileInfo (line 55) | func GetBaseFileFileInfo(rootPath string, c *gin.Context) {
function PostBaseFileSaveFile (line 73) | func PostBaseFileSaveFile(rootPath string, c *gin.Context) {
function PostBaseFileSaveFiles (line 123) | func PostBaseFileSaveFiles(rootPath string, c *gin.Context) {
function PostBaseFileSaveDir (line 174) | func PostBaseFileSaveDir(rootPath string, c *gin.Context) {
function PostBaseFileRenameFile (line 199) | func PostBaseFileRenameFile(rootPath string, c *gin.Context) {
function DeleteBaseFileFile (line 221) | func DeleteBaseFileFile(rootPath string, c *gin.Context) {
function PostBaseFileCopyFile (line 251) | func PostBaseFileCopyFile(rootPath string, c *gin.Context) {
function PostBaseFileExport (line 275) | func PostBaseFileExport(rootPath string, c *gin.Context) {
function GetBaseFileFsSvc (line 294) | func GetBaseFileFsSvc(rootPath string) (svc interfaces.FsServiceV2, err ...
function getBaseFileFsSvc (line 298) | func getBaseFileFsSvc(rootPath string) (svc interfaces.FsServiceV2, err ...
FILE: core/controllers/base_v2.go
type Action (line 14) | type Action struct
type BaseControllerV2 (line 20) | type BaseControllerV2 struct
method GetById (line 25) | func (ctr *BaseControllerV2[T]) GetById(c *gin.Context) {
method GetList (line 41) | func (ctr *BaseControllerV2[T]) GetList(c *gin.Context) {
method Post (line 53) | func (ctr *BaseControllerV2[T]) Post(c *gin.Context) {
method PutById (line 80) | func (ctr *BaseControllerV2[T]) PutById(c *gin.Context) {
method PatchList (line 111) | func (ctr *BaseControllerV2[T]) PatchList(c *gin.Context) {
method DeleteById (line 139) | func (ctr *BaseControllerV2[T]) DeleteById(c *gin.Context) {
method DeleteList (line 154) | func (ctr *BaseControllerV2[T]) DeleteList(c *gin.Context) {
method getAll (line 177) | func (ctr *BaseControllerV2[T]) getAll(c *gin.Context) {
method getList (line 198) | func (ctr *BaseControllerV2[T]) getList(c *gin.Context) {
function NewControllerV2 (line 230) | func NewControllerV2[T any](actions ...Action) *BaseControllerV2[T] {
FILE: core/controllers/base_v2_test.go
function init (line 22) | func init() {
type TestModel (line 27) | type TestModel
function SetupTestDB (line 32) | func SetupTestDB() {
function SetupRouter (line 56) | func SetupRouter() *gin.Engine {
function CleanupTestDB (line 62) | func CleanupTestDB() {
function TestBaseControllerV2_GetById (line 66) | func TestBaseControllerV2_GetById(t *testing.T) {
function TestBaseControllerV2_Post (line 99) | func TestBaseControllerV2_Post(t *testing.T) {
function TestBaseControllerV2_DeleteById (line 135) | func TestBaseControllerV2_DeleteById(t *testing.T) {
FILE: core/controllers/export_v2.go
function PostExport (line 12) | func PostExport(c *gin.Context) {
function GetExport (line 36) | func GetExport(c *gin.Context) {
function GetExportDownload (line 58) | func GetExportDownload(c *gin.Context) {
FILE: core/controllers/filter_v2.go
function GetFilterColFieldOptions (line 11) | func GetFilterColFieldOptions(c *gin.Context) {
FILE: core/controllers/http.go
type Response (line 3) | type Response struct
type ListResponse (line 10) | type ListResponse struct
FILE: core/controllers/login_v2.go
function PostLogin (line 10) | func PostLogin(c *gin.Context) {
function PostLogout (line 33) | func PostLogout(c *gin.Context) {
FILE: core/controllers/project_v2.go
function GetProjectList (line 14) | func GetProjectList(c *gin.Context) {
FILE: core/controllers/result_v2.go
function GetResultList (line 15) | func GetResultList(c *gin.Context) {
function getResultListQuery (line 106) | func getResultListQuery(c *gin.Context) (q generic.ListQuery) {
FILE: core/controllers/router_v2.go
type RouterGroups (line 10) | type RouterGroups struct
function NewRouterGroups (line 15) | func NewRouterGroups(app *gin.Engine) (groups *RouterGroups) {
function RegisterController (line 22) | func RegisterController[T any](group *gin.RouterGroup, basePath string, ...
function RegisterActions (line 39) | func RegisterActions(group *gin.RouterGroup, basePath string, actions []...
function registerBuiltinHandler (line 45) | func registerBuiltinHandler(group *gin.RouterGroup, method, path string,...
function InitRoutes (line 54) | func InitRoutes(app *gin.Engine) (err error) {
FILE: core/controllers/router_v2_test.go
function TestRouterGroups (line 11) | func TestRouterGroups(t *testing.T) {
function TestRegisterController_Routes (line 28) | func TestRegisterController_Routes(t *testing.T) {
function TestInitRoutes_ProjectsRoute (line 60) | func TestInitRoutes_ProjectsRoute(t *testing.T) {
function TestMain (line 88) | func TestMain(m *testing.M) {
FILE: core/controllers/schedule_v2.go
function PostSchedule (line 12) | func PostSchedule(c *gin.Context) {
function PutScheduleById (line 47) | func PutScheduleById(c *gin.Context) {
function PostScheduleEnable (line 93) | func PostScheduleEnable(c *gin.Context) {
function PostScheduleDisable (line 97) | func PostScheduleDisable(c *gin.Context) {
function postScheduleEnableDisableFunc (line 101) | func postScheduleEnableDisableFunc(isEnable bool) func(c *gin.Context) {
FILE: core/controllers/setting_v2.go
function GetSetting (line 12) | func GetSetting(c *gin.Context) {
function PostSetting (line 30) | func PostSetting(c *gin.Context) {
function PutSetting (line 60) | func PutSetting(c *gin.Context) {
FILE: core/controllers/spider_v2.go
function GetSpiderById (line 25) | func GetSpiderById(c *gin.Context) {
function GetSpiderList (line 77) | func GetSpiderList(c *gin.Context) {
function getSpiderListWithStats (line 96) | func getSpiderListWithStats(c *gin.Context) {
function PostSpider (line 246) | func PostSpider(c *gin.Context) {
function PutSpiderById (line 293) | func PutSpiderById(c *gin.Context) {
function DeleteSpiderById (line 329) | func DeleteSpiderById(c *gin.Context) {
function DeleteSpiderList (line 430) | func DeleteSpiderList(c *gin.Context) {
function GetSpiderListDir (line 547) | func GetSpiderListDir(c *gin.Context) {
function GetSpiderFile (line 556) | func GetSpiderFile(c *gin.Context) {
function GetSpiderFileInfo (line 565) | func GetSpiderFileInfo(c *gin.Context) {
function PostSpiderSaveFile (line 574) | func PostSpiderSaveFile(c *gin.Context) {
function PostSpiderSaveFiles (line 583) | func PostSpiderSaveFiles(c *gin.Context) {
function PostSpiderSaveDir (line 593) | func PostSpiderSaveDir(c *gin.Context) {
function PostSpiderRenameFile (line 602) | func PostSpiderRenameFile(c *gin.Context) {
function DeleteSpiderFile (line 611) | func DeleteSpiderFile(c *gin.Context) {
function PostSpiderCopyFile (line 620) | func PostSpiderCopyFile(c *gin.Context) {
function PostSpiderExport (line 629) | func PostSpiderExport(c *gin.Context) {
function PostSpiderRun (line 638) | func PostSpiderRun(c *gin.Context) {
function GetSpiderDataSource (line 673) | func GetSpiderDataSource(c *gin.Context) {
function PostSpiderDataSource (line 702) | func PostSpiderDataSource(c *gin.Context) {
function getSpiderFsSvc (line 746) | func getSpiderFsSvc(s *models2.SpiderV2) (svc interfaces.FsServiceV2, er...
function getSpiderFsSvcById (line 753) | func getSpiderFsSvcById(id primitive.ObjectID) (svc interfaces.FsService...
function getSpiderRootPath (line 763) | func getSpiderRootPath(c *gin.Context) (rootPath string, err error) {
FILE: core/controllers/spider_v2_test.go
function TestCreateSpider (line 20) | func TestCreateSpider(t *testing.T) {
function TestGetSpiderById (line 51) | func TestGetSpiderById(t *testing.T) {
function TestUpdateSpiderById (line 86) | func TestUpdateSpiderById(t *testing.T) {
function TestDeleteSpiderById (line 133) | func TestDeleteSpiderById(t *testing.T) {
function TestDeleteSpiderList (line 183) | func TestDeleteSpiderList(t *testing.T) {
FILE: core/controllers/stats_v2.go
function GetStatsOverview (line 16) | func GetStatsOverview(c *gin.Context) {
function GetStatsDaily (line 25) | func GetStatsDaily(c *gin.Context) {
function GetStatsTasks (line 34) | func GetStatsTasks(c *gin.Context) {
FILE: core/controllers/sync_v2.go
function GetSyncScan (line 11) | func GetSyncScan(c *gin.Context) {
function GetSyncDownload (line 25) | func GetSyncDownload(c *gin.Context) {
FILE: core/controllers/system_info_v2.go
function GetSystemInfo (line 9) | func GetSystemInfo(c *gin.Context) {
FILE: core/controllers/task_v2.go
function GetTaskById (line 28) | func GetTaskById(c *gin.Context) {
function GetTaskList (line 62) | func GetTaskList(c *gin.Context) {
function DeleteTaskById (line 163) | func DeleteTaskById(c *gin.Context) {
function DeleteList (line 209) | func DeleteList(c *gin.Context) {
function PostTaskRun (line 262) | func PostTaskRun(c *gin.Context) {
function PostTaskRestart (line 313) | func PostTaskRestart(c *gin.Context) {
function PostTaskCancel (line 357) | func PostTaskCancel(c *gin.Context) {
function GetTaskLogs (line 394) | func GetTaskLogs(c *gin.Context) {
function GetTaskData (line 433) | func GetTaskData(c *gin.Context) {
FILE: core/controllers/token_v2.go
function PostToken (line 10) | func PostToken(c *gin.Context) {
FILE: core/controllers/user_v2.go
function PostUser (line 11) | func PostUser(c *gin.Context) {
function PostUserChangePassword (line 47) | func PostUserChangePassword(c *gin.Context) {
function GetUserMe (line 85) | func GetUserMe(c *gin.Context) {
function PutUserById (line 95) | func PutUserById(c *gin.Context) {
FILE: core/controllers/user_v2_test.go
function TestPostUserChangePassword_Success (line 16) | func TestPostUserChangePassword_Success(t *testing.T) {
function TestGetUserMe_Success (line 42) | func TestGetUserMe_Success(t *testing.T) {
function TestPutUserById_Success (line 66) | func TestPutUserById_Success(t *testing.T) {
FILE: core/controllers/utils_context.go
function GetUserFromContext (line 10) | func GetUserFromContext(c *gin.Context) (u interfaces.User) {
function GetUserFromContextV2 (line 22) | func GetUserFromContextV2(c *gin.Context) (u *models.UserV2) {
FILE: core/controllers/utils_filter.go
function GetFilter (line 17) | func GetFilter(c *gin.Context) (f *entity.Filter, err error) {
function GetFilterQuery (line 69) | func GetFilterQuery(c *gin.Context) (q bson.M, err error) {
function MustGetFilterQuery (line 84) | func MustGetFilterQuery(c *gin.Context) (q bson.M) {
function GetFilterAll (line 93) | func GetFilterAll(c *gin.Context) (res bool, err error) {
function MustGetFilterAll (line 117) | func MustGetFilterAll(c *gin.Context) (res bool) {
FILE: core/controllers/utils_http.go
function handleError (line 11) | func handleError(statusCode int, c *gin.Context, err error, print bool) {
function HandleError (line 22) | func HandleError(statusCode int, c *gin.Context, err error) {
function HandleErrorNoPrint (line 26) | func HandleErrorNoPrint(statusCode int, c *gin.Context, err error) {
function HandleErrorBadRequest (line 30) | func HandleErrorBadRequest(c *gin.Context, err error) {
function HandleErrorForbidden (line 34) | func HandleErrorForbidden(c *gin.Context, err error) {
function HandleErrorUnauthorized (line 38) | func HandleErrorUnauthorized(c *gin.Context, err error) {
function HandleErrorNotFound (line 42) | func HandleErrorNotFound(c *gin.Context, err error) {
function HandleErrorNotFoundNoPrint (line 46) | func HandleErrorNotFoundNoPrint(c *gin.Context, err error) {
function HandleErrorInternalServerError (line 50) | func HandleErrorInternalServerError(c *gin.Context, err error) {
function HandleSuccess (line 54) | func HandleSuccess(c *gin.Context) {
function HandleSuccessWithData (line 61) | func HandleSuccessWithData(c *gin.Context, data interface{}) {
function HandleSuccessWithListData (line 69) | func HandleSuccessWithListData(c *gin.Context, data interface{}, total i...
FILE: core/controllers/utils_pagination.go
function GetDefaultPagination (line 9) | func GetDefaultPagination() (p *entity.Pagination) {
function GetPagination (line 16) | func GetPagination(c *gin.Context) (p *entity.Pagination, err error) {
function MustGetPagination (line 24) | func MustGetPagination(c *gin.Context) (p *entity.Pagination) {
FILE: core/controllers/utils_sort.go
function GetSorts (line 12) | func GetSorts(c *gin.Context) (sorts []entity.Sort, err error) {
function GetSortsOption (line 22) | func GetSortsOption(c *gin.Context) (sort bson.D, err error) {
function MustGetSortOption (line 35) | func MustGetSortOption(c *gin.Context) (sort bson.D) {
function SortsToOption (line 44) | func SortsToOption(sorts []entity.Sort) (sort bson.D, err error) {
FILE: core/controllers/ws_writer.go
type WsWriter (line 12) | type WsWriter struct
method Write (line 18) | func (w *WsWriter) Write(data []byte) (n int, err error) {
method Close (line 27) | func (w *WsWriter) Close() (err error) {
method CloseWithText (line 31) | func (w *WsWriter) CloseWithText(text string) {
method CloseWithError (line 35) | func (w *WsWriter) CloseWithError(err error) {
function NewWsWriter (line 39) | func NewWsWriter(c *gin.Context) (writer *WsWriter, err error) {
FILE: core/data/colors.go
constant ColorsDataText (line 3) | ColorsDataText = `[
FILE: core/database/entity/database.go
type DatabaseMetadata (line 3) | type DatabaseMetadata struct
type Database (line 7) | type Database struct
type DatabaseTable (line 12) | type DatabaseTable struct
type DatabaseColumn (line 18) | type DatabaseColumn struct
type DatabaseIndex (line 33) | type DatabaseIndex struct
type DatabaseIndexColumn (line 43) | type DatabaseIndexColumn struct
method OrderString (line 48) | func (col *DatabaseIndexColumn) OrderString() string {
type DatabaseQueryResults (line 56) | type DatabaseQueryResults struct
FILE: core/database/interfaces/database_registry_service.go
type DatabaseRegistryService (line 7) | type DatabaseRegistryService interface
FILE: core/database/interfaces/database_service.go
type DatabaseService (line 9) | type DatabaseService interface
FILE: core/database/registry_service.go
function SetDatabaseRegistryService (line 9) | func SetDatabaseRegistryService(svc interfaces.DatabaseRegistryService) {
function GetDatabaseRegistryService (line 13) | func GetDatabaseRegistryService() interfaces.DatabaseRegistryService {
FILE: core/docs/scripts/publish.js
function uploadFile (line 24) | function uploadFile(localFile, key) {
function main (line 61) | async function main() {
FILE: core/ds/cockroachdb.go
type CockroachdbService (line 13) | type CockroachdbService struct
function NewDataSourceCockroachdbService (line 17) | func NewDataSourceCockroachdbService(colId primitive.ObjectID, dsId prim...
FILE: core/ds/es.go
type ElasticsearchService (line 27) | type ElasticsearchService struct
method Insert (line 38) | func (svc *ElasticsearchService) Insert(records ...interface{}) (err e...
method List (line 100) | func (svc *ElasticsearchService) List(query generic.ListQuery, opts *g...
method Count (line 111) | func (svc *ElasticsearchService) Count(query generic.ListQuery) (n int...
method getListResponse (line 119) | func (svc *ElasticsearchService) getListResponse(query generic.ListQue...
method getIndexName (line 150) | func (svc *ElasticsearchService) getIndexName() (index string) {
method Index (line 210) | func (svc *ElasticsearchService) Index(fields []string) {
method SetTime (line 214) | func (svc *ElasticsearchService) SetTime(t time.Time) {
method GetTime (line 218) | func (svc *ElasticsearchService) GetTime() (t time.Time) {
function NewDataSourceElasticsearchService (line 158) | func NewDataSourceElasticsearchService(colId primitive.ObjectID, dsId pr...
FILE: core/ds/kafka.go
type KafkaService (line 18) | type KafkaService struct
method Insert (line 30) | func (svc *KafkaService) Insert(records ...interface{}) (err error) {
method List (line 50) | func (svc *KafkaService) List(query generic.ListQuery, opts *generic.L...
method Count (line 55) | func (svc *KafkaService) Count(query generic.ListQuery) (n int, err er...
method Index (line 106) | func (svc *KafkaService) Index(fields []string) {
method SetTime (line 110) | func (svc *KafkaService) SetTime(t time.Time) {
method GetTime (line 114) | func (svc *KafkaService) GetTime() (t time.Time) {
function NewDataSourceKafkaService (line 60) | func NewDataSourceKafkaService(colId primitive.ObjectID, dsId primitive....
FILE: core/ds/mongo.go
type MongoService (line 17) | type MongoService struct
method Insert (line 30) | func (svc *MongoService) Insert(records ...interface{}) (err error) {
method List (line 35) | func (svc *MongoService) List(query generic.ListQuery, opts *generic.L...
method Count (line 46) | func (svc *MongoService) Count(query generic.ListQuery) (n int, err er...
method Index (line 108) | func (svc *MongoService) Index(fields []string) {
method SetTime (line 112) | func (svc *MongoService) SetTime(t time.Time) {
method GetTime (line 116) | func (svc *MongoService) GetTime() (t time.Time) {
function NewDataSourceMongoService (line 50) | func NewDataSourceMongoService(colId primitive.ObjectID, dsId primitive....
FILE: core/ds/mssql.go
type MssqlService (line 14) | type MssqlService struct
function NewDataSourceMssqlService (line 18) | func NewDataSourceMssqlService(colId primitive.ObjectID, dsId primitive....
FILE: core/ds/mssql_test.go
function TestNewDataSourceMssqlService (line 5) | func TestNewDataSourceMssqlService(t *testing.T) {
FILE: core/ds/mysql.go
type MysqlService (line 13) | type MysqlService struct
function NewDataSourceMysqlService (line 17) | func NewDataSourceMysqlService(colId primitive.ObjectID, dsId primitive....
FILE: core/ds/options.go
type DataSourceServiceOption (line 8) | type DataSourceServiceOption
function WithMonitorInterval (line 10) | func WithMonitorInterval(duration time.Duration) DataSourceServiceOption {
FILE: core/ds/postgresql.go
type PostgresqlService (line 14) | type PostgresqlService struct
function NewDataSourcePostgresqlService (line 18) | func NewDataSourcePostgresqlService(colId primitive.ObjectID, dsId primi...
FILE: core/ds/service.go
type Service (line 22) | type Service struct
method Init (line 32) | func (svc *Service) Init() {
method Start (line 47) | func (svc *Service) Start() {
method Wait (line 52) | func (svc *Service) Wait() {
method Stop (line 56) | func (svc *Service) Stop() {
method ChangePassword (line 60) | func (svc *Service) ChangePassword(id primitive.ObjectID, password str...
method Monitor (line 93) | func (svc *Service) Monitor() {
method CheckStatus (line 110) | func (svc *Service) CheckStatus(id primitive.ObjectID) (err error) {
method SetTimeout (line 118) | func (svc *Service) SetTimeout(duration time.Duration) {
method SetMonitorInterval (line 122) | func (svc *Service) SetMonitorInterval(duration time.Duration) {
method monitor (line 126) | func (svc *Service) monitor() (err error) {
method checkStatus (line 163) | func (svc *Service) checkStatus(ds *models.DataSource, save bool) (err...
method _save (line 194) | func (svc *Service) _save(ds *models.DataSource) (err error) {
method _checkStatus (line 199) | func (svc *Service) _checkStatus(ds *models.DataSource) (err error) {
function NewDataSourceService (line 265) | func NewDataSourceService(opts ...DataSourceServiceOption) (svc2 interfa...
function GetDataSourceService (line 295) | func GetDataSourceService() (svc interfaces.DataSourceService, err error) {
FILE: core/ds/sql.go
type SqlService (line 14) | type SqlService struct
method Insert (line 26) | func (svc *SqlService) Insert(records ...interface{}) (err error) {
method List (line 44) | func (svc *SqlService) List(query generic.ListQuery, opts *generic.Lis...
method Count (line 58) | func (svc *SqlService) Count(query generic.ListQuery) (n int, err erro...
method Index (line 66) | func (svc *SqlService) Index(fields []string) {
method SetTime (line 70) | func (svc *SqlService) SetTime(t time.Time) {
method GetTime (line 74) | func (svc *SqlService) GetTime() (t time.Time) {
FILE: core/ds/sql_options.go
type SqlOptions (line 3) | type SqlOptions struct
FILE: core/ds/sqlite.go
type SqliteService (line 12) | type SqliteService struct
function NewDataSourceSqliteService (line 16) | func NewDataSourceSqliteService(colId primitive.ObjectID, dsId primitive...
FILE: core/entity/address.go
type Address (line 9) | type Address struct
method String (line 14) | func (a *Address) String() (res string) {
method IsEmpty (line 18) | func (a *Address) IsEmpty() (res bool) {
method Value (line 22) | func (a *Address) Value() (res interface{}) {
type AddressOptions (line 26) | type AddressOptions struct
function NewAddress (line 31) | func NewAddress(opts *AddressOptions) (res *Address) {
function NewAddressFromString (line 47) | func NewAddressFromString(address string) (res *Address, err error) {
FILE: core/entity/color.go
type Color (line 3) | type Color struct
method GetHex (line 8) | func (c *Color) GetHex() string {
method GetName (line 12) | func (c *Color) GetName() string {
method Value (line 16) | func (c *Color) Value() interface{} {
FILE: core/entity/common.go
type Page (line 5) | type Page struct
method GetPage (line 12) | func (p *Page) GetPage(pageNum string, pageSize string) {
FILE: core/entity/config_spider.go
type ConfigSpiderData (line 3) | type ConfigSpiderData struct
type Stage (line 22) | type Stage struct
type Field (line 33) | type Field struct
FILE: core/entity/data_field.go
type DataField (line 3) | type DataField struct
FILE: core/entity/dependency.go
type DependencyResult (line 5) | type DependencyResult struct
FILE: core/entity/doc.go
type DocItem (line 3) | type DocItem struct
FILE: core/entity/es.go
type ElasticsearchResponseData (line 38) | type ElasticsearchResponseData struct
FILE: core/entity/event.go
type EventData (line 3) | type EventData struct
method GetEvent (line 8) | func (d *EventData) GetEvent() string {
method GetData (line 12) | func (d *EventData) GetData() interface{} {
FILE: core/entity/export.go
type Export (line 8) | type Export struct
method GetId (line 21) | func (e *Export) GetId() string {
method GetType (line 25) | func (e *Export) GetType() string {
method GetTarget (line 29) | func (e *Export) GetTarget() string {
method GetFilter (line 33) | func (e *Export) GetFilter() interfaces.Filter {
method GetStatus (line 37) | func (e *Export) GetStatus() string {
method GetStartTs (line 41) | func (e *Export) GetStartTs() time.Time {
method GetEndTs (line 45) | func (e *Export) GetEndTs() time.Time {
method GetDownloadPath (line 49) | func (e *Export) GetDownloadPath() string {
FILE: core/entity/filter.go
type Condition (line 8) | type Condition struct
method GetKey (line 14) | func (c *Condition) GetKey() (key string) {
method SetKey (line 18) | func (c *Condition) SetKey(key string) {
method GetOp (line 22) | func (c *Condition) GetOp() (op string) {
method SetOp (line 26) | func (c *Condition) SetOp(op string) {
method GetValue (line 30) | func (c *Condition) GetValue() (value interface{}) {
method SetValue (line 34) | func (c *Condition) SetValue(value interface{}) {
type Filter (line 38) | type Filter struct
method GetIsOr (line 43) | func (f *Filter) GetIsOr() (isOr bool) {
method SetIsOr (line 47) | func (f *Filter) SetIsOr(isOr bool) {
method GetConditions (line 51) | func (f *Filter) GetConditions() (conditions []interfaces.FilterCondit...
method SetConditions (line 58) | func (f *Filter) SetConditions(conditions []interfaces.FilterCondition) {
method IsNil (line 65) | func (f *Filter) IsNil() (ok bool) {
FILE: core/entity/filter_select_option.go
type FilterSelectOption (line 3) | type FilterSelectOption struct
FILE: core/entity/fs_file_info.go
type FsFileInfo (line 9) | type FsFileInfo struct
method GetName (line 22) | func (f *FsFileInfo) GetName() string {
method GetPath (line 26) | func (f *FsFileInfo) GetPath() string {
method GetFullPath (line 30) | func (f *FsFileInfo) GetFullPath() string {
method GetExtension (line 34) | func (f *FsFileInfo) GetExtension() string {
method GetIsDir (line 38) | func (f *FsFileInfo) GetIsDir() bool {
method GetFileSize (line 42) | func (f *FsFileInfo) GetFileSize() int64 {
method GetModTime (line 46) | func (f *FsFileInfo) GetModTime() time.Time {
method GetMode (line 50) | func (f *FsFileInfo) GetMode() os.FileMode {
method GetHash (line 54) | func (f *FsFileInfo) GetHash() string {
method GetChildren (line 58) | func (f *FsFileInfo) GetChildren() []interfaces.FsFileInfo {
FILE: core/entity/git.go
type GitPayload (line 3) | type GitPayload struct
type GitConfig (line 10) | type GitConfig struct
FILE: core/entity/grpc_base_service_message.go
type GrpcBaseServiceMessage (line 9) | type GrpcBaseServiceMessage struct
method GetModelId (line 14) | func (msg *GrpcBaseServiceMessage) GetModelId() interfaces.ModelId {
method GetData (line 18) | func (msg *GrpcBaseServiceMessage) GetData() []byte {
method ToBytes (line 22) | func (msg *GrpcBaseServiceMessage) ToBytes() (data []byte) {
FILE: core/entity/grpc_base_service_params.go
type GrpcBaseServiceParams (line 10) | type GrpcBaseServiceParams struct
method Value (line 21) | func (params *GrpcBaseServiceParams) Value() interface{} {
FILE: core/entity/grpc_delegate_message.go
type GrpcDelegateMessage (line 9) | type GrpcDelegateMessage struct
method GetModelId (line 15) | func (msg *GrpcDelegateMessage) GetModelId() interfaces.ModelId {
method GetMethod (line 19) | func (msg *GrpcDelegateMessage) GetMethod() interfaces.ModelDelegateMe...
method GetData (line 23) | func (msg *GrpcDelegateMessage) GetData() []byte {
method ToBytes (line 27) | func (msg *GrpcDelegateMessage) ToBytes() (data []byte) {
FILE: core/entity/grpc_event_service_message.go
type GrpcEventServiceMessage (line 3) | type GrpcEventServiceMessage struct
FILE: core/entity/grpc_subscribe.go
type GrpcSubscribe (line 7) | type GrpcSubscribe struct
method GetStream (line 12) | func (sub *GrpcSubscribe) GetStream() interfaces.GrpcStream {
method GetStreamBidirectional (line 16) | func (sub *GrpcSubscribe) GetStreamBidirectional() interfaces.GrpcStre...
method GetFinished (line 24) | func (sub *GrpcSubscribe) GetFinished() chan bool {
FILE: core/entity/http.go
type Response (line 5) | type Response struct
type ListResponse (line 12) | type ListResponse struct
type ListRequestData (line 20) | type ListRequestData struct
type BatchRequestPayload (line 28) | type BatchRequestPayload struct
type BatchRequestPayloadWithStringData (line 32) | type BatchRequestPayloadWithStringData struct
type FileRequestPayload (line 38) | type FileRequestPayload struct
FILE: core/entity/model_delegate.go
type ModelDelegate (line 5) | type ModelDelegate struct
FILE: core/entity/model_info.go
type ModelInfo (line 5) | type ModelInfo struct
FILE: core/entity/node.go
type NodeInfo (line 3) | type NodeInfo struct
method Value (line 15) | func (n NodeInfo) Value() interface{} {
FILE: core/entity/notification_variable.go
type NotificationVariable (line 5) | type NotificationVariable struct
method GetKey (line 10) | func (v *NotificationVariable) GetKey() string {
FILE: core/entity/pagination.go
type Pagination (line 5) | type Pagination struct
method IsZero (line 10) | func (p *Pagination) IsZero() (ok bool) {
method IsDefault (line 15) | func (p *Pagination) IsDefault() (ok bool) {
FILE: core/entity/result.go
type Result (line 10) | type Result
method Value (line 12) | func (r Result) Value() map[string]interface{} {
method SetValue (line 16) | func (r Result) SetValue(key string, value interface{}) {
method GetValue (line 20) | func (r Result) GetValue(key string) (value interface{}) {
method GetTaskId (line 25) | func (r Result) GetTaskId() (id primitive.ObjectID) {
method SetTaskId (line 42) | func (r Result) SetTaskId(id primitive.ObjectID) {
method DenormalizeObjectId (line 46) | func (r Result) DenormalizeObjectId() (res Result) {
method ToJSON (line 58) | func (r Result) ToJSON() (res Result) {
method Flatten (line 69) | func (r Result) Flatten() (res Result) {
method String (line 90) | func (r Result) String() (s string) {
method Bytes (line 94) | func (r Result) Bytes() (bytes []byte) {
FILE: core/entity/rpc.go
type RpcMessage (line 3) | type RpcMessage struct
FILE: core/entity/sort.go
type Sort (line 3) | type Sort struct
FILE: core/entity/spider.go
type SpiderType (line 3) | type SpiderType struct
type ScrapySettingParam (line 8) | type ScrapySettingParam struct
type ScrapyItem (line 14) | type ScrapyItem struct
FILE: core/entity/stats.go
type StatsDailyItem (line 3) | type StatsDailyItem struct
type StatsTasksByStatusItem (line 9) | type StatsTasksByStatusItem struct
FILE: core/entity/system_info.go
type SystemInfo (line 3) | type SystemInfo struct
FILE: core/entity/task.go
type TaskMessage (line 8) | type TaskMessage struct
method ToString (line 15) | func (m *TaskMessage) ToString() (string, error) {
type TaskRunOptions (line 23) | type TaskRunOptions struct
type StreamMessageTaskData (line 26) | type StreamMessageTaskData struct
FILE: core/entity/translation.go
type Translation (line 3) | type Translation struct
method GetLang (line 9) | func (t Translation) GetLang() (l string) {
FILE: core/entity/ttl_map.go
type TTLMap (line 8) | type TTLMap struct
method Store (line 19) | func (t *TTLMap) Store(key string, val interface{}) {
method Load (line 26) | func (t *TTLMap) Load(key string) (val interface{}) {
type expireEntry (line 14) | type expireEntry struct
function NewTTLMap (line 40) | func NewTTLMap(ttl time.Duration) (m *TTLMap) {
FILE: core/entity/version.go
type Release (line 3) | type Release struct
type ReleaseSlices (line 11) | type ReleaseSlices
method Len (line 13) | func (r ReleaseSlices) Len() int {
method Less (line 17) | func (r ReleaseSlices) Less(i, j int) bool {
method Swap (line 21) | func (r ReleaseSlices) Swap(i, j int) {
FILE: core/errors/base.go
constant ErrorPrefixController (line 9) | ErrorPrefixController = "controller"
constant ErrorPrefixModel (line 10) | ErrorPrefixModel = "model"
constant ErrorPrefixFilter (line 11) | ErrorPrefixFilter = "filter"
constant ErrorPrefixHttp (line 12) | ErrorPrefixHttp = "http"
constant ErrorPrefixGrpc (line 13) | ErrorPrefixGrpc = "grpc"
constant ErrorPrefixNode (line 14) | ErrorPrefixNode = "node"
constant ErrorPrefixInject (line 15) | ErrorPrefixInject = "inject"
constant ErrorPrefixSpider (line 16) | ErrorPrefixSpider = "spider"
constant ErrorPrefixFs (line 17) | ErrorPrefixFs = "fs"
constant ErrorPrefixTask (line 18) | ErrorPrefixTask = "task"
constant ErrorPrefixSchedule (line 19) | ErrorPrefixSchedule = "schedule"
constant ErrorPrefixUser (line 20) | ErrorPrefixUser = "user"
constant ErrorPrefixStats (line 21) | ErrorPrefixStats = "stats"
constant ErrorPrefixEvent (line 22) | ErrorPrefixEvent = "event"
constant ErrorPrefixProcess (line 23) | ErrorPrefixProcess = "process"
constant ErrorPrefixGit (line 24) | ErrorPrefixGit = "git"
constant ErrorPrefixResult (line 25) | ErrorPrefixResult = "result"
constant ErrorPrefixDataSource (line 26) | ErrorPrefixDataSource = "data_source"
type ErrorPrefix (line 29) | type ErrorPrefix
function NewError (line 31) | func NewError(prefix ErrorPrefix, msg string) (err error) {
FILE: core/errors/controller.go
function NewControllerError (line 3) | func NewControllerError(msg string) (err error) {
FILE: core/errors/ds.go
function NewDataSourceError (line 3) | func NewDataSourceError(msg string) (err error) {
FILE: core/errors/event.go
function NewEventError (line 3) | func NewEventError(msg string) (err error) {
FILE: core/errors/filter.go
function NewFilterError (line 3) | func NewFilterError(msg string) (err error) {
FILE: core/errors/fs.go
function NewFsError (line 3) | func NewFsError(msg string) (err error) {
FILE: core/errors/git.go
function NewGitError (line 3) | func NewGitError(msg string) (err error) {
FILE: core/errors/grpc.go
function NewGrpcError (line 3) | func NewGrpcError(msg string) (err error) {
FILE: core/errors/http.go
function NewHttpError (line 3) | func NewHttpError(msg string) (err error) {
FILE: core/errors/model.go
function NewModelError (line 5) | func NewModelError(msg string) (err error) {
FILE: core/errors/node.go
function NewNodeError (line 3) | func NewNodeError(msg string) (err error) {
FILE: core/errors/process.go
function NewProcessError (line 3) | func NewProcessError(msg string) (err error) {
FILE: core/errors/result.go
function NewResultError (line 3) | func NewResultError(msg string) (err error) {
FILE: core/errors/schedule.go
function NewScheduleError (line 3) | func NewScheduleError(msg string) (err error) {
FILE: core/errors/spider.go
function NewSpiderError (line 3) | func NewSpiderError(msg string) (err error) {
FILE: core/errors/stats.go
function NewStatsError (line 3) | func NewStatsError(msg string) (err error) {
FILE: core/errors/store.go
function NewInjectError (line 3) | func NewInjectError(msg string) (err error) {
FILE: core/errors/task.go
function NewTaskError (line 3) | func NewTaskError(msg string) (err error) {
FILE: core/errors/user.go
function NewUserError (line 3) | func NewUserError(msg string) (err error) {
FILE: core/event/func.go
function SendEvent (line 3) | func SendEvent(eventName string, data ...interface{}) {
FILE: core/event/service.go
type Service (line 16) | type Service struct
method Register (line 23) | func (svc *Service) Register(key, include, exclude string, ch *chan in...
method Unregister (line 30) | func (svc *Service) Unregister(key string) {
method SendEvent (line 41) | func (svc *Service) SendEvent(eventName string, data ...interface{}) {
function NewEventService (line 79) | func NewEventService() (svc interfaces.EventService) {
FILE: core/export/csv_service.go
type CsvService (line 27) | type CsvService struct
method GenerateId (line 31) | func (svc *CsvService) GenerateId() (exportId string, err error) {
method Export (line 39) | func (svc *CsvService) Export(exportType, target string, filter interf...
method GetExport (line 68) | func (svc *CsvService) GetExport(exportId string) (export interfaces.E...
method export (line 78) | func (svc *CsvService) export(export *entity.Export) {
method getExportDir (line 212) | func (svc *CsvService) getExportDir() (dir string, err error) {
method getFileName (line 224) | func (svc *CsvService) getFileName(exportId string) (fileName string) {
method getDownloadPath (line 230) | func (svc *CsvService) getDownloadPath(exportId string) (downloadPath ...
method getCsvWriter (line 239) | func (svc *CsvService) getCsvWriter(export *entity.Export) (csvWriter ...
method getColumns (line 252) | func (svc *CsvService) getColumns(query bson.M, export interfaces.Expo...
method getRowCells (line 293) | func (svc *CsvService) getRowCells(columns []string, data bson.M) (cel...
function NewCsvService (line 328) | func NewCsvService() (svc2 interfaces.ExportService) {
function GetCsvService (line 339) | func GetCsvService() (svc interfaces.ExportService) {
FILE: core/export/csv_service_test.go
function TestCsvService_Export (line 17) | func TestCsvService_Export(t *testing.T) {
FILE: core/export/json_service.go
type JsonService (line 22) | type JsonService struct
method GenerateId (line 26) | func (svc *JsonService) GenerateId() (exportId string, err error) {
method Export (line 34) | func (svc *JsonService) Export(exportType, target string, filter inter...
method GetExport (line 63) | func (svc *JsonService) GetExport(exportId string) (export interfaces....
method export (line 73) | func (svc *JsonService) export(export *entity.Export) {
method getExportDir (line 180) | func (svc *JsonService) getExportDir() (dir string, err error) {
method getFileName (line 192) | func (svc *JsonService) getFileName(exportId string) (fileName string) {
method getDownloadPath (line 198) | func (svc *JsonService) getDownloadPath(exportId string) (downloadPath...
function NewJsonService (line 207) | func NewJsonService() (svc2 interfaces.ExportService) {
function GetJsonService (line 218) | func GetJsonService() (svc interfaces.ExportService) {
FILE: core/fs/default.go
function init (line 10) | func init() {
FILE: core/fs/service_v2.go
type ServiceV2 (line 14) | type ServiceV2 struct
method List (line 20) | func (svc *ServiceV2) List(path string) (files []interfaces.FsFileInfo...
method GetFile (line 81) | func (svc *ServiceV2) GetFile(path string) (data []byte, err error) {
method GetFileInfo (line 85) | func (svc *ServiceV2) GetFileInfo(path string) (file interfaces.FsFile...
method Save (line 103) | func (svc *ServiceV2) Save(path string, data []byte) (err error) {
method CreateDir (line 116) | func (svc *ServiceV2) CreateDir(path string) (err error) {
method Rename (line 120) | func (svc *ServiceV2) Rename(path, newPath string) (err error) {
method Delete (line 126) | func (svc *ServiceV2) Delete(path string) (err error) {
method Copy (line 131) | func (svc *ServiceV2) Copy(path, newPath string) (err error) {
method Export (line 164) | func (svc *ServiceV2) Export() (resultPath string, err error) {
function NewFsServiceV2 (line 173) | func NewFsServiceV2(path string) (svc interfaces.FsServiceV2) {
FILE: core/fs/service_v2_test.go
function TestServiceV2_List (line 12) | func TestServiceV2_List(t *testing.T) {
function TestServiceV2_GetFile (line 63) | func TestServiceV2_GetFile(t *testing.T) {
function TestServiceV2_Delete (line 87) | func TestServiceV2_Delete(t *testing.T) {
function TestServiceV2_CreateDir (line 115) | func TestServiceV2_CreateDir(t *testing.T) {
function TestServiceV2_Save (line 140) | func TestServiceV2_Save(t *testing.T) {
function TestServiceV2_Rename (line 166) | func TestServiceV2_Rename(t *testing.T) {
function TestServiceV2_RenameDir (line 194) | func TestServiceV2_RenameDir(t *testing.T) {
function TestServiceV2_Copy (line 222) | func TestServiceV2_Copy(t *testing.T) {
function TestServiceV2_CopyDir (line 251) | func TestServiceV2_CopyDir(t *testing.T) {
FILE: core/grpc/client/client.go
type Client (line 24) | type Client struct
method Init (line 49) | func (c *Client) Init() (err error) {
method Start (line 54) | func (c *Client) Start() (err error) {
method Stop (line 78) | func (c *Client) Stop() (err error) {
method Register (line 102) | func (c *Client) Register() (err error) {
method GetModelDelegateClient (line 129) | func (c *Client) GetModelDelegateClient() (res grpc2.ModelDelegateClie...
method GetModelBaseServiceClient (line 133) | func (c *Client) GetModelBaseServiceClient() (res grpc2.ModelBaseServi...
method GetNodeClient (line 137) | func (c *Client) GetNodeClient() grpc2.NodeServiceClient {
method GetTaskClient (line 141) | func (c *Client) GetTaskClient() grpc2.TaskServiceClient {
method GetMessageClient (line 145) | func (c *Client) GetMessageClient() grpc2.MessageServiceClient {
method SetAddress (line 149) | func (c *Client) SetAddress(address interfaces.Address) {
method SetTimeout (line 153) | func (c *Client) SetTimeout(timeout time.Duration) {
method SetSubscribeType (line 157) | func (c *Client) SetSubscribeType(value string) {
method SetHandleMessage (line 161) | func (c *Client) SetHandleMessage(handleMessage bool) {
method Context (line 165) | func (c *Client) Context() (ctx context.Context, cancel context.Cancel...
method NewRequest (line 169) | func (c *Client) NewRequest(d interface{}) (req *grpc2.Request) {
method GetConfigPath (line 176) | func (c *Client) GetConfigPath() (path string) {
method SetConfigPath (line 180) | func (c *Client) SetConfigPath(path string) {
method NewModelBaseServiceRequest (line 184) | func (c *Client) NewModelBaseServiceRequest(id interfaces.ModelId, par...
method GetMessageChannel (line 196) | func (c *Client) GetMessageChannel() (msgCh chan *grpc2.StreamMessage) {
method Restart (line 200) | func (c *Client) Restart() (err error) {
method IsStarted (line 207) | func (c *Client) IsStarted() (res bool) {
method IsClosed (line 211) | func (c *Client) IsClosed() (res bool) {
method Err (line 218) | func (c *Client) Err() (err error) {
method GetStream (line 222) | func (c *Client) GetStream() (stream grpc2.NodeService_SubscribeClient) {
method connect (line 226) | func (c *Client) connect() (err error) {
method _connect (line 230) | func (c *Client) _connect() (err error) {
method subscribe (line 255) | func (c *Client) subscribe() (err error) {
method _subscribeNode (line 266) | func (c *Client) _subscribeNode() (err error) {
method unsubscribe (line 282) | func (c *Client) unsubscribe() (err error) {
method handleStreamMessage (line 293) | func (c *Client) handleStreamMessage() {
method needRestart (line 337) | func (c *Client) needRestart() bool {
method getRequestData (line 348) | func (c *Client) getRequestData(d interface{}) (data []byte) {
function NewClient (line 365) | func NewClient() (res interfaces.GrpcClient, err error) {
function GetClient (line 402) | func GetClient() (c interfaces.GrpcClient, err error) {
function createClient (line 413) | func createClient() (client2 interfaces.GrpcClient, err error) {
FILE: core/grpc/client/client_v2.go
type GrpcClientV2 (line 26) | type GrpcClientV2 struct
method Start (line 49) | func (c *GrpcClientV2) Start() (err error) {
method Stop (line 73) | func (c *GrpcClientV2) Stop() (err error) {
method Register (line 97) | func (c *GrpcClientV2) Register() {
method Context (line 105) | func (c *GrpcClientV2) Context() (ctx context.Context, cancel context....
method NewRequest (line 109) | func (c *GrpcClientV2) NewRequest(d interface{}) (req *grpc2.Request) {
method IsStarted (line 116) | func (c *GrpcClientV2) IsStarted() (res bool) {
method IsClosed (line 120) | func (c *GrpcClientV2) IsClosed() (res bool) {
method GetMessageChannel (line 127) | func (c *GrpcClientV2) GetMessageChannel() (msgCh chan *grpc2.StreamMe...
method getRequestData (line 131) | func (c *GrpcClientV2) getRequestData(d interface{}) (data []byte) {
method unsubscribe (line 148) | func (c *GrpcClientV2) unsubscribe() (err error) {
method connect (line 159) | func (c *GrpcClientV2) connect() (err error) {
method subscribe (line 187) | func (c *GrpcClientV2) subscribe() (err error) {
method handleStreamMessage (line 206) | func (c *GrpcClientV2) handleStreamMessage() {
function newGrpcClientV2 (line 250) | func newGrpcClientV2() (c *GrpcClientV2) {
function GetGrpcClientV2 (line 276) | func GetGrpcClientV2() *GrpcClientV2 {
FILE: core/grpc/client/options.go
type Option (line 8) | type Option
function WithConfigPath (line 10) | func WithConfigPath(path string) Option {
function WithAddress (line 16) | func WithAddress(address interfaces.Address) Option {
function WithTimeout (line 22) | func WithTimeout(timeout time.Duration) Option {
function WithSubscribeType (line 27) | func WithSubscribeType(subscribeType string) Option {
function WithHandleMessage (line 33) | func WithHandleMessage(handleMessage bool) Option {
type PoolOption (line 39) | type PoolOption
function WithPoolConfigPath (line 41) | func WithPoolConfigPath(path string) PoolOption {
function WithPoolSize (line 47) | func WithPoolSize(size int) PoolOption {
FILE: core/grpc/client/pool.go
type Pool (line 11) | type Pool struct
method GetConfigPath (line 20) | func (p *Pool) GetConfigPath() (path string) {
method SetConfigPath (line 24) | func (p *Pool) SetConfigPath(path string) {
method Init (line 28) | func (p *Pool) Init() (err error) {
method NewClient (line 37) | func (p *Pool) NewClient() (err error) {
method GetClient (line 49) | func (p *Pool) GetClient() (c interfaces.GrpcClient, err error) {
method SetSize (line 62) | func (p *Pool) SetSize(size int) {
method getRandomIndex (line 66) | func (p *Pool) getRandomIndex() (idx int) {
function NewPool (line 70) | func NewPool(opts ...PoolOption) (p interfaces.GrpcClientPool, err error) {
FILE: core/grpc/middlewares/auth_token.go
function GetAuthTokenFunc (line 13) | func GetAuthTokenFunc(nodeCfgSvc interfaces.NodeConfigService) grpc_auth...
function GetAuthTokenUnaryChainInterceptor (line 41) | func GetAuthTokenUnaryChainInterceptor(nodeCfgSvc interfaces.NodeConfigS...
function GetAuthTokenStreamChainInterceptor (line 53) | func GetAuthTokenStreamChainInterceptor(nodeCfgSvc interfaces.NodeConfig...
FILE: core/grpc/payload/model_service_v2_payload.go
type ModelServiceV2Payload (line 9) | type ModelServiceV2Payload struct
FILE: core/grpc/server/dependencies_server_v2.go
type DependenciesServerV2 (line 20) | type DependenciesServerV2 struct
method Connect (line 26) | func (svr DependenciesServerV2) Connect(req *grpc.DependenciesServiceV...
method Sync (line 42) | func (svr DependenciesServerV2) Sync(ctx context.Context, request *grp...
method UpdateTaskLog (line 118) | func (svr DependenciesServerV2) UpdateTaskLog(stream grpc.Dependencies...
method GetStream (line 155) | func (svr DependenciesServerV2) GetStream(key string) (stream *grpc.De...
function NewDependenciesServerV2 (line 165) | func NewDependenciesServerV2() *DependenciesServerV2 {
function GetDependenciesServerV2 (line 174) | func GetDependenciesServerV2() *DependenciesServerV2 {
FILE: core/grpc/server/message_server.go
type MessageServer (line 15) | type MessageServer struct
method Connect (line 26) | func (svr MessageServer) Connect(stream grpc.MessageService_ConnectSer...
method redirectMessage (line 64) | func (svr MessageServer) redirectMessage(sub interfaces.GrpcSubscribe,...
function NewMessageServer (line 77) | func NewMessageServer() (res *MessageServer, err error) {
FILE: core/grpc/server/metrics_server_v2.go
type MetricsServerV2 (line 14) | type MetricsServerV2 struct
method Send (line 18) | func (svr MetricsServerV2) Send(_ context.Context, req *grpc.MetricsSe...
function newMetricsServerV2 (line 51) | func newMetricsServerV2() *MetricsServerV2 {
function GetMetricsServerV2 (line 58) | func GetMetricsServerV2() *MetricsServerV2 {
FILE: core/grpc/server/model_base_service_binder.go
function NewModelBaseServiceBinder (line 11) | func NewModelBaseServiceBinder(req *grpc.Request) (b *ModelBaseServiceBi...
type ModelBaseServiceBinder (line 18) | type ModelBaseServiceBinder struct
method Bind (line 23) | func (b *ModelBaseServiceBinder) Bind() (res *entity.GrpcBaseServicePa...
method MustBind (line 31) | func (b *ModelBaseServiceBinder) MustBind() (res interface{}) {
method BindWithBaseServiceMessage (line 39) | func (b *ModelBaseServiceBinder) BindWithBaseServiceMessage() (params ...
method process (line 50) | func (b *ModelBaseServiceBinder) process(params *entity.GrpcBaseServic...
method bindBaseServiceMessage (line 57) | func (b *ModelBaseServiceBinder) bindBaseServiceMessage() (err error) {
FILE: core/grpc/server/model_base_service_server.go
type ModelBaseServiceServer (line 15) | type ModelBaseServiceServer struct
method GetById (line 22) | func (svr ModelBaseServiceServer) GetById(ctx context.Context, req *gr...
method Get (line 28) | func (svr ModelBaseServiceServer) Get(ctx context.Context, req *grpc.R...
method GetList (line 34) | func (svr ModelBaseServiceServer) GetList(ctx context.Context, req *gr...
method DeleteById (line 48) | func (svr ModelBaseServiceServer) DeleteById(ctx context.Context, req ...
method Delete (line 55) | func (svr ModelBaseServiceServer) Delete(ctx context.Context, req *grp...
method DeleteList (line 62) | func (svr ModelBaseServiceServer) DeleteList(ctx context.Context, req ...
method ForceDeleteList (line 69) | func (svr ModelBaseServiceServer) ForceDeleteList(ctx context.Context,...
method UpdateById (line 76) | func (svr ModelBaseServiceServer) UpdateById(ctx context.Context, req ...
method Update (line 83) | func (svr ModelBaseServiceServer) Update(ctx context.Context, req *grp...
method UpdateDoc (line 90) | func (svr ModelBaseServiceServer) UpdateDoc(ctx context.Context, req *...
method Insert (line 97) | func (svr ModelBaseServiceServer) Insert(ctx context.Context, req *grp...
method Count (line 104) | func (svr ModelBaseServiceServer) Count(ctx context.Context, req *grpc...
method handleRequest (line 110) | func (svr ModelBaseServiceServer) handleRequest(req *grpc.Request, han...
type handleBaseServiceRequest (line 126) | type handleBaseServiceRequest
function NewModelBaseServiceServer (line 128) | func NewModelBaseServiceServer() (svr2 *ModelBaseServiceServer, err erro...
FILE: core/grpc/server/model_base_service_v2_server.go
function init (line 51) | func init() {
function GetOneInstanceModel (line 61) | func GetOneInstanceModel(typeName string) any {
type ModelBaseServiceServerV2 (line 65) | type ModelBaseServiceServerV2 struct
method GetById (line 69) | func (svr ModelBaseServiceServerV2) GetById(_ context.Context, req *gr...
method GetOne (line 82) | func (svr ModelBaseServiceServerV2) GetOne(_ context.Context, req *grp...
method GetMany (line 101) | func (svr ModelBaseServiceServerV2) GetMany(_ context.Context, req *gr...
method DeleteById (line 120) | func (svr ModelBaseServiceServerV2) DeleteById(_ context.Context, req ...
method DeleteOne (line 133) | func (svr ModelBaseServiceServerV2) DeleteOne(_ context.Context, req *...
method DeleteMany (line 147) | func (svr ModelBaseServiceServerV2) DeleteMany(_ context.Context, req ...
method UpdateById (line 161) | func (svr ModelBaseServiceServerV2) UpdateById(_ context.Context, req ...
method UpdateOne (line 179) | func (svr ModelBaseServiceServerV2) UpdateOne(_ context.Context, req *...
method UpdateMany (line 198) | func (svr ModelBaseServiceServerV2) UpdateMany(_ context.Context, req ...
method ReplaceById (line 217) | func (svr ModelBaseServiceServerV2) ReplaceById(_ context.Context, req...
method ReplaceOne (line 237) | func (svr ModelBaseServiceServerV2) ReplaceOne(_ context.Context, req ...
method InsertOne (line 258) | func (svr ModelBaseServiceServerV2) InsertOne(_ context.Context, req *...
method InsertMany (line 274) | func (svr ModelBaseServiceServerV2) InsertMany(_ context.Context, req ...
method Count (line 296) | func (svr ModelBaseServiceServerV2) Count(_ context.Context, req *grpc...
function GetModelService (line 309) | func GetModelService[T any](typeName string) *service.ModelServiceV2[T] {
function NewModelBaseServiceV2Server (line 313) | func NewModelBaseServiceV2Server() *ModelBaseServiceServerV2 {
FILE: core/grpc/server/model_delegate_binder.go
function NewModelDelegateBinder (line 12) | func NewModelDelegateBinder(req *grpc.Request) (b *ModelDelegateBinder) {
type ModelDelegateBinder (line 19) | type ModelDelegateBinder struct
method Bind (line 24) | func (b *ModelDelegateBinder) Bind() (res interface{}, err error) {
method MustBind (line 91) | func (b *ModelDelegateBinder) MustBind() (res interface{}) {
method BindWithDelegateMessage (line 99) | func (b *ModelDelegateBinder) BindWithDelegateMessage() (res interface...
method process (line 110) | func (b *ModelDelegateBinder) process(d interface{}, fieldIds ...inter...
method bindDelegateMessage (line 118) | func (b *ModelDelegateBinder) bindDelegateMessage() (err error) {
FILE: core/grpc/server/model_delegate_server.go
type ModelDelegateServer (line 11) | type ModelDelegateServer struct
method Do (line 16) | func (svr ModelDelegateServer) Do(ctx context.Context, req *grpc.Reque...
function NewModelDelegateServer (line 65) | func NewModelDelegateServer() (svr *ModelDelegateServer) {
FILE: core/grpc/server/node_server.go
type NodeServer (line 19) | type NodeServer struct
method Register (line 31) | func (svr NodeServer) Register(ctx context.Context, req *grpc.Request)...
method SendHeartbeat (line 114) | func (svr NodeServer) SendHeartbeat(ctx context.Context, req *grpc.Req...
method Ping (line 139) | func (svr NodeServer) Ping(ctx context.Context, req *grpc.Request) (re...
method Subscribe (line 143) | func (svr NodeServer) Subscribe(request *grpc.Request, stream grpc.Nod...
method Unsubscribe (line 171) | func (svr NodeServer) Unsubscribe(ctx context.Context, req *grpc.Reque...
function NewNodeServer (line 189) | func NewNodeServer() (res *NodeServer, err error) {
FILE: core/grpc/server/node_server_v2.go
type NodeServerV2 (line 24) | type NodeServerV2 struct
method Register (line 35) | func (svr NodeServerV2) Register(_ context.Context, req *grpc.NodeServ...
method SendHeartbeat (line 89) | func (svr NodeServerV2) SendHeartbeat(_ context.Context, req *grpc.Nod...
method Subscribe (line 125) | func (svr NodeServerV2) Subscribe(request *grpc.Request, stream grpc.N...
method Unsubscribe (line 153) | func (svr NodeServerV2) Unsubscribe(_ context.Context, req *grpc.Reque...
function NewNodeServerV2 (line 174) | func NewNodeServerV2() (res *NodeServerV2, err error) {
FILE: core/grpc/server/server_v2.go
type GrpcServerV2 (line 31) | type GrpcServerV2 struct
method GetConfigPath (line 52) | func (svr *GrpcServerV2) GetConfigPath() (path string) {
method SetConfigPath (line 56) | func (svr *GrpcServerV2) SetConfigPath(path string) {
method Init (line 60) | func (svr *GrpcServerV2) Init() (err error) {
method Start (line 69) | func (svr *GrpcServerV2) Start() (err error) {
method Stop (line 95) | func (svr *GrpcServerV2) Stop() (err error) {
method Register (line 118) | func (svr *GrpcServerV2) Register() (err error) {
method recoveryHandlerFunc (line 128) | func (svr *GrpcServerV2) recoveryHandlerFunc(p interface{}) (err error) {
method SetAddress (line 134) | func (svr *GrpcServerV2) SetAddress(address interfaces.Address) {
method GetSubscribe (line 138) | func (svr *GrpcServerV2) GetSubscribe(key string) (sub interfaces.Grpc...
method SetSubscribe (line 148) | func (svr *GrpcServerV2) SetSubscribe(key string, sub interfaces.GrpcS...
method DeleteSubscribe (line 154) | func (svr *GrpcServerV2) DeleteSubscribe(key string) {
method SendStreamMessage (line 160) | func (svr *GrpcServerV2) SendStreamMessage(key string, code grpc2.Stre...
method SendStreamMessageWithData (line 164) | func (svr *GrpcServerV2) SendStreamMessageWithData(key string, code gr...
method IsStopped (line 190) | func (svr *GrpcServerV2) IsStopped() (res bool) {
function NewGrpcServerV2 (line 194) | func NewGrpcServerV2() (svr *GrpcServerV2, err error) {
function GetGrpcServerV2 (line 251) | func GetGrpcServerV2() (svr *GrpcServerV2, err error) {
FILE: core/grpc/server/task_server_v2.go
type TaskServerV2 (line 27) | type TaskServerV2 struct
method Subscribe (line 39) | func (svr TaskServerV2) Subscribe(stream grpc.TaskService_SubscribeSer...
method Fetch (line 70) | func (svr TaskServerV2) Fetch(ctx context.Context, request *grpc.Reque...
method SendNotification (line 112) | func (svr TaskServerV2) SendNotification(_ context.Context, request *g...
method handleInsertData (line 212) | func (svr TaskServerV2) handleInsertData(msg *grpc.StreamMessage) (err...
method handleInsertLogs (line 234) | func (svr TaskServerV2) handleInsertLogs(msg *grpc.StreamMessage) (err...
method getTaskQueueItemIdAndDequeue (line 242) | func (svr TaskServerV2) getTaskQueueItemIdAndDequeue(query bson.M, opt...
method deserialize (line 265) | func (svr TaskServerV2) deserialize(msg *grpc.StreamMessage) (data ent...
function NewTaskServerV2 (line 275) | func NewTaskServerV2() (res *TaskServerV2, err error) {
FILE: core/grpc/server/utils_handle.go
function HandleError (line 9) | func HandleError(err error) (res *grpc.Response, err2 error) {
function HandleSuccess (line 17) | func HandleSuccess() (res *grpc.Response, err error) {
function HandleSuccessWithData (line 24) | func HandleSuccessWithData(data interface{}) (res *grpc.Response, err er...
function HandleSuccessWithListData (line 42) | func HandleSuccessWithListData(data interface{}, total int) (res *grpc.R...
FILE: core/i18n/service.go
type Service (line 9) | type Service struct
method AddTranslations (line 12) | func (svc *Service) AddTranslations(t []interfaces.Translation) {
method GetTranslations (line 16) | func (svc *Service) GetTranslations() (t []interfaces.Translation) {
function GetI18nService (line 20) | func GetI18nService(cfgPath string) (svc2 interfaces.I18nService, err er...
function ProvideGetI18nService (line 33) | func ProvideGetI18nService(cfgPath string) func() (svc interfaces.I18nSe...
function NewI18nService (line 39) | func NewI18nService() (svc2 interfaces.I18nService, err error) {
FILE: core/interfaces/address.go
type Address (line 3) | type Address interface
FILE: core/interfaces/color.go
type Color (line 3) | type Color interface
FILE: core/interfaces/color_service.go
type ColorService (line 3) | type ColorService interface
FILE: core/interfaces/controller_params.go
type ControllerParams (line 3) | type ControllerParams interface
FILE: core/interfaces/data_source_service.go
type DataSourceService (line 8) | type DataSourceService interface
FILE: core/interfaces/entity.go
type Entity (line 3) | type Entity interface
FILE: core/interfaces/event_data.go
type EventData (line 3) | type EventData interface
FILE: core/interfaces/event_service.go
type EventFn (line 3) | type EventFn
type EventService (line 5) | type EventService interface
FILE: core/interfaces/export.go
type Export (line 5) | type Export interface
FILE: core/interfaces/export_service.go
type ExportService (line 3) | type ExportService interface
FILE: core/interfaces/filter.go
type Filter (line 3) | type Filter interface
FILE: core/interfaces/filter_condition.go
type FilterCondition (line 3) | type FilterCondition interface
FILE: core/interfaces/fs_file_info.go
type FsFileInfo (line 8) | type FsFileInfo interface
FILE: core/interfaces/fs_service.go
type FsService (line 8) | type FsService interface
FILE: core/interfaces/fs_service_options.go
type ServiceCrudOptions (line 3) | type ServiceCrudOptions struct
type ServiceCrudOption (line 9) | type ServiceCrudOption
function WithOnlyFromWorkspace (line 11) | func WithOnlyFromWorkspace() ServiceCrudOption {
function WithNotSyncToWorkspace (line 17) | func WithNotSyncToWorkspace() ServiceCrudOption {
FILE: core/interfaces/fs_service_v2.go
type FsServiceV2 (line 3) | type FsServiceV2 interface
FILE: core/interfaces/grpc_base.go
type GrpcBase (line 3) | type GrpcBase interface
FILE: core/interfaces/grpc_base_service_params.go
type GrpcBaseServiceParams (line 3) | type GrpcBaseServiceParams interface
FILE: core/interfaces/grpc_client.go
type GrpcClient (line 9) | type GrpcClient interface
FILE: core/interfaces/grpc_client_model_base_service.go
type GrpcClientModelBaseService (line 3) | type GrpcClientModelBaseService interface
FILE: core/interfaces/grpc_client_model_delegate.go
type GrpcClientModelDelegate (line 3) | type GrpcClientModelDelegate interface
FILE: core/interfaces/grpc_client_model_environment_service.go
type GrpcClientModelEnvironmentService (line 9) | type GrpcClientModelEnvironmentService interface
FILE: core/interfaces/grpc_client_model_node_service.go
type GrpcClientModelNodeService (line 9) | type GrpcClientModelNodeService interface
FILE: core/interfaces/grpc_client_model_service.go
type GrpcClientModelService (line 3) | type GrpcClientModelService interface
FILE: core/interfaces/grpc_client_model_spider_service.go
type GrpcClientModelSpiderService (line 9) | type GrpcClientModelSpiderService interface
FILE: core/interfaces/grpc_client_model_task_service.go
type GrpcClientModelTaskService (line 9) | type GrpcClientModelTaskService interface
FILE: core/interfaces/grpc_client_model_task_stat_service.go
type GrpcClientModelTaskStatService (line 9) | type GrpcClientModelTaskStatService interface
FILE: core/interfaces/grpc_client_pool.go
type GrpcClientPool (line 3) | type GrpcClientPool interface
FILE: core/interfaces/grpc_model_base_service_message.go
type GrpcModelBaseServiceMessage (line 3) | type GrpcModelBaseServiceMessage interface
FILE: core/interfaces/grpc_model_binder.go
type GrpcModelBinder (line 3) | type GrpcModelBinder interface
FILE: core/interfaces/grpc_model_delegate_message.go
type GrpcModelDelegateMessage (line 3) | type GrpcModelDelegateMessage interface
FILE: core/interfaces/grpc_model_list_binder.go
type GrpcModelListBinder (line 3) | type GrpcModelListBinder interface
FILE: core/interfaces/grpc_server.go
type GrpcServer (line 7) | type GrpcServer interface
FILE: core/interfaces/grpc_stream.go
type GrpcStream (line 5) | type GrpcStream interface
type GrpcStreamBidirectional (line 9) | type GrpcStreamBidirectional interface
FILE: core/interfaces/grpc_subscribe.go
type GrpcSubscribe (line 3) | type GrpcSubscribe interface
FILE: core/interfaces/i18n_service.go
type I18nService (line 3) | type I18nService interface
FILE: core/interfaces/injectable.go
type Injectable (line 3) | type Injectable interface
FILE: core/interfaces/list.go
type List (line 3) | type List interface
FILE: core/interfaces/model.go
type Model (line 7) | type Model interface
type ModelV2 (line 12) | type ModelV2 interface
type ModelId (line 19) | type ModelId
constant ModelIdArtifact (line 22) | ModelIdArtifact = iota
constant ModelIdTag (line 23) | ModelIdTag
constant ModelIdNode (line 24) | ModelIdNode
constant ModelIdProject (line 25) | ModelIdProject
constant ModelIdSpider (line 26) | ModelIdSpider
constant ModelIdTask (line 27) | ModelIdTask
constant ModelIdJob (line 28) | ModelIdJob
constant ModelIdSchedule (line 29) | ModelIdSchedule
constant ModelIdUser (line 30) | ModelIdUser
constant ModelIdSetting (line 31) | ModelIdSetting
constant ModelIdToken (line 32) | ModelIdToken
constant ModelIdVariable (line 33) | ModelIdVariable
constant ModelIdTaskQueue (line 34) | ModelIdTaskQueue
constant ModelIdTaskStat (line 35) | ModelIdTaskStat
constant ModelIdSpiderStat (line 36) | ModelIdSpiderStat
constant ModelIdDataSource (line 37) | ModelIdDataSource
constant ModelIdDataCollection (line 38) | ModelIdDataCollection
constant ModelIdResult (line 39) | ModelIdResult
constant ModelIdPassword (line 40) | ModelIdPassword
constant ModelIdExtraValue (line 41) | ModelIdExtraValue
constant ModelIdGit (line 42) | ModelIdGit
constant ModelIdRole (line 43) | ModelIdRole
constant ModelIdUserRole (line 44) | ModelIdUserRole
constant ModelIdPermission (line 45) | ModelIdPermission
constant ModelIdRolePermission (line 46) | ModelIdRolePermission
constant ModelIdEnvironment (line 47) | ModelIdEnvironment
constant ModelIdDependencySetting (line 48) | ModelIdDependencySetting
constant ModelColNameArtifact (line 52) | ModelColNameArtifact = "artifacts"
constant ModelColNameTag (line 53) | ModelColNameTag = "tags"
constant ModelColNameNode (line 54) | ModelColNameNode = "nodes"
constant ModelColNameProject (line 55) | ModelColNameProject = "projects"
constant ModelColNameSpider (line 56) | ModelColNameSpider = "spiders"
constant ModelColNameTask (line 57) | ModelColNameTask = "tasks"
constant ModelColNameJob (line 58) | ModelColNameJob = "jobs"
constant ModelColNameSchedule (line 59) | ModelColNameSchedule = "schedules"
constant ModelColNameUser (line 60) | ModelColNameUser = "users"
constant ModelColNameSetting (line 61) | ModelColNameSetting = "settings"
constant ModelColNameToken (line 62) | ModelColNameToken = "tokens"
constant ModelColNameVariable (line 63) | ModelColNameVariable = "variables"
constant ModelColNameTaskQueue (line 64) | ModelColNameTaskQueue = "task_queue"
constant ModelColNameTaskStat (line 65) | ModelColNameTaskStat = "task_stats"
constant ModelColNameSpiderStat (line 66) | ModelColNameSpiderStat = "spider_stats"
constant ModelColNameDataSource (line 67) | ModelColNameDataSource = "data_sources"
constant ModelColNameDataCollection (line 68) | ModelColNameDataCollection = "data_collections"
constant ModelColNamePasswords (line 69) | ModelColNamePasswords = "passwords"
constant ModelColNameExtraValues (line 70) | ModelColNameExtraValues = "extra_values"
constant ModelColNameGit (line 71) | ModelColNameGit = "gits"
constant ModelColNameRole (line 72) | ModelColNameRole = "roles"
constant ModelColNameUserRole (line 73) | ModelColNameUserRole = "user_roles"
constant ModelColNamePermission (line 74) | ModelColNamePermission = "permissions"
constant ModelColNameRolePermission (line 75) | ModelColNameRolePermission = "role_permissions"
constant ModelColNameEnvironment (line 76) | ModelColNameEnvironment = "environments"
constant ModelColNameDependencySetting (line 77) | ModelColNameDependencySetting = "dependency_settings"
type ModelWithTags (line 80) | type ModelWithTags interface
type ModelWithNameDescription (line 86) | type ModelWithNameDescription interface
type ModelWithKey (line 94) | type ModelWithKey interface
FILE: core/interfaces/model_artifact.go
type ModelArtifact (line 5) | type ModelArtifact interface
FILE: core/interfaces/model_artifact_sys.go
type ModelArtifactSys (line 8) | type ModelArtifactSys interface
FILE: core/interfaces/model_base_service.go
type ModelBaseService (line 9) | type ModelBaseService interface
type ModelService (line 26) | type ModelService interface
FILE: core/interfaces/model_binder.go
type ModelBinder (line 3) | type ModelBinder interface
FILE: core/interfaces/model_delegate.go
type ModelDelegateMethod (line 3) | type ModelDelegateMethod
type ModelDelegate (line 5) | type ModelDelegate interface
constant ModelDelegateMethodAdd (line 16) | ModelDelegateMethodAdd = "add"
constant ModelDelegateMethodSave (line 17) | ModelDelegateMethodSave = "save"
constant ModelDelegateMethodDelete (line 18) | ModelDelegateMethodDelete = "delete"
constant ModelDelegateMethodGetArtifact (line 19) | ModelDelegateMethodGetArtifact = "get-artifact"
constant ModelDelegateMethodRefresh (line 20) | ModelDelegateMethodRefresh = "refresh"
constant ModelDelegateMethodChange (line 21) | ModelDelegateMethodChange = "change"
FILE: core/interfaces/model_environment.go
type Environment (line 3) | type Environment interface
FILE: core/interfaces/model_extra_value.go
type ExtraValue (line 7) | type ExtraValue interface
FILE: core/interfaces/model_git.go
type Git (line 4) | type Git interface
FILE: core/interfaces/model_list_binder.go
type ModelListBinder (line 3) | type ModelListBinder interface
FILE: core/interfaces/model_node.go
type Node (line 5) | type Node interface
FILE: core/interfaces/model_node_delegate.go
type ModelNodeDelegate (line 5) | type ModelNodeDelegate interface
FILE: core/interfaces/model_permission.go
type Permission (line 3) | type Permission interface
FILE: core/interfaces/model_result.go
type Result (line 5) | type Result interface
FILE: core/interfaces/model_role.go
type Role (line 3) | type Role interface
FILE: core/interfaces/model_schedule.go
type Schedule (line 8) | type Schedule interface
FILE: core/interfaces/model_service_v2.go
type ModelServiceV2 (line 9) | type ModelServiceV2 interface
FILE: core/interfaces/model_spider.go
type Spider (line 5) | type Spider interface
FILE: core/interfaces/model_tag.go
type Tag (line 3) | type Tag interface
FILE: core/interfaces/model_task.go
type Task (line 5) | type Task interface
FILE: core/interfaces/model_task_stat.go
type TaskStat (line 5) | type TaskStat interface
FILE: core/interfaces/model_user.go
type User (line 3) | type User interface
FILE: core/interfaces/model_user_group.go
type UserGroup (line 3) | type UserGroup interface
FILE: core/interfaces/module.go
type ModuleId (line 3) | type ModuleId
type Module (line 5) | type Module interface
FILE: core/interfaces/node_config_service.go
type NodeConfigService (line 3) | type NodeConfigService interface
FILE: core/interfaces/node_master_service.go
type NodeMasterService (line 7) | type NodeMasterService interface
FILE: core/interfaces/node_service.go
type NodeService (line 3) | type NodeService interface
FILE: core/interfaces/node_service_option.go
type NodeServiceOption (line 3) | type NodeServiceOption interface
FILE: core/interfaces/node_worker_service.go
type NodeWorkerService (line 5) | type NodeWorkerService interface
FILE: core/interfaces/process_daemon.go
type ProcessDaemon (line 8) | type ProcessDaemon interface
FILE: core/interfaces/provide.go
type Provide (line 3) | type Provide
FILE: core/interfaces/result_service.go
type ResultService (line 8) | type ResultService interface
FILE: core/interfaces/result_service_mongo.go
type ResultServiceMongo (line 9) | type ResultServiceMongo interface
FILE: core/interfaces/result_service_registry.go
type ResultServiceRegistry (line 5) | type ResultServiceRegistry interface
type ResultServiceRegistryFn (line 11) | type ResultServiceRegistryFn
FILE: core/interfaces/schedule_service.go
type ScheduleService (line 8) | type ScheduleService interface
FILE: core/interfaces/spider_admin_service.go
type SpiderAdminService (line 7) | type SpiderAdminService interface
FILE: core/interfaces/spider_service_options.go
type SpiderRunOptions (line 5) | type SpiderRunOptions struct
type SpiderCloneOptions (line 15) | type SpiderCloneOptions struct
FILE: core/interfaces/stats_service.go
type StatsService (line 5) | type StatsService interface
FILE: core/interfaces/task_base_service.go
type TaskBaseService (line 5) | type TaskBaseService interface
FILE: core/interfaces/task_handler_service.go
type TaskHandlerService (line 8) | type TaskHandlerService interface
FILE: core/interfaces/task_hook_service.go
type TaskHookService (line 3) | type TaskHookService interface
FILE: core/interfaces/task_runner.go
type TaskRunner (line 8) | type TaskRunner interface
FILE: core/interfaces/task_scheduler_service.go
type TaskSchedulerService (line 8) | type TaskSchedulerService interface
FILE: core/interfaces/task_stats_service.go
type TaskStatsService (line 5) | type TaskStatsService interface
FILE: core/interfaces/test.go
type Test (line 5) | type Test interface
FILE: core/interfaces/translation.go
type Translation (line 3) | type Translation interface
FILE: core/interfaces/user_service.go
type UserService (line 9) | type UserService interface
FILE: core/interfaces/user_service_options.go
type UserCreateOptions (line 3) | type UserCreateOptions struct
type UserLoginOptions (line 10) | type UserLoginOptions struct
FILE: core/interfaces/with_address.go
type WithAddress (line 3) | type WithAddress interface
FILE: core/interfaces/with_config_path.go
type WithConfigPath (line 3) | type WithConfigPath interface
FILE: core/interfaces/with_model_id.go
type WithModelId (line 3) | type WithModelId interface
FILE: core/main.go
function main (line 3) | func main() {
FILE: core/middlewares/auth.go
function AuthorizationMiddleware (line 13) | func AuthorizationMiddleware() gin.HandlerFunc {
FILE: core/middlewares/auth_v2.go
function AuthorizationMiddlewareV2 (line 13) | func AuthorizationMiddlewareV2() gin.HandlerFunc {
FILE: core/middlewares/cors.go
function CORSMiddleware (line 5) | func CORSMiddleware() gin.HandlerFunc {
FILE: core/middlewares/filer_auth.go
function FilerAuthorizationMiddleware (line 10) | func FilerAuthorizationMiddleware() gin.HandlerFunc {
FILE: core/middlewares/middlewares.go
function InitMiddlewares (line 5) | func InitMiddlewares(app *gin.Engine) (err error) {
FILE: core/models/client/binder_basic.go
function NewBasicBinder (line 12) | func NewBasicBinder(id interfaces.ModelId, res *grpc.Response) (b interf...
type BasicBinder (line 19) | type BasicBinder struct
method Bind (line 24) | func (b *BasicBinder) Bind() (res interfaces.Model, err error) {
method Process (line 87) | func (b *BasicBinder) Process(d interfaces.Model) (res interfaces.Mode...
FILE: core/models/client/binder_list.go
function NewListBinder (line 12) | func NewListBinder(id interfaces.ModelId, res *grpc.Response) (b interfa...
type ListBinder (line 19) | type ListBinder struct
method Bind (line 24) | func (b *ListBinder) Bind() (l interfaces.List, err error) {
method MustBind (line 87) | func (b *ListBinder) MustBind() (res interface{}) {
method Process (line 95) | func (b *ListBinder) Process(d interface{}) (l interfaces.List, err er...
FILE: core/models/client/model_base_service.go
type BaseServiceDelegate (line 22) | type BaseServiceDelegate struct
method GetModelId (line 31) | func (d *BaseServiceDelegate) GetModelId() (id interfaces.ModelId) {
method SetModelId (line 35) | func (d *BaseServiceDelegate) SetModelId(id interfaces.ModelId) {
method GetConfigPath (line 39) | func (d *BaseServiceDelegate) GetConfigPath() (path string) {
method SetConfigPath (line 43) | func (d *BaseServiceDelegate) SetConfigPath(path string) {
method GetById (line 47) | func (d *BaseServiceDelegate) GetById(id primitive.ObjectID) (doc inte...
method Get (line 65) | func (d *BaseServiceDelegate) Get(query bson.M, opts *mongo.FindOption...
method GetList (line 76) | func (d *BaseServiceDelegate) GetList(query bson.M, opts *mongo.FindOp...
method DeleteById (line 87) | func (d *BaseServiceDelegate) DeleteById(id primitive.ObjectID, args ....
method Delete (line 99) | func (d *BaseServiceDelegate) Delete(query bson.M, args ...interface{}...
method DeleteList (line 111) | func (d *BaseServiceDelegate) DeleteList(query bson.M, args ...interfa...
method ForceDeleteList (line 123) | func (d *BaseServiceDelegate) ForceDeleteList(query bson.M, args ...in...
method UpdateById (line 135) | func (d *BaseServiceDelegate) UpdateById(id primitive.ObjectID, update...
method Update (line 147) | func (d *BaseServiceDelegate) Update(query bson.M, update bson.M, fiel...
method UpdateDoc (line 159) | func (d *BaseServiceDelegate) UpdateDoc(query bson.M, doc interfaces.M...
method Insert (line 171) | func (d *BaseServiceDelegate) Insert(u interfaces.User, docs ...interf...
method Count (line 182) | func (d *BaseServiceDelegate) Count(query bson.M) (total int, err erro...
method newRequest (line 196) | func (d *BaseServiceDelegate) newRequest(params interfaces.GrpcBaseSer...
method mustNewRequest (line 200) | func (d *BaseServiceDelegate) mustNewRequest(params *entity.GrpcBaseSe...
method getModelBaseServiceClient (line 208) | func (d *BaseServiceDelegate) getModelBaseServiceClient() (c grpc.Mode...
function NewBaseServiceDelegate (line 223) | func NewBaseServiceDelegate(opts ...ModelBaseServiceDelegateOption) (svc...
function ProvideBaseServiceDelegate (line 247) | func ProvideBaseServiceDelegate(id interfaces.ModelId) func() (svc inter...
FILE: core/models/client/model_delegate.go
function NewModelDelegate (line 17) | func NewModelDelegate(doc interfaces.Model, opts ...ModelDelegateOption)...
function newModelDelegate (line 77) | func newModelDelegate(id interfaces.ModelId, doc interfaces.Model, opts ...
type ModelDelegate (line 125) | type ModelDelegate struct
method Add (line 137) | func (d *ModelDelegate) Add() (err error) {
method Save (line 141) | func (d *ModelDelegate) Save() (err error) {
method Delete (line 145) | func (d *ModelDelegate) Delete() (err error) {
method GetArtifact (line 149) | func (d *ModelDelegate) GetArtifact() (res interfaces.ModelArtifact, e...
method GetModel (line 156) | func (d *ModelDelegate) GetModel() (res interfaces.Model) {
method Refresh (line 160) | func (d *ModelDelegate) Refresh() (err error) {
method GetConfigPath (line 164) | func (d *ModelDelegate) GetConfigPath() (path string) {
method SetConfigPath (line 168) | func (d *ModelDelegate) SetConfigPath(path string) {
method Close (line 172) | func (d *ModelDelegate) Close() (err error) {
method ToBytes (line 176) | func (d *ModelDelegate) ToBytes(m interface{}) (bytes []byte, err erro...
method do (line 183) | func (d *ModelDelegate) do(method interfaces.ModelDelegateMethod) (err...
method add (line 204) | func (d *ModelDelegate) add() (err error) {
method save (line 222) | func (d *ModelDelegate) save() (err error) {
method delete (line 240) | func (d *ModelDelegate) delete() (err error) {
method refresh (line 258) | func (d *ModelDelegate) refresh() (err error) {
method refreshArtifact (line 276) | func (d *ModelDelegate) refreshArtifact() (err error) {
method getArtifact (line 281) | func (d *ModelDelegate) getArtifact() (res2 interfaces.ModelArtifact, ...
method mustGetData (line 299) | func (d *ModelDelegate) mustGetData() (data []byte) {
method getData (line 307) | func (d *ModelDelegate) getData() (data []byte, err error) {
method deserialize (line 311) | func (d *ModelDelegate) deserialize(res *grpc.Response, method interfa...
FILE: core/models/client/model_environment_service.go
type EnvironmentServiceDelegate (line 11) | type EnvironmentServiceDelegate struct
method GetEnvironmentById (line 15) | func (svc *EnvironmentServiceDelegate) GetEnvironmentById(id primitive...
method GetEnvironment (line 27) | func (svc *EnvironmentServiceDelegate) GetEnvironment(query bson.M, op...
method GetEnvironmentList (line 39) | func (svc *EnvironmentServiceDelegate) GetEnvironmentList(query bson.M...
function NewEnvironmentServiceDelegate (line 54) | func NewEnvironmentServiceDelegate() (svc2 interfaces.GrpcClientModelEnv...
FILE: core/models/client/model_node_delegate.go
type ModelNodeDelegate (line 9) | type ModelNodeDelegate struct
method UpdateStatus (line 14) | func (d *ModelNodeDelegate) UpdateStatus(active bool, activeTs *time.T...
method UpdateStatusOnline (line 23) | func (d *ModelNodeDelegate) UpdateStatusOnline() (err error) {
method UpdateStatusOffline (line 28) | func (d *ModelNodeDelegate) UpdateStatusOffline() (err error) {
function NewModelNodeDelegate (line 32) | func NewModelNodeDelegate(n interfaces.Node) interfaces.ModelNodeDelegate {
FILE: core/models/client/model_node_service.go
type NodeServiceDelegate (line 11) | type NodeServiceDelegate struct
method GetNodeById (line 15) | func (svc *NodeServiceDelegate) GetNodeById(id primitive.ObjectID) (n ...
method GetNode (line 27) | func (svc *NodeServiceDelegate) GetNode(query bson.M, opts *mongo.Find...
method GetNodeByKey (line 39) | func (svc *NodeServiceDelegate) GetNodeByKey(key string) (n interfaces...
method GetNodeList (line 43) | func (svc *NodeServiceDelegate) GetNodeList(query bson.M, opts *mongo....
function NewNodeServiceDelegate (line 58) | func NewNodeServiceDelegate() (svc2 interfaces.GrpcClientModelNodeServic...
FILE: core/models/client/model_service.go
type ServiceDelegate (line 9) | type ServiceDelegate struct
method GetConfigPath (line 17) | func (d *ServiceDelegate) GetConfigPath() string {
method SetConfigPath (line 21) | func (d *ServiceDelegate) SetConfigPath(path string) {
method NewBaseServiceDelegate (line 25) | func (d *ServiceDelegate) NewBaseServiceDelegate(id interfaces.ModelId...
function NewServiceDelegate (line 34) | func NewServiceDelegate() (svc2 interfaces.GrpcClientModelService, err e...
FILE: core/models/client/model_service_v2.go
type ModelServiceV2 (line 22) | type ModelServiceV2 struct
method GetById (line 28) | func (svc *ModelServiceV2[T]) GetById(id primitive.ObjectID) (model *T, ...
method GetOne (line 42) | func (svc *ModelServiceV2[T]) GetOne(query bson.M, options *mongo.FindOp...
method GetMany (line 65) | func (svc *ModelServiceV2[T]) GetMany(query bson.M, options *mongo.FindO...
method DeleteById (line 88) | func (svc *ModelServiceV2[T]) DeleteById(id primitive.ObjectID) (err err...
method DeleteOne (line 102) | func (svc *ModelServiceV2[T]) DeleteOne(query bson.M) (err error) {
method DeleteMany (line 120) | func (svc *ModelServiceV2[T]) DeleteMany(query bson.M) (err error) {
method UpdateById (line 138) | func (svc *ModelServiceV2[T]) UpdateById(id primitive.ObjectID, update b...
method UpdateOne (line 157) | func (svc *ModelServiceV2[T]) UpdateOne(query bson.M, update bson.M) (er...
method UpdateMany (line 180) | func (svc *ModelServiceV2[T]) UpdateMany(query bson.M, update bson.M) (e...
method ReplaceById (line 200) | func (svc *ModelServiceV2[T]) ReplaceById(id primitive.ObjectID, model T...
method ReplaceOne (line 219) | func (svc *ModelServiceV2[T]) ReplaceOne(query bson.M, model T) (err err...
method InsertOne (line 242) | func (svc *ModelServiceV2[T]) InsertOne(model T) (id primitive.ObjectID,...
method InsertMany (line 265) | func (svc *ModelServiceV2[T]) InsertMany(models []T) (ids []primitive.Ob...
method Count (line 283) | func (svc *ModelServiceV2[T]) Count(query bson.M) (total int, err error) {
method GetCol (line 301) | func (svc *ModelServiceV2[T]) GetCol() (col *mongo.Col) {
method deserializeOne (line 305) | func (svc *ModelServiceV2[T]) deserializeOne(res *grpc.Response) (result...
method deserializeMany (line 313) | func (svc *ModelServiceV2[T]) deserializeMany(res *grpc.Response) (resul...
function deserialize (line 317) | func deserialize[T any](res *grpc.Response) (result T, err error) {
function NewModelServiceV2 (line 325) | func NewModelServiceV2[T any]() *ModelServiceV2[T] {
FILE: core/models/client/model_service_v2_test.go
type TestModel (line 21) | type TestModel
function setupTestDB (line 23) | func setupTestDB() {
function teardownTestDB (line 27) | func teardownTestDB() {
function startSvr (line 32) | func startSvr(svr *server.GrpcServerV2) {
function stopSvr (line 39) | func stopSvr(svr *server.GrpcServerV2) {
function TestModelServiceV2_GetById (line 46) | func TestModelServiceV2_GetById(t *testing.T) {
function TestModelServiceV2_GetOne (line 74) | func TestModelServiceV2_GetOne(t *testing.T) {
function TestModelServiceV2_GetMany (line 102) | func TestModelServiceV2_GetMany(t *testing.T) {
function TestModelServiceV2_DeleteById (line 131) | func TestModelServiceV2_DeleteById(t *testing.T) {
function TestModelServiceV2_DeleteOne (line 161) | func TestModelServiceV2_DeleteOne(t *testing.T) {
function TestModelServiceV2_DeleteMany (line 191) | func TestModelServiceV2_DeleteMany(t *testing.T) {
function TestModelServiceV2_UpdateById (line 221) | func TestModelServiceV2_UpdateById(t *testing.T) {
function TestModelServiceV2_UpdateOne (line 251) | func TestModelServiceV2_UpdateOne(t *testing.T) {
function TestModelServiceV2_UpdateMany (line 281) | func TestModelServiceV2_UpdateMany(t *testing.T) {
function TestModelServiceV2_ReplaceById (line 315) | func TestModelServiceV2_ReplaceById(t *testing.T) {
function TestModelServiceV2_ReplaceOne (line 346) | func TestModelServiceV2_ReplaceOne(t *testing.T) {
function TestModelServiceV2_InsertOne (line 377) | func TestModelServiceV2_InsertOne(t *testing.T) {
function TestModelServiceV2_InsertMany (line 401) | func TestModelServiceV2_InsertMany(t *testing.T) {
function TestModelServiceV2_Count (line 428) | func TestModelServiceV2_Count(t *testing.T) {
FILE: core/models/client/model_spider_service.go
type SpiderServiceDelegate (line 11) | type SpiderServiceDelegate struct
method GetSpiderById (line 15) | func (svc *SpiderServiceDelegate) GetSpiderById(id primitive.ObjectID)...
method GetSpider (line 27) | func (svc *SpiderServiceDelegate) GetSpider(query bson.M, opts *mongo....
method GetSpiderList (line 39) | func (svc *SpiderServiceDelegate) GetSpiderList(query bson.M, opts *mo...
function NewSpiderServiceDelegate (line 54) | func NewSpiderServiceDelegate() (svc2 interfaces.GrpcClientModelSpiderSe...
FILE: core/models/client/model_task_service.go
type TaskServiceDelegate (line 11) | type TaskServiceDelegate struct
method GetTaskById (line 15) | func (svc *TaskServiceDelegate) GetTaskById(id primitive.ObjectID) (t ...
method GetTask (line 27) | func (svc *TaskServiceDelegate) GetTask(query bson.M, opts *mongo.Find...
method GetTaskList (line 39) | func (svc *TaskServiceDelegate) GetTaskList(query bson.M, opts *mongo....
function NewTaskServiceDelegate (line 54) | func NewTaskServiceDelegate() (svc2 interfaces.GrpcClientModelTaskServic...
FILE: core/models/client/model_task_stat_service.go
type TaskStatServiceDelegate (line 11) | type TaskStatServiceDelegate struct
method GetTaskStatById (line 15) | func (svc *TaskStatServiceDelegate) GetTaskStatById(id primitive.Objec...
method GetTaskStat (line 27) | func (svc *TaskStatServiceDelegate) GetTaskStat(query bson.M, opts *mo...
method GetTaskStatList (line 39) | func (svc *TaskStatServiceDelegate) GetTaskStatList(query bson.M, opts...
function NewTaskStatServiceDelegate (line 54) | func NewTaskStatServiceDelegate() (svc2 interfaces.GrpcClientModelTaskSt...
FILE: core/models/client/options.go
type ModelDelegateOption (line 5) | type ModelDelegateOption
function WithDelegateConfigPath (line 7) | func WithDelegateConfigPath(path string) ModelDelegateOption {
type ModelServiceDelegateOption (line 13) | type ModelServiceDelegateOption
function WithServiceConfigPath (line 15) | func WithServiceConfigPath(path string) ModelServiceDelegateOption {
type ModelBaseServiceDelegateOption (line 21) | type ModelBaseServiceDelegateOption
function WithBaseServiceModelId (line 23) | func WithBaseServiceModelId(id interfaces.ModelId) ModelBaseServiceDeleg...
function WithBaseServiceConfigPath (line 29) | func WithBaseServiceConfigPath(path string) ModelBaseServiceDelegateOpti...
FILE: core/models/common/index_service_v2.go
function CreateIndexesV2 (line 12) | func CreateIndexesV2() {
FILE: core/models/config_spider/common.go
function GetAllFields (line 5) | func GetAllFields(data entity.ConfigSpiderData) []entity.Field {
function GetStartStageName (line 13) | func GetStartStageName(data entity.ConfigSpiderData) string {
FILE: core/models/delegate/base_test.go
function SetupTest (line 11) | func SetupTest(t *testing.T) {
function CleanupTest (line 16) | func CleanupTest() {
FILE: core/models/delegate/model.go
function NewModelDelegate (line 20) | func NewModelDelegate(doc interfaces.Model, args ...interface{}) interfa...
function newModelDelegate (line 82) | func newModelDelegate(id interfaces.ModelId, doc interfaces.Model, args ...
type ModelDelegate (line 103) | type ModelDelegate struct
method Add (line 114) | func (d *ModelDelegate) Add() (err error) {
method Save (line 119) | func (d *ModelDelegate) Save() (err error) {
method Delete (line 124) | func (d *ModelDelegate) Delete() (err error) {
method GetArtifact (line 129) | func (d *ModelDelegate) GetArtifact() (res interfaces.ModelArtifact, e...
method Refresh (line 137) | func (d *ModelDelegate) Refresh() (err error) {
method GetModel (line 142) | func (d *ModelDelegate) GetModel() (res interfaces.Model) {
method ToBytes (line 146) | func (d *ModelDelegate) ToBytes(m interface{}) (bytes []byte, err erro...
method do (line 154) | func (d *ModelDelegate) do(method interfaces.ModelDelegateMethod) (err...
method add (line 180) | func (d *ModelDelegate) add() (err error) {
method save (line 198) | func (d *ModelDelegate) save() (err error) {
method delete (line 236) | func (d *ModelDelegate) delete() (err error) {
method refresh (line 251) | func (d *ModelDelegate) refresh() (err error) {
method refreshArtifact (line 264) | func (d *ModelDelegate) refreshArtifact() (err error) {
method upsertArtifact (line 276) | func (d *ModelDelegate) upsertArtifact() (err error) {
method deleteArtifact (line 325) | func (d *ModelDelegate) deleteArtifact() (err error) {
method hasChange (line 345) | func (d *ModelDelegate) hasChange() (ok bool) {
method _skip (line 349) | func (d *ModelDelegate) _skip() (ok bool) {
FILE: core/models/delegate/model_node.go
type ModelNodeDelegate (line 9) | type ModelNodeDelegate struct
method UpdateStatus (line 14) | func (d *ModelNodeDelegate) UpdateStatus(active bool, activeTs *time.T...
method UpdateStatusOnline (line 23) | func (d *ModelNodeDelegate) UpdateStatusOnline() (err error) {
method UpdateStatusOffline (line 28) | func (d *ModelNodeDelegate) UpdateStatusOffline() (err error) {
function NewModelNodeDelegate (line 32) | func NewModelNodeDelegate(n interfaces.Node) interfaces.ModelNodeDelegate {
FILE: core/models/delegate/model_node_test.go
function TestNode_Add (line 12) | func TestNode_Add(t *testing.T) {
function TestNode_Save (line 29) | func TestNode_Save(t *testing.T) {
function TestNode_Delete (line 46) | func TestNode_Delete(t *testing.T) {
FILE: core/models/delegate/model_role_test.go
function TestRole_Add (line 12) | func TestRole_Add(t *testing.T) {
function TestRole_Save (line 28) | func TestRole_Save(t *testing.T) {
function TestRole_Delete (line 46) | func TestRole_Delete(t *testing.T) {
FILE: core/models/delegate/model_test.go
function TestProject_Add (line 12) | func TestProject_Add(t *testing.T) {
function TestProject_Save (line 28) | func TestProject_Save(t *testing.T) {
function TestProject_Delete (line 46) | func TestProject_Delete(t *testing.T) {
FILE: core/models/delegate/utils_event.go
function GetEventName (line 8) | func GetEventName(d *ModelDelegate, method interfaces.ModelDelegateMetho...
function getEventName (line 12) | func getEventName(d *ModelDelegate, method interfaces.ModelDelegateMetho...
FILE: core/models/models/artifact.go
type Artifact (line 8) | type Artifact struct
method GetId (line 17) | func (a *Artifact) GetId() (id primitive.ObjectID) {
method SetId (line 21) | func (a *Artifact) SetId(id primitive.ObjectID) {
method GetSys (line 25) | func (a *Artifact) GetSys() (sys interfaces.ModelArtifactSys) {
method GetTagIds (line 32) | func (a *Artifact) GetTagIds() (ids []primitive.ObjectID) {
method SetTagIds (line 36) | func (a *Artifact) SetTagIds(ids []primitive.ObjectID) {
method SetObj (line 40) | func (a *Artifact) SetObj(obj interfaces.Model) {
method SetDel (line 44) | func (a *Artifact) SetDel(del bool) {
type ArtifactList (line 48) | type ArtifactList
method GetModels (line 50) | func (l *ArtifactList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/artifact_sys.go
type ArtifactSys (line 8) | type ArtifactSys struct
method GetCreateTs (line 17) | func (sys *ArtifactSys) GetCreateTs() time.Time {
method SetCreateTs (line 21) | func (sys *ArtifactSys) SetCreateTs(ts time.Time) {
method GetUpdateTs (line 25) | func (sys *ArtifactSys) GetUpdateTs() time.Time {
method SetUpdateTs (line 29) | func (sys *ArtifactSys) SetUpdateTs(ts time.Time) {
method GetDeleteTs (line 33) | func (sys *ArtifactSys) GetDeleteTs() time.Time {
method SetDeleteTs (line 37) | func (sys *ArtifactSys) SetDeleteTs(ts time.Time) {
method GetCreateUid (line 41) | func (sys *ArtifactSys) GetCreateUid() primitive.ObjectID {
method SetCreateUid (line 45) | func (sys *ArtifactSys) SetCreateUid(id primitive.ObjectID) {
method GetUpdateUid (line 49) | func (sys *ArtifactSys) GetUpdateUid() primitive.ObjectID {
method SetUpdateUid (line 53) | func (sys *ArtifactSys) SetUpdateUid(id primitive.ObjectID) {
method GetDeleteUid (line 57) | func (sys *ArtifactSys) GetDeleteUid() primitive.ObjectID {
method SetDeleteUid (line 61) | func (sys *ArtifactSys) SetDeleteUid(id primitive.ObjectID) {
FILE: core/models/models/base.go
type BaseModel (line 7) | type BaseModel struct
method GetId (line 11) | func (d *BaseModel) GetId() (id primitive.ObjectID) {
FILE: core/models/models/data_collection.go
type DataCollection (line 9) | type DataCollection struct
method GetId (line 20) | func (dc *DataCollection) GetId() (id primitive.ObjectID) {
method SetId (line 24) | func (dc *DataCollection) SetId(id primitive.ObjectID) {
type DataCollectionList (line 28) | type DataCollectionList
method GetModels (line 30) | func (l *DataCollectionList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/data_source.go
type DataSource (line 8) | type DataSource struct
method GetId (line 26) | func (ds *DataSource) GetId() (id primitive.ObjectID) {
method SetId (line 30) | func (ds *DataSource) SetId(id primitive.ObjectID) {
type DataSourceList (line 34) | type DataSourceList
method GetModels (line 36) | func (l *DataSourceList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/dependency_setting.go
type DependencySetting (line 9) | type DependencySetting struct
method GetId (line 20) | func (j *DependencySetting) GetId() (id primitive.ObjectID) {
method SetId (line 24) | func (j *DependencySetting) SetId(id primitive.ObjectID) {
type DependencySettingList (line 28) | type DependencySettingList
method GetModels (line 30) | func (l *DependencySettingList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/environment.go
type Environment (line 8) | type Environment struct
method GetId (line 14) | func (e *Environment) GetId() (id primitive.ObjectID) {
method SetId (line 18) | func (e *Environment) SetId(id primitive.ObjectID) {
method GetKey (line 22) | func (e *Environment) GetKey() (key string) {
method SetKey (line 26) | func (e *Environment) SetKey(key string) {
method GetValue (line 30) | func (e *Environment) GetValue() (value string) {
method SetValue (line 34) | func (e *Environment) SetValue(value string) {
type EnvironmentList (line 38) | type EnvironmentList
method GetModels (line 40) | func (l *EnvironmentList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/extra_value.go
type ExtraValue (line 8) | type ExtraValue struct
method GetId (line 16) | func (ev *ExtraValue) GetId() (id primitive.ObjectID) {
method SetId (line 20) | func (ev *ExtraValue) SetId(id primitive.ObjectID) {
method GetValue (line 24) | func (ev *ExtraValue) GetValue() (v interface{}) {
method SetValue (line 28) | func (ev *ExtraValue) SetValue(v interface{}) {
method GetObjectId (line 32) | func (ev *ExtraValue) GetObjectId() (oid primitive.ObjectID) {
method SetObjectId (line 36) | func (ev *ExtraValue) SetObjectId(oid primitive.ObjectID) {
method GetModel (line 40) | func (ev *ExtraValue) GetModel() (m string) {
method SetModel (line 44) | func (ev *ExtraValue) SetModel(m string) {
method GetType (line 48) | func (ev *ExtraValue) GetType() (t string) {
method SetType (line 52) | func (ev *ExtraValue) SetType(t string) {
type ExtraValueList (line 56) | type ExtraValueList
method GetModels (line 58) | func (l *ExtraValueList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/git.go
type Git (line 8) | type Git struct
method GetId (line 18) | func (g *Git) GetId() (id primitive.ObjectID) {
method SetId (line 22) | func (g *Git) SetId(id primitive.ObjectID) {
method GetUrl (line 26) | func (g *Git) GetUrl() (url string) {
method SetUrl (line 30) | func (g *Git) SetUrl(url string) {
method GetAuthType (line 34) | func (g *Git) GetAuthType() (authType string) {
method SetAuthType (line 38) | func (g *Git) SetAuthType(authType string) {
method GetUsername (line 42) | func (g *Git) GetUsername() (username string) {
method SetUsername (line 46) | func (g *Git) SetUsername(username string) {
method GetPassword (line 50) | func (g *Git) GetPassword() (password string) {
method SetPassword (line 54) | func (g *Git) SetPassword(password string) {
method GetCurrentBranch (line 58) | func (g *Git) GetCurrentBranch() (currentBranch string) {
method SetCurrentBranch (line 62) | func (g *Git) SetCurrentBranch(currentBranch string) {
method GetAutoPull (line 66) | func (g *Git) GetAutoPull() (autoPull bool) {
method SetAutoPull (line 70) | func (g *Git) SetAutoPull(autoPull bool) {
type GitList (line 74) | type GitList
method GetModels (line 76) | func (l *GitList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/job.go
type Job (line 8) | type Job struct
method GetId (line 13) | func (j *Job) GetId() (id primitive.ObjectID) {
method SetId (line 17) | func (j *Job) SetId(id primitive.ObjectID) {
type JobList (line 21) | type JobList
method GetModels (line 23) | func (l *JobList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/node.go
type Node (line 9) | type Node struct
method GetId (line 27) | func (n *Node) GetId() (id primitive.ObjectID) {
method SetId (line 31) | func (n *Node) SetId(id primitive.ObjectID) {
method GetName (line 35) | func (n *Node) GetName() (name string) {
method SetName (line 39) | func (n *Node) SetName(name string) {
method GetDescription (line 43) | func (n *Node) GetDescription() (description string) {
method SetDescription (line 47) | func (n *Node) SetDescription(description string) {
method GetKey (line 51) | func (n *Node) GetKey() (key string) {
method GetIsMaster (line 55) | func (n *Node) GetIsMaster() (ok bool) {
method GetActive (line 59) | func (n *Node) GetActive() (active bool) {
method SetActive (line 63) | func (n *Node) SetActive(active bool) {
method SetActiveTs (line 67) | func (n *Node) SetActiveTs(activeTs time.Time) {
method GetStatus (line 71) | func (n *Node) GetStatus() (status string) {
method SetStatus (line 75) | func (n *Node) SetStatus(status string) {
method GetEnabled (line 79) | func (n *Node) GetEnabled() (enabled bool) {
method SetEnabled (line 83) | func (n *Node) SetEnabled(enabled bool) {
method GetAvailableRunners (line 87) | func (n *Node) GetAvailableRunners() (runners int) {
method SetAvailableRunners (line 91) | func (n *Node) SetAvailableRunners(runners int) {
method GetMaxRunners (line 95) | func (n *Node) GetMaxRunners() (runners int) {
method SetMaxRunners (line 99) | func (n *Node) SetMaxRunners(runners int) {
method IncrementAvailableRunners (line 103) | func (n *Node) IncrementAvailableRunners() {
method DecrementAvailableRunners (line 107) | func (n *Node) DecrementAvailableRunners() {
type NodeList (line 111) | type NodeList
method GetModels (line 113) | func (l *NodeList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/password.go
type Password (line 8) | type Password struct
method GetId (line 13) | func (p *Password) GetId() (id primitive.ObjectID) {
method SetId (line 17) | func (p *Password) SetId(id primitive.ObjectID) {
type PasswordList (line 21) | type PasswordList
method GetModels (line 23) | func (l *PasswordList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/permission.go
type Permission (line 8) | type Permission struct
method GetId (line 19) | func (p *Permission) GetId() (id primitive.ObjectID) {
method SetId (line 23) | func (p *Permission) SetId(id primitive.ObjectID) {
method GetKey (line 27) | func (p *Permission) GetKey() (key string) {
method SetKey (line 31) | func (p *Permission) SetKey(key string) {
method GetName (line 35) | func (p *Permission) GetName() (name string) {
method SetName (line 39) | func (p *Permission) SetName(name string) {
method GetDescription (line 43) | func (p *Permission) GetDescription() (description string) {
method SetDescription (line 47) | func (p *Permission) SetDescription(description string) {
method GetType (line 51) | func (p *Permission) GetType() (t string) {
method SetType (line 55) | func (p *Permission) SetType(t string) {
method GetTarget (line 59) | func (p *Permission) GetTarget() (target []string) {
method SetTarget (line 63) | func (p *Permission) SetTarget(target []string) {
method GetAllow (line 67) | func (p *Permission) GetAllow() (include []string) {
method SetAllow (line 71) | func (p *Permission) SetAllow(include []string) {
method GetDeny (line 75) | func (p *Permission) GetDeny() (exclude []string) {
method SetDeny (line 79) | func (p *Permission) SetDeny(exclude []string) {
type PermissionList (line 83) | type PermissionList
method GetModels (line 85) | func (l *PermissionList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/project.go
type Project (line 8) | type Project struct
method GetId (line 15) | func (p *Project) GetId() (id primitive.ObjectID) {
method SetId (line 19) | func (p *Project) SetId(id primitive.ObjectID) {
method GetName (line 23) | func (p *Project) GetName() (name string) {
method SetName (line 27) | func (p *Project) SetName(name string) {
method GetDescription (line 31) | func (p *Project) GetDescription() (description string) {
method SetDescription (line 35) | func (p *Project) SetDescription(description string) {
type ProjectList (line 39) | type ProjectList
method GetModels (line 41) | func (l *ProjectList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/result.go
type Result (line 10) | type Result
method GetId (line 12) | func (r *Result) GetId() (id primitive.ObjectID) {
method SetId (line 23) | func (r *Result) SetId(id primitive.ObjectID) {
method Value (line 27) | func (r *Result) Value() map[string]interface{} {
method SetValue (line 31) | func (r *Result) SetValue(key string, value interface{}) {
method GetValue (line 35) | func (r *Result) GetValue(key string) (value interface{}) {
method GetTaskId (line 39) | func (r *Result) GetTaskId() (id primitive.ObjectID) {
method SetTaskId (line 48) | func (r *Result) SetTaskId(id primitive.ObjectID) {
type ResultList (line 52) | type ResultList
method GetModels (line 54) | func (l *ResultList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/role.go
type Role (line 8) | type Role struct
method GetId (line 15) | func (r *Role) GetId() (id primitive.ObjectID) {
method SetId (line 19) | func (r *Role) SetId(id primitive.ObjectID) {
method GetKey (line 23) | func (r *Role) GetKey() (key string) {
method SetKey (line 27) | func (r *Role) SetKey(key string) {
method GetName (line 31) | func (r *Role) GetName() (name string) {
method SetName (line 35) | func (r *Role) SetName(name string) {
method GetDescription (line 39) | func (r *Role) GetDescription() (description string) {
method SetDescription (line 43) | func (r *Role) SetDescription(description string) {
type RoleList (line 47) | type RoleList
method GetModels (line 49) | func (l *RoleList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/role_permission.go
type RolePermission (line 8) | type RolePermission struct
method GetId (line 14) | func (ur *RolePermission) GetId() (id primitive.ObjectID) {
method SetId (line 18) | func (ur *RolePermission) SetId(id primitive.ObjectID) {
type RolePermissionList (line 22) | type RolePermissionList
method GetModels (line 24) | func (l *RolePermissionList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/schedule.go
type Schedule (line 9) | type Schedule struct
method GetId (line 25) | func (s *Schedule) GetId() (id primitive.ObjectID) {
method SetId (line 29) | func (s *Schedule) SetId(id primitive.ObjectID) {
method GetEnabled (line 33) | func (s *Schedule) GetEnabled() (enabled bool) {
method SetEnabled (line 37) | func (s *Schedule) SetEnabled(enabled bool) {
method GetEntryId (line 41) | func (s *Schedule) GetEntryId() (id cron.EntryID) {
method SetEntryId (line 45) | func (s *Schedule) SetEntryId(id cron.EntryID) {
method GetCron (line 49) | func (s *Schedule) GetCron() (c string) {
method SetCron (line 53) | func (s *Schedule) SetCron(c string) {
method GetSpiderId (line 57) | func (s *Schedule) GetSpiderId() (id primitive.ObjectID) {
method SetSpiderId (line 61) | func (s *Schedule) SetSpiderId(id primitive.ObjectID) {
method GetMode (line 65) | func (s *Schedule) GetMode() (mode string) {
method SetMode (line 69) | func (s *Schedule) SetMode(mode string) {
method GetNodeIds (line 73) | func (s *Schedule) GetNodeIds() (ids []primitive.ObjectID) {
method SetNodeIds (line 77) | func (s *Schedule) SetNodeIds(ids []primitive.ObjectID) {
method GetCmd (line 81) | func (s *Schedule) GetCmd() (cmd string) {
method SetCmd (line 85) | func (s *Schedule) SetCmd(cmd string) {
method GetParam (line 89) | func (s *Schedule) GetParam() (param string) {
method SetParam (line 93) | func (s *Schedule) SetParam(param string) {
method GetPriority (line 97) | func (s *Schedule) GetPriority() (p int) {
method SetPriority (line 101) | func (s *Schedule) SetPriority(p int) {
type ScheduleList (line 105) | type ScheduleList
method GetModels (line 107) | func (l *ScheduleList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/setting.go
type Setting (line 9) | type Setting struct
method GetId (line 15) | func (s *Setting) GetId() (id primitive.ObjectID) {
method SetId (line 19) | func (s *Setting) SetId(id primitive.ObjectID) {
type SettingList (line 23) | type SettingList
method GetModels (line 25) | func (l *SettingList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/spider.go
type Env (line 8) | type Env struct
type Spider (line 13) | type Spider struct
method GetId (line 37) | func (s *Spider) GetId() (id primitive.ObjectID) {
method SetId (line 41) | func (s *Spider) SetId(id primitive.ObjectID) {
method GetName (line 45) | func (s *Spider) GetName() (name string) {
method SetName (line 49) | func (s *Spider) SetName(name string) {
method GetDescription (line 53) | func (s *Spider) GetDescription() (description string) {
method SetDescription (line 57) | func (s *Spider) SetDescription(description string) {
method GetType (line 61) | func (s *Spider) GetType() (ty string) {
method GetMode (line 65) | func (s *Spider) GetMode() (mode string) {
method SetMode (line 69) | func (s *Spider) SetMode(mode string) {
method GetNodeIds (line 73) | func (s *Spider) GetNodeIds() (ids []primitive.ObjectID) {
method SetNodeIds (line 77) | func (s *Spider) SetNodeIds(ids []primitive.ObjectID) {
method GetCmd (line 81) | func (s *Spider) GetCmd() (cmd string) {
method SetCmd (line 85) | func (s *Spider) SetCmd(cmd string) {
method GetParam (line 89) | func (s *Spider) GetParam() (param string) {
method SetParam (line 93) | func (s *Spider) SetParam(param string) {
method GetPriority (line 97) | func (s *Spider) GetPriority() (p int) {
method SetPriority (line 101) | func (s *Spider) SetPriority(p int) {
method GetColId (line 105) | func (s *Spider) GetColId() (id primitive.ObjectID) {
method SetColId (line 109) | func (s *Spider) SetColId(id primitive.ObjectID) {
method GetIncrementalSync (line 113) | func (s *Spider) GetIncrementalSync() (incrementalSync bool) {
method SetIncrementalSync (line 117) | func (s *Spider) SetIncrementalSync(incrementalSync bool) {
method GetAutoInstall (line 121) | func (s *Spider) GetAutoInstall() (autoInstall bool) {
method SetAutoInstall (line 125) | func (s *Spider) SetAutoInstall(autoInstall bool) {
type SpiderList (line 129) | type SpiderList
method GetModels (line 131) | func (l *SpiderList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/spider_stat.go
type SpiderStat (line 8) | type SpiderStat struct
method GetId (line 22) | func (s *SpiderStat) GetId() (id primitive.ObjectID) {
method SetId (line 26) | func (s *SpiderStat) SetId(id primitive.ObjectID) {
type SpiderStatList (line 30) | type SpiderStatList
method GetModels (line 32) | func (l *SpiderStatList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/tag.go
type Tag (line 8) | type Tag struct
method GetId (line 16) | func (t *Tag) GetId() (id primitive.ObjectID) {
method SetId (line 20) | func (t *Tag) SetId(id primitive.ObjectID) {
method GetName (line 24) | func (t *Tag) GetName() (res string) {
method GetColor (line 28) | func (t *Tag) GetColor() (res string) {
method SetCol (line 32) | func (t *Tag) SetCol(col string) {
type TagList (line 36) | type TagList
method GetModels (line 38) | func (l *TagList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/task.go
type Task (line 9) | type Task struct
method GetId (line 32) | func (t *Task) GetId() (id primitive.ObjectID) {
method SetId (line 36) | func (t *Task) SetId(id primitive.ObjectID) {
method GetNodeId (line 40) | func (t *Task) GetNodeId() (id primitive.ObjectID) {
method SetNodeId (line 44) | func (t *Task) SetNodeId(id primitive.ObjectID) {
method GetNodeIds (line 48) | func (t *Task) GetNodeIds() (ids []primitive.ObjectID) {
method GetStatus (line 52) | func (t *Task) GetStatus() (status string) {
method SetStatus (line 56) | func (t *Task) SetStatus(status string) {
method GetError (line 60) | func (t *Task) GetError() (error string) {
method SetError (line 64) | func (t *Task) SetError(error string) {
method GetPid (line 68) | func (t *Task) GetPid() (pid int) {
method SetPid (line 72) | func (t *Task) SetPid(pid int) {
method GetSpiderId (line 76) | func (t *Task) GetSpiderId() (id primitive.ObjectID) {
method GetType (line 80) | func (t *Task) GetType() (ty string) {
method GetCmd (line 84) | func (t *Task) GetCmd() (cmd string) {
method GetParam (line 88) | func (t *Task) GetParam() (param string) {
method GetPriority (line 92) | func (t *Task) GetPriority() (p int) {
method GetUserId (line 96) | func (t *Task) GetUserId() (id primitive.ObjectID) {
method SetUserId (line 100) | func (t *Task) SetUserId(id primitive.ObjectID) {
type TaskList (line 104) | type TaskList
method GetModels (line 106) | func (l *TaskList) GetModels() (res []interfaces.Model) {
type TaskDailyItem (line 114) | type TaskDailyItem struct
FILE: core/models/models/task_queue_item.go
type TaskQueueItem (line 8) | type TaskQueueItem struct
method GetId (line 14) | func (t *TaskQueueItem) GetId() (id primitive.ObjectID) {
method SetId (line 18) | func (t *TaskQueueItem) SetId(id primitive.ObjectID) {
type TaskQueueItemList (line 22) | type TaskQueueItemList
method GetModels (line 24) | func (l *TaskQueueItemList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/task_stat.go
type TaskStat (line 9) | type TaskStat struct
method GetId (line 21) | func (s *TaskStat) GetId() (id primitive.ObjectID) {
method SetId (line 25) | func (s *TaskStat) SetId(id primitive.ObjectID) {
method GetCreateTs (line 29) | func (s *TaskStat) GetCreateTs() (ts time.Time) {
method SetCreateTs (line 33) | func (s *TaskStat) SetCreateTs(ts time.Time) {
method GetStartTs (line 37) | func (s *TaskStat) GetStartTs() (ts time.Time) {
method SetStartTs (line 41) | func (s *TaskStat) SetStartTs(ts time.Time) {
method GetEndTs (line 45) | func (s *TaskStat) GetEndTs() (ts time.Time) {
method SetEndTs (line 49) | func (s *TaskStat) SetEndTs(ts time.Time) {
method GetWaitDuration (line 53) | func (s *TaskStat) GetWaitDuration() (d int64) {
method SetWaitDuration (line 57) | func (s *TaskStat) SetWaitDuration(d int64) {
method GetRuntimeDuration (line 61) | func (s *TaskStat) GetRuntimeDuration() (d int64) {
method SetRuntimeDuration (line 65) | func (s *TaskStat) SetRuntimeDuration(d int64) {
method GetTotalDuration (line 69) | func (s *TaskStat) GetTotalDuration() (d int64) {
method SetTotalDuration (line 73) | func (s *TaskStat) SetTotalDuration(d int64) {
method GetResultCount (line 77) | func (s *TaskStat) GetResultCount() (c int64) {
method SetResultCount (line 81) | func (s *TaskStat) SetResultCount(c int64) {
method GetErrorLogCount (line 85) | func (s *TaskStat) GetErrorLogCount() (c int64) {
method SetErrorLogCount (line 89) | func (s *TaskStat) SetErrorLogCount(c int64) {
type TaskStatList (line 93) | type TaskStatList
method GetModels (line 95) | func (l *TaskStatList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/token.go
type Token (line 8) | type Token struct
method GetId (line 14) | func (t *Token) GetId() (id primitive.ObjectID) {
method SetId (line 18) | func (t *Token) SetId(id primitive.ObjectID) {
type TokenList (line 22) | type TokenList
method GetModels (line 24) | func (l *TokenList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/user.go
type User (line 8) | type User struct
method GetId (line 17) | func (u *User) GetId() (id primitive.ObjectID) {
method SetId (line 21) | func (u *User) SetId(id primitive.ObjectID) {
method GetUsername (line 25) | func (u *User) GetUsername() (name string) {
method GetPassword (line 29) | func (u *User) GetPassword() (p string) {
method GetRole (line 33) | func (u *User) GetRole() (r string) {
method GetEmail (line 37) | func (u *User) GetEmail() (email string) {
type UserList (line 51) | type UserList
method GetModels (line 53) | func (l *UserList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/user_role.go
type UserRole (line 8) | type UserRole struct
method GetId (line 14) | func (ur *UserRole) GetId() (id primitive.ObjectID) {
method SetId (line 18) | func (ur *UserRole) SetId(id primitive.ObjectID) {
type UserRoleList (line 22) | type UserRoleList
method GetModels (line 24) | func (l *UserRoleList) GetModels() (res []interfaces.Model) {
FILE: core/models/models/utils_col.go
function GetModelColName (line 8) | func GetModelColName(id interfaces.ModelId) (colName string) {
FILE: core/models/models/utils_model_map.go
type ModelMap (line 3) | type ModelMap struct
type ModelListMap (line 33) | type ModelListMap struct
function NewModelMap (line 63) | func NewModelMap() (m *ModelMap) {
function NewModelListMap (line 67) | func NewModelListMap() (m *ModelListMap) {
FILE: core/models/models/utils_tag.go
function convertInterfacesToTags (line 10) | func convertInterfacesToTags(tags []interfaces.Tag) (res []Tag) {
function convertTagsToInterfaces (line 29) | func convertTagsToInterfaces(tags []Tag) (res []interfaces.Tag) {
FILE: core/models/models/v2/base_v2.go
type BaseModelV2 (line 8) | type BaseModelV2 struct
method GetId (line 16) | func (m *BaseModelV2[T]) GetId() primitive.ObjectID {
method SetId (line 20) | func (m *BaseModelV2[T]) SetId(id primitive.ObjectID) {
method GetCreatedAt (line 24) | func (m *BaseModelV2[T]) GetCreatedAt() time.Time {
method SetCreatedAt (line 28) | func (m *BaseModelV2[T]) SetCreatedAt(t time.Time) {
method GetCreatedBy (line 32) | func (m *BaseModelV2[T]) GetCreatedBy() primitive.ObjectID {
method SetCreatedBy (line 36) | func (m *BaseModelV2[T]) SetCreatedBy(id primitive.ObjectID) {
method GetUpdatedAt (line 40) | func (m *BaseModelV2[T]) GetUpdatedAt() time.Time {
method SetUpdatedAt (line 44) | func (m *BaseModelV2[T]) SetUpdatedAt(t time.Time) {
method GetUpdatedBy (line 48) | func (m *BaseModelV2[T]) GetUpdatedBy() primitive.ObjectID {
method SetUpdatedBy (line 52) | func (m *BaseModelV2[T]) SetUpdatedBy(id primitive.ObjectID) {
method SetCreated (line 56) | func (m *BaseModelV2[T]) SetCreated(id primitive.ObjectID) {
method SetUpdated (line 61) | func (m *BaseModelV2[T]) SetUpdated(id primitive.ObjectID) {
FILE: core/models/models/v2/data_collection_v2.go
type DataCollectionV2 (line 7) | type DataCollectionV2 struct
FILE: core/models/models/v2/database_metric_v2.go
type DatabaseMetricV2 (line 5) | type DatabaseMetricV2 struct
FILE: core/models/models/v2/database_v2.go
type DatabaseV2 (line 7) | type DatabaseV2 struct
FILE: core/models/models/v2/dependency_log_v2.go
type DependencyLogV2 (line 5) | type DependencyLogV2 struct
FILE: core/models/models/v2/dependency_setting_v2.go
type DependencySettingV2 (line 7) | type DependencySettingV2 struct
FILE: core/models/models/v2/dependency_task_v2.go
type DependencyTaskV2 (line 5) | type DependencyTaskV2 struct
FILE: core/models/models/v2/dependency_v2.go
type DependencyV2 (line 8) | type DependencyV2 struct
FILE: core/models/models/v2/environment_v2.go
type EnvironmentV2 (line 3) | type EnvironmentV2 struct
FILE: core/models/models/v2/git_v2.go
type GitV2 (line 8) | type GitV2 struct
FILE: core/models/models/v2/metric_v2.go
type MetricV2 (line 7) | type MetricV2 struct
FILE: core/models/models/v2/node_v2.go
type NodeV2 (line 7) | type NodeV2 struct
FILE: core/models/models/v2/notification_alert_v2.go
type NotificationAlertV2 (line 5) | type NotificationAlertV2 struct
FILE: core/models/models/v2/notification_channel_v2.go
type NotificationChannelV2 (line 3) | type NotificationChannelV2 struct
FILE: core/models/models/v2/notification_request_v2.go
type NotificationRequestV2 (line 5) | type NotificationRequestV2 struct
FILE: core/models/models/v2/notification_setting_v2.go
type NotificationSettingV2 (line 5) | type NotificationSettingV2 struct
FILE: core/models/models/v2/permission_v2.go
type PermissionV2 (line 3) | type PermissionV2 struct
FILE: core/models/models/v2/project_v2.go
type ProjectV2 (line 3) | type ProjectV2 struct
FILE: core/models/models/v2/role_permission_v2.go
type RolePermissionV2 (line 7) | type RolePermissionV2 struct
FILE: core/models/models/v2/role_v2.go
type RoleV2 (line 3) | type RoleV2 struct
FILE: core/models/models/v2/schedule_v2.go
type ScheduleV2 (line 8) | type ScheduleV2 struct
FILE: core/models/models/v2/setting_v2.go
type SettingV2 (line 7) | type SettingV2 struct
FILE: core/models/models/v2/spider_stat_v2.go
type SpiderStatV2 (line 7) | type SpiderStatV2 struct
FILE: core/models/models/v2/spider_v2.go
type SpiderV2 (line 7) | type SpiderV2 struct
FILE: core/models/models/v2/task_queue_item_v2.go
type TaskQueueItemV2 (line 7) | type TaskQueueItemV2 struct
FILE: core/models/models/v2/task_stat_v2.go
type TaskStatV2 (line 7) | type TaskStatV2 struct
FILE: core/models/models/v2/task_v2.go
type TaskV2 (line 7) | type TaskV2 struct
FILE: core/models/models/v2/test_v2.go
type TestModelV2 (line 3) | type TestModelV2 struct
FILE: core/models/models/v2/token_v2.go
type TokenV2 (line 3) | type TokenV2 struct
FILE: core/models/models/v2/user_role_v2.go
type UserRoleV2 (line 7) | type UserRoleV2 struct
FILE: core/models/models/v2/user_v2.go
type UserV2 (line 3) | type UserV2 struct
FILE: core/models/models/v2/variable_v2.go
type VariableV2 (line 3) | type VariableV2 struct
FILE: core/models/models/variable.go
type Variable (line 8) | type Variable struct
method GetId (line 15) | func (v *Variable) GetId() (id primitive.ObjectID) {
method SetId (line 19) | func (v *Variable) SetId(id primitive.ObjectID) {
type VariableList (line 23) | type VariableList
method GetModels (line 25) | func (l *VariableList) GetModels() (res []interfaces.Model) {
FILE: core/models/service/artifact_service.go
function convertTypeArtifact (line 12) | func convertTypeArtifact(d interface{}, err error) (res *models2.Artifac...
method GetArtifactById (line 23) | func (svc *Service) GetArtifactById(id primitive.ObjectID) (res *models2...
method GetArtifact (line 28) | func (svc *Service) GetArtifact(query bson.M, opts *mongo.FindOptions) (...
method GetArtifactList (line 33) | func (svc *Service) GetArtifactList(query bson.M, opts *mongo.FindOption...
FILE: core/models/service/base_service.go
type BaseService (line 22) | type BaseService struct
method GetModelId (line 27) | func (svc *BaseService) GetModelId() (id interfaces.ModelId) {
method SetModelId (line 31) | func (svc *BaseService) SetModelId(id interfaces.ModelId) {
method GetCol (line 35) | func (svc *BaseService) GetCol() (col *mongo.Col) {
method SetCol (line 39) | func (svc *BaseService) SetCol(col *mongo.Col) {
method GetById (line 43) | func (svc *BaseService) GetById(id primitive.ObjectID) (res interfaces...
method Get (line 51) | func (svc *BaseService) Get(query bson.M, opts *mongo.FindOptions) (re...
method GetList (line 59) | func (svc *BaseService) GetList(query bson.M, opts *mongo.FindOptions)...
method DeleteById (line 74) | func (svc *BaseService) DeleteById(id primitive.ObjectID, args ...inte...
method Delete (line 78) | func (svc *BaseService) Delete(query bson.M, args ...interface{}) (err...
method DeleteList (line 82) | func (svc *BaseService) DeleteList(query bson.M, args ...interface{}) ...
method ForceDeleteList (line 86) | func (svc *BaseService) ForceDeleteList(query bson.M, args ...interfac...
method UpdateById (line 90) | func (svc *BaseService) UpdateById(id primitive.ObjectID, update bson....
method Update (line 94) | func (svc *BaseService) Update(query bson.M, update bson.M, fields []s...
method UpdateDoc (line 98) | func (svc *BaseService) UpdateDoc(query bson.M, doc interfaces.Model, ...
method Insert (line 102) | func (svc *BaseService) Insert(u interfaces.User, docs ...interface{})...
method Count (line 108) | func (svc *BaseService) Count(query bson.M) (total int, err error) {
method findId (line 112) | func (svc *BaseService) findId(id primitive.ObjectID) (fr *mongo.FindR...
method find (line 119) | func (svc *BaseService) find(query bson.M, opts *mongo.FindOptions) (f...
method deleteId (line 126) | func (svc *BaseService) deleteId(id primitive.ObjectID, args ...interf...
method delete (line 138) | func (svc *BaseService) delete(query bson.M, args ...interface{}) (err...
method deleteList (line 149) | func (svc *BaseService) deleteList(query bson.M, args ...interface{}) ...
method forceDeleteList (line 166) | func (svc *BaseService) forceDeleteList(query bson.M, args ...interfac...
method count (line 170) | func (svc *BaseService) count(query bson.M) (total int, err error) {
method update (line 177) | func (svc *BaseService) update(query bson.M, update interface{}, field...
method updateId (line 185) | func (svc *BaseService) updateId(id primitive.ObjectID, update interfa...
method insert (line 193) | func (svc *BaseService) insert(u interfaces.User, docs ...interface{})...
method _update (line 256) | func (svc *BaseService) _update(query bson.M, update interface{}, args...
method _updateById (line 277) | func (svc *BaseService) _updateById(id primitive.ObjectID, update inte...
method _getUpdateBsonM (line 288) | func (svc *BaseService) _getUpdateBsonM(update interface{}, fields []s...
method _getUpdateArtifactUpdate (line 347) | func (svc *BaseService) _getUpdateArtifactUpdate(u interfaces.User) (r...
method _getUserFromArgs (line 360) | func (svc *BaseService) _getUserFromArgs(args ...interface{}) (u inter...
method _containsDollar (line 364) | func (svc *BaseService) _containsDollar(updateBsonM bson.M) (ok bool) {
function NewBaseService (line 373) | func NewBaseService(id interfaces.ModelId, opts ...BaseServiceOption) (s...
function GetBaseService (line 395) | func GetBaseService(id interfaces.ModelId) (svc interfaces.ModelBaseServ...
function GetBaseServiceByColName (line 408) | func GetBaseServiceByColName(id interfaces.ModelId, colName string) (svc...
FILE: core/models/service/base_service_v2.go
type ModelServiceV2 (line 23) | type ModelServiceV2 struct
method GetById (line 27) | func (svc *ModelServiceV2[T]) GetById(id primitive.ObjectID) (model *T, ...
method GetByIdContext (line 36) | func (svc *ModelServiceV2[T]) GetByIdContext(ctx context.Context, id pri...
method GetOne (line 45) | func (svc *ModelServiceV2[T]) GetOne(query bson.M, options *mongo.FindOp...
method GetOneContext (line 54) | func (svc *ModelServiceV2[T]) GetOneContext(ctx context.Context, query b...
method GetMany (line 73) | func (svc *ModelServiceV2[T]) GetMany(query bson.M, options *mongo.FindO...
method GetManyContext (line 82) | func (svc *ModelServiceV2[T]) GetManyContext(ctx context.Context, query ...
method DeleteById (line 113) | func (svc *ModelServiceV2[T]) DeleteById(id primitive.ObjectID) (err err...
method DeleteByIdContext (line 117) | func (svc *ModelServiceV2[T]) DeleteByIdContext(ctx context.Context, id ...
method DeleteOne (line 122) | func (svc *ModelServiceV2[T]) DeleteOne(query bson.M) (err error) {
method DeleteOneContext (line 127) | func (svc *ModelServiceV2[T]) DeleteOneContext(ctx context.Context, quer...
method DeleteMany (line 132) | func (svc *ModelServiceV2[T]) DeleteMany(query bson.M) (err error) {
method DeleteManyContext (line 137) | func (svc *ModelServiceV2[T]) DeleteManyContext(ctx context.Context, que...
method UpdateById (line 142) | func (svc *ModelServiceV2[T]) UpdateById(id primitive.ObjectID, update b...
method UpdateByIdContext (line 146) | func (svc *ModelServiceV2[T]) UpdateByIdContext(ctx context.Context, id ...
method UpdateOne (line 151) | func (svc *ModelServiceV2[T]) UpdateOne(query bson.M, update bson.M) (er...
method UpdateOneContext (line 156) | func (svc *ModelServiceV2[T]) UpdateOneContext(ctx context.Context, quer...
method UpdateMany (line 161) | func (svc *ModelServiceV2[T]) UpdateMany(query bson.M, update bson.M) (e...
method UpdateManyContext (line 166) | func (svc *ModelServiceV2[T]) UpdateManyContext(ctx context.Context, que...
method ReplaceById (line 171) | func (svc *ModelServiceV2[T]) ReplaceById(id primitive.ObjectID, model T...
method ReplaceByIdContext (line 176) | func (svc *ModelServiceV2[T]) ReplaceByIdContext(ctx context.Context, id...
method ReplaceOne (line 181) | func (svc *ModelServiceV2[T]) ReplaceOne(query bson.M, model T) (err err...
method ReplaceOneContext (line 186) | func (svc *ModelServiceV2[T]) ReplaceOneContext(ctx context.Context, que...
method InsertOne (line 191) | func (svc *ModelServiceV2[T]) InsertOne(model T) (id primitive.ObjectID,...
method InsertOneContext (line 203) | func (svc *ModelServiceV2[T]) InsertOneContext(ctx context.Context, mode...
method InsertMany (line 215) | func (svc *ModelServiceV2[T]) InsertMany(models []T) (ids []primitive.Ob...
method InsertManyContext (line 234) | func (svc *ModelServiceV2[T]) InsertManyContext(ctx context.Context, mod...
method Count (line 253) | func (svc *ModelServiceV2[T]) Count(query bson.M) (total int, err error) {
method GetCol (line 257) | func (svc *ModelServiceV2[T]) GetCol() (col *mongo.Col) {
function GetCollectionNameByInstance (line 261) | func GetCollectionNameByInstance(v any) string {
function getCollectionName (line 267) | func getCollectionName[T any]() string {
function NewModelServiceV2 (line 275) | func NewModelServiceV2[T any]() *ModelServiceV2[T] {
function NewModelServiceV2WithColName (line 297) | func NewModelServiceV2WithColName[T any](colName string) *ModelServiceV2...
FILE: core/models/service/base_service_v2_test.go
type TestModel (line 17) | type TestModel struct
function setupTestDB (line 23) | func setupTestDB() {
function teardownTestDB (line 27) | func teardownTestDB() {
function TestModelServiceV2_GetById (line 35) | func TestModelServiceV2_GetById(t *testing.T) {
function TestModelServiceV2_GetOne (line 51) | func TestModelServiceV2_GetOne(t *testing.T) {
function TestModelServiceV2_GetMany (line 67) | func TestModelServiceV2_GetMany(t *testing.T) {
function TestModelServiceV2_InsertOne (line 86) | func TestModelServiceV2_InsertOne(t *testing.T) {
function TestModelServiceV2_InsertMany (line 98) | func TestModelServiceV2_InsertMany(t *testing.T) {
function TestModelServiceV2_UpdateById (line 113) | func TestModelServiceV2_UpdateById(t *testing.T) {
function TestModelServiceV2_UpdateOne (line 134) | func TestModelServiceV2_UpdateOne(t *testing.T) {
function TestModelServiceV2_UpdateMany (line 155) | func TestModelServiceV2_UpdateMany(t *testing.T) {
function TestModelServiceV2_DeleteById (line 179) | func TestModelServiceV2_DeleteById(t *testing.T) {
function TestModelServiceV2_DeleteOne (line 199) | func TestModelServiceV2_DeleteOne(t *testing.T) {
function TestModelServiceV2_DeleteMany (line 219) | func TestModelServiceV2_DeleteMany(t *testing.T) {
function TestModelServiceV2_Count (line 242) | func TestModelServiceV2_Count(t *testing.T) {
FILE: core/models/service/binder_basic.go
function NewBasicBinder (line 10) | func NewBasicBinder(id interfaces.ModelId, fr *mongo.FindResult) (b inte...
type BasicBinder (line 18) | type BasicBinder struct
method Bind (line 24) | func (b *BasicBinder) Bind() (res interfaces.Model, err error) {
method Process (line 87) | func (b *BasicBinder) Process(d interfaces.Model) (res interfaces.Mode...
FILE: core/models/service/binder_list.go
function NewListBinder (line 11) | func NewListBinder(id interfaces.ModelId, fr *mongo.FindResult) (b inter...
type ListBinder (line 20) | type ListBinder struct
method Bind (line 27) | func (b *ListBinder) Bind() (l interfaces.List, err error) {
method Process (line 88) | func (b *ListBinder) Process(d interface{}) (l interfaces.List, err er...
FILE: core/models/service/data_collection_service.go
function convertTypeDataCollection (line 12) | func convertTypeDataCollection(d interface{}, err error) (res *models2.D...
method GetDataCollectionById (line 23) | func (svc *Service) GetDataCollectionById(id primitive.ObjectID) (res *m...
method GetDataCollection (line 28) | func (svc *Service) GetDataCollection(query bson.M, opts *mongo.FindOpti...
method GetDataCollectionList (line 33) | func (svc *Service) GetDataCollectionList(query bson.M, opts *mongo.Find...
method GetDataCollectionByName (line 42) | func (svc *Service) GetDataCollectionByName(name string, opts *mongo.Fin...
FILE: core/models/service/data_source_service.go
function convertTypeDataSource (line 12) | func convertTypeDataSource(d interface{}, err error) (res *models2.DataS...
method GetDataSourceById (line 23) | func (svc *Service) GetDataSourceById(id primitive.ObjectID) (res *model...
method GetDataSource (line 28) | func (svc *Service) GetDataSource(query bson.M, opts *mongo.FindOptions)...
method GetDataSourceList (line 33) | func (svc *Service) GetDataSourceList(query bson.M, opts *mongo.FindOpti...
FILE: core/models/service/dependency_setting_service.go
function convertTypeDependencySetting (line 12) | func convertTypeDependencySetting(d interface{}, err error) (res *models...
method GetDependencySettingById (line 23) | func (svc *Service) GetDependencySettingById(id primitive.ObjectID) (res...
method GetDependencySetting (line 28) | func (svc *Service) GetDependencySetting(query bson.M, opts *mongo.FindO...
method GetDependencySettingList (line 33) | func (svc *Service) GetDependencySettingList(query bson.M, opts *mongo.F...
FILE: core/models/service/environment_service.go
function convertTypeEnvironment (line 12) | func convertTypeEnvironment(d interface{}, err error) (res *models2.Envi...
method GetEnvironmentById (line 23) | func (svc *Service) GetEnvironmentById(id primitive.ObjectID) (res *mode...
method GetEnvironment (line 28) | func (svc *Service) GetEnvironment(query bson.M, opts *mongo.FindOptions...
method GetEnvironmentList (line 33) | func (svc *Service) GetEnvironmentList(query bson.M, opts *mongo.FindOpt...
FILE: core/models/service/extra_value_service.go
function convertTypeExtraValue (line 12) | func convertTypeExtraValue(d interface{}, err error) (res *models.ExtraV...
method GetExtraValueById (line 23) | func (svc *Service) GetExtraValueById(id primitive.ObjectID) (res *model...
method GetExtraValue (line 28) | func (svc *Service) GetExtraValue(query bson.M, opts *mongo.FindOptions)...
method GetExtraValueList (line 33) | func (svc *Service) GetExtraValueList(query bson.M, opts *mongo.FindOpti...
method GetExtraValueByObjectIdModel (line 42) | func (svc *Service) GetExtraValueByObjectIdModel(oid primitive.ObjectID,...
FILE: core/models/service/git_service.go
function convertTypeGit (line 12) | func convertTypeGit(d interface{}, err error) (res *models2.Git, err2 er...
method GetGitById (line 23) | func (svc *Service) GetGitById(id primitive.ObjectID) (res *models2.Git,...
method GetGit (line 28) | func (svc *Service) GetGit(query bson.M, opts *mongo.FindOptions) (res *...
method GetGitList (line 33) | func (svc *Service) GetGitList(query bson.M, opts *mongo.FindOptions) (r...
FILE: core/models/service/interface.go
type ModelService (line 11) | type ModelService interface
FILE: core/models/service/job_service.go
function convertTypeJob (line 12) | func convertTypeJob(d interface{}, err error) (res *models2.Job, err2 er...
method GetJobById (line 23) | func (svc *Service) GetJobById(id primitive.ObjectID) (res *models2.Job,...
method GetJob (line 28) | func (svc *Service) GetJob(query bson.M, opts *mongo.FindOptions) (res *...
method GetJobList (line 33) | func (svc *Service) GetJobList(query bson.M, opts *mongo.FindOptions) (r...
FILE: core/models/service/node_service.go
function convertTypeNode (line 12) | func convertTypeNode(d interface{}, err error) (res *models2.Node, err2 ...
method GetNodeById (line 23) | func (svc *Service) GetNodeById(id primitive.ObjectID) (res *models2.Nod...
method GetNode (line 28) | func (svc *Service) GetNode(query bson.M, opts *mongo.FindOptions) (res ...
method GetNodeList (line 33) | func (svc *Service) GetNodeList(query bson.M, opts *mongo.FindOptions) (...
method GetNodeByKey (line 42) | func (svc *Service) GetNodeByKey(key string, opts *mongo.FindOptions) (r...
FILE: core/models/service/options.go
type Option (line 8) | type Option
type BaseServiceOption (line 10) | type BaseServiceOption
function WithBaseServiceModelId (line 12) | func WithBaseServiceModelId(id interfaces.ModelId) BaseServiceOption {
function WithBaseServiceCol (line 18) | func WithBaseServiceCol(col *mongo.Col) BaseServiceOption {
FILE: core/models/service/password_service.go
function convertTypePassword (line 12) | func convertTypePassword(d interface{}, err error) (res *models2.Passwor...
method GetPasswordById (line 23) | func (svc *Service) GetPasswordById(id primitive.ObjectID) (res *models2...
method GetPassword (line 28) | func (svc *Service) GetPassword(query bson.M, opts *mongo.FindOptions) (...
method GetPasswordList (line 33) | func (svc *Service) GetPasswordList(query bson.M, opts *mongo.FindOption...
FILE: core/models/service/permission_service.go
function convertTypePermission (line 12) | func convertTypePermission(d interface{}, err error) (res *models2.Permi...
method GetPermissionById (line 23) | func (svc *Service) GetPermissionById(id primitive.ObjectID) (res *model...
method GetPermission (line 28) | func (svc *Service) GetPermission(query bson.M, opts *mongo.FindOptions)...
method GetPermissionList (line 33) | func (svc *Service) GetPermissionList(query bson.M, opts *mongo.FindOpti...
method GetPermissionByKey (line 45) | func (svc *Service) GetPermissionByKey(key string, opts *mongo.FindOptio...
FILE: core/models/service/project_service.go
function convertTypeProject (line 12) | func convertTypeProject(d interface{}, err error) (res *models2.Project,...
method GetProjectById (line 23) | func (svc *Service) GetProjectById(id primitive.ObjectID) (res *models2....
method GetProject (line 28) | func (svc *Service) GetProject(query bson.M, opts *mongo.FindOptions) (r...
method GetProjectList (line 33) | func (svc *Service) GetProjectList(query bson.M, opts *mongo.FindOptions...
FILE: core/models/service/role_permission_service.go
function convertTypeRolePermission (line 12) | func convertTypeRolePermission(d interface{}, err error) (res *models2.R...
method GetRolePermissionById (line 23) | func (svc *Service) GetRolePermissionById(id primitive.ObjectID) (res *m...
method GetRolePermission (line 28) | func (svc *Service) GetRolePermission(query bson.M, opts *mongo.FindOpti...
method GetRolePermissionList (line 33) | func (svc *Service) GetRolePermissionList(query bson.M, opts *mongo.Find...
method GetRolePermissionListByRoleId (line 45) | func (svc *Service) GetRolePermissionListByRoleId(id primitive.ObjectID,...
method GetRolePermissionListByPermissionId (line 49) | func (svc *Service) GetRolePermissionListByPermissionId(id primitive.Obj...
FILE: core/models/service/role_service.go
function convertTypeRole (line 12) | func convertTypeRole(d interface{}, err error) (res *models2.Role, err2 ...
method GetRoleById (line 23) | func (svc *Service) GetRoleById(id primitive.ObjectID) (res *models2.Rol...
method GetRole (line 28) | func (svc *Service) GetRole(query bson.M, opts *mongo.FindOptions) (res ...
method GetRoleList (line 33) | func (svc *Service) GetRoleList(query bson.M, opts *mongo.FindOptions) (...
method GetRoleByName (line 45) | func (svc *Service) GetRoleByName(name string, opts *mongo.FindOptions) ...
method GetRoleByKey (line 50) | func (svc *Service) GetRoleByKey(key string, opts *mongo.FindOptions) (r...
FILE: core/models/service/schedule_service.go
function convertTypeSchedule (line 12) | func convertTypeSchedule(d interface{}, err error) (res *models2.Schedul...
method GetScheduleById (line 23) | func (svc *Service) GetScheduleById(id primitive.ObjectID) (res *models2...
method GetSchedule (line 28) | func (svc *Service) GetSchedule(query bson.M, opts *mongo.FindOptions) (...
method GetScheduleList (line 33) | func (svc *Service) GetScheduleList(query bson.M, opts *mongo.FindOption...
FILE: core/models/service/service.go
type Service (line 12) | type Service struct
method DropAll (line 17) | func (svc *Service) DropAll() (err error) {
method GetBaseService (line 35) | func (svc *Service) GetBaseService(id interfaces.ModelId) (svc2 interf...
function NewService (line 39) | func NewService() (svc2 ModelService, err error) {
function GetService (line 53) | func GetService() (svc ModelService, err error) {
FILE: core/models/service/setting_service.go
function convertTypeSetting (line 12) | func convertTypeSetting(d interface{}, err error) (res *models2.Setting,...
method GetSettingById (line 23) | func (svc *Service) GetSettingById(id primitive.ObjectID) (res *models2....
method GetSetting (line 28) | func (svc *Service) GetSetting(query bson.M, opts *mongo.FindOptions) (r...
method GetSettingList (line 33) | func (svc *Service) GetSettingList(query bson.M, opts *mongo.FindOptions...
method GetSettingByKey (line 42) | func (svc *Service) GetSettingByKey(key string, opts *mongo.FindOptions)...
FILE: core/models/service/spider_service.go
function convertTypeSpider (line 12) | func convertTypeSpider(d interface{}, err error) (res *models2.Spider, e...
method GetSpiderById (line 23) | func (svc *Service) GetSpiderById(id primitive.ObjectID) (res *models2.S...
method GetSpider (line 28) | func (svc *Service) GetSpider(query bson.M, opts *mongo.FindOptions) (re...
method GetSpiderList (line 33) | func (svc *Service) GetSpiderList(query bson.M, opts *mongo.FindOptions)...
FILE: core/models/service/spider_stat_service.go
function convertTypeSpiderStat (line 12) | func convertTypeSpiderStat(d interface{}, err error) (res *models2.Spide...
method GetSpiderStatById (line 23) | func (svc *Service) GetSpiderStatById(id primitive.ObjectID) (res *model...
method GetSpiderStat (line 28) | func (svc *Service) GetSpiderStat(query bson.M, opts *mongo.FindOptions)...
method GetSpiderStatList (line 33) | func (svc *Service) GetSpiderStatList(query bson.M, opts *mongo.FindOpti...
FILE: core/models/service/tag_service.go
function convertTypeTag (line 15) | func convertTypeTag(d interface{}, err error) (res *models2.Tag, err2 er...
method GetTagById (line 26) | func (svc *Service) GetTagById(id primitive.ObjectID) (res *models2.Tag,...
method GetTag (line 31) | func (svc *Service) GetTag(query bson.M, opts *mongo.FindOptions) (res *...
method GetTagList (line 36) | func (svc *Service) GetTagList(query bson.M, opts *mongo.FindOptions) (r...
method GetTagIds (line 45) | func (svc *Service) GetTagIds(colName string, tags []interfaces.Tag) (ta...
method UpdateTagsById (line 78) | func (svc *Service) UpdateTagsById(colName string, id primitive.ObjectID...
method UpdateTags (line 97) | func (svc *Service) UpdateTags(colName string, query bson.M, tags []inte...
FILE: core/models/service/task_queue_service.go
function convertTypeTaskQueueItem (line 12) | func convertTypeTaskQueueItem(d interface{}, err error) (res *models2.Ta...
method GetTaskQueueItemById (line 23) | func (svc *Service) GetTaskQueueItemById(id primitive.ObjectID) (res *mo...
method GetTaskQueueItem (line 28) | func (svc *Service) GetTaskQueueItem(query bson.M, opts *mongo.FindOptio...
method GetTaskQueueItemList (line 33) | func (svc *Service) GetTaskQueueItemList(query bson.M, opts *mongo.FindO...
FILE: core/models/service/task_service.go
function convertTypeTask (line 12) | func convertTypeTask(d interface{}, err error) (res *models2.Task, err2 ...
method GetTaskById (line 23) | func (svc *Service) GetTaskById(id primitive.ObjectID) (res *models2.Tas...
method GetTask (line 28) | func (svc *Service) GetTask(query bson.M, opts *mongo.FindOptions) (res ...
method GetTaskList (line 33) | func (svc *Service) GetTaskList(query bson.M, opts *mongo.FindOptions) (...
FILE: core/models/service/task_stat_service.go
function convertTypeTaskStat (line 12) | func convertTypeTaskStat(d interface{}, err error) (res *models2.TaskSta...
method GetTaskStatById (line 23) | func (svc *Service) GetTaskStatById(id primitive.ObjectID) (res *models2...
method GetTaskStat (line 28) | func (svc *Service) GetTaskStat(query bson.M, opts *mongo.FindOptions) (...
method GetTaskStatList (line 33) | func (svc *Service) GetTaskStatList(query bson.M, opts *mongo.FindOption...
FILE: core/models/service/token_service.go
function convertTypeToken (line 12) | func convertTypeToken(d interface{}, err error) (res *models2.Token, err...
method GetTokenById (line 23) | func (svc *Service) GetTokenById(id primitive.ObjectID) (res *models2.To...
method GetToken (line 28) | func (svc *Service) GetToken(query bson.M, opts *mongo.FindOptions) (res...
method GetTokenList (line 33) | func (svc *Service) GetTokenList(query bson.M, opts *mongo.FindOptions) ...
FILE: core/models/service/user_role_service.go
function convertTypeUserRole (line 12) | func convertTypeUserRole(d interface{}, err error) (res *models2.UserRol...
method GetUserRoleById (line 23) | func (svc *Service) GetUserRoleById(id primitive.ObjectID) (res *models2...
method GetUserRole (line 28) | func (svc *Service) GetUserRole(query bson.M, opts *mongo.FindOptions) (...
method GetUserRoleList (line 33) | func (svc *Service) GetUserRoleList(query bson.M, opts *mongo.FindOption...
method GetUserRoleListByUserId (line 45) | func (svc *Service) GetUserRoleListByUserId(id primitive.ObjectID, opts ...
method GetUserRoleListByRoleId (line 49) | func (svc *Service) GetUserRoleListByRoleId(id primitive.ObjectID, opts ...
FILE: core/models/service/user_service.go
function convertTypeUser (line 12) | func convertTypeUser(d interface{}, err error) (res *models2.User, err2 ...
method GetUserById (line 23) | func (svc *Service) GetUserById(id primitive.ObjectID) (res *models2.Use...
method GetUser (line 28) | func (svc *Service) GetUser(query bson.M, opts *mongo.FindOptions) (res ...
method GetUserList (line 33) | func (svc *Service) GetUserList(query bson.M, opts *mongo.FindOptions) (...
method GetUserByUsername (line 42) | func (svc *Service) GetUserByUsername(username string, opts *mongo.FindO...
method GetUserByUsernameWithPassword (line 47) | func (svc *Service) GetUserByUsernameWithPassword(username string, opts ...
FILE: core/models/service/variable_service.go
function convertTypeVariable (line 12) | func convertTypeVariable(d interface{}, err error) (res *models2.Variabl...
method GetVariableById (line 23) | func (svc *Service) GetVariableById(id primitive.ObjectID) (res *models2...
method GetVariable (line 28) | func (svc *Service) GetVariable(query bson.M, opts *mongo.FindOptions) (...
method GetVariableList (line 33) | func (svc *Service) GetVariableList(query bson.M, opts *mongo.FindOption...
method GetVariableByKey (line 42) | func (svc *Service) GetVariableByKey(key string, opts *mongo.FindOptions...
FILE: core/node/config/config.go
type Config (line 10) | type Config
type Options (line 12) | type Options struct
function NewConfig (line 29) | func NewConfig(opts *Options) (cfg *Config) {
FILE: core/node/config/config_service.go
type Service (line 15) | type Service struct
method Init (line 20) | func (svc *Service) Init() (err error) {
method Reload (line 54) | func (svc *Service) Reload() (err error) {
method GetBasicNodeInfo (line 58) | func (svc *Service) GetBasicNodeInfo() (res interfaces.Entity) {
method GetNodeKey (line 69) | func (svc *Service) GetNodeKey() (res string) {
method GetNodeName (line 73) | func (svc *Service) GetNodeName() (res string) {
method IsMaster (line 77) | func (svc *Service) IsMaster() (res bool) {
method GetAuthKey (line 81) | func (svc *Service) GetAuthKey() (res string) {
method GetMaxRunners (line 85) | func (svc *Service) GetMaxRunners() (res int) {
method GetConfigPath (line 89) | func (svc *Service) GetConfigPath() (path string) {
method SetConfigPath (line 93) | func (svc *Service) SetConfigPath(path string) {
function newNodeConfigService (line 97) | func newNodeConfigService() (svc2 interfaces.NodeConfigService, err erro...
function GetNodeConfigService (line 121) | func GetNodeConfigService() interfaces.NodeConfigService {
FILE: core/node/config/options.go
type Option (line 7) | type Option
function WithConfigPath (line 9) | func WithConfigPath(path string) Option {
FILE: core/node/service/master_service_v2.go
type MasterServiceV2 (line 30) | type MasterServiceV2 struct
method Init (line 46) | func (svc *MasterServiceV2) Init() (err error) {
method Start (line 51) | func (svc *MasterServiceV2) Start() {
method Wait (line 84) | func (svc *MasterServiceV2) Wait() {
method Stop (line 88) | func (svc *MasterServiceV2) Stop() {
method Monitor (line 93) | func (svc *MasterServiceV2) Monitor() {
method GetConfigService (line 116) | func (svc *MasterServiceV2) GetConfigService() (cfgSvc interfaces.Node...
method GetConfigPath (line 120) | func (svc *MasterServiceV2) GetConfigPath() (path string) {
method SetConfigPath (line 124) | func (svc *MasterServiceV2) SetConfigPath(path string) {
method GetAddress (line 128) | func (svc *MasterServiceV2) GetAddress() (address interfaces.Address) {
method SetAddress (line 132) | func (svc *MasterServiceV2) SetAddress(address interfaces.Address) {
method SetMonitorInterval (line 136) | func (svc *MasterServiceV2) SetMonitorInterval(duration time.Duration) {
method Register (line 140) | func (svc *MasterServiceV2) Register() (err error) {
method StopOnError (line 183) | func (svc *MasterServiceV2) StopOnError() {
method GetServer (line 187) | func (svc *MasterServiceV2) GetServer() (svr interfaces.GrpcServer) {
method monitor (line 191) | func (svc *MasterServiceV2) monitor() (err error) {
method getAllWorkerNodes (line 240) | func (svc *MasterServiceV2) getAllWorkerNodes() (nodes []models2.NodeV...
method updateMasterNodeStatus (line 255) | func (svc *MasterServiceV2) updateMasterNodeStatus() (err error) {
method setWorkerNodeOffline (line 282) | func (svc *MasterServiceV2) setWorkerNodeOffline(node *models2.NodeV2) {
method subscribeNode (line 294) | func (svc *MasterServiceV2) subscribeNode(n *models2.NodeV2) (ok bool) {
method pingNodeClient (line 303) | func (svc *MasterServiceV2) pingNodeClient(n *models2.NodeV2) (ok bool) {
method updateNodeAvailableRunners (line 311) | func (svc *MasterServiceV2) updateNodeAvailableRunners(node *models2.N...
method sendNotification (line 328) | func (svc *MasterServiceV2) sendNotification(node *models2.NodeV2) {
function newMasterServiceV2 (line 335) | func newMasterServiceV2() (res *MasterServiceV2, err error) {
function GetMasterServiceV2 (line 384) | func GetMasterServiceV2() (res *MasterServiceV2, err error) {
FILE: core/node/service/options.go
type Option (line 8) | type Option
function WithConfigPath (line 10) | func WithConfigPath(path string) Option {
function WithAddress (line 16) | func WithAddress(address interfaces.Address) Option {
function WithMonitorInterval (line 22) | func WithMonitorInterval(duration time.Duration) Option {
function WithStopOnError (line 31) | func WithStopOnError() Option {
function WithHeartbeatInterval (line 40) | func WithHeartbeatInterval(duration time.Duration) Option {
FILE: core/node/service/worker_service_v2.go
type WorkerServiceV2 (line 23) | type WorkerServiceV2 struct
method Init (line 39) | func (svc *WorkerServiceV2) Init() (err error) {
method Start (line 44) | func (svc *WorkerServiceV2) Start() {
method Wait (line 69) | func (svc *WorkerServiceV2) Wait() {
method Stop (line 73) | func (svc *WorkerServiceV2) Stop() {
method Register (line 78) | func (svc *WorkerServiceV2) Register() {
method Recv (line 99) | func (svc *WorkerServiceV2) Recv() {
method handleStreamMessage (line 117) | func (svc *WorkerServiceV2) handleStreamMessage(msg *grpc.StreamMessag...
method ReportStatus (line 148) | func (svc *WorkerServiceV2) ReportStatus() {
method GetConfigService (line 165) | func (svc *WorkerServiceV2) GetConfigService() (cfgSvc interfaces.Node...
method GetConfigPath (line 169) | func (svc *WorkerServiceV2) GetConfigPath() (path string) {
method SetConfigPath (line 173) | func (svc *WorkerServiceV2) SetConfigPath(path string) {
method GetAddress (line 177) | func (svc *WorkerServiceV2) GetAddress() (address interfaces.Address) {
method SetAddress (line 181) | func (svc *WorkerServiceV2) SetAddress(address interfaces.Address) {
method SetHeartbeatInterval (line 185) | func (svc *WorkerServiceV2) SetHeartbeatInterval(duration time.Duratio...
method reportStatus (line 189) | func (svc *WorkerServiceV2) reportStatus() {
function newWorkerServiceV2 (line 203) | func newWorkerServiceV2() (res *WorkerServiceV2, err error) {
function GetWorkerServiceV2 (line 236) | func GetWorkerServiceV2() (res *WorkerServiceV2, err error) {
FILE: core/notification/constants.go
constant TypeMail (line 4) | TypeMail = "mail"
constant TypeIM (line 5) | TypeIM = "im"
constant ChannelMailProviderGmail (line 9) | ChannelMailProviderGmail = "gmail"
constant ChannelMailProviderOutlook (line 10) | ChannelMailProviderOutlook = "outlook"
constant ChannelMailProviderYahoo (line 11) | ChannelMailProviderYahoo = "yahoo"
constant ChannelMailProviderICloud (line 12) | ChannelMailProviderICloud = "icloud"
constant ChannelMailProviderAol (line 13) | ChannelMailProviderAol = "aol"
constant ChannelMailProviderZoho (line 14) | ChannelMailProviderZoho = "zoho"
constant ChannelMailProviderQQ (line 15) | ChannelMailProviderQQ = "qq"
constant ChannelMailProvider163 (line 16) | ChannelMailProvider163 = "163"
constant ChannelMailProviderExmail (line 17) | ChannelMailProviderExmail = "exmail"
constant ChannelIMProviderSlack (line 19) | ChannelIMProviderSlack = "slack"
constant ChannelIMProviderTelegram (line 20) | ChannelIMProviderTelegram = "telegram"
constant ChannelIMProviderDiscord (line 21) | ChannelIMProviderDiscord = "discord"
constant ChannelIMProviderMSTeams (line 22) | ChannelIMProviderMSTeams = "ms_teams"
constant ChannelIMProviderWechatWork (line 23) | ChannelIMProviderWechatWork = "wechat_work"
constant ChannelIMProviderDingtalk (line 24) | ChannelIMProviderDingtalk = "dingtalk"
constant ChannelIMProviderLark (line 25) | ChannelIMProviderLark = "lark"
constant StatusSending (line 29) | StatusSending = "sending"
constant StatusSuccess (line 30) | StatusSuccess = "success"
constant StatusError (line 31) | StatusError = "error"
FILE: core/notification/entity.go
type VariableData (line 5) | type VariableData struct
FILE: core/notification/im.go
type ResBody (line 14) | type ResBody struct
function SendIMNotification (line 19) | func SendIMNotification(ch *models.NotificationChannelV2, title, content...
function getIMRequestHeader (line 85) | func getIMRequestHeader() req.Header {
function performIMRequest (line 91) | func performIMRequest(webhookUrl string, data req.Param) (res *req.Resp,...
function performIMRequestWithJson (line 111) | func performIMRequestWithJson[T any](webhookUrl string, data req.Param) ...
function convertMarkdownToSlack (line 132) | func convertMarkdownToSlack(markdown string) string {
function convertMarkdownToTelegram (line 165) | func convertMarkdownToTelegram(markdownText string) string {
function sendIMLark (line 195) | func sendIMLark(ch *models.NotificationChannelV2, title, content string)...
function sendIMDingTalk (line 223) | func sendIMDingTalk(ch *models.NotificationChannelV2, title string, cont...
function sendIMWechatWork (line 241) | func sendIMWechatWork(ch *models.NotificationChannelV2, title string, co...
function sendIMSlack (line 258) | func sendIMSlack(ch *models.NotificationChannelV2, title, content string...
function sendIMTelegram (line 272) | func sendIMTelegram(ch *models.NotificationChannelV2, title string, cont...
function sendIMDiscord (line 308) | func sendIMDiscord(ch *models.NotificationChannelV2, title string, conte...
function sendIMMSTeams (line 324) | func sendIMMSTeams(ch *models.NotificationChannelV2, title string, conte...
FILE: core/notification/mail.go
function SendMail (line 15) | func SendMail(s *models.NotificationSettingV2, ch *models.NotificationCh...
function isHtml (line 58) | func isHtml(content string) bool {
function convertHtmlToText (line 63) | func convertHtmlToText(content string) string {
type smtpAuthentication (line 73) | type smtpAuthentication struct
type sendOptions (line 83) | type sendOptions struct
function getMailMessage (line 90) | func getMailMessage(smtpConfig smtpAuthentication, options sendOptions, ...
function sendMail (line 119) | func sendMail(smtpConfig smtpAuthentication, options sendOptions, htmlBo...
FILE: core/notification/mail_gmail.go
function sendMailGmail (line 14) | func sendMailGmail(ch *models.NotificationChannelV2, smtpConfig smtpAuth...
FILE: core/notification/oauth2_gmail.go
function getGmailOAuth2Token (line 13) | func getGmailOAuth2Token(oauth2Json string) (token *oauth2.Token, err er...
type GmailOAuth2Auth (line 37) | type GmailOAuth2Auth struct
method Start (line 41) | func (a *GmailOAuth2Auth) Start(_ *smtp.ServerInfo) (string, []byte, e...
method Next (line 45) | func (a *GmailOAuth2Auth) Next(_ []byte, _ bool) ([]byte, error) {
FILE: core/notification/service_v2.go
type ServiceV2 (line 20) | type ServiceV2 struct
method Send (line 23) | func (svc *ServiceV2) Send(s *models.NotificationSettingV2, args ...an...
method SendMail (line 48) | func (svc *ServiceV2) SendMail(s *models.NotificationSettingV2, ch *mo...
method SendIM (line 66) | func (svc *ServiceV2) SendIM(s *models.NotificationSettingV2, ch *mode...
method getContent (line 80) | func (svc *ServiceV2) getContent(s *models.NotificationSettingV2, ch *...
method geContentWithVariables (line 102) | func (svc *ServiceV2) geContentWithVariables(template string, variable...
method getVariableData (line 309) | func (svc *ServiceV2) getVariableData(args ...any) (vd VariableData) {
method parseTemplateVariables (line 331) | func (svc *ServiceV2) parseTemplateVariables(template string) (variabl...
method getUsernameById (line 361) | func (svc *ServiceV2) getUsernameById(id primitive.ObjectID) (username...
method getFormattedTime (line 373) | func (svc *ServiceV2) getFormattedTime(t time.Time) (res string) {
method getFormattedTargetValue (line 380) | func (svc *ServiceV2) getFormattedTargetValue(a *models.NotificationAl...
method getFormattedMetricValue (line 394) | func (svc *ServiceV2) getFormattedMetricValue(metricName string, m *mo...
method convertMarkdownToHtml (line 427) | func (svc *ServiceV2) convertMarkdownToHtml(content string) (html stri...
method SendNodeNotification (line 431) | func (svc *ServiceV2) SendNodeNotification(node *models.NodeV2) {
method createRequest (line 466) | func (svc *ServiceV2) createRequest(s *models.NotificationSettingV2, c...
method saveRequest (line 493) | func (svc *ServiceV2) saveRequest(r *models.NotificationRequestV2, err...
function newNotificationServiceV2 (line 511) | func newNotificationServiceV2() *ServiceV2 {
function GetNotificationServiceV2 (line 518) | func GetNotificationServiceV2() *ServiceV2 {
FILE: core/notification/service_v2_test.go
function TestParseTemplateVariables_WithValidTemplate_ReturnsVariables (line 10) | func TestParseTemplateVariables_WithValidTemplate_ReturnsVariables(t *te...
function TestParseTemplateVariables_WithRepeatedVariables_ReturnsUniqueVariables (line 25) | func TestParseTemplateVariables_WithRepeatedVariables_ReturnsUniqueVaria...
FILE: core/notification/theme.go
constant defaultTheme (line 3) | defaultTheme = `<style>
function GetTheme (line 263) | func GetTheme() string {
FILE: core/process/daemon.go
constant SignalCreate (line 15) | SignalCreate = iota
constant SignalStart (line 16) | SignalStart
constant SignalStopped (line 17) | SignalStopped
constant SignalError (line 18) | SignalError
constant SignalExited (line 19) | SignalExited
constant SignalReachedMaxErrors (line 20) | SignalReachedMaxErrors
type Daemon (line 23) | type Daemon struct
method Start (line 38) | func (d *Daemon) Start() (err error) {
method Stop (line 96) | func (d *Daemon) Stop() {
method GetMaxErrors (line 105) | func (d *Daemon) GetMaxErrors() (maxErrors int) {
method SetMaxErrors (line 109) | func (d *Daemon) SetMaxErrors(maxErrors int) {
method GetExitTimeout (line 113) | func (d *Daemon) GetExitTimeout() (timeout time.Duration) {
method SetExitTimeout (line 117) | func (d *Daemon) SetExitTimeout(timeout time.Duration) {
method GetCmd (line 121) | func (d *Daemon) GetCmd() (cmd *exec.Cmd) {
method GetCh (line 125) | func (d *Daemon) GetCh() (ch chan int) {
method handleSignal (line 129) | func (d *Daemon) handleSignal() {
function NewProcessDaemon (line 152) | func NewProcessDaemon(newCmdFn func() *exec.Cmd, opts ...DaemonOption) (...
FILE: core/process/daemon_test.go
function TestDaemon (line 9) | func TestDaemon(t *testing.T) {
FILE: core/process/manage.go
function ProcessIdExists (line 13) | func ProcessIdExists(id int) (ok bool) {
function ListProcess (line 27) | func ListProcess(text string) (lines []string, err error) {
function listProcessWindow (line 35) | func listProcessWindow(text string) (lines []string, err error) {
function listProcessLinuxMac (line 46) | func listProcessLinuxMac(text string) (lines []string, err error) {
FILE: core/process/options.go
type DaemonOption (line 8) | type DaemonOption
function WithDaemonMaxErrors (line 10) | func WithDaemonMaxErrors(maxErrors int) DaemonOption {
function WithExitTimeout (line 16) | func WithExitTimeout(timeout time.Duration) DaemonOption {
FILE: core/result/options.go
type Option (line 5) | type Option
type Options (line 7) | type Options struct
function WithRegistryKey (line 12) | func WithRegistryKey(key string) Option {
FILE: core/result/service.go
function NewResultService (line 14) | func NewResultService(registryKey string, s *models.Spider) (svc2 interf...
function GetResultService (line 41) | func GetResultService(spiderId primitive.ObjectID) (svc2 interfaces.Resu...
FILE: core/result/service_mongo.go
type ServiceMongo (line 20) | type ServiceMongo struct
method List (line 31) | func (svc *ServiceMongo) List(query generic.ListQuery, opts *generic.L...
method Count (line 37) | func (svc *ServiceMongo) Count(query generic.ListQuery) (n int, err er...
method Insert (line 42) | func (svc *ServiceMongo) Insert(docs ...interface{}) (err error) {
method Index (line 84) | func (svc *ServiceMongo) Index(fields []string) {
method SetTime (line 90) | func (svc *ServiceMongo) SetTime(t time.Time) {
method GetTime (line 94) | func (svc *ServiceMongo) GetTime() (t time.Time) {
method getList (line 98) | func (svc *ServiceMongo) getList(query bson.M, opts *mongo.FindOptions...
method getQuery (line 112) | func (svc *ServiceMongo) getQuery(query generic.ListQuery) (res bson.M) {
method getOpts (line 116) | func (svc *ServiceMongo) getOpts(opts *generic.ListOptions) (res *mong...
function NewResultServiceMongo (line 120) | func NewResultServiceMongo(colId primitive.ObjectID, _ primitive.ObjectI...
FILE: core/result/service_registry.go
type ServiceRegistry (line 8) | type ServiceRegistry struct
method Register (line 13) | func (r *ServiceRegistry) Register(key string, fn interfaces.ResultSer...
method Unregister (line 17) | func (r *ServiceRegistry) Unregister(key string) {
method Get (line 21) | func (r *ServiceRegistry) Get(key string) (fn interfaces.ResultService...
function NewResultServiceRegistry (line 33) | func NewResultServiceRegistry() (r interfaces.ResultServiceRegistry) {
function GetResultServiceRegistry (line 42) | func GetResultServiceRegistry() (r interfaces.ResultServiceRegistry) {
FILE: core/schedule/logger.go
type Logger (line 11) | type Logger struct
method Info (line 14) | func (l *Logger) Info(msg string, keysAndValues ...interface{}) {
method Error (line 19) | func (l *Logger) Error(err error, msg string, keysAndValues ...interfa...
method getPlaceholder (line 25) | func (l *Logger) getPlaceholder(n int) (s string) {
function NewLogger (line 33) | func NewLogger() cron.Logger {
FILE: core/schedule/options.go
type Option (line 8) | type Option
function WithConfigPath (line 10) | func WithConfigPath(path string) Option {
function WithLocation (line 16) | func WithLocation(loc *time.Location) Option {
function WithDelayIfStillRunning (line 22) | func WithDelayIfStillRunning() Option {
function WithSkipIfStillRunning (line 28) | func WithSkipIfStillRunning() Option {
function WithUpdateInterval (line 34) | func WithUpdateInterval(interval time.Duration) Option {
FILE: core/schedule/service.go
type Service (line 19) | type Service struct
method GetLocation (line 39) | func (svc *Service) GetLocation() (loc *time.Location) {
method SetLocation (line 43) | func (svc *Service) SetLocation(loc *time.Location) {
method GetDelay (line 47) | func (svc *Service) GetDelay() (delay bool) {
method SetDelay (line 51) | func (svc *Service) SetDelay(delay bool) {
method GetSkip (line 55) | func (svc *Service) GetSkip() (skip bool) {
method SetSkip (line 59) | func (svc *Service) SetSkip(skip bool) {
method GetUpdateInterval (line 63) | func (svc *Service) GetUpdateInterval() (interval time.Duration) {
method SetUpdateInterval (line 67) | func (svc *Service) SetUpdateInterval(interval time.Duration) {
method Init (line 71) | func (svc *Service) Init() (err error) {
method Start (line 75) | func (svc *Service) Start() {
method Wait (line 80) | func (svc *Service) Wait() {
method Stop (line 85) | func (svc *Service) Stop() {
method Enable (line 90) | func (svc *Service) Enable(s interfaces.Schedule, args ...interface{})...
method Disable (line 104) | func (svc *Service) Disable(s interfaces.Schedule, args ...interface{}...
method Update (line 115) | func (svc *Service) Update() {
method GetCron (line 127) | func (svc *Service) GetCron() (c *cron.Cron) {
method update (line 131) | func (svc *Service) update() {
method getEntryIdsMap (line 162) | func (svc *Service) getEntryIdsMap() (res map[cron.EntryID]bool) {
method fetch (line 170) | func (svc *Service) fetch() (err error) {
method schedule (line 181) | func (svc *Service) schedule(id primitive.ObjectID) (fn func()) {
function NewScheduleService (line 236) | func NewScheduleService() (svc2 interfaces.ScheduleService, err error) {
function GetScheduleService (line 278) | func GetScheduleService() (res interfaces.ScheduleService, err error) {
FILE: core/schedule/service_v2.go
type ServiceV2 (line 19) | type ServiceV2 struct
method GetLocation (line 39) | func (svc *ServiceV2) GetLocation() (loc *time.Location) {
method SetLocation (line 43) | func (svc *ServiceV2) SetLocation(loc *time.Location) {
method GetDelay (line 47) | func (svc *ServiceV2) GetDelay() (delay bool) {
method SetDelay (line 51) | func (svc *ServiceV2) SetDelay(delay bool) {
method GetSkip (line 55) | func (svc *ServiceV2) GetSkip() (skip bool) {
method SetSkip (line 59) | func (svc *ServiceV2) SetSkip(skip bool) {
method GetUpdateInterval (line 63) | func (svc *ServiceV2) GetUpdateInterval() (interval time.Duration) {
method SetUpdateInterval (line 67) | func (svc *ServiceV2) SetUpdateInterval(interval time.Duration) {
method Init (line 71) | func (svc *ServiceV2) Init() (err error) {
method Start (line 75) | func (svc *ServiceV2) Start() {
method Wait (line 80) | func (svc *ServiceV2) Wait() {
method Stop (line 85) | func (svc *ServiceV2) Stop() {
method Enable (line 90) | func (svc *ServiceV2) Enable(s models2.ScheduleV2, by primitive.Object...
method Disable (line 104) | func (svc *ServiceV2) Disable(s models2.ScheduleV2, by primitive.Objec...
method Update (line 115) | func (svc *ServiceV2) Update() {
method GetCron (line 127) | func (svc *ServiceV2) GetCron() (c *cron.Cron) {
method update (line 131) | func (svc *ServiceV2) update() {
method getEntryIdsMap (line 165) | func (svc *ServiceV2) getEntryIdsMap() (res map[cron.EntryID]bool) {
method fetch (line 173) | func (svc *ServiceV2) fetch() (err error) {
method schedule (line 184) | func (svc *ServiceV2) schedule(id primitive.ObjectID) (fn func()) {
function NewScheduleServiceV2 (line 239) | func NewScheduleServiceV2() (svc2 *ServiceV2, err error) {
function GetScheduleServiceV2 (line 276) | func GetScheduleServiceV2() (res *ServiceV2, err error) {
FILE: core/schedule/test/base.go
function init (line 13) | func init() {
type Test (line 23) | type Test struct
method Setup (line 35) | func (t *Test) Setup(t2 *testing.T) {
method Cleanup (line 40) | func (t *Test) Cleanup() {
function NewTest (line 45) | func NewTest() (t *Test, err error) {
FILE: core/schedule/test/schedule_service_test.go
function TestScheduleService_Enable_Disable (line 9) | func TestScheduleService_Enable_Disable(t *testing.T) {
function TestScheduleService_Run (line 29) | func TestScheduleService_Run(t *testing.T) {
FILE: core/spider/admin/options.go
type Option (line 5) | type Option
function WithConfigPath (line 7) | func WithConfigPath(path string) Option {
FILE: core/spider/admin/service.go
type Service (line 28) | type Service struct
method GetConfigPath (line 40) | func (svc *Service) GetConfigPath() (path string) {
method SetConfigPath (line 44) | func (svc *Service) SetConfigPath(path string) {
method Start (line 48) | func (svc *Service) Start() (err error) {
method Schedule (line 52) | func (svc *Service) Schedule(id primitive.ObjectID, opts *interfaces.S...
method Clone (line 63) | func (svc *Service) Clone(id primitive.ObjectID, opts *interfaces.Spid...
method Delete (line 68) | func (svc *Service) Delete(id primitive.ObjectID) (err error) {
method SyncGit (line 72) | func (svc *Service) SyncGit() (err error) {
method SyncGitOne (line 80) | func (svc *Service) SyncGitOne(g interfaces.Git) (err error) {
method Export (line 85) | func (svc *Service) Export(id primitive.ObjectID) (filePath string, er...
method scheduleTasks (line 100) | func (svc *Service) scheduleTasks(s *models.Spider, opts *interfaces.S...
method getNodeIds (line 174) | func (svc *Service) getNodeIds(opts *interfaces.SpiderRunOptions) (nod...
method isMultiTask (line 194) | func (svc *Service) isMultiTask(opts *interfaces.SpiderRunOptions) (re...
method syncGit (line 216) | func (svc *Service) syncGit() {
method syncGitOne (line 268) | func (svc *Service) syncGitOne(g interfaces.Git) {
function NewSpiderAdminService (line 309) | func NewSpiderAdminService(opts ...Option) (svc2 interfaces.SpiderAdminS...
function GetSpiderAdminService (line 341) | func GetSpiderAdminService() (svc2 interfaces.SpiderAdminService, err er...
FILE: core/spider/admin/service_v2.go
type ServiceV2 (line 20) | type ServiceV2 struct
method Schedule (line 31) | func (svc *ServiceV2) Schedule(id primitive.ObjectID, opts *interfaces...
method scheduleTasks (line 42) | func (svc *ServiceV2) scheduleTasks(s *models2.SpiderV2, opts *interfa...
method getNodeIds (line 88) | func (svc *ServiceV2) getNodeIds(opts *interfaces.SpiderRunOptions) (n...
method isMultiTask (line 108) | func (svc *ServiceV2) isMultiTask(opts *interfaces.SpiderRunOptions) (...
function newSpiderAdminServiceV2 (line 130) | func newSpiderAdminServiceV2() (svc2 *ServiceV2, err error) {
function GetSpiderAdminServiceV2 (line 154) | func GetSpiderAdminServiceV2() (svc2 *ServiceV2, err error) {
FILE: core/stats/options.go
type Option (line 5) | type Option
FILE: core/stats/service.go
type Service (line 12) | type Service struct
method GetOverviewStats (line 15) | func (svc *Service) GetOverviewStats(query bson.M) (data interface{}, ...
method GetDailyStats (line 93) | func (svc *Service) GetDailyStats(query bson.M) (data interface{}, err...
method GetTaskStats (line 101) | func (svc *Service) GetTaskStats(query bson.M) (data interface{}, err ...
method getDailyTasksStats (line 125) | func (svc *Service) getDailyTasksStats(query bson.M) (data interface{}...
method getOverviewResults (line 162) | func (svc *Service) getOverviewResults(query bson.M) (data interface{}...
method getTaskStatsByStatus (line 180) | func (svc *Service) getTaskStatsByStatus(query bson.M) (data interface...
method getTaskStatsByNode (line 205) | func (svc *Service) getTaskStatsByNode(query bson.M) (data interface{}...
method getTaskStatsBySpider (line 241) | func (svc *Service) getTaskStatsBySpider(query bson.M) (data interface...
method getTaskStatsHistogram (line 278) | func (svc *Service) getTaskStatsHistogram(query bson.M) (data interfac...
function GetStatsService (line 314) | func GetStatsService() interfaces.StatsService {
FILE: core/sys_exec/sys_exec.go
type KillProcessOptions (line 11) | type KillProcessOptions struct
function KillProcess (line 16) | func KillProcess(cmd *exec.Cmd, opts *KillProcessOptions) error {
function killProcessWithTimeout (line 37) | func killProcessWithTimeout(p *process.Process, timeout time.Duration, k...
function killProcessRecursive (line 53) | func killProcessRecursive(p *process.Process, force bool) (err error) {
function killProcess (line 70) | func killProcess(p *process.Process, force bool) (err error) {
function ConfigureCmdLogging (line 82) | func ConfigureCmdLogging(cmd *exec.Cmd, fn func(scanner *bufio.Scanner)) {
FILE: core/sys_exec/sys_exec_darwin.go
function BuildCmd (line 13) | func BuildCmd(cmdStr string) (cmd *exec.Cmd, err error) {
function SetPgid (line 21) | func SetPgid(cmd *exec.Cmd) {
FILE: core/sys_exec/sys_exec_linux.go
function BuildCmd (line 13) | func BuildCmd(cmdStr string) (cmd *exec.Cmd, err error) {
function SetPgid (line 21) | func SetPgid(cmd *exec.Cmd) {
FILE: core/sys_exec/sys_exec_windows.go
function BuildCmd (line 12) | func BuildCmd(cmdStr string) (cmd *exec.Cmd, err error) {
FILE: core/system/service.go
type Service (line 12) | type Service struct
method Init (line 17) | func (svc *Service) Init() (err error) {
method initData (line 26) | func (svc *Service) initData() (err error) {
function NewService (line 62) | func NewService() *Service {
function GetService (line 84) | func GetService() *Service {
FILE: core/system/service_v2.go
type ServiceV2 (line 10) | type ServiceV2 struct
method Init (line 13) | func (svc *ServiceV2) Init() (err error) {
method initData (line 22) | func (svc *ServiceV2) initData() (err error) {
function newSystemServiceV2 (line 50) | func newSystemServiceV2() *ServiceV2 {
function GetSystemServiceV2 (line 64) | func GetSystemServiceV2() *ServiceV2 {
FILE: core/task/handler/options.go
type Option (line 8) | type Option
function WithConfigPath (line 10) | func WithConfigPath(path string) Option {
function WithExitWatchDuration (line 16) | func WithExitWatchDuration(duration time.Duration) Option {
function WithReportInterval (line 22) | func WithReportInterval(interval time.Duration) Option {
function WithCancelTimeout (line 28) | func WithCancelTimeout(timeout time.Duration) Option {
type RunnerOption (line 34) | type RunnerOption
function WithSubscribeTimeout (line 36) | func WithSubscribeTimeout(timeout time.Duration) RunnerOption {
FILE: core/task/handler/runner_test.go
type MockRunner (line 18) | type MockRunner struct
method downloadFile (line 23) | func (m *MockRunner) downloadFile(url string, filePath string) error {
function newMockRunner (line 28) | func newMockRunner() *MockRunner {
function TestSyncFiles_SuccessWithDummyFiles (line 34) | func TestSyncFiles_SuccessWithDummyFiles(t *testing.T) {
function TestSyncFiles_DeletesFilesNotOnMaster (line 70) | func TestSyncFiles_DeletesFilesNotOnMaster(t *testing.T) {
FILE: core/task/handler/runner_v2.go
type RunnerV2 (line 38) | type RunnerV2 struct
method Init (line 66) | func (r *RunnerV2) Init() (err error) {
method Run (line 88) | func (r *RunnerV2) Run() (err error) {
method Cancel (line 171) | func (r *RunnerV2) Cancel() (err error) {
method CleanUp (line 200) | func (r *RunnerV2) CleanUp() (err error) {
method SetSubscribeTimeout (line 204) | func (r *RunnerV2) SetSubscribeTimeout(timeout time.Duration) {
method GetTaskId (line 208) | func (r *RunnerV2) GetTaskId() (id primitive.ObjectID) {
method configureCmd (line 212) | func (r *RunnerV2) configureCmd() (err error) {
method configureLogging (line 243) | func (r *RunnerV2) configureLogging() {
method startLogging (line 253) | func (r *RunnerV2) startLogging() {
method startLoggingReaderStdout (line 261) | func (r *RunnerV2) startLoggingReaderStdout() {
method startLoggingReaderStderr (line 272) | func (r *RunnerV2) startLoggingReaderStderr() {
method startHealthCheck (line 283) | func (r *RunnerV2) startHealthCheck() {
method configureEnv (line 298) | func (r *RunnerV2) configureEnv() {
method syncFiles (line 329) | func (r *RunnerV2) syncFiles() (err error) {
method downloadFile (line 438) | func (r *RunnerV2) downloadFile(url string, filePath string, fileInfo ...
method wait (line 479) | func (r *RunnerV2) wait() {
method updateTask (line 506) | func (r *RunnerV2) updateTask(status string, e error) (err error) {
method initSub (line 542) | func (r *RunnerV2) initSub() (err error) {
method writeLogLines (line 550) | func (r *RunnerV2) writeLogLines(lines []string) {
method _updateTaskStat (line 569) | func (r *RunnerV2) _updateTaskStat(status string) {
method sendNotification (line 605) | func (r *RunnerV2) sendNotification() {
method _updateSpiderStat (line 618) | func (r *RunnerV2) _updateSpiderStat(status string) {
method configureCwd (line 672) | func (r *RunnerV2) configureCwd() {
function NewTaskRunnerV2 (line 683) | func NewTaskRunnerV2(id primitive.ObjectID, svc *ServiceV2) (r2 *RunnerV...
FILE: core/task/handler/service_v2.go
type ServiceV2 (line 23) | type ServiceV2 struct
method Start (line 43) | func (svc *ServiceV2) Start() {
method Run (line 56) | func (svc *ServiceV2) Run(taskId primitive.ObjectID) (err error) {
method Reset (line 60) | func (svc *ServiceV2) Reset() {
method Cancel (line 65) | func (svc *ServiceV2) Cancel(taskId primitive.ObjectID) (err error) {
method Fetch (line 76) | func (svc *ServiceV2) Fetch() {
method ReportStatus (line 132) | func (svc *ServiceV2) ReportStatus() {
method IsSyncLocked (line 148) | func (svc *ServiceV2) IsSyncLocked(path string) (ok bool) {
method LockSync (line 153) | func (svc *ServiceV2) LockSync(path string) {
method UnlockSync (line 157) | func (svc *ServiceV2) UnlockSync(path string) {
method GetExitWatchDuration (line 169) | func (svc *ServiceV2) GetExitWatchDuration() (duration time.Duration) {
method SetExitWatchDuration (line 173) | func (svc *ServiceV2) SetExitWatchDuration(duration time.Duration) {
method GetFetchInterval (line 177) | func (svc *ServiceV2) GetFetchInterval() (interval time.Duration) {
method SetFetchInterval (line 181) | func (svc *ServiceV2) SetFetchInterval(interval time.Duration) {
method GetReportInterval (line 185) | func (svc *ServiceV2) GetReportInterval() (interval time.Duration) {
method SetReportInterval (line 189) | func (svc *ServiceV2) SetReportInterval(interval time.Duration) {
method GetCancelTimeo
Condensed preview — 766 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,748K chars).
[
{
"path": ".dockerignore",
"chars": 97,
"preview": ".idea\nlogs\n*.log\ndist/\n**/node_modules/\n\n**/tmp/\n**/vendor/\n.github/\n.devops\nk8s\nworkspace\n.git/\n"
},
{
"path": ".gitattributes",
"chars": 295,
"preview": "*.md linguist-language=Go\n*.yml linguist-language=Go\n*.html linguist-language=Go\n*.js linguist-language=Go\n*.ts linguist"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 468,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: 'bug'\nassignees: ''\n\n---\n\n**Describe th"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_zh.md",
"chars": 231,
"preview": "---\nname: Bug 报告\nabout: 创建一份 Bug 报告帮助我们优化产品\ntitle: ''\nlabels: 'bug'\nassignees: ''\n\n---\n\n**Bug 描述**\n例如,当 xxx 时,xxx 功能不工作。"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 513,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request_zh.md",
"chars": 205,
"preview": "---\nname: 功能需求\nabout: 优化和功能需求建议\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**请描述该需求尝试解决的问题**\n例如,当 xxx 时,我总是被当前 "
},
{
"path": ".github/workflows/docker-crawlab-tencent.yml",
"chars": 6750,
"preview": "name: \"Docker Image CI: crawlab (tencent)\"\n\non:\n push:\n branches: [ develop, main ]\n #pull_request:\n # branches: "
},
{
"path": ".github/workflows/docker-crawlab.yml",
"chars": 6682,
"preview": "name: \"Docker Image CI: crawlab\"\n\non:\n push:\n branches: [ develop, main ]\n #pull_request:\n # branches: [ main ]\n "
},
{
"path": ".gitignore",
"chars": 88,
"preview": ".idea/\n.vscode/\n.DS_Store\nnode_modules/\nlogs/\ntmp/\n_book/\n*.lock\nvendor/\n.crawlab\ndist/\n"
},
{
"path": "CHANGELOG-zh.md",
"chars": 12910,
"preview": "# 0.6.0 (TBC)\n\n(TBC)\n\n# 0.5.1 (2020-07-31)\n\n### 功能 / 优化\n- **加入错误详情信息**.\n- **加入 Golang 编程语言支持**.\n- **加入 Chrome Driver 和 F"
},
{
"path": "CHANGELOG.md",
"chars": 20970,
"preview": "# 0.6.0 (TBC)\n\n(TBC)\n\n# 0.5.1 (2020-07-31)\n\n### Features / Enhancement\n- **Added error message details**.\n- **Added Gola"
},
{
"path": "DISCLAIMER-zh.md",
"chars": 874,
"preview": "# 免责声明\n\n本免责及隐私保护声明(以下简称“免责声明”或“本声明”)适用于 Crawlab 开发组 (以下简称“开发组”)研发的系列软件(以下简称\"Crawlab\") 在您阅读本声明后若不同意此声明中的任何条款,或对本声明存在质疑,请立"
},
{
"path": "DISCLAIMER.md",
"chars": 2842,
"preview": "# Disclaimer\n\nThis Disclaimer and privacy protection statement (hereinafter referred to as \"disclaimer statement\" or \"th"
},
{
"path": "Dockerfile",
"chars": 771,
"preview": "FROM crawlabteam/crawlab-backend:latest AS backend-build\n\nFROM crawlabteam/crawlab-frontend:latest AS frontend-build\n\nFR"
},
{
"path": "LICENSE",
"chars": 1520,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2020, Crawlab Team\nAll rights reserved.\n\nRedistribution and use in source and binary"
},
{
"path": "README-zh.md",
"chars": 9539,
"preview": "# Crawlab\n\n<p>\n <a href=\"https://github.com/crawlab-team/crawlab/actions/workflows/docker-crawlab.yml\" target=\"_blank\">"
},
{
"path": "README.md",
"chars": 12801,
"preview": "# Crawlab\n\n<p>\n <a href=\"https://github.com/crawlab-team/crawlab/actions/workflows/docker-crawlab.yml\" target=\"_blank\">"
},
{
"path": "SECURITY.md",
"chars": 392,
"preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n| ------- | ------------------ |\n| 0.6.x | "
},
{
"path": "backend/.air.master.conf",
"chars": 1363,
"preview": "# Config file for [Air](https://github.com/cosmtrek/air) in TOML format\n\n# Working directory\n# . or absolute path, pleas"
},
{
"path": "backend/.air.worker.conf",
"chars": 1363,
"preview": "# Config file for [Air](https://github.com/cosmtrek/air) in TOML format\n\n# Working directory\n# . or absolute path, pleas"
},
{
"path": "backend/.editorconfig",
"chars": 188,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = tab\ninsert_final_newline = true\ntrim_tr"
},
{
"path": "backend/Dockerfile",
"chars": 234,
"preview": "FROM golang:1.18 AS build\n\nWORKDIR /go/src/app\nCOPY . .\n\nENV GO111MODULE on\n#ENV GOPROXY https://goproxy.io\n\nRUN go mod "
},
{
"path": "backend/README.md",
"chars": 47,
"preview": "# crawlab-backend\n\nBackend (Golang) for Crawlab"
},
{
"path": "backend/Taskfile.yml",
"chars": 224,
"preview": "version: '3'\n\ntasks:\n dev:\n desc: Switch to dev mode for local development.\n cmds:\n - cp -f go.mod.dev go.mo"
},
{
"path": "backend/bin/semver.sh",
"chars": 13190,
"preview": "#!/usr/bin/env bash\n# SPDX-License-Identifier: Apache-2.0\n\nset -o errexit -o nounset -o pipefail\n\nNAT='0|[1-9][0-9]*'\nAL"
},
{
"path": "backend/bin/update-deps.sh",
"chars": 77,
"preview": "#!/bin/bash\n\ngo get -u github.com/crawlab-team/crawlab/core@main\ngo mod tidy\n"
},
{
"path": "backend/bin/update-ver.sh",
"chars": 482,
"preview": "#!/bin/sh\n\n# update version type (major, minor, patch, prerelease)\nupdate_version_type=\"prerelease\"\nif [ -n \"$1\" ]; then"
},
{
"path": "backend/conf/config.yml",
"chars": 392,
"preview": "# Crawlab Configuration File\nedition: global.edition.community\nversion: v0.6.3\n\nmongo:\n host: localhost\n port: 27017\n "
},
{
"path": "backend/go.mod",
"chars": 8225,
"preview": "module crawlab\n\ngo 1.22\n\nreplace (\n\tgithub.com/crawlab-team/crawlab/core => ../core\n\tgithub.com/crawlab-team/crawlab/db "
},
{
"path": "backend/go.mod.dev",
"chars": 548,
"preview": "module crawlab\n\ngo 1.16\n\nreplace (\n github.com/crawlab-team/crawlab/core => ../../crawlab-core\n github.com/crawlab"
},
{
"path": "backend/go.mod.local",
"chars": 618,
"preview": "module crawlab\n\ngo 1.16\n\nreplace (\n github.com/crawlab-team/crawlab/core => /libs/crawlab-team/crawlab-core\n githu"
},
{
"path": "backend/go.sum",
"chars": 129052,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
},
{
"path": "backend/main.go",
"chars": 105,
"preview": "package main\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/cmd\"\n)\n\nfunc main() {\n\t_ = cmd.Execute()\n}\n"
},
{
"path": "backend/test/config-master.json",
"chars": 161,
"preview": "{\n \"key\": \"master\",\n \"is_master\": true,\n \"name\": \"Master Node\",\n \"ip\": \"\",\n \"mac\": \"\",\n \"hostname\": \"\",\n \"descrip"
},
{
"path": "backend/test/config-worker-01.json",
"chars": 168,
"preview": "{\n \"key\": \"worker-01\",\n \"is_master\": false,\n \"name\": \"Worker Node 01\",\n \"ip\": \"\",\n \"mac\": \"\",\n \"hostname\": \"\",\n \""
},
{
"path": "backend/test/config-worker-02.json",
"chars": 168,
"preview": "{\n \"key\": \"worker-02\",\n \"is_master\": false,\n \"name\": \"Worker Node 02\",\n \"ip\": \"\",\n \"mac\": \"\",\n \"hostname\": \"\",\n \""
},
{
"path": "backend/test/config-worker-03.json",
"chars": 168,
"preview": "{\n \"key\": \"worker-03\",\n \"is_master\": false,\n \"name\": \"Worker Node 03\",\n \"ip\": \"\",\n \"mac\": \"\",\n \"hostname\": \"\",\n \""
},
{
"path": "backend/test/config-worker-invalid-auth-key.json",
"chars": 178,
"preview": "{\n \"key\": \"worker-invalid-auth-key\",\n \"is_master\": false,\n \"name\": \"worker\",\n \"ip\": \"\",\n \"mac\": \"\",\n \"hostname\": \""
},
{
"path": "bin/docker-init.sh",
"chars": 122,
"preview": "#!/bin/bash\n\n# replace default api path to new one\npython /app/bin/update_docker_js_api_address.py\n\ncrawlab-server serve"
},
{
"path": "bin/gen-ver.sh",
"chars": 115,
"preview": "#!/bin/bash\nCOMMIT_HASH=$(git rev-parse HEAD)\nTIMESTAMP=$(date +%Y%m%d%H%M%S)\necho \"v0.0.0-$TIMESTAMP-$COMMIT_HASH\""
},
{
"path": "bin/update_docker_js_api_address.py",
"chars": 502,
"preview": "import os\n\ndir_path = '/app/dist/assets'\n\nfor file_name in os.listdir(dir_path):\n if not file_name.endswith('.js'):\n "
},
{
"path": "changelog/v0.6.0-zh.md",
"chars": 1615,
"preview": "# 更新日志 (v0.6.0)\n\n## 概览\n\n作为一个重要版本发布,Crawlab v0.6.0 由一些重大的功能升级组成,包括性能、稳定性、健壮性、易用性方面的大量优化。本次 beta 版本理论上会比老版本更加健壮,特别是任务执行、文件"
},
{
"path": "changelog/v0.6.0.md",
"chars": 3151,
"preview": "# Change Log (v0.6.0)\n\n## Overview\n\nAs a major release, v0.6.0 is consisted of a number of large changes to enhance the "
},
{
"path": "core/.editorconfig",
"chars": 213,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = tab\ninsert_final_newline = true\ntrim_tr"
},
{
"path": "core/.github/workflows/test.yml",
"chars": 865,
"preview": "name: \"Test\"\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n # The branches below must be a subset of t"
},
{
"path": "core/.gitignore",
"chars": 65,
"preview": ".idea\n.DS_Store\nvendor/\ntmp/\nbuild/\ndist/\n*.log\ngen/\n*.exe\n*.txt\n"
},
{
"path": "core/LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "core/README.md",
"chars": 48,
"preview": "# crawlab-core\nBackend core modules for Crawlab\n"
},
{
"path": "core/apps/api_v2.go",
"chars": 2288,
"preview": "package apps\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/controllers\"\n\t"
},
{
"path": "core/apps/docker.go",
"chars": 4406,
"preview": "package apps\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/craw"
},
{
"path": "core/apps/interfaces.go",
"chars": 583,
"preview": "package apps\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/gin-gonic/gin\"\n\t\"net/http\"\n)\n\ntyp"
},
{
"path": "core/apps/server_v2.go",
"chars": 2074,
"preview": "package apps\n\nimport (\n\t\"fmt\"\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/config\"\n\t\"github.com/crawlab"
},
{
"path": "core/apps/utils.go",
"chars": 575,
"preview": "package apps\n\nimport (\n\t\"fmt\"\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/utils\"\n\t\"github.com/crawlab-"
},
{
"path": "core/cmd/root.go",
"chars": 547,
"preview": "package cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\nvar (\n\t// Used for flags.\n\tcfgFile string\n\n\trootCmd = &cobra.Command{"
},
{
"path": "core/cmd/server.go",
"chars": 472,
"preview": "package cmd\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/apps\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\trootCmd.A"
},
{
"path": "core/cmd/server_test.go",
"chars": 228,
"preview": "package cmd\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/apps\"\n\t\"os\"\n\t\"testing\"\n)\n\nfunc TestCmdServer(t *testing.T) "
},
{
"path": "core/color/service.go",
"chars": 1667,
"preview": "package color\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/data\"\n\t\"github.com/crawl"
},
{
"path": "core/config/base.go",
"chars": 442,
"preview": "package config\n\nimport (\n\t\"github.com/mitchellh/go-homedir\"\n\t\"github.com/spf13/viper\"\n\t\"path/filepath\"\n)\n\nvar HomeDirPat"
},
{
"path": "core/config/config.go",
"chars": 1620,
"preview": "package config\n\nimport (\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/trace\"\n\t\"github.com/fsnotify/fsnotify\""
},
{
"path": "core/config/config_test.go",
"chars": 158,
"preview": "package config\n\nimport (\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc TestInitConfig(t *testing.T) {\n\terr :"
},
{
"path": "core/config/path.go",
"chars": 413,
"preview": "package config\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n)\n\ntype PathService struct {\n\tcfgPath string"
},
{
"path": "core/constants/action.go",
"chars": 196,
"preview": "package constants\n\nconst (\n\tActionTypeVisit = \"visit\"\n\tActionTypeInstallDep = \"install_dep\"\n\tActionTypeInst"
},
{
"path": "core/constants/anchor.go",
"chars": 153,
"preview": "package constants\n\nconst (\n\tAnchorStartStage = \"START_STAGE\"\n\tAnchorStartUrl = \"START_URL\"\n\tAnchorItems = \"ITEMS\""
},
{
"path": "core/constants/auth.go",
"chars": 106,
"preview": "package constants\n\nconst (\n\tOwnerTypeAll = \"all\"\n\tOwnerTypeMe = \"me\"\n\tOwnerTypePublic = \"public\"\n)\n"
},
{
"path": "core/constants/cache.go",
"chars": 117,
"preview": "package constants\n\nconst (\n\tCacheColName = \"cache\"\n\tCacheColKey = \"k\"\n\tCacheColValue = \"v\"\n\tCacheColTime = \"t\"\n)\n"
},
{
"path": "core/constants/channels.go",
"chars": 130,
"preview": "package constants\n\nconst (\n\tChannelAllNode = \"nodes:public\"\n\n\tChannelWorkerNode = \"nodes:\"\n\n\tChannelMasterNode = \"nodes:"
},
{
"path": "core/constants/common.go",
"chars": 69,
"preview": "package constants\n\nconst (\n\tASCENDING = \"asc\"\n\tDESCENDING = \"dsc\"\n)\n"
},
{
"path": "core/constants/config_spider.go",
"chars": 78,
"preview": "package constants\n\nconst (\n\tEngineScrapy = \"scrapy\"\n\tEngineColly = \"colly\"\n)\n"
},
{
"path": "core/constants/data_collection.go",
"chars": 57,
"preview": "package constants\n\nconst (\n\tDataCollectionKey = \"_col\"\n)\n"
},
{
"path": "core/constants/data_field.go",
"chars": 297,
"preview": "package constants\n\nconst (\n\tDataFieldTypeGeneral = \"general\"\n\tDataFieldTypeNumeric = \"numeric\"\n\tDataFieldTypeDate "
},
{
"path": "core/constants/database.go",
"chars": 46,
"preview": "package constants\n\nconst (\n\tColJob = \"jobs\"\n)\n"
},
{
"path": "core/constants/delegate.go",
"chars": 18,
"preview": "package constants\n"
},
{
"path": "core/constants/ds.go",
"chars": 719,
"preview": "package constants\n\nconst (\n\tDataSourceTypeMongo = \"mongo\"\n\tDataSourceTypeMysql = \"mysql\"\n\tDataSourceType"
},
{
"path": "core/constants/encrypt.go",
"chars": 75,
"preview": "package constants\n\nconst (\n\tDefaultEncryptServerKey = \"0123456789abcdef\"\n)\n"
},
{
"path": "core/constants/errors.go",
"chars": 1365,
"preview": "package constants\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\t//ErrorMongoError = e.NewSystemOPError(1001, \"system erro"
},
{
"path": "core/constants/event.go",
"chars": 111,
"preview": "package constants\n\nconst (\n\tGrpcEventServiceTypeRegister = \"register\"\n\tGrpcEventServiceTypeSend = \"send\"\n)\n"
},
{
"path": "core/constants/export.go",
"chars": 78,
"preview": "package constants\n\nconst (\n\tExportTypeCsv = \"csv\"\n\tExportTypeJson = \"json\"\n)\n"
},
{
"path": "core/constants/file.go",
"chars": 80,
"preview": "package constants\n\nconst EmptyFileData = \" \"\n\nconst FsKeepFileName = \".gitkeep\"\n"
},
{
"path": "core/constants/filer.go",
"chars": 67,
"preview": "package constants\n\nconst (\n\tDefaultFilerAuthKey = \"Crawlab2021!\"\n)\n"
},
{
"path": "core/constants/filter.go",
"chars": 668,
"preview": "package constants\n\nconst (\n\tFilterQueryFieldConditions = \"conditions\"\n\tFilterQueryFieldAll = \"all\"\n)\n\nconst (\n\tFi"
},
{
"path": "core/constants/git.go",
"chars": 226,
"preview": "package constants\n\nconst (\n\tGitAuthTypeHttp = \"http\"\n\tGitAuthTypeSsh = \"ssh\"\n)\n\nconst (\n\tGitRemoteNameUpstream = \"upstr"
},
{
"path": "core/constants/grpc.go",
"chars": 340,
"preview": "package constants\n\nconst (\n\tDefaultGrpcServerHost = \"\"\n\tDefaultGrpcServerPort = \"9666\"\n\tDefaultGrpcClientRem"
},
{
"path": "core/constants/http.go",
"chars": 206,
"preview": "package constants\n\nconst (\n\tHttpResponseStatusOk = \"ok\"\n\tHttpResponseMessageSuccess = \"success\"\n\tHttpResponseMessa"
},
{
"path": "core/constants/log.go",
"chars": 110,
"preview": "package constants\n\nconst (\n\tErrorRegexPattern = \"(?:[ :,.]|^)((?:error|exception|traceback)s?)(?:[ :,.]|$)\"\n)\n"
},
{
"path": "core/constants/message.go",
"chars": 217,
"preview": "package constants\n\nconst (\n\tMsgTypeGetLog = \"get-log\"\n\tMsgTypeGetSystemInfo = \"get-sys-info\"\n\tMsgTypeCancelTask "
},
{
"path": "core/constants/node.go",
"chars": 152,
"preview": "package constants\n\nconst (\n\tNodeStatusUnregistered = \"u\"\n\tNodeStatusRegistered = \"r\"\n\tNodeStatusOnline = \"on\"\n\tN"
},
{
"path": "core/constants/notification.go",
"chars": 609,
"preview": "package constants\n\nconst (\n\tNotificationTriggerPatternTask = \"^task\"\n\tNotificationTriggerPatternNode = \"^node\"\n)\n\nconst "
},
{
"path": "core/constants/pagination.go",
"chars": 80,
"preview": "package constants\n\nvar PaginationDefaultPage = 1\nvar PaginationDefaultSize = 10\n"
},
{
"path": "core/constants/register.go",
"chars": 168,
"preview": "package constants\n\nconst (\n\tRegisterTypeMac = \"mac\"\n\tRegisterTypeIp = \"ip\"\n\tRegisterTypeHostname = \"hos"
},
{
"path": "core/constants/results.go",
"chars": 121,
"preview": "package constants\n\nconst (\n\tHashKey = \"_h\"\n)\n\nconst (\n\tDedupTypeIgnore = \"ignore\"\n\tDedupTypeOverwrite = \"overwrite\"\n)"
},
{
"path": "core/constants/rpc.go",
"chars": 374,
"preview": "package constants\n\nconst (\n\tRpcInstallLang = \"install_lang\"\n\tRpcInstallDep = \"install_dep\"\n\tRpcUninst"
},
{
"path": "core/constants/schedule.go",
"chars": 243,
"preview": "package constants\n\nconst (\n\tScheduleStatusStop = \"stopped\"\n\tScheduleStatusRunning = \"running\"\n\tScheduleStatusError "
},
{
"path": "core/constants/scrapy.go",
"chars": 108,
"preview": "package constants\n\nconst ScrapyProtectedStageNames = \"\"\n\nconst ScrapyProtectedFieldNames = \"_id,task_id,ts\"\n"
},
{
"path": "core/constants/signal.go",
"chars": 48,
"preview": "package constants\n\nconst (\n\tSignalQuit = iota\n)\n"
},
{
"path": "core/constants/sort.go",
"chars": 54,
"preview": "package constants\n\nconst (\n\tSortQueryField = \"sort\"\n)\n"
},
{
"path": "core/constants/system.go",
"chars": 424,
"preview": "package constants\n\nconst (\n\tWindows = \"windows\"\n\tLinux = \"linux\"\n\tDarwin = \"darwin\"\n)\n\nconst (\n\tPython = \"python\"\n\tNo"
},
{
"path": "core/constants/task.go",
"chars": 661,
"preview": "package constants\n\nconst (\n\tTaskStatusPending = \"pending\"\n\tTaskStatusRunning = \"running\"\n\tTaskStatusFinished = \"fin"
},
{
"path": "core/constants/user.go",
"chars": 185,
"preview": "package constants\n\nconst (\n\tRoleAdmin = \"admin\"\n\tRoleNormal = \"normal\"\n)\n\nconst (\n\tDefaultAdminUsername = \"admin\"\n\tDefa"
},
{
"path": "core/constants/variable.go",
"chars": 129,
"preview": "package constants\n\nconst (\n\tString = \"string\"\n\tNumber = \"number\"\n\tBoolean = \"boolean\"\n\tArray = \"array\"\n\tObject = \"o"
},
{
"path": "core/container/container.go",
"chars": 118,
"preview": "package container\n\nimport (\n\t\"go.uber.org/dig\"\n)\n\nvar c = dig.New()\n\nfunc GetContainer() *dig.Container {\n\treturn c\n}\n"
},
{
"path": "core/controllers/base_file_v2.go",
"chars": 6276,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\tlog2 \"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/fs\"\n\t\""
},
{
"path": "core/controllers/base_v2.go",
"chars": 4985,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/cra"
},
{
"path": "core/controllers/base_v2_test.go",
"chars": 4172,
"preview": "package controllers_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/controlle"
},
{
"path": "core/controllers/export_v2.go",
"chars": 2331,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-te"
},
{
"path": "core/controllers/filter_v2.go",
"chars": 1273,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/entity\"\n\t\"github.com/crawlab-team/crawlab/db/mongo\""
},
{
"path": "core/controllers/http.go",
"chars": 373,
"preview": "package controllers\n\ntype Response[T any] struct {\n\tStatus string `json:\"status\"`\n\tMessage string `json:\"message\"`\n\tDat"
},
{
"path": "core/controllers/login_v2.go",
"chars": 882,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/e"
},
{
"path": "core/controllers/project_v2.go",
"chars": 2019,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/errors\"\n\tmodels2 \"github.com/crawlab-team/crawlab/c"
},
{
"path": "core/controllers/result_v2.go",
"chars": 2679,
"preview": "package controllers\n\nimport (\n\tmodels2 \"github.com/crawlab-team/crawlab/core/models/models/v2\"\n\t\"github.com/crawlab-team"
},
{
"path": "core/controllers/router_v2.go",
"chars": 9161,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/middlewares\"\n\tmodels2 \"github.com/crawlab-team/craw"
},
{
"path": "core/controllers/router_v2_test.go",
"chars": 2356,
"preview": "package controllers_test\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/controllers\"\n\t\"github.com/crawlab-team/crawlab"
},
{
"path": "core/controllers/schedule_v2.go",
"chars": 2843,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/errors\"\n\t\"github.com/crawlab-team/crawlab/core/mode"
},
{
"path": "core/controllers/setting_v2.go",
"chars": 1721,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\t\"github.com/crawlab-team/crawlab/core/models/models/v2\"\n\t\"github.com/crawlab-te"
},
{
"path": "core/controllers/spider_v2.go",
"chars": 17403,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/fs\"\n\t\"github.com/c"
},
{
"path": "core/controllers/spider_v2_test.go",
"chars": 7294,
"preview": "package controllers_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/controllers\"\n\t\"githu"
},
{
"path": "core/controllers/stats_v2.go",
"chars": 903,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/stats\"\n\t\"github.com/gin-gonic/gin\"\n\t\"go.mongodb.org"
},
{
"path": "core/controllers/sync_v2.go",
"chars": 708,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/utils\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/spf"
},
{
"path": "core/controllers/system_info_v2.go",
"chars": 315,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/entity\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/sp"
},
{
"path": "core/controllers/task_v2.go",
"chars": 10378,
"preview": "package controllers\n\nimport (\n\t\"errors\"\n\tlog2 \"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\""
},
{
"path": "core/controllers/token_v2.go",
"chars": 800,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/models/models/v2\"\n\t\"github.com/crawlab-team/crawlab"
},
{
"path": "core/controllers/user_v2.go",
"chars": 2797,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/models/models/v2\"\n\t\"github.com/crawlab-team/crawlab"
},
{
"path": "core/controllers/user_v2_test.go",
"chars": 2497,
"preview": "package controllers_test\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/controllers\"\n\t\"github.com/crawlab-team/crawlab"
},
{
"path": "core/controllers/utils_context.go",
"chars": 630,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/i"
},
{
"path": "core/controllers/utils_filter.go",
"chars": 2602,
"preview": "package controllers\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-te"
},
{
"path": "core/controllers/utils_http.go",
"chars": 2052,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/e"
},
{
"path": "core/controllers/utils_pagination.go",
"chars": 700,
"preview": "package controllers\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/e"
},
{
"path": "core/controllers/utils_sort.go",
"chars": 1335,
"preview": "package controllers\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-te"
},
{
"path": "core/controllers/ws_writer.go",
"chars": 1304,
"preview": "package controllers\n\nimport (\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/trace\"\n\t\"github.com/gin-gonic/gin"
},
{
"path": "core/data/colors.go",
"chars": 75246,
"preview": "package data\n\nconst ColorsDataText = `[\n {\n \"name\": \"Absolute Zero\",\n \"hex\": \"#0048BA\"\n },\n {\n \"name\": \"Acid"
},
{
"path": "core/database/entity/database.go",
"chars": 1999,
"preview": "package entity\n\ntype DatabaseMetadata struct {\n\tDatabases []Database `json:\"databases\"`\n}\n\ntype Database struct {\n\tName "
},
{
"path": "core/database/interfaces/database_registry_service.go",
"chars": 221,
"preview": "package interfaces\n\nimport (\n\t\"go.mongodb.org/mongo-driver/bson/primitive\"\n)\n\ntype DatabaseRegistryService interface {\n\t"
},
{
"path": "core/database/interfaces/database_service.go",
"chars": 1788,
"preview": "package interfaces\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/database/entity\"\n\t\"github.com/crawlab-team/crawlab/c"
},
{
"path": "core/database/registry_service.go",
"chars": 343,
"preview": "package database\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/database/interfaces\"\n)\n\nvar serviceInstance interfaces"
},
{
"path": "core/docker-compose.yml",
"chars": 295,
"preview": "version: '3.3'\nservices:\n mongo:\n image: mongo:latest\n container_name: mongo\n restart: always\n "
},
{
"path": "core/docs/.gitignore",
"chars": 44,
"preview": ".idea\nnode_modules\ndist\nbuild\ntmp\nyarn.lock\n"
},
{
"path": "core/docs/api/index.html",
"chars": 301,
"preview": "<!doctype html> <!-- Important: must specify -->\n<html>\n<head>\n\t<meta charset=\"utf-8\"> <!-- Important: rapi-doc uses utf"
},
{
"path": "core/docs/api/openapi.yaml",
"chars": 118401,
"preview": "openapi: 3.0.0\ninfo:\n title: Crawlab API\n version: 0.6.0\n description: Crawlab API\n license:\n name: BSD-3-Clause\n"
},
{
"path": "core/docs/package.json",
"chars": 283,
"preview": "{\n \"name\": \"docs\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"publish\": \"node"
},
{
"path": "core/docs/scripts/publish.js",
"chars": 1878,
"preview": "const path = require('path')\nconst qiniu = require('qiniu')\nconst walkSync = require('walk-sync')\nconst chalk = require("
},
{
"path": "core/ds/cockroachdb.go",
"chars": 1600,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces"
},
{
"path": "core/ds/default.go",
"chars": 11,
"preview": "package ds\n"
},
{
"path": "core/ds/es.go",
"chars": 5393,
"preview": "package ds\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\tcon"
},
{
"path": "core/ds/kafka.go",
"chars": 2651,
"preview": "package ds\n\nimport (\n\t\"github.com/cenkalti/backoff/v4\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/cr"
},
{
"path": "core/ds/mongo.go",
"chars": 2804,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces"
},
{
"path": "core/ds/mssql.go",
"chars": 1624,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces"
},
{
"path": "core/ds/mssql_test.go",
"chars": 125,
"preview": "package ds\n\nimport \"testing\"\n\nfunc TestNewDataSourceMssqlService(t *testing.T) {\n\tt.Run(\"insert\", func(t *testing.T) {\n\t"
},
{
"path": "core/ds/mysql.go",
"chars": 1510,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces"
},
{
"path": "core/ds/options.go",
"chars": 316,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"time\"\n)\n\ntype DataSourceServiceOption func(svc"
},
{
"path": "core/ds/postgresql.go",
"chars": 1649,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces"
},
{
"path": "core/ds/service.go",
"chars": 7072,
"preview": "package ds\n\nimport (\n\t\"github.com/apex/log\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\tconstants2 \"github.com/cr"
},
{
"path": "core/ds/sql.go",
"chars": 1694,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/entity\"\n\t\"github.com/crawlab-team/crawlab/core/models/models"
},
{
"path": "core/ds/sql_options.go",
"chars": 79,
"preview": "package ds\n\ntype SqlOptions struct {\n\tDefaultHost string\n\tDefaultPort string\n}\n"
},
{
"path": "core/ds/sqlite.go",
"chars": 1176,
"preview": "package ds\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/crawlab/core/models/mo"
},
{
"path": "core/entity/address.go",
"chars": 1041,
"preview": "package entity\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Address struct {\n\tHost string\n\tPort string\n}\n\nfunc (a *Addr"
},
{
"path": "core/entity/color.go",
"chars": 246,
"preview": "package entity\n\ntype Color struct {\n\tName string `json:\"name\"`\n\tHex string `json:\"hex\"`\n}\n\nfunc (c *Color) GetHex() str"
},
{
"path": "core/entity/common.go",
"chars": 311,
"preview": "package entity\n\nimport \"strconv\"\n\ntype Page struct {\n\tSkip int\n\tLimit int\n\tPageNum int\n\tPageSize int\n}\n\nfunc (p "
},
{
"path": "core/entity/config_spider.go",
"chars": 1428,
"preview": "package entity\n\ntype ConfigSpiderData struct {\n\t// 通用\n\tName string `yaml:\"name\" json:\"name\"`\n\tDisplayName string "
},
{
"path": "core/entity/data_field.go",
"chars": 118,
"preview": "package entity\n\ntype DataField struct {\n\tKey string `json:\"key\" bson:\"key\"`\n\tType string `json:\"type\" bson:\"type\"`\n}\n"
},
{
"path": "core/entity/dependency.go",
"chars": 758,
"preview": "package entity\n\nimport \"go.mongodb.org/mongo-driver/bson/primitive\"\n\ntype DependencyResult struct {\n\tName strin"
},
{
"path": "core/entity/doc.go",
"chars": 180,
"preview": "package entity\n\ntype DocItem struct {\n\tTitle string `json:\"title\"`\n\tUrl string `json:\"url\"`\n\tPath stri"
},
{
"path": "core/entity/es.go",
"chars": 1238,
"preview": "package entity\n\n/* ElasticsearchResponseData JSON format\n{\n \"took\" : 6,\n \"timed_out\" : false,\n \"_shards\" : {\n \"tot"
},
{
"path": "core/entity/event.go",
"chars": 196,
"preview": "package entity\n\ntype EventData struct {\n\tEvent string\n\tData interface{}\n}\n\nfunc (d *EventData) GetEvent() string {\n\tret"
},
{
"path": "core/entity/export.go",
"chars": 1060,
"preview": "package entity\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"time\"\n)\n\ntype Export struct {\n\tId "
},
{
"path": "core/entity/filter.go",
"chars": 1298,
"preview": "package entity\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"reflect\"\n)\n\ntype Condition struct {\n\tKey "
},
{
"path": "core/entity/filter_select_option.go",
"chars": 145,
"preview": "package entity\n\ntype FilterSelectOption struct {\n\tValue interface{} `json:\"value\" bson:\"value\"`\n\tLabel string `json"
},
{
"path": "core/entity/fs_file_info.go",
"chars": 1491,
"preview": "package entity\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"os\"\n\t\"time\"\n)\n\ntype FsFileInfo struct {\n\tN"
},
{
"path": "core/entity/git.go",
"chars": 270,
"preview": "package entity\n\ntype GitPayload struct {\n\tPaths []string `json:\"paths\"`\n\tCommitMessage string `json:\"commit_me"
},
{
"path": "core/entity/grpc_base_service_message.go",
"chars": 593,
"preview": "package entity\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/c"
},
{
"path": "core/entity/grpc_base_service_params.go",
"chars": 666,
"preview": "package entity\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/crawlab/db/mongo\"\n"
},
{
"path": "core/entity/grpc_delegate_message.go",
"chars": 755,
"preview": "package entity\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n\t\"github.com/crawlab-team/c"
},
{
"path": "core/entity/grpc_event_service_message.go",
"chars": 181,
"preview": "package entity\n\ntype GrpcEventServiceMessage struct {\n\tType string `json:\"type\"`\n\tEvents []string `json:\"events\"`\n\tK"
},
{
"path": "core/entity/grpc_subscribe.go",
"chars": 516,
"preview": "package entity\n\nimport (\n\t\"github.com/crawlab-team/crawlab/core/interfaces\"\n)\n\ntype GrpcSubscribe struct {\n\tStream int"
},
{
"path": "core/entity/http.go",
"chars": 1211,
"preview": "package entity\n\nimport \"go.mongodb.org/mongo-driver/bson/primitive\"\n\ntype Response struct {\n\tStatus string `json:\""
},
{
"path": "core/entity/model_delegate.go",
"chars": 344,
"preview": "package entity\n\nimport \"github.com/crawlab-team/crawlab/core/interfaces\"\n\ntype ModelDelegate struct {\n\tId interfac"
},
{
"path": "core/entity/model_info.go",
"chars": 144,
"preview": "package entity\n\nimport \"github.com/crawlab-team/crawlab/core/interfaces\"\n\ntype ModelInfo struct {\n\tId interfaces.Mo"
},
{
"path": "core/entity/node.go",
"chars": 423,
"preview": "package entity\n\ntype NodeInfo struct {\n\tKey string `json:\"key\"`\n\tIsMaster bool `json:\"is_master\"`\n\tName "
},
{
"path": "core/entity/notification_variable.go",
"chars": 237,
"preview": "package entity\n\nimport \"fmt\"\n\ntype NotificationVariable struct {\n\tCategory string `json:\"category\"`\n\tName string `js"
},
{
"path": "core/entity/pagination.go",
"chars": 397,
"preview": "package entity\n\nimport \"github.com/crawlab-team/crawlab/core/constants\"\n\ntype Pagination struct {\n\tPage int `form:\"page\""
},
{
"path": "core/entity/result.go",
"chars": 1801,
"preview": "package entity\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/crawlab-team/crawlab/core/constants\"\n\t\"github.com/crawlab-team/cr"
},
{
"path": "core/entity/rpc.go",
"chars": 399,
"preview": "package entity\n\ntype RpcMessage struct {\n\tId string `json:\"id\"` // 消息ID\n\tMethod string "
},
{
"path": "core/entity/sort.go",
"chars": 97,
"preview": "package entity\n\ntype Sort struct {\n\tKey string `json:\"key\"`\n\tDirection string `json:\"d\"`\n}\n"
},
{
"path": "core/entity/spider.go",
"chars": 351,
"preview": "package entity\n\ntype SpiderType struct {\n\tType string `json:\"type\" bson:\"_id\"`\n\tCount int `json:\"count\" bson:\"count\""
},
{
"path": "core/entity/stats.go",
"chars": 305,
"preview": "package entity\n\ntype StatsDailyItem struct {\n\tDate string `json:\"date\" bson:\"_id\"`\n\tTasks int64 `json:\"tasks\" bson"
},
{
"path": "core/entity/system_info.go",
"chars": 166,
"preview": "package entity\n\ntype SystemInfo struct {\n\tEdition string `json:\"edition\"` // edition. e.g. community / pro\n\tVersion stri"
},
{
"path": "core/entity/task.go",
"chars": 624,
"preview": "package entity\n\nimport (\n\t\"encoding/json\"\n\t\"go.mongodb.org/mongo-driver/bson/primitive\"\n)\n\ntype TaskMessage struct {\n\tId"
},
{
"path": "core/entity/translation.go",
"chars": 190,
"preview": "package entity\n\ntype Translation struct {\n\tLang string `json:\"lang\"`\n\tKey string `json:\"key\"`\n\tValue string `json:\"va"
},
{
"path": "core/entity/ttl_map.go",
"chars": 888,
"preview": "package entity\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\ntype TTLMap struct {\n\tTTL time.Duration\n\n\tdata sync.Map\n}\n\ntype expireEntry "
},
{
"path": "core/entity/version.go",
"chars": 469,
"preview": "package entity\n\ntype Release struct {\n\tName string `json:\"name\"`\n\tDraft bool `json:\"draft\"`\n\tPreRelease "
},
{
"path": "core/errors/base.go",
"chars": 808,
"preview": "package errors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nconst (\n\tErrorPrefixController = \"controller\"\n\tErrorPrefixModel = \"mod"
},
{
"path": "core/errors/controller.go",
"chars": 1084,
"preview": "package errors\n\nfunc NewControllerError(msg string) (err error) {\n\treturn NewError(ErrorPrefixController, msg)\n}\n\nvar Er"
},
{
"path": "core/errors/ds.go",
"chars": 663,
"preview": "package errors\n\nfunc NewDataSourceError(msg string) (err error) {\n\treturn NewError(ErrorPrefixDataSource, msg)\n}\n\nvar (\n"
},
{
"path": "core/errors/event.go",
"chars": 338,
"preview": "package errors\n\nfunc NewEventError(msg string) (err error) {\n\treturn NewError(ErrorPrefixEvent, msg)\n}\n\nvar ErrorEventNo"
},
{
"path": "core/errors/filter.go",
"chars": 252,
"preview": "package errors\n\nfunc NewFilterError(msg string) (err error) {\n\treturn NewError(ErrorPrefixFilter, msg)\n}\n\nvar ErrorFilte"
},
{
"path": "core/errors/fs.go",
"chars": 378,
"preview": "package errors\n\nfunc NewFsError(msg string) (err error) {\n\treturn NewError(ErrorPrefixFs, msg)\n}\n\nvar ErrorFsForbidden ="
},
{
"path": "core/errors/git.go",
"chars": 225,
"preview": "package errors\n\nfunc NewGitError(msg string) (err error) {\n\treturn NewError(ErrorPrefixGit, msg)\n}\n\nvar (\n\tErrorGitInval"
},
{
"path": "core/errors/grpc.go",
"chars": 914,
"preview": "package errors\n\nfunc NewGrpcError(msg string) (err error) {\n\treturn NewError(ErrorPrefixGrpc, msg)\n}\n\nvar (\n\tErrorGrpcCl"
},
{
"path": "core/errors/http.go",
"chars": 263,
"preview": "package errors\n\nfunc NewHttpError(msg string) (err error) {\n\treturn NewError(ErrorPrefixHttp, msg)\n}\n\nvar ErrorHttpBadRe"
},
{
"path": "core/errors/model.go",
"chars": 782,
"preview": "package errors\n\nimport \"errors\"\n\nfunc NewModelError(msg string) (err error) {\n\treturn NewError(ErrorPrefixModel, msg)\n}\n"
},
{
"path": "core/errors/node.go",
"chars": 571,
"preview": "package errors\n\nfunc NewNodeError(msg string) (err error) {\n\treturn NewError(ErrorPrefixNode, msg)\n}\n\nvar ErrorNodeUnreg"
},
{
"path": "core/errors/process.go",
"chars": 265,
"preview": "package errors\n\nfunc NewProcessError(msg string) (err error) {\n\treturn NewError(ErrorPrefixProcess, msg)\n}\n\nvar (\n\tError"
}
]
// ... and 566 more files (download for full content)
About this extraction
This page contains the full source code of the crawlab-team/crawlab GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 766 files (3.3 MB), approximately 911.8k tokens, and a symbol index with 5898 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.