#! /bin/sh ### BEGIN INIT INFO # Provides: umountfs # Required-Start: # Required-Stop: umountroot # Default-Start: # Default-Stop: 0 6 # Short-Description: Turn off swap and unmount all local file systems. # Description: ### END INIT INFO global PATH := '/sbin:/usr/sbin:/bin:/usr/bin' source /lib/init/vars.sh source /lib/lsb/init-functions umask 022 proc do_stop { global PROTECTED_MOUNTS := $[sed -n ':a;/^[^ ]* \/ /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts] global WEAK_MTPTS := ''"" # be gentle, don't use force global REG_MTPTS := ''"" global TMPFS_MTPTS := ''"" while read -r DEV MTPT FSTYPE REST { echo $PROTECTED_MOUNTS | grep -qs "^$DEV $MTPT " && continue matchstr $MTPT { /|/proc|/dev|/.dev|/dev/pts|/dev/shm|/dev/.static/dev|/proc/*|/sys|/sys/*|/run|/run/*|/dev/vcs { continue } } matchstr $FSTYPE { proc|procfs|linprocfs|sysfs|usbfs|usbdevfs|devpts { continue } tmpfs { global TMPFS_MTPTS := ""$MTPT $TMPFS_MTPTS"" } * { if echo $PROTECTED_MOUNTS | grep -qs "^$DEV " { global WEAK_MTPTS := ""$MTPT $WEAK_MTPTS"" } else { global REG_MTPTS := ""$MTPT $REG_MTPTS"" } } } } < /proc/mounts # # Make sure tmpfs file systems are umounted before turning off # swap, to avoid running out of memory if the tmpfs filesystems # use a lot of space. # if test $TMPFS_MTPTS { if test $VERBOSE = no { log_action_begin_msg "Unmounting temporary filesystems" fstab-decode umount $TMPFS_MTPTS log_action_end_msg $Status } else { log_daemon_msg "Will now unmount temporary filesystems" fstab-decode umount -v $TMPFS_MTPTS log_end_msg $Status } } # # Deactivate swap # if test $VERBOSE = no { log_action_begin_msg "Deactivating swap" swapoff -a >/dev/null log_action_end_msg $Status } else { log_daemon_msg "Will now deactivate swap" swapoff -a -v log_end_msg $Status } # # Unmount local filesystems # if test $WEAK_MTPTS { # Do not use -f umount option for WEAK_MTPTS if test $VERBOSE = no { log_action_begin_msg "Unmounting weak filesystems" fstab-decode umount -r -d $WEAK_MTPTS log_action_end_msg $Status } else { log_daemon_msg "Will now unmount weak filesystems" fstab-decode umount -v -r -d $WEAK_MTPTS log_end_msg $Status } } if test $REG_MTPTS { if test $VERBOSE = no { log_action_begin_msg "Unmounting local filesystems" fstab-decode umount -f -r -d $REG_MTPTS log_action_end_msg $Status } else { log_daemon_msg "Will now unmount local filesystems" fstab-decode umount -f -v -r -d $REG_MTPTS log_end_msg $Status } } } matchstr $1 { start|status { # No-op } restart|reload|force-reload { echo "Error: argument '$1' not supported" > !2 exit 3 } stop { do_stop } * { echo "Usage: $0 start|stop" > !2 exit 3 } } : (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:PATH) op: Equal rhs: {(/sbin) (Lit_Other ":") (/usr/sbin) (Lit_Other ":") (/bin) (Lit_Other ":") (/usr/bin)} spids: [31] ) ] spids: [31] ) (C {(.)} {(/lib/init/vars.sh)}) (C {(.)} {(/lib/lsb/init-functions)}) (C {(umask)} {(022)}) (FuncDef name: do_stop body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:PROTECTED_MOUNTS) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children: [ (C {(sed)} {(-n)} {(SQ <":a;/^[^ ]* \\/ /!{H;n;ba};{H;s/.*//;x;s/\\n//;p}">)} {(/proc/mounts)} ) ] ) left_token: spids: [65 75] ) ) } spids: [63] ) ] spids: [63] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:WEAK_MTPTS) op:Equal rhs:{(DQ )} spids:[79])] spids: [79] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:REG_MTPTS) op:Equal rhs:{(DQ )} spids:[87])] spids: [87] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:TMPFS_MTPTS) op:Equal rhs:{(DQ )} spids:[92])] spids: [92] ) (While cond: [(C {(read)} {(-r)} {(DEV)} {(MTPT)} {(FSTYPE)} {(REST)})] body: (DoGroup children: [ (AndOr children: [ (Pipeline children: [ (C {(echo)} {(DQ ($ VSub_Name "$PROTECTED_MOUNTS"))}) (C {(grep)} {(-qs)} {(DQ ("^") ($ VSub_Name "$DEV") (" ") ($ VSub_Name "$MTPT") (" "))} ) ] negated: False ) (ControlFlow token:) ] op_id: Op_DAmp ) (Case to_match: {(DQ ($ VSub_Name "$MTPT"))} arms: [ (case_arm pat_list: [ {(/)} {(/proc)} {(/dev)} {(/.dev)} {(/dev/pts)} {(/dev/shm)} {(/dev/.static/dev)} {(/proc/) (Lit_Other "*")} {(/sys)} {(/sys/) (Lit_Other "*")} {(/run)} {(/run/) (Lit_Other "*")} {(/dev/vcs)} ] action: [(ControlFlow token:)] spids: [149 177 183 -1] ) ] spids: [140 146 186] ) (Case to_match: {(DQ ($ VSub_Name "$FSTYPE"))} arms: [ (case_arm pat_list: [ {(proc)} {(procfs)} {(linprocfs)} {(sysfs)} {(usbfs)} {(usbdevfs)} {(devpts)} ] action: [(ControlFlow token:)] spids: [198 211 217 -1] ) (case_arm pat_list: [{(tmpfs)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:TMPFS_MTPTS) op: Equal rhs: {(DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$TMPFS_MTPTS"))} spids: [224] ) ] spids: [224] ) ] spids: [220 221 232 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [ (C {(echo)} {(DQ ($ VSub_Name "$PROTECTED_MOUNTS"))}) (C {(grep)} {(-qs)} {(DQ ("^") ($ VSub_Name "$DEV") (" "))}) ] negated: False ) terminator: ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:WEAK_MTPTS) op: Equal rhs: { (DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$WEAK_MTPTS") ) } spids: [263] ) ] spids: [263] ) ] spids: [-1 260] ) ] else_action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:REG_MTPTS) op: Equal rhs: {(DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$REG_MTPTS"))} spids: [274] ) ] spids: [274] ) ] spids: [271 282] ) ] spids: [235 236 285 -1] ) ] spids: [189 195 288] ) ] spids: [112 291] ) redirects: [(Redir op_id:Redir_Less fd:-1 arg_word:{(/proc/mounts)} spids:[293])] ) (If arms: [ (if_arm cond: [(C {(Lit_Other "[")} {(DQ ($ VSub_Name "$TMPFS_MTPTS"))} {(Lit_Other "]")})] action: [ (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) ] action: [ (C {(log_action_begin_msg)} {(DQ ("Unmounting temporary filesystems"))}) (C {(fstab-decode)} {(umount)} {($ VSub_Name "$TMPFS_MTPTS")}) (C {(log_action_end_msg)} {($ VSub_QMark "$?")}) ] spids: [-1 348] ) ] else_action: [ (C {(log_daemon_msg)} {(DQ ("Will now unmount temporary filesystems"))}) (C {(fstab-decode)} {(umount)} {(-v)} {($ VSub_Name "$TMPFS_MTPTS")}) (C {(log_end_msg)} {($ VSub_QMark "$?")}) ] spids: [370 394] ) ] spids: [-1 330] ) ] spids: [-1 397] ) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) ] action: [ (C {(log_action_begin_msg)} {(DQ ("Deactivating swap"))}) (SimpleCommand words: [{(swapoff)} {(-a)}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[442])] ) (C {(log_action_end_msg)} {($ VSub_QMark "$?")}) ] spids: [-1 428] ) ] else_action: [ (C {(log_daemon_msg)} {(DQ ("Will now deactivate swap"))}) (C {(swapoff)} {(-a)} {(-v)}) (C {(log_end_msg)} {($ VSub_QMark "$?")}) ] spids: [451 473] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$WEAK_MTPTS"))} {(Lit_Other "]")}) terminator: ) ] action: [ (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) ] action: [ (C {(log_action_begin_msg)} {(DQ ("Unmounting weak filesystems"))}) (C {(fstab-decode)} {(umount)} {(-r)} {(-d)} {($ VSub_Name "$WEAK_MTPTS")}) (C {(log_action_end_msg)} {($ VSub_QMark "$?")}) ] spids: [-1 522] ) ] else_action: [ (C {(log_daemon_msg)} {(DQ ("Will now unmount weak filesystems"))}) (C {(fstab-decode)} {(umount)} {(-v)} {(-r)} {(-d)} {($ VSub_Name "$WEAK_MTPTS")}) (C {(log_end_msg)} {($ VSub_QMark "$?")}) ] spids: [548 576] ) ] spids: [-1 500] ) ] spids: [-1 579] ) (If arms: [ (if_arm cond: [(C {(Lit_Other "[")} {(DQ ($ VSub_Name "$REG_MTPTS"))} {(Lit_Other "]")})] action: [ (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) ] action: [ (C {(log_action_begin_msg)} {(DQ ("Unmounting local filesystems"))}) (C {(fstab-decode)} {(umount)} {(-f)} {(-r)} {(-d)} {($ VSub_Name "$REG_MTPTS")} ) (C {(log_action_end_msg)} {($ VSub_QMark "$?")}) ] spids: [-1 611] ) ] else_action: [ (C {(log_daemon_msg)} {(DQ ("Will now unmount local filesystems"))}) (C {(fstab-decode)} {(umount)} {(-f)} {(-v)} {(-r)} {(-d)} {($ VSub_Name "$REG_MTPTS")} ) (C {(log_end_msg)} {($ VSub_QMark "$?")}) ] spids: [639 669] ) ] spids: [-1 593] ) ] spids: [-1 672] ) ] spids: [60] ) spids: [55 59] ) (Case to_match: {(DQ ($ VSub_Number "$1"))} arms: [ (case_arm pat_list:[{(start)}{(status)}] spids:[686689696-1]) (case_arm pat_list: [{(restart)} {(reload)} {(force-reload)}] action: [ (SimpleCommand words: [{(echo)} {(DQ ("Error: argument '") ($ VSub_Number "$1") ("' not supported"))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[715])] ) (C {(exit)} {(3)}) ] spids: [699 704 724 -1] ) (case_arm pat_list:[{(stop)}] action:[(C {(do_stop)})] spids:[727728734-1]) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (SimpleCommand words: [{(echo)} {(DQ ("Usage: ") ($ VSub_Number "$0") (" start|stop"))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[749])] ) (C {(exit)} {(3)}) ] spids: [737 738 758 -1] ) ] spids: [677 683 760] ) (C {(Lit_Other ":")}) ] )