11 changed files with 208 additions and 0 deletions
			
			
		@ -0,0 +1,5 @@ | 
				
			|||||
 | 
					# Rule for DVD disk insertion | 
				
			||||
 | 
					#ACTION=="change", SUBSYSTEM=="block", KERNEL=="sr[0-9]*", ENV{ID_CDROM_MEDIA}=="1", RUN+="/usr/bin/sudo /usr/local/bin/dvd-storage-action add %E{DEVNAME}" | 
				
			||||
 | 
					# Rule for DVD disk removal | 
				
			||||
 | 
					#ACTION=="change", SUBSYSTEM=="block", KERNEL=="sr[0-9]*", ENV{ID_CDROM_MEDIA}!="1", RUN+="/usr/bin/sudo /usr/local/bin/dvd-storage-action remove %E{DEVNAME}" | 
				
			||||
 | 
					ACTION=="change", SUBSYSTEM=="block", KERNEL=="sr[0-9]*", ENV{ID_CDROM}=="1", RUN+="/usr/bin/sudo /usr/local/bin/dvd-storage-action %E{ACTION} %E{DEVNAME}" | 
				
			||||
@ -0,0 +1,4 @@ | 
				
			|||||
 | 
					# Rule for USB device connection | 
				
			||||
 | 
					ACTION=="add", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", ENV{ID_FS_USAGE}=="filesystem", RUN+="/usr/bin/sudo /usr/local/bin/usb-storage-action add %E{DEVNAME}" | 
				
			||||
 | 
					# Rule for USB device disconnection | 
				
			||||
 | 
					ACTION=="remove", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", ENV{ID_FS_USAGE}=="filesystem", RUN+="/usr/bin/sudo /usr/local/bin/usb-storage-action remove %E{DEVNAME}" | 
				
			||||
@ -0,0 +1,3 @@ | 
				
			|||||
 | 
					#!/bin/bash | 
				
			||||
 | 
					# Your script logic here | 
				
			||||
 | 
					echo "Connection received on Unix socket" >> /var/log/exampleDvd.log | 
				
			||||
@ -0,0 +1,10 @@ | 
				
			|||||
 | 
					[Unit] | 
				
			||||
 | 
					Description=Example Service for Unix Socket | 
				
			||||
 | 
					After=network.target | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Service] | 
				
			||||
 | 
					ExecStart=/usr/local/bin/addDvdScript.sh | 
				
			||||
 | 
					StandardInput=socket | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Install] | 
				
			||||
 | 
					WantedBy=multi-user.target | 
				
			||||
@ -0,0 +1,9 @@ | 
				
			|||||
 | 
					[Unit] | 
				
			||||
 | 
					Description=Example Unix Socket | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Socket] | 
				
			||||
 | 
					ListenStream=/tmp/dvd-Sono-Socket.socket | 
				
			||||
 | 
					Accept=false | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Install] | 
				
			||||
 | 
					WantedBy=sockets.target | 
				
			||||
@ -0,0 +1,93 @@ | 
				
			|||||
 | 
					#!/bin/bash | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					ACTION=$1 | 
				
			||||
 | 
					DEVNAME=$2 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					SOCKET_PATH="/tmp/usb-Sono-Socket.socket" | 
				
			||||
 | 
					LOG_FILE="/tmp/tmpDvd.log" | 
				
			||||
 | 
					DEBOUNCE_FILE="/tmp/dvd_debounce_$(echo $DEVNAME | tr '/' '-')" | 
				
			||||
 | 
					DEBOUNCE_TIME=10  # seconds | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					current_time=$(date +%s) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# Function to log messages | 
				
			||||
 | 
					log_message() { | 
				
			||||
 | 
					    local message=$1 | 
				
			||||
 | 
					    echo $message | socat - UNIX-CONNECT:$SOCKET_PATH | 
				
			||||
 | 
					    echo $message >> $LOG_FILE | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# Function to get the size of the DVD | 
				
			||||
 | 
					get_dvd_size() { | 
				
			||||
 | 
					    udisksctl info -b $DEVNAME | grep 'Size:' | awk '{print $2}' | head -n 1 | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# Function to check for debounce | 
				
			||||
 | 
					check_debounce() { | 
				
			||||
 | 
					    SIZE=$(get_dvd_size) | 
				
			||||
 | 
					    if [SIZE -eq 0]; then | 
				
			||||
 | 
					        ATTEMPTS=3 | 
				
			||||
 | 
					        while [ "$SIZE" -eq 0 ] && [ $ATTEMPTS -gt 0 ]; do | 
				
			||||
 | 
					            sleep 2 | 
				
			||||
 | 
					            SIZE=$(get_dvd_size) | 
				
			||||
 | 
					            log_message "Debounced: Retried size of $DEVNAME is $SIZE" | 
				
			||||
 | 
					            ATTEMPTS=$((ATTEMPTS - 1)) | 
				
			||||
 | 
					        done | 
				
			||||
 | 
					    elif [SIZE -eq 0]; then | 
				
			||||
 | 
					        log_message "exit on: Retried size of $DEVNAME is $SIZE" | 
				
			||||
 | 
					        exit 0 | 
				
			||||
 | 
					    fi | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    if [ -f "$DEBOUNCE_FILE" ]; then | 
				
			||||
 | 
					        last_run_time=$(cat $DEBOUNCE_FILE) | 
				
			||||
 | 
					        elapsed_time=$((current_time - last_run_time)) | 
				
			||||
 | 
					        if [ $elapsed_time -lt $DEBOUNCE_TIME ]; then | 
				
			||||
 | 
					            log_message "Debounced: $ACTION $DEVNAME" | 
				
			||||
 | 
					            exit 0 | 
				
			||||
 | 
					        fi | 
				
			||||
 | 
					    fi | 
				
			||||
 | 
					    echo $current_time > $DEBOUNCE_FILE | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					check_debounce | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					if [ "$ACTION" == "change" ]; then | 
				
			||||
 | 
					    # Introduce a delay before checking the device | 
				
			||||
 | 
					    sleep 2  # Wait for 2 seconds before proceeding | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    # Check if the device is already mounted | 
				
			||||
 | 
					    MOUNTED=$(lsblk -o MOUNTPOINT -nr $DEVNAME) | 
				
			||||
 | 
					    if [ -z "$MOUNTED" ]; then | 
				
			||||
 | 
					        # Device is not mounted, check if it is a raw DVD | 
				
			||||
 | 
					        SIZE=$(get_dvd_size) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        # Debug output for size | 
				
			||||
 | 
					        log_message "DEBUG: Initial size of $DEVNAME is $SIZE" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        # Retry logic for getting the size | 
				
			||||
 | 
					        ATTEMPTS=3 | 
				
			||||
 | 
					        while [ "$SIZE" -eq 0 ] && [ $ATTEMPTS -gt 0 ]; do | 
				
			||||
 | 
					            sleep 2 | 
				
			||||
 | 
					            SIZE=$(get_dvd_size) | 
				
			||||
 | 
					            log_message "DEBUG: Retried size of $DEVNAME is $SIZE" | 
				
			||||
 | 
					            ATTEMPTS=$((ATTEMPTS - 1)) | 
				
			||||
 | 
					        done | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if [ "$SIZE" -gt 0 ]; then | 
				
			||||
 | 
					            log_message "success insert raw DVD $DEVNAME" | 
				
			||||
 | 
					        else | 
				
			||||
 | 
					            # Proceed to mount the device | 
				
			||||
 | 
					            udisksctl mount -b $DEVNAME | 
				
			||||
 | 
					            if [ $? -eq 0 ]; then | 
				
			||||
 | 
					                log_message "success mount $DEVNAME" | 
				
			||||
 | 
					            else | 
				
			||||
 | 
					                log_message "failed to mount $DEVNAME" | 
				
			||||
 | 
					            fi | 
				
			||||
 | 
					        fi | 
				
			||||
 | 
					    else | 
				
			||||
 | 
					        log_message "$DEVNAME is already mounted at $MOUNTED" | 
				
			||||
 | 
					    fi | 
				
			||||
 | 
					    log_message "success insert $DEVNAME" | 
				
			||||
 | 
					fi | 
				
			||||
@ -0,0 +1,3 @@ | 
				
			|||||
 | 
					#!/bin/bash | 
				
			||||
 | 
					# Your script logic here | 
				
			||||
 | 
					echo "Connection received on Unix socket" >> /var/log/example.log | 
				
			||||
@ -0,0 +1,10 @@ | 
				
			|||||
 | 
					[Unit] | 
				
			||||
 | 
					Description=Example Service for Unix Socket | 
				
			||||
 | 
					After=network.target | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Service] | 
				
			||||
 | 
					ExecStart=/usr/local/bin/addUsbScript.sh | 
				
			||||
 | 
					StandardInput=socket | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Install] | 
				
			||||
 | 
					WantedBy=multi-user.target | 
				
			||||
@ -0,0 +1,9 @@ | 
				
			|||||
 | 
					[Unit] | 
				
			||||
 | 
					Description=Example Unix Socket | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Socket] | 
				
			||||
 | 
					ListenStream=/tmp/usb-Sono-Socket.socket | 
				
			||||
 | 
					Accept=false | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					[Install] | 
				
			||||
 | 
					WantedBy=sockets.target | 
				
			||||
@ -0,0 +1,37 @@ | 
				
			|||||
 | 
					#!/bin/bash | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# Get the action (add or remove) and the device name from the udev rule | 
				
			||||
 | 
					ACTION=$1 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					# Get the device name from the udev rule | 
				
			||||
 | 
					DEVICE_NAME=$2 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					SOCKET_PATH="/tmp/usb-Sono-Socket.socket" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					if [ "$ACTION" == "add" ]; then | 
				
			||||
 | 
					    # Mount the device | 
				
			||||
 | 
					    udisksctl mount -b "$DEVICE_NAME" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    # Check if the mount was successful | 
				
			||||
 | 
					    if [ $? -eq 0 ]; then | 
				
			||||
 | 
					        # Write a message to the socket | 
				
			||||
 | 
					        echo "success connect $DEVICE_NAME" | socat - UNIX-CONNECT:$SOCKET_PATH | 
				
			||||
 | 
						echo "success connect $DEVICE_NAME" >> /tmp/tmp.log | 
				
			||||
 | 
					    else | 
				
			||||
 | 
					        echo "failure connect $DEVICE_NAME" | socat - UNIX-CONNECT:$SOCKET_PATH | 
				
			||||
 | 
						echo "failure connect $DEVICE_NAME" >> /tmp/tmp.log | 
				
			||||
 | 
					    fi | 
				
			||||
 | 
					elif [ "$ACTION" == "remove" ]; then | 
				
			||||
 | 
					    # Unmount the device | 
				
			||||
 | 
					    udisksctl unmount -b "$DEVICE_NAME" | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    # Check if the unmount was successful | 
				
			||||
 | 
					    if [ $? -eq 0 ]; then | 
				
			||||
 | 
					        # Write a message to the socket | 
				
			||||
 | 
					        echo "success disconnect $DEVICE_NAME" | socat - UNIX-CONNECT:$SOCKET_PATH | 
				
			||||
 | 
						echo "success disconnect $DEVICE_NAME" >> /tmp/tmp.log | 
				
			||||
 | 
					    else | 
				
			||||
 | 
					        echo "failure disconnect $DEVICE_NAME" | socat - UNIX-CONNECT:$SOCKET_PATH | 
				
			||||
 | 
						echo "failure disconnect $DEVICE_NAME" >> /tmp/tmp.log | 
				
			||||
 | 
					    fi | 
				
			||||
 | 
					fi | 
				
			||||
					Loading…
					
					
				
		Reference in new issue