---
# System prepended metadata

title: Auto Mount
tags: [go, script]

---

# Auto Mount
###### tags: `go`, `script`

``` go
package main

import (
    "fmt"
    "os"
    "os/exec"
    "regexp"
    "string"
)

func main() {
    fmt.Println("os      dev  UUID")

    cmd := `blkid -s UUID`
    blkid := runCmd(cmd)

    devices := scans(blkid, `\/dev\/(.*): UUID=\"(.*)\"`, 1, 2)

    for _, device := range devices {
        path := fmt.Sprintf(`/tmp/%s/`, device.Name)

        // 建立資料夾
        cmd = fmt.Sprintf(`mkdir %s`, path)
        runCmd(cmd)

        // 掛載
        cmd = fmt.Sprintf(`mount /dev/%s %s`, device.Name, path)
        runCmd(cmd)

        // 判斷有無作業系統
        switch {
        case fileExist(path + `Windows`):
            device.OS = `windows`
        case fileExist(path + `root`):
            device.OS = `linux`
        }

        device.Show()
    }

    fmt.Println()
    fmt.Println(`/tmp/[device]`)
}

type Device struct {
    Name string
    UUID string
    OS   string
}

func (device Device) Show() {
    os := rjust(device.OS, 7, "")
    fmt.Println(os, device.Name, device.UUID)
}

func scans(str, keyword string, is ...int) []Device {
    re := regexp.MustCompile(keyword)
    matchs := re.FindStringSubmatch(str)
    var devices []Device
    for _, match := range matchs {
        var device Device
        device.Name = match[1]
        device.UUID = match[2]
        devices = append(devices, device)
    }

    return devices
}

func fileExist(file string) bool {
    if _, err := os.Stat(file); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

func runCmd(cmd string) string {
    c, _ := exec.Command(`bash`, `-c`, cmd).CombinedOutput()
    return string(c)
}

func rjust(str string, n int, fill string) string {
    if len(str) < n {
        return strings.Repeat(fill, n-len(str)) + str
    }
    return str
}

```