#! /bin/sh ### BEGIN INIT INFO # Provides: umountnfs # Required-Start: # Required-Stop: umountfs # Should-Stop: $network $portmap nfs-common # Default-Start: # Default-Stop: 0 6 # Short-Description: Unmount all network filesystems except the root fs. # Description: Also unmounts all virtual filesystems (proc, # devpts, usbfs, sysfs) that are not mounted at the # top level. ### END INIT INFO global PATH := '/sbin:/usr/sbin:/bin:/usr/bin' global KERNEL := $[uname -s] global RELEASE := $[uname -r] source /lib/init/vars.sh source /lib/lsb/init-functions matchstr "$(KERNEL):$(RELEASE)" { Linux:[01].*|Linux:2.[01].* { global FLAGS := ''"" } Linux:2.[23].*|Linux:2.4.?|Linux:2.4.?-*|Linux:2.4.10|Linux:2.4.10-* { global FLAGS := '"-f'" } * { global FLAGS := '"-f -l'" } } proc do_stop { # Write a reboot record to /var/log/wtmp before unmounting halt -w # Remove bootclean flag files (precaution against symlink attacks) rm -f /tmp/.clean /run/.clean /run/lock/.clean # # Make list of points to unmount in reverse order of their creation # global DIRS := ''"" while read -r DEV MTPT FSTYPE OPTS REST { matchstr $MTPT { /|/proc|/dev|/dev/pts|/dev/shm|/proc/*|/sys|/run|/run/* { continue } } matchstr $FSTYPE { nfs|nfs4|smbfs|ncp|ncpfs|cifs|coda|ocfs2|gfs|ceph { global DIRS := ""$MTPT $DIRS"" } proc|procfs|linprocfs|devpts|usbfs|usbdevfs|sysfs { global DIRS := ""$MTPT $DIRS"" } } matchstr $OPTS { _netdev|*,_netdev|_netdev,*|*,_netdev,* { global DIRS := ""$MTPT $DIRS"" } } } < /etc/mtab if test $DIRS { test $VERBOSE = no || log_action_begin_msg "Unmounting remote and non-toplevel virtual filesystems" fstab-decode umount $FLAGS $DIRS global ES := $Status test $VERBOSE = no || log_action_end_msg $ES } # emit unmounted-remote-filesystems hook point so any upstart jobs # that support remote filesystems can be stopped if test -x /sbin/initctl { initctl --quiet emit unmounted-remote-filesystems !2 >/dev/null || true } } matchstr $1 { start|status { # No-op } restart|reload|force-reload { echo "Error: argument '$1' not supported" > !2 exit 3 } stop|"" { do_stop } * { echo "Usage: umountnfs.sh [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: [40] ) ] spids: [40] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:KERNEL) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children:[(C {(uname)} {(-s)})]) left_token: spids: [51 55] ) ) } spids: [49] ) ] spids: [49] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RELEASE) op: Equal rhs: { (DQ (CommandSubPart command_list: (CommandList children:[(C {(uname)} {(-r)})]) left_token: spids: [60 64] ) ) } spids: [58] ) ] spids: [58] ) (C {(.)} {(/lib/init/vars.sh)}) (C {(.)} {(/lib/lsb/init-functions)}) (Case to_match: {(DQ (${ VSub_Name KERNEL) (":") (${ VSub_Name RELEASE))} arms: [ (case_arm pat_list: [ {(Linux) (Lit_Other ":") (Lit_Other "[") (01) (Lit_Other "]") (.) (Lit_Other "*")} {(Linux) (Lit_Other ":") (2.) (Lit_Other "[") (01) (Lit_Other "]") (.) (Lit_Other "*")} ] action: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:FLAGS) op:Equal rhs:{(DQ )} spids:[111])] spids: [111] ) ] spids: [92 108 116 -1] ) (case_arm pat_list: [ {(Linux) (Lit_Other ":") (2.) (Lit_Other "[") (23) (Lit_Other "]") (.) (Lit_Other "*")} {(Linux) (Lit_Other ":") (2.4.) (Lit_Other "?")} {(Linux) (Lit_Other ":") (2.4.) (Lit_Other "?") (-) (Lit_Other "*")} {(Linux) (Lit_Other ":") (2.4.10)} {(Linux) (Lit_Other ":") (2.4.10-) (Lit_Other "*")} ] action: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:FLAGS) op:Equal rhs:{(DQ (-f))} spids:[151])] spids: [151] ) ] spids: [119 148 157 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:FLAGS) op: Equal rhs: {(DQ ("-f -l"))} spids: [164] ) ] spids: [164] ) ] spids: [160 161 170 -1] ) ] spids: [77 89 172] ) (FuncDef name: do_stop body: (BraceGroup children: [ (C {(halt)} {(-w)}) (C {(rm)} {(-f)} {(/tmp/.clean)} {(/run/.clean)} {(/run/lock/.clean)}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:DIRS) op:Equal rhs:{(DQ )} spids:[222])] spids: [222] ) (While cond: [(C {(read)} {(-r)} {(DEV)} {(MTPT)} {(FSTYPE)} {(OPTS)} {(REST)})] body: (DoGroup children: [ (Case to_match: {(DQ ($ VSub_Name "$MTPT"))} arms: [ (case_arm pat_list: [ {(/)} {(/proc)} {(/dev)} {(/dev/pts)} {(/dev/shm)} {(/proc/) (Lit_Other "*")} {(/sys)} {(/run)} {(/run/) (Lit_Other "*")} ] action: [(ControlFlow token:)] spids: [256 275 281 -1] ) ] spids: [247 253 284] ) (Case to_match: {(DQ ($ VSub_Name "$FSTYPE"))} arms: [ (case_arm pat_list: [ {(nfs)} {(nfs4)} {(smbfs)} {(ncp)} {(ncpfs)} {(cifs)} {(coda)} {(ocfs2)} {(gfs)} {(ceph)} ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DIRS) op: Equal rhs: {(DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$DIRS"))} spids: [318] ) ] spids: [318] ) ] spids: [296 315 326 -1] ) (case_arm pat_list: [ {(proc)} {(procfs)} {(linprocfs)} {(devpts)} {(usbfs)} {(usbdevfs)} {(sysfs)} ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DIRS) op: Equal rhs: {(DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$DIRS"))} spids: [345] ) ] spids: [345] ) ] spids: [329 342 353 -1] ) ] spids: [287 293 356] ) (Case to_match: {(DQ ($ VSub_Name "$OPTS"))} arms: [ (case_arm pat_list: [ {(_netdev)} {(Lit_Other "*") (Lit_Comma ",") (_netdev)} {(_netdev) (Lit_Comma ",") (Lit_Other "*")} {(Lit_Other "*") (Lit_Comma ",") (_netdev) (Lit_Comma ",") (Lit_Other "*")} ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DIRS) op: Equal rhs: {(DQ ($ VSub_Name "$MTPT") (" ") ($ VSub_Name "$DIRS"))} spids: [386] ) ] spids: [386] ) ] spids: [368 383 394 -1] ) ] spids: [359 365 397] ) ] spids: [244 400] ) redirects: [(Redir op_id:Redir_Less fd:-1 arg_word:{(/etc/mtab)} spids:[402])] ) (If arms: [ (if_arm cond: [(C {(Lit_Other "[")} {(DQ ($ VSub_Name "$DIRS"))} {(Lit_Other "]")})] action: [ (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) (C {(log_action_begin_msg)} {(DQ ("Unmounting remote and non-toplevel virtual filesystems"))} ) ] op_id: Op_DPipe ) (C {(fstab-decode)} {(umount)} {($ VSub_Name "$FLAGS")} {($ VSub_Name "$DIRS")}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:ES) op: Equal rhs: {($ VSub_QMark "$?")} spids: [452] ) ] spids: [452] ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$VERBOSE"))} {(Lit_Other "=")} {(no)} {(Lit_Other "]")} ) (C {(log_action_end_msg)} {($ VSub_Name "$ES")}) ] op_id: Op_DPipe ) ] spids: [-1 419] ) ] spids: [-1 475] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {(-x)} {(/sbin/initctl)} {(Lit_Other "]")}) terminator: ) ] action: [ (AndOr children: [ (SimpleCommand words: [{(initctl)} {(--quiet)} {(emit)} {(unmounted-remote-filesystems)}] redirects: [ (Redir op_id: Redir_Great fd: 2 arg_word: {(/dev/null)} spids: [509] ) ] ) (C {(true)}) ] op_id: Op_DPipe ) ] spids: [-1 498] ) ] spids: [-1 517] ) ] spids: [180] ) spids: [175 179] ) (Case to_match: {(DQ ($ VSub_Number "$1"))} arms: [ (case_arm pat_list:[{(start)}{(status)}] spids:[531534541-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:[560])] ) (C {(exit)} {(3)}) ] spids: [544 549 569 -1] ) (case_arm pat_list:[{(stop)}{(DQ )}] action:[(C {(do_stop)})] spids:[572576582-1]) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (SimpleCommand words: [{(echo)} {(DQ ("Usage: umountnfs.sh [start|stop]"))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[595])] ) (C {(exit)} {(3)}) ] spids: [585 586 604 -1] ) ] spids: [522 528 606] ) (C {(Lit_Other ":")}) ] )