golang练习之linux网络配置文件处理

因为工作上的原因,经常要修改linux的网络配置文件,os常为centos,比如:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens44
UUID=12321
DEVICE=ens44
ONBOOT=no
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=49f7e1f3-7eb5-45ba-9412-d7352f0c2897
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.240
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=172.16.16.16
DNS2=172.16.16.17

常常要修改上面这种为下面这种,有时候机器又很多,就写了个golang程序来自动生成,还没用过,以后用的时候再来根据实际情况修正,这也算是为之前学的golang知识的小结。

package main
import (
	"bufio"
	"fmt"
	"io"
	"strings"
	"os"
)

func main() {
	srcName,desName,sign := readPara()
	fmt.Println(srcName,desName,sign)
	if !sign{
		fmt.Println("程序参数错误,请重新输入!")
		return
	}

	srcContent := readFile(srcName)
	desContent := readFile(desName)
	//fmt.Println(srcContent)
	//fmt.Println(desContent)
	result := contentCompare(srcContent,desContent)
	fmt.Println("result map is ",result)
	resultpath := "D:\\goWork\\src\\testProject\\result.txt"
	outPut2file(result,desName,resultpath)
}
//安装目标文件的顺序输出键值对
func outPut2file(result map[string]string,desName,path string){
	 fmt.Println("开始校正输出顺序:")
	 fmt.Println("打开输出文件...")
	 fileresult ,err:= os.OpenFile(path,os.O_WRONLY|os.O_CREATE, 0666)
	 if err != nil{
	 	fmt.Println("打开文件错误,请确认后重新尝试!!!")
	 	return
	 }
	 defer fileresult.Close()
	 fmt.Println("打开目标文件...")
	 filedes,errdes := os.Open(desName)
	 if errdes != nil{
	 	fmt.Println("打开目标文件错误,请确认后重新尝试!!!")
		 return
	 }
	 defer filedes.Close()
	 filewriter := bufio.NewWriter(fileresult)
	 filereader := bufio.NewReader(filedes)
	 fmt.Println("开始写入...")
	 for {
	 	inputstring,readerr := filereader.ReadString('\n')
		content := strings.Split(inputstring,"=")
		if value,ok := result[content[0]];ok{
			fmt.Printf("写入内容:%s\n",content[0]+"="+value)
			filewriter.WriteString(content[0]+"="+value)
		}
	 	if readerr == io.EOF{
			break
		}
	 }
	 filewriter.Flush()
	 fmt.Println("写入结束...")
	 return
}
//比较两个map的不同,并修改源文件的键值对
func contentCompare(src,des map[string]string)map[string]string{
	nessarykeys := map[string]int{"UUID":1,"NAME":2,"DEVICE":3}
	for keydes,valuedes := range des{
		if _,isIn := src[keydes];!isIn{
			//key在目标中,没在源中,那么就按目标中的键值对加入源map中
			src[keydes]=valuedes
		}else{
			//若是key即在源文件中, 又在目标文件中,那么当key不是UUID,NAME,DEVICE时,以目标文件为准
			//若是这三个key,那么以源文件为准,就不修改了
			if _,ok := nessarykeys[keydes];!ok{
				src[keydes]=valuedes
			}
		}
	}

	return src
}
//读取文件,并将键值对存入map中
func readFile(path string)(map[string]string){
	filemap := make(map[string]string)
	file,err := os.Open(path)
	if err != nil {
		fmt.Printf("读取文件 (%s) 错误!!!")
		return filemap
	}
	defer file.Close()

	fileReader := bufio.NewReader(file)
	for{
		filestring ,readerr := fileReader.ReadString('\n')
		content := strings.Split(filestring,"=")
		filemap[content[0]]=content[1]
		if readerr == io.EOF{
			return filemap
		}
	}
}
//读取命令行参数,并将读取的信息和是否符合标准返回
func readPara() (srcName,desName string,sign bool){
	sign=true
	fmt.Println("读取文件信息...")
	if len(os.Args) !=3 {
		srcName,desName,sign  = "","",false
		fmt.Println("文件参数错误,退出!!!")
		return
	}
	srcName = os.Args[1]
	desName = os.Args[2]
	fmt.Printf("源文件名称: %s \n目标文件名称: %s\n",srcName,desName)
	fmt.Println("判断文件是否存在...")
    err := fileExist(srcName)
    if err{
    	fmt.Println("源文件存在..")
	}else{
		fmt.Println("源文件不存在!!!")
		sign=false
	}
	err = fileExist(desName)
	if err{
		fmt.Println("目标文件存在..")
	}else{
		fmt.Println("目标文件不存在!!!")
		sign=false
	}
	return
}
//判断文件是否存在
func fileExist(path string) bool{
	_,err := os.Stat(path)
	if err != nil{
		if os.IsExist(err){
			return true
		}
		return false
	}
	return true
}

  

 

posted @ 2020-11-12 21:09  NewBird001  阅读(515)  评论(0)    收藏  举报