]>
Commit | Line | Data |
---|---|---|
ec1d83db JR |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright 1999 American Power Conversion, All Rights Reserved | |
4 | # | |
5 | # Description: This file is used to configure PowerChute Plus | |
6 | # for Linux. | |
7 | # | |
8 | # Usage: ./Config - will configure PowerChute PLUS after | |
9 | # installing it from an RPM archive | |
10 | # | |
11 | # | |
12 | ||
13 | ################### | |
14 | # Global Constants | |
15 | ################### | |
16 | # -------------------------------------------------------------------------- | |
17 | # Do not change definitons for TRUE and FALSE from below, or '&&' shell logic | |
18 | # will fail. TRUE=0 and FALSE!=0 is shell convention | |
19 | # -------------------------------------------------------------------------- | |
20 | FALSE=1 | |
21 | TRUE=0 | |
22 | ||
23 | YES=0 | |
24 | NO=1 | |
25 | QUIT=2 | |
26 | INVALID=99 | |
27 | ||
28 | SMART="smart" | |
29 | SIMPLE="simple" | |
30 | PNP="PNP" | |
31 | NORMAL="Normal" | |
32 | ||
33 | NOT_SYM1="Bad battery" | |
34 | SYM="" | |
35 | NOT_SYM2="UPS on bypass" | |
36 | SYM2="UPS" | |
37 | NOT_SYM3="" | |
38 | SYM10="TimeOutFactor = 20" | |
39 | SYM11="UPS system is in maintenance bypass set by switch" | |
40 | NOT_SYM4="UPS on bypass: user set via rear switch" | |
41 | SYM5="Actions = LUS" | |
42 | NOT_SYM5="Actions = LU" | |
43 | ||
44 | FULL_PROD_NAME="PowerChute Plus for Unix" | |
45 | PROD_HEADER="4.5.2" | |
46 | INST_SCRIPT_NAME=$0 | |
47 | LINUX_INTEL_STRING="Linux" | |
48 | OS_NAME="$LINUX_INTEL_STRING" | |
49 | MONO_WARN_COLOR_STRING="WarningColor = LightGray" | |
50 | MONO_ERR_COLOR_STRING="ErrorColor = LightGray" | |
51 | TTY1="/dev/ttyS0" | |
52 | TTY2="/dev/ttyS1" | |
53 | SHUTDOWN_SEARCH_STRING="swapoff -a" | |
54 | STARTUP_FILE_PATH="/etc/rc.d/init.d" | |
55 | STARTUP_FILE="$STARTUP_FILE_PATH/upsd" | |
56 | STARTUP_RC_PATH="/etc/rc.d" | |
57 | MODEM_ALLOWED_PORT_NAMES="/dev/modem,/dev/ttyS0,/dev/ttyS1" | |
58 | MODEM_PORT_NAME="/dev/modem" | |
59 | SHUTDOWN_FILE="/etc/rc.d/init.d/halt" | |
60 | SHUTDOWN_FILE_BACKUP="/usr/lib/powerchute/halt" | |
61 | SHUTDOWN_COMMAND_STRING="if [ -r /upsoff.cmd ] #POWERCHUTE\\ | |
62 | then #POWERCHUTE\\ | |
63 | . ./upsoff.cmd >/dev/null #POWERCHUTE\\ | |
64 | rm -f /upsoff.cmd #POWERCHUTE\\ | |
65 | fi #POWERCHUTE\\ | |
66 | " | |
67 | ||
68 | ||
69 | COMM_VERIFIED=$FALSE | |
70 | IS_MODEM_PORT=$FALSE | |
71 | IS_LOCAL_PORT=$FALSE | |
72 | SKIP_PORT_VERIFICATION=$FALSE | |
73 | ||
74 | # Variables that start uninitialized | |
75 | ALLOWED_PORT_NAMES= | |
76 | APC_HARDWARE_PROD= | |
77 | CABLE_TYPE= | |
78 | INST_HARDWARE= | |
79 | INST_TTY= | |
80 | MEASURE_UPS= | |
81 | ROOT_USER= | |
82 | RUN_COMMAND_FILES_AS_ROOT= | |
83 | SEND_EMAIL_AS_ROOT= | |
84 | SIGNAL_TYPE= | |
85 | UI_MONO_COLOR_SCHEME= | |
86 | USE_TCP= | |
87 | VALID_TTY_SELECTED= | |
88 | WEB_BROWSER= | |
89 | ||
90 | ####################### | |
91 | # Functions used below | |
92 | ####################### | |
93 | ||
94 | ########################################################################### | |
95 | # IsYN handles Yes No responses | |
96 | ########################################################################### | |
97 | Echo() { | |
98 | ||
99 | tmp_name=`uname -s` | |
100 | string="$1" | |
101 | ||
102 | if [ "$tmp_name" = "Linux" ] | |
103 | then | |
104 | echo -e "$string" | |
105 | elif [ -r /usr/5bin/echo ] | |
106 | then | |
107 | /usr/5bin/echo "$string" | |
108 | else | |
109 | echo "$string" | |
110 | fi | |
111 | } | |
112 | ||
113 | ||
114 | echo_line() { | |
115 | Echo "----------------------------------------------------------------------------" | |
116 | } | |
117 | ||
118 | ||
119 | ||
120 | HitAnyKey() { | |
121 | default="Press Enter to continue" | |
122 | string=${1:-$default} | |
123 | Echo "$string \\c" | |
124 | read tmp_strike | |
125 | } | |
126 | ||
127 | ||
128 | beep() { | |
129 | Echo "\a\\c" | |
130 | } | |
131 | ||
132 | IsYN(){ | |
133 | VALID_YN=$FALSE | |
134 | YN= | |
135 | rval= | |
136 | Echo "[y/n] \\c" | |
137 | read YN | |
138 | if [ -z "$YN" ] | |
139 | then | |
140 | VALID_YN=$FALSE | |
141 | rval=$INVALID | |
142 | else | |
143 | case "$YN" in | |
144 | [Yy]*) | |
145 | VALID_YN=$TRUE | |
146 | rval=$YES | |
147 | ;; | |
148 | [Nn]*) | |
149 | VALID_YN=$TRUE | |
150 | rval=$NO | |
151 | ;; | |
152 | *) | |
153 | VALID_YN=$FALSE | |
154 | rval=$INVALID | |
155 | ;; | |
156 | esac | |
157 | fi | |
158 | if [ $rval -eq $INVALID ] | |
159 | then | |
160 | beep | |
161 | Echo "Invalid Response..." | |
162 | fi | |
163 | return $rval | |
164 | } | |
165 | ||
166 | ||
167 | IsYNLoop() { | |
168 | rval=$INVALID | |
169 | query_string="$1" | |
170 | valid_response=$FALSE | |
171 | while [ $valid_response -eq $FALSE ] | |
172 | do | |
173 | Echo "$query_string \\c" | |
174 | IsYN | |
175 | rval=$? | |
176 | case "$rval" in | |
177 | $YES|$NO) | |
178 | valid_response=$TRUE | |
179 | ;; | |
180 | esac | |
181 | done | |
182 | return $rval | |
183 | } | |
184 | ||
185 | CheckEepromUps() { | |
186 | ||
187 | eeprom=$1 | |
188 | dev_name=$2 | |
189 | set `./ups_adjust -in -d$dev_name -c$eeprom -t$CABLE_TYPE 2>/dev/null` | |
190 | while [ ! -z "$2" ] | |
191 | do | |
192 | if [ "$1" = "FV" ] | |
193 | then | |
194 | firmware="$2" | |
195 | elif [ "$1" = "2G+" ] | |
196 | then | |
197 | if [ "$2" = "TRUE" ] | |
198 | then | |
199 | Is2g=$TRUE | |
200 | else | |
201 | Is2g=$FALSE | |
202 | fi | |
203 | elif [ "$1" = "VAL" ] | |
204 | then | |
205 | current=$2 | |
206 | fi | |
207 | shift; | |
208 | shift; | |
209 | done | |
210 | if [ $Is2g -eq $TRUE ] | |
211 | then | |
212 | if [ `expr $current \> 20` -eq 1 ] | |
213 | then | |
214 | rval=$FALSE | |
215 | else | |
216 | rval=$TRUE | |
217 | fi | |
218 | else | |
219 | rval=$FALSE | |
220 | fi | |
221 | return $rval | |
222 | } | |
223 | ||
224 | CheckDipSwitches() { | |
225 | ||
226 | dev_name=$1 | |
227 | okay_flag=$FALSE | |
228 | rval=$FALSE | |
229 | ||
230 | while [ $okay_flag -eq $FALSE ] | |
231 | do | |
232 | set `./ups_adjust -sn -d$dev_name -c7 -t$CABLE_TYPE 2>/dev/null` | |
233 | if [ "$2" != "NA" ] | |
234 | then | |
235 | if [ -z "$2" ] || [ $2 -ne 0 ] | |
236 | then | |
237 | echo_line | |
238 | beep | |
239 | Echo "Your UPS will not accept an attempt to change its eeproms." | |
240 | Echo "If your UPS has dip switches on the back panel, check that they are all in" | |
241 | Echo "'On' position. After installation, you can set them back to their" | |
242 | Echo "original state if you wish." | |
243 | echo_line | |
244 | continue_loop_flag=$TRUE | |
245 | while [ $continue_loop_flag -eq $TRUE ] | |
246 | do | |
247 | Echo "Do you wish to Retry setting this value, or Continue on with" | |
248 | Echo "the installation? [R/C] \\c" | |
249 | read response | |
250 | if [ -z "$response" ] | |
251 | then | |
252 | beep | |
253 | Echo "Invalid response..." | |
254 | else | |
255 | case "$response" in | |
256 | [Cc]*) | |
257 | continue_loop_flag=$FALSE | |
258 | okay_flag=$TRUE | |
259 | ;; | |
260 | [Rr]*) | |
261 | continue_loop_flag=$FALSE | |
262 | okay_flag=$FALSE | |
263 | Echo | |
264 | ;; | |
265 | *) | |
266 | beep | |
267 | Echo "Invalid Response..." | |
268 | ;; | |
269 | esac | |
270 | fi | |
271 | done | |
272 | ||
273 | else | |
274 | okay_flag=$TRUE | |
275 | rval=$TRUE | |
276 | fi | |
277 | else | |
278 | okay_flag=$TRUE | |
279 | rval=$TRUE | |
280 | fi | |
281 | done | |
282 | return $rval | |
283 | } | |
284 | ||
285 | # This function takes an eeprom and a device name and | |
286 | # it determines the current setting of the eeprom and | |
287 | # returns this value. It returns -1 on error. | |
288 | GetCurrentEepromSetting() { | |
289 | eeprom=$1 | |
290 | dev_name=$2 | |
291 | ||
292 | ret_val="-1" | |
293 | set `./ups_adjust -in -d$dev_name -c$eeprom -t$CABLE_TYPE 2>/dev/null` | |
294 | ||
295 | while [ "$1" ] | |
296 | do | |
297 | if [ "$1" = "VAL" ] | |
298 | then | |
299 | if [ -n "$2" ] | |
300 | then | |
301 | ret_val="$2" | |
302 | fi | |
303 | fi | |
304 | shift | |
305 | done | |
306 | return $ret_val | |
307 | } | |
308 | ||
309 | ||
310 | # This functions takes an eeprom, a check value, and a device | |
311 | # name and it determines the next valid eeprom setting value | |
312 | # greater than the check value. | |
313 | GetNextEepromValueGreaterThan() { | |
314 | eeprom=$1 | |
315 | check_value=$2 | |
316 | dev_name=$3 | |
317 | ||
318 | ret_val=-1 | |
319 | starting_val=-1 | |
320 | GetCurrentEepromSetting $eeprom $dev_name | |
321 | starting_val="$?" | |
322 | ||
323 | if [ "$starting_val" -ne "-1" ] | |
324 | then | |
325 | done=$FALSE | |
326 | previous_val=$starting_val | |
327 | while [ $done -eq $FALSE ] | |
328 | do | |
329 | set `./ups_adjust -sn -d$dev_name -c$eeprom -t$CABLE_TYPE 2>/dev/null` | |
330 | if [ "$2" -eq "$starting_val" ] | |
331 | then | |
332 | done=$TRUE | |
333 | else | |
334 | if [ "$2" -gt "$check_value" ] | |
335 | then | |
336 | if [ "$2" -lt "$previous_val" ] | |
337 | then | |
338 | ret_val="$2" | |
339 | fi | |
340 | fi | |
341 | fi | |
342 | previous_val="$2" | |
343 | Echo ".\\c" | |
344 | done | |
345 | fi | |
346 | ||
347 | return $ret_val | |
348 | } | |
349 | ||
350 | ||
351 | CycleUntilAcceptableValue() { | |
352 | ||
353 | eeprom=$1 | |
354 | current_value=$2 | |
355 | desired_value=$3 | |
356 | dev_name=$4 | |
357 | okay_flag=$FALSE | |
358 | rval=$FALSE | |
359 | ||
360 | while [ $okay_flag -eq $FALSE ] | |
361 | do | |
362 | Echo ".\\c" | |
363 | set `./ups_adjust -sn -d$dev_name -c$eeprom -t$CABLE_TYPE 2>/dev/null` | |
364 | if [ "$2" -eq "$desired_value" ] | |
365 | then | |
366 | okay_flag=$TRUE | |
367 | rval=$TRUE | |
368 | elif [ "$2" -eq "$current_value" ] | |
369 | then | |
370 | #We either can't change the value, or we are back | |
371 | #where we started and our desired value never turned up | |
372 | okay_flag=$TRUE | |
373 | echo_line | |
374 | beep | |
375 | Echo "Unable to modify the value of this eeprom. If you are unable to" | |
376 | Echo "change this value through the powerchute user interface, refer to the UPS" | |
377 | Echo "manual, or contact APC Technical Support." | |
378 | echo_line | |
379 | HitAnyKey | |
380 | fi | |
381 | done | |
382 | Echo | |
383 | } | |
384 | ||
385 | CopyOutToIn() { | |
386 | cp /tmp/temp_ini.out /tmp/temp_ini.in | |
387 | } | |
388 | ||
389 | ||
390 | ####################################################################### | |
391 | # Trap signals so we can clean up temp files | |
392 | ####################################################################### | |
393 | ||
394 | trap 'Echo \\nsignal caught, Quitting.;exit' 1 2 15 | |
395 | ||
396 | # --------------------------------------------------------------------- | |
397 | # ----------------------------- Start --------------------------------- | |
398 | # --------------------------------------------------------------------- | |
399 | cd /usr/lib/powerchute | |
400 | ||
401 | ||
402 | ####################################################################### | |
403 | # Print Banner | |
404 | ####################################################################### | |
405 | Echo "-----------------------------------------------------------------------" | |
406 | Echo " PowerChute Plus for Linux v$PROD_HEADER Configuration Script" | |
407 | Echo " Copyright American Power Conversion 1999" | |
408 | Echo "-----------------------------------------------------------------------" | |
409 | Echo | |
410 | ||
411 | ####################################################################### | |
412 | # Verify root authority | |
413 | ####################################################################### | |
414 | ||
415 | root_string=`id | grep root` | |
416 | ||
417 | if [ -z "$root_string" ] | |
418 | then | |
419 | ROOT_USER=$FALSE | |
420 | echo_line | |
421 | beep | |
422 | Echo "$INST_SCRIPT_NAME must be run with root privileges!" | |
423 | echo_line | |
424 | echo_line | |
425 | IsYNLoop "Do you wish to continue anyway?" | |
426 | case "$?" in | |
427 | $NO) | |
428 | exit | |
429 | ;; | |
430 | esac | |
431 | else | |
432 | ROOT_USER=$TRUE | |
433 | fi | |
434 | ||
435 | ||
436 | ####################################################################### | |
437 | # Select an APC Hardware Product | |
438 | ####################################################################### | |
439 | ||
440 | VALID_HARDWARE_SELECTED=$FALSE | |
441 | INST_HARDWARE= | |
442 | while [ $VALID_HARDWARE_SELECTED -eq $FALSE ] | |
443 | do | |
444 | Echo | |
445 | Echo " 1) Matrix-UPS" | |
446 | Echo " 2) Smart-UPS" | |
447 | Echo " 3) Back-UPS" | |
448 | Echo " 4) Back-UPS Pro" | |
449 | Echo " 5) Symmetra Power Array" | |
450 | Echo " 6) Smart-UPS DP" | |
451 | Echo " " | |
452 | Echo "Which APC Hardware will $FULL_PROD_NAME be running with [?] \\c" | |
453 | read INST_HARDWARE | |
454 | case "$INST_HARDWARE" in | |
455 | 1) | |
456 | VALID_HARDWARE_SELECTED=$TRUE | |
457 | APC_HARDWARE_PROD="Matrix" | |
458 | SIGNAL_TYPE=$SMART | |
459 | CABLE_TYPE=$NORMAL | |
460 | SYMSTR1=$NOT_SYM1 | |
461 | SYMSTR2=$NOT_SYM2 | |
462 | SYMSTR13=$NOT_SYM3 | |
463 | SYMSTR14=$NOT_SYM4 | |
464 | SYMSTR3=$SYM5 | |
465 | ||
466 | ;; | |
467 | 2) | |
468 | VALID_HARDWARE_SELECTED=$TRUE | |
469 | APC_HARDWARE_PROD="SmartUps" | |
470 | SIGNAL_TYPE=$SMART | |
471 | CABLE_TYPE=$NORMAL | |
472 | SYMSTR1=$NOT_SYM1 | |
473 | SYMSTR2=$NOT_SYM2 | |
474 | SYMSTR13=$NOT_SYM3 | |
475 | SYMSTR14=$NOT_SYM4 | |
476 | SYMSTR3=$SYM5 | |
477 | ;; | |
478 | 3) | |
479 | VALID_HARDWARE_SELECTED=$TRUE | |
480 | APC_HARDWARE_PROD="BackUps" | |
481 | SIGNAL_TYPE=$SIMPLE | |
482 | CABLE_TYPE=$SIMPLE | |
483 | SYMSTR1=$NOT_SYM1 | |
484 | SYMSTR2=$NOT_SYM2 | |
485 | SYMSTR13=$NOT_SYM3 | |
486 | SYMSTR14=$NOT_SYM4 | |
487 | SYMSTR3=$SYM5 | |
488 | # No way to verify comm for simple sig, assume | |
489 | # OK to skip warning banner | |
490 | COMM_VERIFIED=$TRUE | |
491 | IS_MODEM_PORT=$TRUE | |
492 | ;; | |
493 | 4) | |
494 | VALID_HARDWARE_SELECTED=$TRUE | |
495 | APC_HARDWARE_PROD="SmartUps" | |
496 | SIGNAL_TYPE=$SMART | |
497 | CABLE_TYPE=$PNP | |
498 | SYMSTR1=$NOT_SYM1 | |
499 | SYMSTR2=$NOT_SYM2 | |
500 | SYMSTR13=$NOT_SYM3 | |
501 | SYMSTR14=$NOT_SYM4 | |
502 | SYMSTR3=$SYM5 | |
503 | ;; | |
504 | 5) | |
505 | VALID_HARDWARE_SELECTED=$TRUE | |
506 | APC_HARDWARE_PROD="Symmetra" | |
507 | SIGNAL_TYPE=$SMART | |
508 | CABLE_TYPE=$NORMAL | |
509 | SYMSTR1=$SYM1 | |
510 | SYMSTR2=$SYM2 | |
511 | SYMSTR13=$SYM10 | |
512 | SYMSTR14=$SYM11 | |
513 | SYMSTR3=$NOT_SYM5 | |
514 | ;; | |
515 | 6) | |
516 | VALID_HARDWARE_SELECTED=$TRUE | |
517 | APC_HARDWARE_PROD="SmartUps" | |
518 | SIGNAL_TYPE=$SMART | |
519 | CABLE_TYPE=$NORMAL | |
520 | SYMSTR1=$NOT_SYM1 | |
521 | SYMSTR2=$NOT_SYM2 | |
522 | SYMSTR13=$NOT_SYM3 | |
523 | SYMSTR14=$NOT_SYM4 | |
524 | SYMSTR3=$SYM5 | |
525 | ;; | |
526 | *) | |
527 | VALID_HARDWARE_SELECTED=$FALSE | |
528 | beep | |
529 | Echo "Invalid Selection...." | |
530 | esac | |
531 | done | |
532 | ||
533 | ||
534 | ####################################################################### | |
535 | # Ask about MeasureUps | |
536 | ####################################################################### | |
537 | ||
538 | if [ $SIGNAL_TYPE = $SMART ] | |
539 | then | |
540 | Echo | |
541 | echo_line | |
542 | Echo "The Measure-UPS is a device which is designed to perform environmental " | |
543 | Echo "monitoring in conjunction with $FULL_PROD_NAME" | |
544 | echo_line | |
545 | ||
546 | Echo | |
547 | IsYNLoop "Do you currently have a Measure-UPS attached to the UPS?" | |
548 | case "$?" in | |
549 | $YES) | |
550 | MEASURE_UPS=$TRUE | |
551 | ;; | |
552 | $NO) | |
553 | MEASURE_UPS=$FALSE | |
554 | ;; | |
555 | esac | |
556 | ||
557 | else | |
558 | MEASURE_UPS=$FALSE | |
559 | fi | |
560 | ||
561 | ||
562 | ####################################################################### | |
563 | # Ask about TCP/IP | |
564 | ####################################################################### | |
565 | ||
566 | Echo | |
567 | echo_line | |
568 | Echo "$FULL_PROD_NAME is able to monitor other hosts. However, in order" | |
569 | Echo "to monitor other hosts TCP/IP must be installed. If you do not have" | |
570 | Echo "TCP/IP installed, answer 'n' to the following question." | |
571 | echo_line | |
572 | Echo | |
573 | IsYNLoop "Do you currently have TCP/IP Installed?" | |
574 | case "$?" in | |
575 | $YES) | |
576 | USE_TCP=$TRUE | |
577 | ;; | |
578 | $NO) | |
579 | USE_TCP=$FALSE | |
580 | ;; | |
581 | esac | |
582 | ||
583 | ############################################################################ | |
584 | # Ask about coloring schemes... | |
585 | ############################################################################ | |
586 | Echo | |
587 | echo_line | |
588 | Echo "If you will be using the Motif version of the User Interface on a " | |
589 | Echo "monochrome monitor, using the Monochrome Coloring scheme is recommended." | |
590 | Echo | |
591 | echo_line | |
592 | Echo " 1) Use Default Color scheme" | |
593 | Echo " 2) Use Monochrome Color scheme" | |
594 | echo | |
595 | valid_color_scheme=$FALSE | |
596 | while [ $valid_color_scheme -eq $FALSE ] | |
597 | do | |
598 | Echo "Which color scheme do you wish to use [1]? \\c" | |
599 | read color_scheme | |
600 | if [ -z "$color_scheme" ] || [ "$color_scheme" = "1" ] | |
601 | then | |
602 | valid_color_scheme=$TRUE | |
603 | UI_MONO_COLOR_SCHEME=$FALSE | |
604 | else | |
605 | if [ "$color_scheme" = "2" ] | |
606 | then | |
607 | UI_MONO_COLOR_SCHEME=$TRUE | |
608 | valid_color_scheme=$TRUE | |
609 | else | |
610 | valid_color_scheme=$FALSE | |
611 | fi | |
612 | fi | |
613 | done | |
614 | ||
615 | ||
616 | ####################################################################### | |
617 | # Select communications port | |
618 | ####################################################################### | |
619 | ||
620 | Echo | |
621 | echo_line | |
622 | Echo "$FULL_PROD_NAME requires complete control of the serial port. No" | |
623 | Echo "processes, including gettys, are allowed to be accessing the port." | |
624 | Echo "Therefore, the serial port you select must NOT be enabled for logins. To" | |
625 | Echo "ensure that $FULL_PROD_NAME has control of the serial port, make" | |
626 | Echo "sure that it is not enabled for logins. To disable the port for logins" | |
627 | Echo "consult the $FULL_PROD_NAME manual." | |
628 | echo_line | |
629 | Echo | |
630 | VALID_TTY_SELECTED=$FALSE | |
631 | TTY_NUM= | |
632 | while [ $VALID_TTY_SELECTED -eq $FALSE ] | |
633 | do | |
634 | Echo | |
635 | Echo " 1) $TTY1" | |
636 | Echo " 2) $TTY2" | |
637 | Echo " 3) Other" | |
638 | Echo | |
639 | Echo "Which serial device will be dedicated to $FULL_PROD_NAME [?] \\c" | |
640 | read TTY_NUM | |
641 | case "$TTY_NUM" in | |
642 | 1) | |
643 | ALLOWED_PORT_NAMES="$TTY1,$TTY2" | |
644 | INST_TTY=$TTY1 | |
645 | VALID_TTY_SELECTED=$TRUE | |
646 | ;; | |
647 | 2) | |
648 | ALLOWED_PORT_NAMES="$TTY1,$TTY2" | |
649 | INST_TTY=$TTY2 | |
650 | VALID_TTY_SELECTED=$TRUE | |
651 | ;; | |
652 | 3) | |
653 | VALID_TEMP_TTY=$FALSE | |
654 | while [ $VALID_TEMP_TTY -eq $FALSE ] | |
655 | do | |
656 | Echo "Enter full path name of a serial device \\c" | |
657 | read TEMP_TTY | |
658 | if [ -z "$TEMP_TTY" ] | |
659 | then | |
660 | Echo "Invalid Selection" | |
661 | else | |
662 | VALID_TEMP_TTY=$TRUE | |
663 | INST_TTY=$TEMP_TTY | |
664 | ALLOWED_PORT_NAMES="$TTY1,$TTY2,$INST_TTY" | |
665 | fi | |
666 | done | |
667 | VALID_TTY_SELECTED=$TRUE | |
668 | ;; | |
669 | *) | |
670 | beep | |
671 | Echo "Invalid Selection..." | |
672 | ;; | |
673 | esac | |
674 | done | |
675 | ||
676 | ####################################################################### | |
677 | # Print cable type | |
678 | ####################################################################### | |
679 | ||
680 | Echo | |
681 | echo_line | |
682 | case "$SIGNAL_TYPE" in | |
683 | $SMART) | |
684 | case "$CABLE_TYPE" in | |
685 | $NORMAL) | |
686 | if [ "$APC_HARDWARE_PROD" = "Symmetra" ] | |
687 | then | |
688 | Echo "You should have the cable, #940-1524C attached to $INST_TTY" | |
689 | else | |
690 | Echo "You should have the black cable, #940-0024C attached to $INST_TTY" | |
691 | fi | |
692 | ;; | |
693 | $PNP) | |
694 | Echo "You should have the grey cable, #940-0095A attached to $INST_TTY" | |
695 | ;; | |
696 | esac | |
697 | ;; | |
698 | $SIMPLE) | |
699 | Echo "You should have the grey cable, #940-0023A attached to $INST_TTY" | |
700 | ;; | |
701 | esac | |
702 | Echo "Please verify." | |
703 | echo_line | |
704 | ||
705 | ###################################################################### | |
706 | # Determine if user wants to run command files as root | |
707 | ###################################################################### | |
708 | ||
709 | Echo | |
710 | echo_line | |
711 | Echo "Command files may be executed with root privileges or with the" | |
712 | Echo "privileges you assign to the pwrchute account (allowing you to" | |
713 | Echo "customize command file execution according to your system" | |
714 | Echo "requirements)." | |
715 | echo_line | |
716 | ||
717 | Echo | |
718 | IsYNLoop "Do you want to execute command files as root?" | |
719 | case "$?" in | |
720 | $YES) | |
721 | RUN_COMMAND_FILES_AS_ROOT=$TRUE | |
722 | ;; | |
723 | $NO) | |
724 | RUN_COMMAND_FILES_AS_ROOT=$FALSE | |
725 | ;; | |
726 | esac | |
727 | ||
728 | ###################################################################### | |
729 | # Determine if user wants to send email as root | |
730 | ###################################################################### | |
731 | ||
732 | Echo | |
733 | echo_line | |
734 | Echo "E-mail may be sent with root privileges or with the privileges you" | |
735 | Echo "assign to the pwrchute account." | |
736 | echo_line | |
737 | ||
738 | Echo | |
739 | IsYNLoop "Do you want to send e-mail as root?" | |
740 | case "$?" in | |
741 | $YES) | |
742 | SEND_EMAIL_AS_ROOT=$TRUE | |
743 | ;; | |
744 | $NO) | |
745 | SEND_EMAIL_AS_ROOT=$FALSE | |
746 | ;; | |
747 | esac | |
748 | ||
749 | ||
750 | ####################################################################### | |
751 | # Print install info for customer verification | |
752 | ####################################################################### | |
753 | ||
754 | Echo | |
755 | echo_line | |
756 | Echo "PRODUCT : $FULL_PROD_NAME" | |
757 | Echo "DEDICATED TTY : $INST_TTY" | |
758 | case "$INST_HARDWARE" in | |
759 | 1) UPS_TYPE="Matrix-UPS" | |
760 | ;; | |
761 | 2) UPS_TYPE="Smart-UPS" | |
762 | ;; | |
763 | 3) UPS_TYPE="Back-UPS" | |
764 | ;; | |
765 | 4) UPS_TYPE="Back-UPS Pro" | |
766 | ;; | |
767 | 5) UPS_TYPE="Symmetra Power Array" | |
768 | ;; | |
769 | 6) UPS_TYPE="Smart-UPS DP" | |
770 | ;; | |
771 | esac | |
772 | Echo "UPS TYPE : $UPS_TYPE" | |
773 | if [ $SIGNAL_TYPE = $SMART ] && [ $MEASURE_UPS -eq $TRUE ] | |
774 | then | |
775 | Echo "Measure-UPS INSTALLED : TRUE" | |
776 | fi | |
777 | if [ $SIGNAL_TYPE = $SMART ] && [ $MEASURE_UPS -eq $FALSE ] | |
778 | then | |
779 | Echo "Measure-UPS INSTALLED : FALSE" | |
780 | fi | |
781 | ||
782 | if [ $ROOT_USER -eq $TRUE ] | |
783 | then | |
784 | Echo "INSTALLING AS ROOT : TRUE" | |
785 | else | |
786 | Echo "INSTALLING AS ROOT : FALSE" | |
787 | fi | |
788 | ||
789 | if [ $USE_TCP -eq $TRUE ] | |
790 | then | |
791 | Echo "TCP/IP Installed : TRUE" | |
792 | else | |
793 | Echo "TCP/IP Installed : FALSE" | |
794 | fi | |
795 | ||
796 | if [ $RUN_COMMAND_FILES_AS_ROOT -eq $TRUE ] | |
797 | then | |
798 | Echo "RUN COMMAND FILES AS ROOT : TRUE" | |
799 | else | |
800 | Echo "RUN COMMAND FILES AS ROOT : FALSE" | |
801 | fi | |
802 | ||
803 | if [ $SEND_EMAIL_AS_ROOT -eq $TRUE ] | |
804 | then | |
805 | Echo "SEND EMAIL AS ROOT : TRUE" | |
806 | else | |
807 | Echo "SEND EMAIL AS ROOT : FALSE" | |
808 | fi | |
809 | ||
810 | echo_line | |
811 | Echo | |
812 | ||
813 | ####################################################################### | |
814 | # Allow customer to verify or quit | |
815 | ####################################################################### | |
816 | ||
817 | IsYNLoop "Are the above selections correct?" | |
818 | case "$?" in | |
819 | $NO) | |
820 | Echo | |
821 | Echo "Please rerun the $INST_SCRIPT_NAME script" | |
822 | Echo "No actions taken." | |
823 | Echo | |
824 | exit | |
825 | ;; | |
826 | esac | |
827 | ||
828 | ############################################################################# | |
829 | # Check for binary compatibility | |
830 | ############################################################################# | |
831 | Echo | |
832 | Echo "Checking for binary compatibility..." | |
833 | rm -f machine_def | |
834 | ./machine_id 2>&1 | |
835 | if [ ! -r machine_def ] | |
836 | then | |
837 | echo_line | |
838 | Echo "INSTALL FAILURE: There does not appear to be binary compatibilty between" | |
839 | Echo "installed product and this machine" | |
840 | echo_line | |
841 | Echo | |
842 | exit | |
843 | else | |
844 | Echo "binary compatibility VERIFIED" | |
845 | Echo | |
846 | fi | |
847 | ||
848 | ||
849 | ############################################################################# | |
850 | # Verify that chosen serial device is a valid tty | |
851 | ############################################################################# | |
852 | VALID_TTY=$FALSE | |
853 | ./ttycheck "$INST_TTY" | |
854 | case "$?" in | |
855 | 1) | |
856 | VALID_TTY=$TRUE | |
857 | Echo "$INST_TTY verified as a valid tty" | |
858 | Echo | |
859 | ;; | |
860 | 0) | |
861 | echo_line | |
862 | Echo "WARNING: $INST_TTY does not appear to be a valid tty" | |
863 | echo_line | |
864 | beep | |
865 | sleep 3 | |
866 | ;; | |
867 | *) | |
868 | echo_line | |
869 | Echo "WARNING: General tty verification failure." | |
870 | echo_line | |
871 | beep | |
872 | sleep 3 | |
873 | ;; | |
874 | esac | |
875 | ||
876 | ############################################################################# | |
877 | # See what we can determine about the port. | |
878 | ############################################################################# | |
879 | if [ $SKIP_PORT_VERIFICATION -eq $FALSE ] | |
880 | then | |
881 | Echo "The following Port validations for $INST_TTY may take a few moments...." | |
882 | sleep 2 | |
883 | if [ $VALID_TTY -eq $TRUE ] | |
884 | then | |
885 | ./portcheck "$INST_TTY" | |
886 | case "$?" in | |
887 | 1) | |
888 | IS_MODEM_PORT=$TRUE | |
889 | IS_LOCAL_PORT=$FALSE | |
890 | Echo "$INST_TTY appears to be a modem control port" | |
891 | sleep 1 | |
892 | ;; | |
893 | 2) | |
894 | IS_MODEM_PORT=$FALSE | |
895 | IS_LOCAL_PORT=$TRUE | |
896 | Echo "$INST_TTY appears to be a local control port" | |
897 | sleep 1 | |
898 | ;; | |
899 | *) | |
900 | beep | |
901 | echo_line | |
902 | Echo "Could not determine port type!" | |
903 | echo_line | |
904 | sleep 1 | |
905 | ;; | |
906 | esac | |
907 | fi | |
908 | ||
909 | if [ $IS_MODEM_PORT -eq $TRUE ] && [ $SIGNAL_TYPE = $SMART ] | |
910 | then | |
911 | echo_line | |
912 | beep | |
913 | Echo "WARNING: Port must be configured for local control in order to work with a" | |
914 | Echo "\"Smart\" Signaling UPS" | |
915 | echo_line | |
916 | Echo | |
917 | HitAnyKey | |
918 | fi | |
919 | ||
920 | if [ $IS_LOCAL_PORT -eq $TRUE ] && [ $SIGNAL_TYPE = $SIMPLE ] | |
921 | then | |
922 | echo_line | |
923 | beep | |
924 | Echo "WARNING: Port must be configured for modem control in order to work with a" | |
925 | Echo "\"Simple\" Signaling UPS" | |
926 | echo_line | |
927 | Echo | |
928 | HitAnyKey | |
929 | fi | |
930 | Echo | |
931 | fi | |
932 | ||
933 | ||
934 | ||
935 | ||
936 | ############################################################################# | |
937 | # Modify OS system files for shutdown | |
938 | ############################################################################# | |
939 | modify_files=`grep -q -s -c POWERCHUTE /etc/rc.d/init.d/halt` | |
940 | if [ "$modify_files" -eq 0 ] | |
941 | then | |
942 | Echo "making backup copy of shutdown files..." | |
943 | cp $SHUTDOWN_FILE $SHUTDOWN_FILE.tmp | |
944 | cp $SHUTDOWN_FILE $SHUTDOWN_FILE_BACKUP | |
945 | ||
946 | Echo "modifying shutdown files...." | |
947 | ||
948 | if [ -r $SHUTDOWN_FILE.tmp ] | |
949 | then | |
950 | rm -f $SHUTDOWN_FILE | |
951 | else | |
952 | echo_line | |
953 | beep | |
954 | Echo "Unable to find temp file $SHUTDOWN_FILE.tmp. Quitting." | |
955 | echo_line | |
956 | Quit | |
957 | fi | |
958 | sed "/$SHUTDOWN_SEARCH_STRING/ a\\ | |
959 | $SHUTDOWN_COMMAND_STRING" $SHUTDOWN_FILE.tmp > $SHUTDOWN_FILE | |
960 | if [ ! -r $SHUTDOWN_FILE ] | |
961 | then | |
962 | echo_line | |
963 | beep | |
964 | Echo "Error writing $SHUTDOWN_FILE! Original can be found in\n$INSTALL_PATH/$SYSFILES_BACKUP_REPOSITORY. Quitting." | |
965 | echo_line | |
966 | exit | |
967 | else | |
968 | rm -f $SHUTDOWN_FILE.tmp | |
969 | fi | |
970 | chmod 754 $SHUTDOWN_FILE | |
971 | fi | |
972 | ||
973 | ||
974 | ############################################################################# | |
975 | # Verify we can communicate with UPS | |
976 | ############################################################################# | |
977 | cd /usr/lib/powerchute | |
978 | RETRY=$TRUE | |
979 | RE= | |
980 | if [ $VALID_TTY -eq $TRUE ] && [ $IS_MODEM_PORT -eq $FALSE ] | |
981 | then | |
982 | while [ $RETRY -eq $TRUE ] | |
983 | do | |
984 | ./upswrite $INST_TTY $CABLE_TYPE verify | |
985 | if [ $? -eq 5 ] | |
986 | then | |
987 | COMM_VERIFIED=$TRUE | |
988 | RETRY=$FALSE | |
989 | Echo | |
990 | Echo "UPS communications on $INST_TTY verified" | |
991 | Echo "Done." | |
992 | Echo | |
993 | else | |
994 | Echo | |
995 | echo_line | |
996 | Echo "WARNING: Could not communicate with device on $INST_TTY." | |
997 | Echo "Check that the communications cable is attached properly to both the device" | |
998 | Echo "and the serial port." | |
999 | beep | |
1000 | echo_line | |
1001 | Echo "NOTE: Though the $FULL_PROD_NAME installation is complete, if you " | |
1002 | Echo "quit before verifying communications, the application may not work properly" | |
1003 | echo_line | |
1004 | VALID_RE=$FALSE | |
1005 | while [ $VALID_RE -eq $FALSE ] | |
1006 | do | |
1007 | Echo "Do you wish to Exit or Retry communications? [R/E] \\c" | |
1008 | read RE | |
1009 | case "$RE" in | |
1010 | [Rr]*) | |
1011 | RETRY=$TRUE | |
1012 | VALID_RE=$TRUE | |
1013 | ;; | |
1014 | [Ee]*) | |
1015 | COMM_VERIFIED=$FALSE | |
1016 | RETRY=$FALSE | |
1017 | VALID_RE=$TRUE | |
1018 | ;; | |
1019 | esac | |
1020 | done | |
1021 | fi | |
1022 | done | |
1023 | ||
1024 | elif [ $IS_LOCAL_PORT -eq $TRUE ] | |
1025 | then | |
1026 | echo_line | |
1027 | Echo "WARNING: Due to tty verification failure, the install" | |
1028 | Echo "will be unable to test UPS communications." | |
1029 | echo_line | |
1030 | beep | |
1031 | sleep 3 | |
1032 | fi | |
1033 | ||
1034 | ############################################################################# | |
1035 | # Modify the powerchute.ini file | |
1036 | ############################################################################# | |
1037 | cd /usr/lib/powerchute | |
1038 | rm -f /tmp/temp_ini.in | |
1039 | rm -f /tmp/temp_ini.out | |
1040 | cp powerchute.ini_templ /tmp/temp_ini.in | |
1041 | cp /etc/powerchute.ini /etc/powerchute_ini.bak | |
1042 | ||
1043 | sed s!GSUB_TTY_HERE!$INST_TTY!g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1044 | CopyOutToIn | |
1045 | sed s/GSUB_SIGTYPE_HERE/$SIGNAL_TYPE/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1046 | CopyOutToIn | |
1047 | if [ $MEASURE_UPS -eq $TRUE ] | |
1048 | then | |
1049 | sed s/GSUB_MUPS_HERE/YES/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1050 | else | |
1051 | sed s/GSUB_MUPS_HERE/NO/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1052 | fi | |
1053 | CopyOutToIn | |
1054 | if [ $UI_MONO_COLOR_SCHEME -eq $TRUE ] | |
1055 | then | |
1056 | sed "s/GSUB_UI_WARNCOLOR_HERE/$MONO_WARN_COLOR_STRING/g" /tmp/temp_ini.in > /tmp/temp_ini.out | |
1057 | else | |
1058 | sed "/GSUB_UI_WARNCOLOR_HERE/d" /tmp/temp_ini.in > /tmp/temp_ini.out | |
1059 | fi | |
1060 | CopyOutToIn | |
1061 | if [ $UI_MONO_COLOR_SCHEME -eq $TRUE ] | |
1062 | then | |
1063 | sed "s/GSUB_UI_ERRCOLOR_HERE/$MONO_ERR_COLOR_STRING/g" /tmp/temp_ini.in > /tmp/temp_ini.out | |
1064 | else | |
1065 | sed "/GSUB_UI_ERRCOLOR_HERE/d" /tmp/temp_ini.in > /tmp/temp_ini.out | |
1066 | fi | |
1067 | CopyOutToIn | |
1068 | sed s!GSUB_ALLOWED_PORTS_HERE!$ALLOWED_PORT_NAMES!g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1069 | CopyOutToIn | |
1070 | if [ $USE_TCP -eq $TRUE ] | |
1071 | then | |
1072 | sed s/GSUB_USETCP_HERE/YES/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1073 | else | |
1074 | sed s/GSUB_USETCP_HERE/NO/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1075 | fi | |
1076 | CopyOutToIn | |
1077 | sed s/GSUB_CHANGE1_HERE/"$SYMSTR1"/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1078 | CopyOutToIn | |
1079 | sed s/GSUB_CHANGE2_HERE/"$SYMSTR2"/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1080 | CopyOutToIn | |
1081 | sed s/GSUB_TIMEOUT_HERE/"$SYMSTR13"/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1082 | CopyOutToIn | |
1083 | sed s/GSUB_ACTIONS_HERE/"$SYMSTR3"/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1084 | CopyOutToIn | |
1085 | if [ $RUN_COMMAND_FILES_AS_ROOT -eq $TRUE ] | |
1086 | then | |
1087 | sed s/GSUB_COMMAND_FILES_AS_ROOT_HERE/YES/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1088 | else | |
1089 | sed s/GSUB_COMMAND_FILES_AS_ROOT_HERE/NO/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1090 | fi | |
1091 | CopyOutToIn | |
1092 | if [ $SEND_EMAIL_AS_ROOT -eq $TRUE ] | |
1093 | then | |
1094 | sed s/GSUB_SEND_EMAIL_AS_ROOT_HERE/YES/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1095 | else | |
1096 | sed s/GSUB_SEND_EMAIL_AS_ROOT_HERE/NO/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1097 | fi | |
1098 | CopyOutToIn | |
1099 | if [ -n "$MODEM_PORT_NAME" ] | |
1100 | then | |
1101 | sed s!GSUB_MODEM_PORT_NAME!$MODEM_PORT_NAME!g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1102 | else | |
1103 | sed s/GSUB_MODEM_PORT_NAME/""/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1104 | fi | |
1105 | CopyOutToIn | |
1106 | sed s!GSUB_CABLE_TYPE_HERE!$CABLE_TYPE!g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1107 | CopyOutToIn | |
1108 | if [ -n "$MODEM_ALLOWED_PORT_NAMES" ] | |
1109 | then | |
1110 | sed s!GSUB_MODEM_ALLOWED_PORT_NAMES!$MODEM_ALLOWED_PORT_NAMES!g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1111 | else | |
1112 | sed s/GSUB_MODEM_ALLOWED_PORT_NAMES/""/g /tmp/temp_ini.in > /tmp/temp_ini.out | |
1113 | fi | |
1114 | ||
1115 | cp -f /tmp/temp_ini.out /etc/powerchute.ini | |
1116 | rm -f /tmp/temp_ini.in | |
1117 | rm -f /tmp/temp_ini.out | |
1118 | ||
1119 | ||
1120 | ############################################################################ | |
1121 | # Make EEPROM adjustments | |
1122 | ############################################################################ | |
1123 | if [ $COMM_VERIFIED -eq $TRUE ] && [ $SIGNAL_TYPE = $SMART ] | |
1124 | then | |
1125 | ||
1126 | CheckEepromUps "p" $INST_TTY | |
1127 | if [ "$?" -eq $TRUE ] | |
1128 | then | |
1129 | beep | |
1130 | echo_line | |
1131 | Echo "Due to the amount of time it can take Unix platforms to shutdown," | |
1132 | Echo "it is sometimes necessary to increase the eeprom parameter UpsTurnOffDelay" | |
1133 | Echo "within the UPS. This is in order to allow sufficient time for the" | |
1134 | Echo "Operating System to shutdown completely." | |
1135 | echo_line | |
1136 | Echo "* Doing this is recommended for the Linux Operating System *" | |
1137 | echo_line | |
1138 | ||
1139 | IsYNLoop "Do you wish to increment the UpsTurnOffDelay to its next highest\nvalue now?" | |
1140 | if [ "$?" -eq $YES ] | |
1141 | then | |
1142 | CheckDipSwitches $INST_TTY | |
1143 | if [ "$?" -eq $TRUE ] | |
1144 | then | |
1145 | Echo "Please wait.\\c" | |
1146 | desired_val="180" | |
1147 | GetNextEepromValueGreaterThan "p" "20" $INST_TTY | |
1148 | next_value="$?" | |
1149 | if [ "$next_value" -ne "-1" ] | |
1150 | then | |
1151 | desired_val=$next_value | |
1152 | fi | |
1153 | ||
1154 | current_val="20" | |
1155 | GetCurrentEepromSetting "p" $INST_TTY | |
1156 | current_eeprom="$?" | |
1157 | if [ "$current_eeprom" -ne "-1" ] | |
1158 | then | |
1159 | current_val="$current_eeprom" | |
1160 | fi | |
1161 | ||
1162 | CycleUntilAcceptableValue "p" "$current_val" "$desired_val" "$INST_TTY" | |
1163 | if [ "$?" -eq $TRUE ] | |
1164 | then | |
1165 | Echo | |
1166 | beep | |
1167 | Echo "UpsTurnOffDelay successfully set at $desired_val." | |
1168 | fi | |
1169 | fi | |
1170 | fi | |
1171 | else | |
1172 | Echo "Eeproms okay." | |
1173 | fi | |
1174 | fi | |
1175 | ||
1176 | ############################################################################ | |
1177 | # Add pwrchute user account | |
1178 | ############################################################################ | |
1179 | if [ $USE_TCP -eq $TRUE ] | |
1180 | then | |
1181 | pwrchute_exists=`grep -c pwrchute /etc/passwd` | |
1182 | if [ $pwrchute_exists -eq 0 ] | |
1183 | then | |
1184 | Echo | |
1185 | Echo "The PowerChute plus User Interface will prompt you for a password when you attempt" | |
1186 | Echo "to connect to the upsd daemon running on this machine. This password is the" | |
1187 | Echo "password of the pwrchute user account." | |
1188 | Echo | |
1189 | Echo "Adding a pwrchute user account" | |
1190 | /usr/sbin/useradd pwrchute | |
1191 | Echo "Please set the password for the pwrchute user account." | |
1192 | /usr/bin/passwd pwrchute | |
1193 | fi | |
1194 | fi | |
1195 | ||
1196 | ############################################################################ | |
1197 | # Done! | |
1198 | ############################################################################ | |
1199 | ||
1200 | echo_line | |
1201 | Echo "$FULL_PROD_NAME Installation complete. You will need to reboot" | |
1202 | Echo "in order to start the application" | |
1203 | echo_line | |
1204 | ||
1205 | if [ $COMM_VERIFIED -eq $FALSE ] | |
1206 | then | |
1207 | echo_line | |
1208 | Echo "WARNING: Serial communications never verified, the installed product may" | |
1209 | Echo "not work properly. You may want to try the following:" | |
1210 | Echo | |
1211 | Echo " 1) Check that specified serial device exists." | |
1212 | Echo " 2) Check the device configuration is appropriate for your UPS type" | |
1213 | Echo " 3) Rebuild or create the serial device using the utility appropriate " | |
1214 | Echo " for your system." | |
1215 | Echo | |
1216 | echo_line | |
1217 | fi |