-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmounter_linux.go
100 lines (84 loc) · 2.1 KB
/
mounter_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package usbdrivedetect
import (
"bufio"
"bytes"
"fmt"
"log"
"os"
"os/exec"
"regexp"
"strings"
)
func DetectAndMount() ([]string, error) {
var drives []string
driveMap := make(map[string]string)
unmountedStorages := []string{}
udiskPattern := regexp.MustCompile("^(\\S+)\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(part) (.*$)")
out, err := exec.Command("lsblk", "--list").Output()
exec.Command("partprobe")
if err != nil {
log.Printf("Error calling udisk: %s", err)
}
s := bufio.NewScanner(bytes.NewReader(out))
for s.Scan() {
line := s.Text()
if udiskPattern.MatchString(line) {
device := udiskPattern.FindStringSubmatch(line)[1]
if ok := isUSBStorage(device); ok {
mountPoint := udiskPattern.FindStringSubmatch(line)[3]
if mountPoint == "" {
unmountedStorages = append(unmountedStorages, device)
} else {
driveMap[device] = mountPoint
}
}
}
}
for _, mountPoint := range driveMap {
file, err := os.Open(mountPoint)
if err == nil {
drives = append(drives, mountPoint)
}
file.Close()
}
if len(drives) != 0 {
return drives, nil
}
for _, device := range unmountedStorages {
mountPoint := "/media"
_, err := exec.Command("mount", "/dev/"+device, mountPoint).Output()
if err != nil {
switch err := err.(type) {
case *exec.ExitError:
log.Printf("Error calling udisksctl mount -b : %s", err.Stderr)
case error:
log.Printf("Error calling udisksctl mount -b : %s", err)
}
continue
}
fmt.Println("Mounted as", mountPoint)
file, err := os.Open(mountPoint)
if err == nil {
drives = append(drives, mountPoint)
file.Close()
} else {
fmt.Println("Err test open", err.Error())
exec.Command("unmount", "/media")
}
}
return drives, nil
}
func isUSBStorage(device string) bool {
deviceVerifier := "ID_USB_DRIVER=usb-storage"
cmd := "udevadm"
args := []string{"info", "-q", "property", "-n", device}
out, err := exec.Command(cmd, args...).Output()
if err != nil {
log.Printf("Error checking device %s: %s", device, err)
return false
}
if strings.Contains(string(out), deviceVerifier) {
return true
}
return false
}