]> www.wagner.pp.ru Git - oss/fubar.git/blob - plugins/mount
Reimport after CVS crash
[oss/fubar.git] / plugins / mount
1 #!/usr/bin/wish
2
3 namespace eval mount {
4
5 # Default images for various device types.
6 # First image in list - for mounted device, second - for empty
7 set stdImages(floppy) [list [image create photo -data {
8 R0lGODlhEAAQAMIAAAAAgAAAAP//AODg4P///8DAwP///////yH+Dk1hZGUgd2l0aCBHSU1Q
9 ACH5BAEKAAcALAAAAAAQABAAAAM7CBDcHgoCQasVUY3N+8gAIY4kAXooWK4n2qkrCSp0XUtK
10 oe/FXfcAno8GFNJwwdxumFPqbjje8vioPhIAOw==
11 }] [image create photo -data {
12 R0lGODlhEAAQAOMAAAAAgAAAAP//AODg4P///4CAgMDAwP8AAP//////////////////////
13 /////////yH+Dk1hZGUgd2l0aCBHSU1QACH5BAEKAAgALAAAAAAQABAAAARLEIBAqw0SA8G7
14 F5k0jGQ5hAChriyBFnAsx1hh3Hh+F0HR/gRYT6c7GIQ2nCyHPAorMecQx2LyZliaRmLg4iQo
15 rvcGnmyJXfBlvY4AADs=
16 }]]
17
18 set stdImages(cdrom)  [list [image create photo -data {
19 R0lGODlhEAAQAMIAAICAgP//AMDAwAAAAAD//wD/AP///////yH+Dk1hZGUgd2l0aCBHSU1Q
20 ACH5BAEKAAcALAAAAAAQABAAAANReKrQvZCBEIQdIx5AaLUXBBRE91mGkDEFSYGpylhth4Iy
21 AJLAoOOZHy0zwOVwhh4HuIGhCgECaKWL0aLS1cZ6xWqbuBblK9kVMJpFA0NOuxUJADs=
22 }] [image create photo -data {
23 R0lGODlhEAAQAMIAAICAgP//AMDAwAAAAAD//wD/AP///////yH+Dk1hZGUgd2l0aCBHSU1Q
24 ACH5BAEKAAcALAAAAAAQABAAAANKeKrQvZCBEIQdIx5AaLUXBBRE91mGkElO624AKM/AABh4
25 ruONPdOCXgzUkgmDPYytgfSBdMaaa+pYbWaFAsW6YFqyGE23FhabNQkAOw==
26 }]]
27
28 set stdImages(zip) [list [image create photo -data {
29 R0lGODlhEAAQAMIAAAAAAAAAgMDAwJYNH////+Dg4P//AP///yH+Dk1hZGUgd2l0aCBHSU1Q
30 ACH5BAEKAAcALAAAAAAQABAAAANJCLrcGkHIOWF4kVJ7od4W4H0SJ3IoeqbsyqrQIA9EbRPQ
31 WexD0e+7HKRGs81wnYCP1/sNhIEikVB8JmdNn6wANXgN2C/U0YAkAAA7
32 }]  [image create photo -data {
33 R0lGODlhEAAQAMIAAOgNDYCAgMDAwAAAAP////8AAP///////yH+Dk1hZGUgd2l0aCBHSU1Q
34 ACH5BAEKAAcALAAAAAAQABAAAAM9eLrc/g1IoChc9uKaJ8tHV43fFlZBqq6qEghwLMPBEBB4
35 ruOpPc8FQe8VW8mGwt5gqUr6YrpjjUVVDTSPBAA7
36 }]]
37
38 set stdImages(memoryCard) [list [image create photo -data {
39 R0lGODdhEAAQAMIAAAAAAPhAQIgAAOD8+Pj8+ODg4OD88Pj8ACwAAAAAEAAQAAADSAi63Bow
40 SvmmjeDqrC3vVCQI0DiGAZmuXjm8hEnMECcUxVDcOF6XhIEgFoT9ArubMIcbHAezGRQafL50
41 WIPueOh6v4ejowFJAAA7
42 }] [image create photo -data {
43 R0lGODdhEAAQAMIAAOiouPj8+ICAgMDAwAAAAPgAAAAAAAAAACwAAAAAEAAQAAADMwi63P4w
44 ykkrCMFiJrr/niIMZGmSAiFgbMt26nkWAzyWn2nXMOF7vFippUuBjh6Ca7lMAAA7
45 }]]
46
47 proc listDevices {} {
48     variable mountedDevices 
49         variable ejectableDevices 
50         variable deviceWidgets
51         variable deviceImage
52         variable stdImages 
53     frame .mount
54     set index 1
55     set f [open /etc/fstab]
56     foreach m [split [read $f] "\n"] {
57         if {![string length $m]||[regexp "^\[ \t\]*#" $m]} continue
58         set opts [split [lindex $m 3] ","]
59         set device [lindex $m 0]
60         if {[lsearch -exact $opts user]==-1||[regexp ":" $device]} continue
61         set mpoint [lindex $m 1]  
62         # Guessing
63         switch -glob $device {
64             /dev/fd* { #floppy
65                 set deviceImage($mpoint) $stdImages(floppy)
66             }
67             /dev/[sh]d[a-z][0-9] { #partitioned drive 
68                         regexp {/dev/.d[a-z]} $device ejpath
69                         if {[regexp zip $mpoint]} {     
70                                 # assume it is Zip
71                                 set ejectableDevices($mpoint) $ejpath
72                                 set deviceImage($mpoint) $stdImages(zip)
73                         } else {
74                                 # USB flashcard or something
75                         if {[regexp ejectable $m]} {
76                                         set ejectableDevices($mpoint) $ejpath
77                         }
78                                 set deviceImage($mpoint) $stdImages(memoryCard)
79                         }
80                 }
81                 default { # anything else should be CD-rom
82                 set ejectableDevices($mpoint) $device 
83                 set deviceImage($mpoint) $stdImages(cdrom)
84             }   
85         }
86         set deviceWidgets($mpoint) .mount.d$index
87         incr index
88         label $deviceWidgets($mpoint)  
89         bind $deviceWidgets($mpoint) <1> [list ::mount::changeDeviceStatus $mpoint]
90         pack $deviceWidgets($mpoint) -side left
91     }
92     close $f
93     scanMtab
94     pack .mount -side right
95 }
96
97 proc scanMtab {args} {
98     variable deviceWidgets 
99         variable deviceImage
100     set f [open /etc/mtab]
101     foreach m [split [read $f] "\n"] {
102         if {![llength $m]} continue
103         set mpoint [lindex $m 1]
104         if [info exists deviceWidgets([lindex $m 1])] {
105            set mounted($mpoint) 1
106          
107         }
108     }
109     close $f
110     foreach {mpoint widget} [array get deviceWidgets] {
111          if [info exists mounted($mpoint)] {
112              $widget configure -image [lindex $deviceImage($mpoint) 0]
113              balloonhelp $widget "$mpoint (mounted)"
114          } else {
115              $widget configure -image [lindex $deviceImage($mpoint) 1]
116              balloonhelp $widget  "$mpoint"
117          }
118          
119     }
120 }    
121
122 proc changeDeviceStatus {mpoint} {
123      variable deviceWidgets  
124          variable deviceImage
125      if {[$deviceWidgets($mpoint) cget -image]=="[lindex $deviceImage($mpoint)\
126             1]"} {
127          mount $mpoint
128      } else {
129          unmount $mpoint
130      }
131      scanMtab
132 }
133
134 proc mount {mpoint} {
135    global errorCode 
136    if [catch {exec mount $mpoint} msg] {
137       # mount returns non-zero
138       if {$errorCode!="NONE"} {
139          tk_messageBox -title "Mount failed" -message $msg -icon  error\
140                 -type ok
141          return
142       } else {
143          # No error, but there is warning. Mounted read only
144          if [string length $msg] { 
145               tk_messageBox -title "Warning" -message $msg -icon warning \
146                       -type ok
147          }
148       }
149    }
150 }
151
152 proc unmount {mpoint} {
153    global eject ejectableDevices
154    if [catch {exec umount $mpoint} msg] {
155       tk_messageBox -title "Umount failed" -message $msg -icon  error\
156          -type ok
157       return
158    }
159    if {[info exists ejectableDevices($mpoint)]} {
160       if [catch {exec eject $ejectableDevices($mpoint) 2>/dev/null} msg] {
161          
162       tk_messageBox -title "Eject failed" -message "Device is unmounted\
163        but cannot be ejected:\n$msg" -icon  error\
164          -type ok
165       }
166    }
167 }
168 listDevices
169 }
170 notifier ::mount::scanMtab