Merge branch 'v3' of github.com:jumpserver/lina into v3

This commit is contained in:
ibuler 2022-10-27 20:00:04 +08:00
commit 32ec05e04c
8 changed files with 247 additions and 440 deletions

View File

@ -18,8 +18,8 @@
"created_by": "Created by", "created_by": "Created by",
"asset": "Asset", "asset": "Asset",
"system_user": "System user", "system_user": "System user",
"username_group":"Username group", "username_group": "Username group",
"hostname_group":"Hostname group", "hostname_group": "Hostname group",
"asset_ip_group": "Asset ip group", "asset_ip_group": "Asset ip group",
"system_users_name_group": "Systemuser name", "system_users_name_group": "Systemuser name",
"system_users_protocol_group": "Systemuser protocol", "system_users_protocol_group": "Systemuser protocol",
@ -40,8 +40,8 @@
"applicationsType": { "applicationsType": {
"chrome": "Chrome", "chrome": "Chrome",
"mysql_workbench": "MySQL Workbench", "mysql_workbench": "MySQL Workbench",
"vmware_client":"Vmware Client", "vmware_client": "Vmware Client",
"custom":"Custom", "custom": "Custom",
"mysql": "MySQL", "mysql": "MySQL",
"oracle": "Oracle", "oracle": "Oracle",
"postgresql": "PostgreSQL", "postgresql": "PostgreSQL",
@ -86,7 +86,7 @@
"custom_password": "Password", "custom_password": "Password",
"Custom": "Custom", "Custom": "Custom",
"cluster": "Cluster", "cluster": "Cluster",
"kubernetes":"Kubernetes", "kubernetes": "Kubernetes",
"clusterHelpTextMessage": "Tips: https://172.16.8.8:8443", "clusterHelpTextMessage": "Tips: https://172.16.8.8:8443",
"DBInfo": "Database Info", "DBInfo": "Database Info",
"RDBProtocol": "RDS Protocol", "RDBProtocol": "RDS Protocol",
@ -114,7 +114,7 @@
"Action": "Action", "Action": "Action",
"ActiveSelected": "Active selected", "ActiveSelected": "Active selected",
"AdminUser": "Admin user", "AdminUser": "Admin user",
"ReplaceNodeAssetsAdminUser":"Replace node assets admin user with this", "ReplaceNodeAssetsAdminUser": "Replace node assets admin user with this",
"AdminUserDetail": "Admin user detail", "AdminUserDetail": "Admin user detail",
"DynamicUsername": "Dynamic username", "DynamicUsername": "Dynamic username",
"AdminUserListHelpMessage": "Admin users are asset (charged server) on the root, or have NOPASSWD: ALL sudo permissions users, JumpServer users of the system using the user to `push system user`, `get assets hardware information`, etc.\n", "AdminUserListHelpMessage": "Admin users are asset (charged server) on the root, or have NOPASSWD: ALL sudo permissions users, JumpServer users of the system using the user to `push system user`, `get assets hardware information`, etc.\n",
@ -130,7 +130,7 @@
"AssetListHelpMessage": "The left side is the asset tree, right click to create, delete, and change the tree node, authorization asset is also organized as a node, and the right side is the asset under that node\n", "AssetListHelpMessage": "The left side is the asset tree, right click to create, delete, and change the tree node, authorization asset is also organized as a node, and the right side is the asset under that node\n",
"AssetNumber": "Asset number", "AssetNumber": "Asset number",
"AssetUserList": "Asset user list", "AssetUserList": "Asset user list",
"TestGatewayTestConnection":"Test gateway test connection", "TestGatewayTestConnection": "Test gateway test connection",
"TestGatewayHelpMessage": "If use nat, set the ssh real port", "TestGatewayHelpMessage": "If use nat, set the ssh real port",
"SshPort": "SSH Port", "SshPort": "SSH Port",
"Assets": "Assets", "Assets": "Assets",
@ -304,18 +304,18 @@
"ConnectWebSocketError": "Connect Websocket failed", "ConnectWebSocketError": "Connect Websocket failed",
"Nothing": "Nothing", "Nothing": "Nothing",
"Action": "Action", "Action": "Action",
"CustomCol":"Custom table col", "CustomCol": "Custom table col",
"RequestTickets": "Request tickets", "RequestTickets": "Request tickets",
"Actions": "Actions", "Actions": "Actions",
"NeedSpecifiedFile": "Required to upload the specified format file", "NeedSpecifiedFile": "Required to upload the specified format file",
"TestPortErrorMsg":"Port Error, please check", "TestPortErrorMsg": "Port Error, please check",
"Activate": "Activate", "Activate": "Activate",
"actionsTips":"Clipboard's copy and paste control only support RDP/VNC protocol.", "actionsTips": "Clipboard's copy and paste control only support RDP/VNC protocol.",
"Active": "Active", "Active": "Active",
"TableColSettingInfo": "Please select the list details you want to display", "TableColSettingInfo": "Please select the list details you want to display",
"Add": "Add", "Add": "Add",
"PleaseAgreeToTheTerms": "Please agree to the terms", "PleaseAgreeToTheTerms": "Please agree to the terms",
"PushSelected":"Push selected", "PushSelected": "Push selected",
"PushSelectedSystemUsersToAsset": "Push selected system users to asset", "PushSelectedSystemUsersToAsset": "Push selected system users to asset",
"TestSelected": "Test selected", "TestSelected": "Test selected",
"TestSelectedSystemUsersConnective": "Test selected system users connective", "TestSelectedSystemUsersConnective": "Test selected system users connective",
@ -388,7 +388,7 @@
"Show": "Show", "Show": "Show",
"Submit": "Submit", "Submit": "Submit",
"Test": "Test", "Test": "Test",
"SaveAndAddAnother":"Save and add another", "SaveAndAddAnother": "Save and add another",
"TestSuccessMsg": "Test Success", "TestSuccessMsg": "Test Success",
"To": "To", "To": "To",
"Update": "Update", "Update": "Update",
@ -627,7 +627,11 @@
"versionDetail": "Version detail", "versionDetail": "Version detail",
"versionRunExecution": "Version run execution", "versionRunExecution": "Version run execution",
"Unkown": "Unkown", "Unkown": "Unkown",
"Unknown": "Unknown" "Unknown": "Unknown",
"PENDING": "Pending",
"RUNNING": "Running",
"SUCCESS": "Success",
"FAILURE": "Failure"
}, },
"perms": { "perms": {
"": "", "": "",
@ -657,7 +661,7 @@
"addUserGroupToThisPermission": "Add user group to this permission", "addUserGroupToThisPermission": "Add user group to this permission",
"addUserToThisPermission": "Add user to this permission", "addUserToThisPermission": "Add user to this permission",
"all": "All", "all": "All",
"PermName":"Perm name", "PermName": "Perm name",
"assetAndNode": "Assets and node", "assetAndNode": "Assets and node",
"assetCount": "Asset count", "assetCount": "Asset count",
"connect": "Connect", "connect": "Connect",
@ -676,15 +680,15 @@
"remoteApp": "RemoteApp", "remoteApp": "RemoteApp",
"remoteAppCount": "RemoteApp count", "remoteAppCount": "RemoteApp count",
"appsCount": "App count", "appsCount": "App count",
"appsList":"App list", "appsList": "App list",
"DatabaseAppCount": "DatabaseApp count", "DatabaseAppCount": "DatabaseApp count",
"KubernetesAppCount": "KubernetesApp count", "KubernetesAppCount": "KubernetesApp count",
"systemUserCount": "System user count", "systemUserCount": "System user count",
"upDownload": "Upload download", "upDownload": "Upload download",
"uploadFile": "Upload file", "uploadFile": "Upload file",
"clipboardCopyPaste":"Copy Paste", "clipboardCopyPaste": "Copy Paste",
"clipboardCopy":"Clipboard copy", "clipboardCopy": "Clipboard copy",
"clipboardPaste":"Clipboard paste", "clipboardPaste": "Clipboard paste",
"userCount": "User count", "userCount": "User count",
"userGroupCount": "User group count", "userGroupCount": "User group count",
"usersAndUserGroups": "Users and user groups" "usersAndUserGroups": "Users and user groups"
@ -929,7 +933,7 @@
"TerminateTaskSendSuccessMsg": "Terminate task has been send, Please check later", "TerminateTaskSendSuccessMsg": "Terminate task has been send, Please check later",
"helpText": { "helpText": {
"esUrl": "Tip: If you have multiple hosts, use comma (, ) to split (eg: http://www.jumpserver.a.com, http://www.jumpserver.b.com)", "esUrl": "Tip: If you have multiple hosts, use comma (, ) to split (eg: http://www.jumpserver.a.com, http://www.jumpserver.b.com)",
"esIndex":"Es provides the default index: jumpserver. If you choose to build an index by date, this blank is the index prefix", "esIndex": "Es provides the default index: jumpserver. If you choose to build an index by date, this blank is the index prefix",
"esDocType": "Es provides the default document type: command" "esDocType": "Es provides the default document type: command"
} }
}, },
@ -1106,7 +1110,7 @@
"userGuideUrl": "User Guide URL", "userGuideUrl": "User Guide URL",
"username": "Username", "username": "Username",
"usernamePlaceholder": "Please input username", "usernamePlaceholder": "Please input username",
"refreshLdapCache":"Refreshing Ldap cache ", "refreshLdapCache": "Refreshing Ldap cache ",
"LicenseExpired": "License expired", "LicenseExpired": "License expired",
"LicenseWillBe": "License will expire at ", "LicenseWillBe": "License will expire at ",
"LicenseReachedAssetAmountLimit": "The number of assets has exceeded the license limit", "LicenseReachedAssetAmountLimit": "The number of assets has exceeded the license limit",
@ -1128,16 +1132,16 @@
"ApprovalProcess": "Approval process", "ApprovalProcess": "Approval process",
"LevelApproval": "Level approval", "LevelApproval": "Level approval",
"Assignee": "Assignee", "Assignee": "Assignee",
"RequestPerm":"Request Perm", "RequestPerm": "Request Perm",
"AssignedInfo":"Assigned Info", "AssignedInfo": "Assigned Info",
"OpenTicket": "Open Ticket", "OpenTicket": "Open Ticket",
"HandleTicket": "Handle Ticket", "HandleTicket": "Handle Ticket",
"FinishedTicket": "Finished Ticket", "FinishedTicket": "Finished Ticket",
"CheckViewAcceptor": "Click to view the acceptor", "CheckViewAcceptor": "Click to view the acceptor",
"Assignees": "Assignees", "Assignees": "Assignees",
"Close": "Close", "Close": "Close",
"OpenStatus":"Open", "OpenStatus": "Open",
"CloseStatus":"Close", "CloseStatus": "Close",
"Comment": "Comment", "Comment": "Comment",
"MyTickets": "My tickets", "MyTickets": "My tickets",
"action": "Action", "action": "Action",
@ -1151,7 +1155,7 @@
"user": "User", "user": "User",
"Status": "Status", "Status": "Status",
"Open": "Open", "Open": "Open",
"OrgName":"Org name", "OrgName": "Org name",
"IP": "IP", "IP": "IP",
"Hostname": "Hostname", "Hostname": "Hostname",
"Asset": "Asset", "Asset": "Asset",
@ -1199,7 +1203,7 @@
"AuthSettings": "Auth settings", "AuthSettings": "Auth settings",
"UserName": "Name", "UserName": "Name",
"Account": "Account", "Account": "Account",
"Existing":"Existing", "Existing": "Existing",
"AccountInformation": "Account information", "AccountInformation": "Account information",
"PersonalSetting": "Personal setting", "PersonalSetting": "Personal setting",
"Authentication": "Account", "Authentication": "Account",
@ -1228,7 +1232,6 @@
"OrgUser": "Org User", "OrgUser": "Org User",
"OrgAdmin": "Org Admin", "OrgAdmin": "Org Admin",
"OrgAuditor": "Org Auditor", "OrgAuditor": "Org Auditor",
"HelpText": { "HelpText": {
"MFAOfUserFirstLoginPersonalInformationImprovementPage": "Enable multi-factor authentication to make the account more secure <br/> After is enabled, you will enter the multi-factor authentication binding process on your next login <br/> You can also bind directly in (personal information -> fast modifier -> modifier multiple factor Settings)", "MFAOfUserFirstLoginPersonalInformationImprovementPage": "Enable multi-factor authentication to make the account more secure <br/> After is enabled, you will enter the multi-factor authentication binding process on your next login <br/> You can also bind directly in (personal information -> fast modifier -> modifier multiple factor Settings)",
"MFAOfUserFirstLoginUserGuidePage": "To protect the security of you and the company <br/> please properly keep your account, password, key and other important and sensitive information <br/> (e.g., set a complex password and enable multi-factor authentication)", "MFAOfUserFirstLoginUserGuidePage": "To protect the security of you and the company <br/> please properly keep your account, password, key and other important and sensitive information <br/> (e.g., set a complex password and enable multi-factor authentication)",
@ -1291,7 +1294,7 @@
"databasePermissionRules": "Database Permission rules", "databasePermissionRules": "Database Permission rules",
"k8sPermissionRules": "Kubernetes Permission rules", "k8sPermissionRules": "Kubernetes Permission rules",
"grantedAssets": "Granted assets", "grantedAssets": "Granted assets",
"grantedK8Ss":"Granted K8Ss", "grantedK8Ss": "Granted K8Ss",
"grantedDatabases": "Granted databases", "grantedDatabases": "Granted databases",
"grantedRemoteApps": "Granted remote apps", "grantedRemoteApps": "Granted remote apps",
"grantedApplications": "Granted applications", "grantedApplications": "Granted applications",
@ -1425,7 +1428,7 @@
"HuaweiCloud": "Huawei Cloud", "HuaweiCloud": "Huawei Cloud",
"BaiduCloud": "Baidu Cloud", "BaiduCloud": "Baidu Cloud",
"JDCloud": "JD Cloud", "JDCloud": "JD Cloud",
"Azure":"Azure(China)", "Azure": "Azure(China)",
"Azure_Int": "Azure(International)", "Azure_Int": "Azure(International)",
"HostnameStrategy": "Used to produce the asset hostname. For example, 1. Instance name (instanceDemo)2. Instance name and Partial IP (instanceDemo-250.1)", "HostnameStrategy": "Used to produce the asset hostname. For example, 1. Instance name (instanceDemo)2. Instance name and Partial IP (instanceDemo-250.1)",
"IsAlwaysUpdate": "Asset info is kept up-to-date", "IsAlwaysUpdate": "Asset info is kept up-to-date",
@ -1447,20 +1450,20 @@
"CloudSource": "Cloud source", "CloudSource": "Cloud source",
"SaveSetting": "Save setting", "SaveSetting": "Save setting",
"Name": "Name", "Name": "Name",
"Account":"Account", "Account": "Account",
"Node": "Node", "Node": "Node",
"WindowsAdminUser":"Windows Admin user", "WindowsAdminUser": "Windows Admin user",
"LinuxAdminUser":"Linux Admin user", "LinuxAdminUser": "Linux Admin user",
"PeriodicPerform":"Periodic perform", "PeriodicPerform": "Periodic perform",
"Periodic":"Periodic", "Periodic": "Periodic",
"RegularlyPerform": "Regularly perform", "RegularlyPerform": "Regularly perform",
"CyclePerform": "Cycle perform", "CyclePerform": "Cycle perform",
"DateLastSync":"Date last sync", "DateLastSync": "Date last sync",
"DateCreated":"Date created", "DateCreated": "Date created",
"Region": "Region", "Region": "Region",
"RunTaskManually":"Run task manually", "RunTaskManually": "Run task manually",
"Comment": "Comment", "Comment": "Comment",
"True":"True", "True": "True",
"False": "False", "False": "False",
"NewCount": "New count", "NewCount": "New count",
"UnSyncCount": "Unsync count", "UnSyncCount": "Unsync count",
@ -1494,11 +1497,11 @@
"Endpoint": "Endpoint", "Endpoint": "Endpoint",
"EndpointRule": "Endpoint rule", "EndpointRule": "Endpoint rule",
"ServiceRatio": "Service ratio", "ServiceRatio": "Service ratio",
"LoadStatus":"Status", "LoadStatus": "Status",
"NormalLoad":"Normal", "NormalLoad": "Normal",
"HighLoad":"High", "HighLoad": "High",
"Offline": "Offline", "Offline": "Offline",
"CriticalLoad":"Critical", "CriticalLoad": "Critical",
"LicenseFile": "License file", "LicenseFile": "License file",
"NoLicense": "No License", "NoLicense": "No License",
"Node": "Node", "Node": "Node",
@ -1510,8 +1513,8 @@
"OrganizationList": "Organizations", "OrganizationList": "Organizations",
"OrganizationUpdate": "Update org", "OrganizationUpdate": "Update org",
"OrganizationMembership": "Organization membership", "OrganizationMembership": "Organization membership",
"DeleteOrgTitle":"Please ensure that the following information in the organization has been deleted", "DeleteOrgTitle": "Please ensure that the following information in the organization has been deleted",
"DeleteOrgMsg":"User list、User group、Asset list、Domain list、Admin user、System user、Labels、Asset permission", "DeleteOrgMsg": "User list、User group、Asset list、Domain list、Admin user、System user、Labels、Asset permission",
"OrgRole": "Org role", "OrgRole": "Org role",
"CreateOrgMsg": "Please go to Organization Details to add users", "CreateOrgMsg": "Please go to Organization Details to add users",
"AddOrgMembers": "Add organization members", "AddOrgMembers": "Add organization members",

View File

@ -20,10 +20,10 @@
"date_created": "创建时间", "date_created": "创建时间",
"created_by": "创建者", "created_by": "创建者",
"asset": "资产信息", "asset": "资产信息",
"users":"用户", "users": "用户",
"system_user": "系统用户", "system_user": "系统用户",
"username_group":"用户名", "username_group": "用户名",
"hostname_group":"资产名", "hostname_group": "资产名",
"asset_ip_group": "资产IP", "asset_ip_group": "资产IP",
"system_users_name_group": "系统用户名称", "system_users_name_group": "系统用户名称",
"system_users_protocol_group": "系统用户协议", "system_users_protocol_group": "系统用户协议",
@ -45,8 +45,8 @@
"applicationsType": { "applicationsType": {
"chrome": "Chrome", "chrome": "Chrome",
"mysql_workbench": "MySQL Workbench", "mysql_workbench": "MySQL Workbench",
"vmware_client":"Vmware Client", "vmware_client": "Vmware Client",
"custom":"Custom", "custom": "Custom",
"mysql": "MySQL", "mysql": "MySQL",
"oracle": "Oracle", "oracle": "Oracle",
"postgresql": "PostgreSQL", "postgresql": "PostgreSQL",
@ -91,7 +91,7 @@
"custom_password": "登录密码", "custom_password": "登录密码",
"Custom": "自定义", "Custom": "自定义",
"cluster": "集群", "cluster": "集群",
"kubernetes":"Kubernetes", "kubernetes": "Kubernetes",
"clusterHelpTextMessage": "例如https://172.16.8.8:8443", "clusterHelpTextMessage": "例如https://172.16.8.8:8443",
"DBInfo": "数据库信息", "DBInfo": "数据库信息",
"RDBProtocol": "关系型数据库", "RDBProtocol": "关系型数据库",
@ -130,9 +130,9 @@
"HardwareInfo": "硬件信息", "HardwareInfo": "硬件信息",
"AssetDetail": "资产详情", "AssetDetail": "资产详情",
"AssetList": "资产列表", "AssetList": "资产列表",
"ReplaceNodeAssetsAdminUser":"替换节点资产的管理员", "ReplaceNodeAssetsAdminUser": "替换节点资产的管理员",
"AssetListHelpMessage": "左侧是资产树,右击可以新建、删除、更改树节点,授权资产也是以节点方式组织的,右侧是属于该节点下的资产\n", "AssetListHelpMessage": "左侧是资产树,右击可以新建、删除、更改树节点,授权资产也是以节点方式组织的,右侧是属于该节点下的资产\n",
"TestGatewayTestConnection":"测试连接网关", "TestGatewayTestConnection": "测试连接网关",
"TestGatewayHelpMessage": "如果使用了nat端口映射请设置为ssh真实监听的端口", "TestGatewayHelpMessage": "如果使用了nat端口映射请设置为ssh真实监听的端口",
"SshPort": "SSH 端口", "SshPort": "SSH 端口",
"AssetNumber": "资产编号", "AssetNumber": "资产编号",
@ -318,12 +318,12 @@
"Action": "动作", "Action": "动作",
"RequestTickets": "申请工单", "RequestTickets": "申请工单",
"Actions": "操作", "Actions": "操作",
"CustomCol":"自定义列表字段", "CustomCol": "自定义列表字段",
"Activate": "激活", "Activate": "激活",
"NeedSpecifiedFile": "需上传指定格式文件", "NeedSpecifiedFile": "需上传指定格式文件",
"TestPortErrorMsg":"端口错误,请重新输入", "TestPortErrorMsg": "端口错误,请重新输入",
"Active": "激活中", "Active": "激活中",
"actionsTips":"剪切板权限控制目前仅支持 RDP/VNC 协议的连接", "actionsTips": "剪切板权限控制目前仅支持 RDP/VNC 协议的连接",
"TableColSettingInfo": "请选择您想显示的列表详细信息。", "TableColSettingInfo": "请选择您想显示的列表详细信息。",
"Add": "添加", "Add": "添加",
"UpdateAssetDetail": "配置更多信息", "UpdateAssetDetail": "配置更多信息",
@ -331,7 +331,7 @@
"Auth": "认证", "Auth": "认证",
"bind": "绑定", "bind": "绑定",
"unbind": "解绑", "unbind": "解绑",
"PushSelected":"推送所选", "PushSelected": "推送所选",
"PushSelectedSystemUsersToAsset": "推送所选系统用户到资产", "PushSelectedSystemUsersToAsset": "推送所选系统用户到资产",
"TestSelected": "测试所选", "TestSelected": "测试所选",
"TestSelectedSystemUsersConnective": "测试所选系统用户可连接性", "TestSelectedSystemUsersConnective": "测试所选系统用户可连接性",
@ -644,7 +644,11 @@
"versionDetail": "版本详情", "versionDetail": "版本详情",
"versionRunExecution": "执行历史", "versionRunExecution": "执行历史",
"Unkown": "未知", "Unkown": "未知",
"Unknown": "未知" "Unknown": "未知",
"PENDING": "等待中",
"RUNNING": "运行中",
"SUCCESS": "成功",
"FAILURE": "失败"
}, },
"perms": { "perms": {
"": "", "": "",
@ -659,7 +663,7 @@
"SystemUser": "系统用户", "SystemUser": "系统用户",
"User": "用户", "User": "用户",
"UserGroups": "用户组", "UserGroups": "用户组",
"PermName":"授权名称", "PermName": "授权名称",
"Permissions": "授权列表", "Permissions": "授权列表",
"DatabaseAppPermission": "数据库授权", "DatabaseAppPermission": "数据库授权",
"RemoteAppPermission": "远程应用授权", "RemoteAppPermission": "远程应用授权",
@ -692,15 +696,15 @@
"remoteApp": "远程应用", "remoteApp": "远程应用",
"remoteAppCount": "远程应用数量", "remoteAppCount": "远程应用数量",
"appsCount": "应用数量", "appsCount": "应用数量",
"appsList":"应用列表", "appsList": "应用列表",
"DatabaseAppCount": "数据库应用数量", "DatabaseAppCount": "数据库应用数量",
"KubernetesAppCount": "Kubernetes应用数量", "KubernetesAppCount": "Kubernetes应用数量",
"systemUserCount": "系统用户", "systemUserCount": "系统用户",
"upDownload": "上传下载", "upDownload": "上传下载",
"uploadFile": "上传文件", "uploadFile": "上传文件",
"clipboardCopyPaste":"剪贴板复制粘贴", "clipboardCopyPaste": "剪贴板复制粘贴",
"clipboardCopy":"剪切板复制", "clipboardCopy": "剪切板复制",
"clipboardPaste":"剪切板粘贴", "clipboardPaste": "剪切板粘贴",
"userCount": "用户数量", "userCount": "用户数量",
"userGroupCount": "用户组数量", "userGroupCount": "用户组数量",
"usersAndUserGroups": "用户或用户组" "usersAndUserGroups": "用户或用户组"
@ -732,7 +736,7 @@
"AssetAccount": "资产账号", "AssetAccount": "资产账号",
"AssetHistoryAccount": "资产历史账号", "AssetHistoryAccount": "资产历史账号",
"ApplicationAccount": "应用账号", "ApplicationAccount": "应用账号",
"Ticket":"工单", "Ticket": "工单",
"MyTickets": "我的申请", "MyTickets": "我的申请",
"AssignedTicketList": "待我审批", "AssignedTicketList": "待我审批",
"SessionDetail": "会话详情", "SessionDetail": "会话详情",
@ -1156,7 +1160,7 @@
"userGuideUrl": "用户向导URL", "userGuideUrl": "用户向导URL",
"username": "用户名", "username": "用户名",
"usernamePlaceholder": "请输入用户名", "usernamePlaceholder": "请输入用户名",
"refreshLdapCache":"刷新Ldap缓存请稍后", "refreshLdapCache": "刷新Ldap缓存请稍后",
"LicenseExpired": "许可证已经过期", "LicenseExpired": "许可证已经过期",
"LicenseWillBe": "许可证即将在 ", "LicenseWillBe": "许可证即将在 ",
"LicenseReachedAssetAmountLimit": "资产数量已经超过许可证数量限制", "LicenseReachedAssetAmountLimit": "资产数量已经超过许可证数量限制",
@ -1192,11 +1196,11 @@
"Assignee": "处理人", "Assignee": "处理人",
"Assignees": "待处理人", "Assignees": "待处理人",
"Close": "关闭", "Close": "关闭",
"OpenStatus":"审批中", "OpenStatus": "审批中",
"CloseStatus":"已完成", "CloseStatus": "已完成",
"Comment": "备注", "Comment": "备注",
"MyTickets": "我发起的", "MyTickets": "我发起的",
"RequestPerm":"授权申请", "RequestPerm": "授权申请",
"Reject": "拒绝", "Reject": "拒绝",
"date": "日期", "date": "日期",
"reply": "回复", "reply": "回复",
@ -1207,8 +1211,8 @@
"user": "用户", "user": "用户",
"Status": "状态", "Status": "状态",
"Open": "待处理", "Open": "待处理",
"OrgName":"授权组织名称", "OrgName": "授权组织名称",
"AssignedInfo":"审批信息", "AssignedInfo": "审批信息",
"OpenTicket": "创建工单", "OpenTicket": "创建工单",
"HandleTicket": "处理工单", "HandleTicket": "处理工单",
"FinishedTicket": "完成工单", "FinishedTicket": "完成工单",
@ -1301,7 +1305,7 @@
"LoginConfirm": "登录复核", "LoginConfirm": "登录复核",
"LoginPasswordSetting": "登录密码设置", "LoginPasswordSetting": "登录密码设置",
"MFA": "MFA", "MFA": "MFA",
"Existing":"已存在", "Existing": "已存在",
"MfaLevel": "多因子认证", "MfaLevel": "多因子认证",
"Name": "姓名", "Name": "姓名",
"NewPassword": "新密码", "NewPassword": "新密码",
@ -1491,7 +1495,7 @@
"HuaweiCloud": "华为云", "HuaweiCloud": "华为云",
"BaiduCloud": "百度云", "BaiduCloud": "百度云",
"JDCloud": "京东云", "JDCloud": "京东云",
"Azure":"Azure(中国)", "Azure": "Azure(中国)",
"Azure_Int": "Azure(国际)", "Azure_Int": "Azure(国际)",
"HostnameStrategy": "用于生成资产主机名。例如1. 实例名称 (instanceDemo)2. 实例名称和部分IP(后两位) (instanceDemo-250.1)", "HostnameStrategy": "用于生成资产主机名。例如1. 实例名称 (instanceDemo)2. 实例名称和部分IP(后两位) (instanceDemo-250.1)",
"IsAlwaysUpdate": "资产信息保持最新", "IsAlwaysUpdate": "资产信息保持最新",
@ -1513,20 +1517,20 @@
"CloudSource": "同步源", "CloudSource": "同步源",
"SaveSetting": "同步设置", "SaveSetting": "同步设置",
"Name": "名称", "Name": "名称",
"Account":"账户", "Account": "账户",
"Node": "节点", "Node": "节点",
"WindowsAdminUser":"Windows 特权用户", "WindowsAdminUser": "Windows 特权用户",
"LinuxAdminUser":"Linux 特权用户", "LinuxAdminUser": "Linux 特权用户",
"Periodic":"执行周期", "Periodic": "执行周期",
"PeriodicPerform":"定时执行", "PeriodicPerform": "定时执行",
"RegularlyPerform": "定期执行", "RegularlyPerform": "定期执行",
"CyclePerform": "周期执行", "CyclePerform": "周期执行",
"DateLastSync":"最后同步日期", "DateLastSync": "最后同步日期",
"DateCreated":"创建日期", "DateCreated": "创建日期",
"Region": "地域", "Region": "地域",
"Comment": "备注", "Comment": "备注",
"RunTaskManually":"手动执行", "RunTaskManually": "手动执行",
"True":"是", "True": "是",
"False": "否", "False": "否",
"NewCount": "新增", "NewCount": "新增",
"UnSyncCount": "未同步", "UnSyncCount": "未同步",
@ -1538,8 +1542,8 @@
"DeleteReleasedAssets": "删除已释放资产" "DeleteReleasedAssets": "删除已释放资产"
}, },
"Template": { "Template": {
"Template": "模版管理" "Template": "模版管理"
}, },
"Corporation": "公司", "Corporation": "公司",
"Edition": "版本", "Edition": "版本",
"Execute": "执行", "Execute": "执行",
@ -1562,10 +1566,10 @@
"Endpoint": "服务端点", "Endpoint": "服务端点",
"EndpointRule": "端点规则", "EndpointRule": "端点规则",
"ServiceRatio": "组件负载统计", "ServiceRatio": "组件负载统计",
"LoadStatus":"组件状态", "LoadStatus": "组件状态",
"NormalLoad":"正常", "NormalLoad": "正常",
"HighLoad":"较高", "HighLoad": "较高",
"CriticalLoad":"严重", "CriticalLoad": "严重",
"Offline": "离线", "Offline": "离线",
"LicenseDetail": "许可证详情", "LicenseDetail": "许可证详情",
"LicenseFile": "许可证文件", "LicenseFile": "许可证文件",

View File

@ -12,14 +12,14 @@ export default [
path: '', path: '',
name: 'TaskList', name: 'TaskList',
component: () => import('@/views/ops/TaskList'), component: () => import('@/views/ops/TaskList'),
meta: { title: i18n.t('route.TaskList') } meta: { title: i18n.t('route.TaskList'), permissions: [] }
}, },
{ {
path: ':id', path: ':id',
component: () => import('@/views/ops/TaskDetail'), component: () => import('@/views/ops/TaskDetail'),
name: 'TaskDetail', name: 'TaskDetail',
hidden: true, hidden: true,
meta: { title: i18n.t('route.TaskDetail') } meta: { title: i18n.t('route.TaskDetail'), permissions: [] }
} }
] ]
}, },

View File

@ -1,103 +0,0 @@
<template>
<ListTable :table-config="tableConfig" :header-actions="headerActions" />
</template>
<script>
import ListTable from '@/components/ListTable'
import { toSafeLocalDateStr } from '@/utils/common'
import { DetailFormatter } from '@/components/TableFormatters'
export default {
name: 'TaskAdhoc',
components: {
ListTable
},
props: {
object: {
type: Object,
default: () => ({})
}
},
data() {
return {
tableConfig: {
url: `/api/v1/ops/adhoc/?task=${this.object.id}`,
columns: [
'short_id', 'hosts', 'pattern', 'run_as', 'become_display', 'date_created', 'actions'
],
columnsMeta: {
short_id: {
label: this.$t('ops.version'),
formatter: DetailFormatter,
formatterArgs: {
route: 'AdhocDetail'
}
},
hosts: {
label: this.$t('ops.hosts'),
width: '80px',
formatter: (row, column, cellValue) => {
if (cellValue instanceof Array) {
return cellValue.length
}
return cellValue
},
showOverflowTooltip: true
},
pattern: {
label: this.$t('ops.pattern'),
width: '80px'
},
run_as: {
label: this.$t('ops.runAs'),
formatter: function(row) {
if (row.run_as_admin) {
return 'Admin'
}
if (row.run_as) {
return row.run_as
}
}
},
become_display: {
label: this.$t('ops.become')
},
date_created: {
label: this.$t('ops.datetime'),
formatter: function(row) {
return toSafeLocalDateStr(row.date_created)
}
},
actions: {
prop: 'id',
width: '80px',
formatterArgs: {
hasEdit: false,
hasDelete: false,
hasUpdate: false,
hasClone: false,
extraActions: [
{
name: 'detail',
title: this.$t('ops.detail'),
type: 'primary',
callback: function({ row, tableData }) {
return this.$router.push({ name: 'AdhocDetail', params: { id: row.id }})
}
}
]
}
}
}
},
headerActions: {
hasLeftActions: false,
hasRightActions: false
}
}
}
}
</script>
<style scoped>
</style>

View File

@ -3,25 +3,16 @@
<el-col :md="14" :sm="24"> <el-col :md="14" :sm="24">
<DetailCard :title="cardTitle" :items="detailCardItems" /> <DetailCard :title="cardTitle" :items="detailCardItems" />
</el-col> </el-col>
<el-col :md="10" :sm="24">
<RunInfoCard type="danger" style="margin-top: 15px" v-bind="RunFailedConfig" />
<RunInfoCard type="info" v-bind="RunSuccessConfig" style="margin-top: 15px" />
</el-col>
</el-row> </el-row>
</template> </template>
<script type="text/jsx"> <script type="text/jsx">
import DetailCard from '@/components/DetailCard' import DetailCard from '@/components/DetailCard'
import RunInfoCard from '../RunInfoCard/index'
import { toLastFailureDisplay, toLastSucessDisplay } from './business'
import { toSafeLocalDateStr } from '@/utils/common'
import { openTaskPage } from '@/utils/jms'
export default { export default {
name: 'TaskDetail', name: 'TaskDetail',
components: { components: {
DetailCard, DetailCard
RunInfoCard
}, },
props: { props: {
object: { object: {
@ -30,100 +21,22 @@ export default {
} }
}, },
data() { data() {
return { return {}
RunSuccessConfig: {
icon: 'fa-info',
title: this.$t('ops.lastRunSuccessHosts'),
contents: toLastSucessDisplay(this.object.latest_execution)
},
RunFailedConfig: {
icon: 'fa-info',
title: this.$t('ops.lastRunFailedHosts'),
contents: toLastFailureDisplay(this.object.latest_execution)
},
taskData: {}
}
}, },
computed: { computed: {
cardTitle() { cardTitle() {
return this.object.display_name return this.object.name
}, },
detailCardItems() { detailCardItems() {
return [ return [
{ {
key: this.$t('common.Name'), key: this.$t('common.Name'),
value: this.object.display_name value: this.object.name
},
{
key: this.$t('common.dateCreated'),
value: toSafeLocalDateStr(this.object.date_created)
},
{
key: this.$t('ops.totalVersions'),
value: JSON.stringify(this.object.summary.total)
},
{
key: this.$t('ops.latestVersion'),
value: this.object.latest_execution,
formatter: function(row, data) {
const route = { to: { name: 'AdhocDetail', params: { id: data.adhoc }}}
if (!this.$hasPerm('ops.ops.view_adhoc')) {
return <span>{ data.adhoc_short_id }</span>
}
return <router-link {...{ attrs: route }}>{ data.adhoc_short_id }</router-link>
}
},
{
key: this.$t('ops.lastRun'),
value: toSafeLocalDateStr(this.object.latest_execution.date_finished)
},
{
key: this.$t('ops.timeDelta'),
value: this.object.latest_execution.timedelta.toFixed(2) + 's'
},
{
key: this.$t('ops.isFinished'),
value: this.object.latest_execution.is_finished
},
{
key: this.$t('ops.isSuccess'),
value: this.object.latest_execution.is_success
},
{
key: this.$t('ops.contents'),
value: this.toContentsDisplay(this.object.contents),
formatter(row, value) {
return (<div>{
value.map((content) => {
return <div>{ content }</div>
})}
</div>)
}
},
{
key: this.$t('ops.lastExecutionOutput'),
value: this.object.latest_execution.id,
formatter: function(row, value) {
const onClick = function() {
openTaskPage(value, 'ansible')
}
const title = this.$t('common.View')
return <a onClick={onClick} >{ title }</a>
}
} }
] ]
} }
}, },
methods: { methods: {}
toContentsDisplay(contents) {
const lines = []
for (let i = 0; i < contents.length; i++) {
const content = contents[i]
lines.push(`${i}. ${content.name} ::: ${content.action.module}`)
}
return lines
}
}
} }
</script> </script>

View File

@ -4,8 +4,6 @@
<script type="text/jsx"> <script type="text/jsx">
import ListTable from '@/components/ListTable' import ListTable from '@/components/ListTable'
import { DetailFormatter } from '@/components/TableFormatters'
import { toSafeLocalDateStr } from '@/utils/common'
export default { export default {
name: 'TaskHistory', name: 'TaskHistory',
@ -21,63 +19,25 @@ export default {
data() { data() {
return { return {
tableConfig: { tableConfig: {
url: `/api/v1/ops/adhoc-executions/?task=${this.object.id}`, url: `/api/v1/ops/tasks/${this.object.id}/executions/`,
columns: [ columns: [
'date_start', 'stat', 'ratio', 'is_finished', 'is_success', 'timedelta', 'adhoc_short_id', 'actions' 'id', 'state', 'is_finished', 'date_published', 'date_start', 'date_finished', 'actions'
], ],
columnsMeta: { columnsMeta: {
date_start: { state: {
formatter: (row) => toSafeLocalDateStr(row.date_start), label: this.$t('ops.state'),
width: '160px' width: '120px',
}, formatter: (row) => {
stat: { switch (row.state) {
label: this.$t('ops.stat'), case 'PENDING':
align: 'center', return <span><i Class='fa fa-spinner fa-spin' />{this.$t(`ops.${row.state}`)}</span>
width: '100px', case 'RUNNING':
formatter: function(row) { return <span><i Class='fa fa-spinner fa-spin' />{this.$t(`ops.${row.state}`)}</span>
return ( case 'SUCCESS':
<div> return <span Class='text-success'><i Class='fa fa-check' />{this.$t(`ops.${row.state}`)}</span>
<span class='text-primary'>{row.stat.success}</span>/ case 'FAILURE':
<span class='text-danger'>{row.stat.failed}</span>/ return <span Class='text-danger'><i Class='fa fa-times' />{this.$t(`ops.${row.state}`)}</span>
<span>{row.stat.total}</span>
</div>
)
}
},
ratio: {
label: this.$t('ops.ratio'),
align: 'center',
width: '80px',
formatter: function(row) {
const ratio = (row.stat.success / row.stat.total) * 100
if (ratio === 100) {
return <span class='text-navy'>{ratio + '%'}</span>
} }
return <span class='text-danger'>{ratio + '%'}</span>
}
},
is_finished: {
align: 'center',
width: '100px',
label: this.$t('ops.isFinished')
},
is_success: {
align: 'center',
width: '100px',
label: this.$t('ops.isSuccess')
},
timedelta: {
label: this.$t('ops.time'),
width: '100px',
formatter: function(row) {
return row.timedelta.toFixed(2) + 's'
}
},
adhoc_short_id: {
label: this.$t('ops.version'),
formatter: DetailFormatter,
formatterArgs: {
route: 'HistoryExecutionDetail'
} }
}, },
actions: { actions: {

View File

@ -10,7 +10,6 @@
import { GenericDetailPage, TabPage } from '@/layout/components' import { GenericDetailPage, TabPage } from '@/layout/components'
import TaskDetail from './TaskDetail' import TaskDetail from './TaskDetail'
import TaskHistory from './TaskHistory' import TaskHistory from './TaskHistory'
import TaskAdhoc from './TaskAdhoc'
import CeleryTaskLog from '../CeleryTaskLog' import CeleryTaskLog from '../CeleryTaskLog'
export default { export default {
components: { components: {
@ -18,7 +17,6 @@ export default {
CeleryTaskLog, CeleryTaskLog,
TaskHistory, TaskHistory,
TaskDetail, TaskDetail,
TaskAdhoc,
TabPage TabPage
}, },
data() { data() {
@ -34,11 +32,6 @@ export default {
title: this.$t('ops.taskDetail'), title: this.$t('ops.taskDetail'),
name: 'TaskDetail' name: 'TaskDetail'
}, },
{
title: this.$t('ops.taskVersions'),
name: 'TaskAdhoc',
hidden: () => !this.$hasPerm('ops.view_adhoc')
},
{ {
title: this.$t('ops.execution'), title: this.$t('ops.execution'),
name: 'TaskHistory', name: 'TaskHistory',

View File

@ -3,14 +3,9 @@
</template> </template>
<script type="text/jsx"> <script type="text/jsx">
import { timeOffset, toSafeLocalDateStr } from '@/utils/common' // import { timeOffset, toSafeLocalDateStr } from '@/utils/common'
import { GenericListPage } from '@/layout/components' import { GenericListPage } from '@/layout/components'
import { openTaskPage } from '@/utils/jms' // import { openTaskPage } from '@/utils/jms'
const performDelete = function({ row }) {
const id = row.id
const url = `${this.url}${id}/`
return this.$axios.delete(url)
}
export default { export default {
components: { components: {
@ -21,109 +16,150 @@ export default {
tableConfig: { tableConfig: {
url: '/api/v1/ops/tasks/', url: '/api/v1/ops/tasks/',
columns: [ columns: [
'name', 'runtimes', 'host_amount', 'is_success', 'name', 'queue', 'comment', 'count', 'state', 'last_published_time'
'date_start', 'time', 'actions'
], ],
columnsMeta: { columnsMeta: {
name: { name: {
showOverflowTooltip: true,
formatterArgs: { formatterArgs: {
getTitle({ row }) { can: true
return row['display_name'] }
} // formatter: (row) => {
// return row.meta.verbose_name != null ? row.meta.verbose_name : row.name
// }
},
comment: {
label: 'comment',
formatter: (row) => {
return row.meta.comment
} }
}, },
runtimes: { queue: {
label: this.$t('ops.runTimes'), label: 'queue',
formatter: (row) => {
return row.meta.queue
}
},
last_published_time: {
width: '210px',
formatter: (row) => {
return row.last_published_time != null ? row.last_published_time : '-'
}
},
count: {
label: 'success/total',
width: '120px', width: '120px',
formatter: function(row) { formatter: (row) => {
return (<div> return <div>
<span Class='text-primary'>{row.summary.success}</span>/ <span Class='text-primary'>{row.success_count}</span>/
<span Class='text-danger'>{row.summary.failed}</span>/ <span>{row.publish_count}</span>
<span>{row.summary.total}</span> </div>
</div>)
} }
}, },
host_amount: { state: {
label: this.$t('ops.hosts'), width: '60px',
width: '65px',
formatter: function(row) {
return _.get(row, 'latest_execution.hosts_amount', 0)
}
},
is_success: {
label: this.$t('ops.success'),
align: 'center', align: 'center',
width: '80px', formatter: (row) => {
formatter: row => { switch (row.state) {
if (_.get(row, 'latest_execution.is_success', false)) { case 'green':
return <i Class='fa fa-check text-primary'/> return <i Class='fa fa-circle-o text-primary' />
case 'yellow':
return <i Class='fa fa-circle-o text-warning' />
case 'red':
return <i Class='fa fa-circle-o text-danger' />
} }
return <i Class='fa fa-times text-danger'/>
}
},
date_start: {
label: this.$t('ops.date'),
width: '150px',
formatter: function(row) {
if (_.get(row, 'latest_execution.date_start', false)) {
return toSafeLocalDateStr(row.latest_execution.date_start)
}
return ''
}
},
time: {
label: this.$t('ops.time'),
width: '100px',
formatter: function(row) {
if (_.get(row, 'latest_execution.date_start', false)) {
return timeOffset(row.latest_execution.date_start, row.latest_execution.date_finished)
}
return ''
} }
}, },
// runtimes: {
// label: this.$t('ops.runTimes'),
// width: '120px',
// formatter: function(row) {
// return (<div>
// <span Class='text-primary'>{row.summary.success}</span>/
// <span Class='text-danger'>{row.summary.failed}</span>/
// <span>{row.summary.total}</span>
// </div>)
// }
// },
// host_amount: {
// label: this.$t('ops.hosts'),
// width: '65px',
// formatter: function(row) {
// return _.get(row, 'latest_execution.hosts_amount', 0)
// }
// },
// is_success: {
// label: this.$t('ops.success'),
// align: 'center',
// width: '80px',
// formatter: row => {
// if (_.get(row, 'latest_execution.is_success', false)) {
// return <i Class='fa fa-check text-primary'/>
// }
// return <i Class='fa fa-times text-danger'/>
// }
// },
// date_start: {
// label: this.$t('ops.date'),
// width: '150px',
// formatter: function(row) {
// if (_.get(row, 'latest_execution.date_start', false)) {
// return toSafeLocalDateStr(row.latest_execution.date_start)
// }
// return ''
// }
// },
// time: {
// label: this.$t('ops.time'),
// width: '100px',
// formatter: function(row) {
// if (_.get(row, 'latest_execution.date_start', false)) {
// return timeOffset(row.latest_execution.date_start, row.latest_execution.date_finished)
// }
// return ''
// }
// },
actions: { actions: {
prop: 'id', prop: 'id',
formatterArgs: { formatterArgs: {
hasUpdate: false, // hasUpdate: false,
hasClone: false, // hasClone: false,
canDelete: this.$hasPerm('ops.delete_task'), // canDelete: this.$hasPerm('ops.delete_task'),
onDelete: function({ row, col, cellValue, reload }) { // onDelete: function({ row, col, cellValue, reload }) {
const msg = this.$t('common.deleteWarningMsg') + ` "${row.display_name || row.name}" ` + '?' // const msg = this.$t('common.deleteWarningMsg') + ` "${row.display_name || row.name}" ` + '?'
const title = this.$t('common.Info') // const title = this.$t('common.Info')
this.$alert(msg, title, { // this.$alert(msg, title, {
type: 'warning', // type: 'warning',
confirmButtonClass: 'el-button--danger', // confirmButtonClass: 'el-button--danger',
showCancelButton: true, // showCancelButton: true,
beforeClose: async(action, instance, done) => { // beforeClose: async(action, instance, done) => {
if (action !== 'confirm') return done() // if (action !== 'confirm') return done()
instance.confirmButtonLoading = true // instance.confirmButtonLoading = true
try { // try {
await performDelete.bind(this)({ row: row, col: col }) // await performDelete.bind(this)({ row: row, col: col })
done() // done()
reload() // reload()
this.$message.success(this.$t('common.deleteSuccessMsg')) // this.$message.success(this.$t('common.deleteSuccessMsg'))
} finally { // } finally {
instance.confirmButtonLoading = false // instance.confirmButtonLoading = false
} // }
} // }
}) // })
}, // },
extraActions: [ // extraActions: [
{ // {
name: 'run', // name: 'run',
can: this.$hasPerm('ops.add_adhoc'), // can: this.$hasPerm('ops.add_adhoc'),
title: this.$t('ops.run'), // title: this.$t('ops.run'),
type: 'primary', // type: 'primary',
callback: function({ row, tableData }) { // callback: function({ row, tableData }) {
this.$axios.get( // this.$axios.get(
`/api/v1/ops/tasks/${row.id}/run/` // `/api/v1/ops/tasks/${row.id}/run/`
).then(res => { // ).then(res => {
openTaskPage(res['task']) // openTaskPage(res['task'])
}) // })
} // }
} // }
] // ]
} }
} }
} }
@ -133,7 +169,8 @@ export default {
hasCreate: false hasCreate: false
} }
} }
} },
methods: {}
} }
</script> </script>