home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/tclsh
- #
- # MUT written by Jesse Liley for Puppy Linux 2005
- # bugs, fixes, suggestions, email: Jesse.Liley@gmail.com
- #
- # Free software, use at own risk! LGPL, please keep comments.
- #
- # Images used taken from Mandrake Linux download 10.0 /usr/share/icons
- # So I hope they are free to distribute :-)
- #
-
- package require Tcl 8.5
-
-
- #Here you can set devices that start out not being scanned, e.g. for if the scan time takes a while and you don't really want to wait every refresh.
- array unset NoScanMedia ;# this line defines the array.
- set NoScanMedia(fd0) "noscan" ;# floppy disk is fd0
- set NoScanMedia(fd1) "noscan" ;# second floppy disk is fd1, this is ok if one or none floppy drives in system.
- #set NoScanMedia(fd0) "noscan" ;# add others, replace fd0 with device name
-
-
- # This function calculates home path of application, yay, no need to configure it :-) even if symlinked to it.
- # this is generic, it could apply to any tcl app that has an application directory structure.
- proc homepath { } {
- set cmd "pwd"
- catch $cmd this_pwd
- if {[string index $::argv0 0] == "/"} {
- set path "$::argv0"
- } else {
- set path "$this_pwd/$::argv0"
- }
- # if it is a symlink from say /usr/local/bin/mut, follow the link.
- if { [file type $path] == "link" } {
- set path "$this_pwd/[file readlink $path]"
- }
- set path "$path/.."
- set plist [split $path "/"]
- set n [llength $plist]
- for {set i 0} {$i < $n} {incr i} {
- if {[lindex $plist $i] == "."} {
- set a [expr "$i - 1" ]
- set b [expr "$i + 1" ]
- set plist [concat [lrange $plist 0 $a] [lrange $plist $b end ] ]
- incr n -1
- }
- }
- set n [llength $plist]
- set olist ""
- for {set i 0} {$i < $n} {incr i} {
- if {[lindex $plist $i] == ".."} {
- set olist [lrange $olist 0 [expr "[llength $olist]-2"]]
- } else {
- lappend olist [lindex $plist $i]
- }
- }
- set path "[join $olist "/"]/"
- return $path
- }
-
-
- proc full_refresh_display {} {
- array unset ::actions
- set ::infolist {}
- run_full_scan
- Show_Devices
- }
-
-
- proc remove_empties str {
- set i 0
- set i [lsearch $str {}]
- while {$i >= 0} {
- set str [lreplace $str $i $i]
- set i [lsearch $str {}]
- }
- return $str
- }
-
- proc grab_fs_vol {fs dev} {
- set results ""
- if {[lsearch [list "iso9660" "vfat" "ext2"] $fs]=={}} {
- if {$::debug} {puts "Unknown fs $fs for grab_fs_vol"}
- return ""
- }
- catch "exec $::mut/bin/label_$fs /dev/$dev" results
- set results [lindex [split $results "\n"] 0]
- set results [string trimleft [string trimright $results]]
- return $results
- }
-
- proc majorBus__get_list {} {
- set rec false
- array unset ::majorBus
- array unset ::majorBusRev
- catch {
- set fid [open "/proc/devices" r]
- if {$::debug} {puts "in majorBus__get_list"}
- while {![eof $fid]} {
- gets $fid str
- set line [remove_empties [split $str " "]]
- if {$rec == true && [lindex $line 1] > 1} {
- set ::majorBus([lindex $line 0]) [lindex $line 1]
- set ::majorBusRev([lindex $line 1]) [lindex $line 0]
- if {$::debug} {puts " ::majorBus([lindex $line 0]) $::majorBus([lindex $line 0]) "}
- }
- if {[lindex $line 0 ] == "Block"} {set rec true}
- }
- close $fid
- }
- }
-
- # scan media or model file.
- proc scan_ide_medium {bus lun scan_me} {
- if {$bus=="" || $lun=="" || $scan_me==""} {return ""}
- set medium ""
- catch {
- set bd_fd [open "/proc/ide/$bus/$lun/$scan_me" r]
- gets $bd_fd medium
- close $bd_fd
- }
- return $medium
- }
-
- proc main_or_part {str} {
- for {set i 0} {$i < [string length $str] } {incr i} {
- if {[string index $str $i] >= "0" && [string index $str $i] <= "9"} {
- if {[string range $str $i end] >= 1 && [string range $str $i end] <= 16} {
- return part
- }
- }
- }
- return main
- }
-
- proc diskStats26__get_list {quick} {
- set rec false
- array unset ::diskStats
- catch {
- set fid [open "/proc/diskstats" r]
- if {$::debug} {puts "in diskStats26__get_list"}
- while {![eof $fid]} {
- gets $fid str
- set line [remove_empties [split $str " "]]
- foreach did $::grabdevs {
- if {[string range [lindex $line 2] 0 1] == $did} {
- set media ""
- if {$did == "fd"} {
- set media floppy
- }
- if {$did == "hd"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media [scan_ide_medium $::majorBus([lindex $line 0]) [lindex $line 2] "media"]
- } else {
- set media part
- }
- }
- if {$did == "sd"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media disk
- } else {
- set media part
- }
- }
- if {$did == "scd" || $did=="sr"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media cdrom
- } else {
- set media part
- }
- }
- set ::diskStats([lindex $line 2]) "[lindex $line 0].[lindex $line 1].$::majorBus([lindex $line 0]).$media"
- if {$::debug} {puts "set ::diskStats([lindex $line 2]) $::diskStats([lindex $line 2])"}
- }
- }
- if {[lindex $line 0 ] == "Block"} {set rec true}
- }
- close $fid
- }
- }
-
- proc diskStats24__get_list {quick} {
- set rec false
- array unset ::diskStats
- if {$::debug} {puts "in diskStats24__get_list"}
- set addfd false
- catch {
- if {$::majorBusRev(fd) >= 0} {
- set ::diskStats(fd0) "$::majorBusRev(fd).0.fd.floppy"
- if {$::debug} {puts "set ::diskStats(fd0) $::diskStats(fd0)"}
- #second floppy disk here:
- #set ::diskStats(fd1) "$::majorBusRev(fd).1.fd.floppy"
- #if {$::debug} {puts "set ::diskStats(fd1) $::diskStats(fd1)"}
- }
- }
- foreach dev [lsort [array names ::partitions]] {
- set str $::partitions($dev)
- set line [remove_empties [list [lindex $str 1] [lindex $str 2] $dev ]]
- if {[llength $line] < 3 } {continue}
- foreach did $::grabdevs {
- if {[string range [lindex $line 2] 0 1] == $did} {
- set media ""
- if {$did == "fd"} {
- set media floppy
- }
- if {$did == "hd"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media [scan_ide_medium $::majorBus([lindex $line 0]) [lindex $line 2] "media"]
- } else {
- set media part
- }
- }
- if {$did == "sd"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media disk
- } else {
- set media part
- }
- }
- if {$did == "scd" || $did=="sr"} {
- if {[main_or_part [lindex $line 2]] == "main"} {
- set media cdrom
- } else {
- set media part
- }
- }
- set ::diskStats([lindex $line 2]) "[lindex $line 0].[lindex $line 1].$::majorBus([lindex $line 0]).$media"
- if {$::debug} {puts "set ::diskStats([lindex $line 2]) $::diskStats([lindex $line 2])"}
- }
- }
- if {[lindex $line 0 ] == "Block"} {set rec true}
- }
- }
-
- proc diskStats__get_list {quick} {
- if {$::Kernel_Version=="2.4"} {diskStats24__get_list $quick}
- if {$::Kernel_Version=="2.6"} {diskStats26__get_list $quick}
- }
-
- proc partitions__get_list {} {
- array unset ::partitions
- catch {
- set fid [open "/proc/partitions" r]
- while {![eof $fid]} {
- gets $fid str
- set shortlist [remove_empties [split $str]]
- set dev [lindex $shortlist 3]
- if {[llength $str] == 4 && [lindex $str 0] > 0 && [lindex $shortlist 2] > 1 } {
- set mytimer [clock clicks -milliseconds]
- set openok true
- set catchinfo ""
- if {$::Kernel_Version=="2.4" && [string range $dev 0 1] == "sd"} {
- # Sigh, we have to force the kernel to look at the hardware:
- if {[info exists ::NoScanMedia($dev)]} {
- if {$::debug} { puts "not scan $dev"}
- } else {
- set openok false
- catch {
- if {$::debug} { puts "about to scan $dev"}
- set bd_fd [open "/dev/$dev" r]
- close $bd_fd
- set openok true
- } catchinfo
- }
- }
- if {$openok == false} {
- if {$::debug} { puts "device not working? /dev/$dev $catchinfo" }
- if {[info exists ::NoScanMedia($dev)]} {
- if {$::debug} {puts "already in NoScanMedia $::NoScanMedia($dev)"}
- } else {
- #if it exists but cannot be opened, make it a noscan object
- if {[file exists /dev/[lindex $shortlist 3] ] == 1} {
- set ::NoScanMedia([lindex $shortlist 3]) "noscan"
- }
- }
- }
- set time_length [expr "[clock clicks -milliseconds] - $mytimer"]
- if {$::debug} { puts "open scan time is $time_length 1000ths of a second, $shortlist"}
- set ::partitions([lindex $shortlist 3]) \
- [list [format "%1.1f Mb" [expr "[lindex $shortlist 2]/1000.0"]] [lindex $shortlist 0] [lindex $shortlist 1]]
- if {$::debug} {puts "set ::partitions($dev) = $::partitions($dev)"}
- }
- if {[llength $str] == 4 && [lindex $str 0] > 0 && [lindex $shortlist 2] == 1 } {
- set ::partitions($dev) "extended"
- }
- }
- close $fid
- }
-
- # we have to scan for extra devices here in kernel 2.4
- # Scan for IDE removable disc drives (cdroms)
- if {$::Kernel_Version=="2.4"} {
- set ide_devs [glob /dev/hd*]
- set ide_scan {}
- set devlist [array names ::partitions]
- foreach device $ide_devs {
- set dev [lindex [split $device / ] 2]
- set atpos [lsearch -exact $devlist $dev]
- if {$atpos < 0 && [string length $dev] == 3} {
- set found false
- set gl ""
- catch {
- set gl [split [glob "/proc/ide/ide*/$dev"] /]
- }
- array unset ::cdromMedium $dev
- if {$gl == ""} {continue}
- set info ""
- lappend ide_scan $dev
- catch { exec $::mut/bin/stat_dev /dev/$dev } info
- if {$info ==""} {continue}
- set ::partitions($dev) [concat "device" [split $info |]]
- if {$::debug} { puts "set ::partitions($dev) = $::partitions($dev)" }
- #set ::diskStats($dev) "[lindex $info 0].[lindex $info 1].sr.cdrom"
- #if {$::debug} { puts "set ::diskStats($dev) = $::diskStats($dev)" }
- }
- }
- if {$::debug} { puts "scan these devices... [lsort $ide_scan]" }
- }
- # Scan for SCSI/USB removable disc drives (cdroms)
- if {$::Kernel_Version=="2.4" || $::Kernel_Version=="2.6"} {
- set sr_devs [glob /dev/sr*]
- set sr_scan {}
- set devlist [array names ::partitions]
- foreach device $sr_devs {
- set dev [lindex [split $device / ] 2]
- set atpos [lsearch -exact $devlist $dev]
- if {$atpos < 0 && [string length $dev] == 3} {
- set found false
- set gl ""
- set cdinfo ""
- catch { exec $::mut/bin/cdrominfo /dev/$dev -p } cdinfo
- if {$cdinfo == ""} {continue}
- set info [split $cdinfo |]
- if {[llength $info ] < 10} {continue}
- lappend sr_scan $dev
- catch { exec $::mut/bin/stat_dev /dev/$dev } info
- set ::partitions($dev) [concat "device" [split $info |]]
- if {$::debug} { puts "set ::partitions($dev) = $::partitions($dev)" }
- }
- }
- if {$::debug} { puts "scan these devices... [lsort $sr_scan]" }
- }
- }
-
- proc device_nodes__scan_for_make_additional {} {
- foreach name [lsort [array names ::partitions]] {
- if {[lsearch -exact $::existing_nodes $name] >= 0} {continue}
- set info ""
- catch { exec $::mut/bin/stat_dev /dev/$name } info
- set info [split $info |]
- if {[lindex $info 0]>0 && [llength $info] ==2} {
- lappend ::existing_nodes $name
- } else {
- if {$::debug} {puts "ADDME $name info $info"}
- if {$::debug} {puts "makedevs /dev/$name b [lindex $::partitions($name) 1] [lindex $::partitions($name) 2] 0 16 s" }
- catch "exec makedevs /dev/$name b [lindex $::partitions($name) 1] [lindex $::partitions($name) 2] 0 16 s " ex_info
- if {$::debug} {puts "execute info $ex_info" }
- }
- }
- if {$::debug} {puts "devnodes include $::existing_nodes"}
- }
-
- proc cdromMedium_get_list {quick} {
- if {$quick=="true"} {return}
- array unset ::cdromMedium
- foreach dev [array names ::diskStats] {
- set ds [split $::diskStats($dev) '.']
- if {[lindex $ds 3] =="cdrom"} {
- catch "exec $::mut/bin/cdrominfo /dev/$dev -p" cdinfo
- set ::cdromMedium($dev) $cdinfo
- if {$::debug} {puts "set ::cdromMedium($dev) which is $cdinfo"}
- }
- }
- }
-
- proc additional_scan_for {mnt} {
- catch { exec $::mut/bin/stat_dev /dev/$mnt } info
- set m [lindex [split $info |] 0]
- set s [lindex [split $info |] 1]
- if {$m !="" && $s!= ""} {
- foreach dev [array names ::diskStats] {
- if {$m == [lindex [split $::diskStats($dev) .] 0] &&
- $s == [lindex [split $::diskStats($dev) .] 1]} {
- if {$dev !="" && $mnt !=""} {
- set ::etc_fstab($dev) "/mnt/$mnt"
- if {$::debug} {puts "set ::etc_fstab($dev) = $::etc_fstab($dev)"}
- return
- }
- }
- }
- }
- }
-
- proc etc_fstab__get_list {} {
- if {$::debug} {puts "in etc_fstab__get_list"}
- array unset ::etc_fstab
- catch {
- set fid [open "/etc/fstab" r]
- while {![eof $fid]} {
- gets $fid str
- set sl [remove_empties [split $str]]
- set dev [lindex $sl 0]
- set mnt [lindex $sl 1]
- set dev [lindex [remove_empties [split $dev /]] end]
- if { $dev != "" &&
- $dev != "none" &&
- $dev != "tmpfs" &&
- $dev != "rootfs" &&
- $dev != "loop"} {
- if {$dev !="" && $mnt !=""} {
- set ::etc_fstab($dev) "$mnt"
- if {$::debug} {puts "set ::etc_fstab($dev) = $::etc_fstab($dev)"}
- }
- }
- }
- }
- close $fid
- additional_scan_for dvd
- additional_scan_for cdrom
-
- # Multisession DVD/CD should get mounted at /mnt/home if possible
- set myhome /mnt/myhome
- if {[file exists /etc/multisessionmediatype]} {
- set cdburnerdrive ""
- if {[file exists /etc/cdburnerdrive ]} {
- catch {
- set fid [open /etc/cdburnerdrive r]
- gets $fid cdburnerdrive
- close $fid
- }
- }
- if {$cdburnerdrive != ""} {
- set do_set true
- catch {
- if {$::etc_fstab($cdburnerdrive) == $myhome } {
- set do_set false
- }
- }
- if {$do_set} {
- set ::etc_fstab($cdburnerdrive) $myhome
- if {$::debug} {puts "set ::etc_fstab($cdburnerdrive) = $::etc_fstab($cdburnerdrive)"}
- }
- }
- }
- }
-
- proc mounteds__get_list {} {
- if {$::debug} {puts "in mounteds__get_list"}
-
- set fs_list ""
- catch "exec mount" fs_list
- foreach line [split $fs_list '\n'] {
- set sl [remove_empties [split $line]]
- set dev [lindex $sl 0]
- set mnt [lindex $sl 2]
- if { [string compare -length 4 $dev "/dev"] == 0} {
- set ::mounteds($dev) "$mnt|[join [lrange $sl 4 end ] |]"
- if {$::debug} { puts " ::mounteds($dev) = $::mounteds($dev)"}
- }
- }
-
- # Kernel 2.6 swaps:
- # Filename Type Size Used Priority
- # /dev/hda8 partition 682720 0 -1
-
-
- catch {
- set fid [open "/proc/swaps" r]
- while {![eof $fid]} {
- gets $fid str
- set sl [remove_empties [split $str]]
- set swap [lindex $sl 0]
- if { [string compare -length 4 $swap "/dev"] == 0} {
- set ::mounteds($swap) "swap|swap|"
- if {$::debug} { puts " ::mounteds($swap) = $::mounteds($swap)"}
- }
- if { [string compare -length 11 $swap "/initrd/dev"] == 0} {
- set swap [string range $swap 7 end]
- set ::mounteds($swap) "initrdswap|initrdswap|"
- if {$::debug} { puts " ::mounteds($swap) = $::mounteds($swap)"}
- }
- }
- close $fid
- }
- }
-
-
- # dmesg example:
- # sd 6:0:0:0: Attached scsi removable disk sdb
-
-
- proc scsi_host_to_sd_location {} {
- array unset ::scsi_drvr
- array unset ::scsi_node
- set info ""
- catch { exec dmesg -s 65535 } info
- #puts " dmesg length [llength $info] "
- set lines [split $info \n]
- foreach line $lines {
- set sl [remove_empties [split $line]]
- if {[string range [lindex $sl 0] 0 3] == "scsi"} {
- set n [string range [lindex $sl 0] 4 end]
- #puts "scsi$n has driver: [lrange $sl 2 end]"
- if {[join [lrange $sl 2 end]] == "SCSI emulation for USB Mass Storage devices"} {
- set ::scsi_drvr($n) "usb_storage"
- } else {
- set ::scsi_drvr($n) [lrange $sl 2 end]
- }
- }
- if {[lindex $sl 0] == "sd"} {
- if {[lindex $sl 2] == "Attached"} {
- if {[lindex $sl 3] == "scsi"} {
- if {[lindex $sl 4] == "removable"} {
- set n [lindex [split [lindex $sl 1] :] 0]
- #puts "scsi$n == [lindex $sl 6] "
- set ::scsi_node([lindex $sl 6]) $n
- }
- if {[lindex $sl 4] == "disk"} {
- set n [lindex [split [lindex $sl 1] :] 0]
- #puts "scsi$n == [lindex $sl 5] "
- set ::scsi_node([lindex $sl 5]) $n
- }
- }
- }
- }
- }
-
- #Jun 15 03:21:33 (none) user.info kernel: scsi2 : sata_nv
- #Jun 15 03:21:33 (none) user.info kernel: scsi3 : sata_nv
- #Jun 15 03:21:33 (none) user.notice kernel: sd 2:0:0:0: Attached scsi disk sda
- #Jun 14 19:22:26 (none) user.info kernel: scsi4 : SCSI emulation for USB Mass Storage devices
- #Jun 14 19:22:26 (none) user.info kernel: scsi5 : SCSI emulation for USB Mass Storage devices
- #Jun 14 19:22:31 (none) user.notice kernel: sd 4:0:0:0: Attached scsi removable disk sdb
- #Jun 14 19:22:31 (none) user.notice kernel: sd 4:0:0:1: Attached scsi removable disk sdc
- #Jun 14 19:22:31 (none) user.notice kernel: sd 4:0:0:2: Attached scsi removable disk sdd
- #Jun 14 19:22:31 (none) user.notice kernel: sd 4:0:0:3: Attached scsi removable disk sde
- #Jun 14 19:22:31 (none) user.notice kernel: sd 5:0:0:0: Attached scsi removable disk sdf
- #Jun 14 19:22:31 (none) user.notice kernel: sd 5:0:0:1: Attached scsi removable disk sdg
- #Jun 15 03:21:33 (none) user.notice kernel: sd 2:0:0:0: Attached scsi disk sda
-
-
- set fid [open "/var/log/messages" r]
- while {![eof $fid]} {
- gets $fid str
- set sl [remove_empties [split $str]]
- if {[lindex $sl 4] == "user.info"} {
- if {[lindex $sl 5] == "kernel:"} {
- #puts "[string range [lindex $sl 6] 0 3]"
- if {[string range [lindex $sl 6] 0 3] == "scsi"} {
- set n [string range [lindex $sl 6] 4 end]
- #puts "scsi$n has driver: [lrange $sl 8 end]"
- if {[join [lrange $sl 8 end]] == "SCSI emulation for USB Mass Storage devices"} {
- set ::scsi_drvr($n) "usb_storage"
- } else {
- set ::scsi_drvr($n) [lrange $sl 8 end]
- }
- }
- }
- }
- if {[lindex $sl 6] == "sd"} {
- if {[lindex $sl 8] == "Attached"} {
- if {[lindex $sl 9] == "scsi"} {
- if {[lindex $sl 10] == "removable"} {
- set n [lindex [split [lindex $sl 7] :] 0]
- #puts "scsi$n == [lindex $sl 12] "
- set ::scsi_node([lindex $sl 12]) $n
- }
- if {[lindex $sl 10] == "disk"} {
- set n [lindex [split [lindex $sl 7] :] 0]
- #puts "scsi$n == [lindex $sl 11] "
- set ::scsi_node([lindex $sl 11]) $n
- }
- }
- }
- }
-
- }
- close $fid
- }
-
- proc scsi_or_usb_grabinfos {} {
- array unset ::scsi_N
-
- array unset scsi_ctrlr
-
- catch {
- set fid [open "/proc/scsi/scsi" r]
- set host_n ""
- set vend ""
- set modl ""
- while {![eof $fid]} {
- gets $fid str
- set sl [remove_empties [split $str]]
- if {[lindex $sl 0] == "Host:"} {
- set host_n [string map {scsi {}} [lindex $sl 1]]
- set scsi_ctrlr($host_n) "Present"
- }
- if {[lindex $sl 0] == "Vendor:"} {
- set m_at [lsearch $sl "Model:"]
- set r_at [lsearch $sl "Rev:"]
- set vend ""
- set modl ""
- if {0 != [expr $m_at-1]} {
- set vend [join [lrange $sl 1 [expr $m_at-1]]]
- }
- if {$m_at != [expr $r_at-1]} {
- set modl [join [lrange $sl [expr $m_at+1] [expr $r_at-1]]]
- }
- }
- if {[lindex $sl 0] == "Type:"} {
- set r_at [lsearch $sl "ANSI"]
- set type ""
- if {0 != [expr $m_at-1]} {
- set type [join [lrange $sl 1 [expr $r_at-1]]]
- }
- set ::scsi_N($host_n) "$vend|$modl|$type"
- if {$::debug} { puts " ::scsi_N($host_n) = $vend|$modl|$type"}
- }
- }
- close $fid
- }
-
- catch {
- foreach ctrlr [array names scsi_ctrlr] {
- set hostis "scsi"
- catch {
- if {[string match -nocase *usb* $::scsi_drvr($ctrlr)] == 1} {
- set hostis "usb"
- }
- }
- catch {
- set fid [open "/proc/scsi/usb-storage/$ctrlr" r]
- while {![eof $fid]} {
- gets $fid str
- set hostis "usb"
- }
- close $fid
- }
-
- catch {
- if {[string match -nocase *sata* $::scsi_drvr($ctrlr)] == 1} {
- set hostis "sata"
- }
- }
- set vend [lindex [split $::scsi_N($ctrlr) |] 0]
- if {$vend == "ATA"} {
- set hostis "sata"
- }
- #puts "scsi$ctrlr Host is really $hostis"
- set info $::scsi_N($ctrlr)
- set ::scsi_N($ctrlr) "$hostis|$info"
- }
- }
- }
-
-
- proc mainDeviceList__derive {} {
- set dev_list [lsort -dictionary [array names ::diskStats]]
- if {$::debug} {puts "$$ dev_list $dev_list"}
- set omit_parts "false"
- foreach dev $dev_list {
-
- if {[string match "$omit_parts*" $dev] == 1} {
- continue;
- }
- set omit_parts "false"
-
- set ds [split $::diskStats($dev) .]
- set dev_type [lindex $ds 3]
- set hw_type ""
- set fs ""
- set part ""
- set mnt ""
- set vol ""
- set hw_name ""
- set driver ""
- catch {set part [lindex $::partitions($dev) 0] }
- catch {set mnt [lindex [split $::mounteds(/dev/$dev) |] 0] }
- catch {set fs [lindex [split $::mounteds(/dev/$dev) |] 1] }
- if {$part == "extended"} { continue }
- set noscan false
- switch $dev_type {
- floppy {
- set fdinfo ""
- set hw_type "floppy"
- catch " exec $::mut/bin/fdinfo /dev/$dev" fdinfo
- if {[llength [split $fdinfo |]]>3} {
- set fdx [lindex [split $fdinfo |] 1]
- if {$fdx != 5} { set fdx 3 }
- }
- catch {
- if {$::NoScanMedia($dev)=="noscan"} { set noscan true }
- }
- }
- disk {
- set noscan true
- if {[lindex $ds 2] == "sd" } {
- set hw_type "unknown_scsidisk"
- catch {
- set ctrlr $::scsi_node($dev)
- set ctrlr_info [split $::scsi_N($ctrlr) |]
- set hw_type "[lindex $ctrlr_info 0]disk"
- set hw_name [lindex $ctrlr_info 2]
- set driver $::scsi_drvr($ctrlr)
- }
-
- #Here We check for SuperFloppy format:
- if {$part != "extended"} {
- set fsinfo ""
- catch "exec $::mut/bin/guess_fstype /dev/$dev" fsinfo
- if {$fsinfo != ""} {set fs $fsinfo}
- if {[lindex [split $fsinfo] 0] == "unknown"} {set fs ""}
- if {$fs != ""} {
- set parts 0
- set unknownparts 0
- foreach d $dev_list {
- if {[string match "$dev*" $d]==1} {
- if {$d != $dev} {
- set fsinfo ""
- catch "exec $::mut/bin/guess_fstype /dev/$d" fsinfo
- if {$fsinfo == "unknown"} { incr unknownparts }
- incr parts
- }
- }
- }
- if {$parts == $unknownparts} {
- set noscan false
- set dev_type superfloppy
- set omit_parts "$dev"
- } else {
- set fs ""
- }
- }
- }
- } else {
- if {[string range [lindex $ds 2] 0 2] == "ide" } {
- set hw_type "idedisk"
- set driver "ide-disk"
- set hw_name [scan_ide_medium [lindex $ds 2] $dev model]
- }
- }
- }
- part {
- set noscan false
- if {$fs == "" && $part != "extended"} {
- set fsinfo ""
- catch "exec $::mut/bin/guess_fstype /dev/$dev" fsinfo
- if {$fsinfo != ""} {set fs $fsinfo}
- }
- }
- cdrom {
- set cdinfo [split $::cdromMedium($dev) |]
- set ok1 "false"; set ok2 "false"
- set noscan true
-
- if {[lindex $cdinfo 7] == "Audio"} {
- if { [lindex $cdinfo 8] > 0 } {
- set fs [lindex $cdinfo 7]; set vol "Audio [lindex $cdinfo 8] tracks"
- }
- }
- if {[lindex $cdinfo 7] == "Mixed"} {
- if { [lindex $cdinfo 8] > 0 } {
- set fs [lindex $cdinfo 7]; set vol "Mixed [lindex $cdinfo 8] tracks"
- }
- }
- if {[lindex $cdinfo 7] == "Data" || [lindex $cdinfo 7] == "Mixed"} {
- if { [lindex $cdinfo 9] > 0 } {
- set fs [lindex $cdinfo 7];
- set vol [grab_fs_vol iso9660 $dev]
- }
- }
- if {[string range [lindex $ds 2] 0 2] == "ide" } {
- set hw_type "idecdrom"
- set hw_name [scan_ide_medium [lindex $ds 2] $dev model]
- set driver "ide-cdrom"
- } else {
- set hw_type "nonidecdrom"
- set driver "unknown"
- }
-
- }
- default { if {$::debug} {puts "Unknown device type $dev_type on $dev"} }
- }
- if {$fs=="" && $noscan==false && $part!="extended"} {
- set fsinfo ""
- catch "exec $::mut/bin/guess_fstype /dev/$dev" fsinfo
- if {$fsinfo != ""} {set fs $fsinfo}
- if {$fs == "unknown"} { set fs "" }
- }
-
- if {$vol=="" && $noscan==false} {
- if {$fs == "unknown"} { set fs "" }
- if {$fs == "iso9660" && $vol==""} { set vol [grab_fs_vol iso9660 $dev] }
- if {$fs == "vfat"} { set vol [grab_fs_vol vfat $dev] }
- if {$fs == "ext2"} { set vol [grab_fs_vol ext2 $dev] }
- }
- if {$dev_type == "floppy"} {
- set driver fd
- if {$noscan} {
- set part "unknown"
- } else {
- if {$part == "" && $fs!=""} {
- set part "Disc"
- } else {
- set part "No_Disc"
- }
- }
- }
-
- if {$part =="" && $fs=="" && $mnt == "" && $vol == ""} {continue}
-
- lappend ::infolist "$dev|$hw_type|$hw_name|$part|$mnt|$fs|$vol|$dev_type|$driver|"
- if {$::debug} {puts "::infolist [lindex $::infolist end]"}
- }
- }
-
- proc grab_block_devices {{quick false}} {
- majorBus__get_list
- partitions__get_list
- device_nodes__scan_for_make_additional
- diskStats__get_list quick
- cdromMedium_get_list quick
- etc_fstab__get_list
- mounteds__get_list
- scsi_host_to_sd_location
- scsi_or_usb_grabinfos
- mainDeviceList__derive
- }
-
- proc run_full_scan {} {
- array unset ::partitions
- array unset ::mounteds
-
- #scan hardware
- grab_block_devices true
-
- }
-
-
-
-
- proc Show_Devices {} {
- foreach str $::infolist {
- set info [split $str "|"]
-
- set dev [lindex $info 0]
- set physical_type [lindex $info 1]
- set hw_name [lindex $info 2]
- set part [lindex $info 3]
- set mnt [lindex $info 4]
- set fs [lindex $info 5]
- set vol [lindex $info 6]
- set dev_type [lindex $info 7]
- set driver [lindex $info 8]
-
- puts "/dev/$dev|$dev_type|$physical_type|$hw_name|$fs|$vol|$driver"
-
- }
- }
-
-
-
- ## Initialise global variables here:
-
- set Version "0.0.9b"; # Version Number
- set mut [homepath]; # Home path to app directory, Now done automatically! :-)
- set debug 0; # Choose output of debugging information, output is to stdout
- set last_hotplug 0; # USB SCSI hotplug last refresh info, for hot [un]plug scanning.
- set Kernel_Version ""
- set Program_Initialized false; # Make start quicker.
-
- # get the Kernel version.
- proc get_kv {} {
- set ::Kernel_Version "Unknown"
- catch {
- set fid [open "/proc/version" r]
- while {![eof $fid]} {
- gets $fid str
- set ::Kernel_Version "[string range [lindex [split $str] 2] 0 2]"
- break;
- }
- close $fid
- }
- }
- get_kv
-
- ## global variables used to describe attached hardware:
-
-
- array unset partitions ; # List of info from /proc/partitions
- array unset mounteds ; # List of info from /proc/mounts
- set Stack_rearrange 0 ; # Stack the window rearrange events
- array unset etc_fstab ; # save info from /etc/fstab file.
- array unset cdromMedium ; # List of info from bin/cdrominfo about cdrom drives in system
- array unset diskStats ; # info about block devices in system
- set grabdevs {fd hd sd scd sr} ; # list of device types to scan in /proc/diskstats & /proc/partitions
- set existing_nodes "" ; # Keep track of nodes that exist in /dev directory.
- array unset majorBus ; # block device info from /proc/devices
- array unset majorBusRev ; # reverse lookup of majorBus, not always best to use! heh :)
- set infolist ""; # The list of displayed devices & partitions.
-
- ## Process command line arguments, debuging flag only at this point
-
- if {$argc > 0} {
- for {set i 0} {$i < $argc} {incr i} {
- set sw [string trimleft [lindex $argv $i] "- "]
- switch $sw {
- "d" {set debug 1 ; puts "debugging on"}
- "debug" {set debug 1 ; puts "debugging on"}
- default {}
- }
- }
- }
-
- ## MUT version information
-
- if {$debug} {puts "'MUT version $::Version' on a $::Kernel_Version kernel, bugs, fixes, suggestions, email: Jesse.Liley@gmail.com"}
-
- if {$debug} {puts "Program started"}
-
- #only one output list for this program
- full_refresh_display
-
-
-