// Copyright 2019 CNI 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 testutils import ( "fmt" "os" "strings" "github.com/containernetworking/cni/pkg/types" ) // TmpResolvConf will create a temporary file and write the provided DNS settings to // it in the resolv.conf format. It returns the path of the created temporary file or // an error if any occurs while creating/writing the file. It is the caller's // responsibility to remove the file. func TmpResolvConf(dnsConf types.DNS) (string, error) { f, err := os.CreateTemp("", "cni_test_resolv.conf") if err != nil { return "", fmt.Errorf("failed to get temp file for CNI test resolv.conf: %v", err) } defer f.Close() path := f.Name() defer func() { if err != nil { os.RemoveAll(path) } }() // see "man 5 resolv.conf" for the format of resolv.conf var resolvConfLines []string for _, nameserver := range dnsConf.Nameservers { resolvConfLines = append(resolvConfLines, fmt.Sprintf("nameserver %s", nameserver)) } resolvConfLines = append(resolvConfLines, fmt.Sprintf("domain %s", dnsConf.Domain)) resolvConfLines = append(resolvConfLines, fmt.Sprintf("search %s", strings.Join(dnsConf.Search, " "))) resolvConfLines = append(resolvConfLines, fmt.Sprintf("options %s", strings.Join(dnsConf.Options, " "))) resolvConf := strings.Join(resolvConfLines, "\n") _, err = f.Write([]byte(resolvConf)) if err != nil { return "", fmt.Errorf("failed to write temp resolv.conf for CNI test: %v", err) } return path, err }