This time with the patch On Sun, 2010-02-07 at 00:58 -0500, Daniel Dickinson wrote: > Hi all, > > Here is the automount patch I've been promising with the modularization > and logging suggested by ede. > > You can turn automount completely off. > You can set it to do only mounts from fstab > You can set it to do only 'anonymous' mounts (mounted under /mnt/device) > Ditto swap (if swap-utils is installed) > You can mix and match > You can control whether anonymous mounts get their filesystem checked > You can control fstab filesystem checks on a per mount point basis > (fsck depends on the appropriate package being installed) > You can mount via uuid or label if blkid is installed > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
-- And that's my crabbing done for the day. Got it out of the way early, now I have the rest of the afternoon to sniff fragrant tea-roses or strangle cute bunnies or something. -- Michael Devore GnuPG Key Fingerprint 86 F5 81 A5 D4 2E 1F 1C http://gnupg.org The C Shore (Daniel Dickinson's Website) http://cshore.is-a-geek.com
Index: utils/btrfs-progs/files/btrfsck.uci-defaults =================================================================== --- utils/btrfs-progs/files/btrfsck.uci-defaults (revision 0) +++ utils/btrfs-progs/files/btrfsck.uci-defaults (revision 0) @@ -0,0 +1,6 @@ +#!/bin/sh + +cfgsect="$(uci add fstab fsck_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/btrfsck.sh" +uci commit + Index: utils/btrfs-progs/files/btrfsck.sh =================================================================== --- utils/btrfs-progs/files/btrfsck.sh (revision 0) +++ utils/btrfs-progs/files/btrfsck.sh (revision 0) @@ -0,0 +1,23 @@ +#!/bin/sh +# Copyright (C) 2010 Vertical Communications + +fsck_btrfsck() { + btrfsck -p "$device" 2>&1 | logger -t "fstab: btrfsck ($device)" + local status="$?" + case "$status" in + 0|1) ;; #success + 2) reboot;; + 4) echo "btrfsck ($device): Warning! Uncorrected errors."| logger -t 'fstab' + return 1 + ;; + *) echo "btrfsck ($device): Error $status. Check not complete." | logger -t 'fstab';; + esac + return 0 +} + +fsck_btrfs() { + fsck_btrfsck "$@" +} + +append libmount_known_fsck "btrfs" + Index: utils/btrfs-progs/Makefile =================================================================== --- utils/btrfs-progs/Makefile (revision 19533) +++ utils/btrfs-progs/Makefile (working copy) @@ -48,6 +48,10 @@ define Package/btrfs-progs/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(addprefix $(PKG_INSTALL_DIR)/usr/bin/, $(progs)) $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/btrfsck.uci-defaults $(1)/etc/uci-defaults/btrsfck + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/btrfsck.sh $(1)/lib/functions/block/ endef $(eval $(call BuildPackage,btrfs-progs)) Index: utils/reiserfsprogs/files/reiserfsck.uci-defaults =================================================================== --- utils/reiserfsprogs/files/reiserfsck.uci-defaults (revision 0) +++ utils/reiserfsprogs/files/reiserfsck.uci-defaults (revision 0) @@ -0,0 +1,6 @@ +#!/bin/sh + +cfgsect="$(uci add fstab fsck_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/reiserfsck.sh" +uci commit + Index: utils/reiserfsprogs/files/reiserfsck.sh =================================================================== --- utils/reiserfsprogs/files/reiserfsck.sh (revision 0) +++ utils/reiserfsprogs/files/reiserfsck.sh (revision 0) @@ -0,0 +1,23 @@ +#!/bin/sh +# Copyright (C) 2010 Vertical Communications + +fsck_reiserfsck() { + reiserfsck -p "$device" 2>&1 | logger -t "fstab: reiserfsck ($device)" + local status="$?" + case "$status" in + 0|1) ;; #success + 2) reboot;; + 4|6) echo "reiserfsck ($device): Warning! Uncorrected errors."| logger -t fstab + return 1 + ;; + *) echo "reiserfsck ($device): Error $status. Check not complete." | logger -t fstab;; + esac + return 0 +} + +fsck_reiserfs() { + fsck_reiserfsck "$@" +} + +append libmount_known_fsck "reiserfs" + Index: utils/reiserfsprogs/Makefile =================================================================== --- utils/reiserfsprogs/Makefile (revision 19533) +++ utils/reiserfsprogs/Makefile (working copy) @@ -43,6 +43,10 @@ $(INSTALL_BIN) $(foreach bin,debugreiserfs mkreiserfs reiserfsck reiserfstune resize_reiserfs,$(PKG_INSTALL_DIR)/usr/sbin/$(bin)) $(1)/usr/sbin/ ln -sf mkreiserfs $(1)/usr/sbin/mkfs.reiserfs ln -sf reiserfsck $(1)/usr/sbin/fsck.reiserfs + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/reiserfsck.uci-defaults $(1)/etc/uci-defaults/reiserfsck + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/reiserfsck.sh $(1)/lib/functions/block/ endef $(eval $(call BuildPackage,reiserfsprogs)) Index: utils/dosfstools/files/dosfsck.uci-defaults =================================================================== --- utils/dosfstools/files/dosfsck.uci-defaults (revision 0) +++ utils/dosfstools/files/dosfsck.uci-defaults (revision 0) @@ -0,0 +1,6 @@ +#!/bin/sh + +cfgsect="$(uci add fstab fsck_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/dosfsck.sh" +uci commit + Index: utils/dosfstools/files/dosfsck.sh =================================================================== --- utils/dosfstools/files/dosfsck.sh (revision 0) +++ utils/dosfstools/files/dosfsck.sh (revision 0) @@ -0,0 +1,28 @@ +#!/bin/sh +# Copyright (C) 2010 Vertical Communications + +fsck_dosfsck() { + reiserfsck -p "$device" 2>&1 | logger -t "fstab: dosfsck ($device)" + local status="$?" + case "$status" in + 0) ;; #success + 1) echo "dosfsck ($device): Warning! Errors detected."| logger -t fstab + return 1 + ;; + *) echo "dosfsck ($device): Usage error. Device not checked".| logger -t fstab;; + esac + return 0 +} + +fsck_vfat() { + fsck_dosfsck "$@" +} + +fsck_msdos() { + fsck_dosfsck "$@" +} + + +append libmount_known_fsck "vfat" +append libmount_known_fsck "msdos" + Index: utils/dosfstools/Makefile =================================================================== --- utils/dosfstools/Makefile (revision 19533) +++ utils/dosfstools/Makefile (working copy) @@ -76,6 +76,10 @@ $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dosfsck $(1)/usr/sbin/ (cd $(1)/usr/sbin; ln -sf dosfsck fsck.msdos; ln -sf dosfsck fsck.vfat) + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/dosfsck.uci-defaults $(1)/etc/uci-defaults/dosfsck + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/dosfsck.sh $(1)/lib/functions/block/ endef define Package/dosfslabel/install
Index: package/base-files/files/lib/functions/fsck.sh =================================================================== --- package/base-files/files/lib/functions/fsck.sh (revision 0) +++ package/base-files/files/lib/functions/fsck.sh (revision 0) @@ -0,0 +1,35 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +libmount_fsck() { + local device="$1" + local fstype="$2" + local fsck_enabled="$3" + local known_type + local found_fsck=0 + + [ -e "$device" ] && [ "$fsck_enabled" -eq 1 ] && { + grep -q "$device" /proc/mounts && return 0 + for known_type in $libmount_known_fsck; do + if [ "$known_type" = "$fstype" ]; then + fsck_${known_type} "$device" + found_fsck=1 + fi + done + if [ "$found_fsck" -ne 1 ]; then + logger -t 'fstab' "Unable to check/repair $device; no known fsck for filesystem type $fstype" + fi + } +} + +libmount_fsck_fs_type() { + local device="$1" + local fstype="$2" + + echo "$fstype" + return 0 +} + +libmount_known_fsck="" + +config_load_block_plugins fsck_plugin Index: package/base-files/files/lib/functions/block.sh =================================================================== --- package/base-files/files/lib/functions/block.sh (revision 0) +++ package/base-files/files/lib/functions/block.sh (revision 0) @@ -0,0 +1,233 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +. /etc/functions.sh + +reset_block_cb() { + mount_cb() { + dmc_mount_cfg="$1" + shift # skip optional param + dmc_target="$2" + dmc_mount_device="$3" + dmc_fstype="$4" + dmc_options="$5" + dmc_enabled="$6" + dmc_enabled_fsck="$7" + dmc_uuid="$8" + dmc_label="$9" + return 0 + } + swap_cb() { + dsc_swap_cfg="$1" + shift # skip optional param + dsc_swap_device="$2" + dsc_enabled="$3" + dsc_uuid="$4" + dsc_label="$5" + return 0 + } +} +reset_block_cb + +reset_dev_section_cb() { + mount_dev_section_cb() { + dmds_mount_cfg="$1" + dmds_mount_target="$2" + dmds_mount_device="$3" + dmds_mount_fstype="$4" + dmds_mount_options="$5" + dmds_mount_enabled="$6" + dmds_mount_enabled_fsck="$7" + dmds_mount_uuid="$8" + dmds_mount_label="$9" + return 0 + } + swap_dev_section_cb() { + dsds_swap_cfg="$1" + dsds_swap_device="$2" + dsds_swap_enabled="$3" + dsds_swap_uuid="$4" + dsds_swap_label="$5" + return 0 + } +} +reset_dev_section_cb + +config_get_mount() { + local gm_cfg="$1" + local gm_param="$2" + local gm_target + local gm_device + local gm_fstype + local gm_options + local gm_enabled + local gm_enabled_fsck + local gm_uuid + local gm_label + config_get gm_target "$1" target + config_get gm_device "$1" device + config_get gm_fstype "$1" fstype 'auto' + config_get gm_options "$1" options 'rw' + config_get_bool gm_enabled "$1" enabled 1 + config_get_bool gm_enabled_fsck "$1" enabled_fsck 0 + config_get gm_uuid "$1" uuid + config_get gm_label "$1" label + + mount_cb "$gm_cfg" "$gm_param" "$gm_target" "$gm_device" "$gm_fstype" "$gm_options" "$gm_enabled" "$gm_enabled_fsck" "$gm_uuid" "$gm_label" +} + +config_get_swap() { + local gs_cfg="$1" + local gs_param="$2" + local gs_device + local gs_enabled + local gs_uuid + local gs_label + config_get gs_device "$1" device + config_get_bool gs_enabled "$1" enabled 1 + config_get gs_uuid "$1" uuid + config_get gs_label "$1" label + + swap_cb "$gs_cfg" "$gs_param" "$gs_device" "$gs_enabled" "$gs_uuid" "$gs_label" +} + +config_get_automount() { + config_load fstab + config_get_bool from_fstab "automount" from_fstab 1 + config_get_bool anon_mount "automount" anon_mount 1 + config_get_bool anon_fsck "automount" anon_fsck 0 +} + +config_get_autoswap() { + config_load fstab + config_get_bool from_fstab "autoswap" from_fstab 1 + config_get_bool anon_swap "autoswap" anon_swap 0 +} + +config_create_swap_fstab_entry() { + local device="$1" + local enabled="$2" + + [ -n "$device" ] || return 0 + + local fstabnew="$(mktemp -t '.fstab.XXXXXXXX')" + + # We write to /etc/fstab, but it *should* be a symlink to /tmp/fstab + mkdir -p /var/lock + lock /var/lock/fstab.lck + cat /etc/fstab | grep -E -v "^$device[[:blank:]]" >>"$fstabnew" + [ "$enabled" -eq 1 ] && echo "$device none swap sw 0 0" >> "$fstabnew" + cat "$fstabnew" >/etc/fstab + lock -u /var/lock/fstab.lck + rm -f $fstabnew +} + +config_create_mount_fstab_entry() { + local device="$1" + local target="$2" + local fstype="$3" + local options="$4" + local enabled="$5" + options="${options:-rw}" + [ "$enabled" -eq 0 ] && options="noauto,$options" + [ -n "$target" ] || return 0 + [ -n "$device" ] || return 0 + + local fstabnew="$(mktemp -t '.fstab.XXXXXXXX')" + + # We write to /etc/fstab, but it *should* be a symlink to /tmp/fstab + mkdir -p /var/lock + lock /var/lock/fstab.lck + cat /etc/fstab | grep -E -v "^$device[[:blank:]]" | grep -v "$target" >>"$fstabnew" + echo "$device $target $fstype $options 0 0" >>"$fstabnew" + cat "$fstabnew" >/etc/fstab + lock -u /var/lock/fstab.lck + rm -f $fstabnew +} + +config_get_mount_section_by_device() { + local msbd_device="$1" + local msbd_mount_cfg= + local msbd_target= + local msbd_mount_device= + local msbd_fstype= + local msbd_options= + local msbd_enabled= + local msbd_enabled_fsck= + local msbd_uuid= + local msbd_label= + mount_cb() { + local mc_cfg="$1" + local mc_device="$2" + shift + local mc_mount_device="$3" + if [ -n "$mc_mount_device" ] && [ "$mc_mount_device" = "$mc_device" ]; then + msbd_mount_cfg="$mc_cfg" + msbd_target="$2" + msbd_mount_device="$3" + msbd_fstype="$4" + msbd_options="$5" + msbd_enabled="$6" + msbd_enabled_fsck="$7" + msbd_uuid="$8" + msbd_label="$9" + fi + return 0 + } + config_foreach config_get_mount mount "$msbd_device" + [ -n "$msbd_uuid" ] && logger -t 'fstab' "uuid specified for target $msbd_target but required package blkid not installed" + [ -n "$msbd_label" ] && logger -t 'fstab' "label specified for target $msbd_target but required package blkid not installed" + [ -n "$msbd_mount_device" ] && config_create_mount_fstab_entry "$msbd_mount_device" "$msbd_target" "$msbd_stype" "$msbd_options" "$msbd_enabled" + mount_dev_section_cb "$msbd_mount_cfg" "$msbd_target" "$msbd_mount_device" "$msbd_fstype" "$msbd_options" "$msbd_enabled" "$msbd_enabled_fsck" "$msbd_uuid" "$msbd_label" + reset_block_cb +} + +config_get_swap_section_by_device() { + local ssbd_device="$1" + local ssbd_swap_cfg= + local ssbd_swap_device= + local ssbd_enabled= + local ssbd_uuid= + local ssbd_label= + swap_cb() { + local sc_cfg="$1" + local sc_device="$2" + local sc_swap_device="$3" + if [ -n "$sc_swap_device" ] && [ "$sc_swap_device" = "$sc_device" ]; then + ssbd_swap_cfg="$sc_cfg" + ssbd_swap_device="$3" + ssbd_enabled="$4" + ssbd_uuid="$5" + ssbd_label="$6" + fi + return 0 + } + config_foreach config_get_swap swap "$ssbd_device" + [ -n "$ssbd_uuid" ] && logger -t 'fstab' "uuid specified for swap device but required package blkid not installed" + [ -n "$ssbd_label" ] && logger -t 'fstab' "label specified for swap device but required package blkid not installed" + [ -n "$ssbd_swap_device" ] && config_create_swap_fstab_entry "$ssbd_swap_device" "$ssbd_enabled" + swap_dev_section_cb "$ssbd_swap_cfg" "$ssbd_swap_device" "$ssbd_enabled" "$ssbd_uuid" "$ssbd_label" + reset_block_cb +} + +config_load_block_plugins() { + local plugin_type="$1" + plugins="$(plugin_type=$plugin_type sh -c ' + . /etc/functions.sh + echo_plugin() { + local cfg="$1" + local plugin_path + config_get plugin_path "$cfg" plugin_path + echo "$plugin_path" + } + config_load fstab + [ -z "$plugin_type" ] && plugin_type="plugin" + config_foreach echo_plugin $plugin_type + ')" + for plugin in $plugins; do + [ -r "$plugin" ] && . "$plugin" || logger -t 'fstab' "Error loading plugin '$plugin'" + done +} + +config_load_block_plugins plugin + Index: package/base-files/files/lib/functions/mount.sh =================================================================== --- package/base-files/files/lib/functions/mount.sh (revision 0) +++ package/base-files/files/lib/functions/mount.sh (revision 0) @@ -0,0 +1,47 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +. /lib/functions/block.sh +. /lib/functions/fsck.sh + +config_mount_by_section() { + local cfg="$1" + + mount_cb() { + local cfg="$1" + shift + local target="$2" + local device="$3" + local fstype="$4" + local options="$5" + local enabled="$6" + local enabled_fsck="$7" + local uuid="$8" + local label="$9" + local fsck_type="" + + [ -n "$uuid" ] && logger -t 'fstab' "uuid specified for target $target but required package blkid not installed" + [ -n "$label" ] && logger -t 'fstab' "label specified for target $target but required package blkid not installed" + + if [ -n "$device" ] && [ -e "$device" ]; then + [ "$enabled_fsck" -eq 1 ] && fsck_type="`libmount_fsck_fs_type "$device" "$fstype"`" + [ -n "$fsck_type" ] && { + grep -q /proc/swaps "$device" || grep -q /proc/mounts "$device" || { + libmount_fsck "$device" "$fsck_type" "$enabled_fsck" + } + } + config_create_mount_fstab_entry "$device" "$target" "$fstype" "$options" "$enabled" + grep -q /proc/swaps "$device" || grep -q /proc/mounts "$device" || { + [ "$enabled" -eq 1 ] && mkdir -p "$target" && mount "$target" 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab' + } + fi + return 0 + } + config_get_mount "$cfg" + reset_block_cb +} + + +config_load_block_plugins mount_plugin + + Index: package/base-files/files/etc/init.d/fstab =================================================================== --- package/base-files/files/etc/init.d/fstab (revision 19533) +++ package/base-files/files/etc/init.d/fstab (working copy) @@ -1,30 +1,19 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2007 OpenWrt.org +# Copyright (C) 2010 Vertical Communications START=20 +. /lib/functions/mount.sh + do_mount() { local cfg="$1" - - config_get device "$cfg" device - config_get target "$cfg" target - [ -n "$device" -a -n "$target" ] || return 0 - - mkdir -p $target - config_get fstype "$cfg" fstype 'auto' - config_get options "$cfg" options '-rw' - config_get_bool enabled "$cfg" "enabled" '1' - [ "$enabled" -eq 0 ] && options="noauto,$options" - echo "$device $target $fstype $options 0 0" >> /tmp/fstab + config_mount_by_section "$cfg" } do_swapon() { local cfg="$1" - - config_get device "$cfg" device - config_get_bool enabled "$cfg" "enabled" '1' - [ -n "$device" -a "$enabled" -gt 0 ] || return 0 - echo "$device none swap sw 0 0" >> /tmp/fstab + [ "$(which swapon)" ] && config_swapon_by_section "$cfg" } do_unmount() { @@ -47,17 +36,18 @@ start() { config_load fstab - echo '# WARNING: this is an auto generated file, please use uci to set static filesystems' > /tmp/fstab + mkdir -p /var/lock + lock /var/lock/fstab.lck + echo '# WARNING: this is an auto generated file, please use uci to set defined filesystems' > /etc/fstab + lock -u /var/lock/fstab.lck config_foreach do_mount mount config_foreach do_swapon swap - mount -a - [ -x /sbin/swapon ] && swapon -a } stop() { config_load fstab config_foreach do_unmount mount config_foreach do_swapoff swap - [ -x /sbin/swapoff ] && swapoff -a + [ -x "$(which swapoff)" ] && swapoff -a } Index: package/base-files/files/etc/hotplug.d/block/10-mount =================================================================== --- package/base-files/files/etc/hotplug.d/block/10-mount (revision 19533) +++ package/base-files/files/etc/hotplug.d/block/10-mount (working copy) @@ -1,20 +0,0 @@ -#!/bin/sh -# Copyright (C) 2009-2010 OpenWrt.org - -blkdev=`dirname $DEVPATH` -if [ `basename $blkdev` != "block" ]; then - - device=`basename $DEVPATH` - case "$ACTION" in - add) - swapon /dev/$device >/dev/null 2>/dev/null || ( - mkdir -p /mnt/$device - mount /dev/$device /mnt/$device - ) - ;; - remove) - umount /dev/$device - ;; - esac - -fi Index: package/base-files/files/etc/hotplug.d/block/40-mount =================================================================== --- package/base-files/files/etc/hotplug.d/block/40-mount (revision 0) +++ package/base-files/files/etc/hotplug.d/block/40-mount (revision 0) @@ -0,0 +1,81 @@ +#!/bin/sh +# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +. /lib/functions/block.sh + +blkdev=`dirname $DEVPATH` +if [ `basename $blkdev` != "block" ]; then + + device=`basename $DEVPATH` + + case "$ACTION" in + add) + + local from_fstab + local anon_mount + local anon_swap + local anon_fsck + local mds_mount_target + local mds_mount_device + local mds_mount_fstype + local sds_swap_device + local use_device + local do_fsck=0 + local fsck_type + + local autoswap_from_fstab + local automount_from_fstab + + mount_dev_section_cb() { + mds_mount_target="$2" + mds_mount_device="$3" + mds_mount_fstype="$4" + mds_mount_enabled="$6" + } + + swap_dev_section_cb() { + sds_swap_device="$2" + return 0 + } + + config_get_automount + automount_from_fstab="$from_fstab" + [ "$automount_from_fstab" -eq 1 ] && { + config_get_mount_section_by_device "/dev/$device" + use_device="$mds_mount_device" + [ "$mds_mount_enabled" -eq 1 ] && { + if [ -n "$mds_mount_target" ]; then + grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || { + ( mkdir -p "$mds_mount_target" && mount "$mds_mount_target" ) 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab' + } + else + logger -t 'fstab' "Mount enabled for $mds_mount_device but it doesn't have a defined mountpoint (target)" + fi + } + } + + [ -z "$use_device" ] && { + config_get_autoswap + autoswap_from_fstab="$from_fstab" + + [ "$autoswap_from_fstab" -eq 1 ] && { + config_get_swap_section_by_device "/dev/$device" + use_device="$sds_swap_device" + } + } + + grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || { + [ "$anon_mount" -eq 1 ] && [ -z "$use_device" ] && { + ( mkdir -p /mnt/$device && mount /dev/$device /mnt/$device ) 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab' + } + } + reset_dev_section_cb + ;; + remove) + umount /dev/$device + ;; + esac + +fi + Index: package/base-files/files/etc/hotplug.d/block/20-fsck =================================================================== --- package/base-files/files/etc/hotplug.d/block/20-fsck (revision 0) +++ package/base-files/files/etc/hotplug.d/block/20-fsck (revision 0) @@ -0,0 +1,82 @@ +#!/bin/sh +# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +. /lib/functions/block.sh +. /lib/functions/fsck.sh + +blkdev=`dirname $DEVPATH` + +if [ `basename $blkdev` != "block" ]; then + + device=`basename $DEVPATH` + + case "$ACTION" in + add) + local from_fstab + local anon_mount + local anon_swap + local anon_fsck + local mds_mount_target + local mds_mount_device + local mds_mount_fstype + local mds_mount_enabled_fsck + local sds_swap_device + local use_device + local do_fsck=0 + local fsck_type + + local autoswap_from_fstab + local automount_from_fstab + + mount_dev_section_cb() { + mds_mount_device="$3" + mds_mount_fstype="$4" + mds_mount_enabled_fsck="$7" + } + + swap_dev_section_cb() { + sds_swap_device="$2" + return 0 + } + + config_get_automount + automount_from_fstab="$from_fstab" + + [ "$automount_from_fstab" -eq 1 ] && { + config_get_mount_section_by_device "/dev/$device" + use_device="$mds_mount_device" + [ "$mds_mount_enabled_fsck" -eq 1 ] && do_fsck=1 + } + + [ -z "$use_device" ] && { + config_get_autoswap + autoswap_from_fstab="$from_fstab" + + [ "$autoswap_from_fstab" -eq 1 ] && { + config_get_swap_section_by_device "/dev/$device" + use_device="$sds_swap_device" && do_fsck=0 + } + } + + grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || { + [ "$anon_fsck" -eq 1 ] && [ -z "$use_device" ] && { + use_device="/dev/$device" && do_fsck=1 && mds_mount_fstype="" + } + } + + [ "$do_fsck" -eq 1 ] && { + fsck_type="`libmount_fsck_fs_type "$use_device" "$mds_mount_fstype"`" + + [ -n "$fsck_type" ] && [ "$fsck_type" != "swap" ] && { + grep -q "/dev/$device" /proc/swaps || grep -q "/dev/$device" /proc/mounts || { + libmount_fsck "$use_device" "$fsck_type" "$do_fsck" + } + } + } + + reset_dev_section_cb + ;; + esac +fi + Index: package/base-files/files/etc/hotplug.d/block/10-swap =================================================================== --- package/base-files/files/etc/hotplug.d/block/10-swap (revision 0) +++ package/base-files/files/etc/hotplug.d/block/10-swap (revision 0) @@ -0,0 +1,81 @@ +#!/bin/sh +# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2010 Vertical Communications + +. /lib/functions/block.sh + +blkdev=`dirname $DEVPATH` + +if [ `basename $blkdev` != "block" ]; then + + device=`basename $DEVPATH` + + + case "$ACTION" in + add) + local autoswap_from_fstab + local automount_from_fstab + local from_fstab + local anon_mount + local anon_swap + local anon_fsck + local mds_mount_device + local sds_swap_device + local sds_swap_enabled + local use_device + local do_swap=0 + + mount_dev_section_cb() { + mds_mount_device="$3" + } + + swap_dev_section_cb() { + sds_swap_device="$2" + sds_swap_enabled="$3" + return 0 + } + + config_get_automount + automount_from_fstab="$from_fstab" + + [ "$automount_from_fstab" -eq 1 ] && { + config_get_mount_section_by_device "/dev/$device" + } + + # skip trying swap if this device is defined as a mount point + [ -z "$mds_mount_device" ] && { + config_get_autoswap + autoswap_from_fstab="$from_fstab" + + [ "$autoswap_from_fstab" -eq 1 ] && { + config_get_swap_section_by_device "/dev/$device" + use_device="$sds_swap_device" + do_swap="$sds_swap_enabled" + } + + [ -z "$use_device" ] && [ "$anon_swap" -eq 1 ] && { + use_device="/dev/$device" && do_swap=1 + } + } + + [ -n "$use_device" ] && [ "$do_swap" -eq 1 ] && { + if [ -n "$(which swapon)" ]; then + libmount_is_swap_device $use_device && { + grep -q "$use_device" /proc/swaps || grep -q "$use_device" /proc/mounts || { + swapon "$use_device" + } + } + else + logger -t 'fstab' "Couldn't find swapon while attempting to enable swap on $use_device" + fi + } + reset_dev_section_cb + ;; + remove) + grep -q "/dev/$device" /proc/swaps && { + [ -n "$(which swapoff)" ] && swapoff "/dev/$device" + } + ;; + esac +fi + Index: package/base-files/files/etc/config/fstab =================================================================== --- package/base-files/files/etc/config/fstab (revision 19533) +++ package/base-files/files/etc/config/fstab (working copy) @@ -1,3 +1,13 @@ +config global automount + option from_fstab 1 + option anon_mount 1 + option anon_fsck 0 + +config global autoswap + option from_fstab 1 + option anon_swap 0 + + config mount option target /home option device /dev/sda1 @@ -4,7 +14,9 @@ option fstype ext3 option options rw,sync option enabled 0 + option enabled_fsck 0 config swap option device /dev/sda2 option enabled 0 + Index: package/e2fsprogs/files/e2fsck.init =================================================================== --- package/e2fsprogs/files/e2fsck.init (revision 19533) +++ package/e2fsprogs/files/e2fsck.init (working copy) @@ -1,35 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2008 OpenWrt.org -# Vasilis Tsiligiannis <acinon...@yahoo.gr> - -START=15 - -e2fsck() { - local args - local cfg="$1" - - config_get device "$cfg" device - [ -b "$device" ] || return 0 - - config_get fstype "$cfg" fstype - case "$fstype" in - ext2|ext3|ext4) - /usr/sbin/e2fsck -p "$device" - local status="$?" - case "$status" in - 0|1) continue;; - 2) reboot;; - 4) echo "e2fsck ($device): Warning! Uncorrected errors.";; - *) echo "e2fsck ($device): Error $status. Check not complete.";; - esac - ;; - *) - ;; - esac -} - -start() { - config_load fstab - config_foreach e2fsck mount -} - Index: package/e2fsprogs/files/e2fsck.uci-defaults =================================================================== --- package/e2fsprogs/files/e2fsck.uci-defaults (revision 0) +++ package/e2fsprogs/files/e2fsck.uci-defaults (revision 0) @@ -0,0 +1,6 @@ +#!/bin/sh + +cfgsect="$(uci add fstab fsck_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/e2fsck.sh" +uci commit + Index: package/e2fsprogs/files/blkuci.sh =================================================================== --- package/e2fsprogs/files/blkuci.sh (revision 0) +++ package/e2fsprogs/files/blkuci.sh (revision 0) @@ -0,0 +1,100 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +libmount_find_token() { + local token="$1" + local value="$2" + local device="$(blkid -l -t "$token=\"$value\"" | cut -f1 -d:)" + echo "$device" +} + +libmount_find_device_by_id() { + local uuid="$1" + local label="$2" + local device="$3" + local cfg_device="$4" + local found_device + + if [ -n "$uuid" ]; then + found_device="$(libmount_find_token "UUID" "$uuid")" + elif [ -n "$label" ]; then + found_device="$(libmount_find_token "LABEL" "$label")" + elif [ "$device" = "$cfg_device" ]; then + found_device="$device" + elif [ -z "$device" ] && [ -e "$cfg_device" ]; then + found_device="$cfg_device" + fi + echo "$found_device" +} + +config_get_mount_section_by_device() { + local msbd_device="$1" + local msbd_mount_cfg= + local msbd_target= + local msbd_mount_device= + local msbd_fstype= + local msbd_options= + local msbd_enabled= + local msbd_enabled_fsck= + local msbd_uuid= + local msbd_label= + mount_cb() { + local mc_cfg="$1" + local mc_device="$2" + shift + local mc_cfgdevice="$3" + local mc_uuid="$8" + local mc_label="$9" + local mc_found_device="" + + mc_found_device="$(libmount_find_device_by_id "$mc_uuid" "$mc_label" "$mc_device" "$mc_cfgdevice")" + if [ -n "$mc_found_device" ]; then + msbd_mount_cfg="$mc_cfg" + msbd_target="$2" + msbd_mount_device="$mc_found_device" + msbd_fstype="$4" + msbd_options="$5" + msbd_enabled="$6" + msbd_enabled_fsck="$7" + msbd_uuid="$8" + msbd_label="$9" + fi + return 0 + } + config_foreach config_get_mount mount "$msbd_device" + [ -n "$msbd_mount_device" ] && config_create_mount_fstab_entry "$msbd_mount_device" "$msbd_target" "$msbd_fstype" "$msbd_options" "$msbd_enabled" + mount_dev_section_cb "$msbd_mount_cfg" "$msbd_target" "$msbd_mount_device" "$msbd_fstype" "$msbd_options" "$msbd_enabled" "$msbd_enabled_fsck" "$msbd_uuid" "$msbd_label" + reset_block_cb +} + +config_get_swap_section_by_device() { + local ssbd_device="$1" + local ssbd_swap_cfg= + local ssbd_swap_device= + local ssbd_enabled= + local ssbd_uuid= + local ssbd_label= + swap_cb() { + local sc_cfg="$1" + local sc_device="$2" + local sc_uuid="$5" + local sc_label="$6" + local sc_cfgdevice="$3" + local sc_found_device + + sc_found_device="$(libmount_find_device_by_id "$sc_uuid" "$sc_label" "$sc_device" "$sc_cfgdevice")" + if [ -n "$sc_found_device" ]; then + ssbd_swap_cfg="$sc_cfg" + ssbd_swap_device="$sc_found_device" + ssbd_enabled="$4" + ssbd_uuid="$5" + ssbd_label="$6" + fi + return 0 + } + config_foreach config_get_swap swap "$ssbd_device" + [ -n "$ssbd_swap_device" ] && config_create_swap_fstab_entry "$ssbd_swap_device" "$ssbd_enabled" + swap_dev_section_cb "$ssbd_swap_cfg" "$ssbd_swap_device" "$ssbd_enabled" "$ssbd_uuid" "$ssbd_label" + reset_block_cb +} + Index: package/e2fsprogs/files/blkmount.sh =================================================================== --- package/e2fsprogs/files/blkmount.sh (revision 0) +++ package/e2fsprogs/files/blkmount.sh (revision 0) @@ -0,0 +1,43 @@ +#!/bin/sh +# Copyright (C) 2010 Vertical Communications + +config_mount_by_section() { + local cfg="$1" + + mount_cb() { + local cfg="$1" + local device="$2" + shift + local target="$2" + local cfgdevice="$3" + local fstype="$4" + local options="$5" + local enabled="$6" + local enabled_fsck="$7" + local uuid="$8" + local label="$9" + local found_device="" + local fsck_type="" + + found_device="$(libmount_find_device_by_id "$uuid" "$label" "$device" "$cfgdevice")" + if [ -n "$found_device" ]; then + [ "$enabled_fsck" -eq 1 ] && fsck_type="`libmount_fsck_fs_type "$found_device" "$fstype"`" + [ -n "$fsck_type" ] && { + grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || { + libmount_fsck "$found_device" "$fsck_type" "$enabled_fsck" + } + } + + config_create_mount_fstab_entry "$found_device" "$target" "$fstype" "$options" "$enabled" + grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || { + [ "$enabled" -eq 1 ] && mkdir -p "$target" && mount "$target" 2>&1 | tee /proc/self/fd/2 | logger -t 'fstab' + } + fi + return 0 + } + config_get_mount "$cfg" + reset_block_cb +} + + + Index: package/e2fsprogs/files/e2fsck.sh =================================================================== --- package/e2fsprogs/files/e2fsck.sh (revision 0) +++ package/e2fsprogs/files/e2fsck.sh (revision 0) @@ -0,0 +1,32 @@ +#!/bin/sh +# Copyright (C) 2010 Vertical Communications + +fsck_e2fsck() { + e2fsck -p "$device" 2>&1 | logger -t "fstab: e2fsck ($device)" + local status="$?" + case "$status" in + 0|1) ;; #success + 2) reboot;; + 4) echo "e2fsck ($device): Warning! Uncorrected errors."| logger -t fstab + return 1 + ;; + *) echo "e2fsck ($device): Error $status. Check not complete."| logger -t fstab;; + esac + return 0 +} + +fsck_ext2() { + fsck_e2fsck "$@" +} + +fsck_ext3() { + fsck_e2fsck "$@" +} + +fsck_ext4() { + fsck_e2fsck "$@" +} + +append libmount_known_fsck "ext2" +append libmount_known_fsck "ext3" +append libmount_known_fsck "ext4" Index: package/e2fsprogs/files/blkfsck.sh =================================================================== --- package/e2fsprogs/files/blkfsck.sh (revision 0) +++ package/e2fsprogs/files/blkfsck.sh (revision 0) @@ -0,0 +1,29 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +libmount_fsck_fs_type() { + local device="$1" + local fstype="$2" + local TYPE + local echo_type="" + + eval "$(blkid -s TYPE $device | cut -f2 -d:)" + + if [ "$fstype" = "" ] || [ "$fstype" = "$TYPE" ]; then + echo_type="$TYPE" + elif [ -n "$fstype" ]; then + # extX detection may detect a lower level than is actually on the device + # additionally we may be forcing a higher level to be mounted as a lower level + if [ "$fstype" = "ext4" ] || [ "$fstype" = "ext3" ] || [ "$fstype" = "ext2" ]; then + if [ "$TYPE" = "ext2" ] || [ "$TYPE" = "ext3" ] || [ "$TYPE" = "ext4" ]; then + echo_type="$fstype" + fi + fi + else + logger -t 'fstab' "fsck: Specified filesystem type $fstype does not match detected filesystem type $TYPE" + fi + echo "$echo_type" + return 0 +} + + Index: package/e2fsprogs/files/blkid.uci-defaults =================================================================== --- package/e2fsprogs/files/blkid.uci-defaults (revision 0) +++ package/e2fsprogs/files/blkid.uci-defaults (revision 0) @@ -0,0 +1,12 @@ +#!/bin/sh + +cfgsect="$(uci add fstab plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/blkuci.sh" +cfgsect="$(uci add fstab swap_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/blkswap.sh" +cfgsect="$(uci add fstab mount_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/blkmount.sh" +cfgsect="$(uci add fstab fsck_plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/blkfsck.sh" +uci commit + Index: package/e2fsprogs/files/blkswap.sh =================================================================== --- package/e2fsprogs/files/blkswap.sh (revision 0) +++ package/e2fsprogs/files/blkswap.sh (revision 0) @@ -0,0 +1,40 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +libmount_is_swap_device() { + local device="$1" + local TYPE + eval "$(blkid -s TYPE $device | cut -f2 -d:)" + [ "$TYPE" = "swap" ] && return 0 + return 1 +} + +config_swapon_by_section() { + local cfg="$1" + + swap_cb() { + local cfg="$1" + local device="$2" + local cfgdevice="$3" + local enabled="$4" + local uuid="$5" + local label="$6" + + local found_device="" + local fsck_type="" + + found_device="$(libmount_find_device_by_id "$uuid" "$label" "$device" "$cfgdevice")" + + if [ -n "$found_device" ]; then + config_create_swap_fstab_entry "$found_device" "$enabled" + grep -q "$found_device" /proc/swaps || grep -q "$found_device" /proc/mounts || { + [ "$enabled" -eq 1 ] && swapon "$found_device" | tee /proc/self/fd/2 | logger -t 'fstab' + } + fi + return 0 + } + config_get_swap "$cfg" + reset_block_cb +} + + Index: package/e2fsprogs/Makefile =================================================================== --- package/e2fsprogs/Makefile (revision 19533) +++ package/e2fsprogs/Makefile (working copy) @@ -155,8 +155,10 @@ ln -sf mke2fs $(1)/usr/sbin/mkfs.ext4 $(INSTALL_DIR) $(1)/usr/lib $(CP) $(foreach lib,com_err e2p,$(PKG_INSTALL_DIR)/usr/lib/lib$(lib).so.*) $(1)/usr/lib/ - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/e2fsck.init $(1)/etc/init.d/e2fsck + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/e2fsck.uci-defaults $(1)/etc/uci-defaults/e2fsck + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/e2fsck.sh $(1)/lib/functions/block/ endef @@ -173,6 +175,8 @@ define Package/libblkid/install $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/libblkid.so.* $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/blkid.uci-defaults $(1)/etc/uci-defaults/blkid endef define Package/libext2fs/install @@ -198,6 +202,11 @@ define Package/blkid/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/blkid $(1)/usr/sbin/ + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/blkuci.sh $(1)/lib/functions/block/ + $(INSTALL_BIN) ./files/blkmount.sh $(1)/lib/functions/block/ + $(INSTALL_BIN) ./files/blkfsck.sh $(1)/lib/functions/block/ + $(INSTALL_BIN) ./files/blkswap.sh $(1)/lib/functions/block/ endef $(eval $(call BuildPackage,e2fsprogs)) Index: package/util-linux-ng/files/swap.sh =================================================================== --- package/util-linux-ng/files/swap.sh (revision 0) +++ package/util-linux-ng/files/swap.sh (revision 0) @@ -0,0 +1,35 @@ +#!/bin/sh +# Copyright 2010 Vertical Communications + +libmount_is_swap_device() { + return 0 +} + +config_swapon_by_section() { + local cfg="$1" + + swap_cb() { + local cfg="$1" + local device="$3" + local enabled="$4" + local uuid="$5" + local label="$6" + + [ -n "$uuid" ] && logger -t 'fstab' "uuid specified for swap device but required package blkid not installed" + [ -n "$label" ] && logger -t 'fstab' "label specified for swap device but required package blkid not installed" + + if [ -n "$device" ] && [ -e "$device" ]; then + config_create_swap_fstab_entry "$device" "$enabled" + grep -q "$device" /proc/swaps || grep -q "$device" /proc/mounts || { + [ "$enabled" -eq 1 ] && swapon "$device" | tee /proc/self/fd/2 | logger -t 'fstab' + } + fi + return 0 + } + config_get_swap "$cfg" + reset_block_cb +} + +config_load_block_plugins swap_plugin + + Index: package/util-linux-ng/files/swap.uci-defaults =================================================================== --- package/util-linux-ng/files/swap.uci-defaults (revision 0) +++ package/util-linux-ng/files/swap.uci-defaults (revision 0) @@ -0,0 +1,6 @@ +#!/bin/sh + +cfgsect="$(uci add fstab plugin)" +uci set fstab."$cfgsect".plugin_path="/lib/functions/block/swap.sh" +uci commit + Index: package/util-linux-ng/Makefile =================================================================== --- package/util-linux-ng/Makefile (revision 19533) +++ package/util-linux-ng/Makefile (working copy) @@ -144,6 +144,10 @@ $(INSTALL_DIR) $(1)/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/disk-utils/mkswap $(PKG_BUILD_DIR)/mount/swapon $(1)/sbin/ ln -sf swapon $(1)/sbin/swapoff + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/swap.uci-defaults $(1)/etc/uci-defaults/swap-utils + $(INSTALL_DIR) $(1)/lib/functions/block + $(INSTALL_BIN) ./files/swap.sh $(1)/lib/functions/block/ endef define Package/hwclock/install
signature.asc
Description: This is a digitally signed message part
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel