From 6b3f0559ba4fcfc169f0f1bca77103ef5ee65434 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 11 Apr 2021 17:14:30 +0100 Subject: dmount - udisks+mount --- bin/dmount | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 bin/dmount diff --git a/bin/dmount b/bin/dmount new file mode 100755 index 0000000..457e189 --- /dev/null +++ b/bin/dmount @@ -0,0 +1,65 @@ +#!/usr/bin/env perl +use v5.24; +use strict; +use warnings; +use File::Basename; +use Try::Tiny; +use List::Util 'uniq'; +use Net::DBus; + +my $bus = Net::DBus->system(); +my $srv = $bus->get_service('org.freedesktop.UDisks2'); +my $ud = $srv->get_object('/org/freedesktop/UDisks2/Manager'); + +sub filter_dev { + my ($device_path) = @_; + + my $dev = $srv->get_object($device_path); + return unless $dev->_net_dbus_introspector->has_interface('org.freedesktop.UDisks2.Filesystem'); + my $ignore = try { $dev->HintIgnore } catch { 1 }; + return if $ignore; + return $dev; +} + +sub list { + return map { $_->IdLabel || $_->IdUUID } + map { filter_dev($_) } + @{$ud->GetBlockDevices({})}; +} + +sub mount { + my ($name) = @_; + + my @devs = map { filter_dev($_) } uniq( + @{$ud->ResolveDevice({label=>$name},{})}, + @{$ud->ResolveDevice({uuid=>$name},{})}, + ); + die "No device matching '$name'\n" unless @devs; + + $_->Mount({}) for @devs; +} + +my $cmd = basename($0); +if (!@ARGV) { + warn <<"EOF"; +$cmd # mount +$cmd --list # list names +$cmd --bashcomp # print completion code +EOF + exit 1; +} +elsif ($ARGV[0] eq '--list') { + say for list(); +} +elsif ($ARGV[0] eq '--bashcomp') { + print <<"EOF"; +_dmount_list() { + COMPREPLY=( \$($cmd --list) ) +} + +complete -F _dmount_list $cmd +EOF +} +else { + mount($ARGV[0]); +} -- cgit v1.2.3