Whamcloud - gitweb
a98df4b8bd549e850ff9fb4f1a17f67e22abe9c3
[fs/lustre-release.git] / lustre / scripts / lnet
1 #!/bin/bash
2 #
3 # lnet  This shell script takes care of starting and stopping
4 #       the lnet (Lustre networking) services.
5 #
6 # chkconfig: - 59 76
7 # description:  Part of the lustre file system.
8 # probe: true
9 # config: /etc/sysconfig/lnet
10
11 # Source function library.
12 [ -f /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
13
14 # Source networking configuration and check that networking is up.
15 [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network && \
16 [ "${NETWORKING}" = "no" ] && exit 0
17
18 # Check for and source configuration file otherwise set defaults
19 [ -f /etc/sysconfig/lnet ] && . /etc/sysconfig/lnet
20
21 declare -r awkprog='BEGIN { rc = -1 }
22                        { if ( $1 == module_name ) { rc = $3; exit; } }
23                     END { print rc }'
24
25 # Usage: run_preexec_check [ start | restart | condrestart ]
26 # The single parameter will be passed to the PREEXEC_SCRIPT
27 run_preexec_check ()
28 {
29         if [ -n "$PREEXEC_CHECK" ] && ! $PREEXEC_CHECK ; then
30                 echo "Pre-exec check \"$PREEXEC_CHECK\" failed.  Aborting."
31                 exit 1
32         fi
33
34         if [ -n "$PREEXEC_SCRIPT" ] && ! "$PREEXEC_SCRIPT" "$1" ; then
35                 echo "Pre-exec script \"$PREEXEC_SCRIPT\" failed.  Aborting."
36                 exit 1
37         fi
38 }
39
40 # Usage: run_postexec_check [ start | restart | condrestart ]
41 # The single parameter will be passed to the POSTEXEC_SCRIPT
42 run_postexec_check ()
43 {
44         if [ -n "$POSTEXEC_CHECK" ] && ! $POSTEXEC_CHECK ; then
45                 echo "Post-exec check \"$POSTEXEC_CHECK\" failed.  Aborting."
46                 exit 1
47         fi
48
49         if [ -n "$POSTEXEC_SCRIPT" ] && ! "$POSTEXEC_SCRIPT" "$1" ; then
50                 echo "Post-exec script \"$POSTEXEC_SCRIPT\" failed.  Aborting."
51                 exit 1
52         fi
53 }
54
55 stop_lnet ()
56 {
57         local errmsg=$(/usr/sbin/lctl network down 2>&1)
58         if [ $? -gt 0 ]; then
59                 # The following error message means that lnet is already
60                 # unconfigured, and the modules are not loaded.
61                 echo $errmsg | grep "LNET unconfigure error 19" > /dev/null
62                 if [ $? -gt 0 ]; then
63                         return 0
64                 else
65                         echo "$errmsg"
66                         return 1
67                 fi
68         fi
69         return 0
70 }
71
72 status ()
73 {
74         old_nullglob="`shopt -p nullglob`"
75         shopt -u nullglob
76
77         STATE="stopped"
78         # LSB compliance - return 3 if service is not running
79         # Lustre-specific returns
80         # 150 - partial startup
81         # 151 - health_check unhealthy
82         # 152 - LBUG
83         RETVAL=3
84         egrep -q "lnet" /proc/modules && STATE="loaded"
85
86         # check for any routes - on a portals router this is the only thing
87         VAR=$(lctl get_param -n routes 2>&1)
88         if [ $? = 0 ] ; then
89                 STATE="running"
90                 RETVAL=0
91         fi
92
93         # check if this is a router
94         if [[ "$(lctl get_param -n routes)" =~ "Routing enabled" ]]; then
95                 STATE="running"
96                 RETVAL=0
97         fi
98
99         # check for error in health_check
100         local health_check=$(lctl get_param -n health_check)
101         if [[ "$health_check" =~ "NOT HEALTHY" ]]; then
102                 STATE="unhealthy"
103                 RETVAL=1
104         fi
105
106         if [[ "$health_check" =~ "LBUG" ]]; then
107                 STATE="LBUG"
108                 RETVAL=152
109         fi
110
111         echo $STATE
112         eval $old_nullglob
113 }
114
115 LUSTRE_ROUTES_CONFIG_FILE="/etc/sysconfig/lnet_routes.conf"
116 LUSTRE_LNET_CONFIG_FILE="/etc/sysconfig/lnet.conf"
117 LUSTRE_LNET_CONFIG_UTILITY="/usr/sbin/lnetctl"
118
119 # See how we were called.
120 case "$1" in
121   start)
122         run_preexec_check "start"
123         touch /var/lock/subsys/lnet
124         modprobe lnet || exit 1
125         lctl network up || exit 1
126         # if a routes config file is given then use it to configure the
127         # routes if not then default to LUSTRE_ROUTES_CONFIG_FILE
128         if [ -f "$2" ]; then
129                 lustre_routes_config $2
130         elif [ -f "$LUSTRE_ROUTES_CONFIG_FILE" ]; then
131                 lustre_routes_config $LUSTRE_ROUTES_CONFIG_FILE
132         fi
133         # if an lnet.conf file exists then pass that to the lnetctl
134         # utility for parsing.  This will configure the items defined
135         # in YAML format in the config file.
136         if [ -f $LUSTRE_LNET_CONFIG_UTILITY ] && [ -f "$LUSTRE_LNET_CONFIG_FILE" ]; then
137                 $LUSTRE_LNET_CONFIG_UTILITY $LUSTRE_LNET_CONFIG_FILE
138         fi
139         run_postexec_check "start"
140         ;;
141   stop)
142         run_preexec_check "stop"
143         stop_lnet || exit 1
144         lustre_rmmod || exit 1
145         rm -f /var/lock/subsys/lnet
146         run_postexec_check "stop"
147         ;;
148   status)
149         status
150         ;;
151   restart)
152         $0 stop
153         $0 start
154         ;;
155   reload)
156         touch /var/lock/subsys/lnet
157         ;;
158   probe)
159         if [ ! -f /var/lock/subsys/lnet ] ; then
160           echo $"start"; exit 0
161         fi
162         ;;
163   condrestart)
164         [ -f /var/lock/subsys/lnet ] && {
165                 $0 stop
166                 $0 start
167         }
168         ;;
169   *)
170         echo $"Usage: lustre {start|stop|status|restart|reload|condrestart}"
171         exit 1
172 esac
173
174 exit 0