编辑行

编辑行

星号维基表示可以使用 更改 CLI 提示符的颜色%Cn[;n]。 IE:

export ASTERISK_PROMPT="%C31[%H]: "

但是当我使用上面的导出时,我得到了损坏的提示[1;31m[voip]: [1;0mvoip我的主机名在哪里。

我的终端支持颜色。事实上,我在zsh和中使用了颜色bash。并echo $TERM给了我:

xterm-256color

这是我的终端的屏幕截图:

在此输入图像描述

可以看出,甚至星号消息/日志也是彩色的。我已经在星号邮件列表上询问过,语法export ASTERISK_PROMPT="%C31[%H]: "是正确的。有些人报告颜色提示对他们有用,其他人则遇到与我报告相同的问题。

这让我怀疑,问题可能不在于星号,而在于操作系统环境、终端、终端仿真器等的一些复杂的相互作用。

我尝试了几种不同的终端模拟器:terminatorxtermgnome-terminaletermkonsole。问题是一样的。

我在 asterisk 服务器和连接的桌面上都使用 Debian 10。

如何在 Asterisk 上获得彩色 CLI 提示?

答案1

没有本地修复为了这。

编辑行

NetBSD editline 多年来一直不支持彩色提示。其作用机理是据称支持的彩色提示不起作用,并且自 2015 年(可能更早)以来就已知存在错误。你所看到的正是错误机制的结果。

Nick Zavaritsky 的编辑线分支它不仅正确支持彩色提示,还支持正在编辑的行的(语法)着色,因为它存储左/右提示的字符和编辑缓冲区中的字符的图形再现信息。

Vanilla editline 采取了一条不同的、可以说是较差的路线。 2017 年,“文字”机制得到了加强,以便提示字符串中的文字实际上以正确的顺序发出,并且不会破坏启动时的行宽计算。 (它可以说是较差的,因为它不像 Zavaritsky 风味那样支持任意着色。它保留了原始的使用此字符来标记文字序列原始设计的机制,但可以说这是一个旨在保留的糟糕设计。它过于依赖客户端应用程序对颜色序列进行自己的 termcap 查找。正如我们将看到的,就 Asterisk 而言,这种依赖是错误的。)

星号

Asterisk 使用 NetBSD 编辑线,又名库编辑器在 Debian 命名法中,不要与 Debian 称为的另一个库混淆编辑行

它在提示中手动构建着色序列,这种方式相当糟糕,与 20 世纪 90 年代初期支持 16 色的终端仿真器并不真正兼容,更不用说支持 256 色或 24 位颜色的终端仿真器了。 。 没有使用 termcap/terminfo 来查找setafsetab颜色的数量,它只是硬连线颜色的转义序列,并且弄错了,明亮与大胆的结合,错误地认为 VT100s 有颜色(VT100 是单色的。),不处理超过 8 种颜色,最终到处发出 SGR 0(而不是 SGR 22)。

Asterisk 不使用 Zavaritsky 风格的编辑线,这(讽刺的是)有同样的问题,不支持 AIXterm 16 颜色并且至少在如何错误地解析 Asterisk 错误构造的转义序列方面是错误兼容的。 ☺

使用旧的香草风格的编辑线,您所看到的实际上是预期的结果。转义序列以非转义形式打印。 2017 年后的原版编辑线应该将它们作为实际的转义序列发出。 到 2018 年它就进入了 Debian。那么Debian2019 年重建了其 Asterisk 二进制文件

服务修复

所以有A服务使固定。确保您的包管理器具有高于 3.1-20181209 的 libedit 和高于 1:16.1.1 的 Asterisk。至少问题会明显不同。您将不会再看到问题中的效果,但您可能会看到使用粗体字体、明亮颜色不明亮、“Solarized”颜色主题未完全正常工作等问题。

如果您仍然发现这些版本有问题,请向 Asterisk 和 NetBSD editline 人员投诉;他们实际上只是掩盖了这里的裂缝。

答案2

所需库

Asterisk 使用 libedit 作为提示,该库的旧版本不支持着色,需要高于 3.1-20181209 的版本,在 Debian 上我们可以使用以下内容更新软件包:

# Download the package from Debian 11
wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit2_3.1-20191231-1_amd64.deb
wget http://ftp.br.debian.org/debian/pool/main/libe/libedit/libedit-dev_3.1-20191231-1_amd64.deb

# Update libedit
dpkg -i libedit-dev_3.1-20191231-1_amd64.deb libedit2_3.1-20191231-1_amd64.deb

# Check the installed version
apt list --installed | grep edit

# As a side note here is the Asterisk install process:
cd /sources/dir
./configure
make clean 
make install -j8
make config
make samples

星号提示色块:

Asterisk 的提示着色实现确实存在一个错误,以下补丁(针对 v16.2.1)介绍了 env 变量的用法,ASTERISK_PCOLOR该变量可以设置为颜色编号,例如export ASTERISK_PCOLOR="031"红色;欢迎任何人在上游 PR 这个补丁,应用补丁后请确保make clean之前使用make install(作为奖励,此补丁还支持粗体和背景着色。示例export ASTERISK_PCOLOR="1;31;41":)

--- main/asterisk.c
+++ main/asterisk.c
@@ -2548,7 +2548,7 @@
        return CLI_SUCCESS;
 }
 
-#define ASTERISK_PROMPT "*CLI> "
+#define ASTERISK_PROMPT "*CLI>"
 
 /*!
  * \brief Shutdown Asterisk CLI commands.
@@ -2725,6 +2725,7 @@
 {
        char tmp[100];
        char *pfmt;
+       char *pcolor;
        int color_used = 0;
        static int cli_prompt_changes = 0;
        struct passwd *pw;
@@ -2738,6 +2739,12 @@
                ast_str_reset(prompt);
        }
 
+       if (!(pcolor = getenv("ASTERISK_PCOLOR" ))) {
+               pcolor = "0";
+       }
+
+       ast_str_append(&prompt, 0, "\1\033[%sm\1", pcolor);
+
        if ((pfmt = getenv("ASTERISK_PROMPT"))) {
                char *t = pfmt;
                struct timeval ts = ast_tvnow();
@@ -2839,11 +2846,13 @@
                        ast_term_color_code(&prompt, 0, 0);
                }
        } else {
-               ast_str_set(&prompt, 0, "%s%s",
+               ast_str_append(&prompt, 0, "%s%s",
                        remotehostname ? remotehostname : "",
                        ASTERISK_PROMPT);
        }
 
+       ast_str_append(&prompt, 0, "\1\033[0m\1 ");
+
        return ast_str_buffer(prompt);
 }
 
@@ -3034,7 +3043,7 @@
                history_end(el_hist);
 
        el = el_init("asterisk", stdin, stdout, stderr);
-       el_set(el, EL_PROMPT, cli_prompt);
+       el_set(el, EL_PROMPT_ESC, cli_prompt, '\1');
 
        el_set(el, EL_EDITMODE, 1);
        el_set(el, EL_EDITOR, editor);

相关内容