diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index d9684f7735..177ef3bc93 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -18,6 +18,7 @@ import ( "context" "database/sql" "fmt" + "net" "net/http" "net/url" "sort" @@ -1364,7 +1365,8 @@ func (hh *SHost) GetFetchUrl(disableHttps bool) string { port = 80 } } - return fmt.Sprintf("%s://%s:%d", managerUrl.Scheme, strings.Split(managerUrl.Host, ":")[0], port+40000) + + return fmt.Sprintf("%s://%s", managerUrl.Scheme, net.JoinHostPort(managerUrl.Hostname(), strconv.Itoa(port+40000))) } func (hh *SHost) GetAttachedEnabledHostStorages(storageType []string) []SStorage { diff --git a/pkg/hostimage/nbd.go b/pkg/hostimage/nbd.go index 182dd83cff..68e077537b 100644 --- a/pkg/hostimage/nbd.go +++ b/pkg/hostimage/nbd.go @@ -104,14 +104,14 @@ func (m *SNbdExportManager) QemuNbdStartExport(imageInfo qemuimg.SImageInfo, dis if imageInfo.Encrypted() { cmd = []string{ qemutils.GetQemuNbd(), - "--read-only", "--persistent", "-x", diskId, "-p", strconv.Itoa(nbdPort), + "--read-only", "--persistent", "-x", diskId, "-b", "::", "-p", strconv.Itoa(nbdPort), "--object", imageInfo.SecretOptions(), "--image-opts", imageInfo.ImageOptions(), } } else { cmd = []string{ qemutils.GetQemuNbd(), - "--read-only", "--persistent", "-x", diskId, "-p", strconv.Itoa(nbdPort), + "--read-only", "--persistent", "-x", diskId, "-b", "::", "-p", strconv.Itoa(nbdPort), imageInfo.Path, } } diff --git a/pkg/hostman/diskutils/qemu_kvm/driver.go b/pkg/hostman/diskutils/qemu_kvm/driver.go index cfdca14327..a420d6942f 100644 --- a/pkg/hostman/diskutils/qemu_kvm/driver.go +++ b/pkg/hostman/diskutils/qemu_kvm/driver.go @@ -660,7 +660,7 @@ func (d *QemuBaseDriver) startCmds( disksPath = []string{imageInfo.Path} } for i, diskPath := range disksPath { - diskDrive := __("-drive file=%s,if=none,id=drive_%d,cache=none", diskPath, i) + diskDrive := __("-drive file=%s,if=none,id=drive_%d,cache=none", strings.ReplaceAll(diskPath, "\\", "\\\\"), i) if imageInfo.Format != qemuimgfmt.RAW && imageInfo.Encrypted() { diskDrive += ",encrypt.format=luks,encrypt.key-secret=sec0" } diff --git a/pkg/hostman/storageman/disk_local.go b/pkg/hostman/storageman/disk_local.go index f898574cba..4ef8a55b7f 100644 --- a/pkg/hostman/storageman/disk_local.go +++ b/pkg/hostman/storageman/disk_local.go @@ -18,8 +18,10 @@ import ( "context" "fmt" "io/ioutil" + "net" "os" "path" + "strconv" "strings" "yunion.io/x/cloudmux/pkg/cloudprovider" @@ -234,7 +236,8 @@ func (d *SLocalDisk) CreateFromRemoteHostImage(ctx context.Context, url string, return errors.Wrap(err, "RequestExportNbdImage") } remoteHostIp := netutils2.ParseIpFromUrl(url) - nbdImagePath := fmt.Sprintf("nbd://%s:%d/%s", remoteHostIp, nbdPort, d.GetId()) + remoteHostAndPort := net.JoinHostPort(remoteHostIp, strconv.Itoa(int(nbdPort))) + nbdImagePath := fmt.Sprintf("nbd://%s/%s", remoteHostAndPort, d.GetId()) log.Infof("remote nbd image exported %s", nbdImagePath) newImg, err := qemuimg.NewQemuImage(d.getPath()) diff --git a/pkg/hostman/storageman/disk_lvm.go b/pkg/hostman/storageman/disk_lvm.go index edfbf2a88d..6b9be9d305 100644 --- a/pkg/hostman/storageman/disk_lvm.go +++ b/pkg/hostman/storageman/disk_lvm.go @@ -17,7 +17,9 @@ package storageman import ( "context" "fmt" + "net" "path" + "strconv" "strings" "yunion.io/x/cloudmux/pkg/cloudprovider" @@ -184,7 +186,8 @@ func (d *SLVMDisk) CreateFromRemoteHostImage(ctx context.Context, url string, si log.Infof("Create from remote host image %s", url) nbdPort, err := d.RequestExportNbdImage(ctx, url, encryptInfo) remoteHostIp := netutils2.ParseIpFromUrl(url) - nbdImagePath := fmt.Sprintf("nbd://%s:%d/%s", remoteHostIp, nbdPort, d.GetId()) + remoteHostAndPort := net.JoinHostPort(remoteHostIp, strconv.Itoa(int(nbdPort))) + nbdImagePath := fmt.Sprintf("nbd://%s/%s", remoteHostAndPort, d.GetId()) log.Infof("remote nbd image exported %s", nbdImagePath) newImg, err := qemuimg.NewQemuImage(d.GetPath()) diff --git a/pkg/util/cephutils/ceph.go b/pkg/util/cephutils/ceph.go index 1bfca89720..2266a24106 100644 --- a/pkg/util/cephutils/ceph.go +++ b/pkg/util/cephutils/ceph.go @@ -291,6 +291,13 @@ keyring = %s func CephConfString(monHost, key string, radosMonOpTimeout, radosOsdOpTimeout, clientMountTimeout int64) string { conf := []string{} + monHosts := strings.Split(monHost, ",") + for i := range monHosts { + if strings.Contains(monHosts[i], ":") { + monHosts[i] = `\[` + strings.ReplaceAll(monHosts[i], ":", `\:`) + `\]` + } + } + monHost = strings.Join(monHosts, ",") conf = append(conf, "mon_host="+strings.ReplaceAll(monHost, ",", `\;`)) if len(key) > 0 { for _, k := range []string{":", "@", "="} {