The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7795

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From f73f82bc3ce2d25c0bce1b3a657d8255ecff01ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Thu, 20 Aug 2020 12:13:43 -0400
Subject: [PATCH 1/2] shared/cert: Fix on Windows
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 shared/cert.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/shared/cert.go b/shared/cert.go
index a1e923e0d8..55e4d4dabf 100644
--- a/shared/cert.go
+++ b/shared/cert.go
@@ -22,7 +22,6 @@ import (
        "net/http"
        "os"
        "os/user"
-       "path"
        "path/filepath"
        "time"
 )
@@ -230,12 +229,13 @@ func FindOrGenCert(certf string, keyf string, certtype 
bool, addHosts bool) erro
 // GenCert will create and populate a certificate file and a key file
 func GenCert(certf string, keyf string, certtype bool, addHosts bool) error {
        /* Create the basenames if needed */
-       dir := path.Dir(certf)
+       dir := filepath.Dir(certf)
        err := os.MkdirAll(dir, 0750)
        if err != nil {
                return err
        }
-       dir = path.Dir(keyf)
+
+       dir = filepath.Dir(keyf)
        err = os.MkdirAll(dir, 0750)
        if err != nil {
                return err

From 37e9f82978aa695af20ee88c99cc600393b986b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Thu, 20 Aug 2020 14:34:49 -0400
Subject: [PATCH 2/2] lxc/console: Support remote-viewer on Windows
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxc/console.go         | 65 +++++++++++++++++++++++++++---------------
 lxc/console_unix.go    |  6 ++++
 lxc/console_windows.go | 23 +++++++++++++++
 3 files changed, 71 insertions(+), 23 deletions(-)

diff --git a/lxc/console.go b/lxc/console.go
index cfc134311b..02e4ae114e 100644
--- a/lxc/console.go
+++ b/lxc/console.go
@@ -7,6 +7,7 @@ import (
        "net"
        "os"
        "os/exec"
+       "runtime"
        "strconv"
 
        "github.com/gorilla/websocket"
@@ -218,6 +219,7 @@ func (c *cmdConsole) console(d lxd.InstanceServer, name 
string) error {
 }
 
 func (c *cmdConsole) vga(d lxd.InstanceServer, name string) error {
+       var err error
        conf := c.global.conf
 
        // We currently use the control websocket just to abort in case of 
errors.
@@ -247,31 +249,48 @@ func (c *cmdConsole) vga(d lxd.InstanceServer, name 
string) error {
                close(consoleDisconnect)
        }()
 
-       // Create a temporary unix socket mirroring the instance's spice socket.
-       if !shared.PathExists(conf.ConfigPath("sockets")) {
-               err := os.MkdirAll(conf.ConfigPath("sockets"), 0700)
+       var socket string
+       var listener net.Listener
+       if runtime.GOOS != "windows" {
+               // Create a temporary unix socket mirroring the instance's 
spice socket.
+               if !shared.PathExists(conf.ConfigPath("sockets")) {
+                       err := os.MkdirAll(conf.ConfigPath("sockets"), 0700)
+                       if err != nil {
+                               return err
+                       }
+               }
+
+               // Generate a random file name.
+               path, err := ioutil.TempFile(conf.ConfigPath("sockets"), 
"*.spice")
                if err != nil {
                        return err
                }
-       }
+               path.Close()
 
-       path, err := ioutil.TempFile(conf.ConfigPath("sockets"), "*.spice")
-       if err != nil {
-               return err
-       }
-       err = os.Remove(path.Name())
-       if err != nil {
-               return err
-       }
-       path.Close()
+               err = os.Remove(path.Name())
+               if err != nil {
+                       return err
+               }
 
-       socket := path.Name()
-       listener, err := net.Listen("unix", socket)
-       if err != nil {
-               return err
+               // Listen on the socket.
+               listener, err = net.Listen("unix", path.Name())
+               if err != nil {
+                       return err
+               }
+               defer listener.Close()
+               defer os.Remove(path.Name())
+
+               socket = fmt.Sprintf("spice+unix://%s", path.Name())
+       } else {
+               listener, err = net.Listen("tcp", "127.0.0.1:0")
+               if err != nil {
+                       return err
+               }
+               defer listener.Close()
+
+               addr := listener.Addr().(*net.TCPAddr)
+               socket = fmt.Sprintf("spice://127.0.0.1:%d", addr.Port)
        }
-       defer listener.Close()
-       defer os.Remove(path.Name())
 
        op, connect, err := d.ConsoleInstanceDynamic(name, req, &consoleArgs)
        if err != nil {
@@ -304,15 +323,15 @@ func (c *cmdConsole) vga(d lxd.InstanceServer, name 
string) error {
        }()
 
        // Use either spicy or remote-viewer if available.
-       remoteViewer, _ := exec.LookPath("remote-viewer")
-       spicy, _ := exec.LookPath("spicy")
+       remoteViewer := c.findCommand("remote-viewer")
+       spicy := c.findCommand("spicy")
 
        if remoteViewer != "" || spicy != "" {
                var cmd *exec.Cmd
                if remoteViewer != "" {
-                       cmd = exec.Command(remoteViewer, 
fmt.Sprintf("spice+unix://%s", socket))
+                       cmd = exec.Command(remoteViewer, socket)
                } else {
-                       cmd = exec.Command(spicy, 
fmt.Sprintf("--uri=spice+unix://%s", socket))
+                       cmd = exec.Command(spicy, fmt.Sprintf("--uri=%s", 
socket))
                }
 
                // Start the command.
diff --git a/lxc/console_unix.go b/lxc/console_unix.go
index 0edba5d521..44c7ee672d 100644
--- a/lxc/console_unix.go
+++ b/lxc/console_unix.go
@@ -4,6 +4,7 @@ package main
 
 import (
        "os"
+       "os/exec"
        "os/signal"
 
        "github.com/gorilla/websocket"
@@ -29,3 +30,8 @@ func (c *cmdConsole) controlSocketHandler(control 
*websocket.Conn) {
        closeMsg := websocket.FormatCloseMessage(websocket.CloseNormalClosure, 
"")
        control.WriteMessage(websocket.CloseMessage, closeMsg)
 }
+
+func (c *cmdConsole) findCommand(name string) string {
+       path, _ := exec.LookPath(name)
+       return path
+}
diff --git a/lxc/console_windows.go b/lxc/console_windows.go
index 74649d6e73..422e6113b2 100644
--- a/lxc/console_windows.go
+++ b/lxc/console_windows.go
@@ -4,6 +4,10 @@ package main
 
 import (
        "fmt"
+       "io/ioutil"
+       "os/exec"
+       "path/filepath"
+       "strings"
 
        "github.com/gorilla/websocket"
 )
@@ -21,3 +25,22 @@ func (c *cmdConsole) controlSocketHandler(control 
*websocket.Conn) {
                fmt.Printf("error setting term size %s\n", err)
        }
 }
+
+func (c *cmdConsole) findCommand(name string) string {
+       path, _ := exec.LookPath(name)
+       if path == "" {
+               // Let's see if it's not in the usual location.
+               programs, err := ioutil.ReadDir("\\Program Files")
+               if err != nil {
+                       return ""
+               }
+
+               for _, entry := range programs {
+                       if strings.HasPrefix(entry.Name(), "VirtViewer") {
+                               return filepath.Join("\\Program Files", 
entry.Name(), "bin", "remote-viewer.exe")
+                       }
+               }
+       }
+
+       return path
+}
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to