167 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/command/with-contenv bashio
 | 
						|
# vim: ft=bash
 | 
						|
# shellcheck shell=bash
 | 
						|
# ==============================================================================
 | 
						|
# Prepare the Samba service for running
 | 
						|
# ==============================================================================
 | 
						|
declare password
 | 
						|
declare username
 | 
						|
declare -a interfaces=()
 | 
						|
export HOSTNAME
 | 
						|
 | 
						|
# Check Login data
 | 
						|
if ! bashio::config.has_value 'username' || ! bashio::config.has_value 'password'; then
 | 
						|
    bashio::exit.nok "Setting a username and password is required!"
 | 
						|
fi
 | 
						|
 | 
						|
bashio::config.require "enabled_shares" "Samba is a tool for sharing folders. Starting it without sharing any folders defeats the purpose."
 | 
						|
 | 
						|
# Read hostname from API or setting default "hassio"
 | 
						|
HOSTNAME=$(bashio::info.hostname)
 | 
						|
if bashio::var.is_empty "${HOSTNAME}"; then
 | 
						|
    bashio::log.warning "Can't read hostname, using default."
 | 
						|
    HOSTNAME="hassio"
 | 
						|
fi
 | 
						|
bashio::log.info "Hostname: ${HOSTNAME}"
 | 
						|
 | 
						|
# Get supported interfaces
 | 
						|
for interface in $(bashio::network.interfaces); do
 | 
						|
    interface_enabled=$(bashio::network.enabled "${interface}")
 | 
						|
    if bashio::var.true "${interface_enabled}"; then
 | 
						|
        interfaces+=("${interface}")
 | 
						|
    fi
 | 
						|
done
 | 
						|
if [ ${#interfaces[@]} -eq 0 ]; then
 | 
						|
    bashio::exit.nok 'No supported interfaces found to bind on.'
 | 
						|
fi
 | 
						|
bashio::log.info "Interfaces: $(printf '%s ' "${interfaces[@]}")"
 | 
						|
 | 
						|
# Generate Samba configuration.
 | 
						|
jq ".interfaces = $(jq -c -n '$ARGS.positional' --args -- "${interfaces[@]}") |
 | 
						|
    .enabled_shares.[] |= ascii_downcase" /data/options.json \
 | 
						|
    | tempio \
 | 
						|
      -template /usr/share/tempio/smb.gtpl \
 | 
						|
      -out /etc/samba/smb.conf
 | 
						|
 | 
						|
# Init user
 | 
						|
username=$(bashio::config 'username')
 | 
						|
password=$(bashio::config 'password')
 | 
						|
addgroup "${username}"
 | 
						|
adduser -D -H -G "${username}" -s /bin/false "${username}"
 | 
						|
 | 
						|
(echo "$password"; echo "$password") \
 | 
						|
    | smbpasswd -a -s -c "/etc/samba/smb.conf" "${username}"
 | 
						|
 | 
						|
#!/usr/bin/with-contenv bashio
 | 
						|
# shellcheck shell=bash
 | 
						|
set -e
 | 
						|
 | 
						|
if ! bashio::supervisor.ping 2> /dev/null; then
 | 
						|
    echo "..."
 | 
						|
    exit 0
 | 
						|
fi
 | 
						|
 | 
						|
bashio::log.notice "This script is used to mount local USB/SATA/SD/NVMe drives. Instructions here : https://github.com/alexbelgium/hassio-addons/wiki/Mounting-Local-Drives-in-Addons"
 | 
						|
 | 
						|
######################
 | 
						|
# MOUNT LOCAL SHARES #
 | 
						|
######################
 | 
						|
 | 
						|
# Mount local Share if configured
 | 
						|
if bashio::config.has_value 'localdisks'; then
 | 
						|
 | 
						|
    # Available devices
 | 
						|
    blkid | awk '{print substr($1, 0, length($1) - 1)}' | awk -F'/' '{print $NF}' > availabledisks
 | 
						|
    echo "NAME" >> availabledisks
 | 
						|
 | 
						|
    ## List available Disk with Labels and Id
 | 
						|
    bashio::log.blue "---------------------------------------------------"
 | 
						|
    bashio::log.info "Available Disks for mounting :"
 | 
						|
    lsblk -o name,label,size,fstype,ro | awk '$4 != "" { print $0 }' | grep -f availabledisks
 | 
						|
    bashio::log.blue "---------------------------------------------------"
 | 
						|
    rm availabledisks
 | 
						|
 | 
						|
    # Show support fs https://github.com/dianlight/hassio-addons/blob/2e903184254617ac2484fe7c03a6e33e6987151c/sambanas/rootfs/etc/s6-overlay/s6-rc.d/init-automount/run#L106
 | 
						|
    fstypessupport=$(grep -v nodev < /proc/filesystems | awk '{$1=" "$1}1' | tr -d '\n\t')
 | 
						|
    bashio::log.green "Supported fs : ${fstypessupport}"
 | 
						|
    bashio::log.green "Inspired from : github.com/dianlight"
 | 
						|
    bashio::log.blue "---------------------------------------------------"
 | 
						|
 | 
						|
    MOREDISKS=$(bashio::config 'localdisks')
 | 
						|
    echo "Local Disks mounting..."
 | 
						|
 | 
						|
    # Separate comma separated values
 | 
						|
    # shellcheck disable=SC2086
 | 
						|
    for disk in ${MOREDISKS//,/ }; do
 | 
						|
 | 
						|
        # Remove text until last slash
 | 
						|
        disk="${disk##*/}"
 | 
						|
 | 
						|
        # Function to check what is the type of device
 | 
						|
        if [ -e /dev/"$disk" ]; then
 | 
						|
            echo "... $disk is a physical device"
 | 
						|
            devpath=/dev
 | 
						|
        elif [ -e /dev/disk/by-uuid/"$disk" ] || lsblk -o UUID | grep -q "$disk"; then
 | 
						|
            echo "... $disk is a device by UUID"
 | 
						|
            devpath=/dev/disk/by-uuid
 | 
						|
        elif [ -e /dev/disk/by-label/"$disk" ] || lsblk -o LABEL | grep -q "$disk"; then
 | 
						|
            echo "... $disk is a device by label"
 | 
						|
            devpath=/dev/disk/by-label
 | 
						|
        else
 | 
						|
            bashio::log.fatal "$disk does not match any known physical device, UUID, or label. "
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
 | 
						|
        # Creates dir
 | 
						|
        mkdir -p /mnt/"$disk"
 | 
						|
        if bashio::config.has_value 'PUID' && bashio::config.has_value 'PGID'; then
 | 
						|
            PUID="$(bashio::config 'PUID')"
 | 
						|
            PGID="$(bashio::config 'PGID')"
 | 
						|
            chown "$PUID:$PGID" /mnt/"$disk"
 | 
						|
        fi
 | 
						|
 | 
						|
        # Check FS type and set relative options (thanks @https://github.com/dianlight/hassio-addons)
 | 
						|
        fstype=$(lsblk "$devpath"/"$disk" -no fstype)
 | 
						|
        options="nosuid,relatime,noexec"
 | 
						|
        type="auto"
 | 
						|
 | 
						|
        # Check if supported
 | 
						|
        if [[ "${fstypessupport}" != *"${fstype}"* ]]; then
 | 
						|
            bashio::log.fatal : "${fstype} type for ${disk} is not supported"
 | 
						|
            break
 | 
						|
        fi
 | 
						|
 | 
						|
        # Mount drive
 | 
						|
        bashio::log.info "Mounting ${disk} of type ${fstype}"
 | 
						|
        case "$fstype" in
 | 
						|
            exfat | vfat | msdos)
 | 
						|
                bashio::log.warning "${fstype} permissions and ACL don't works and this is an EXPERIMENTAL support"
 | 
						|
                options="${options},umask=000"
 | 
						|
                ;;
 | 
						|
            ntfs)
 | 
						|
                bashio::log.warning "${fstype} is an EXPERIMENTAL support"
 | 
						|
                options="${options},umask=000"
 | 
						|
                type="ntfs"
 | 
						|
                ;;
 | 
						|
            squashfs)
 | 
						|
                bashio::log.warning "${fstype} is an EXPERIMENTAL support"
 | 
						|
                options="loop"
 | 
						|
                type="squashfs"
 | 
						|
                ;;
 | 
						|
        esac
 | 
						|
 | 
						|
        # Legacy mounting : mount to share if still exists (avoid breaking changes)
 | 
						|
        dirpath="/mnt"
 | 
						|
        if [ -d /share/"$disk" ]; then dirpath="/share"; fi
 | 
						|
 | 
						|
        # shellcheck disable=SC2015
 | 
						|
        mount -t $type "$devpath"/"$disk" "$dirpath"/"$disk" -o $options && bashio::log.info "Success! $disk mounted to /mnt/$disk" \
 | 
						|
            || (
 | 
						|
                bashio::log.fatal "Unable to mount local drives! Please check the name."
 | 
						|
                rmdir /mnt/"$disk"
 | 
						|
                bashio::addon.stop
 | 
						|
            )
 | 
						|
    done
 | 
						|
 | 
						|
fi
 |