Commit ddfbf779 authored by nanahira's avatar nanahira

bump and for templating meta

parent f850affc
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@avaflow/libvirt": "^0.0.7", "@avaflow/libvirt": "^0.0.7",
"koishi-thirdeye": "^10.1.0", "koishi-thirdeye": "^10.1.4",
"lodash": "^4.17.21" "lodash": "^4.17.21"
}, },
"devDependencies": { "devDependencies": {
...@@ -5261,28 +5261,29 @@ ...@@ -5261,28 +5261,29 @@
} }
}, },
"node_modules/koishi-decorators": { "node_modules/koishi-decorators": {
"version": "2.0.1", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.0.1.tgz", "resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.0.3.tgz",
"integrity": "sha512-dDrBS4Su1NtmrkIeCdcCKsC6uaBYTRTspDdeeoPLOMuSJf6fqqXwxa2qEosvG5475MXs9SaNQDaKjh0gq/NY6A==", "integrity": "sha512-rAC3bJVdeIQmydUbOWy+SWqtczUJfUHSIQggR5+bVI9oKMxNuTfbik3xD/FnCMF84Z9aCklOz5MJOLPbaUs1pw==",
"dependencies": { "dependencies": {
"@types/koa": "^2.13.4", "@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11", "@types/koa__router": "^8.0.11",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"typed-reflector": "^1.0.10" "typed-reflector": "^1.0.10"
}, },
"peerDependencies": { "peerDependencies": {
"koishi": "^4.6.0" "koishi": "^4.7.0"
} }
}, },
"node_modules/koishi-thirdeye": { "node_modules/koishi-thirdeye": {
"version": "10.1.0", "version": "10.1.4",
"resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-10.1.0.tgz", "resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-10.1.4.tgz",
"integrity": "sha512-ElobuJABbWmWdFkzaU6pUmHUCqvpAwIe43BwxwV2AOHWrFM7IJtS9W+rODfx4WaUrnP7KMy2+jPt5C4UyD8tYQ==", "integrity": "sha512-uOCBw/SsAqW3HtKU/iozJTogJXnvDbP98n/20+CaLoAe+xK05z6QToRR6hEk0CLsAYgSivkXbUsEKTBHKT4i/g==",
"dependencies": { "dependencies": {
"@types/koa": "^2.13.4", "@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11", "@types/koa__router": "^8.0.11",
"koishi-decorators": "^2.0.1", "koishi-decorators": "^2.0.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"minato-decorators": "^2.0.6", "minato-decorators": "^2.0.6",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
...@@ -5546,6 +5547,14 @@ ...@@ -5546,6 +5547,14 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"node_modules/mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"bin": {
"mustache": "bin/mustache"
}
},
"node_modules/natural-compare": { "node_modules/natural-compare": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
...@@ -11836,25 +11845,26 @@ ...@@ -11836,25 +11845,26 @@
} }
}, },
"koishi-decorators": { "koishi-decorators": {
"version": "2.0.1", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.0.1.tgz", "resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.0.3.tgz",
"integrity": "sha512-dDrBS4Su1NtmrkIeCdcCKsC6uaBYTRTspDdeeoPLOMuSJf6fqqXwxa2qEosvG5475MXs9SaNQDaKjh0gq/NY6A==", "integrity": "sha512-rAC3bJVdeIQmydUbOWy+SWqtczUJfUHSIQggR5+bVI9oKMxNuTfbik3xD/FnCMF84Z9aCklOz5MJOLPbaUs1pw==",
"requires": { "requires": {
"@types/koa": "^2.13.4", "@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11", "@types/koa__router": "^8.0.11",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"typed-reflector": "^1.0.10" "typed-reflector": "^1.0.10"
} }
}, },
"koishi-thirdeye": { "koishi-thirdeye": {
"version": "10.1.0", "version": "10.1.4",
"resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-10.1.0.tgz", "resolved": "https://registry.npmjs.org/koishi-thirdeye/-/koishi-thirdeye-10.1.4.tgz",
"integrity": "sha512-ElobuJABbWmWdFkzaU6pUmHUCqvpAwIe43BwxwV2AOHWrFM7IJtS9W+rODfx4WaUrnP7KMy2+jPt5C4UyD8tYQ==", "integrity": "sha512-uOCBw/SsAqW3HtKU/iozJTogJXnvDbP98n/20+CaLoAe+xK05z6QToRR6hEk0CLsAYgSivkXbUsEKTBHKT4i/g==",
"requires": { "requires": {
"@types/koa": "^2.13.4", "@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11", "@types/koa__router": "^8.0.11",
"koishi-decorators": "^2.0.1", "koishi-decorators": "^2.0.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"minato-decorators": "^2.0.6", "minato-decorators": "^2.0.6",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
...@@ -12065,6 +12075,11 @@ ...@@ -12065,6 +12075,11 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}, },
"mustache": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
},
"natural-compare": { "natural-compare": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
}, },
"dependencies": { "dependencies": {
"@avaflow/libvirt": "^0.0.7", "@avaflow/libvirt": "^0.0.7",
"koishi-thirdeye": "^10.1.0", "koishi-thirdeye": "^10.1.4",
"lodash": "^4.17.21" "lodash": "^4.17.21"
}, },
"peerDependencies": { "peerDependencies": {
......
...@@ -7,13 +7,14 @@ import { ...@@ -7,13 +7,14 @@ import {
UseCommand, UseCommand,
PutOption, PutOption,
CommandExample, CommandExample,
LifecycleEvents,
CommandDescription, CommandDescription,
Inject,
PutTemplate, PutTemplate,
Renderer, Renderer,
For,
CommandLocale,
PutValue,
} from 'koishi-thirdeye'; } from 'koishi-thirdeye';
import { I18n, Logger } from 'koishi'; import { Logger } from 'koishi';
import _ from 'lodash'; import _ from 'lodash';
import { DomainStateToText, getDomainsFromHypervisor } from './utils'; import { DomainStateToText, getDomainsFromHypervisor } from './utils';
export * from './config'; export * from './config';
...@@ -23,10 +24,10 @@ import { execFile } from 'child_process'; ...@@ -23,10 +24,10 @@ import { execFile } from 'child_process';
const connectFailMessage = `未找到主机或连接失败,请检查配置或主机连接。`; const connectFailMessage = `未找到主机或连接失败,请检查配置或主机连接。`;
@DefinePlugin({ name: 'libvirt', schema: LibVirtPluginConfig }) @DefinePlugin({ name: 'libvirt', schema: LibVirtPluginConfig })
export default class LibVirtPlugin export default class LibVirtPlugin extends BasePlugin<
extends BasePlugin<LibVirtPluginConfig, LibVirtPluginConfigLike> LibVirtPluginConfig,
implements LifecycleEvents LibVirtPluginConfigLike
{ > {
@InjectLogger() @InjectLogger()
private logger: Logger; private logger: Logger;
...@@ -158,33 +159,65 @@ export default class LibVirtPlugin ...@@ -158,33 +159,65 @@ export default class LibVirtPlugin
} }
} }
@Inject() @For(() => [
private i18n: I18n; { action: 'start', verb: '启动' },
{ action: 'shutdown', verb: '关闭' },
private defineActionCommand(action: string, verb: string = action) { { action: 'destroy', verb: '强制关闭' },
this.i18n.define('en', `commands.virt.${action}`, { { action: 'reset', verb: '强制重启' },
description: `Perform ${action} on virtual machine`, { action: 'reboot', verb: '重启' },
}); { action: 'suspend', verb: '挂起' },
this.ctx { action: 'resume', verb: '恢复' },
.command(`virt.${action}`, `${verb}虚拟机`) ])
.example( @UseCommand('virt.{{action}}')
`virt.${action} -s localhost -m ubuntu ${verb} localhost 上的 ubuntu 虚拟机。`, @CommandLocale('zh', {
) description: '{{verb}}虚拟机',
.option('host', '-s <name:string> 指定主机') examples:
.option('vm', '-m <name:string> 指定虚拟机') 'virt.{{action}} -s localhost -m ubuntu {{verb}} localhost 上的 ubuntu 虚拟机。',
.action((a) => options: {
this.virtActionCommand(action, verb, a.options.host, a.options.vm), host: '指定主机',
vm: '指定虚拟机',
},
})
@CommandLocale('en', {
description: '{{action}} virtual machine',
examples:
'virt.{{action}} -s localhost -m ubuntu {{action}} the ubuntu virtual mechine on localhost.',
options: {
host: 'Specify host',
vm: 'Specify virtual machine',
},
})
async onVirtActionCommand(
@PutValue('{{action}}') actionName: string,
@PutValue('{{verb}}') verb: string,
@PutOption('host', '-s <name>') host: string,
@PutOption('vm', '-m <name>') vm: string,
) {
if (!vm) return '请指定虚拟机。';
const { name, uri, hypervisor } = (await this.connect(host)) || {};
if (!hypervisor) return connectFailMessage;
const domain = (await getDomainsFromHypervisor(hypervisor)).find(
(d) => d.name === vm || d.id?.toString() === vm || d.uuid === vm,
);
await hypervisor.connectClose();
if (!domain) {
return `未找到虚拟机 ${vm} 。`;
}
try {
const { stdout, stderr } = await util.promisify(execFile)(
'virsh',
['--connect', uri, actionName, domain.name],
{ encoding: 'utf8' },
); );
return this; return `${name} 主机的虚拟机 ${vm} ${verb}成功:\n${stdout}${
} stderr ? `\n${stderr}` : ''
}`;
onApply() { } catch (e) {
this.defineActionCommand('start', '启动') const errorMessage = e.stderr || e.message;
.defineActionCommand('shutdown', '关闭') this.logger.error(
.defineActionCommand('destroy', '强制关闭') `Failed to ${actionName} domain ${domain.name}: ${errorMessage}`,
.defineActionCommand('reset', '强制重启') );
.defineActionCommand('reboot', '重启') return `${name} 主机的虚拟机 ${vm} ${verb}发生错误:${errorMessage}`;
.defineActionCommand('suspend', '挂起') }
.defineActionCommand('resume', '恢复');
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment