mirror of
https://github.com/iiab/iiab.git
synced 2025-03-09 15:40:17 +00:00
Merge pull request #3942 from avni/jerry
usb_lib: building on to top of @jvonau's work in #3940. Using existence of /media to determine if a USB stick is mounted or not for both count and upload location; changing tabs to spaces for upload2usb.php
This commit is contained in:
commit
14d24fda49
3 changed files with 157 additions and 138 deletions
|
@ -10,27 +10,25 @@ set_exception_handler(function (Throwable $exception) {
|
||||||
include ("error.php");
|
include ("error.php");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
//return the first removable USB drive location
|
//return the first removable USB drive location
|
||||||
function getTargetUSBDriveLocation () {
|
function getTargetUSBDriveLocation () {
|
||||||
// Get the first removal USB drive using
|
// Get the count of storage mounted at /media, and error if there is <>1 otherwise return upload path
|
||||||
// lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs |grep RM=\"1\" | grep -v MOUNTPOINT=\"\" |grep -oP '[^/]MOUNTPOINT="\K[^"]*' -m 1
|
|
||||||
// lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs |grep RM=\"1\" | grep -v MOUNTPOINT=\"\" | cut -d " " -f 4 | cut -d "=" -f 2
|
|
||||||
|
|
||||||
# error if 1<>usb sticks are installed
|
# error if 1<>usb sticks are installed
|
||||||
$rmv_usb_path_count = shell_exec('lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs |grep RM=\"1\" | grep -v MOUNTPOINT=\"\" | cut -d " " -f 4 | wc -l');
|
$rmv_usb_path_count = shell_exec('lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs | cut -d " " -f 4 | grep "^MOUNTPOINT=\"/media" | wc -l');
|
||||||
if ($rmv_usb_path_count == 0) {
|
|
||||||
throw new RuntimeException('0 USB sticks found. <br/><br/>');
|
|
||||||
} elseif ($rmv_usb_path_count > 1) {
|
|
||||||
throw new RuntimeException('More than 1 USB sticks installed. <br/><br/>');
|
|
||||||
}
|
|
||||||
|
|
||||||
$rmv_usb_path = trim(str_replace('"', '', shell_exec('lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs |grep RM=\"1\" | grep -v MOUNTPOINT=\"\" | cut -d " " -f 4 | cut -d "=" -f 2')));
|
if ($rmv_usb_path_count == 0) {
|
||||||
|
throw new RuntimeException('0 USB sticks found. <br/><br/>');
|
||||||
|
} elseif ($rmv_usb_path_count > 1) {
|
||||||
|
throw new RuntimeException('More than 1 USB sticks installed. <br/><br/>');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rmv_usb_path = trim(str_replace('"', '', shell_exec('lsblk --output NAME,TRAN,RM,MOUNTPOINT --pairs | cut -d " " -f 4 | grep "^MOUNTPOINT=\"/media" | cut -d "=" -f 2')));
|
||||||
|
|
||||||
if (empty($rmv_usb_path)) {
|
if (empty($rmv_usb_path)) {
|
||||||
throw new RuntimeException('Not able to find USB stick. <br/><br/>');
|
throw new RuntimeException('Not able to find USB stick. <br/><br/>');
|
||||||
} else {
|
} else {
|
||||||
return $rmv_usb_path . "/";
|
return $rmv_usb_path . "/";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,55 +40,55 @@ function getTargetFolderPath ($create_folder_p) {
|
||||||
$target_folder_path = $parent_dir . $today_folder_name;
|
$target_folder_path = $parent_dir . $today_folder_name;
|
||||||
|
|
||||||
if (!file_exists($target_folder_path) && $create_folder_p) {
|
if (!file_exists($target_folder_path) && $create_folder_p) {
|
||||||
mkdir($target_folder_path, 0777) or throw new RuntimeException("Not able to create upload directory. <br/>Make sure 'usb_lib_writable_sticks' is set to 'True'. <br/><br/>");
|
mkdir($target_folder_path, 0777) or throw new RuntimeException("Not able to create upload directory. <br/>Make sure 'usb_lib_writable_sticks' is set to 'True'. <br/><br/>");
|
||||||
}
|
}
|
||||||
return $target_folder_path;
|
return $target_folder_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
//return number of files within a specified folder
|
//return number of files within a specified folder
|
||||||
function getFileCount ($folder_path) {
|
function getFileCount ($folder_path) {
|
||||||
return count(glob($folder_path . "/*"));
|
return count(glob($folder_path . "/*"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//check if file mimetype is acceptable for upload
|
//check if file mimetype is acceptable for upload
|
||||||
function isFileMimeTypeAcceptable ($file) {
|
function isFileMimeTypeAcceptable ($file) {
|
||||||
$mimetype = strtolower(mime_content_type($file));
|
$mimetype = strtolower(mime_content_type($file));
|
||||||
$invalid_mimetypes_str = array ("compress", "image/svg+xml", "octet", "text/xml", "xhtml+xml");
|
$invalid_mimetypes_str = array ("compress", "image/svg+xml", "octet", "text/xml", "xhtml+xml");
|
||||||
foreach ($invalid_mimetypes_str as $invalid_mt_str) {
|
foreach ($invalid_mimetypes_str as $invalid_mt_str) {
|
||||||
if (str_contains($mimetype, $invalid_mt_str)) {
|
if (str_contains($mimetype, $invalid_mt_str)) {
|
||||||
error_log('UPLOAD2USB ERROR - MIMETYPE: ' . $mimetype);
|
error_log('UPLOAD2USB ERROR - MIMETYPE: ' . $mimetype);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//check file content to see if it's unique or not
|
//check file content to see if it's unique or not
|
||||||
function isFileContentUnique ($target_folder_path, $file) {
|
function isFileContentUnique ($target_folder_path, $file) {
|
||||||
$file_to_upload_md5 = md5_file($file);
|
$file_to_upload_md5 = md5_file($file);
|
||||||
$usb_dir = array_diff(scandir($target_folder_path), array('..', '.'));
|
$usb_dir = array_diff(scandir($target_folder_path), array('..', '.'));
|
||||||
foreach ($usb_dir as $dir_file) {
|
foreach ($usb_dir as $dir_file) {
|
||||||
$dir_file = $target_folder_path . "/" . $dir_file;
|
$dir_file = $target_folder_path . "/" . $dir_file;
|
||||||
|
|
||||||
if (!is_dir($dir_file)) {
|
if (!is_dir($dir_file)) {
|
||||||
$dir_file_md5 = md5_file($dir_file);
|
$dir_file_md5 = md5_file($dir_file);
|
||||||
if ($file_to_upload_md5 == $dir_file_md5) {
|
if ($file_to_upload_md5 == $dir_file_md5) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//return unique filename
|
//return unique filename
|
||||||
function getUniqueFileName ($target_folder_path, $filename) {
|
function getUniqueFileName ($target_folder_path, $filename) {
|
||||||
$new_filename = $filename;
|
$new_filename = $filename;
|
||||||
$counter = 1;
|
$counter = 1;
|
||||||
while (file_exists($target_folder_path . "/" . $new_filename)) {
|
while (file_exists($target_folder_path . "/" . $new_filename)) {
|
||||||
$counter++;
|
$counter++;
|
||||||
$new_filename = pathinfo($filename,8) . '-'. $counter . "." . pathinfo($filename,4);
|
$new_filename = pathinfo($filename,8) . '-'. $counter . "." . pathinfo($filename,4);
|
||||||
}
|
}
|
||||||
return $new_filename;
|
return $new_filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check file size - we are not going to check file size for now.
|
// Check file size - we are not going to check file size for now.
|
||||||
|
@ -100,5 +98,4 @@ function getUniqueFileName ($target_folder_path, $filename) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
# PARTICULAR PURPOSE.
|
# PARTICULAR PURPOSE.
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/usb_lib/files/usbmount/copyright
|
# https://github.com/iiab/iiab/blob/master/roles/usb_lib/files/usbmount/copyright
|
||||||
# https://github.com/rbrito/usbmount/blob/master/debian/copyright
|
# https://github.com/rbrito/usbmount/blob/master/debian/copyright
|
||||||
set -e
|
#set -e
|
||||||
exec > /dev/null 2>&1
|
exec > /dev/null 2>&1
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
@ -96,114 +96,136 @@ if [ "$1" = add ]; then
|
||||||
USAGE=$(echo "$DEVINFO" | sed 's/.*[[:blank:]]USAGE="\([^"]*\)".*/\1/g; s/[[:blank:]]*//g;')
|
USAGE=$(echo "$DEVINFO" | sed 's/.*[[:blank:]]USAGE="\([^"]*\)".*/\1/g; s/[[:blank:]]*//g;')
|
||||||
|
|
||||||
if ! echo $USAGE | egrep -q "(filesystem|disklabel)"; then
|
if ! echo $USAGE | egrep -q "(filesystem|disklabel)"; then
|
||||||
log info "$DEVNAME does not contain a filesystem or disklabel"
|
log debug "/$DEVNAME does not contain a filesystem or disklabel"
|
||||||
exit
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Try to use specifications in /etc/fstab first.
|
log debug "/$DEVNAME contains filesystem type $FSTYPE"
|
||||||
|
BOOTFW_DEV=$(/usr/bin/findmnt -no source /boot/firmware)
|
||||||
|
log debug "BOOTFW_DEV $BOOTFW_DEV"
|
||||||
|
ROOT_DEV=$(/usr/bin/findmnt -no source /)
|
||||||
|
log debug "ROOT_DEV $ROOT_DEV"
|
||||||
|
BOOT_DEV=$(/usr/bin/findmnt -no source /boot)
|
||||||
|
log debug "BOOT_DEV $BOOT_DEV"
|
||||||
|
|
||||||
|
if [ $BOOTFW_DEV = /$DEVNAME ]; then
|
||||||
|
log debug "skipping BOOTFS_DEV $BOOTFS_DEV mounted at /boot/firmware"
|
||||||
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
|
elif [ $ROOT_DEV = /$DEVNAME ]; then
|
||||||
|
log debug "skipping ROOT_DEV $ROOT_DEV mounted at /"
|
||||||
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
|
elif [ $BOOT_DEV = /$DEVNAME ]; then
|
||||||
|
log debug "skipping BOOT_DEV $BOOT_DEV mount as /boot"
|
||||||
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try to use specifications in /etc/fstab to skip.
|
||||||
if egrep -q "^[[:blank:]]*$DEVNAME" /etc/fstab; then
|
if egrep -q "^[[:blank:]]*$DEVNAME" /etc/fstab; then
|
||||||
log info "executing command: mount $DEVNAME"
|
log debug "skipping /$DEVNAME exit"
|
||||||
mount $DEVNAME || log err "mount by DEVNAME with $DEVNAME wasn't successful; return code $?"
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
elif grep -q "^[[:blank:]]*UUID=$UUID" /etc/fstab; then
|
elif grep -q "^[[:blank:]]*UUID=$UUID" /etc/fstab; then
|
||||||
log info "executing command: mount -U $UUID"
|
log debug "skipping $UUID"
|
||||||
mount -U $UUID || log err "mount by UUID with $UUID wasn't successful; return code $?"
|
lockfile-remove /var/run/usbmount/.mount
|
||||||
|
exit
|
||||||
else
|
else
|
||||||
log debug "$DEVNAME contains filesystem type $FSTYPE"
|
log debug "/$DEVNAME contains filesystem type $FSTYPE"
|
||||||
|
fstype=$FSTYPE
|
||||||
|
# Test if the filesystem type is in the list of filesystem
|
||||||
|
# types to mount.
|
||||||
|
if in_list "$fstype" "$FILESYSTEMS"; then
|
||||||
|
# Search an available mountpoint.
|
||||||
|
for v in $MOUNTPOINTS; do
|
||||||
|
if [ -d "$v" ] && ! grep -q "^[^ ][^ ]* *$v " /proc/mounts; then
|
||||||
|
mountpoint="$v"
|
||||||
|
log debug "mountpoint $mountpoint is available for /$DEVNAME"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -n "$mountpoint" ]; then
|
||||||
|
# Determine mount options.
|
||||||
|
options=
|
||||||
|
for v in $FS_MOUNTOPTIONS; do
|
||||||
|
if expr "$v" : "-fstype=$fstype,."; then
|
||||||
|
options="$(echo "$v" | sed 's/^[^,]*,//')"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -n "$MOUNTOPTIONS" ]; then
|
||||||
|
options="$MOUNTOPTIONS${options:+,$options}"
|
||||||
|
fi
|
||||||
|
|
||||||
fstype=$FSTYPE
|
# Mount the filesystem.
|
||||||
# Test if the filesystem type is in the list of filesystem
|
log info "executing command: mount -t$fstype ${options:+-o$options} $DEVNAME $mountpoint"
|
||||||
# types to mount.
|
mount "-t$fstype" "${options:+-o$options}" "$DEVNAME" "$mountpoint"
|
||||||
if in_list "$fstype" "$FILESYSTEMS"; then
|
|
||||||
# Search an available mountpoint.
|
|
||||||
for v in $MOUNTPOINTS; do
|
|
||||||
if [ -d "$v" ] && ! grep -q "^[^ ][^ ]* *$v " /proc/mounts; then
|
|
||||||
mountpoint="$v"
|
|
||||||
log debug "mountpoint $mountpoint is available for $DEVNAME"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -n "$mountpoint" ]; then
|
|
||||||
# Determine mount options.
|
|
||||||
options=
|
|
||||||
for v in $FS_MOUNTOPTIONS; do
|
|
||||||
if expr "$v" : "-fstype=$fstype,."; then
|
|
||||||
options="$(echo "$v" | sed 's/^[^,]*,//')"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -n "$MOUNTOPTIONS" ]; then
|
|
||||||
options="$MOUNTOPTIONS${options:+,$options}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Mount the filesystem.
|
# Determine vendor and model.
|
||||||
log info "executing command: mount -t$fstype ${options:+-o$options} $DEVNAME $mountpoint"
|
vendor=
|
||||||
mount "-t$fstype" "${options:+-o$options}" "$DEVNAME" "$mountpoint"
|
if [ -r "/sys$DEVPATH/device/vendor" ]; then
|
||||||
|
vendor="`cat \"/sys$DEVPATH/device/vendor\"`"
|
||||||
|
elif [ -r "/sys$DEVPATH/../device/vendor" ]; then
|
||||||
|
vendor="`cat \"/sys$DEVPATH/../device/vendor\"`"
|
||||||
|
elif [ -r "/sys$DEVPATH/device/../manufacturer" ]; then
|
||||||
|
vendor="`cat \"/sys$DEVPATH/device/../manufacturer\"`"
|
||||||
|
elif [ -r "/sys$DEVPATH/../device/../manufacturer" ]; then
|
||||||
|
vendor="`cat \"/sys$DEVPATH/../device/../manufacturer\"`"
|
||||||
|
fi
|
||||||
|
vendor="$(echo "$vendor" | sed 's/^[[:blank:]]\+//; s/[[:blank:]]\+$//')"
|
||||||
|
|
||||||
# Determine vendor and model.
|
model=
|
||||||
vendor=
|
if [ -r "/sys$DEVPATH/device/model" ]; then
|
||||||
if [ -r "/sys$DEVPATH/device/vendor" ]; then
|
model="`cat \"/sys$DEVPATH/device/model\"`"
|
||||||
vendor="`cat \"/sys$DEVPATH/device/vendor\"`"
|
elif [ -r "/sys$DEVPATH/../device/model" ]; then
|
||||||
elif [ -r "/sys$DEVPATH/../device/vendor" ]; then
|
model="`cat \"/sys$DEVPATH/../device/model\"`"
|
||||||
vendor="`cat \"/sys$DEVPATH/../device/vendor\"`"
|
elif [ -r "/sys$DEVPATH/device/../product" ]; then
|
||||||
elif [ -r "/sys$DEVPATH/device/../manufacturer" ]; then
|
model="`cat \"/sys$DEVPATH/device/../product\"`"
|
||||||
vendor="`cat \"/sys$DEVPATH/device/../manufacturer\"`"
|
elif [ -r "/sys$DEVPATH/../device/../product" ]; then
|
||||||
elif [ -r "/sys$DEVPATH/../device/../manufacturer" ]; then
|
model="`cat \"/sys$DEVPATH/../device/../product\"`"
|
||||||
vendor="`cat \"/sys$DEVPATH/../device/../manufacturer\"`"
|
fi
|
||||||
fi
|
model="$(echo "$model" | sed 's/^[[:blank:]]\+//; s/[[:blank:]]\+$//')"
|
||||||
vendor="$(echo "$vendor" | sed 's/^[[:blank:]]\+//; s/[[:blank:]]\+$//')"
|
|
||||||
|
|
||||||
model=
|
# Run hook scripts; ignore errors.
|
||||||
if [ -r "/sys$DEVPATH/device/model" ]; then
|
export UM_DEVICE="$DEVNAME"
|
||||||
model="`cat \"/sys$DEVPATH/device/model\"`"
|
export UM_MOUNTPOINT="$mountpoint"
|
||||||
elif [ -r "/sys$DEVPATH/../device/model" ]; then
|
export UM_FILESYSTEM="$fstype"
|
||||||
model="`cat \"/sys$DEVPATH/../device/model\"`"
|
export UM_MOUNTOPTIONS="$options"
|
||||||
elif [ -r "/sys$DEVPATH/device/../product" ]; then
|
export UM_VENDOR="$vendor"
|
||||||
model="`cat \"/sys$DEVPATH/device/../product\"`"
|
export UM_MODEL="$model"
|
||||||
elif [ -r "/sys$DEVPATH/../device/../product" ]; then
|
log info "executing command: run-parts /etc/usbmount/mount.d"
|
||||||
model="`cat \"/sys$DEVPATH/../device/../product\"`"
|
run-parts /etc/usbmount/mount.d || :
|
||||||
fi
|
else
|
||||||
model="$(echo "$model" | sed 's/^[[:blank:]]\+//; s/[[:blank:]]\+$//')"
|
# No suitable mount point found.
|
||||||
|
log warning "no mountpoint found for $DEVNAME"
|
||||||
# Run hook scripts; ignore errors.
|
exit 1
|
||||||
export UM_DEVICE="$DEVNAME"
|
fi
|
||||||
export UM_MOUNTPOINT="$mountpoint"
|
|
||||||
export UM_FILESYSTEM="$fstype"
|
|
||||||
export UM_MOUNTOPTIONS="$options"
|
|
||||||
export UM_VENDOR="$vendor"
|
|
||||||
export UM_MODEL="$model"
|
|
||||||
log info "executing command: run-parts /etc/usbmount/mount.d"
|
|
||||||
run-parts /etc/usbmount/mount.d || :
|
|
||||||
else
|
|
||||||
# No suitable mount point found.
|
|
||||||
log warning "no mountpoint found for $DEVNAME"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
elif [ "$1" = remove ]; then
|
elif [ "$1" = remove ]; then
|
||||||
|
|
||||||
# A block or partition device has been removed.
|
# A block or partition device has been removed.
|
||||||
# Test if it is mounted.
|
# Test if it is mounted.
|
||||||
while read device mountpoint fstype remainder; do
|
while read device mountpoint fstype remainder; do
|
||||||
if [ "$DEVNAME" = "$device" ]; then
|
if [ "$DEVNAME" = "$device" ]; then
|
||||||
# If the mountpoint and filesystem type are maintained by
|
# If the mountpoint and filesystem type are maintained by
|
||||||
# this script, unmount the filesystem.
|
# this script, unmount the filesystem.
|
||||||
if in_list "$mountpoint" "$MOUNTPOINTS" &&
|
if in_list "$mountpoint" "$MOUNTPOINTS" &&
|
||||||
in_list "$fstype" "$FILESYSTEMS"; then
|
in_list "$fstype" "$FILESYSTEMS"; then
|
||||||
log info "executing command: umount -l $mountpoint"
|
log info "executing command: umount -l $mountpoint"
|
||||||
umount -l "$mountpoint"
|
umount -l "$mountpoint"
|
||||||
|
|
||||||
# Run hook scripts; ignore errors.
|
# Run hook scripts; ignore errors.
|
||||||
export UM_DEVICE="$DEVNAME"
|
export UM_DEVICE="$DEVNAME"
|
||||||
export UM_MOUNTPOINT="$mountpoint"
|
export UM_MOUNTPOINT="$mountpoint"
|
||||||
export UM_FILESYSTEM="$fstype"
|
export UM_FILESYSTEM="$fstype"
|
||||||
log info "executing command: run-parts /etc/usbmount/umount.d"
|
log info "executing command: run-parts /etc/usbmount/umount.d"
|
||||||
run-parts /etc/usbmount/umount.d || :
|
run-parts /etc/usbmount/umount.d || :
|
||||||
fi
|
fi
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done < /proc/mounts
|
done < /proc/mounts
|
||||||
else
|
else
|
||||||
log err "unexpected: action '$1'"
|
log err "unexpected: action '$1'"
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
# deb: "{{ iiab_download_url }}/usbmount_0.0.22_all.deb"
|
# deb: "{{ iiab_download_url }}/usbmount_0.0.22_all.deb"
|
||||||
# # when: is_debian
|
# # when: is_debian
|
||||||
|
|
||||||
- name: Install lockfile-progs and util-linux for usbmount from OS repo
|
- name: Install lockfile-progs and util-linux (findmnt blkid) for usbmount from OS repo
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
- lockfile-progs
|
- lockfile-progs
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue