summaryrefslogtreecommitdiff
path: root/bin/dmount
blob: 457e189b6f245ac7c2e5f4923656cd59762ae57c (plain)
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
#!/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 <name>       # 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]);
}