Commit ddfbf779 authored by nanahira's avatar nanahira

bump and for templating meta

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