Guest User

compare kernel config tool

a guest
May 6th, 2012
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.97 KB | None | 0 0
  1. #!/usr/bin/gorun
  2. // @author dlin at gmail
  3. // @license BSD 3-clause
  4.  
  5. // check is target kernel config fit with specific config
  6. package main
  7.  
  8. import (
  9.     "bufio"
  10.     "fmt"
  11.     "io"
  12.     "log"
  13.     "os"
  14.     "strings"
  15. )
  16.  
  17. func GetFileLines(fileName string) ([]string, error) {
  18.     f, err := os.Open(fileName)
  19.     if err != nil {
  20.         log.Fatalln(err)
  21.     }
  22.     defer f.Close()
  23.     r := bufio.NewReader(f)
  24.     var lines []string
  25. L_RD_LINE:
  26.     for {
  27.         line, isPrefix, err := r.ReadLine()
  28.         if err == io.EOF {
  29.             break
  30.         }
  31.         if err != nil {
  32.             log.Fatalln(err)
  33.         }
  34.         for isPrefix {
  35.             var ex_line []byte
  36.             ex_line, isPrefix, err = r.ReadLine()
  37.             if err == io.EOF {
  38.                 break L_RD_LINE
  39.             }
  40.             if err != nil {
  41.                 log.Fatalln(err)
  42.             }
  43.             line = append(line, ex_line...)
  44.         }
  45.         lines = append(lines, string(line))
  46.     }
  47.     return lines, nil
  48. }
  49.  
  50. func getKeyFile(fileName string) map[string]string {
  51.     lines, err := GetFileLines(fileName)
  52.     if err != nil {
  53.         log.Fatalln(err)
  54.     }
  55.     result := make(map[string]string)
  56.     for _, line := range lines {
  57.         line = strings.TrimSpace(line)
  58.         if line != "" && !strings.HasPrefix(line, "#") {
  59.             flds := strings.SplitN(line, "=", 2)
  60.             key := strings.TrimSpace(flds[0])
  61.             value := strings.TrimSpace(flds[1])
  62.             result[key] = value
  63.         }
  64.     }
  65.     return result
  66. }
  67.  
  68. // compare key file, if fulfill all rules, return 0
  69. func compareKeyFile(keyFileName, configFileName string) int {
  70.     keys := getKeyFile(keyFileName)
  71.     config := getKeyFile(configFileName)
  72.     var errCnt int
  73.  
  74.     for k, v := range keys {
  75.         if cv, ok := config[k]; ok {
  76.             if v != cv {
  77.                 fmt.Print(k, "=", v, " # original ", cv, "\n")
  78.                 errCnt++
  79.             }
  80.         } else {
  81.             fmt.Print(k, "=", v, "\n")
  82.             errCnt++
  83.         }
  84.     }
  85.     return errCnt
  86. }
  87.  
  88. func main() {
  89.     log.SetFlags(log.Lshortfile)
  90.     if len(os.Args) != 3 {
  91.         fmt.Println(`Usage: kernel_config_diff.go <require.config> <kernel.config>
  92.   eg. kernel_config_diff.go req.config linux_pf.config`)
  93.         os.Exit(1)
  94.     }
  95.  
  96.     os.Exit(compareKeyFile(os.Args[1], os.Args[2]))
  97. }
Advertisement
Add Comment
Please, Sign In to add comment