Skip to content
Snippets Groups Projects
Commit f1bf9b59 authored by Florent Gluck's avatar Florent Gluck
Browse files

Major overhaul of the codebase to break source files into multiple packages...

Major overhaul of the codebase to break source files into multiple packages instead of having everything in a single package at the root src dir
parent 19ea107e
No related branches found
No related tags found
No related merge requests found
Showing
with 601 additions and 59 deletions
package cmd
type Command interface {
GetName() string
GetDesc() string
PrintUsage()
Run(args []string) int // Returns 0 if the Command was successful.
}
module nexus-client/cmd
go 1.18
module nexus-client/cmdLogin
go 1.18
package main
package cmdLogin
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
import (
"errors"
"encoding/json"
)
type CmdLogin struct {
name string
type Login struct {
Name string
}
func (cmd *CmdLogin)Name() string {
return cmd.name
func (cmd *Login)GetName() string {
return cmd.Name
}
func (cmd *CmdLogin)Desc() string {
func (cmd *Login)GetDesc() string {
return "Login and obtain an access token"
}
func (cmd *CmdLogin)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" email password")
func (cmd *Login)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" email password")
}
func (cmd *CmdLogin)Run(args []string) int {
func (cmd *Login)Run(args []string) int {
if len(args) != 2 {
cmd.PrintUsage()
return 1
......@@ -32,11 +37,11 @@ func (cmd *CmdLogin)Run(args []string) int {
pwd := args[1]
token, err := login(email, pwd)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
println(token)
u.Println(token)
return 0
}
......@@ -46,6 +51,9 @@ func (cmd *CmdLogin)Run(args []string) int {
// Returns a jwt token if authentication was successful:
// {"token":"<jwt token>"}
func login(user string, pwd string) (string, error) {
client := g.GetInstance().Client
host := g.GetInstance().Host
type LoginArgs struct {
Email string
Pwd string
......
module nexus-client/cmdTpl
go 1.18
package main
package cmdTemplate
type CmdTemplateCreate struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type Create struct {
Name string
}
func (cmd *CmdTemplateCreate)Name() string {
return cmd.name
func (cmd *Create)GetName() string {
return cmd.Name
}
func (cmd *CmdTemplateCreate)Desc() string {
func (cmd *Create)GetDesc() string {
return "Create a template"
}
func (cmd *CmdTemplateCreate)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" vmID name access")
printlnErr("Notes: access is either \"public\" or \"private\"")
func (cmd *Create)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" vmID name access")
u.PrintlnErr("Notes: access is either \"public\" or \"private\"")
}
func (cmd *CmdTemplateCreate)Run(args []string) int {
func (cmd *Create)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc != 3 {
cmd.PrintUsage()
......@@ -39,15 +47,15 @@ func (cmd *CmdTemplateCreate)Run(args []string) int {
resp, err := client.R().SetBody(templateArgs).Post(host+"/templates")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
package main
package cmdTemplate
type CmdTemplateDel struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type Del struct {
Name string
}
func (cmd *CmdTemplateDel)Name() string {
return cmd.name
func (cmd *Del)GetName() string {
return cmd.Name
}
func (cmd *CmdTemplateDel)Desc() string {
func (cmd *Del)GetDesc() string {
return "Delete one or more templates"
}
func (cmd *CmdTemplateDel)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" id [id ...]")
func (cmd *Del)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" id [id ...]")
}
func (cmd *CmdTemplateDel)Run(args []string) int {
func (cmd *Del)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc < 1 {
cmd.PrintUsage()
......@@ -31,13 +39,13 @@ func (cmd *CmdTemplateDel)Run(args []string) int {
id := args[i]
resp, err := client.R().Delete(host+"/templates/"+id)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
statusCode = 1
} else {
if resp.IsSuccess() {
println("Template \""+id+"\" deleted.")
u.Println("Template \""+id+"\" deleted.")
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
statusCode = 1
}
}
......
package main
package cmdTemplate
type CmdTemplateList struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type List struct {
Name string
}
func (cmd *CmdTemplateList)Name() string {
return cmd.name
func (cmd *List)GetName() string {
return cmd.Name
}
func (cmd *CmdTemplateList)Desc() string {
func (cmd *List)GetDesc() string {
return "List one or more templates"
}
func (cmd *CmdTemplateList)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" [id]")
func (cmd *List)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" [id]")
}
func (cmd *CmdTemplateList)Run(args []string) int {
func (cmd *List)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if !(argc == 0 || argc == 1) {
cmd.PrintUsage()
......@@ -34,15 +42,15 @@ func (cmd *CmdTemplateList)Run(args []string) int {
resp, err := client.R().Get(url)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
module nexus-client/cmdUser
go 1.18
require golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
require (
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect
)
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
package main
package cmdUser
type CmdUserAdd struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type Add struct {
Name string
}
func (cmd *CmdUserAdd)Name() string {
return cmd.name
func (cmd *Add)GetName() string {
return cmd.Name
}
func (cmd *CmdUserAdd)Desc() string {
func (cmd *Add)GetDesc() string {
return "Add a user"
}
func (cmd *CmdUserAdd)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" email firstname lastname password [capability1 capability2 ...]")
func (cmd *Add)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" email firstname lastname password [capability1 capability2 ...]")
}
func (cmd *CmdUserAdd)Run(args []string) int {
func (cmd *Add)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc < 4 {
cmd.PrintUsage()
......@@ -48,15 +56,15 @@ func (cmd *CmdUserAdd)Run(args []string) int {
resp, err := client.R().SetBody(userArgs).Post(host+"/users")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
package main
package cmdUser
type CmdUserDel struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type Del struct {
Name string
}
func (cmd *CmdUserDel)Name() string {
return cmd.name
func (cmd *Del)GetName() string {
return cmd.Name
}
func (cmd *CmdUserDel)Desc() string {
func (cmd *Del)GetDesc() string {
return "Delete one or more users"
}
func (cmd *CmdUserDel)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" email [email ...]")
func (cmd *Del)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" email [email ...]")
}
func (cmd *CmdUserDel)Run(args []string) int {
func (cmd *Del)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc < 1 {
cmd.PrintUsage()
......@@ -31,13 +39,13 @@ func (cmd *CmdUserDel)Run(args []string) int {
email := args[i]
resp, err := client.R().Delete(host+"/users/"+email)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
statusCode = 1
} else {
if resp.IsSuccess() {
println("User "+email+" deleted.")
u.Println("User "+email+" deleted.")
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
statusCode = 1
}
}
......
package main
package cmdUser
type CmdUserList struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type List struct {
Name string
}
func (cmd *CmdUserList)Name() string {
return cmd.name
func (cmd *List)GetName() string {
return cmd.Name
}
func (cmd *CmdUserList)Desc() string {
func (cmd *List)GetDesc() string {
return "List one or all users"
}
func (cmd *CmdUserList)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" [email]")
func (cmd *List)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" [email]")
}
func (cmd *CmdUserList)Run(args []string) int {
func (cmd *List)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if !(argc == 0 || argc == 1) {
cmd.PrintUsage()
......@@ -34,15 +42,15 @@ func (cmd *CmdUserList)Run(args []string) int {
resp, err := client.R().Get(url)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
package main
package cmdUser
type CmdUserSetCaps struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type SetCaps struct {
Name string
}
func (cmd *CmdUserSetCaps)Name() string {
return cmd.name
func (cmd *SetCaps)GetName() string {
return cmd.Name
}
func (cmd *CmdUserSetCaps)Desc() string {
func (cmd *SetCaps)GetDesc() string {
return "Set a user's capabilities"
}
func (cmd *CmdUserSetCaps)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" email [capability1 capability2 ...]")
func (cmd *SetCaps)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" email [capability1 capability2 ...]")
}
func (cmd *CmdUserSetCaps)Run(args []string) int {
func (cmd *SetCaps)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc < 1 {
cmd.PrintUsage()
......@@ -37,15 +45,15 @@ func (cmd *CmdUserSetCaps)Run(args []string) int {
resp, err := client.R().SetBody(capsArgs).Put(host+"/users/"+email+"/caps")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
package main
package cmdUser
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
import (
"bytes"
"golang.org/x/crypto/ssh/terminal"
)
type CmdUpdatePwd struct {
name string
type UpdatePwd struct {
Name string
}
func (cmd *CmdUpdatePwd)Name() string {
return cmd.name
func (cmd *UpdatePwd)GetName() string {
return cmd.Name
}
func (cmd *CmdUpdatePwd)Desc() string {
func (cmd *UpdatePwd)GetDesc() string {
return "Update the current user's password"
}
func (cmd *CmdUpdatePwd)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name)
func (cmd *UpdatePwd)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name)
}
func (cmd *CmdUpdatePwd)Run(args []string) int {
func (cmd *UpdatePwd)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc != 0 {
cmd.PrintUsage()
......@@ -30,23 +38,23 @@ func (cmd *CmdUpdatePwd)Run(args []string) int {
}
// Read the new password from stdin
print("New password: ")
u.Print("New password: ")
newPwd, err := terminal.ReadPassword(0)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
print("\nRetype new password: ")
u.Print("\nRetype new password: ")
newPwd2, err := terminal.ReadPassword(0)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
println("")
u.Println("")
if !bytes.Equal(newPwd, newPwd2) {
printlnErr("Sorry, passwords do not match!")
printlnErr("Password unchanged.")
u.PrintlnErr("Sorry, passwords do not match!")
u.PrintlnErr("Password unchanged.")
return 1
}
......@@ -59,14 +67,14 @@ func (cmd *CmdUpdatePwd)Run(args []string) int {
pwdArgs := &PwdArgs{pwdStr}
resp, err := client.R().SetBody(pwdArgs).Put(host+"/users/pwd")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
} else {
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
......
package main
package cmdUser
type CmdWhoami struct {
name string
import (
u "nexus-client/utils"
g "nexus-client/globals"
)
type Whoami struct {
Name string
}
func (cmd *CmdWhoami)Name() string {
return cmd.name
func (cmd *Whoami)GetName() string {
return cmd.Name
}
func (cmd *CmdWhoami)Desc() string {
func (cmd *Whoami)GetDesc() string {
return "Display the currently authenticated user's details"
}
func (cmd *CmdWhoami)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name)
func (cmd *Whoami)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name)
}
func (cmd *CmdWhoami)Run(args []string) int {
func (cmd *Whoami)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc != 0 {
cmd.PrintUsage()
......@@ -26,14 +34,14 @@ func (cmd *CmdWhoami)Run(args []string) int {
resp, err := client.R().Get(host+"/users/whoami")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
} else {
if resp.IsSuccess() {
println(resp)
u.Println(resp)
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
......
module nexus-client/cmdVM
go 1.18
require github.com/google/uuid v1.3.0
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
package main
package cmdVM
import (
"strings"
"regexp"
"encoding/json"
"nexus-client/cmd"
u "nexus-client/utils"
g "nexus-client/globals"
"github.com/google/uuid"
"github.com/go-resty/resty/v2"
)
......@@ -48,16 +51,16 @@ func (vm *VM)String() string {
return string(output)
}
func printUsage(cmd Command) {
printlnErr(cmd.Desc())
printlnErr("Usage: ",cmd.Name()," [vmID] [regex]")
printlnErr("Only VMs matching either the specified vmID or regex will be listed.")
printlnErr("Any number of vmID or regex can be specified.")
printlnErr("The regex matches the VM's name only and is case-insensitive.")
printlnErr("Regex examples:")
printlnErr(" \"\" -> matches any name")
printlnErr(" \".\" -> matches any name")
printlnErr(" \"bla\" -> matches any name containing \"bla\"")
func printUsage(c cmd.Command) {
u.PrintlnErr(c.GetDesc())
u.PrintlnErr("Usage: ",c.GetName()," [vmID] [regex]")
u.PrintlnErr("Only VMs matching either the specified vmID or regex will be listed.")
u.PrintlnErr("Any number of vmID or regex can be specified.")
u.PrintlnErr("The regex matches the VM's name only and is case-insensitive.")
u.PrintlnErr("Regex examples:")
u.PrintlnErr(" \"\" -> matches any name")
u.PrintlnErr(" \".\" -> matches any name")
u.PrintlnErr(" \"bla\" -> matches any name containing \"bla\"")
}
// Call the given route and filter the results based on vmID and regex.
......@@ -71,10 +74,13 @@ func printUsage(cmd Command) {
// "" -> matches everything
// "." -> matches everything
// "bla" -> matches any VM name containing "bla"
func getFilteredVMs(cmd Command, args []string, route string) int {
func getFilteredVMs(c cmd.Command, args []string, route string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
argc := len(args)
if argc < 1 {
cmd.PrintUsage()
c.PrintUsage()
return 1
}
......@@ -92,14 +98,14 @@ func getFilteredVMs(cmd Command, args []string, route string) int {
resp, err := client.R().Get(host+route)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
if resp.IsSuccess() {
vms, err := getVMs(resp)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
......@@ -107,7 +113,7 @@ func getFilteredVMs(cmd Command, args []string, route string) int {
found := false
for _, id := range ids {
if id == vm.ID.String() {
println(vm.String())
u.Println(vm.String())
found = true
break
}
......@@ -118,10 +124,10 @@ func getFilteredVMs(cmd Command, args []string, route string) int {
for _, namePattern := range namePatterns {
match, err := regexp.MatchString(strings.ToLower(namePattern), strings.ToLower(vm.Name))
if err != nil {
printlnErr("Error matching \""+namePattern+"\": "+err.Error())
u.PrintlnErr("Error matching \""+namePattern+"\": "+err.Error())
} else {
if match {
println(vm.String())
u.Println(vm.String())
break
}
}
......@@ -129,7 +135,7 @@ func getFilteredVMs(cmd Command, args []string, route string) int {
}
return 0
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
......
package main
package cmdVM
import (
)
import (
"os/exec"
"strconv"
"encoding/json"
"github.com/google/uuid"
u "nexus-client/utils"
g "nexus-client/globals"
)
type CmdVMAttach struct {
name string
type Attach struct {
Name string
}
func (cmd *CmdVMAttach)Name() string {
return cmd.name
func (cmd *Attach)GetName() string {
return cmd.Name
}
func (cmd *CmdVMAttach)Desc() string {
func (cmd *Attach)GetDesc() string {
return "Attach to a VM in order to see its desktop"
}
func (cmd *CmdVMAttach)PrintUsage() {
printlnErr(cmd.Desc())
printlnErr("Usage: "+cmd.name+" vmID")
func (cmd *Attach)PrintUsage() {
u.PrintlnErr(cmd.GetDesc())
u.PrintlnErr("Usage: "+cmd.Name+" vmID")
}
func (cmd *CmdVMAttach)Run(args []string) int {
func (cmd *Attach)Run(args []string) int {
client := g.GetInstance().Client
host := g.GetInstance().Host
hostname := g.GetInstance().Hostname
pubCert := g.GetInstance().PubCert
argc := len(args)
if argc != 1 {
cmd.PrintUsage()
......@@ -35,7 +45,7 @@ func (cmd *CmdVMAttach)Run(args []string) int {
resp, err := client.R().Get(host+"/vms/"+id+"/list")
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
......@@ -68,7 +78,7 @@ func (cmd *CmdVMAttach)Run(args []string) int {
var vm VM
err = json.Unmarshal(resp.Body(), &vm)
if err != nil {
printlnErr("Error: "+err.Error())
u.PrintlnErr("Error: "+err.Error())
return 1
}
......@@ -79,17 +89,17 @@ func (cmd *CmdVMAttach)Run(args []string) int {
spiceSecure := "--spice-secure-channels=all"
cmd := exec.Command("remote-viewer", spice, spiceCert, spiceSecure) //, "-k", "--kiosk-quit=on-disconnect")
if err = cmd.Run(); err != nil {
printlnErr("Failed attaching to VM: "+err.Error())
u.PrintlnErr("Failed attaching to VM: "+err.Error())
return 1
}
return 0
} else {
printlnErr("Can only attach to a running VM!")
u.PrintlnErr("Can only attach to a running VM!")
return 1
}
} else {
printlnErr("Error: "+resp.Status()+": "+resp.String())
u.PrintlnErr("Error: "+resp.Status()+": "+resp.String())
return 1
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment