From 3ce553542ec004336084a81a719c6430506ac080 Mon Sep 17 00:00:00 2001
From: Florent Gluck <florent.gluck@hesge.ch>
Date: Tue, 10 Dec 2024 13:43:28 +0100
Subject: [PATCH] moved globals package from nexus-client to nexus-libclient

---
 src/client/cmdLogin/login.go                 |   2 +-
 src/client/cmdTemplate/templateCreate.go     |   2 +-
 src/client/cmdTemplate/templateDel.go        |   2 +-
 src/client/cmdTemplate/templateEdit.go       |   2 +-
 src/client/cmdTemplate/templateExportDisk.go |   2 +-
 src/client/cmdUser/userAdd.go                |   2 +-
 src/client/cmdUser/userDel.go                |   2 +-
 src/client/cmdUser/userList.go               |   2 +-
 src/client/cmdUser/userResetPwd.go           |   2 +-
 src/client/cmdUser/userSetCaps.go            |   2 +-
 src/client/cmdUser/userUnlock.go             |   2 +-
 src/client/cmdUser/userUpdatePwd.go          |   2 +-
 src/client/cmdUser/userWhoami.go             |   2 +-
 src/client/cmdVM/attachHelper.go             |   2 +-
 src/client/cmdVM/helper.go                   |   2 +-
 src/client/cmdVM/vmAddAccess.go              |   2 +-
 src/client/cmdVM/vmAttachAsyncSingle.go      |   2 +-
 src/client/cmdVM/vmAttachFromPwd.go          |   2 +-
 src/client/cmdVM/vmCreate.go                 |   2 +-
 src/client/cmdVM/vmCreds2csv.go              |   2 +-
 src/client/cmdVM/vmDel.go                    |   2 +-
 src/client/cmdVM/vmDelAccess.go              |   2 +-
 src/client/cmdVM/vmEdit.go                   |   2 +-
 src/client/cmdVM/vmExportDir.go              |   2 +-
 src/client/cmdVM/vmImportDir.go              |   2 +-
 src/client/cmdVM/vmListSingle.go             |   2 +-
 src/client/cmdVM/vmReboot.go                 |   2 +-
 src/client/cmdVM/vmShutdown.go               |   2 +-
 src/client/cmdVM/vmStart.go                  |  92 +++++------
 src/client/cmdVM/vmStartAttach.go            | 154 +++++++++----------
 src/client/cmdVM/vmStartWithCreds.go         | 134 ++++++++--------
 src/client/cmdVM/vmStop.go                   |  92 +++++------
 src/client/cmdVersion/version.go             |   2 +-
 src/client/nexus-cli/nexus-cli.go            |   2 +-
 src/client/nexus-exam/nexus-exam.go          |   2 +-
 src/client/nexush/nexush.go                  |   2 +-
 src/client/utils/csv.go                      |   2 +-
 src/{client => libclient}/globals/Globals.go |   0
 src/libclient/template/templateList.go       |   2 +-
 src/libclient/token/tokenRefresh.go          |   2 +-
 40 files changed, 271 insertions(+), 271 deletions(-)
 rename src/{client => libclient}/globals/Globals.go (100%)

diff --git a/src/client/cmdLogin/login.go b/src/client/cmdLogin/login.go
index d2960f7..382fb3b 100644
--- a/src/client/cmdLogin/login.go
+++ b/src/client/cmdLogin/login.go
@@ -3,9 +3,9 @@ package cmdLogin
 import (
 	"encoding/json"
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"syscall"
 
 	"golang.org/x/term"
diff --git a/src/client/cmdTemplate/templateCreate.go b/src/client/cmdTemplate/templateCreate.go
index 44eda68..92eb109 100644
--- a/src/client/cmdTemplate/templateCreate.go
+++ b/src/client/cmdTemplate/templateCreate.go
@@ -1,9 +1,9 @@
 package cmdTemplate
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 
 	"github.com/go-resty/resty/v2"
 	"github.com/google/uuid"
diff --git a/src/client/cmdTemplate/templateDel.go b/src/client/cmdTemplate/templateDel.go
index b1a7be6..e5bbd49 100644
--- a/src/client/cmdTemplate/templateDel.go
+++ b/src/client/cmdTemplate/templateDel.go
@@ -1,8 +1,8 @@
 package cmdTemplate
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Del struct {
diff --git a/src/client/cmdTemplate/templateEdit.go b/src/client/cmdTemplate/templateEdit.go
index a8b4f05..c770bb5 100644
--- a/src/client/cmdTemplate/templateEdit.go
+++ b/src/client/cmdTemplate/templateEdit.go
@@ -2,9 +2,9 @@ package cmdTemplate
 
 import (
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"strings"
 )
 
diff --git a/src/client/cmdTemplate/templateExportDisk.go b/src/client/cmdTemplate/templateExportDisk.go
index e8b9d4e..abea4af 100644
--- a/src/client/cmdTemplate/templateExportDisk.go
+++ b/src/client/cmdTemplate/templateExportDisk.go
@@ -1,8 +1,8 @@
 package cmdTemplate
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type ExportDisk struct {
diff --git a/src/client/cmdUser/userAdd.go b/src/client/cmdUser/userAdd.go
index bb3973a..0dbdc6e 100644
--- a/src/client/cmdUser/userAdd.go
+++ b/src/client/cmdUser/userAdd.go
@@ -4,10 +4,10 @@ import (
 	"encoding/csv"
 	"errors"
 	"io"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/caps"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"os"
 	"strings"
 )
diff --git a/src/client/cmdUser/userDel.go b/src/client/cmdUser/userDel.go
index b32dd2f..6ea96fa 100644
--- a/src/client/cmdUser/userDel.go
+++ b/src/client/cmdUser/userDel.go
@@ -4,8 +4,8 @@ import (
 	"encoding/csv"
 	"errors"
 	"io"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 	"os"
 )
 
diff --git a/src/client/cmdUser/userList.go b/src/client/cmdUser/userList.go
index e66f119..196d19e 100644
--- a/src/client/cmdUser/userList.go
+++ b/src/client/cmdUser/userList.go
@@ -2,9 +2,9 @@ package cmdUser
 
 import (
 	"fmt"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"regexp"
 	"strings"
 )
diff --git a/src/client/cmdUser/userResetPwd.go b/src/client/cmdUser/userResetPwd.go
index 772dd77..2744134 100644
--- a/src/client/cmdUser/userResetPwd.go
+++ b/src/client/cmdUser/userResetPwd.go
@@ -2,8 +2,8 @@ package cmdUser
 
 import (
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type ResetPwd struct {
diff --git a/src/client/cmdUser/userSetCaps.go b/src/client/cmdUser/userSetCaps.go
index 61e76d2..1fde3d1 100644
--- a/src/client/cmdUser/userSetCaps.go
+++ b/src/client/cmdUser/userSetCaps.go
@@ -4,10 +4,10 @@ import (
 	"encoding/csv"
 	"errors"
 	"io"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/caps"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"os"
 	"strings"
 )
diff --git a/src/client/cmdUser/userUnlock.go b/src/client/cmdUser/userUnlock.go
index 5725307..219d307 100644
--- a/src/client/cmdUser/userUnlock.go
+++ b/src/client/cmdUser/userUnlock.go
@@ -2,8 +2,8 @@ package cmdUser
 
 import (
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Unlock struct {
diff --git a/src/client/cmdUser/userUpdatePwd.go b/src/client/cmdUser/userUpdatePwd.go
index 3dc52be..4c6e38d 100644
--- a/src/client/cmdUser/userUpdatePwd.go
+++ b/src/client/cmdUser/userUpdatePwd.go
@@ -2,9 +2,9 @@ package cmdUser
 
 import (
 	"bytes"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 
 	"golang.org/x/crypto/ssh/terminal"
 )
diff --git a/src/client/cmdUser/userWhoami.go b/src/client/cmdUser/userWhoami.go
index 5b36fba..3af8624 100644
--- a/src/client/cmdUser/userWhoami.go
+++ b/src/client/cmdUser/userWhoami.go
@@ -1,8 +1,8 @@
 package cmdUser
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Whoami struct {
diff --git a/src/client/cmdVM/attachHelper.go b/src/client/cmdVM/attachHelper.go
index 6a99cf9..f607e0d 100644
--- a/src/client/cmdVM/attachHelper.go
+++ b/src/client/cmdVM/attachHelper.go
@@ -5,10 +5,10 @@ import (
 	"errors"
 	"fmt"
 	"nexus-client/exec"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 	"sync"
 
 	"github.com/go-playground/validator/v10"
diff --git a/src/client/cmdVM/helper.go b/src/client/cmdVM/helper.go
index 9aab884..5ffd553 100644
--- a/src/client/cmdVM/helper.go
+++ b/src/client/cmdVM/helper.go
@@ -4,9 +4,9 @@ import (
 	"encoding/json"
 	"errors"
 	"nexus-client/cmd"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 	"regexp"
 	"strings"
 
diff --git a/src/client/cmdVM/vmAddAccess.go b/src/client/cmdVM/vmAddAccess.go
index 947eb7a..d53c59d 100644
--- a/src/client/cmdVM/vmAddAccess.go
+++ b/src/client/cmdVM/vmAddAccess.go
@@ -5,10 +5,10 @@ import (
 	"errors"
 	"io"
 	"net/mail"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/caps"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 	"os"
 	"strings"
 )
diff --git a/src/client/cmdVM/vmAttachAsyncSingle.go b/src/client/cmdVM/vmAttachAsyncSingle.go
index bc17e8f..f088d1e 100644
--- a/src/client/cmdVM/vmAttachAsyncSingle.go
+++ b/src/client/cmdVM/vmAttachAsyncSingle.go
@@ -2,9 +2,9 @@ package cmdVM
 
 import (
 	"nexus-client/exec"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 )
 
 type AttachAsyncSingle struct {
diff --git a/src/client/cmdVM/vmAttachFromPwd.go b/src/client/cmdVM/vmAttachFromPwd.go
index 9d1ed6b..d3e1fb8 100644
--- a/src/client/cmdVM/vmAttachFromPwd.go
+++ b/src/client/cmdVM/vmAttachFromPwd.go
@@ -4,10 +4,10 @@ import (
 	"encoding/json"
 	"nexus-client/exec"
 	e "nexus-client/exec"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 
 	"github.com/go-playground/validator/v10"
 )
diff --git a/src/client/cmdVM/vmCreate.go b/src/client/cmdVM/vmCreate.go
index bbfb415..38198dc 100644
--- a/src/client/cmdVM/vmCreate.go
+++ b/src/client/cmdVM/vmCreate.go
@@ -2,10 +2,10 @@ package cmdVM
 
 import (
 	"fmt"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 	"strconv"
 
 	"github.com/google/uuid"
diff --git a/src/client/cmdVM/vmCreds2csv.go b/src/client/cmdVM/vmCreds2csv.go
index a46719a..5474cd9 100644
--- a/src/client/cmdVM/vmCreds2csv.go
+++ b/src/client/cmdVM/vmCreds2csv.go
@@ -2,8 +2,8 @@ package cmdVM
 
 import (
 	"fmt"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 	"os"
 )
 
diff --git a/src/client/cmdVM/vmDel.go b/src/client/cmdVM/vmDel.go
index c788dea..5251c0f 100644
--- a/src/client/cmdVM/vmDel.go
+++ b/src/client/cmdVM/vmDel.go
@@ -1,8 +1,8 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Del struct {
diff --git a/src/client/cmdVM/vmDelAccess.go b/src/client/cmdVM/vmDelAccess.go
index cf14dc4..c830076 100644
--- a/src/client/cmdVM/vmDelAccess.go
+++ b/src/client/cmdVM/vmDelAccess.go
@@ -5,8 +5,8 @@ import (
 	"errors"
 	"io"
 	"net/mail"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 	"os"
 )
 
diff --git a/src/client/cmdVM/vmEdit.go b/src/client/cmdVM/vmEdit.go
index 1beae87..0a1cf1a 100644
--- a/src/client/cmdVM/vmEdit.go
+++ b/src/client/cmdVM/vmEdit.go
@@ -2,10 +2,10 @@ package cmdVM
 
 import (
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 	"strconv"
 	"strings"
 )
diff --git a/src/client/cmdVM/vmExportDir.go b/src/client/cmdVM/vmExportDir.go
index ccb30e2..61b5521 100644
--- a/src/client/cmdVM/vmExportDir.go
+++ b/src/client/cmdVM/vmExportDir.go
@@ -1,9 +1,9 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 )
 
 type ExportDir struct {
diff --git a/src/client/cmdVM/vmImportDir.go b/src/client/cmdVM/vmImportDir.go
index 60db0a6..3e04a94 100644
--- a/src/client/cmdVM/vmImportDir.go
+++ b/src/client/cmdVM/vmImportDir.go
@@ -1,8 +1,8 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 	"os"
 )
 
diff --git a/src/client/cmdVM/vmListSingle.go b/src/client/cmdVM/vmListSingle.go
index 3c08662..f8f35d5 100644
--- a/src/client/cmdVM/vmListSingle.go
+++ b/src/client/cmdVM/vmListSingle.go
@@ -1,8 +1,8 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type ListSingle struct {
diff --git a/src/client/cmdVM/vmReboot.go b/src/client/cmdVM/vmReboot.go
index ff7b1c4..6faee71 100644
--- a/src/client/cmdVM/vmReboot.go
+++ b/src/client/cmdVM/vmReboot.go
@@ -1,8 +1,8 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Reboot struct {
diff --git a/src/client/cmdVM/vmShutdown.go b/src/client/cmdVM/vmShutdown.go
index 214fdb3..e7108cb 100644
--- a/src/client/cmdVM/vmShutdown.go
+++ b/src/client/cmdVM/vmShutdown.go
@@ -1,8 +1,8 @@
 package cmdVM
 
 import (
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Shutdown struct {
diff --git a/src/client/cmdVM/vmStart.go b/src/client/cmdVM/vmStart.go
index 5963e21..f556b3a 100644
--- a/src/client/cmdVM/vmStart.go
+++ b/src/client/cmdVM/vmStart.go
@@ -1,68 +1,68 @@
 package cmdVM
 
 import (
-    u "nexus-client/utils"
-    g "nexus-client/globals"
+	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Start struct {
-    Name string
+	Name string
 }
 
-func (cmd *Start)GetName() string {
-    return cmd.Name
+func (cmd *Start) GetName() string {
+	return cmd.Name
 }
 
-func (cmd *Start)GetDesc() []string {
-    return []string{
-        "Starts one or more VMs.",
-        "If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability."}
+func (cmd *Start) GetDesc() []string {
+	return []string{
+		"Starts one or more VMs.",
+		"If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability."}
 }
 
-func (cmd *Start)PrintUsage() {
-    printRegexUsage(cmd)
-    printRegexUsageDetails()
+func (cmd *Start) PrintUsage() {
+	printRegexUsage(cmd)
+	printRegexUsageDetails()
 }
 
-func (cmd *Start)Run(args []string) int {
-    client := g.GetInstance().Client
-    host := g.GetInstance().Host
+func (cmd *Start) Run(args []string) int {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
 
-    argc := len(args)
-    if argc < 1 {
-        cmd.PrintUsage()
-        return 1
-    }
+	argc := len(args)
+	if argc < 1 {
+		cmd.PrintUsage()
+		return 1
+	}
 
-    vms, err := getFilteredVMs("/vms/start", args)
-    if err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
+	vms, err := getFilteredVMs("/vms/start", args)
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
 
-    if len(vms) == 0 {
-        u.PrintlnErr("Error: VM(s) not found.")
-        return 1
-    }
+	if len(vms) == 0 {
+		u.PrintlnErr("Error: VM(s) not found.")
+		return 1
+	}
 
-    statusCode := 0
+	statusCode := 0
 
-    for _, vm := range(vms) {
-        uuid := vm.ID.String()
-        resp, err := client.R().Put(host+"/vms/"+uuid+"/start")
-        if err != nil {
-            u.PrintlnErr("Failed starting VM \""+vm.Name+"\": "+err.Error())
-            statusCode = 1
-        } else {
-            if resp.IsSuccess() {
-                u.Println("Started VM \""+vm.Name+"\"")
-            } else {
-                u.PrintlnErr("Failed starting VM \""+vm.Name+"\": "+resp.Status()+": "+resp.String())
-                statusCode = 1
-            }
-        }
+	for _, vm := range vms {
+		uuid := vm.ID.String()
+		resp, err := client.R().Put(host + "/vms/" + uuid + "/start")
+		if err != nil {
+			u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Started VM \"" + vm.Name + "\"")
+			} else {
+				u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + resp.Status() + ": " + resp.String())
+				statusCode = 1
+			}
+		}
 
-    }
+	}
 
-    return statusCode
+	return statusCode
 }
diff --git a/src/client/cmdVM/vmStartAttach.go b/src/client/cmdVM/vmStartAttach.go
index 619b153..b684f06 100644
--- a/src/client/cmdVM/vmStartAttach.go
+++ b/src/client/cmdVM/vmStartAttach.go
@@ -1,96 +1,96 @@
 package cmdVM
 
 import (
-    "nexus-client/exec"
-    g "nexus-client/globals"
-    u "nexus-client/utils"
+	"nexus-client/exec"
+	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type StartAttach struct {
-    Name string
+	Name string
 }
 
 func (cmd *StartAttach) GetName() string {
-    return cmd.Name
+	return cmd.Name
 }
 
 func (cmd *StartAttach) GetDesc() []string {
-    return []string{
-        "Starts one or more VMs and attaches them in order to use their desktop environment.",
-        "If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability",
-        "and VM_ATTACH VM access capability or VM_ATTACH_ANY user capability."}
+	return []string{
+		"Starts one or more VMs and attaches them in order to use their desktop environment.",
+		"If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability",
+		"and VM_ATTACH VM access capability or VM_ATTACH_ANY user capability."}
 }
 
 func (cmd *StartAttach) PrintUsage() {
-    printRegexUsage(cmd)
-    printRegexUsageDetails()
+	printRegexUsage(cmd)
+	printRegexUsageDetails()
 }
 
 func (cmd *StartAttach) Run(args []string) int {
-    client := g.GetInstance().Client
-    host := g.GetInstance().Host
-
-    argc := len(args)
-    if argc < 1 {
-        cmd.PrintUsage()
-        return 1
-    }
-
-    if err := exec.CheckRemoteViewer(); err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
-
-    vms, err := getFilteredVMs("/vms/start", args)
-    if err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
-
-    if len(vms) == 0 {
-        u.PrintlnErr("Error: VM(s) not found.")
-        return 1
-    }
-
-    statusCode := 0
-
-    for _, vm := range vms {
-        uuid := vm.ID.String()
-        resp, err := client.R().Put(host + "/vms/" + uuid + "/start")
-        if err != nil {
-            u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + err.Error())
-            statusCode = 1
-        } else {
-            if resp.IsSuccess() {
-                u.Println("Started VM \"" + vm.Name + "\"")
-            } else {
-                u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + resp.Status() + ": " + resp.String())
-                statusCode = 1
-            }
-        }
-
-    }
-
-    // at this point, the returned filtered credentials only works for VMs that started successfully
-    creds, err := getFilteredVMCredentials("/vms/attach", args)
-    if err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
-
-    if len(creds) == 0 {
-        u.PrintlnErr("Error: No VM(s) to attach.")
-        return 1
-    }
-
-    attachStatusCode, err := AttachToVMs(creds, false)
-    if err != nil {
-        u.PrintlnErr(err)
-    }
-
-    returnCode := 0
-    if statusCode != 0 || attachStatusCode != 0 {
-        returnCode = 1
-    }
-    return returnCode
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
+
+	argc := len(args)
+	if argc < 1 {
+		cmd.PrintUsage()
+		return 1
+	}
+
+	if err := exec.CheckRemoteViewer(); err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
+
+	vms, err := getFilteredVMs("/vms/start", args)
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
+
+	if len(vms) == 0 {
+		u.PrintlnErr("Error: VM(s) not found.")
+		return 1
+	}
+
+	statusCode := 0
+
+	for _, vm := range vms {
+		uuid := vm.ID.String()
+		resp, err := client.R().Put(host + "/vms/" + uuid + "/start")
+		if err != nil {
+			u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Started VM \"" + vm.Name + "\"")
+			} else {
+				u.PrintlnErr("Failed starting VM \"" + vm.Name + "\": " + resp.Status() + ": " + resp.String())
+				statusCode = 1
+			}
+		}
+
+	}
+
+	// at this point, the returned filtered credentials only works for VMs that started successfully
+	creds, err := getFilteredVMCredentials("/vms/attach", args)
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
+
+	if len(creds) == 0 {
+		u.PrintlnErr("Error: No VM(s) to attach.")
+		return 1
+	}
+
+	attachStatusCode, err := AttachToVMs(creds, false)
+	if err != nil {
+		u.PrintlnErr(err)
+	}
+
+	returnCode := 0
+	if statusCode != 0 || attachStatusCode != 0 {
+		returnCode = 1
+	}
+	return returnCode
 }
diff --git a/src/client/cmdVM/vmStartWithCreds.go b/src/client/cmdVM/vmStartWithCreds.go
index 91b1ab4..67569d8 100644
--- a/src/client/cmdVM/vmStartWithCreds.go
+++ b/src/client/cmdVM/vmStartWithCreds.go
@@ -1,91 +1,91 @@
 package cmdVM
 
 import (
-    "errors"
-    "nexus-common/params"
-    u "nexus-client/utils"
-    g "nexus-client/globals"
+	"errors"
+	u "nexus-client/utils"
+	"nexus-common/params"
+	g "nexus-libclient/globals"
 )
 
 type StartWithCreds struct {
-    Name string
+	Name string
 }
 
-func (cmd *StartWithCreds)GetName() string {
-    return cmd.Name
+func (cmd *StartWithCreds) GetName() string {
+	return cmd.Name
 }
 
-func (cmd *StartWithCreds)GetDesc() []string {
-    return []string{
-        "Starts one or more VMs with user-defined credentials.",
-        "If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability."}
+func (cmd *StartWithCreds) GetDesc() []string {
+	return []string{
+		"Starts one or more VMs with user-defined credentials.",
+		"If not the VM's owner: requires VM_START VM access capability or VM_START_ANY user capability."}
 }
 
-func (cmd *StartWithCreds)PrintUsage() {
-    for _, desc := range cmd.GetDesc() {
-        u.PrintlnErr(desc)
-    }
-    u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
-    u.PrintlnErr("USAGE: "+cmd.GetName()+" file.csv")
-    u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
-    const usage string = `file.csv    3-column CSV file defining the VMs to start and their credentials.
+func (cmd *StartWithCreds) PrintUsage() {
+	for _, desc := range cmd.GetDesc() {
+		u.PrintlnErr(desc)
+	}
+	u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
+	u.PrintlnErr("USAGE: " + cmd.GetName() + " file.csv")
+	u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
+	const usage string = `file.csv    3-column CSV file defining the VMs to start and their credentials.
             Content of the 3 columns: VM ID;VM name;password`
-    u.PrintlnErr(usage)
+	u.PrintlnErr(usage)
 }
 
-func (cmd *StartWithCreds)parseCSVFile(csvFile string) ([]string, []string, error) {
-    // Column 0: VM IDs
-    vmIDs, err := u.ReadCSVColumn(csvFile, 0)
-    if err != nil {
-        return nil, nil, err
-    }
-    // Column 2: passwords
-    pwds, err := u.ReadCSVColumn(csvFile, 2)
-    if err != nil {
-        return nil, nil, err
-    }
-    count := len(vmIDs)
-    if (len(pwds) != count) {
-        return nil, nil, errors.New("Invalid CSV file: all columns must have the same number of entries!")
-    }
-    return vmIDs, pwds, nil
+func (cmd *StartWithCreds) parseCSVFile(csvFile string) ([]string, []string, error) {
+	// Column 0: VM IDs
+	vmIDs, err := u.ReadCSVColumn(csvFile, 0)
+	if err != nil {
+		return nil, nil, err
+	}
+	// Column 2: passwords
+	pwds, err := u.ReadCSVColumn(csvFile, 2)
+	if err != nil {
+		return nil, nil, err
+	}
+	count := len(vmIDs)
+	if len(pwds) != count {
+		return nil, nil, errors.New("Invalid CSV file: all columns must have the same number of entries!")
+	}
+	return vmIDs, pwds, nil
 }
 
-func (cmd *StartWithCreds)Run(args []string) int {
-    client := g.GetInstance().Client
-    host := g.GetInstance().Host
+func (cmd *StartWithCreds) Run(args []string) int {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
 
-    argc := len(args)
-    if argc != 1 {
-        cmd.PrintUsage()
-        return 1
-    }
+	argc := len(args)
+	if argc != 1 {
+		cmd.PrintUsage()
+		return 1
+	}
 
-    vmIDs, pwds, err := cmd.parseCSVFile(args[0])
-    if err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
+	vmIDs, pwds, err := cmd.parseCSVFile(args[0])
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
 
-    statusCode := 0
+	statusCode := 0
 
-    vmArgs := &params.VMStartWithCreds {}
+	vmArgs := &params.VMStartWithCreds{}
 
-    for i, vmID := range(vmIDs) {
-        vmArgs.Pwd = pwds[i]
-        resp, err := client.R().SetBody(vmArgs).Put(host+"/vms/"+vmID+"/startwithcreds")
-        if err != nil {
-            u.PrintlnErr("Failed starting VM \""+vmID+"\": "+err.Error())
-            statusCode = 1
-        } else {
-            if resp.IsSuccess() {
-                u.Println("Started VM \""+vmID+"\"")
-            } else {
-                u.PrintlnErr("Failed starting VM \""+vmID+"\": "+resp.Status()+": "+resp.String())
-                statusCode = 1
-            }
-        }
-    }
+	for i, vmID := range vmIDs {
+		vmArgs.Pwd = pwds[i]
+		resp, err := client.R().SetBody(vmArgs).Put(host + "/vms/" + vmID + "/startwithcreds")
+		if err != nil {
+			u.PrintlnErr("Failed starting VM \"" + vmID + "\": " + err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Started VM \"" + vmID + "\"")
+			} else {
+				u.PrintlnErr("Failed starting VM \"" + vmID + "\": " + resp.Status() + ": " + resp.String())
+				statusCode = 1
+			}
+		}
+	}
 
-    return statusCode
+	return statusCode
 }
diff --git a/src/client/cmdVM/vmStop.go b/src/client/cmdVM/vmStop.go
index 74939fa..01d441c 100644
--- a/src/client/cmdVM/vmStop.go
+++ b/src/client/cmdVM/vmStop.go
@@ -1,68 +1,68 @@
 package cmdVM
 
 import (
-    u "nexus-client/utils"
-    g "nexus-client/globals"
+	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 )
 
 type Stop struct {
-    Name string
+	Name string
 }
 
-func (cmd *Stop)GetName() string {
-    return cmd.Name
+func (cmd *Stop) GetName() string {
+	return cmd.Name
 }
 
-func (cmd *Stop)GetDesc() []string {
-    return []string{
-        "Kills one or more VMs.",
-        "If not the VM's owner: requires VM_STOP VM access capability or VM_STOP_ANY user capability."}
+func (cmd *Stop) GetDesc() []string {
+	return []string{
+		"Kills one or more VMs.",
+		"If not the VM's owner: requires VM_STOP VM access capability or VM_STOP_ANY user capability."}
 }
 
-func (cmd *Stop)PrintUsage() {
-    printRegexUsage(cmd)
-    printRegexUsageDetails()
+func (cmd *Stop) PrintUsage() {
+	printRegexUsage(cmd)
+	printRegexUsageDetails()
 }
 
-func (cmd *Stop)Run(args []string) int {
-    client := g.GetInstance().Client
-    host := g.GetInstance().Host
+func (cmd *Stop) Run(args []string) int {
+	client := g.GetInstance().Client
+	host := g.GetInstance().Host
 
-    argc := len(args)
-    if argc < 1 {
-        cmd.PrintUsage()
-        return 1
-    }
+	argc := len(args)
+	if argc < 1 {
+		cmd.PrintUsage()
+		return 1
+	}
 
-    vms, err := getFilteredVMs("/vms/stop", args)
-    if err != nil {
-        u.PrintlnErr(err.Error())
-        return 1
-    }
+	vms, err := getFilteredVMs("/vms/stop", args)
+	if err != nil {
+		u.PrintlnErr(err.Error())
+		return 1
+	}
 
-    if len(vms) == 0 {
-        u.PrintlnErr("Error: VM(s) not found.")
-        return 1
-    }
+	if len(vms) == 0 {
+		u.PrintlnErr("Error: VM(s) not found.")
+		return 1
+	}
 
-    statusCode := 0
+	statusCode := 0
 
-    for _, vm := range(vms) {
-        uuid := vm.ID.String()
-        resp, err := client.R().Put(host+"/vms/"+uuid+"/stop")
-        if err != nil {
-            u.PrintlnErr("Failed stopping VM \""+vm.Name+"\": "+err.Error())
-            statusCode = 1
-        } else {
-            if resp.IsSuccess() {
-                u.Println("Stopped VM \""+vm.Name+"\"")
-            } else {
-                u.PrintlnErr("Failed stopping VM \""+vm.Name+"\": "+resp.Status()+": "+resp.String())
-                statusCode = 1
-            }
-        }
+	for _, vm := range vms {
+		uuid := vm.ID.String()
+		resp, err := client.R().Put(host + "/vms/" + uuid + "/stop")
+		if err != nil {
+			u.PrintlnErr("Failed stopping VM \"" + vm.Name + "\": " + err.Error())
+			statusCode = 1
+		} else {
+			if resp.IsSuccess() {
+				u.Println("Stopped VM \"" + vm.Name + "\"")
+			} else {
+				u.PrintlnErr("Failed stopping VM \"" + vm.Name + "\": " + resp.Status() + ": " + resp.String())
+				statusCode = 1
+			}
+		}
 
-    }
+	}
 
-    return statusCode
+	return statusCode
 }
diff --git a/src/client/cmdVersion/version.go b/src/client/cmdVersion/version.go
index 342d605..dde61e0 100644
--- a/src/client/cmdVersion/version.go
+++ b/src/client/cmdVersion/version.go
@@ -3,10 +3,10 @@ package cmdVersion
 import (
 	"encoding/json"
 	"errors"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-client/version"
 	"nexus-common/params"
+	g "nexus-libclient/globals"
 )
 
 type Version struct {
diff --git a/src/client/nexus-cli/nexus-cli.go b/src/client/nexus-cli/nexus-cli.go
index b53931d..8b4bca9 100644
--- a/src/client/nexus-cli/nexus-cli.go
+++ b/src/client/nexus-cli/nexus-cli.go
@@ -10,11 +10,11 @@ import (
 	"nexus-client/cmdVM"
 	"nexus-client/cmdVersion"
 	"nexus-client/defaults"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-client/version"
 	"nexus-common/buildversion"
 	"nexus-common/utils"
+	g "nexus-libclient/globals"
 	"os"
 	"path"
 	"strings"
diff --git a/src/client/nexus-exam/nexus-exam.go b/src/client/nexus-exam/nexus-exam.go
index ba01a20..f73abf8 100644
--- a/src/client/nexus-exam/nexus-exam.go
+++ b/src/client/nexus-exam/nexus-exam.go
@@ -9,12 +9,12 @@ import (
 	"nexus-client/cmdToken"
 	"nexus-client/defaults"
 	e "nexus-client/exec"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
 	"nexus-client/version"
 	"nexus-common/buildversion"
 	"nexus-common/params"
 	"nexus-common/vm"
+	g "nexus-libclient/globals"
 	"os"
 	"os/exec"
 	"path"
diff --git a/src/client/nexush/nexush.go b/src/client/nexush/nexush.go
index 7d88ea0..8f5fb48 100644
--- a/src/client/nexush/nexush.go
+++ b/src/client/nexush/nexush.go
@@ -13,8 +13,8 @@ import (
 	"nexus-client/cmdVM"
 	"nexus-client/cmdVersion"
 	"nexus-client/defaults"
-	g "nexus-client/globals"
 	u "nexus-client/utils"
+	g "nexus-libclient/globals"
 
 	"nexus-client/version"
 	"nexus-common/buildversion"
diff --git a/src/client/utils/csv.go b/src/client/utils/csv.go
index 122eb0c..5140e25 100644
--- a/src/client/utils/csv.go
+++ b/src/client/utils/csv.go
@@ -4,7 +4,7 @@ import (
 	"encoding/csv"
 	"errors"
 	"io"
-	g "nexus-client/globals"
+	g "nexus-libclient/globals"
 	"os"
 	"strconv"
 )
diff --git a/src/client/globals/Globals.go b/src/libclient/globals/Globals.go
similarity index 100%
rename from src/client/globals/Globals.go
rename to src/libclient/globals/Globals.go
diff --git a/src/libclient/template/templateList.go b/src/libclient/template/templateList.go
index bb0b504..6748afe 100644
--- a/src/libclient/template/templateList.go
+++ b/src/libclient/template/templateList.go
@@ -2,8 +2,8 @@ package template
 
 import (
 	"errors"
-	g "nexus-client/globals"
 	t "nexus-common/template"
+	g "nexus-libclient/globals"
 )
 
 func GetTemplates() ([]t.TemplateSerialized, error) {
diff --git a/src/libclient/token/tokenRefresh.go b/src/libclient/token/tokenRefresh.go
index 5fd19a1..02a7296 100644
--- a/src/libclient/token/tokenRefresh.go
+++ b/src/libclient/token/tokenRefresh.go
@@ -3,7 +3,7 @@ package token
 import (
 	"encoding/json"
 	"errors"
-	g "nexus-client/globals"
+	g "nexus-libclient/globals"
 )
 
 // Return a new token
-- 
GitLab