{"id":19748438,"url":"https://github.com/jumpserver/applets","last_synced_at":"2025-04-30T08:33:28.971Z","repository":{"id":69414295,"uuid":"556582614","full_name":"jumpserver/applets","owner":"jumpserver","description":"JumpServer Applet Demo Project","archived":false,"fork":false,"pushed_at":"2024-04-22T12:16:16.000Z","size":113,"stargazers_count":11,"open_issues_count":1,"forks_count":3,"subscribers_count":7,"default_branch":"dev","last_synced_at":"2024-04-22T13:04:07.030Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jumpserver.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-10-24T05:54:32.000Z","updated_at":"2024-04-26T05:27:48.544Z","dependencies_parsed_at":null,"dependency_job_id":"fd428dc7-1201-43a7-9ed9-95c245fcc647","html_url":"https://github.com/jumpserver/applets","commit_stats":{"total_commits":77,"total_committers":5,"mean_commits":15.4,"dds":0.6103896103896104,"last_synced_commit":"7eff72541c747230537f9d1e58e4fcb0ea4a7e1d"},"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumpserver%2Fapplets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumpserver%2Fapplets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumpserver%2Fapplets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jumpserver%2Fapplets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jumpserver","download_url":"https://codeload.github.com/jumpserver/applets/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223905529,"owners_count":17222915,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T02:21:49.536Z","updated_at":"2024-11-12T02:21:50.155Z","avatar_url":"https://github.com/jumpserver.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JumpServer Remote Applets DEMO\n\n## 开发说明\n\nApplet 是一个包含 python 脚本的目录：\n```\n├── app.py\n├── build.yml\n├── common.py\n├── icon.png\n├── main.py\n├── manifest.yml\n├── platform.yml\n├── README.md\n├── patch.yml\n└── setup.yml\n```\n\n各文件介绍：\n- app.py 是 applet 的主程序\n- build.yml 是 applet 依赖的外部部署文件，比如安装包 msi、exe\n- common.py 是 applet 的通用模块\n- icon.png 是 applet 的图标\n- main.py 是 applet 启动入口文件\n- manifest.yml 是 applet 的元数据，导入到 JumpServer 中会使用\n- platform.yml 是 applet 配套平台的设置，安装时自动创建该平台\n- README.md 是 applet 的说明文档\n- patch.yml 是 applet 的补丁文件，一些应用需要额外的初始化操作，比如激活、修改配置文件等可以先通过补丁文件 msi、exe 实现\n- setup.yml 是描述 applet 如何在 发布机上部署安装的文件\n\n### 入口 app.py\n\napp.py 是 applet 的主程序，定义了 app 启用时的启动命令、参数、自动化操作等。比如需要处理账号密码的填写，页面按钮的点击等，可以在这里定义。\n\n### 依赖 build.yml\n\nbuild.yml 定义了 applet 依赖的外部部署文件，比如安装包 msi、exe。在构建应用时，会自动下载 build.yml 中定义的文件。\n\n```\nsource_url: https://jms-pkg.oss-cn-beijing.aliyuncs.com/windows-pkgs/mysql-workbench-community-8.0.31-winx64.msi\nsource_md5: d3641c423f00f0aa6f258ff116778e1b\n```\n\n### 通用模块 common.py\n\ncommon.py 是 applet 的通用模块，与 JumpServer 数据相关的抽象。\n\n### 元数据 manifest.yml\n\nmanifest.yml 定义了 applet 的元数据，如名称、作者、版本、支持的协议。\n\n```\nname: mysql_workbench8 （required）\ndisplay_name: MySQL Workbench8\ncomment: A tool for working with MySQL, to execute SQL and design tables (required）\nversion: 0.1 (required）\nexec_type: python (reserved，暂未使用)\nauthor: Eric (required）\ntype: general (required）\nupdate_policy: none (暂未使用)\ntags: (required）\n  - database\nprotocols: (required）\n  - mysql\n```\n\n字段说明：\n- name：名称最好是字母数字，不要包含特殊字符\n- protocols：此 applet 脚本支持的协议\n- tags：一些标签\n- type: 主要是 general 或 web\n\n### 安装条件 setup.yml\n\nsetup.yml 定义了 applet 程序的安装方式，如果定义了 build.yml，会自动下载 build.yml 中定义的文件然后重命名为 source 定义的名称。\n```\ntype: msi # exe, zip, manual\nsource: mysql-workbench-community-8.0.31-winx64.msi\narguments:\n  - /qn\n  - /norestart\ndestination: C:\\Program Files\\MySQL\\MySQL Workbench 8.0 CE\nprogram: C:\\Program Files\\MySQL\\MySQL Workbench 8.0 CE\\MySQLWorkbench.exe\nmd5: d628190252133c06dad399657666974a\n\n```\n字段说明：\n- type 是软件安装的方式\n    - msi 安装软件\n    - exe 安装软件\n    - zip 解压安装方式\n    - manual 手动安装方式\n- source 是软件下载地址\n- arguments msi 或者 exe 安装程序需要的参数，使用静默安装\n- destination 程序安装目录地址\n- program 具体的软件地址\n- md5 是 program 软件的 md5 值，主要用于校验安装是否成功\n\n如果选择 manual 的方式，source等保持为空，可不校验 MD5 值，需要手动登录 applet host 发布机上安装软件\n\n### 脚本执行 main.py\n\nmain.py 是 python 脚本主程序。JumpServer 的 Remoteapp 程序 tinker 将通过调用 `python main.py $base64_json_data` 的方式执行。\n\nbase64_json_data 是 JSON 数据进行 base64 之后的字符串，包含资产、账号等认证信息。数据格式大致如下，依据 api 变化做相应调整：\n\n```\n{\n  \"app_name\": \"mysql_workbench8\",\n  \"protocol\": \"mysql\",\n  \"user\": {\n    \"id\": \"2647CA35-5CAD-4DDF-8A88-6BD88F39BB30\",\n    \"name\": \"Administrator\",\n    \"username\": \"admin\"\n  },\n  \"asset\": {\n    \"asset_id\": \"46EE5F50-F1C1-468C-97EE-560E3436754C\",\n    \"asset_name\": \"test_mysql\",\n    \"address\": \"192.168.1.1\",\n    \"protocols\": [\n      {\n        \"id\": 2,\n        \"name\": \"mysql\",\n        \"port\": 3306\n      }\n    ]\n  },\n  \"account\": {\n    \"account_id\": \"9D5585DE-5132-458C-AABE-89A83C112A83\",\n    \"username\": \"root\",\n    \"secret\": \"test\"\n  },\n  \"platform\": {\n    \"charset\": \"UTF-8\"\n  }\n}\n```\n\nbase64_json_data 的具体获取可以[参考文档](https://bbs.fit2cloud.com/t/topic/339)\n\n### 自定义平台和协议 platform.yml\n可参考 [查看这个](https://github.com/jumpserver/applets/blob/master/mysql_workbench8/platform.yml)，这个文件不是必须的，需要配套平台或者自定义协议时需要\n\n```\n# 该文件是添加 applet 时，同步添加的 platform\n# 该 platform 必须是 custom 类别，支持自定义协议 和 自定义字段\n#\n# 平台名称: 需要唯一，所以开发者取名时要多注意 \nname: MySQLWorkbench\n# 类别: 必须是 custom\ncategory: custom\n# 类型: 可以自定义\ntype: DB\n# 备注: 平台备注\ncomment: 自定义 MySQLWorkbench\n# 支持的协议: 这个很关键，这里支持自定义协议\nprotocols:\n  - name: mysqlworkbench\n    port: 0\n    primary: true\n# 自定义字段：设置这个后，添加资产时，需要填写，applet 开发时，会在 资产的 info 中体现\ncustom_fields:\n  - name: db_name   # 字段名，存数据库时使用\n    label: \"{{ 'DB Name' | trans }}\"    # 字段标签， 添加时，在页面上显示\n    default: mysql  # 默认值\n    type: str       # 类型，支持 str, int, bool, choice, text, list 类型，如果是 choice，需要有 choices 字段\n    help_text: ”{{ 'Please select a database' | trans }}“   # 帮助说明内容\n  \n  - name: ip\n    label: IP\n    type: str\n    default: 127.0.0.1\n\n  - name: port\n    label: \"{{ 'Port' | trans }}\"\n    type: int\n    default: 3306 \n\n  - name: username\n    label: \"{{ 'Username' | trans }}\"\n    type: str\n    default: root\n\n  - name: password\n    label: \"{{ 'Password' | trans }}\"\n    type: str\n  \ni18n:\n  DB Name:\n    zh: 数据库\n    ja: データベース\n  Please select a database:\n    zh: 请选择数据库\n    ja: データベースを選択してください\n  Port:\n    zh: 端口\n    ja: ポート\n  Username:\n    zh: 用户名\n    ja: ユーザー名\n  Password:\n    zh: 密码\n    ja: パスワード\n\n```\n\n\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjumpserver%2Fapplets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjumpserver%2Fapplets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjumpserver%2Fapplets/lists"}