5. 附加功能

内容:

5.a. 标准函数钩子

你可以定义4个函数,它们将会在start/stop操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。

preup()predown()函数的返回值必须为0(成功),这意味着可以使一个网络接口进入配置状态或退出配置状态。如果preup()返回一个非0值,则网络接口配置过程将被中止。如果predown()返回一个非0值,则停止该网络接口运行的操作将被终止。

postup()postdown()函数的返回值会被忽略,因为就算它们返回失败,系统也没有什么可以做的。

${IFACE}表示要打开/关闭的接口。${IFVAR}${IFACE}转化而来的bash允许的变量名。

代码 1.1: pre/post up/down函数范例

preup() {
  # 在打开接口之前先测试它的网络物理连接是否已连接上。这只在某些网络
  # 适配器上有效,而且需要安装ethtool包。
  if ethtool ${IFACE} | grep -q 'Link detected: no'; then
    ewarn "No link on ${IFACE}, aborting configuration"
    return 1
  fi

  # 记得返回0以表示操作成功
  return 0
}

predown() {
  # 脚本默认内容是测试根文件系统是否是NFS提供的。在此情况下系统是不会允
  # 许你关闭接口的。注意,如果你定义了一个predown()函数,你就覆盖了这个逻辑。
  # 如果你仍然需要它的话,请往下看……
  
  if is_net_fs /; then
    eerror "root filesystem is network mounted -- can't stop ${IFACE}"
    return 1
  fi

  # 记得返回0以表示操作成功
  return 0
}

postup() {
  # 这个函数可以被用来实现一些功能,比如注册一个动态DNS服务。
  # 而另一个可能是在网络接口一启动时就开始传送/接收邮件。
  return 0
}

postdown() {
  # 这个函数出现在这主要是为了完整性……我还没有想到任何可以用它来做的好玩的事情 ;-)
  return 0
}

5.b. 无线工具函数钩子

注意: 此功能不适用于WPA Supplicant──但是${ESSID}${ESSIDVAR}变量在postup()函数中是可用的。

你可以定义2个函数,它们将会在执行相关的操作前后被调用。这些函数将会以接口名称作为参数被调用,以便于一个函数可以控制多个适配器。

preassociate()函数的返回值应该为0(成功),这意味着一个网络接口的配置或取消配置过程可以继续。如果preassociate()返回一个非0值,则网络接口的配置过程将被中止。

postassociate()函数的返回值是被忽略的,因为就算它们返回失败,系统也没有什么可以做的。

${ESSID}被设置为你所连接到的AP的ESSID。${ESSIDVAR}${ESSID}转化而来的bash允许的变量名。

代码 2.1: pre/post association functions

preassociate() {
  # 下面添加了两个配置变量leap_user_ESSID和leap_pass_ESSID。
  # 当你已经连接的ESSID的这两个变量都被配置时,我们就执行CISCO LEAP脚本。
  

  local user pass
  eval user=\"\$\{leap_user_${ESSIDVAR}\}\"
  eval pass=\"\$\{leap_pass_${ESSIDVAR}\}\"

  if [[ -n ${user} && -n ${pass} ]]; then
    if [[ ! -x /opt/cisco/bin/leapscript ]]; then
      eend "For LEAP support, please emerge net-misc/cisco-aironet-client-utils"
      return 1
    fi
    einfo "Waiting for LEAP Authentication on \"${ESSID//\\\\//}\""
    if /opt/cisco/bin/leapscript ${user} ${pass} | grep -q 'Login incorrect'; then
      ewarn "Login Failed for ${user}"
      return 1
    fi
  fi

  return 0
}

postassociate() {
  # 这个函数出现在这主要是为了完整性……我还没有想到任何可以用它来做的好玩的事情 ;-)

  return 0
}

注意: ${ESSID}${ESSIDVAR}predown()postdown()函数中不可用。