diff --git a/make-sdcard/main.go b/make-sdcard/main.go index 5503957..1a2d79f 100644 --- a/make-sdcard/main.go +++ b/make-sdcard/main.go @@ -1,7 +1,6 @@ package main import "log" -import "fmt" import "reflect" import "os" @@ -9,25 +8,11 @@ import "github.com/gookit/config" import "github.com/andlabs/ui" import "github.com/davecgh/go-spew/spew" -// use mergo to merge structs -// import "github.com/imdario/mergo" -// mergo.Merge(&dest, src) - -// always sorted slice (new project) -// https://github.com/yaa110/sslice - var mainwin *ui.Window var mydrive string -func doButton(mybut *ui.Button) { - log.Println("doButton() hostname = test", config.String("hostname")) - log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) - spew.Dump(mybut) - mybut.Enabled() -} - func rsync(mybut *ui.Button) { - log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) + log.Println("rsync() mybut =", reflect.ValueOf(mybut).Elem()) if _, err := os.Stat("/mnt/sdcard/lost+found/"); !os.IsNotExist(err) { log.Println("run rsync here") @@ -57,29 +42,9 @@ func selectDrive(mybox *ui.Combobox) { } func format(mybut *ui.Button) { - log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) + log.Println("format() mybut =", reflect.ValueOf(mybut).Elem()) log.Println("format and mount here") -/* - os.Chdir("/root") - script(` - pwd - ls -l /etc/issue - pwd - ls -l /ajlskdf - ls -l /etc/issue - ls -l /etc/issue - cd /tmp - echo blah - echo foo ; lkajsdf - cd - echo bar - `) - - script("dd if=/home/pinebook/factory/factory-pine14inch of=/dev/sdb status=progress bs=1M oflag=sync count=300"); - return -*/ - script(` parted -s /dev/sdb mklabel msdos parted -s /dev/sdb mkpart primary ext4 1MiB 8GB @@ -107,43 +72,6 @@ func addButton(vbox *ui.Box, label string, click func(*ui.Button)) { vbox.Append(hbox, false) } -func makeButtonsPage(names []string) ui.Control { - vbox := ui.NewVerticalBox() - vbox.SetPadded(true) - - hbox := ui.NewHorizontalBox() - hbox.SetPadded(true) - vbox.Append(hbox, false) - - for _, hostname := range names { - fmt.Println("hostname=", hostname) - addButton(vbox, hostname, doButton) - } - - vbox.Append(ui.NewHorizontalSeparator(), false) - - return vbox -} - -func makeGroupEntries() ui.Control { - group := ui.NewGroup("Entries") - group.SetMargined(true) - - group.SetChild(ui.NewNonWrappingMultilineEntry()) - - entryForm := ui.NewForm() - entryForm.SetPadded(true) - group.SetChild(entryForm) - - entryForm.Append("Entry", ui.NewEntry(), false) - entryForm.Append("Password Entry", ui.NewPasswordEntry(), false) - entryForm.Append("Search Entry", ui.NewSearchEntry(), false) - entryForm.Append("Multiline Entry", ui.NewMultilineEntry(), true) - entryForm.Append("Multiline Entry No Wrap", ui.NewNonWrappingMultilineEntry(), true) - - return group -} - func addGroupBox(hbox *ui.Box, name string) *ui.Box { groupDrive := ui.NewGroup(name) groupDrive.SetMargined(true) @@ -175,169 +103,9 @@ func makeBurnSDcardPage() *ui.Box { vbox2 := addGroupBox(hbox, "Select the Image") - rb := ui.NewRadioButtons() - rb.Append("Radio Button 1") - rb.Append("Radio Button 2") - rb.Append("Radio Button 3") - vbox2.Append(rb, false) - addButton(vbox2, "Partition and Format", format) addButton(vbox2, "rsync filesystem", rsync) - vbox3 := addGroupBox(hbox, "Select the Image") - - rb2 := ui.NewRadioButtons() - rb2.Append("stuff") - vbox3.Append(rb2, false) - - return hbox -} - -func makeNumbersPage() ui.Control { - hbox := ui.NewHorizontalBox() - hbox.SetPadded(true) - - group := ui.NewGroup("Numbers") - group.SetMargined(true) - hbox.Append(group, true) - - vbox := ui.NewVerticalBox() - vbox.SetPadded(true) - group.SetChild(vbox) - - spinbox := ui.NewSpinbox(47, 100) - slider := ui.NewSlider(21, 100) - pbar := ui.NewProgressBar() - - spinbox.OnChanged(func(*ui.Spinbox) { - slider.SetValue(spinbox.Value()) - pbar.SetValue(spinbox.Value()) - log.Println("slider = ", slider.Value()) - }) - slider.OnChanged(func(*ui.Slider) { - spinbox.SetValue(slider.Value()) - pbar.SetValue(slider.Value()) - }) - vbox.Append(spinbox, false) - vbox.Append(slider, false) - vbox.Append(pbar, false) - - ip := ui.NewProgressBar() - ip.SetValue(-1) - vbox.Append(ip, false) - - group = ui.NewGroup("Lists") - group.SetMargined(true) - hbox.Append(group, true) - - vbox = ui.NewVerticalBox() - vbox.SetPadded(true) - group.SetChild(vbox) - - cbox := ui.NewCombobox() - cbox.Append("Combobox Item 1") - cbox.Append("Combobox Item 2") - cbox.Append("Combobox Item 3") - vbox.Append(cbox, false) - - ecbox := ui.NewEditableCombobox() - ecbox.Append("Editable Item 1") - ecbox.Append("Editable Item 2") - ecbox.Append("Editable Item 3") - vbox.Append(ecbox, false) - - rb := ui.NewRadioButtons() - rb.Append("Radio Button 1") - rb.Append("Radio Button 2") - rb.Append("Radio Button 3") - vbox.Append(rb, false) - - return hbox -} - -func makeDataChoosersPage() ui.Control { - hbox := ui.NewHorizontalBox() - hbox.SetPadded(true) - - vbox := ui.NewVerticalBox() - vbox.SetPadded(true) - hbox.Append(vbox, false) - - vbox.Append(ui.NewDatePicker(), false) - vbox.Append(ui.NewTimePicker(), false) - vbox.Append(ui.NewDateTimePicker(), false) - vbox.Append(ui.NewFontButton(), false) - vbox.Append(ui.NewColorButton(), false) - - hbox.Append(ui.NewVerticalSeparator(), false) - - vbox = ui.NewVerticalBox() - vbox.SetPadded(true) - hbox.Append(vbox, true) - - grid := ui.NewGrid() - grid.SetPadded(true) - vbox.Append(grid, false) - - button := ui.NewButton("Open File") - entry := ui.NewEntry() - entry.SetReadOnly(true) - button.OnClicked(func(*ui.Button) { - filename := ui.OpenFile(mainwin) - if filename == "" { - filename = "(cancelled)" - } - entry.SetText(filename) - }) - grid.Append(button, - 0, 0, 1, 1, - false, ui.AlignFill, false, ui.AlignFill) - grid.Append(entry, - 1, 0, 1, 1, - true, ui.AlignFill, false, ui.AlignFill) - - button = ui.NewButton("Save File") - entry2 := ui.NewEntry() - entry2.SetReadOnly(true) - button.OnClicked(func(*ui.Button) { - filename := ui.SaveFile(mainwin) - if filename == "" { - filename = "(cancelled)" - } - entry2.SetText(filename) - }) - grid.Append(button, - 0, 1, 1, 1, - false, ui.AlignFill, false, ui.AlignFill) - grid.Append(entry2, - 1, 1, 1, 1, - true, ui.AlignFill, false, ui.AlignFill) - - msggrid := ui.NewGrid() - msggrid.SetPadded(true) - grid.Append(msggrid, - 0, 2, 2, 1, - false, ui.AlignCenter, false, ui.AlignStart) - - button = ui.NewButton("Message Box") - button.OnClicked(func(*ui.Button) { - ui.MsgBox(mainwin, - "This is a normal message box.", - "More detailed information can be shown here.") - }) - msggrid.Append(button, - 0, 0, 1, 1, - false, ui.AlignFill, false, ui.AlignFill) - button = ui.NewButton("Error Box") - button.OnClicked(func(*ui.Button) { - ui.MsgBoxError(mainwin, - "This message box describes an error.", - "More detailed information can be shown here.") - }) - msggrid.Append(button, - 1, 0, 1, 1, - false, ui.AlignFill, false, ui.AlignFill) - return hbox } @@ -359,12 +127,6 @@ func setupUI() { tab.Append("Burn SDCARD", makeBurnSDcardPage()) tab.SetMargined(0, true) - tab.Append("VMs", makeNumbersPage()) - tab.SetMargined(1, true) - - tab.Append("Data Choosers", makeDataChoosersPage()) - tab.SetMargined(2, true) - mainwin.Show() } diff --git a/make-sdcard/shell.go b/make-sdcard/shell.go index 6038ed3..f1afe16 100644 --- a/make-sdcard/shell.go +++ b/make-sdcard/shell.go @@ -3,69 +3,13 @@ package main import "fmt" import "log" import "strings" -import "io" import "time" import "os" import "os/exec" import "bufio" -import "reflect" import "github.com/davecgh/go-spew/spew" import "github.com/svent/go-nbreader" -/* -func exampleCommand(a string, b ...string) { - // cmd := exec.Command(range myargs) - // args := []string{"/tmp", "/"} - // cmd := exec.Command(args) - cmd := exec.Command(a, b...) - cmd.Stdin = strings.NewReader("foobar") - var out bytes.Buffer - cmd.Stdout = &out - err := cmd.Run() - if err != nil { - log.Fatal(err) - } - fmt.Println(out.String()) - // fmt.Printf("in all caps: %q\n", out.String()) -} - -func format(mybut *ui.Button) { - log.Println("doButton() mybut =", reflect.ValueOf(mybut).Elem()) - log.Println("format and mount here") - exampleCommand("ls", "/tmp") - ping() -} -*/ - -func ping(hostname string, count int) { - cmdName := "ping " + hostname - cmdArgs := strings.Fields(cmdName) - - cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) - stdout, _ := cmd.StdoutPipe() - cmd.Start() - // oneByte := make([]byte, 100) - num := 1 - for { - /* - _, err := stdout.Read(oneByte) - if err != nil { - fmt.Printf(err.Error()) - break - } - */ - r := bufio.NewReader(stdout) - line, _, _ := r.ReadLine() - fmt.Println(string(line)) - num = num + 1 - if num > count { - os.Exit(0) - } - } - - cmd.Wait() -} - func script(cmds string) int { // split on new lines (while we are at it, handle stupid windows text files lines := strings.Split(strings.Replace(cmds, "\r\n", "\n", -1), "\n") @@ -74,119 +18,11 @@ func script(cmds string) int { line = strings.TrimSpace(line) // this is like 'chomp' in perl fmt.Println("LINE:", line) time.Sleep(1) - // simpleProcess("ls /") - // simpleProcess(line) shell(line) } return 0 } -// Spawns a process and captures stdout and stderr -// this has to internally handle 'cd' and call os.Chdir() -func simpleProcess(cmd string) int { - log.Println("START " + cmd) - - cmd = strings.TrimSpace(cmd) // this is like 'chomp' in perl - cmdArgs := strings.Fields(cmd) - if (len(cmdArgs) == 0) { - log.Println("END ", cmd) - return 0 // nothing to do - } - if (cmdArgs[0] == "cd") { - if (len(cmdArgs) > 1) { - log.Println("os.Chdir()", cmd) - os.Chdir(cmdArgs[1]) - } - log.Println("END ", cmd) - return 0 // nothing to do - } - process := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) - stdout, _ := process.StdoutPipe() - stderr, _ := process.StderrPipe() - process.Start() - - pid := process.Process.Pid - fmt.Println("start ls /tmp pid =", pid) - log.Println(reflect.ValueOf(process.Process).Elem()) - log.Println(reflect.TypeOf(process.Process)) - - merged := io.MultiReader(stderr, stdout) - scanner := bufio.NewScanner(merged) - for scanner.Scan() { - line := scanner.Text() - fmt.Println("NOT " + line) // Println will add back the final '\n' - } - if err := scanner.Err(); err != nil { - // fmt.Fprintln(os.Stderr, "reading standard input:", err) - fmt.Println("reading standard input:", err) - } - - // One must wait for the process to formally finish and flush all buffer output - err := process.Wait() - - // try to process the return value from the OS. As of golang 1.12, - // this should be cross platform (linux,macos,windows) - if err != nil { - spew.Dump(err.(*exec.ExitError)) - spew.Dump(process.ProcessState) - stuff := err.(*exec.ExitError) - log.Println("ERROR ", stuff) - log.Println("END ", cmd) - return -1 - } - log.Println("END ", cmd) - return 0 -} - -func exampleScanner() { - // cmd := exec.Command("ls", "/tmp", "/ballon", "/") - cmd := exec.Command("ls", "/ballon") - stdout, _ := cmd.StdoutPipe() - cmd.Start() - - fmt.Println("start ls /tmp") - - scanner := bufio.NewScanner(stdout) - for scanner.Scan() { - line := scanner.Text() - fmt.Println("NOT " + line) // Println will add back the final '\n' - } - if err := scanner.Err(); err != nil { - // fmt.Fprintln(os.Stderr, "reading standard input:", err) - fmt.Println("reading standard input:", err) - } -} - -// prompt = whatever you would type at the command line "ls /tmp" -// timeout = number of lines to read in until exit -func stdoutExec(prompt string, timeout int) { - cmdArgs := strings.Fields(prompt) - - cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...) - stdout, _ := cmd.StdoutPipe() - cmd.Start() - // oneByte := make([]byte, 100) - num := 1 - for { - /* - _, err := stdout.Read(oneByte) - if err != nil { - fmt.Printf(err.Error()) - break - } - */ - r := bufio.NewReader(stdout) - line, _, _ := r.ReadLine() - fmt.Println(string(line)) - num = num + 1 - if num > timeout { - os.Exit(0) - } - } - - cmd.Wait() -} - func shell(cmdline string) int { log.Println("START " + cmdline)