PPPui:一个友好的 PPP 图形用户界面

作者:Nathan Meyers

PPP,点对点协议,是当今通过串行线路进行网络连接的首选协议。对于 Linux 用户来说,首选工具是 PPP 实用程序。这些实用程序——pppdchat 以及一系列脚本和实用程序——出色地管理从启动到关闭的连接:拨号和登录、启动协议、添加路由信息以及关闭连接。

PPP 实用程序所没有的是一个良好的用户界面。如果您使用这些实用程序,您就会知道这个例程:执行一个名为 /etc/ppp/scripts/ppp-on 的脚本,听着您的调制解调器发出噪音,然后等待您的网络连接尝试开始工作。如果没有任何反应,请检查进程列表。如果 pppd 没有运行,则登录尝试失败,您需要重试。如果连接中断,您最终会通过检查进程列表并启动新连接来弄清楚。在您使用 PPP 实用程序一段时间后,情况会有所改善——您开始通过磁盘活动的声音来识别连接状态。

PPPui 的编写源于我对实用程序低技术界面感到沮丧。它是一个基于 X 的(特别是基于 Tcl/Tk 的)GUI,它提供了对 PPP 连接的非常简单的控制。目标是提供简单的启动和关闭以及关于连接的有用可视化反馈。

PPPui 会话的场景大致如下

  • 启动 PPPui。我已经定义了一个窗口管理器操作(如下所述),这使得它成为一键式操作。

  • 一个窗口弹出并报告登录过程的进度。如果登录失败,窗口消失,您必须重试。

  • 一旦登录成功并且添加了 PPP 路由,PPPui 就会显示连接时间的运行计时器。即使您最小化 PPPui,计时器也可见。

  • 要终止连接,请按 PPPui 的“Quit”(退出)按钮。

PPPui 实现为一个 wish (窗口 Shell—Tcl/Tk 包的一部分) 脚本,并且需要 wish4.2。它不会取代 PPP 实用程序,但确实需要对它们进行一些非常小的更改——稍后将详细讨论。

程序概览

PPPui 脚本是在使用 PPP 实用程序源代码发行的 Slackware 系统上开发的。在以下描述和脚本本身中,存在关于位置(脚本和可执行文件)和权限的假设,这些假设不一定适用于其他发行版。该脚本接受两个必需参数和两个可选参数。基本调用接受 PPP 启动命令、PPP 关闭命令以及可选的要打开的 PPP 设备名称(默认为 ppp0)。例如

PPPui /etc/ppp/scripts/ppp-on\
        /etc/ppp/scripts/ppp-off ppp0

启动和关闭命令在被调用时由 /bin/sh 解释,并且可以包含多个参数和 shell 将识别的任何其他内容。例如

PPPui /etc/ppp/scripts/ppp-on\
        '/etc/ppp/scripts/ppp-off ppp0' ppp0
另一个可选参数 -small 在“与窗口管理器交互”部分中描述。

在解析命令行之后,PPPui 设置 shell 命令,用于解释启动和关闭命令。然后,它设置一个简单的 GUI,其中包含一个标签、一个“quit”(退出)按钮和一个用于显示状态信息的滚动文本控制台。PPPui 还为控制台设置了一个命名管道,其目的在“PPP 实用程序中需要的更改”部分中进行了解释,并且它启动启动命令并捕获输出。设置完成后,PPPui 最重要的工作是等待某些事情发生。以下是它正在等待的事情

  • 启动命令生成输出,或者通过命名管道接收输出。输出分别由 HandleStartOutput{} 或 HandleFIFOInput{} 捕获,并通过调用 ToConsole{} 发送到控制台。

  • PPP 连接已建立。PPPui 每 1/2 秒调用 CheckPPPDevice{} 来检查 /proc/net/route 的内容,直到设备出现路由(脚本的第三个参数命名设备)。一旦路由出现,PPPui 就会开始运行连接时间的显示,每秒调用 PostTime{} 一次来更新时钟。时钟显示在 GUI 左上角的标签中,也显示在窗口的标题中。这允许即使在窗口最小化时也可见时钟。

  • 用户请求通过按下“Quit”(退出)按钮或关闭窗口来关闭连接。调用 PPPQuit{} 以调用关闭命令。调用之后,PPPui 恢复等待。来自关闭命令的任何输出都由 HandleStopOutput{} 捕获并发送到控制台。

  • 启动命令终止。这通常是对执行关闭命令的响应,但也可能在连接断开或登录失败时发生。启动命令的终止会导致 HandleStartOutput{} 检测到 EOF 条件,此时 PPPui 终止并且其窗口消失。

PPP 实用程序中需要的更改

PPPui 可以与现有的 PPP 实用程序一起使用——几乎。需要一个必需的更改和一个可选的更改来影响从实用程序到 PPPui 的接口

  • 必需:启动脚本必须在连接关闭之前不终止。正常的 pppd 行为是在后台作为守护进程运行——这不适用于 PPPui。您需要在 ppp-on 脚本中向 pppd 的调用添加 -detach 选项。在我基于 PPP 实用程序的 2.2.0f 发行版的 ppp-on 版本中,pppd 调用如下所示

         exec /usr/sbin/pppd debug lock modem crtscts\
         /dev/modem 38400 asyncmap 20A0000 escape FF\
         kdebug 0 -detach $LOCAL_IP:$REMOTE_IP\
         noipdefault netmask $NETMASK defaultroute\
         connect $DIALER_SCRIPT
    
  • 可选:chat 程序负责拨号和登录职责,它具有将从远程调制解调器接收到的所有文本记录到 stderr 的选项——也就是说,显示如果您从终端登录会看到的内容。如果使用 -V 命令启用此选项,则生成的 stderr 提供了登录进度的良好显示,这将是 PPPui 控制台上的有用反馈。不幸的是,chat 的 stderr 被 pppd 吞噬用于日志记录目的。因此,PPPui 提供了一条通往控制台的替代路线:一个命名管道,其名称通过 PPPUI_PIPE 环境变量进行广播。通过向 chat 调用添加 -V 并将 stderr 重定向到命名管道,您可以在控制台上捕获登录序列。摘自我版本的 ppp-on-dialer 脚本

     if [ "$PPPUI_PIPE" != "" ] ;
     then exec 2>"$PPPUI_PIPE" ; fi
     exec /usr/sbin/chat -V

图 1. PPPui 屏幕截图

图 1 是 PPPui 的屏幕截图,拍摄于我与波特兰的 ISP Teleport 建立连接后十秒。登录序列被捕获在控制台中,时钟在左上角和标题栏上滴答作响。如果我最小化客户端,运行的时钟会与图标或任务栏一起显示(取决于您选择的窗口管理器)。

安全和权限呢?对实用程序进行一项更改似乎是合适的,它在侧边栏 “PPP 安全性和那些麻烦的只运行脚本” 中讨论。

与窗口管理器交互

通过向窗口管理器添加 PPPui 操作,您可以使启动 PPP 连接成为一键式操作。我使用 FVWM95 作为我的管理器;我 .fvwm95rc 中的这一行将 PPP 启动添加到 FvwmButtons 面板

*FvwmButtons(Title 'teleport', \
Action 'Exec "Teleport Connect" \
PPPui -name "Teleport Connect" \
"/etc/ppp/scripts/ppp-on" \
"/etc/ppp/scripts/ppp-off" ppp0 &')

PPPui 还有一个额外的选项来方便与 FVWM95 交互。-small 窗口名称 参数导致在建立连接后发生以下两个操作

  1. 控制台被取消映射,时钟和退出按钮被重新打包到一个非常小的区域。

  2. 窗口标题更改为作为选项一部分指定的窗口名称。

为了支持 FvwmButtons 的“吞噬”功能,.fvwm95rc 中需要以下条目

*FvwmButtons(Title 'teleport', Swallow \
        (Useold Respawn) "pppui_swallow"\
        Nop, Action 'Exec PPPui -name \
        "Teleport Connect" -small pppui_swallow\
        "/etc/ppp/scripts/ppp-on" \
        "/etc/ppp/scripts/ppp-off" ppp0 &')

它创建了 PPPui 的调用,该调用在建立连接后被吞噬到按钮面板中,如图 2 所示。(不幸的是,FvwmButtons 的语义导致按钮在连接未激活时以持续按下的状态出现,这有点分散注意力。)

图 2. FvwmButtons 示例

结论

PPPui 用一个简单、直观的图形界面取代了难以使用且晦涩的用户界面。PPPui 程序和 rscript 实用程序的代码可以通过匿名下载在文件 ftp.linuxjournal.com/pub/lj/listings/issue50/2491.tgz 中获得。

资源

PPPui: A Friendly GUI for PPP
Nathan Meyers 是波特兰一家大型电子公司的员工顾问,他专注于基于 UNIX 的产品的应用程序性能。可以通过 nmeyers@teleport.com 与他联系。
加载 Disqus 评论