|
Packit |
63bb0d |
/*
|
|
Packit |
63bb0d |
Copyright (c) 2014-2016 VMware, Inc. All Rights Reserved.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Licensed under the Apache License, Version 2.0 (the "License");
|
|
Packit |
63bb0d |
you may not use this file except in compliance with the License.
|
|
Packit |
63bb0d |
You may obtain a copy of the License at
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
http://www.apache.org/licenses/LICENSE-2.0
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Unless required by applicable law or agreed to in writing, software
|
|
Packit |
63bb0d |
distributed under the License is distributed on an "AS IS" BASIS,
|
|
Packit |
63bb0d |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
Packit |
63bb0d |
See the License for the specific language governing permissions and
|
|
Packit |
63bb0d |
limitations under the License.
|
|
Packit |
63bb0d |
*/
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
package vm
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"context"
|
|
Packit |
63bb0d |
"flag"
|
|
Packit |
63bb0d |
"fmt"
|
|
Packit |
63bb0d |
"sort"
|
|
Packit |
63bb0d |
"strconv"
|
|
Packit |
63bb0d |
"strings"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/vmware/govmomi/govc/cli"
|
|
Packit |
63bb0d |
"github.com/vmware/govmomi/govc/flags"
|
|
Packit |
63bb0d |
"github.com/vmware/govmomi/object"
|
|
Packit |
63bb0d |
"github.com/vmware/govmomi/vim25/types"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type hidKey struct {
|
|
Packit |
63bb0d |
Code int32
|
|
Packit |
63bb0d |
ShiftPressed bool
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// stolen from
|
|
Packit |
63bb0d |
// https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2#file-usb_hid_keys-h-L110
|
|
Packit |
63bb0d |
const (
|
|
Packit |
63bb0d |
KEY_MOD_LCTRL = 0x01
|
|
Packit |
63bb0d |
KEY_MOD_LSHIFT = 0x02
|
|
Packit |
63bb0d |
KEY_MOD_LALT = 0x04
|
|
Packit |
63bb0d |
KEY_MOD_LMETA = 0x08
|
|
Packit |
63bb0d |
KEY_MOD_RCTRL = 0x10
|
|
Packit |
63bb0d |
KEY_MOD_RSHIFT = 0x20
|
|
Packit |
63bb0d |
KEY_MOD_RALT = 0x40
|
|
Packit |
63bb0d |
KEY_MOD_RMETA = 0x80
|
|
Packit |
63bb0d |
KEY_NONE = 0x00
|
|
Packit |
63bb0d |
KEY_ERR_OVF = 0x01
|
|
Packit |
63bb0d |
KEY_A = 0x04
|
|
Packit |
63bb0d |
KEY_B = 0x05
|
|
Packit |
63bb0d |
KEY_C = 0x06
|
|
Packit |
63bb0d |
KEY_D = 0x07
|
|
Packit |
63bb0d |
KEY_E = 0x08
|
|
Packit |
63bb0d |
KEY_F = 0x09
|
|
Packit |
63bb0d |
KEY_G = 0x0a
|
|
Packit |
63bb0d |
KEY_H = 0x0b
|
|
Packit |
63bb0d |
KEY_I = 0x0c
|
|
Packit |
63bb0d |
KEY_J = 0x0d
|
|
Packit |
63bb0d |
KEY_K = 0x0e
|
|
Packit |
63bb0d |
KEY_L = 0x0f
|
|
Packit |
63bb0d |
KEY_M = 0x10
|
|
Packit |
63bb0d |
KEY_N = 0x11
|
|
Packit |
63bb0d |
KEY_O = 0x12
|
|
Packit |
63bb0d |
KEY_P = 0x13
|
|
Packit |
63bb0d |
KEY_Q = 0x14
|
|
Packit |
63bb0d |
KEY_R = 0x15
|
|
Packit |
63bb0d |
KEY_S = 0x16
|
|
Packit |
63bb0d |
KEY_T = 0x17
|
|
Packit |
63bb0d |
KEY_U = 0x18
|
|
Packit |
63bb0d |
KEY_V = 0x19
|
|
Packit |
63bb0d |
KEY_W = 0x1a
|
|
Packit |
63bb0d |
KEY_X = 0x1b
|
|
Packit |
63bb0d |
KEY_Y = 0x1c
|
|
Packit |
63bb0d |
KEY_Z = 0x1d
|
|
Packit |
63bb0d |
KEY_1 = 0x1e
|
|
Packit |
63bb0d |
KEY_2 = 0x1f
|
|
Packit |
63bb0d |
KEY_3 = 0x20
|
|
Packit |
63bb0d |
KEY_4 = 0x21
|
|
Packit |
63bb0d |
KEY_5 = 0x22
|
|
Packit |
63bb0d |
KEY_6 = 0x23
|
|
Packit |
63bb0d |
KEY_7 = 0x24
|
|
Packit |
63bb0d |
KEY_8 = 0x25
|
|
Packit |
63bb0d |
KEY_9 = 0x26
|
|
Packit |
63bb0d |
KEY_0 = 0x27
|
|
Packit |
63bb0d |
KEY_ENTER = 0x28
|
|
Packit |
63bb0d |
KEY_ESC = 0x29
|
|
Packit |
63bb0d |
KEY_BACKSPACE = 0x2a
|
|
Packit |
63bb0d |
KEY_TAB = 0x2b
|
|
Packit |
63bb0d |
KEY_SPACE = 0x2c
|
|
Packit |
63bb0d |
KEY_MINUS = 0x2d
|
|
Packit |
63bb0d |
KEY_EQUAL = 0x2e
|
|
Packit |
63bb0d |
KEY_LEFTBRACE = 0x2f
|
|
Packit |
63bb0d |
KEY_RIGHTBRACE = 0x30
|
|
Packit |
63bb0d |
KEY_BACKSLASH = 0x31
|
|
Packit |
63bb0d |
KEY_HASHTILDE = 0x32
|
|
Packit |
63bb0d |
KEY_SEMICOLON = 0x33
|
|
Packit |
63bb0d |
KEY_APOSTROPHE = 0x34
|
|
Packit |
63bb0d |
KEY_GRAVE = 0x35
|
|
Packit |
63bb0d |
KEY_COMMA = 0x36
|
|
Packit |
63bb0d |
KEY_DOT = 0x37
|
|
Packit |
63bb0d |
KEY_SLASH = 0x38
|
|
Packit |
63bb0d |
KEY_CAPSLOCK = 0x39
|
|
Packit |
63bb0d |
KEY_F1 = 0x3a
|
|
Packit |
63bb0d |
KEY_F2 = 0x3b
|
|
Packit |
63bb0d |
KEY_F3 = 0x3c
|
|
Packit |
63bb0d |
KEY_F4 = 0x3d
|
|
Packit |
63bb0d |
KEY_F5 = 0x3e
|
|
Packit |
63bb0d |
KEY_F6 = 0x3f
|
|
Packit |
63bb0d |
KEY_F7 = 0x40
|
|
Packit |
63bb0d |
KEY_F8 = 0x41
|
|
Packit |
63bb0d |
KEY_F9 = 0x42
|
|
Packit |
63bb0d |
KEY_F10 = 0x43
|
|
Packit |
63bb0d |
KEY_F11 = 0x44
|
|
Packit |
63bb0d |
KEY_F12 = 0x45
|
|
Packit |
63bb0d |
KEY_SYSRQ = 0x46
|
|
Packit |
63bb0d |
KEY_SCROLLLOCK = 0x47
|
|
Packit |
63bb0d |
KEY_PAUSE = 0x48
|
|
Packit |
63bb0d |
KEY_INSERT = 0x49
|
|
Packit |
63bb0d |
KEY_HOME = 0x4a
|
|
Packit |
63bb0d |
KEY_PAGEUP = 0x4b
|
|
Packit |
63bb0d |
KEY_DELETE = 0x4c
|
|
Packit |
63bb0d |
KEY_END = 0x4d
|
|
Packit |
63bb0d |
KEY_PAGEDOWN = 0x4e
|
|
Packit |
63bb0d |
KEY_RIGHT = 0x4f
|
|
Packit |
63bb0d |
KEY_LEFT = 0x50
|
|
Packit |
63bb0d |
KEY_DOWN = 0x51
|
|
Packit |
63bb0d |
KEY_UP = 0x52
|
|
Packit |
63bb0d |
KEY_NUMLOCK = 0x53
|
|
Packit |
63bb0d |
KEY_KPSLASH = 0x54
|
|
Packit |
63bb0d |
KEY_KPASTERISK = 0x55
|
|
Packit |
63bb0d |
KEY_KPMINUS = 0x56
|
|
Packit |
63bb0d |
KEY_KPPLUS = 0x57
|
|
Packit |
63bb0d |
KEY_KPENTER = 0x58
|
|
Packit |
63bb0d |
KEY_KP1 = 0x59
|
|
Packit |
63bb0d |
KEY_KP2 = 0x5a
|
|
Packit |
63bb0d |
KEY_KP3 = 0x5b
|
|
Packit |
63bb0d |
KEY_KP4 = 0x5c
|
|
Packit |
63bb0d |
KEY_KP5 = 0x5d
|
|
Packit |
63bb0d |
KEY_KP6 = 0x5e
|
|
Packit |
63bb0d |
KEY_KP7 = 0x5f
|
|
Packit |
63bb0d |
KEY_KP8 = 0x60
|
|
Packit |
63bb0d |
KEY_KP9 = 0x61
|
|
Packit |
63bb0d |
KEY_KP0 = 0x62
|
|
Packit |
63bb0d |
KEY_KPDOT = 0x63
|
|
Packit |
63bb0d |
KEY_102ND = 0x64
|
|
Packit |
63bb0d |
KEY_COMPOSE = 0x65
|
|
Packit |
63bb0d |
KEY_POWER = 0x66
|
|
Packit |
63bb0d |
KEY_KPEQUAL = 0x67
|
|
Packit |
63bb0d |
KEY_F13 = 0x68
|
|
Packit |
63bb0d |
KEY_F14 = 0x69
|
|
Packit |
63bb0d |
KEY_F15 = 0x6a
|
|
Packit |
63bb0d |
KEY_F16 = 0x6b
|
|
Packit |
63bb0d |
KEY_F17 = 0x6c
|
|
Packit |
63bb0d |
KEY_F18 = 0x6d
|
|
Packit |
63bb0d |
KEY_F19 = 0x6e
|
|
Packit |
63bb0d |
KEY_F20 = 0x6f
|
|
Packit |
63bb0d |
KEY_F21 = 0x70
|
|
Packit |
63bb0d |
KEY_F22 = 0x71
|
|
Packit |
63bb0d |
KEY_F23 = 0x72
|
|
Packit |
63bb0d |
KEY_F24 = 0x73
|
|
Packit |
63bb0d |
KEY_OPEN = 0x74
|
|
Packit |
63bb0d |
KEY_HELP = 0x75
|
|
Packit |
63bb0d |
KEY_PROPS = 0x76
|
|
Packit |
63bb0d |
KEY_FRONT = 0x77
|
|
Packit |
63bb0d |
KEY_STOP = 0x78
|
|
Packit |
63bb0d |
KEY_AGAIN = 0x79
|
|
Packit |
63bb0d |
KEY_UNDO = 0x7a
|
|
Packit |
63bb0d |
KEY_CUT = 0x7b
|
|
Packit |
63bb0d |
KEY_COPY = 0x7c
|
|
Packit |
63bb0d |
KEY_PASTE = 0x7d
|
|
Packit |
63bb0d |
KEY_FIND = 0x7e
|
|
Packit |
63bb0d |
KEY_MUTE = 0x7f
|
|
Packit |
63bb0d |
KEY_VOLUMEUP = 0x80
|
|
Packit |
63bb0d |
KEY_VOLUMEDOWN = 0x81
|
|
Packit |
63bb0d |
KEY_KPCOMMA = 0x85
|
|
Packit |
63bb0d |
KEY_RO = 0x87
|
|
Packit |
63bb0d |
KEY_KATAKANAHIRAGANA = 0x88
|
|
Packit |
63bb0d |
KEY_YEN = 0x89
|
|
Packit |
63bb0d |
KEY_HENKAN = 0x8a
|
|
Packit |
63bb0d |
KEY_MUHENKAN = 0x8b
|
|
Packit |
63bb0d |
KEY_KPJPCOMMA = 0x8c
|
|
Packit |
63bb0d |
KEY_HANGEUL = 0x90
|
|
Packit |
63bb0d |
KEY_HANJA = 0x91
|
|
Packit |
63bb0d |
KEY_KATAKANA = 0x92
|
|
Packit |
63bb0d |
KEY_HIRAGANA = 0x93
|
|
Packit |
63bb0d |
KEY_ZENKAKUHANKAKU = 0x94
|
|
Packit |
63bb0d |
KEY_KPLEFTPAREN = 0xb6
|
|
Packit |
63bb0d |
KEY_KPRIGHTPAREN = 0xb7
|
|
Packit |
63bb0d |
KEY_LEFTCTRL = 0xe0
|
|
Packit |
63bb0d |
KEY_LEFTSHIFT = 0xe1
|
|
Packit |
63bb0d |
KEY_LEFTALT = 0xe2
|
|
Packit |
63bb0d |
KEY_LEFTMETA = 0xe3
|
|
Packit |
63bb0d |
KEY_RIGHTCTRL = 0xe4
|
|
Packit |
63bb0d |
KEY_RIGHTSHIFT = 0xe5
|
|
Packit |
63bb0d |
KEY_RIGHTALT = 0xe6
|
|
Packit |
63bb0d |
KEY_RIGHTMETA = 0xe7
|
|
Packit |
63bb0d |
KEY_MEDIA_PLAYPAUSE = 0xe8
|
|
Packit |
63bb0d |
KEY_MEDIA_STOPCD = 0xe9
|
|
Packit |
63bb0d |
KEY_MEDIA_PREVIOUSSONG = 0xea
|
|
Packit |
63bb0d |
KEY_MEDIA_NEXTSONG = 0xeb
|
|
Packit |
63bb0d |
KEY_MEDIA_EJECTCD = 0xec
|
|
Packit |
63bb0d |
KEY_MEDIA_VOLUMEUP = 0xed
|
|
Packit |
63bb0d |
KEY_MEDIA_VOLUMEDOWN = 0xee
|
|
Packit |
63bb0d |
KEY_MEDIA_MUTE = 0xef
|
|
Packit |
63bb0d |
KEY_MEDIA_WWW = 0xf0
|
|
Packit |
63bb0d |
KEY_MEDIA_BACK = 0xf1
|
|
Packit |
63bb0d |
KEY_MEDIA_FORWARD = 0xf2
|
|
Packit |
63bb0d |
KEY_MEDIA_STOP = 0xf3
|
|
Packit |
63bb0d |
KEY_MEDIA_FIND = 0xf4
|
|
Packit |
63bb0d |
KEY_MEDIA_SCROLLUP = 0xf5
|
|
Packit |
63bb0d |
KEY_MEDIA_SCROLLDOWN = 0xf6
|
|
Packit |
63bb0d |
KEY_MEDIA_EDIT = 0xf7
|
|
Packit |
63bb0d |
KEY_MEDIA_SLEEP = 0xf8
|
|
Packit |
63bb0d |
KEY_MEDIA_COFFEE = 0xf9
|
|
Packit |
63bb0d |
KEY_MEDIA_REFRESH = 0xfa
|
|
Packit |
63bb0d |
KEY_MEDIA_CALC = 0xfb
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var hidKeyMap = map[string]int32{
|
|
Packit |
63bb0d |
"KEY_MOD_LCTRL": KEY_MOD_LCTRL,
|
|
Packit |
63bb0d |
"KEY_MOD_LSHIFT": KEY_MOD_LSHIFT,
|
|
Packit |
63bb0d |
"KEY_MOD_LALT": KEY_MOD_LALT,
|
|
Packit |
63bb0d |
"KEY_MOD_LMETA": KEY_MOD_LMETA,
|
|
Packit |
63bb0d |
"KEY_MOD_RCTRL": KEY_MOD_RCTRL,
|
|
Packit |
63bb0d |
"KEY_MOD_RSHIFT": KEY_MOD_RSHIFT,
|
|
Packit |
63bb0d |
"KEY_MOD_RALT": KEY_MOD_RALT,
|
|
Packit |
63bb0d |
"KEY_MOD_RMETA": KEY_MOD_RMETA,
|
|
Packit |
63bb0d |
"KEY_NONE": KEY_NONE,
|
|
Packit |
63bb0d |
"KEY_ERR_OVF": KEY_ERR_OVF,
|
|
Packit |
63bb0d |
"KEY_A": KEY_A,
|
|
Packit |
63bb0d |
"KEY_B": KEY_B,
|
|
Packit |
63bb0d |
"KEY_C": KEY_C,
|
|
Packit |
63bb0d |
"KEY_D": KEY_D,
|
|
Packit |
63bb0d |
"KEY_E": KEY_E,
|
|
Packit |
63bb0d |
"KEY_F": KEY_F,
|
|
Packit |
63bb0d |
"KEY_G": KEY_G,
|
|
Packit |
63bb0d |
"KEY_H": KEY_H,
|
|
Packit |
63bb0d |
"KEY_I": KEY_I,
|
|
Packit |
63bb0d |
"KEY_J": KEY_J,
|
|
Packit |
63bb0d |
"KEY_K": KEY_K,
|
|
Packit |
63bb0d |
"KEY_L": KEY_L,
|
|
Packit |
63bb0d |
"KEY_M": KEY_M,
|
|
Packit |
63bb0d |
"KEY_N": KEY_N,
|
|
Packit |
63bb0d |
"KEY_O": KEY_O,
|
|
Packit |
63bb0d |
"KEY_P": KEY_P,
|
|
Packit |
63bb0d |
"KEY_Q": KEY_Q,
|
|
Packit |
63bb0d |
"KEY_R": KEY_R,
|
|
Packit |
63bb0d |
"KEY_S": KEY_S,
|
|
Packit |
63bb0d |
"KEY_T": KEY_T,
|
|
Packit |
63bb0d |
"KEY_U": KEY_U,
|
|
Packit |
63bb0d |
"KEY_V": KEY_V,
|
|
Packit |
63bb0d |
"KEY_W": KEY_W,
|
|
Packit |
63bb0d |
"KEY_X": KEY_X,
|
|
Packit |
63bb0d |
"KEY_Y": KEY_Y,
|
|
Packit |
63bb0d |
"KEY_Z": KEY_Z,
|
|
Packit |
63bb0d |
"KEY_1": KEY_1,
|
|
Packit |
63bb0d |
"KEY_2": KEY_2,
|
|
Packit |
63bb0d |
"KEY_3": KEY_3,
|
|
Packit |
63bb0d |
"KEY_4": KEY_4,
|
|
Packit |
63bb0d |
"KEY_5": KEY_5,
|
|
Packit |
63bb0d |
"KEY_6": KEY_6,
|
|
Packit |
63bb0d |
"KEY_7": KEY_7,
|
|
Packit |
63bb0d |
"KEY_8": KEY_8,
|
|
Packit |
63bb0d |
"KEY_9": KEY_9,
|
|
Packit |
63bb0d |
"KEY_0": KEY_0,
|
|
Packit |
63bb0d |
"KEY_ENTER": KEY_ENTER,
|
|
Packit |
63bb0d |
"KEY_ESC": KEY_ESC,
|
|
Packit |
63bb0d |
"KEY_BACKSPACE": KEY_BACKSPACE,
|
|
Packit |
63bb0d |
"KEY_TAB": KEY_TAB,
|
|
Packit |
63bb0d |
"KEY_SPACE": KEY_SPACE,
|
|
Packit |
63bb0d |
"KEY_MINUS": KEY_MINUS,
|
|
Packit |
63bb0d |
"KEY_EQUAL": KEY_EQUAL,
|
|
Packit |
63bb0d |
"KEY_LEFTBRACE": KEY_LEFTBRACE,
|
|
Packit |
63bb0d |
"KEY_RIGHTBRACE": KEY_RIGHTBRACE,
|
|
Packit |
63bb0d |
"KEY_BACKSLASH": KEY_BACKSLASH,
|
|
Packit |
63bb0d |
"KEY_HASHTILDE": KEY_HASHTILDE,
|
|
Packit |
63bb0d |
"KEY_SEMICOLON": KEY_SEMICOLON,
|
|
Packit |
63bb0d |
"KEY_APOSTROPHE": KEY_APOSTROPHE,
|
|
Packit |
63bb0d |
"KEY_GRAVE": KEY_GRAVE,
|
|
Packit |
63bb0d |
"KEY_COMMA": KEY_COMMA,
|
|
Packit |
63bb0d |
"KEY_DOT": KEY_DOT,
|
|
Packit |
63bb0d |
"KEY_SLASH": KEY_SLASH,
|
|
Packit |
63bb0d |
"KEY_CAPSLOCK": KEY_CAPSLOCK,
|
|
Packit |
63bb0d |
"KEY_F1": KEY_F1,
|
|
Packit |
63bb0d |
"KEY_F2": KEY_F2,
|
|
Packit |
63bb0d |
"KEY_F3": KEY_F3,
|
|
Packit |
63bb0d |
"KEY_F4": KEY_F4,
|
|
Packit |
63bb0d |
"KEY_F5": KEY_F5,
|
|
Packit |
63bb0d |
"KEY_F6": KEY_F6,
|
|
Packit |
63bb0d |
"KEY_F7": KEY_F7,
|
|
Packit |
63bb0d |
"KEY_F8": KEY_F8,
|
|
Packit |
63bb0d |
"KEY_F9": KEY_F9,
|
|
Packit |
63bb0d |
"KEY_F10": KEY_F10,
|
|
Packit |
63bb0d |
"KEY_F11": KEY_F11,
|
|
Packit |
63bb0d |
"KEY_F12": KEY_F12,
|
|
Packit |
63bb0d |
"KEY_SYSRQ": KEY_SYSRQ,
|
|
Packit |
63bb0d |
"KEY_SCROLLLOCK": KEY_SCROLLLOCK,
|
|
Packit |
63bb0d |
"KEY_PAUSE": KEY_PAUSE,
|
|
Packit |
63bb0d |
"KEY_INSERT": KEY_INSERT,
|
|
Packit |
63bb0d |
"KEY_HOME": KEY_HOME,
|
|
Packit |
63bb0d |
"KEY_PAGEUP": KEY_PAGEUP,
|
|
Packit |
63bb0d |
"KEY_DELETE": KEY_DELETE,
|
|
Packit |
63bb0d |
"KEY_END": KEY_END,
|
|
Packit |
63bb0d |
"KEY_PAGEDOWN": KEY_PAGEDOWN,
|
|
Packit |
63bb0d |
"KEY_RIGHT": KEY_RIGHT,
|
|
Packit |
63bb0d |
"KEY_LEFT": KEY_LEFT,
|
|
Packit |
63bb0d |
"KEY_DOWN": KEY_DOWN,
|
|
Packit |
63bb0d |
"KEY_UP": KEY_UP,
|
|
Packit |
63bb0d |
"KEY_NUMLOCK": KEY_NUMLOCK,
|
|
Packit |
63bb0d |
"KEY_KPSLASH": KEY_KPSLASH,
|
|
Packit |
63bb0d |
"KEY_KPASTERISK": KEY_KPASTERISK,
|
|
Packit |
63bb0d |
"KEY_KPMINUS": KEY_KPMINUS,
|
|
Packit |
63bb0d |
"KEY_KPPLUS": KEY_KPPLUS,
|
|
Packit |
63bb0d |
"KEY_KPENTER": KEY_KPENTER,
|
|
Packit |
63bb0d |
"KEY_KP1": KEY_KP1,
|
|
Packit |
63bb0d |
"KEY_KP2": KEY_KP2,
|
|
Packit |
63bb0d |
"KEY_KP3": KEY_KP3,
|
|
Packit |
63bb0d |
"KEY_KP4": KEY_KP4,
|
|
Packit |
63bb0d |
"KEY_KP5": KEY_KP5,
|
|
Packit |
63bb0d |
"KEY_KP6": KEY_KP6,
|
|
Packit |
63bb0d |
"KEY_KP7": KEY_KP7,
|
|
Packit |
63bb0d |
"KEY_KP8": KEY_KP8,
|
|
Packit |
63bb0d |
"KEY_KP9": KEY_KP9,
|
|
Packit |
63bb0d |
"KEY_KP0": KEY_KP0,
|
|
Packit |
63bb0d |
"KEY_KPDOT": KEY_KPDOT,
|
|
Packit |
63bb0d |
"KEY_102ND": KEY_102ND,
|
|
Packit |
63bb0d |
"KEY_COMPOSE": KEY_COMPOSE,
|
|
Packit |
63bb0d |
"KEY_POWER": KEY_POWER,
|
|
Packit |
63bb0d |
"KEY_KPEQUAL": KEY_KPEQUAL,
|
|
Packit |
63bb0d |
"KEY_F13": KEY_F13,
|
|
Packit |
63bb0d |
"KEY_F14": KEY_F14,
|
|
Packit |
63bb0d |
"KEY_F15": KEY_F15,
|
|
Packit |
63bb0d |
"KEY_F16": KEY_F16,
|
|
Packit |
63bb0d |
"KEY_F17": KEY_F17,
|
|
Packit |
63bb0d |
"KEY_F18": KEY_F18,
|
|
Packit |
63bb0d |
"KEY_F19": KEY_F19,
|
|
Packit |
63bb0d |
"KEY_F20": KEY_F20,
|
|
Packit |
63bb0d |
"KEY_F21": KEY_F21,
|
|
Packit |
63bb0d |
"KEY_F22": KEY_F22,
|
|
Packit |
63bb0d |
"KEY_F23": KEY_F23,
|
|
Packit |
63bb0d |
"KEY_F24": KEY_F24,
|
|
Packit |
63bb0d |
"KEY_OPEN": KEY_OPEN,
|
|
Packit |
63bb0d |
"KEY_HELP": KEY_HELP,
|
|
Packit |
63bb0d |
"KEY_PROPS": KEY_PROPS,
|
|
Packit |
63bb0d |
"KEY_FRONT": KEY_FRONT,
|
|
Packit |
63bb0d |
"KEY_STOP": KEY_STOP,
|
|
Packit |
63bb0d |
"KEY_AGAIN": KEY_AGAIN,
|
|
Packit |
63bb0d |
"KEY_UNDO": KEY_UNDO,
|
|
Packit |
63bb0d |
"KEY_CUT": KEY_CUT,
|
|
Packit |
63bb0d |
"KEY_COPY": KEY_COPY,
|
|
Packit |
63bb0d |
"KEY_PASTE": KEY_PASTE,
|
|
Packit |
63bb0d |
"KEY_FIND": KEY_FIND,
|
|
Packit |
63bb0d |
"KEY_MUTE": KEY_MUTE,
|
|
Packit |
63bb0d |
"KEY_VOLUMEUP": KEY_VOLUMEUP,
|
|
Packit |
63bb0d |
"KEY_VOLUMEDOWN": KEY_VOLUMEDOWN,
|
|
Packit |
63bb0d |
"KEY_KPCOMMA": KEY_KPCOMMA,
|
|
Packit |
63bb0d |
"KEY_RO": KEY_RO,
|
|
Packit |
63bb0d |
"KEY_KATAKANAHIRAGANA": KEY_KATAKANAHIRAGANA,
|
|
Packit |
63bb0d |
"KEY_YEN": KEY_YEN,
|
|
Packit |
63bb0d |
"KEY_HENKAN": KEY_HENKAN,
|
|
Packit |
63bb0d |
"KEY_MUHENKAN": KEY_MUHENKAN,
|
|
Packit |
63bb0d |
"KEY_KPJPCOMMA": KEY_KPJPCOMMA,
|
|
Packit |
63bb0d |
"KEY_HANGEUL": KEY_HANGEUL,
|
|
Packit |
63bb0d |
"KEY_HANJA": KEY_HANJA,
|
|
Packit |
63bb0d |
"KEY_KATAKANA": KEY_KATAKANA,
|
|
Packit |
63bb0d |
"KEY_HIRAGANA": KEY_HIRAGANA,
|
|
Packit |
63bb0d |
"KEY_ZENKAKUHANKAKU": KEY_ZENKAKUHANKAKU,
|
|
Packit |
63bb0d |
"KEY_KPLEFTPAREN": KEY_KPLEFTPAREN,
|
|
Packit |
63bb0d |
"KEY_KPRIGHTPAREN": KEY_KPRIGHTPAREN,
|
|
Packit |
63bb0d |
"KEY_LEFTCTRL": KEY_LEFTCTRL,
|
|
Packit |
63bb0d |
"KEY_LEFTSHIFT": KEY_LEFTSHIFT,
|
|
Packit |
63bb0d |
"KEY_LEFTALT": KEY_LEFTALT,
|
|
Packit |
63bb0d |
"KEY_LEFTMETA": KEY_LEFTMETA,
|
|
Packit |
63bb0d |
"KEY_RIGHTCTRL": KEY_RIGHTCTRL,
|
|
Packit |
63bb0d |
"KEY_RIGHTSHIFT": KEY_RIGHTSHIFT,
|
|
Packit |
63bb0d |
"KEY_RIGHTALT": KEY_RIGHTALT,
|
|
Packit |
63bb0d |
"KEY_RIGHTMETA": KEY_RIGHTMETA,
|
|
Packit |
63bb0d |
"KEY_MEDIA_PLAYPAUSE": KEY_MEDIA_PLAYPAUSE,
|
|
Packit |
63bb0d |
"KEY_MEDIA_STOPCD": KEY_MEDIA_STOPCD,
|
|
Packit |
63bb0d |
"KEY_MEDIA_PREVIOUSSONG": KEY_MEDIA_PREVIOUSSONG,
|
|
Packit |
63bb0d |
"KEY_MEDIA_NEXTSONG": KEY_MEDIA_NEXTSONG,
|
|
Packit |
63bb0d |
"KEY_MEDIA_EJECTCD": KEY_MEDIA_EJECTCD,
|
|
Packit |
63bb0d |
"KEY_MEDIA_VOLUMEUP": KEY_MEDIA_VOLUMEUP,
|
|
Packit |
63bb0d |
"KEY_MEDIA_VOLUMEDOWN": KEY_MEDIA_VOLUMEDOWN,
|
|
Packit |
63bb0d |
"KEY_MEDIA_MUTE": KEY_MEDIA_MUTE,
|
|
Packit |
63bb0d |
"KEY_MEDIA_WWW": KEY_MEDIA_WWW,
|
|
Packit |
63bb0d |
"KEY_MEDIA_BACK": KEY_MEDIA_BACK,
|
|
Packit |
63bb0d |
"KEY_MEDIA_FORWARD": KEY_MEDIA_FORWARD,
|
|
Packit |
63bb0d |
"KEY_MEDIA_STOP": KEY_MEDIA_STOP,
|
|
Packit |
63bb0d |
"KEY_MEDIA_FIND": KEY_MEDIA_FIND,
|
|
Packit |
63bb0d |
"KEY_MEDIA_SCROLLUP": KEY_MEDIA_SCROLLUP,
|
|
Packit |
63bb0d |
"KEY_MEDIA_SCROLLDOWN": KEY_MEDIA_SCROLLDOWN,
|
|
Packit |
63bb0d |
"KEY_MEDIA_EDIT": KEY_MEDIA_EDIT,
|
|
Packit |
63bb0d |
"KEY_MEDIA_SLEEP": KEY_MEDIA_SLEEP,
|
|
Packit |
63bb0d |
"KEY_MEDIA_COFFEE": KEY_MEDIA_COFFEE,
|
|
Packit |
63bb0d |
"KEY_MEDIA_REFRESH": KEY_MEDIA_REFRESH,
|
|
Packit |
63bb0d |
"KEY_MEDIA_CALC": KEY_MEDIA_CALC,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var hidCharacterMap = map[string]hidKey{
|
|
Packit |
63bb0d |
"a": {KEY_A, false},
|
|
Packit |
63bb0d |
"b": {KEY_B, false},
|
|
Packit |
63bb0d |
"c": {KEY_C, false},
|
|
Packit |
63bb0d |
"d": {KEY_D, false},
|
|
Packit |
63bb0d |
"e": {KEY_E, false},
|
|
Packit |
63bb0d |
"f": {KEY_F, false},
|
|
Packit |
63bb0d |
"g": {KEY_G, false},
|
|
Packit |
63bb0d |
"h": {KEY_H, false},
|
|
Packit |
63bb0d |
"i": {KEY_I, false},
|
|
Packit |
63bb0d |
"j": {KEY_J, false},
|
|
Packit |
63bb0d |
"k": {KEY_K, false},
|
|
Packit |
63bb0d |
"l": {KEY_L, false},
|
|
Packit |
63bb0d |
"m": {KEY_M, false},
|
|
Packit |
63bb0d |
"n": {KEY_N, false},
|
|
Packit |
63bb0d |
"o": {KEY_O, false},
|
|
Packit |
63bb0d |
"p": {KEY_P, false},
|
|
Packit |
63bb0d |
"q": {KEY_Q, false},
|
|
Packit |
63bb0d |
"r": {KEY_R, false},
|
|
Packit |
63bb0d |
"s": {KEY_S, false},
|
|
Packit |
63bb0d |
"t": {KEY_T, false},
|
|
Packit |
63bb0d |
"u": {KEY_U, false},
|
|
Packit |
63bb0d |
"v": {KEY_V, false},
|
|
Packit |
63bb0d |
"w": {KEY_W, false},
|
|
Packit |
63bb0d |
"x": {KEY_X, false},
|
|
Packit |
63bb0d |
"y": {KEY_Y, false},
|
|
Packit |
63bb0d |
"z": {KEY_Z, false},
|
|
Packit |
63bb0d |
"1": {KEY_1, false},
|
|
Packit |
63bb0d |
"2": {KEY_2, false},
|
|
Packit |
63bb0d |
"3": {KEY_3, false},
|
|
Packit |
63bb0d |
"4": {KEY_4, false},
|
|
Packit |
63bb0d |
"5": {KEY_5, false},
|
|
Packit |
63bb0d |
"6": {KEY_6, false},
|
|
Packit |
63bb0d |
"7": {KEY_7, false},
|
|
Packit |
63bb0d |
"8": {KEY_8, false},
|
|
Packit |
63bb0d |
"9": {KEY_9, false},
|
|
Packit |
63bb0d |
"0": {KEY_0, false},
|
|
Packit |
63bb0d |
"A": {KEY_A, true},
|
|
Packit |
63bb0d |
"B": {KEY_B, true},
|
|
Packit |
63bb0d |
"C": {KEY_C, true},
|
|
Packit |
63bb0d |
"D": {KEY_D, true},
|
|
Packit |
63bb0d |
"E": {KEY_E, true},
|
|
Packit |
63bb0d |
"F": {KEY_F, true},
|
|
Packit |
63bb0d |
"G": {KEY_G, true},
|
|
Packit |
63bb0d |
"H": {KEY_H, true},
|
|
Packit |
63bb0d |
"I": {KEY_I, true},
|
|
Packit |
63bb0d |
"J": {KEY_J, true},
|
|
Packit |
63bb0d |
"K": {KEY_K, true},
|
|
Packit |
63bb0d |
"L": {KEY_L, true},
|
|
Packit |
63bb0d |
"M": {KEY_M, true},
|
|
Packit |
63bb0d |
"N": {KEY_N, true},
|
|
Packit |
63bb0d |
"O": {KEY_O, true},
|
|
Packit |
63bb0d |
"P": {KEY_P, true},
|
|
Packit |
63bb0d |
"Q": {KEY_Q, true},
|
|
Packit |
63bb0d |
"R": {KEY_R, true},
|
|
Packit |
63bb0d |
"S": {KEY_S, true},
|
|
Packit |
63bb0d |
"T": {KEY_T, true},
|
|
Packit |
63bb0d |
"U": {KEY_U, true},
|
|
Packit |
63bb0d |
"V": {KEY_V, true},
|
|
Packit |
63bb0d |
"W": {KEY_W, true},
|
|
Packit |
63bb0d |
"X": {KEY_X, true},
|
|
Packit |
63bb0d |
"Y": {KEY_Y, true},
|
|
Packit |
63bb0d |
"Z": {KEY_Z, true},
|
|
Packit |
63bb0d |
"!": {KEY_1, true},
|
|
Packit |
63bb0d |
"@": {KEY_2, true},
|
|
Packit |
63bb0d |
"#": {KEY_3, true},
|
|
Packit |
63bb0d |
"$": {KEY_4, true},
|
|
Packit |
63bb0d |
"%": {KEY_5, true},
|
|
Packit |
63bb0d |
"^": {KEY_6, true},
|
|
Packit |
63bb0d |
"&": {KEY_7, true},
|
|
Packit |
63bb0d |
"*": {KEY_8, true},
|
|
Packit |
63bb0d |
"(": {KEY_9, true},
|
|
Packit |
63bb0d |
")": {KEY_0, true},
|
|
Packit |
63bb0d |
" ": {KEY_SPACE, false},
|
|
Packit |
63bb0d |
"-": {KEY_MINUS, false},
|
|
Packit |
63bb0d |
"_": {KEY_MINUS, true},
|
|
Packit |
63bb0d |
"=": {KEY_EQUAL, false},
|
|
Packit |
63bb0d |
"+": {KEY_EQUAL, true},
|
|
Packit |
63bb0d |
"[": {KEY_LEFTBRACE, false},
|
|
Packit |
63bb0d |
"{": {KEY_LEFTBRACE, true},
|
|
Packit |
63bb0d |
"]": {KEY_RIGHTBRACE, false},
|
|
Packit |
63bb0d |
"}": {KEY_RIGHTBRACE, true},
|
|
Packit |
63bb0d |
`\`: {KEY_BACKSLASH, false},
|
|
Packit |
63bb0d |
"|": {KEY_BACKSLASH, true},
|
|
Packit |
63bb0d |
";": {KEY_SEMICOLON, false},
|
|
Packit |
63bb0d |
":": {KEY_SEMICOLON, true},
|
|
Packit |
63bb0d |
"'": {KEY_APOSTROPHE, false},
|
|
Packit |
63bb0d |
`"`: {KEY_APOSTROPHE, true},
|
|
Packit |
63bb0d |
"`": {KEY_GRAVE, false},
|
|
Packit |
63bb0d |
"~": {KEY_GRAVE, true},
|
|
Packit |
63bb0d |
",": {KEY_COMMA, false},
|
|
Packit |
63bb0d |
"<": {KEY_COMMA, true},
|
|
Packit |
63bb0d |
".": {KEY_DOT, false},
|
|
Packit |
63bb0d |
">": {KEY_DOT, true},
|
|
Packit |
63bb0d |
"/": {KEY_SLASH, false},
|
|
Packit |
63bb0d |
"?": {KEY_SLASH, true},
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type keystrokes struct {
|
|
Packit |
63bb0d |
*flags.VirtualMachineFlag
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
UsbHidCodeValue int32
|
|
Packit |
63bb0d |
UsbHidCodes string
|
|
Packit |
63bb0d |
UsbHidString string
|
|
Packit |
63bb0d |
LeftControl bool
|
|
Packit |
63bb0d |
LeftShift bool
|
|
Packit |
63bb0d |
LeftAlt bool
|
|
Packit |
63bb0d |
LeftGui bool
|
|
Packit |
63bb0d |
RightControl bool
|
|
Packit |
63bb0d |
RightShift bool
|
|
Packit |
63bb0d |
RightAlt bool
|
|
Packit |
63bb0d |
RightGui bool
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func init() {
|
|
Packit |
63bb0d |
cli.Register("vm.keystrokes", &keystrokes{})
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) Register(ctx context.Context, f *flag.FlagSet) {
|
|
Packit |
63bb0d |
cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
|
|
Packit |
63bb0d |
cmd.VirtualMachineFlag.Register(ctx, f)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
f.StringVar(&cmd.UsbHidString, "s", "", "Raw String to Send")
|
|
Packit |
63bb0d |
f.StringVar(&cmd.UsbHidCodes, "c", "", "USB HID Codes (hex) or aliases, comma separated")
|
|
Packit |
63bb0d |
f.Var(flags.NewInt32(&cmd.UsbHidCodeValue), "r", "Raw USB HID Code Value (int32)")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.LeftControl, "lc", false, "Enable/Disable Left Control")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.LeftShift, "ls", false, "Enable/Disable Left Shift")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.LeftAlt, "la", false, "Enable/Disable Left Alt")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.LeftGui, "lg", false, "Enable/Disable Left Gui")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.RightControl, "rc", false, "Enable/Disable Right Control")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.RightShift, "rs", false, "Enable/Disable Right Shift")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.RightAlt, "ra", false, "Enable/Disable Right Alt")
|
|
Packit |
63bb0d |
f.BoolVar(&cmd.RightGui, "rg", false, "Enable/Disable Right Gui")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) Usage() string {
|
|
Packit |
63bb0d |
return "VM"
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) Description() string {
|
|
Packit |
63bb0d |
description := `Send Keystrokes to VM.
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
Examples:
|
|
Packit |
63bb0d |
Default Scenario
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -s "root" # writes 'root' to the console
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -c 0x15 # writes an 'r' to the console
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -r 1376263 # writes an 'r' to the console
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -c 0x28 # presses ENTER on the console
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -c 0x4c -la=true -lc=true # sends CTRL+ALT+DEL to console
|
|
Packit |
63bb0d |
govc vm.keystrokes -vm $vm -c 0x15,KEY_ENTER # writes an 'r' to the console and press ENTER
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
List of available aliases:
|
|
Packit |
63bb0d |
`
|
|
Packit |
63bb0d |
keys := make([]string, 0)
|
|
Packit |
63bb0d |
for key, _ := range hidKeyMap {
|
|
Packit |
63bb0d |
keys = append(keys, key)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
sort.Strings(keys)
|
|
Packit |
63bb0d |
for i, key := range keys {
|
|
Packit |
63bb0d |
if i > 0 {
|
|
Packit |
63bb0d |
description += ", "
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
description += key
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return description + "\n"
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) Process(ctx context.Context) error {
|
|
Packit |
63bb0d |
if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) Run(ctx context.Context, f *flag.FlagSet) error {
|
|
Packit |
63bb0d |
vm, err := cmd.VirtualMachine()
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
if vm == nil {
|
|
Packit |
63bb0d |
return flag.ErrHelp
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
err = cmd.processUserInput(ctx, vm)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) processUserInput(ctx context.Context, vm *object.VirtualMachine) error {
|
|
Packit |
63bb0d |
if err := cmd.checkValidInputs(); err != nil {
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
codes, err := cmd.processUsbCode()
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var keyEventArray []types.UsbScanCodeSpecKeyEvent
|
|
Packit |
63bb0d |
for _, code := range codes {
|
|
Packit |
63bb0d |
leftShiftSetting := false
|
|
Packit |
63bb0d |
if code.ShiftPressed || cmd.LeftShift {
|
|
Packit |
63bb0d |
leftShiftSetting = true
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
modifiers := types.UsbScanCodeSpecModifierType{
|
|
Packit |
63bb0d |
LeftControl: &cmd.LeftControl,
|
|
Packit |
63bb0d |
LeftShift: &leftShiftSetting,
|
|
Packit |
63bb0d |
LeftAlt: &cmd.LeftAlt,
|
|
Packit |
63bb0d |
LeftGui: &cmd.LeftGui,
|
|
Packit |
63bb0d |
RightControl: &cmd.RightControl,
|
|
Packit |
63bb0d |
RightShift: &cmd.RightShift,
|
|
Packit |
63bb0d |
RightAlt: &cmd.RightAlt,
|
|
Packit |
63bb0d |
RightGui: &cmd.RightGui,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
keyEvent := types.UsbScanCodeSpecKeyEvent{
|
|
Packit |
63bb0d |
UsbHidCode: code.Code,
|
|
Packit |
63bb0d |
Modifiers: &modifiers,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
keyEventArray = append(keyEventArray, keyEvent)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
spec := types.UsbScanCodeSpec{
|
|
Packit |
63bb0d |
KeyEvents: keyEventArray,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
_, err = vm.PutUsbScanCodes(ctx, spec)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
return err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) processUsbCode() ([]hidKey, error) {
|
|
Packit |
63bb0d |
if cmd.rawCodeProvided() {
|
|
Packit |
63bb0d |
return []hidKey{{cmd.UsbHidCodeValue, false}}, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
if cmd.hexCodeProvided() {
|
|
Packit |
63bb0d |
var retKeyArray []hidKey
|
|
Packit |
63bb0d |
for _, c := range strings.Split(cmd.UsbHidCodes, ",") {
|
|
Packit |
63bb0d |
var s int32
|
|
Packit |
63bb0d |
lookupvalue, ok := hidKeyMap[c]
|
|
Packit |
63bb0d |
if ok {
|
|
Packit |
63bb0d |
s = intToHidCode(lookupvalue)
|
|
Packit |
63bb0d |
} else {
|
|
Packit |
63bb0d |
var err error
|
|
Packit |
63bb0d |
s, err = hexStringToHidCode(c)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return nil, err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
retKeyArray = append(retKeyArray, hidKey{s, false})
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return retKeyArray, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
if cmd.stringProvided() {
|
|
Packit |
63bb0d |
var retKeyArray []hidKey
|
|
Packit |
63bb0d |
for _, c := range cmd.UsbHidString {
|
|
Packit |
63bb0d |
lookupValue, ok := hidCharacterMap[string(c)]
|
|
Packit |
63bb0d |
if !ok {
|
|
Packit |
63bb0d |
return nil, fmt.Errorf("invalid Character %s in String: %s", string(c), cmd.UsbHidString)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
lookupValue.Code = intToHidCode(lookupValue.Code)
|
|
Packit |
63bb0d |
retKeyArray = append(retKeyArray, lookupValue)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return retKeyArray, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return nil, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func hexStringToHidCode(hex string) (int32, error) {
|
|
Packit |
63bb0d |
s, err := strconv.ParseInt(hex, 0, 32)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
return 0, err
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return intToHidCode(int32(s)), nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func intToHidCode(v int32) int32 {
|
|
Packit |
63bb0d |
var s int32 = v << 16
|
|
Packit |
63bb0d |
s |= 7
|
|
Packit |
63bb0d |
return s
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd *keystrokes) checkValidInputs() error {
|
|
Packit |
63bb0d |
// poor man's boolean XOR -> A xor B xor C = A'BC' + AB'C' + A'B'C + ABC
|
|
Packit |
63bb0d |
if (!cmd.rawCodeProvided() && cmd.hexCodeProvided() && !cmd.stringProvided()) || // A'BC'
|
|
Packit |
63bb0d |
(cmd.rawCodeProvided() && !cmd.hexCodeProvided() && !cmd.stringProvided()) || // AB'C'
|
|
Packit |
63bb0d |
(!cmd.rawCodeProvided() && !cmd.hexCodeProvided() && cmd.stringProvided()) || // A'B'C
|
|
Packit |
63bb0d |
(cmd.rawCodeProvided() && cmd.hexCodeProvided() && cmd.stringProvided()) { // ABC
|
|
Packit |
63bb0d |
return nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return fmt.Errorf("specify only 1 argument")
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd keystrokes) rawCodeProvided() bool {
|
|
Packit |
63bb0d |
return cmd.UsbHidCodeValue != 0
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd keystrokes) hexCodeProvided() bool {
|
|
Packit |
63bb0d |
return cmd.UsbHidCodes != ""
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (cmd keystrokes) stringProvided() bool {
|
|
Packit |
63bb0d |
return cmd.UsbHidString != ""
|
|
Packit |
63bb0d |
}
|