Differences
This shows you the differences between two versions of the page.
developer:mounting_attached_backup_devices [2018/10/18 23:59] admin [USB Device Support Tools] |
developer:mounting_attached_backup_devices [2019/10/23 00:42] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Mounting Attached Devices ====== | ||
- | This page is dedicated to the development of systems to mount attached devices. The hope is that this page will result in a variety of tools which will be able to assist pre and post action scripts. | ||
- | |||
- | ===== Related Links ===== | ||
- | * [[:Pre and Post Actions]] (information related to the pre and post action script system of LBackup) | ||
- | * [[developer:Pre and Post Action Tools]] (Developer Link) | ||
- | * [[http://www.macosxhints.com/article.php?story=20060930150059172|Prevent partitions from automatically mounting]] (Mac OS X) | ||
- | \\ \\ | ||
- | |||
- | /** | ||
- | * [[http://connect.homeunix.com/unicode/?p=139|Prevent partitions from automatically mounting]] (Mac OS X) | ||
- | */ | ||
- | |||
- | ===== Support for Mac OS X Devices ===== | ||
- | \\ \\ | ||
- | |||
- | ==== USB Device Support Tools ==== | ||
- | |||
- | The script below supports mounting attached USB devices by name volume name. There is support for FireWire devices and non-removable drives commented out. This code should work. The script requires improvements in various areas. Improvements are welcomed [[http://www.lucidsystems.org/contact|via email]]. | ||
- | \\ \\ | ||
- | The script below is a work in progress. Even though it works it is certainly not an ideal solution. | ||
- | \\ \\ | ||
- | <file> | ||
- | |||
- | #!/usr/bin/env ruby | ||
- | # | ||
- | # (C)2009 Henri Shustak | ||
- | # Released Under the GNU GPL | ||
- | # Lucid Information Systems | ||
- | # http://www.lucidsystems.org | ||
- | # | ||
- | # WARNING : This code is quite speggitfied. Assistance with tiding up it would be great. | ||
- | # | ||
- | # This is a script to detect attached but unmounted volumes by Volume name and mount them. | ||
- | # Tested on the following versions of Mac OS X : | ||
- | # - 10.12.6 intel | ||
- | # | ||
- | # | ||
- | # | ||
- | # Knowen Issues : - If you rename the disk then somtimes the partition will not be detected. | ||
- | # If this happens re-partition the disk and try again. | ||
- | # | ||
- | # Version 0.3.2 | ||
- | # | ||
- | # | ||
- | # Version History | ||
- | # 0.3.2 - Added support for USB-Hubs and macOS 10.12.6 - made it a bit messy | ||
- | # | ||
- | # Note : Using a (list of) UUID('s) is generally a good approach to mounting devices. | ||
- | # That is not how this script works. This script mounts volumes via the volume name. | ||
- | # This approach allows you to add additional devices into a rotation set without | ||
- | # altering this script or the way you call this script. However, it is extremely | ||
- | # important to be aware of the potential problems which may arise by using the | ||
- | # volume name to mount a device before you use this script in any kind | ||
- | # of production setting. | ||
- | # | ||
- | |||
- | |||
- | # Check we are running on Mac OS X | ||
- | os_kind = `uname` | ||
- | if os_kind.chomp != "Darwin" | ||
- | puts "This script is designed to run on darwin." | ||
- | exit -1 | ||
- | end | ||
- | |||
- | # Load system profile data | ||
- | # | ||
- | # Note : it would be better to use xml - | ||
- | # anyone care to make this work | ||
- | # with the built in RUBy XML system. | ||
- | # It requires parsing a Mac OS X .plist | ||
- | # Assistance with this is greatly appreciated. | ||
- | # | ||
- | |||
- | |||
- | # List of detachable drives | ||
- | disks = [] | ||
- | |||
- | # Build a list of detachable USB drives. | ||
- | system_profiler_output = `system_profiler SPUSBDataType | grep -A 1 "Removable Media: Yes" | grep "BSD Name" | sed 's/^ *//g'` | ||
- | |||
- | # Add detachable FireWire drives to the list | ||
- | #system_profiler_output = system_profiler_output + `system_profiler SPFireWireDataType` | ||
- | |||
- | # Add ATA drives to the list. | ||
- | #system_profiler_output = system_profiler_output + `system_profiler SPParallelATADataType` | ||
- | |||
- | # Add SATA dirves to the list | ||
- | #system_profiler_output = system_profiler_output + `system_profiler SPSerialATADataType` | ||
- | |||
- | device = system_profiler_output.split("BSD Name: ") | ||
- | device.each { |d| | ||
- | if d.to_s.include? "disk" | ||
- | disks << "/dev/" + d | ||
- | end | ||
- | } | ||
- | |||
- | |||
- | |||
- | # Generate a hash of all devices to Volumes names. Disks without volume names will be set to nil | ||
- | # | ||
- | # Note : Any suggestions on how to improve this are greatly welcomed. | ||
- | # | ||
- | $disk_hash = {} | ||
- | disks.each { |d| | ||
- | diskcom = "diskutil list #{d}" | ||
- | partitions_list = `#{diskcom}` | ||
- | partitions_list = `echo "#{partitions_list}" | grep -e "disk*[0-9]s*[0-9]" | awk '{print $NF}'` | ||
- | partitions = partitions_list.split("\n") | ||
- | partitions.each { |p| | ||
- | major_system_version=`uname -v | awk -F "Version " '{print $2}' | awk -F "." '{print $1}'` | ||
- | if major_system_version.to_i < 9 | ||
- | # 10.4 or earlier | ||
- | volume_name = `diskutil info #{p.chomp} | grep "Volume Name:" | awk -F "Volume Name: " '{print $2}'` | ||
- | else | ||
- | # 10.5 or later | ||
- | volume_name = `diskutil info -plist #{p.chomp} | grep -A 1 "<key>VolumeName</key>" | tail -n 1 | awk -F "<string>" '{print $2}' | awk -F "</string>" '{print $1}'` | ||
- | end | ||
- | if volume_name.chomp.to_s.empty? | ||
- | new_partition = {"#{p.chomp}" => nil} | ||
- | else | ||
- | new_partition = {"#{p.chomp}" => "#{volume_name.chomp}"} | ||
- | end | ||
- | $disk_hash = $disk_hash.merge(new_partition) | ||
- | } | ||
- | } | ||
- | |||
- | |||
- | # Find the device from the volume name (global varible) | ||
- | def get_device | ||
- | if $disk_hash.has_value? $volume_name_to_mount | ||
- | device_to_mount = $disk_hash.key $volume_name_to_mount.to_s | ||
- | return device_to_mount | ||
- | else | ||
- | puts "Volume is not available." | ||
- | return nil | ||
- | end | ||
- | end | ||
- | |||
- | # check if the device is mounted | ||
- | def is_device_mounted (device_to_mount) | ||
- | # find the first disk containing a volume with a matching name | ||
- | mount_point = `diskutil info -plist #{device_to_mount[0]} | grep -A 1 -i MountPoint | tail -1 | awk -F "<string>" '{print $2}' | awk -F "</string>" '{print $1}'` | ||
- | if mount_point.chomp == "" then | ||
- | return false | ||
- | else | ||
- | return true | ||
- | end | ||
- | end | ||
- | |||
- | |||
- | # mount the device | ||
- | def mount_first_volume_with_name | ||
- | device_to_mount = get_device | ||
- | if device_to_mount != nil | ||
- | if ( (is_device_mounted(device_to_mount)) == false ) | ||
- | device_mounted = `diskutil mount #{device_to_mount} 1>/dev/null 2>&1>/dev/null` | ||
- | if device_mounted.to_i == 0 | ||
- | # puts "device already mounted." | ||
- | return 0 | ||
- | else | ||
- | return -1 | ||
- | end | ||
- | end | ||
- | else | ||
- | return -1 | ||
- | end | ||
- | end | ||
- | |||
- | # Pull the name of the volume to mount from the command line | ||
- | if ARGV.length == 1 | ||
- | name_of_volume_to_mount = ARGV[0].to_s.chomp | ||
- | else | ||
- | puts "Usage : /path/to/script/ \"<volume_name>\"" | ||
- | exit -1 | ||
- | end | ||
- | |||
- | # Tell this system to mount the disk | ||
- | $volume_name_to_mount=name_of_volume_to_mount | ||
- | result = mount_first_volume_with_name | ||
- | exit result | ||
- | |||
- | |||
- | </file> |