blob: 3555c6a21225d4392b37dd933eba18eea99a9bbf [file] [log] [blame]
//Copyright 2017 Huawei Technologies Co., Ltd
//
//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 util
import (
"bytes"
"encoding/gob"
"golang.org/x/net/context"
"os"
"path/filepath"
"regexp"
"strings"
"unsafe"
)
const (
INIT_FAIL_EXIT = 2
)
func GetAppPath(path string) string {
env := os.Getenv("APP_ROOT")
if len(env) == 0 {
wd, _ := os.Getwd()
return filepath.Join(wd, path)
}
return os.ExpandEnv(filepath.Join("$APP_ROOT", path))
}
func PathExist(path string) bool {
_, err := os.Stat(path)
return err == nil || os.IsExist(err)
}
func MinInt(x, y int) int {
if x <= y {
return x
} else {
return y
}
}
func ClearStringMemory(src *string) {
p := (*struct {
ptr uintptr
len int
})(unsafe.Pointer(src))
len := MinInt(p.len, 32)
ptr := p.ptr
for idx := 0; idx < len; idx = idx + 1 {
b := (*byte)(unsafe.Pointer(ptr))
*b = 0
ptr += 1
}
}
func ClearByteMemory(src []byte) {
len := MinInt(len(src), 32)
for idx := 0; idx < len; idx = idx + 1 {
src[idx] = 0
}
}
func ParseTenantProject(ctx context.Context) string {
return strings.Join([]string{ParseTenant(ctx), ParseProject(ctx)}, "/")
}
func ParseTenant(ctx context.Context) string {
return ctx.Value("tenant").(string)
}
func ParseProject(ctx context.Context) string {
return ctx.Value("project").(string)
}
//format : https://10.21.119.167:30100 or http://10.21.119.167:30100
func URLChecker(url string) (bool, error) {
ipPatten := "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))"
patten := "^(https|http):\\/\\/" + ipPatten + ":([0-9]+)$"
ok, err := regexp.MatchString(patten, url)
if err != nil {
return false, err
}
return ok, nil
}
func MapChecker(data map[string]string) bool {
if data == nil {
return false
}
if len(data) == 0 {
return false
}
for key, value := range data {
if len(key) == 0 {
return false
}
if len(value) == 0 {
return false
}
}
return true
}
func GetIPFromContext(ctx context.Context) string {
remoteIp := ""
remoteIp, _ = ctx.Value("x-remote-ip").(string)
return remoteIp
}
func DeepCopy(dst, src interface{}) error {
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(src); err != nil {
return err
}
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}
func SafeCloseChan(c chan struct{}) {
select {
case _, ok := <-c:
if ok {
close(c)
}
default:
close(c)
}
}