From 35aa0bb51b9dc7aa5c47facd7bdb4cde055ddfcb Mon Sep 17 00:00:00 2001 From: Gianni Ceccarelli Date: Tue, 25 Apr 2017 17:00:03 +0100 Subject: made it use UDisks2 instead of the old UDisks --- hal-automounter.pl | 65 +++++++++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 40 deletions(-) diff --git a/hal-automounter.pl b/hal-automounter.pl index f5a373d..55a49ea 100755 --- a/hal-automounter.pl +++ b/hal-automounter.pl @@ -84,9 +84,6 @@ sub remove_from_fstab { } } -my $bus=Net::DBus->system(); -my $udisks=$bus->get_service('org.freedesktop.UDisks'); - my %mounted; sub sanitize { @@ -98,28 +95,30 @@ sub sanitize { return $path; } -sub safe_get_property { - my ($dev,$prop)=@_; +sub str_from_bytearray { + my ($aref) = @_; + + return $aref unless ref($aref); - local $@; - return eval { $dev->$prop }; + return pack 'C*',@{$aref||[]}; } sub device_added { - my ($node,$dev) = @_; + my ($node,$interfaces_and_properties) = @_; - $dev ||= $udisks->get_object($node,'org.freedesktop.UDisks.Device'); + p @_; - return unless safe_get_property($dev,'IdUsage') eq 'filesystem'; - #return unless safe_get_property($dev,'DeviceIsRemovable'); - return unless safe_get_property($dev,'DeviceIsMediaAvailable'); - return if safe_get_property($dev,'DeviceIsMounted'); + my $fs = $interfaces_and_properties->{'org.freedesktop.UDisks2.Filesystem'}; + return unless $fs; + return if @{ $fs->{MountPoints} || [] }; # mounted already return if exists $mounted{$node}; - my $uuid=safe_get_property($dev,'IdUuid'); - my $dev_path=safe_get_property($dev,'DeviceFile') - ||($uuid?'/dev/disk/by-uuid/'.$uuid:undef) + my $block = $interfaces_and_properties->{'org.freedesktop.UDisks2.Block'}; + + my $uuid = str_from_bytearray($block->{IdUuid}); + my $dev_path= str_from_bytearray($block->{Device}) + || ($uuid?'/dev/disk/by-uuid/'.$uuid:undef) || 'unknown'; if ($dev_path eq 'unknown') { @@ -127,8 +126,8 @@ sub device_added { return; } - my $label=safe_get_property($dev,'IdLabel'); - my $fstype=safe_get_property($dev,'IdType'); + my $label = str_from_bytearray($block->{IdLabel}); + my $fstype = str_from_bytearray($block->{IdType}); return unless defined $fstype; @@ -152,7 +151,7 @@ sub device_added { } sub device_removed { - my ($node,$dev) = @_; + my ($node,$interfaces) = @_; if (exists $mounted{$node}) { system('umount',$mounted{$node}); @@ -164,28 +163,14 @@ sub device_removed { return; } -sub device_changed { - my ($node) = @_; - - my $dev=$udisks->get_object($node,'org.freedesktop.UDisks.Device'); - my $has_media = safe_get_property($dev,'DeviceIsMediaAvailable'); - - if ($has_media) { - device_added($node,$dev); - } - else { - device_removed($node,$dev); - } -} - my $reactor=Net::DBus::Reactor->main(); -my $manager = $udisks->get_object('/org/freedesktop/UDisks', - 'org.freedesktop.UDisks'); +my $bus=Net::DBus->system(); +my $udisks=$bus->get_service('org.freedesktop.UDisks2'); +my $manager = $udisks->get_object('/org/freedesktop/UDisks2'); -$manager->connect_to_signal('DeviceAdded',\&device_added); -$manager->connect_to_signal('DeviceChanged',\&device_changed); -$manager->connect_to_signal('DeviceRemoved',\&device_removed); +$manager->connect_to_signal('InterfacesAdded',\&device_added); +$manager->connect_to_signal('InterfacesRemoved',\&device_removed); $reactor->run(); @@ -193,7 +178,7 @@ __END__ =head1 NAME -hal-automounter - a simple UDisks-DBUS client that creates fstab entries for hot-plugged volumes +hal-automounter - a simple UDisks2-DBUS client that creates fstab entries for hot-plugged volumes =head1 SYNOPSIS @@ -205,7 +190,7 @@ Gianni Ceccarelli =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2012 by Gianni Ceccarelli. +This software is copyright (c) 2012-2017 by Gianni Ceccarelli. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as -- cgit v1.2.3