LINUX.ORG.RU
ФорумAdmin

BASH function

 ,


0

2

Привет всем!

Подскажите советом.

Допустим есть баш файл с функцией

#!/bin/bash

ipset_del () {
  ipset del uplink_net_iface 0.0.0.0/0,$1
}

Этот файл подгружается с разных скриптов например /etc/ppp/ip-up.d/ и вызывается эта функция с разными значениями переменной $1 для функции.

...
source ./func

ipset_del eth0
...

Суть проблемы в том что иногда при вызове и выполнении скрипта, вызывая функцию она выполняется не с той переменной которой нужно, а с предыдущей например или еще какой -нибудь ранее используемой. Естественно выполняется не та команда которая нужна.

Как правильно использовать функции в таком варианте?


Ответ на: комментарий от PPP328

Вообщем. Есть список

# ipset list uplink_net_iface
Name: uplink_net_iface
Type: hash:net,iface
Revision: 6
Header: family inet hashsize 4096 maxelem 65536
Size in memory: 608
References: 2
Members:
0.0.0.0/0,vlan7
0.0.0.0/0,ppp0
0.0.0.0/0,ppp1
0.0.0.0/0,vlan2000
0.0.0.0/0,vlan1005
0.0.0.0/0,vlan1006

Есть функция

# cat /usr/net/net-func.d/ipset
#!/bin/bash

...

ipset_del () {

  if [ -n "$(ipset list uplink_net_iface | grep $1)" ]; then
    ipset del uplink_net_iface 0.0.0.0/0,$1
  fi

...

}

Есть скрипт для ppp

# cat /etc/ppp/ip-down.d/uplink_rules
#!/bin/bash

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -x -w 60 "$0" "$0" "$@" || :

echo -e "\n--- IP-DOWN FOR $1 `date +"%T %d.%m.%Y"` ---" >> /var/log/pppd.log

exec 1>> /var/log/pppd.log
exec 2>> /var/log/pppd.log

source /usr/net/vars

# Load net function
for func in $(ls /usr/net/net-func.d/*); do source $func; done

...

ipset_del $1

...

exit 0

Есть другой скрипт для статики

# cat /usr/net/net-down
#!/bin/bash

source /usr/net/vars

# Load net function
for func in $(ls /usr/net/net-func.d/*); do source $func; done

...

ipset_del $i

...

exit 0

Так вот иногда при вызове скрипта /etc/ppp/ip-down.d/uplink_rules и соответственно вызове функции с передачей имени интерфейса в функцию, удаляется запись в ipset с другим интерфейсом vlan2000 vlan1006 или другим не ppp. Такое ощущение как-будто выполняется функция с предыдущей переданной переменной.

fet4 ()
Ответ на: комментарий от fet4

Такое ощущение как-будто выполняется функция с предыдущей переданной переменной.

Залогируйте вызов функции: logger «ipset_del $i» перед вызовом. Так вы узнаете, что именно передаётся. Вообще у вас изврат, конечно. достаточно

ipset list uplink_net_iface | grep -q «$1» && ipset del uplink_net_iface 0.0.0.0/0,$1

vodz ★★★★★ ()
Ответ на: комментарий от fet4

Да ?

Ну что за тупняк? Я же сказал, что это правильный аналог вашего изврата в функции.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Залогировал так logger «ipset_del $1» logger показал что функции c /etc/ppp/ip-down.d/uplink_rules вызываются с нужными параметрами т.е. с ppp интерфейсами, но при этом со списка удалился другой интерфейс.

fet4 ()
Ответ на: комментарий от fet4

logger показал что функции c вызываются с нужными параметрами

Полдела сделали. Теперь залогируйте перед вызовом ipset del внутри функции. Так можно увидеть, не вызывается ли где ещё, а так же, что маловероятно, что глючит ipset :)

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Залогировал, тоже самое, переменные все правильные удалений с ненужными интерфейсами не было.

Вообще в скрипте логируется stderr и stdout в отдельный файл и при удалении со списка, всегда все правильные переменные были во время сбоя.

Может все-таки ipset ?

fet4 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.