123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /*
- Copyright 2016 The Kubernetes Authors.
- 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 ipconfig
- import (
- "runtime"
- "strings"
- "sync"
- "k8s.io/klog"
- utilexec "k8s.io/utils/exec"
- )
- // Interface is an injectable interface for running ipconfig commands. Implementations must be goroutine-safe.
- type Interface interface {
- // GetDNSSuffixSearchList returns the list of DNS suffix to search
- GetDNSSuffixSearchList() ([]string, error)
- }
- const (
- cmdIpconfig string = "ipconfig"
- cmdDefaultArgs string = "/all"
- dnsSuffixSearchLisLabel string = "DNS Suffix Search List"
- )
- // runner implements Interface in terms of exec("ipconfig").
- type runner struct {
- mu sync.Mutex
- exec utilexec.Interface
- }
- // New returns a new Interface which will exec ipconfig.
- func New(exec utilexec.Interface) Interface {
- runner := &runner{
- exec: exec,
- }
- return runner
- }
- // GetDNSSuffixSearchList returns the list of DNS suffix to search
- func (runner *runner) GetDNSSuffixSearchList() ([]string, error) {
- // Parse the DNS suffix search list from ipconfig output
- // ipconfig /all on Windows displays the entry of DNS suffix search list
- // An example output contains:
- //
- // DNS Suffix Search List. . . . . . : example1.com
- // example2.com
- //
- // TODO: this does not work when the label is localized
- suffixList := []string{}
- if runtime.GOOS != "windows" {
- klog.V(1).Infof("ipconfig not supported on GOOS=%s", runtime.GOOS)
- return suffixList, nil
- }
- out, err := runner.exec.Command(cmdIpconfig, cmdDefaultArgs).Output()
- if err == nil {
- lines := strings.Split(string(out), "\n")
- for i, line := range lines {
- if trimmed := strings.TrimSpace(line); strings.HasPrefix(trimmed, dnsSuffixSearchLisLabel) {
- if parts := strings.Split(trimmed, ":"); len(parts) > 1 {
- if trimmed := strings.TrimSpace(parts[1]); trimmed != "" {
- suffixList = append(suffixList, strings.TrimSpace(parts[1]))
- }
- for j := i + 1; j < len(lines); j++ {
- if trimmed := strings.TrimSpace(lines[j]); trimmed != "" && !strings.Contains(trimmed, ":") {
- suffixList = append(suffixList, trimmed)
- } else {
- break
- }
- }
- }
- break
- }
- }
- } else {
- klog.V(1).Infof("Running %s %s failed: %v", cmdIpconfig, cmdDefaultArgs, err)
- }
- return suffixList, err
- }
|