| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package azure_monitor |
| 4 | |
| 5 | import ( |
| 6 | "context" |
| 7 | "crypto/sha1" |
| 8 | "encoding/hex" |
| 9 | "strings" |
| 10 | "time" |
| 11 | ) |
| 12 | |
| 13 | const profileNamePattern = "^[a-z][a-z0-9_]*$" |
| 14 | |
| 15 | func stringsLowerTrim(v string) string { |
| 16 | return strings.ToLower(strings.TrimSpace(v)) |
| 17 | } |
| 18 | |
| 19 | func stringsTrim(v string) string { |
| 20 | return strings.TrimSpace(v) |
| 21 | } |
| 22 | |
| 23 | func hashShort(v string) string { |
| 24 | sum := sha1.Sum([]byte(strings.ToLower(strings.TrimSpace(v)))) |
| 25 | return hex.EncodeToString(sum[:6]) |
| 26 | } |
| 27 | |
| 28 | func withOptionalTimeout(ctx context.Context, timeout time.Duration) (context.Context, context.CancelFunc) { |
| 29 | if timeout <= 0 { |
| 30 | return ctx, func() {} |
| 31 | } |
| 32 | return context.WithTimeout(ctx, timeout) |
| 33 | } |
| 34 | |
| 35 | func isValidProfileName(v string) bool { |
| 36 | v = stringsTrim(v) |
| 37 | if len(v) == 0 { |
| 38 | return false |
| 39 | } |
| 40 | if v[0] < 'a' || v[0] > 'z' { |
| 41 | return false |
| 42 | } |
| 43 | for i := 1; i < len(v); i++ { |
| 44 | c := v[i] |
| 45 | if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_' { |
| 46 | continue |
| 47 | } |
| 48 | return false |
| 49 | } |
| 50 | return true |
| 51 | } |