当前位置: 首页 > news >正文

自动化创建ETX用户帐号

在芯片设计行业,ETX是常见的远程访问环境。用户在通过ETX访问远程环境前必须首先加入ETX系统,然后通过profile分配相关的环境的访问权限。

通常这些操作在ETX WEB页面手工操作,如果我们期望实现用户帐号注册全自动化,就需要将以上操作通过脚本来实现。

经过调查发现ETX提供了REST访问接口,因此帐号注册全自动化就可以实现。

主要流程如下:

在调用ETX REST接口前还需要获取ETX API的URL以及访问密钥。登录ETX后,点击右上部用户头像旁边的齿轮图标,在用户设置中选择创建 API keys即可生成ETX API访问密钥。 

 ETX登录界面左上角选择 REST API即可显示所有ETX API,点击还可查看API的详细说明和示例。

通过 Python 自动创建ETX帐号的示例代码如下:

#!/opt/miniconda3/bin/python
################################################################################
#
# Author: Shuguangbo
#
################################################################################import traceback
import logging
import logging.config
import urllib3
import requests
import jsonurllib3.disable_warnings()class userHandler():def __init__(self):self._account = ''self._userID = ''self._etxUserID = ''self.getETXGroup()...def getETXUserID(self):session = NoneuserData = dict()userID = ''account = self._accounttry:apiurl = self._config['ETX']['ETX_URL'] + f'/etx/api/v2/users?where_login={account}'session = requests.Session()header = {'Content-Type': 'application/json', 'Authorization': f"ETX {self._config['ETX']['API_KEY']}"}result = session.get(apiurl, headers=header, verify=False)if result.status_code == 200:logging.info('Get ETX user ID succeeded.')userList = json.loads(result.text)userID = userList[0]['id']self._etxUserID = userIDelse:logging.error('Get ETX user ID failed.')except Exception as e:logging.error(f"Get ETX user ID failed. error: {str(e)}, stack: {traceback.format_exc()}")finally:if session:session.close()return userIDdef getETXGroup(self):groupData = dict()session = Nonetry:apiurl = self._config['ETX']['ETX_URL'] + '/etx/api/v2/usergroups'session = requests.Session()header = {'Content-Type': 'application/json', 'Authorization': f"ETX {self._config['ETX']['API_KEY']}"}result = session.get(apiurl, headers=header, verify=False)if result.status_code == 200:logging.info('Get ETX group info succeeded.')groupList = json.loads(result.text)for group in groupList:groupData[group['name']] = groupelse:logging.error(f'Get ETX group info failed. Error: {result.text}')exit(1)except Exception as e:logging.error(f"GET ETX user group info failed. error: {str(e)}, stack: {traceback.format_exc()}")exit(1)finally:if session:session.close()self._etxGroups = groupDatadef addETXUserIntoGroup(self, userID, groupID):result = Truesession = Nonetry:apiurl = self._config['ETX']['ETX_URL'] + f'/etx/api/v2/usergroups/{groupID}/members/addbyid/{userID}'session = requests.Session()header = {'Content-Type': 'application/json', 'Authorization': f"ETX {self._config['ETX']['API_KEY']}"}result = session.post(apiurl, headers=header, verify=False)if result and result.status_code == 200:logging.info(f'Add user {userID} into ETX group {groupID} succeeded.')else:logging.error(f'Add user {userID} into ETX group {groupID} failed.')result = Falseexcept Exception as e:logging.error(f"Add ETX user into user group failed. error: {str(e)}, stack: {traceback.format_exc()}")result = Falsefinally:if session:session.close()return resultdef registerETXUser(self):EMSG = ''session = Nonetry:account = self._accountname = self._nameemail = self._emailapiurl = self._config['ETX']['ETX_URL'] + '/etx/api/v2/users'session = requests.Session()header = {'Content-Type': 'application/json', 'Authorization': f"ETX {self._config['ETX']['API_KEY']}"}data = {'login': account, 'name': name, 'email': email, 'role':{'name':'User'}}result = session.post(apiurl, headers=header, data=json.dumps(data), verify=False)if result and result.status_code == 200:userData = json.loads(result.text)self._etxUserID = userData['id']logging.info(f'Register ETX user {account} succeeded. User id: {userData["id"]}')else:logging.error(f'Register ETX user {account} failed. Error: {result.text}')EMSG = f"Register ETX user {account} failed."except Exception as e:logging.error(f"Register ETX user {account} failed. Error: {str(e)}")EMSG = f"Register ETX user {account} failed."finally:if session:session.close()return EMSGdef addETXUser(self):EMSG = ''try:user = self._accountret = self._registerETXUser()if len(ret):EMSG += retreturn EMSGuserID = self._etxUserIDif len(userID) == 0:EMSG = "ETX user id is invalid.\n"return EMSGetxgroup = self._config['ETX']['DEFAULT_GROUP']                     groupID = self._etxGroups[etxgroup]['id']ret = self.addETXUserIntoGroup(userID, groupID)if not ret:EMSG += f'Failed to add ETX profile for {user} .\n'             except Exception as e:logging.error(f"Add ETX User profile failed. error: {str(e)}, stack: {traceback.format_exc()}"EMSG += "Add ETX User profile failed.\n"return EMSG

相关文章:

自动化创建ETX用户帐号

在芯片设计行业,ETX是常见的远程访问环境。用户在通过ETX访问远程环境前必须首先加入ETX系统,然后通过profile分配相关的环境的访问权限。 通常这些操作在ETX WEB页面手工操作,如果我们期望实现用户帐号注册全自动化,就需要将以上…...

Android 实现集合去重的方法

方法一&#xff1a;使用HashSet 将集合转换为HashSet。 Set<String> set new HashSet<>(list);将HashSet转换回List。 List<String> uniqueList new ArrayList<>(set);方法二&#xff1a;使用Java 8的Stream API 将列表转换为Stream。 Stream&l…...

【Vue3】2-12 : 【案例】搜索关键词加筛选条件的综合

本书目录&#xff1a;点击进入 一、【案例】搜索关键词加筛选条件的综合 1.1、逻辑 1.2、效果 1.3、json数据 - 02-data.json 1.4、代码 一、【案例】搜索关键词加筛选条件的综合 1.1、逻辑 计算属性 - 绑定list&#xff0c;并过滤 input 双向绑定 - 当input改变时&…...

unity小程序websocket:nginx配置https (wss)转http (ws)及其他问题解决

目录 前言 实际运用场景 处理流程如下 nginx配置ssl和wss 配置过程中遇到的问题 1、无法连接服务器 2、通过IP可以访问&#xff0c;域名却不行 问题描述 解决 3、如何判断该域名是否备案了 前言 为了服务器网络的通用性&#xff0c;我们在实现移动端的游戏转微信小程序…...

MySql数据库对接Orcal数据库,需要考虑的前提问题

1.主表 从表的表关系&#xff1b;主键id 的关联问题&#xff1b; 2.字段类型的一致性问题&#xff08;备注&#xff1a;像varchar类型的一点要谨防数据过长抛错&#xff09;&#xff1b; 3.实体类字段两表一致性问题&#xff1b; 4.入表不为空问题&#xff0c;判空尽量在实体…...

K8S的存储卷---数据卷

容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的。delete&#xff0c;K8S用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态。一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器和节点之间创建一个…...

【量化交易故事】小明开启了量化创业之旅-01

故事开始于2023年的春天&#xff0c;小明是一位对金融市场充满热情的IT工程师。在经历了数次基于主观判断和个人情绪进行投资却收获平平后&#xff0c;他意识到传统交易方式中的人为因素难以避免&#xff0c;而这往往成为影响投资决策稳定性和准确性的关键障碍。在一次偶然的机…...

ffmpeg写YUV420文件碰到阶梯型横线或者条纹状画面的原因和解决办法

版权声明&#xff1a;本文为CSDN博主「文三~」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/asdasfdgdhh/article/details/112831581 看到了&#xff0c;转载&#xff0c;留着备份…...

案例:新闻数据加载

文章目录 介绍相关概念相关权限约束与限制完整示例 代码结构解读构建主界面数据请求下拉刷新总结 介绍 本篇Codelab是基于ArkTS的声明式开发范式实现的样例&#xff0c;主要介绍了数据请求和touch事件的使用。包含以下功能&#xff1a; 数据请求。列表下拉刷新。列表上拉加载…...

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…...

补充 vue3用户管理权限(路由控制)

之前有人问我 &#xff0c;如果是二级路由如何添加&#xff0c;这里我做一个补充吧。直接拿方法去用就行。也不做解释了。稍微看下就能看懂了 假设&#xff0c;后端返回给我们一个数据 [“/defa”,"/defa/defa1"] 这样的一个路由表&#xff0c;我们就需要通过这个路…...

C++ 深度优先搜索DFS || 模版题:排列数字

给定一个整数 n &#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n 。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据范围 1…...

计算机找不到msvcp120.dll如何解决?总结五个可靠的教程

在计算机使用过程中&#xff0c;遇到“找不到msvcp120.dll”这一问题常常令人困扰。msvcp120.dll作为Windows系统中至关重要的动态链接库文件&#xff0c;对于许多应用程序的正常运行起着不可或缺的作用。那么&#xff0c;究竟是什么原因导致找不到msvcp120.dll呢&#xff1f;又…...

法线变换矩阵的推导

背景 在冯氏光照模型中&#xff0c;其中的漫反射项需要我们对法向量和光线做点乘计算。 从顶点着色器中读入的法向量数据处于模型空间&#xff0c;我们需要将法向量转换到世界空间&#xff0c;然后在世界空间中让法向量和光线做运算。这里便有一个问题&#xff0c;如何将法线…...

React.Children.map 和 js 的 map 有什么区别?

JavaScript 中的 map 不会对为 null 或者 undefined 的数据进行处理&#xff0c;而 React.Children.map 中的 map 可以处理 React.Children 为 null 或者 undefined 的情况。 React 空节点&#xff1a;可以由null、undefined、false、true创建 import React from reactexport …...

13.Kubernetes部署Go应用完整流程:从Dockerfile到Ingress发布完整流程

本文以一个简单的Go应用Demo来演示Kubernetes应用部署的完整流程 1、Dockerfile多阶段构建 Dockerfile多阶段构建 [root@docker github]# git clone https://gitee.com/yxydde/http-dump.git [root@docker github]# cd http-dump/ [root@docker http-dump]# cat Dockerfile …...

叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案

叉车车载终端是一款专为叉车车载场景设计的4英寸Android车载平板电脑。它采用了高能低耗的8核ARM架构处理器和交互开放的Android 12操作系统&#xff0c;算力表现强大。此外&#xff0c;该产品还具备丰富的Wi-Fi-5、4G LTE和蓝牙等通讯功能&#xff0c;可选配外部车载蘑菇天线&…...

【CSS】保持元素宽高比

保持元素的宽高比&#xff0c;在视频或图片展示类页面是一个重要功能。 本文介绍其常规的实现方法。 实现效果 当浏览器视口发生变化时&#xff0c;元素的尺寸随之变化&#xff0c;且宽高比不变。 代码实现 我们用最简单的元素结构来演示&#xff0c;实现宽高比为4&#xf…...

使用 Docker 和 Diffusers 快速上手 Stable Video Diffusion 图生视频大模型

本篇文章聊聊&#xff0c;如何快速上手 Stable Video Diffusion (SVD) 图生视频大模型。 写在前面 月底计划在机器之心的“AI技术论坛”做关于使用开源模型 “Stable Diffusion 模型” 做有趣视频的实战分享。 因为会议分享时间有限&#xff0c;和之前一样&#xff0c;比较简…...

C++ namespace高级用法

高级用法 C++中的命名空间(namespace)是一种用于组织代码的机制,它可以帮助避免命名冲突,并使代码更加清晰和易于维护。以下是C++命名空间的一些高级用法: 嵌套命名空间:命名空间可以嵌套在其他命名空间中,形成一个层次结构。嵌套命名空间可以进一步细化命名空间,使其更…...

从MATLAB验证到FPGA上板:双频信号叠加的完整开发闭环实战

从MATLAB验证到FPGA上板&#xff1a;双频信号叠加的完整开发闭环实战 在数字信号处理领域&#xff0c;实现双频信号的精确叠加是一个常见但极具挑战性的任务。无论是通信系统中的载波调制&#xff0c;还是音频处理中的音效合成&#xff0c;都需要工程师能够准确地在硬件层面实现…...

Qwen3.5-2B轻量化技术解析:模型剪枝+KV Cache优化如何降低70%显存占用

Qwen3.5-2B轻量化技术解析&#xff1a;模型剪枝KV Cache优化如何降低70%显存占用 1. 轻量化模型的核心价值 在AI模型部署领域&#xff0c;大模型的资源消耗一直是阻碍其广泛应用的瓶颈。Qwen3.5-2B作为一款仅20亿参数的多模态基础模型&#xff0c;通过创新的轻量化技术实现了…...

Gemma-3 Pixel Studio一文详解:Flash Attention 2对图文响应速度提升实测

Gemma-3 Pixel Studio一文详解&#xff1a;Flash Attention 2对图文响应速度提升实测 1. 引言 在当今多模态AI应用快速发展的背景下&#xff0c;Gemma-3 Pixel Studio作为一款基于Google最新开源Gemma-3-12b-it模型构建的高性能对话终端&#xff0c;凭借其卓越的视觉理解能力…...

智能影像雅鉴系统:丹青识画在美术馆导览中的落地实操

智能影像雅鉴系统&#xff1a;丹青识画在美术馆导览中的落地实操 1. 艺术与科技的完美融合 1.1 传统导览的痛点与革新 在美术馆参观时&#xff0c;我们常常面临这样的困境&#xff1a;站在一幅名画前&#xff0c;却无法真正理解其深层意境&#xff1b;面对珍贵文物&#xff…...

工业视觉检测避坑指南:CogBlobTool阈值设置5大常见错误及解决方案

工业视觉检测避坑指南&#xff1a;CogBlobTool阈值设置5大常见错误及解决方案 在工业视觉检测领域&#xff0c;斑点检测&#xff08;Blob Analysis&#xff09;是最基础也最关键的环节之一。作为Cognex VisionPro套件中的核心工具&#xff0c;CogBlobTool凭借其强大的图像分割能…...

stealth.js全解析:40+反检测补丁的配置与优化技巧

Stealth.js全解析&#xff1a;40反检测补丁的配置与优化技巧 在当今的Web自动化领域&#xff0c;反检测技术已成为开发者必须掌握的核心技能之一。无论是数据采集、自动化测试还是其他需要模拟真实用户行为的场景&#xff0c;如何让脚本"隐形"都是决定成败的关键因素…...

Step3-VL-10B内网穿透应用:安全远程模型调用方案

Step3-VL-10B内网穿透应用&#xff1a;安全远程模型调用方案 1. 场景需求与痛点分析 很多企业和机构在内部部署了强大的多模态AI模型&#xff0c;比如Step3-VL-10B这样的视觉语言模型&#xff0c;能够处理图像和文本的复杂任务。但这些模型通常运行在内网环境中&#xff0c;外…...

VideoAgentTrek Screen Filter 大规模部署成本分析:GPU资源优化配置指南

VideoAgentTrek Screen Filter 大规模部署成本分析&#xff1a;GPU资源优化配置指南 最近和几个做视频内容审核的朋友聊天&#xff0c;大家聊得最多的不是技术有多牛&#xff0c;而是“这玩意儿跑起来到底要花多少钱”。确实&#xff0c;像VideoAgentTrek Screen Filter这类视…...

LeetCode 热题 100 之 131. 分割回文串 51. N 皇后

131. 分割回文串 51. N 皇后 131. 分割回文串 class Solution {public List<List<String>> partition(String s) {List<List<String>> res new ArrayList<>();List<String> path new ArrayList<>();backtrack(s, 0, path, res);re…...

JMeter vs Claude Code:从“约束系统“到“解放系统“的工程设计范式跃迁

当你还在用 JMeter 写线程组的时候&#xff0c;Claude Code 已经在用自然语言编排测试工作流了。这不是工具的迭代&#xff0c;是工程设计范式的代际更替。前言&#xff1a;两代工程设计哲学的碰撞 2026 年&#xff0c;AI 编程工具已经从"代码生成器"进化为"自主…...