Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.89 KB | None | 0 0
  1. [root@byol-host ~]# cat main.go
  2. package main
  3.  
  4. import (
  5.  "fmt"
  6.  "os"
  7.  "flag"
  8.  "strings"
  9.  "strconv"
  10.  "encoding/csv"
  11.  "encoding/json"
  12.  "io"
  13. )
  14.  
  15. type User struct {
  16.  Id     int     `json:"id"`
  17.  Name   string  `json:"name"`
  18.  Home   string  `json:"home"`
  19.  Shell  string  `json:"shell"`
  20. }
  21.  
  22. func main() {
  23.  path, format := parseFlags()
  24.  users := collectUsers()
  25.  
  26.  var output io.Writer
  27.  
  28.  if path != "" {
  29.   f, err := os.Create(path)
  30.   handleError(err)
  31.   defer f.Close()
  32.  
  33.   output = f
  34.  } else {
  35.   output = os.Stdout
  36.  }
  37.  
  38.  if format == "json" {
  39.   data, err := json.MarshalIndent(users, "", " ")
  40.   handleError(err)
  41.   output.Write(data)
  42.  } else if format == "csv" {
  43.    output.Write([]byte("name,id,home,shell\n"))
  44.    writer := csv.NewWriter(output)
  45.    for _, user := range users {
  46.     err := writer.Write([]string{user.Name, strconv.Itoa(user.Id), user.Home, user.Shell})
  47.     handleError(err)
  48.    }
  49.    writer.Flush()
  50.  }
  51. }
  52.  
  53. func handleError(err error) {
  54.  if err != nil {
  55.   fmt.Println("Error: ", err)
  56.   os.Exit(1)
  57.  }
  58. }
  59.  
  60. func collectUsers() (users []User) {
  61.  f, err := os.Open("/etc/passwd")
  62.  
  63.  handleError(err)
  64.  
  65.  defer f.Close()
  66.  
  67.  reader := csv.NewReader(f)
  68.  reader.Comma = ':'
  69.  
  70.  lines, err := reader.ReadAll()
  71.  handleError(err)
  72.  
  73.  for _, line := range lines {
  74.   id, err := strconv.ParseInt(line[2], 10, 64)
  75.   handleError(err)
  76.   if id < 1000 {
  77.    continue
  78.   }
  79.  
  80.   user := User{
  81.    Name:  line[0],
  82.    Id:    int(id),
  83.    Home:  line[5],
  84.    Shell: line[6],
  85.   }
  86.  
  87.   users = append(users, user)
  88.  }
  89.  return
  90. }
  91.  
  92. func parseFlags() (path, format string) {
  93.  flag.StringVar(&path, "path", "", "the path to the export file.")
  94.  flag.StringVar(&format, "format", "json", "output format file")
  95.  
  96.  flag.Parse()
  97.  
  98.  format = strings.ToLower(format)
  99.  
  100.  if format != "csv" && format != "json" {
  101.   fmt.Println("Error. Invalid format")
  102.   flag.Usage()
  103.   os.Exit(1)
  104.  
  105.  }
  106.  return
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement