mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #4435 from yousong/bugfix/yousong-ifname-qemu-ident
Bugfix/yousong ifname qemu ident
This commit is contained in:
@@ -42,6 +42,9 @@ import (
|
||||
|
||||
const (
|
||||
MAX_IFNAME_SIZE = 13
|
||||
MAX_HINT_LEN = MAX_IFNAME_SIZE - 4 // 9
|
||||
HINT_BASE_LEN = 6 // 6
|
||||
HINT_RAND_LEN = MAX_HINT_LEN - HINT_BASE_LEN // 3
|
||||
|
||||
MAX_GUESTNIC_TO_SAME_NETWORK = 2
|
||||
)
|
||||
@@ -254,6 +257,23 @@ func (man *SGuestnetworkManager) ifnameUsed(ifname string) bool {
|
||||
if ifname == "" {
|
||||
return true
|
||||
}
|
||||
if len(ifname) > MAX_IFNAME_SIZE {
|
||||
return true
|
||||
}
|
||||
isa := func(c byte) bool {
|
||||
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|
||||
}
|
||||
if !isa(ifname[0]) {
|
||||
return true
|
||||
}
|
||||
for i := range ifname[1:] {
|
||||
c := ifname[i]
|
||||
if isa(c) || c >= '0' || c <= '9' || c == '_' || c == '-' {
|
||||
continue
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
count, err := GuestnetworkManager.Query().Equals("ifname", ifname).CountWithError()
|
||||
if err != nil {
|
||||
panic(errors.Wrap(err, "query if ifname is used"))
|
||||
|
||||
@@ -1172,19 +1172,22 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) {
|
||||
}
|
||||
sani := func(r string) string {
|
||||
if r != "" && !isa(r[0]) {
|
||||
return "a" + r
|
||||
r = "a" + r
|
||||
}
|
||||
if len(r) > MAX_HINT_LEN {
|
||||
r = r[:MAX_HINT_LEN]
|
||||
}
|
||||
return r
|
||||
}
|
||||
newHint := func(base string) (string, error) {
|
||||
if len(base) > 8 {
|
||||
base = base[:8]
|
||||
rand := func(base string) (string, error) {
|
||||
if len(base) > HINT_BASE_LEN {
|
||||
base = base[:HINT_BASE_LEN]
|
||||
}
|
||||
for i := 0; i < 3; i++ {
|
||||
r := base + rand.String(7)
|
||||
r := sani(base + rand.String(HINT_RAND_LEN))
|
||||
cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError()
|
||||
if err == nil && cnt == 0 {
|
||||
return sani(r), nil
|
||||
return r, nil
|
||||
}
|
||||
}
|
||||
return "", fmt.Errorf("failed finding ifname hint after 3 tries")
|
||||
@@ -1200,13 +1203,12 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) {
|
||||
r = sani(r)
|
||||
|
||||
if len(r) < 3 {
|
||||
return newHint(r)
|
||||
return rand(r)
|
||||
}
|
||||
if cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError(); err != nil {
|
||||
return "", err
|
||||
} else if cnt > 0 {
|
||||
r, err := newHint(r)
|
||||
return r, err
|
||||
return rand(r)
|
||||
}
|
||||
return r, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user