home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / pppconfig < prev    next >
Text File  |  1999-02-23  |  27KB  |  1,137 lines

  1. #!/bin/sh
  2.  
  3. # This is free software, published under version 2 of the GNU General
  4. # Public License.  You should have received a copy of the GNU General
  5. # Public License with your Debian GNU/Linux system as
  6. # /usr/doc/copyright/GPL.
  7.  
  8. # The author is John Hasler <jhasler@debian.org>. It is based on work by
  9. # Richard G. Roberto and Bruce Perens.
  10.  
  11. version="pppconfig 1.2"
  12. # set -x
  13. umask 027
  14. BACKTITLE="Debian GNU/Linux PPP Configuration Utility"
  15. MINMEN=0
  16.  
  17. abortstring='ABORT BUSY
  18. ABORT "NO CARRIER"
  19. ABORT VOICE
  20. ABORT "NO DIALTONE" 
  21. ABORT "NO ANSWER"'
  22.  
  23. # Set defaults.
  24. atdx=ATDT
  25. route=defaultroute
  26. ipdefault=noipdefault
  27. modeminit=ATZ
  28.  
  29. ispport=/dev/ttyS1
  30. ispspeed=115200
  31. route=defaultroute
  32. ipdefault=noipdefault
  33. ispname=replace_with_your_username
  34. ispauth=pap
  35. modeminit=ATZ
  36. ispnumber=replace_with_number
  37. ispconnect=\'\'
  38. isplogin="ogin:"
  39. ispname=replace_with_name
  40. ispprompt="ssword:"
  41. isppwd=replace_with_password
  42. ispothers=''
  43.  
  44. Exit () {
  45.     local result=$1
  46.     rm -rf ${TempFile}* $SedFile
  47.     clear
  48.     exit ${result:-0}
  49. }
  50.  
  51. # include the user interface functions
  52.  
  53. # Global options 
  54. # The variable $BACKTITLE specifies the back title.  
  55. # The variable $DIALOG_OPTIONS, initialized here to --clear, provides 
  56. # options you want on the command line of each dialog invocation.  
  57. # The variable $DIALOG_TEST can be set to "echo" to see the calls 
  58. # to dialog without executing them.
  59.  
  60. DIALOG_OPTIONS=""
  61.  
  62. # Make any dialogue box, with default settings and backtitle from
  63. # $BACKTITLE in the environment.
  64. #
  65. # dialog --type arg arg ...
  66. #
  67. dialogBox () {
  68.     local type="$1"
  69.     shift
  70.     local title=""
  71.     local backtitle=""
  72.     local text="$1"
  73.     shift
  74.     if [ $# -ge 1 ]
  75.     then
  76.         title="$1"
  77.     shift
  78.     fi
  79.     if [ -n "$BACKTITLE" ]; then
  80.     backtitle="$BACKTITLE"
  81.     fi
  82.     $DIALOG_TEST $UI $DIALOG_OPTIONS --title "$title" --backtitle \
  83.     "$backtitle" "$type" "$text" 22 80 "$@" 2>&1 1>/dev/tty
  84.     local result=$?
  85.     return $result
  86. }
  87.  
  88. # Display a file.
  89. #
  90. # fileBox filename [title]
  91. #
  92. fileBox () {
  93.     dialogBox --textbox "$1" "$2"
  94. }
  95.  
  96. # textBox takes presents its standard input in a dialog box. This
  97. # is useful for "here documents" and pipes.
  98. #
  99. # textBox [title]
  100. #
  101. textBox () {
  102.     cat > $TempFile
  103.     if [ $? -ne 0 ]
  104.     then
  105.         echo "Can't make temporary file for dialog box." 1>&2
  106.     return 255
  107.     fi
  108.     # Note that dialog needs stdin to be the terminal, so I redirect here.
  109.     < /dev/tty dialogBox --textbox $TempFile "$1"
  110.     local result=$?
  111.     rm -f $TempFile
  112.     return $result
  113. }
  114.  
  115. msgBox () {
  116.     dialogBox --msgbox "$1" "$2"
  117. }
  118.  
  119. infoBox () {
  120.     dialogBox --infobox "$1" "$2"
  121. }
  122.  
  123. yesNoBox () {
  124.     dialogBox --yesno "$1" "$2"
  125. }
  126.  
  127. inputBox () {
  128.     dialogBox --inputbox "$1" "$2" "$3"
  129. }
  130.  
  131. # menu text title tag1 item1 ...
  132. menu () {
  133.     local text="$1"
  134.     shift
  135.     local title="$1"
  136.     shift
  137.     dialogBox --menu "$text" "$title" 0 "$@"
  138. }
  139.  
  140. # menu text title tag1 item1 status1 ...
  141. checklist () {
  142.     local text="$1"
  143.     shift
  144.     local title="$1"
  145.     shift
  146.     dialogBox --checklist "$text" "$title" 0 "$@"
  147. }
  148.  
  149. # menu text title tag1 item1 status1 ...
  150. radiolist () {
  151.     local text="$1"
  152.     shift
  153.     local title="$1"
  154.     shift
  155.     dialogBox --radiolist "$text" "$title" 2 "$@"
  156. }
  157. # end of shell interface to "dialog"
  158.  
  159.  
  160. mkMenu ()
  161. {
  162. while true
  163.     do
  164.     # These local variables were used in the dinstall script I hijacked
  165.     # this user interface concept from, so I use them as well.
  166.     local next_action=true
  167.     local previous_action=true
  168.     local alternate_action=true
  169.     echo "menu \\" > $TempFile
  170.     [ $# -lt 1 ] && { # do this if mkMenu is called with no args
  171.     # This section sets up the inital menu at first invocation. It will
  172.     # usually just get skipped.
  173.     next_action=newConnection
  174.     cat >> $TempFile << EOF
  175. "This is the PPP configuration utility.  It does not make a connection to
  176. your ISP: it just configures your system so that you can connect with a
  177. utility such as 'pon'. You will be asked for the username, password, and
  178. phone number that your ISP gave you.  If your ISP uses PAP or CHAP, that is
  179. all you need.  If you need to use a chat script to connect, you will need
  180. to know how your ISP prompts for your username and password.  If you don't
  181. know what your ISP uses, try PAP.
  182.  
  183. Use the up and down arrow keys to move around the menus.  Use the TAB key
  184. to move from the menu to <OK> to <CANCEL> and back.  When you are ready to
  185. move on to the next menu go to <OK> and hit enter.  To go back to the main
  186. menu go to <CANCEL> and hit enter." \
  187. "Main Menu" \\
  188.     "Next"  "Create a connection" \\
  189. EOF
  190.     } # end of argumentless specifics    
  191.  
  192.     #
  193.     # These are specific menu fragments called by the $1 arg to mkMenu
  194.     #
  195.     case $1 in 
  196.     method) # menu of connection methods -- only uses
  197.         # menu tail
  198.         cat >> $TempFile <<EOF
  199. "Please select the authentication method for this connection.  PAP is the
  200. method most often used in Windows 95, so if your ISP supports the NT or
  201. Win95 dial-up client, try \\"PAP\\"." \
  202. "$title" \\
  203.     "PAP"    "Password Authentication Protocol" \\
  204.     "Chat"    "Use \\"chat\\" for login:/password: authentication" \\
  205.     "CHAP"    "Challenge Handshake Authentication Protocol" \\
  206.     " " " "    \\
  207. EOF
  208.         previous_action="break 2"
  209.         ;;
  210. #
  211. # end of method block
  212. #
  213.     properties)     # list of variables about a connection
  214.                         # to be modified by the user
  215.         cat >> $TempFile <<EOF
  216. "Please select the property you wish to modify, select \\"Cancel\\" to go
  217. back to start over, or select \\"Finished\\" to write out the changed
  218. files." \
  219. "$title" \\
  220. EOF
  221.         cat >> $TempFile <<EOF
  222.     "Modeminit"     "Modem initialization string" \\
  223.         "Number"        "Telephone number to call" \\
  224.         "User"          "User name for authentication" \\
  225. EOF
  226.         cat >> $TempFile <<EOF
  227.         "Password"      "The password for this connection" \\
  228. EOF
  229.         cat >> $TempFile <<EOF
  230.         "Speed"         "Port speed for the modem" \\
  231.         "Com"           "Serial Port the modem is on" \\
  232.     "Defaultroute"  "Enable or disable default route" \\
  233.     "Ipdefault"     "Set IP addresses" \\
  234.         "Method"        "Authentication Method (e.g., PAP)" \\
  235. EOF
  236.         [ $ispauth = "chat" ] && {
  237.         cat >> $TempFile <<EOF
  238.         "ISPChat"       "Manage Chat Settings" \\
  239. EOF
  240.         }
  241.         cat >> $TempFile <<EOF
  242.         " " " " \\
  243.         "Finished"      "Write files and return to main menu." \\
  244. EOF
  245.         previous_action="break 2" 
  246.     ;;
  247. #
  248. # end of properties block
  249. #
  250.  
  251.         chatprops)      # configure the individual chat properties
  252.         cat >> $TempFile << EOF
  253. "You will now have the opportunity to change your chat settings. Select the
  254. setting you wish to change, and select \\"Previous\\" when you are done
  255. changing chat settings." \
  256. "Chat Settings" \\
  257.         "ISPConnect"    "Change the Connect strings" \\
  258.         "ISPLogin"      "Change the Login Prompt string" \\
  259.         "ISPPrompt"     "Change the Password Prompt string" \\
  260.         "ISPOthers"     "Change or add other strings" \\
  261.         "Previous"      "Return to previous menu" \\
  262.         " " " " \\
  263. EOF
  264.         previous_action="break 2"
  265.         ;;
  266. #
  267. # end of chatprops block
  268. #
  269.     esac
  270.  
  271.     
  272. #
  273. # START OF STANDARD MENU FRAGMENT
  274. # this is included unless MINMEN=1
  275. #
  276.     [ $MINMEN -ne 1 ] && {
  277.     cat >> $TempFile << EOF
  278.     " " " " \\
  279.     "Create" "Create a connection" \\
  280. EOF
  281.     }
  282. #
  283. # END OF STANDARD MENU FRAGMENT
  284. #
  285.  
  286. #
  287. # START OF MENU TAIL
  288. # this is always present
  289. #
  290.  
  291.     cat >> $TempFile << EOF
  292.     "Quit" "Exit this utility"
  293. EOF
  294. #
  295. # END OF MENU TAIL
  296. #
  297. #cat $TempFile
  298. # START OF STANDARD CASE PROCESSING 
  299. local action 
  300.     action="`. $TempFile`"
  301.     result=$?
  302.     if [ $result -ne 0 ]
  303.     then 
  304.         mkMenu 
  305.     fi
  306.     if [ -z "$action" ]
  307.     then 
  308.         continue
  309.     fi 
  310.     case $action in
  311.     Next) 
  312.         $next_action
  313.         return 
  314.     ;;
  315.     Alternate) 
  316.         $alternate_action
  317.         return 
  318.     ;;
  319.     Previous|Finished) 
  320.         $previous_action
  321.         return
  322.     ;;
  323.     Create) newConnection
  324.         return
  325.     ;;
  326.     PAP) 
  327.         doOps PAP
  328.         return
  329.     ;;
  330.     CHAP) 
  331.         doOps CHAP
  332.         return
  333.     ;;
  334.     Chat) 
  335.         doOps Chat
  336.         return
  337.     ;;
  338.     Method) 
  339.         mkMenu method
  340.         return
  341.     ;;
  342.     ISPChat) 
  343.         chatProps
  344.         return
  345.     ;;
  346.     ISPConnect) 
  347.         chatConfig connect
  348.         return
  349.     ;;
  350.     ISPLogin) 
  351.         chatConfig login
  352.         return
  353.     ;;
  354.     ISPPrompt) 
  355.         chatConfig prompt
  356.         return
  357.     ;;
  358.     ISPOthers) 
  359.         chatConfig others
  360.         return
  361.     ;;
  362.     Password) 
  363.         doOps Passwd
  364.         return
  365.     ;;
  366.     Com) 
  367.         doOps Port
  368.         return
  369.     ;;
  370.     Defaultroute) 
  371.         doOps Defaultroute
  372.         return
  373.     ;;
  374.     Ipdefault) 
  375.         doOps Ipdefault
  376.         return
  377.     ;;
  378.     Speed) 
  379.         doOps Speed
  380.         return
  381.     ;;
  382.     User) 
  383.         doOps User
  384.         return
  385.     ;;
  386.     Number) 
  387.         doOps Number
  388.         return
  389.     ;;
  390.     Modeminit) 
  391.         doOps Modeminit
  392.         return
  393.     ;;
  394.     Quit) Exit
  395.     ;;
  396.     esac
  397. #
  398. END OF STANDARD CASE PROCESSING
  399. #
  400.     done    # end of while loop
  401. }
  402.  
  403. # Action functions for PPPCONFIG
  404.  
  405.  
  406. chatConfig () {
  407.  
  408. case "$1" in
  409.     connect)    # the connection string sent by the modem
  410.     ispconnect="`inputBox \
  411. "Enter the text of connect acknowledgement, if any. This string will be
  412. sent when the CONNECT string is received from the modem.  Unless you know
  413. for sure that your ISP requires such an acknowledgement you should leave
  414. this as a null string: that is, ''.  
  415.  
  416. A few ISP's require some sort of handshake before the actual login.  For
  417. example, the ISP might send host: when you connect and expect you to
  418. respond with ppp before proceeding with login.  To do this you would just
  419. add host: and ppp to the ack string so that it would read '' host: ppp.
  420. This would cause your system to expect CONNECT, send a return, expect
  421. host:, and send ppp." \
  422. "Ack String" "${ispconnect:=''}"`"
  423.     if [ $? -ne 0 ]
  424.     then
  425.         mkMenu
  426.     fi
  427.     return
  428.     ;;
  429.     login)    # the login prompt string sent by the ISP
  430.     isplogin="`inputBox \
  431. "Enter the text of the login prompt.  Chat will send your username in
  432. response.  The most common prompts are 'login:' and 'username:'. Sometimes
  433. the first letter is capitalized and so we leave it off and match the rest of
  434. the word. Sometimes the colon is omitted." \
  435. "Login String" "$isplogin"`"
  436.     if [ $? -ne 0 ]
  437.     then
  438.         mkMenu
  439.     fi
  440.     return
  441.     ;;
  442.     prompt)    # password prompt sent by the ISP
  443.     ispprompt="`inputBox \
  444. "Enter the text of the password prompt.  Chat will send your password in
  445. response. The most common prompt is 'password:'. Sometimes the first letter
  446. is capitalized and so we leave it off and match the rest of the
  447. word. " \
  448. "PWD String" "$ispprompt"`"
  449.     if [ $? -ne 0 ]
  450.     then
  451.         mkMenu
  452.     fi
  453.     return
  454.     ;;
  455.     others)    # other possible chat requirements
  456.     ispothers="`inputBox \
  457. "You probably do not need to put anything here. Enter any additional input
  458. your ISP requires.  This may be a program name like 'ppp' as a response to
  459. a menu prompt. If you need to make an entry, make the first entry the
  460. prompt you expect and the second the required response.  All entries must
  461. be separated by white space.  Anything inside single quotes will be treated
  462. as one word even if it contains white space." \
  463. "Other Strings" "$ispothers"`"
  464.     if [ $? -ne 0 ]
  465.     then
  466.         mkMenu
  467.     fi
  468.     return
  469.     ;;
  470. *)    # chatConfig with no options will display a message and configure
  471.     # all chat options
  472.     msgBox \
  473. "Now you will be asked to configure your chat script. This is the series of
  474. queries and responses used by your ISP to authenticate you. You will need to
  475. know how your ISP prompts for your username and password." \
  476. "Chat"
  477.     if [ $? -ne 0 ]
  478.     then
  479.         mkMenu
  480.     fi
  481.     chatConfig connect
  482.     chatConfig login
  483.     chatConfig prompt
  484.     chatConfig others
  485.     return
  486.     ;;
  487.     esac
  488. }
  489.  
  490. GetName () {
  491. provider="`inputBox \
  492. "Enter the name you wish to use to refer to this ISP.  You will probably
  493. want to give the default name of 'provider' to your primary ISP.  That way,
  494. you can dial it by just giving the command 'pon'.  Give each additional isp
  495. a unique name.  For example, you might call your employer 'theoffice' and
  496. your university 'theschool'.  Then you can connect to your ISP with 'pon',
  497. your office with 'pon theoffice', and your university with 'pon theschool'." \
  498. "Provider Name" "$provider"`"
  499.     if [ $? -ne 0 ]
  500.     then
  501.         mkMenu
  502.     fi
  503.     return
  504. }
  505.  
  506.  
  507. chatProps () {
  508. # loop through the chatprops menu display until user
  509. # chooses previous_action and does a "break 2"
  510.     noswitch=0
  511.     [ $MINMEN = 1 ] && noswitch=1
  512.     [ $noswitch -eq 0 ] && MINMEN=1
  513.     while true
  514.     do
  515.     mkMenu chatprops
  516.     done
  517.     [ $noswitch -eq 0 ] && MINMEN=0
  518.     return
  519. }
  520.  
  521. Previous ()
  522. {
  523.     return
  524. }
  525.  
  526. finishConnection () {
  527. # this is to tidy up things with the user and is in no way
  528. # associated with any Finnish Connections ;)
  529.  
  530.     msgBox \
  531. "Finished configuring connection and writing changed files." "Finished"
  532.     doFiles put
  533. }
  534.  
  535. newConnection () {
  536. # this sets up new connections by calling other functions to:
  537. # - initialize a clean state by zeroing state variables
  538. # - query the user for information about a connection
  539.  
  540.     MINMEN=1
  541.  
  542.     title="Create Connection"
  543.     Nameservers GET
  544.     [ $NONAME -eq 0 ] && GetName             # Get the name of this provider.
  545.     CHATFILE=$ETC/chatscripts/$provider
  546.     OPTIONFILE=$ETC/ppp/peers/$provider
  547.     doFiles get         # Get variables now that we know the name
  548.     mkMenu method     # calls doOps with appropriate method arg
  549.             # this starts the process of collecting all other
  550.             # connection related information
  551.     doOps            # calls all doOps args required
  552.     doProps        # review properties
  553.     MINMEN=1
  554.     finishConnection    # finishing touches
  555.     return
  556. }
  557.  
  558. doProps () {
  559.     msgBox \
  560. "You will now have the chance to review or change connection properties." \
  561. "Properties"
  562.     if [ $? -ne 0 ]
  563.     then 
  564.         mkMenu
  565.     fi
  566.     while true
  567.     do
  568.     title="Select A Property To Manage"
  569.   mkMenu properties    # calls doOps for each property to modify
  570.     done
  571. }
  572.  
  573. doFiles () {
  574.     case $1 in
  575.     get)
  576.     if grep -qs "This file was generated by pppconfig" "$OPTIONFILE"
  577.     # We put options in this file last time.
  578.     then
  579.     # Read it.
  580.        temp=`grep -s pppconfig_dev $OPTIONFILE | cut -f 1 -d ' ' -`
  581.        ispport=${temp:-$ispport}
  582.        temp=`grep -s pppconfig_speed $OPTIONFILE | cut -f 1 -d ' ' -`
  583.        ispspeed=${temp:-$ispspeed}
  584.        temp=`grep -s pppconfig_route $OPTIONFILE | cut -f 1 -d ' ' -`
  585.        route=${temp:-$route}
  586.        temp=`grep -s pppconfig_ipdefault $OPTIONFILE | cut -f 1 -d ' ' -`
  587.        ipdefault=${temp:-$ipdefault}
  588.        temp=`grep -s pppconfig_user $OPTIONFILE | cut -f 2 -d ' ' -`
  589.        ispname=${temp:-$ispname}
  590.     fi
  591.     if [ -f "${PPPCONFIG_DIR}/$provider" ]
  592.     # We saved some chat stuff last time.
  593.     then
  594.         # Read it.
  595.         read ispauth < "${PPPCONFIG_DIR}/$provider"
  596.         if [ "$ispauth" = chat ]
  597.         then
  598.             { read ispauth
  599.             read modeminit
  600.             read atdx
  601.             read ispnumber
  602.             read ispconnect
  603.             read isplogin
  604.             read ispname
  605.             read ispprompt
  606.             read isppwd
  607.             read ispothers; } < "${PPPCONFIG_DIR}/$provider"
  608.         else
  609.         { read ispauth
  610.         read modeminit
  611.         read atdx
  612.          read ispnumber; } < "${PPPCONFIG_DIR}/$provider"
  613.         fi
  614.         atdx=`echo $atdx | tr a-z A-Z`
  615.     fi
  616.     ;;
  617.     put)
  618.     if grep -qs "This file was generated by pppconfig" "$OPTIONFILE"
  619.     # Evidently we've been here before.
  620.     then
  621.         # Edit the file.
  622.         sed -e "/#pppconfig_debug/c\\
  623. debug          #pppconfig_debug
  624. /#pppconfig_dev/c\\
  625. $ispport       #pppconfig_dev
  626. /#pppconfig_speed/c\\
  627. $ispspeed      #pppconfig_speed
  628. /#pppconfig_route/c\\
  629. $route         #pppconfig_route
  630. /#pppconfig_ipdefault/c\\
  631. $ipdefault      #pppconfig_ipdefault
  632. /#pppconfig_user/c\\
  633. user $ispname #pppconfig_user
  634. " $OPTIONFILE > $SedFile
  635. cat $SedFile > $OPTIONFILE
  636.  
  637.        else
  638.         if [ -s $OPTIONFILE ]
  639.         # There is something here, but none of it is ours.
  640.           then
  641.         # Move it to a safe place.
  642.         mv $OPTIONFILE "${OPTIONFILE}.old"
  643.         fi
  644.         # And create a new file.
  645.         touch $OPTIONFILE
  646.         chgrp dip $OPTIONFILE
  647.         cat >"$OPTIONFILE" <<EOF
  648. # This file was generated by pppconfig.  You can edit the following lines
  649. # but please do not delete lines or the change the comments or you will
  650. # confuse pppconfig.
  651. noauth         #pppconfig_noauth
  652. connect "/usr/sbin/chat -v -f $CHATFILE"  #pppconfig_connect
  653. debug          #pppconfig_debug     
  654. $ispport       #pppconfig_dev
  655. $ispspeed      #pppconfig_speed
  656. $route         #pppconfig_route
  657. $ipdefault     #pppconfig_ipdefault
  658. user $ispname  #pppconfig_user
  659. # End of pppconfig controlled lines.  You can add lines below here without
  660. # confusing pppconfig.
  661. EOF
  662.     fi
  663.     
  664.     # If there is no CHATFILE, create it.
  665.     if [ ! -f $CHATFILE ]
  666.     then
  667.         touch $CHATFILE
  668.         chgrp dip $CHATFILE
  669.         fi
  670.  
  671.     # If there is no pppconfig/provider, create it.
  672.     if [ ! -f "${PPPCONFIG_DIR}/$provider" ]
  673.     then
  674.         touch "${PPPCONFIG_DIR}/$provider"
  675.         chmod 600 "${PPPCONFIG_DIR}/$provider"
  676.         fi
  677.  
  678.     # If pppconfig/provider is older than CHATFILE and CHATFILE is not empty
  679.     # move CHATFILE to CHATFILE.old and create a new CHATFILE.
  680.     if [ \( $CHATFILE -nt "${PPPCONFIG_DIR}/$provider" \) -a -s $CHATFILE ]
  681.     then
  682.         mv $CHATFILE ${CHATFILE}.old
  683.         touch $CHATFILE
  684.         chgrp dip $CHATFILE
  685.     fi
  686.  
  687.     if  [ $ispauth = "chat" ]
  688.     then
  689.         cat > "$CHATFILE" <<EOF
  690. $abortstring
  691. "" $modeminit
  692. OK $atdx$ispnumber
  693. CONNECT $ispconnect
  694. $isplogin \\d\\q$ispname
  695. $ispprompt \\q$isppwd
  696. $ispothers
  697. "" \\d\\c
  698. EOF
  699.     cat > "${PPPCONFIG_DIR}/$provider" <<EOF
  700. $ispauth
  701. $modeminit
  702. $atdx
  703. $ispnumber
  704. $ispconnect
  705. $isplogin
  706. $ispname
  707. $ispprompt
  708. $isppwd
  709. $ispothers
  710. EOF
  711.  
  712.     else
  713.         cat > $CHATFILE <<EOF
  714. $abortstring
  715. "" $modeminit
  716. OK $atdx$ispnumber
  717. CONNECT \\d\\c
  718. EOF
  719.         cat > "${PPPCONFIG_DIR}/$provider" <<EOF
  720. $ispauth
  721. $modeminit
  722. $atdx
  723. $ispnumber
  724. EOF
  725.         secretsFile
  726.     fi
  727.  
  728.     Nameservers PUT
  729.     return
  730.  
  731. # End of "put".
  732.     ;;
  733.     *)
  734.     return
  735.     ;;
  736.     esac
  737. }
  738.  
  739. secretsFile () {
  740. # This writes the secrets to pap-secrets or chap-secrets.
  741.     if grep -qs "pppconfig for $provider" "${SECRETS_DIR}/${ispauth}-secrets"
  742.     then
  743. sed -e "/pppconfig for $provider/{
  744. n
  745. c\\
  746. $ispname * $isppwd
  747. }
  748. " "${SECRETS_DIR}/${ispauth}-secrets" > $SedFile
  749. cat $SedFile > ${SECRETS_DIR}/${ispauth}-secrets
  750.  
  751.     else
  752.     echo "
  753. # The next line was added by pppconfig for $provider.">>${SECRETS_DIR}/${ispauth}-secrets
  754.     echo "$ispname * $isppwd">>"${SECRETS_DIR}/${ispauth}-secrets"
  755.     fi
  756.     return
  757. }
  758.  
  759.  
  760. doOps () {
  761.     # this function uses the following global variables:
  762.     # ispname - ISP user name for each connection (reset in manage function)
  763.     # ispspeed - connection port speed (reset in Manage)
  764.     # ispport - modem port (reset in Manage)
  765.     # ispnumber - telephone number to call
  766.     # modeminit - modem initialization string
  767.     # atdx - ATDT or ATDP
  768.     # route - defaultroute or -defaultroute
  769.     # ipdefault - noipdefault or an ip number
  770.     # isppwd - password to store
  771.     # ispauth - pap, chap, or chat
  772.  
  773.     title="Manage $1 Configuration"
  774.     case $1 in
  775.     User) # input the user name for the ppp account
  776.         ispname="`inputBox \
  777. "Backspace over the placeholder string and enter the username given to you
  778. by your ISP. If your username includes any space or punctuation marks
  779. enclose it in single quotes like this: 'a !@# weird name' " \
  780. "$title" "${ispname:-replace_with_name}"`"
  781.         if [ $? -ne 0 ]
  782.         then 
  783.         mkMenu
  784.         fi
  785.         return
  786.     ;;
  787.     Port) # identify the port the modem is on
  788.     ispport="`inputBox \
  789. "Enter the port your modem is on.
  790. /dev/ttyS0 is COM1 in DOS
  791. /dev/ttyS1 is COM2 in DOS
  792. /dev/ttyS2 is COM3 in DOS
  793. /dev/ttyS3 is COM4 in DOS
  794. /dev/ttyS1 is the most common.  Note that this must be typed exactly as
  795. shown.  Capitalization is important: ttyS1 is not the same as ttys1." \
  796. "$title" "${ispport:-"/dev/ttyS1"}"`"
  797.     if [ $? -ne 0 ]
  798.     then
  799.         mkMenu
  800.     fi
  801.     return
  802.     ;;
  803.     Defaultroute)
  804.     [ $route = "defaultroute" ] ; nodefaultroute=$?
  805.     [ $route = "-defaultroute" ] ; ddefaultroute=$?
  806.     route=`radiolist \
  807. "Enabling default routing tells your system that the way to reach hosts to
  808. which it is not directly connected is via your ISP. This is almost certainly
  809. what you want.  Use the up and down arrow keys to move among the selections,
  810. and press  the spacebar to select one.  When you are finished, use TAB to
  811. select <OK> and ENTER to move on to the next item." \
  812. "Default Route" \
  813. "defaultroute" "Enable default route" $ddefaultroute \
  814. \"-defaultroute\" "Disable default route" $nodefaultroute \
  815. `
  816.     if [ $? -ne 0 ]
  817.     then
  818.         mkMenu
  819.     fi
  820.     if [ route = \"-defaultroute\" ]
  821.     then
  822.         route=-defaultroute
  823.     fi
  824.     return
  825.     ;;
  826.     Ipdefault)
  827.     ipdefault="`inputBox \
  828. "You almost certainly do not want to change this from the default value of
  829. noipdefault.  This not the place for your nameserver ip numbers.  It is the
  830. place for your ip number if and only if your ISP has assigned you a static
  831. one.  If you have been given only a local static ip, enter it with a colon
  832. at the end, like this: 192.168.1.2: . If you have been given both a local
  833. and a remote ip, enter the local ip, a colon, and the remote ip, like this:
  834. 192.168.1.2:10.203.1.2 ." \
  835. "Ip numbers" "$ipdefault"`"
  836.     if [ $? -ne 0 ]
  837.     then
  838.         mkMenu
  839.     fi
  840.     return
  841.     ;;
  842.     Speed) # get the port speed
  843.     ispspeed="`inputBox \
  844. "Enter your modem port speed (e.g. 9600, 19200, 38400, 115200).  I
  845. suggest that you leave it at 115200." \
  846. "Set Speed" "${ispspeed:-115200}"`"
  847.     if [ $? -ne 0 ]
  848.     then
  849.         mkMenu
  850.     fi
  851.     return
  852.     ;;
  853.     Modeminit)
  854.     modeminit="`inputBox \
  855. "Enter modem intialization string.  The default value is ATZ, which tells
  856. the modem to use its default settings.  As most modems are shipped from
  857. the factory with default settings that are appropriate for ppp, I suggest
  858. you not change this." \
  859. "Modem Intialization" "$modeminit"`"
  860.     if [ $? -ne 0 ]
  861.     then
  862.         mkMenu
  863.     fi
  864.     return
  865.     ;;
  866.     Number) # get the number to call or DIRECT for a direct connection
  867.     [ $atdx = ATDT ] ; pulse=$?
  868.     [ $atdx = ATDP ] ; tone=$?
  869.     ispnumber="`inputBox \
  870. "Backspace over the placeholder string and enter the number to dial.  Don\'t
  871. insert any dashes or spaces.  See your modem manual if you need to do
  872. anything unusual like dialing through a PBX." \
  873. "Number to dial" \
  874. "${ispnumber:-replace_with_number}"`"
  875.     if [ $? -ne 0 ]
  876.     then
  877.         mkMenu
  878.     fi
  879.     atdx=`radiolist \
  880. "Select method of dialing. Since almost everyone has touch-tone, you should
  881. leave the dialing method set to tone unless you are sure you need
  882. pulse. Use the up and down arrow keys to move among the selections, and
  883. press the spacebar to select one. When you are finished, use TAB to
  884. select <OK> and ENTER to move on to the next item." \
  885. "Tone or Pulse" \
  886. "ATDT" "tone" $tone \
  887. "ATDP" "pulse" $pulse \
  888.     if [ $? -ne 0 ]
  889.     then
  890.         mkMenu
  891.     fi
  892.     return
  893.     ;;
  894.     Passwd) 
  895.     isppwd="`inputBox \
  896. "Backspace over the placeholder string and enter the password your ISP gave
  897. you.  If your password includes any space or punctuation marks enclose it
  898. in single quotes like this: 'a !@# weird password'." \
  899. "Enter Password" \
  900. "${isppwd:-replace_with_password}"`"
  901.     if [ $? -ne 0 ]
  902.     then
  903.         mkMenu
  904.     fi
  905.     return
  906.     ;;
  907.     PAP) # PAP specific section
  908.     ispauth="pap"
  909.     doOps Passwd
  910.     ;;
  911.     CHAP) # CHAP specific section
  912.     ispauth="chap"
  913.     doOps Passwd
  914.     ;;
  915.     Chat) # Builds a chat file
  916.     ispauth="chat"
  917.     doOps Passwd
  918.     chatConfig
  919.     ;;
  920.     *)    # Does do everything but auth,passwd
  921.     msgBox \
  922. "Now you will configure some basic connection properties." \
  923. "Configuration"
  924.     if [ $? -ne 0 ]
  925.     then
  926.         mkMenu
  927.     fi
  928.     doOps User
  929.     doOps Port
  930.     doOps Defaultroute
  931.     doOps Ipdefault
  932.     doOps Speed
  933.     doOps Modeminit
  934.     doOps Number
  935.     return
  936.     ;;
  937.     esac
  938.     return
  939. }
  940.  
  941. # Get the nameservers, if resolv.conf doesn't have any.
  942. # RESOLV_CONF is initialized to "OK".
  943. Nameservers () {
  944.     case $1 in
  945.   CHECK) # Check out resolv.conf.  Does it exist?  Are there nameservers in it?
  946.     if [ ! -f $ETC/resolv.conf ]
  947.         then
  948.         RESOLV_CONF=NONE
  949.     elif ! grep -q -s ^nameserver $ETC/resolv.conf
  950.     then
  951.         RESOLV_CONF=EMPTY
  952.     fi
  953.     return
  954.         ;;
  955.     GET) # Get some nameservers from the user.
  956.     if [ $RESOLV_CONF = "OK" ] 
  957.     then 
  958.         return 
  959.     fi 
  960.     if yesNoBox \
  961. "There are no nameservers (DNS servers) listed in your resolv.conf file.
  962. You almost certainly need at least one.  Your ISP should have given you the
  963. number(s) for his.  Do you want to install them now?"
  964.     then
  965.         NAMESERVER1="`inputBox \
  966. "Enter the IP number for your primary nameserver." \
  967. "IP number" ""`"
  968.         if [ $? -ne 0 ]
  969.         then
  970.         mkMenu
  971.         fi
  972.  
  973.         NAMESERVER2="`inputBox \
  974. "Enter the IP number for your secondary nameserver (if any)." \
  975. "IP number" ""`"
  976.         if [ $? -ne 0 ]
  977.         then
  978.         mkMenu
  979.         fi
  980.     fi
  981.     if [ ! $NAMESERVER1 ] && [ ! $NAMESERVER2 ]
  982.     then
  983.         # If she didn't enter anything, she doesn't want us to mess with
  984.         # resolv.conf.
  985.         RESOLV_CONF="OK"
  986.     fi
  987.     return
  988.         ;;
  989.     
  990.     PUT) 
  991.     # Fix up resolv.conf if needed.
  992.     case $RESOLV_CONF in
  993.     OK) # Leave it alone.
  994.         return
  995.         ;;
  996.       NONE) # It doesn't exist: create it.
  997.         touch $ETC/resolv.conf
  998.         chmod a+r $ETC/resolv.conf
  999.         ;;
  1000.     esac
  1001.     # Put some nameservers in it (but not if they are null).
  1002.     if [ $NAMESERVER1 ]
  1003.     then
  1004.         echo "nameserver $NAMESERVER1" >> $ETC/resolv.conf
  1005.     fi
  1006.     if [ $NAMESERVER2 ]
  1007.     then
  1008.         echo "nameserver $NAMESERVER2" >> $ETC/resolv.conf
  1009.     fi
  1010.     RESOLV_CONF="OK"
  1011.     return
  1012.     ;;
  1013.     esac
  1014. }
  1015.  
  1016. usage () {
  1017.     echo "$version"
  1018.     echo "Usage: pppconfig [--version] | [--help]
  1019. '--version' prints the version. '--help' print a help message."
  1020.     exit $1
  1021. }
  1022.  
  1023. help () {
  1024.     echo "
  1025. pppconfig is an interactive, menu driven utility to help automate setting
  1026. up a dial-up ppp connection.  It currently supports PAP, CHAP, and chat
  1027. authentication.  It uses the standard pppd configuration files.  It does
  1028. not make a connection to your ISP, it just configures your system so that
  1029. you can do so with a utility such as 'pon'.
  1030.  
  1031. Before running pppconfig you should know what sort of authentication your
  1032. isp requires, the username and password that they want you to use, and
  1033. the phone number.  If they require you to use chat authentication, you will
  1034. also need to know the login and password prompts and any other prompts and
  1035. responses required for login.  If you can't get this information from your
  1036. ISP you could try dialing in with 'minicom' and working through the procedure
  1037. until you get the garbage that indicates that ppp has started on the other
  1038. end.
  1039.  
  1040. Since pppconfig makes changes in system configuration files, you must be
  1041. logged in as root or use 'sudo' to run it.
  1042. "
  1043.     usage 0
  1044. }
  1045.  
  1046. UI=whiptail
  1047. provider=provider
  1048. ETC=/etc
  1049. CHATFILE=$ETC/chatscripts/$provider
  1050. OPTIONFILE=$ETC/ppp/peers/$provider
  1051. SECRETS_DIR=$ETC/ppp
  1052. PPPCONFIG_DIR=/var/lib/pppconfig
  1053. RESOLV_CONF=OK
  1054. NONAME=0
  1055.  
  1056. if [ $# -eq 1 ]
  1057. then
  1058.     case $1 in
  1059.     --version)
  1060.         echo $version
  1061.         exit 0
  1062.     ;;
  1063.     --help)
  1064.         help
  1065.     ;;
  1066.     dialog)
  1067.         UI=dialog
  1068.         DIALOG_OPTIONS=""
  1069.     ;;
  1070.     debug)
  1071.         set -x
  1072.     ;;
  1073.         --noname)
  1074.         NONAME=1
  1075.     ;;
  1076.     *)
  1077. #        provider=$1
  1078.         usage 1
  1079.     ;;
  1080.     esac
  1081. fi
  1082.  
  1083. if [ $# -gt 1 ]
  1084. then
  1085.     usage 1
  1086. fi
  1087.  
  1088. if [ `id -u` -ne 0 ]
  1089. then
  1090.     echo "You must be root to run this program."
  1091.     exit 1
  1092. fi
  1093.  
  1094. if [ ! -d $ETC/chatscripts ]
  1095. then
  1096.     echo "$ETC/chatscripts does not exist."
  1097.     exit 1
  1098. fi
  1099.  
  1100. if [ ! -d $ETC/ppp/peers ]
  1101. then
  1102.     echo "$ETC/ppp/peers does not exist."
  1103.     exit 1
  1104. fi
  1105.  
  1106. if [ ! -d /var/lib/pppconfig ]
  1107. then
  1108.     # Create a directory to store chat config files in.
  1109.     mkdir /var/lib/pppconfig
  1110.     chmod 700 /var/lib/pppconfig
  1111. fi
  1112.  
  1113. readonly TempFile=`mktemp -q /tmp/pppconfig.XXXXXXXX`
  1114. if [ $? -ne 0 ]
  1115.     then
  1116.     echo "$0: Can't create temp file, exiting."
  1117.     exit 1
  1118. fi
  1119.  
  1120. readonly SedFile=`mktemp -q /tmp/sedfile.XXXXXXXX`
  1121. if [ $? -ne 0 ]
  1122.     then
  1123.     echo "$0: Can't create temp file, exiting."
  1124.     exit 1
  1125. fi
  1126.  
  1127. chmod 0600 $SedFile $TempFile
  1128.  
  1129. Nameservers CHECK
  1130.  
  1131. clear
  1132. while true 
  1133. do
  1134.     mkMenu
  1135. done
  1136.