mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-21 00:24:07 +08:00
84 lines
3.0 KiB
Go
84 lines
3.0 KiB
Go
// Copyright 2019 Yunion
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package models
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"yunion.io/x/pkg/util/osprofile"
|
|
"yunion.io/x/pkg/util/pinyinutils"
|
|
|
|
api "yunion.io/x/onecloud/pkg/apis/compute"
|
|
"yunion.io/x/onecloud/pkg/httperrors"
|
|
)
|
|
|
|
type SHostnameResourceBase struct {
|
|
Hostname string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"optional" update:"user"`
|
|
}
|
|
|
|
type SHostnameResourceBaseManager struct {
|
|
}
|
|
|
|
func (manager *SHostnameResourceBaseManager) ValidateHostname(name string, osType string, input api.HostnameInput) (api.HostnameInput, error) {
|
|
inputHostname := true
|
|
if len(input.Hostname) == 0 {
|
|
inputHostname = false
|
|
if len(name) == 0 {
|
|
return input, httperrors.NewMissingParameterError("name")
|
|
}
|
|
input.Hostname = pinyinutils.Text2Pinyin(name)
|
|
}
|
|
hostname := ""
|
|
for _, s := range input.Hostname {
|
|
if (s >= '0' && s <= '9') || (s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z') || strings.Contains(".-", string(s)) {
|
|
hostname += string(s)
|
|
}
|
|
}
|
|
input.Hostname = hostname
|
|
for strings.HasPrefix(input.Hostname, ".") || strings.HasPrefix(input.Hostname, "-") ||
|
|
strings.HasSuffix(input.Hostname, ".") || strings.HasSuffix(input.Hostname, "-") ||
|
|
strings.Contains(input.Hostname, "..") || strings.Contains(input.Hostname, "--") {
|
|
input.Hostname = strings.TrimPrefix(input.Hostname, ".")
|
|
input.Hostname = strings.TrimPrefix(input.Hostname, "-")
|
|
input.Hostname = strings.TrimSuffix(input.Hostname, ".")
|
|
input.Hostname = strings.TrimSuffix(input.Hostname, "-")
|
|
input.Hostname = strings.ReplaceAll(input.Hostname, "--", "")
|
|
input.Hostname = strings.ReplaceAll(input.Hostname, "..", "")
|
|
}
|
|
if len(input.Hostname) > 60 {
|
|
input.Hostname = input.Hostname[:60]
|
|
}
|
|
if strings.EqualFold(osType, osprofile.OS_TYPE_WINDOWS) {
|
|
if num, err := strconv.Atoi(input.Hostname); err == nil && num > 0 {
|
|
return input, httperrors.NewInputParameterError("hostname cannot be number %d", num)
|
|
}
|
|
input.Hostname = strings.ReplaceAll(input.Hostname, ".", "")
|
|
if len(input.Hostname) > api.MAX_WINDOWS_COMPUTER_NAME_LENGTH {
|
|
if inputHostname {
|
|
return input, httperrors.NewInputParameterError("Windows hostname cannot be longer than %d characters", api.MAX_WINDOWS_COMPUTER_NAME_LENGTH)
|
|
}
|
|
input.Hostname = input.Hostname[:15]
|
|
}
|
|
}
|
|
for strings.HasSuffix(input.Hostname, "-") {
|
|
input.Hostname = strings.TrimSuffix(input.Hostname, "-")
|
|
}
|
|
if len(input.Hostname) < 2 {
|
|
return input, httperrors.NewInputParameterError("the hostname length must be greater than or equal to 2")
|
|
}
|
|
return input, nil
|
|
}
|