Blame vendor/github.com/vmware/govmomi/govc/vm/keystrokes.go

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
}