| Summary: | Не показывает бридж,ели не указать явно имя | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | stalker <stalker> |
| Component: | ip-brctl | Assignee: | Alexey Shabalin <shaba> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P5 | CC: | alimektor, shaba, vsu |
| Version: | unstable | ||
| Hardware: | x86_64 | ||
| OS: | Linux | ||
Не показывает бридж,ели не указать явно имя
Версия
ip-brctl-0.1-alt1
Дистрибутивы
- ALT Server 11.0 (Sisyphus)
Шаги Воспроизведения
1. Установить пакет:
# apt-get install -y ip-brctl
2. Создать сетевой мост:
# ip link add name br150 type bridge && \
ip link add veth0 type veth peer name veth1 && \
ip link set veth1 master br150 && \
ip link set br150 up
3. Выполнить показ всех мостов:
# brctl show
Ожидаемый результат: Показан только что настроенный мост:
bridge name bridge id STP enabled interfaces
br150 8000.9e92f658947c no veth1@veth0
Так указано в help:
show [ <bridge> ] show a list of bridges
Фактический результат: Ничего не показывает:
bridge name bridge id STP enabled interfaces
Воспроизводится в P11.
Дополнительно
Проблема находится в строке 479 файла /usr/sbin/brctl в функции
cmd_show:
for line in $(${IP} -br link show type bridge "${dev}" 2>/dev/null); do
Когда dev пуст (вызов brctl show без аргументов), команда выполняется
как:
ip -br link show type bridge ""
Что приводит к ошибке:
Device "" does not exist.
При этом команда без пустого аргумента работает корректно:
ip -br link show type bridge # работает
ip -br link show type bridge "" # ошибка exit code 1
Предполагаемое исправление
Необходимо условно передавать аргумент, только если он задан:
if [ -n "${dev}" ]; then
for line in $(${IP} -br link show type bridge "${dev}" 2>/dev/null); do
else
for line in $(${IP} -br link show type bridge 2>/dev/null); do
fi
Ну или менять документацию и проверять условием выше:
if [ -z "${dev}" ]; then
err_dev_exists n "${dev}" "bridge ${dev} does not exist!"
err_dev_exists n "${dev}" "device ${dev} is not a bridge!" bridge
fi
Именно в таком ключ не получится - внутри if ломается цикл for line in $(${IP}....
Только если блок целиком переносить внутрь if. Но это как-то не красиво
Можно написать ${dev:+"${dev}"}, чтобы сохранить кавычки на случай наличия внутри параметра пробелов, но убрать аргумент, если значение ${dev} пустое.
ip-brctl-0.2-alt1 -> sisyphus: Wed Feb 25 2026 Alexey Shabalin <shaba@altlinux> 0.2-alt1 - Fix brctl show with no bridge (ALT#57898). Отправить бы версию с исправлением и в P11 #411791 |
rpm -qf /usr/sbin/brctl ip-brctl-0.1-alt1.noarch [root@alt11 ~]# brctl show bridge name bridge id STP enabled interfaces brctl show br150 bridge name bridge id STP enabled interfaces br150 8000.0e0ed42ea50 no vlan150@enp7s0f0 Всё дело в строке 481 for line in $(${IP} -br link show type bridge "${dev}" 2>/dev/null); do быстрохак - for line in $(${IP} -br link show type bridge "${dev}" 2>/dev/null); do + for line in $(${IP} -br link show type bridge ${dev} 2>/dev/null); do Но это именно хак на скорую руку...