package main import "log" import "reflect" import "os" import "github.com/gookit/config" import "github.com/andlabs/ui" import "github.com/davecgh/go-spew/spew" import "git.wit.com/jcarr/shell" var mainwin *ui.Window var mydrive string func rsync(mybut *ui.Button) { log.Println("rsync() mybut =", reflect.ValueOf(mybut).Elem()) if _, err := os.Stat("/mnt/sdcard/lost+found/"); !os.IsNotExist(err) { log.Println("run rsync here") shell.Script(` rsync -av --progress --inplace /home/pinebook/factory/FACTORY-IMAGER-ROOTFS/ /mnt/sdcard/ umount /mnt/sdcard `) ui.MsgBox(mainwin, "The sdcard is finished", "") } else { log.Println("partition is not mounted") ui.MsgBoxError(mainwin, "The partition is not mounted at /mnt/sdcard", "") } } func dd(mybut *ui.Button) { if _, err := os.Stat("/mnt/factory-image/lost+found/"); os.IsNotExist(err) { shell.Run("mkdir /mnt/factory-image/") shell.Run("mount /dev/sdb2 /mnt/factory-image/") } if _, err := os.Stat("/mnt/factory-image/lost+found/"); os.IsNotExist(err) { log.Println("partition is not mounted") ui.MsgBoxError(mainwin, "The partition is not mounted at /mnt/sdcard", "") return } shell.Script("dd if=/home/pinebook/factory/factory-2019-01-20 of=/mnt/factory-image/factory-2019-01-20 status=progress oflag=sync"); ui.MsgBox(mainwin, "The sdcard is finished", "") } // select the dev entry to partition and format // for example: /dev/mtdblock0 or /dev/sdc func selectDrive(mybox *ui.Combobox) { spew.Dump(mybox.Visible()) spew.Dump(mybox.Selected()) spew.Dump(mybox.ControlBase) // spew.Dump(box.ControlBase.Parent) spew.Dump(mybox) log.Println("selected = ", mybox.Selected()) if (mybox.Selected() == 1) { mydrive = "/dev/sdb" } } func format(mybut *ui.Button) { log.Println("format() mybut =", reflect.ValueOf(mybut).Elem()) log.Println("format and mount here") shell.Script(` parted -s /dev/sdb mklabel msdos parted -s /dev/sdb mkpart primary ext4 1MiB 8GB parted -s /dev/sdb mkpart primary ext4 8GB 32GB sleep 1 mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2 e2label /dev/sdb1 root e2label /dev/sdb2 factory-image mount /dev/sdb1 /mnt/sdcard/ pwd dd if=../u-boot/u-boot-sunxi-with-spl.bin of=/dev/sdb status=progress oflag=sync bs=1K seek=8 `) } func addButton(vbox *ui.Box, label string, click func(*ui.Button)) { hbox := ui.NewHorizontalBox() hbox.SetPadded(true) // look up translation here for 'label' button := ui.NewButton(label) hbox.Append(button, false) button.OnClicked(click) vbox.Append(hbox, false) } func addGroupBox(hbox *ui.Box, name string) *ui.Box { groupDrive := ui.NewGroup(name) groupDrive.SetMargined(true) vbox := ui.NewVerticalBox() vbox.SetPadded(true) groupDrive.SetChild(vbox) hbox.Append(groupDrive, true) log.Println("groupDrive =", reflect.TypeOf(groupDrive)) vbox.SetPadded(true) return vbox } func makeBurnSDcardPage() *ui.Box { hbox := ui.NewVerticalBox() hbox.SetPadded(true) vbox := addGroupBox(hbox, "Select Distribution") cbox := ui.NewCombobox() for name, vars := range config.StringMap("dists") { log.Println("name =", name) log.Println("vars =", vars) cbox.Append(name) } cbox.OnSelected(selectDrive) vbox.Append(cbox, false) vbox2 := addGroupBox(hbox, "Select the Image") addButton(vbox2, "Download", format) addButton(vbox2, "Burn file to eMMC", dd) addButton(vbox2, "md5sum", rsync) return hbox } func getHardwareBox() *ui.Box { hbox := ui.NewVerticalBox() hbox.SetPadded(true) vbox := addGroupBox(hbox, "Hardware Info") addButton(vbox, "something", format) return hbox } func setupUI() { mainwin = ui.NewWindow("Pinebook eMMC Imager", config.Int("width"), config.Int("height"), false) mainwin.OnClosing(func(*ui.Window) bool { ui.Quit() return true }) ui.OnShouldQuit(func() bool { mainwin.Destroy() return true }) tab := ui.NewTab() mainwin.SetChild(tab) mainwin.SetMargined(true) tab.Append("Burn eMMC", makeBurnSDcardPage()) tab.SetMargined(0, true) // 0 here means tab 0 tab.Append("Hardware", getHardwareBox()) tab.SetMargined(1, true) // 1 here means tab 1 mainwin.Show() } func main() { parseConfig() ui.Main(setupUI) }