blob: 15bd51ce3bf71183a3c5213516af9aee351eaa2b [file] [log] [blame]
Vladimir Serbinenko3129f792014-10-15 21:51:47 +02001package main
2
3import (
Chris Ching5343b1f2016-05-17 11:56:03 -06004 "errors"
5 "fmt"
Vladimir Serbinenko3129f792014-10-15 21:51:47 +02006 "io"
7 "io/ioutil"
8 "log"
9 "os"
10 "os/exec"
11 "strings"
12)
13
Vladimir Serbinenko39e25ec2015-05-29 20:49:09 +020014func TryRunAndSave(output string, name string, arg []string) error {
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020015 cmd := exec.Command(name, arg...)
16
17 f, err := os.Create(output)
18 if err != nil {
19 log.Fatal(err)
20 }
21
22 cmd.Stdout = f
23 cmd.Stderr = f
24
25 err = cmd.Start()
26 if err != nil {
Vladimir Serbinenko39e25ec2015-05-29 20:49:09 +020027 return err
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020028 }
29 cmd.Wait()
Vladimir Serbinenko39e25ec2015-05-29 20:49:09 +020030 return nil
31}
32
33func RunAndSave(output string, name string, arg ...string) {
34 err := TryRunAndSave(output, name, arg)
35 if err == nil {
36 return
37 }
38 idx := strings.LastIndex(name, "/")
39 relname := name
40 if idx >= 0 {
41 relname = name[idx+1:]
42 }
43 relname = "./" + relname
44 err = TryRunAndSave(output, relname, arg)
45 if err != nil {
46 log.Fatal(err)
47 }
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020048}
49
Chris Ching5343b1f2016-05-17 11:56:03 -060050const MAXPROMPTRETRY = 3
51
52func PromptUser(prompt string, opts []string) (match string, err error) {
53 for i := 1; i < MAXPROMPTRETRY; i++ {
54 fmt.Println("%s. (%s) Default:%s", prompt, strings.Join(opts, "/"), opts[0])
55 var usrInput string
56 fmt.Scanln(&usrInput)
57
58 // Check for default entry
59 if usrInput == "" {
60 match = opts[0]
61 return
62 }
63
64 for _, opt := range opts {
65 if opt == usrInput {
66 match = opt
67 return
68 }
69 }
70 }
71 err = errors.New("max retries exceeded")
72 fmt.Fprintln(os.Stderr, "ERROR: max retries exceeded")
73 return
74}
75
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020076func MakeLogs(outDir string) {
77 os.MkdirAll(outDir, 0700)
78 RunAndSave(outDir+"/lspci.log", "lspci", "-nnvvvxxxx")
79 RunAndSave(outDir+"/dmidecode.log", "dmidecode")
80 RunAndSave(outDir+"/acpidump.log", "acpidump")
Chris Ching5343b1f2016-05-17 11:56:03 -060081
82 inteltoolArgs := "-a"
83 opt, err := PromptUser("WARNING: The following tool MAY cause your system to hang when it attempts "+
84 "to probe for graphics registers. Having the graphics registers will help create a better port. "+
85 "Should autoport probe these registers?",
86 []string{"y", "yes", "n", "no"})
87
88 // Continue even if there is an error
89
90 switch opt {
91 case "y", "yes":
Sebastian 'Swift Geek' Grzywnae6bd18f2017-01-08 03:42:30 +010092 inteltoolArgs += "f"
Chris Ching5343b1f2016-05-17 11:56:03 -060093 }
94
95 RunAndSave(outDir+"/inteltool.log", "../inteltool/inteltool", inteltoolArgs)
Iru Caibc511202017-02-24 15:19:25 +080096 RunAndSave(outDir+"/ectool.log", "../ectool/ectool", "-d")
Arthur Heymans98e77c72017-02-24 13:18:14 +010097 RunAndSave(outDir+"/superiotool.log", "../superiotool/superiotool", "-ade")
Vladimir Serbinenko3129f792014-10-15 21:51:47 +020098
99 SysDir := "/sys/class/sound/card0/"
100 files, _ := ioutil.ReadDir(SysDir)
101 for _, f := range files {
102 if (strings.HasPrefix(f.Name(), "hw") || strings.HasPrefix(f.Name(), "hdaudio")) && f.IsDir() {
103 in, err := os.Open(SysDir + f.Name() + "/init_pin_configs")
104 defer in.Close()
105 if err != nil {
106 log.Fatal(err)
107 }
108 out, err := os.Create(outDir + "/pin_" + strings.Replace(f.Name(), "hdaudio", "hw", -1))
109 if err != nil {
110 log.Fatal(err)
111 }
112 defer out.Close()
113 io.Copy(out, in)
114 }
115 }
116
117 ProcDir := "/proc/asound/card0/"
118 files, _ = ioutil.ReadDir(ProcDir)
119 for _, f := range files {
120 if strings.HasPrefix(f.Name(), "codec#") && !f.IsDir() {
121 in, err := os.Open(ProcDir + f.Name())
122 defer in.Close()
123 if err != nil {
124 log.Fatal(err)
125 }
126 out, err := os.Create(outDir + "/" + f.Name())
127 if err != nil {
128 log.Fatal(err)
129 }
130 defer out.Close()
131 io.Copy(out, in)
132 }
133 }
134
135 for _, fname := range []string{"cpuinfo", "ioports"} {
136 in, err := os.Open("/proc/" + fname)
137 defer in.Close()
138 if err != nil {
139 log.Fatal(err)
140 }
141 out, err := os.Create(outDir + "/" + fname + ".log")
142 if err != nil {
143 log.Fatal(err)
144 }
145 defer out.Close()
146 io.Copy(out, in)
147 }
Vladimir Serbinenko91195c62015-05-29 23:53:37 +0200148
149 out, err := os.Create(outDir + "/input_bustypes.log")
150 if err != nil {
151 log.Fatal(err)
152 }
153 defer out.Close()
154
155 ClassInputDir := "/sys/class/input/"
156 files, _ = ioutil.ReadDir(ClassInputDir)
157 for _, f := range files {
158 if strings.HasPrefix(f.Name(), "input") && !f.Mode().IsRegular() { /* Allow both dirs and symlinks. */
159 in, err := os.Open(ClassInputDir + f.Name() + "/id/bustype")
160 defer in.Close()
161 if err != nil {
162 log.Fatal(err)
163 }
164 io.Copy(out, in)
165 }
166 }
Vladimir Serbinenko3129f792014-10-15 21:51:47 +0200167}