Advertisement
Guest User

Untitled

a guest
Sep 28th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "flag"
  6. "fmt"
  7. "log"
  8. "os"
  9. "os/exec"
  10. "time"
  11. )
  12.  
  13. type task struct {
  14. cmd *exec.Cmd
  15. }
  16.  
  17. func (t *task) Run() error {
  18. log.Printf("running %v", t.cmd.Args)
  19.  
  20. stout, err := t.cmd.StdoutPipe()
  21. if err != nil {
  22. return err
  23. }
  24.  
  25. if err := t.cmd.Start(); err != nil {
  26. return err
  27. }
  28.  
  29. out := bufio.NewScanner(stout)
  30. for out.Scan() {
  31. log.Print(out.Text())
  32. }
  33. if err := out.Err(); err != nil {
  34. return err
  35. }
  36.  
  37. return nil
  38. }
  39.  
  40. var (
  41. workingDir string
  42. logFile string
  43. slnFile string
  44. vpn string
  45. )
  46.  
  47. func checkCommands() error {
  48. if _, err := exec.LookPath("hg"); err != nil {
  49. return err
  50. }
  51. if _, err := exec.LookPath("nuget"); err != nil {
  52. return err
  53. }
  54. return nil
  55. }
  56.  
  57. func connVPN(name string) error {
  58. conn := exec.Command("rasdial", name)
  59.  
  60. stdout, err := conn.StdoutPipe()
  61.  
  62. if err != nil {
  63. return err
  64. }
  65.  
  66. if err := conn.Start(); err != nil {
  67. return err
  68. }
  69.  
  70. out := bufio.NewScanner(stdout)
  71. var result string
  72. if out.Scan() {
  73. result = out.Text()
  74. }
  75. if result == fmt.Sprintf("You are already connected to %v.", name) {
  76. log.Println("VPN already connected")
  77. return nil
  78. }
  79.  
  80. time.Sleep(time.Second * 50)
  81.  
  82. test := exec.Command("rasdial", name)
  83. if err := test.Run(); err != nil {
  84. return err
  85. }
  86.  
  87. return nil
  88. }
  89.  
  90. func newTask(name string, arg ...string) *task {
  91. cmd := exec.Command(name, arg...)
  92. cmd.Dir = workingDir
  93. return &task{cmd}
  94. }
  95.  
  96. func init() {
  97. const (
  98. directoryUsage = "If omitted, the working directory will be the directory the program is running in."
  99. logUsage = "Log to the file specified."
  100. solutionUsage = "Specify the solution file to restore NuGet packages for."
  101. vpnUsage = "Specify the VPN connection to connect. (required)"
  102.  
  103. defaultDir = ""
  104. defaultLogFile = ""
  105. defaultSln = "CruiseControl.sln"
  106. defaultVPN = ""
  107. )
  108.  
  109. flag.StringVar(&workingDir, "directory", defaultDir, directoryUsage)
  110. flag.StringVar(&workingDir, "d", defaultDir, directoryUsage)
  111.  
  112. flag.StringVar(&logFile, "log", defaultLogFile, logUsage)
  113. flag.StringVar(&logFile, "l", defaultLogFile, logUsage)
  114.  
  115. flag.StringVar(&slnFile, "solution", defaultSln, solutionUsage)
  116. flag.StringVar(&slnFile, "s", defaultSln, solutionUsage)
  117.  
  118. flag.StringVar(&vpn, "vpn", defaultVPN, vpnUsage)
  119. flag.StringVar(&vpn, "v", defaultVPN, vpnUsage)
  120. }
  121.  
  122. func main() {
  123. flag.Parse()
  124.  
  125. if logFile != "" {
  126. file, err := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666)
  127. if err != nil {
  128. log.Fatal(err)
  129. }
  130. defer file.Close()
  131. log.SetOutput(file)
  132. }
  133.  
  134. log.Println("=== Nuget Package Caching ===")
  135.  
  136. if err := checkCommands(); err != nil {
  137. log.Fatal(err)
  138. }
  139.  
  140. if vpn == "" {
  141. log.Fatal("Error: must specify a VPN connection name")
  142. }
  143.  
  144. log.Printf("Connecting to %q", vpn)
  145.  
  146. if err := connVPN(vpn); err != nil {
  147. log.Fatal(err)
  148. }
  149.  
  150. log.Printf("Working Directory: %q Solution File: %q Log File: %q\n", workingDir, slnFile, logFile)
  151.  
  152. hgPull := newTask("hg", "pull")
  153.  
  154. if err := hgPull.Run(); err != nil {
  155. log.Fatal(err)
  156. }
  157.  
  158. hgUpdate := newTask("hg", "update")
  159.  
  160. if err := hgUpdate.Run(); err != nil {
  161. log.Fatal(err)
  162. }
  163.  
  164. ngRestore := newTask("nuget", "restore", slnFile)
  165.  
  166. if err := ngRestore.Run(); err != nil {
  167. log.Fatal(err)
  168. }
  169.  
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement