Нужен скрипт, а мозгов не хватает написать...

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
6eremot
рядовой
Сообщения: 13
Зарегистрирован: 2007-11-08 18:20:57

Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение 6eremot » 2008-11-30 7:24:37

Прошу помощи ибо сам не програмер и не в состоянии догнать как написать скрипт.
Возможно это будет 2 скрипта, первый например для определения параметром, а второй непосредственно для выполнения команды на свиче.

Есть энное количество свичей D-Link DES-3028 к которым подключены юзеры.
Так же существует база mysql, где лежат все данные по юзерам, свичам, портам и ip-адресам, т.е. какой юзер куда подключен и какой у него должен быть ip-адрес.
У каждого свича и порта в базе свой id-номер, но у порта еще есть и имя из цифр от 001 до 028, что соответствует номеру порта на самом свиче.
Т.е. в базе номер порта может быть 120, а на свиче 28.

Для примера vasya подключен к порту 27 4-го свича, а petya к порту 2 2-го свича.
Запускаем скрипт для vasya ./acl_dlink.sh vasya

Скрипт лезет в базу находит в таблице vgroups юзера vasya и смотрит какой у него vg_id, в моем случае vg_id=1.
Далее в таблице devport2vgroup определяет к какому порту подключен vg_id=1 и видит port_id=83 что соответствует 83 порту в базе.
Потом в таблице deviceports смотрит на каком свиче находиться порт 83 и какой у него номер на самом свиче.
Видим что порт 83 находиться на свиче dev_id=4 и его номер на самом свиче 027, но надо откинуть все нули чтобы номера были от 1 до 28
Теперь чтобы записать acl на свич, надо узнать какой ip-адрес у свича, смотрим в таблицу devices и видим что у свича id=4 ip-адрес 10.10.0.110.
Еще дальше надо определить какой же все таки прописывать ip-адрес на порту 27 свича с адресом 10.10.0.110.
Это записано в таблице deviceparms, т.е. port_id=83 value=10.10.109.1

Потом запихивает в свич acl-правило в заранее подготовленный профиль, например:

Код: Выделить всё

config access_profile profile_id 10 add access_id auto_assign ip source_ip 10.10.109.1 port 27 permit
и для petya

Код: Выделить всё

config access_profile profile_id 10 add access_id auto_assign ip source_ip 10.11.110.2 port 2 permit
Таблица vgroups - аккаунты и их id-номера, login=vasya и его id-номер vg_id=1

Код: Выделить всё

login=vasya vg_id=1;
login=petya vg_id=2;
Таблица devport2vgroup - привязка id-аккаунта к id-порта, vg_id=1 подключен к port_id=83

Код: Выделить всё

vg_id=1 port_id=83;
vg_id=2 port_id=2;
Таблица devices - данные по свичам, т.е. id-номер свича id=4 и его ip-адрес mac=10.10.0.109

Код: Выделить всё

id=2 mac=10.10.0.110;
id=4 mac=10.10.0.109;
Таблица deviceparms - привязка ip-адреса к id-порта, на порту с port_id=83 должен быть ip-адрес value=10.10.109.1

Код: Выделить всё

port_id=83 value=10.10.109.1
port_id=2 value=10.11.110.2
Таблица deviceports - связка id- порта с id-свича и его имя на свиче, id=83 на dev_id=4 его номер name=027

Код: Выделить всё

id=2 dev_id=2 name=002
id=83 dev_id=4 name=027
Перед тем как засунуть acl думаю имеет смысл проверить, а нет ли там уже правила для этого ip-адреса и быть может ничего не надо делать, сделать это можно через snmp:
snmpwalk -v2c -c public 10.10.0.109 1.3.6.1.4.1.171.12.9.3.2.1.4.10
Ответ от свича будет примерно такой
  • SNMPv2-SMI::enterprises.171.12.9.3.2.1.4.10.1 = IpAddress: 10.10.109.1
    SNMPv2-SMI::enterprises.171.12.9.3.2.1.4.10.2 = IpAddress: 10.10.109.2
    SNMPv2-SMI::enterprises.171.12.9.3.2.1.4.10.3 = IpAddress: 10.10.109.3
Красным цветом помечаны номера правил в профиле.

Это будет скрипт для добавления acl на свич, по аналогии которого я думаб уже не составить труда сделать скрипт для удаления acl со свича.

Надеюсь что в долгу не останусь :drinks: правда живу у черта в ...

Может кто за мани поможет, тогда в пм

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение zg » 2008-11-30 8:02:24

фигасе... :crazy:

накатать в принципе не сложно... Букф действительно много, но млин они все поделу....

Сёдня завтра, если время выкрою, чё-нить состряпаю :smile:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение zg » 2008-12-01 20:35:32

Код: Выделить всё

zg# ./acl_dlink.sh vasya
Device:  10.10.0.109
Command: config access_profile profile_id 10 add access_id auto_assign ip source_ip 10.10.109.1 port 27 permit
zg# ./acl_dlink.sh petya
Device:  10.10.0.110
Command: config access_profile profile_id 10 add access_id auto_assign ip source_ip 10.11.110.2 port 2 permit
zg#
собстна скрипт

Код: Выделить всё

#!/bin/sh

cd "`dirname $0`"

VGROUPS=vgroups
DEVPORT=devport2vgroup
DEVICEP=deviceports
DEVICES=devices
DEVICEU=deviceparms

get_vg() {
  awk -v login="$1" '{if (login && $1 == "login="login) print $2}' "${VGROUPS}" | awk -F=\|\; '{print $2}'
}

get_port() {
  awk -v vg="$1" '{if (vg && $1 == "vg_id="vg) print $2}' "${DEVPORT}" | awk -F=\|\; '{print $2}'
}

get_dev_by_port() {
  awk -v port="$1" '{if (port && $1 == "id="port) print $2}' "${DEVICEP}" | awk -F=\|\; '{print $2}'
}

get_dev_name() {
  awk -v id="$1" '{if (id && $2 == "dev_id="id) print $3}' "${DEVICEP}" | awk -F=\|\; '{print $2 + 0}'
}

get_dev_ip() {
  awk -v id="$1" '{if (id && $1 == "id="id) print $2}' "${DEVICES}" | awk -F=\|\; '{print $2}'
}

get_user_ip() {
  awk -v port="$1" '{if (port && $1 == "port_id="port) print $2}' "${DEVICEU}" | awk -F=\|\; '{print $2}'
}

exit_msg() {
  echo "$1" 1>&2
  exit 1
}

      VG=`get_vg "$1"`
    PORT=`get_port "${VG}"`
  DEV_ID=`get_dev_by_port "${PORT}"`
DEV_NAME=`get_dev_name "${DEV_ID}"`
  DEV_IP=`get_dev_ip "${DEV_ID}"`
 USER_IP=`get_user_ip "${PORT}"`

if [ -n "$USER_IP" ]; then
  echo "Device:  ${DEV_IP}"
  echo "Command: config access_profile profile_id 10 add access_id auto_assign ip source_ip ${USER_IP} port ${DEV_NAME} permit"
fi
дальше сам пили, у меня свичей нет :smile:
6eremot писал(а):Надеюсь что в долгу не останусь
это сюда http://anton-pribora.ru/site/money.php#donation

6eremot
рядовой
Сообщения: 13
Зарегистрирован: 2007-11-08 18:20:57

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение 6eremot » 2008-12-02 14:05:58

Спасибо за помощь, но не совсем понятна строка

Код: Выделить всё

cd "`dirname $0`"
для чего она?

Код: Выделить всё

get_vg() {
  awk -v login="$1" '{if (login && $1 == "login="login) print $2}' "${VGROUPS}" | awk -F=\|\; '{print $2}'
}
:oops: и эта?

Пошел несколько другим путем, помогли накидали все в перле, за пример взял скрипт с форума длинка, ибо все лежит в базе mysql, получилось что-то в духе

Код: Выделить всё

my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

my $sth = $dbh->prepare(qq{
	SELECT
			vgroups.vg_id,
			devport2vgroup.port_id,
			deviceports.dev_id,
			devices.mac,
			deviceports.name,
			deviceparms.value
	FROM
			vgroups,
			devport2vgroup,
			deviceports,
			devices,
			deviceparms
	WHERE
			vgroups.login="ma3a2"
			and devport2vgroup.vg_id=vgroups.vg_id
			and deviceports.id=devport2vgroup.port_id
			and devices.id=deviceports.dev_id
			and deviceparms.port_id=devport2vgroup.port_id
			});
$sth->execute();
Сейчас пытаюсь привентить сюда проверку acl через SNMP, чтобы не делать дубликаты.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение zg » 2008-12-02 16:29:48

6eremot писал(а):ибо все лежит в базе mysql
гм... фигасе, а чё раньше молчал?
6eremot писал(а):для чего она?
переход в папку, где лежит скрипт, дабы проблем не было с относительными путями.
6eremot писал(а):и эта?
выборка номера по логину

6eremot
рядовой
Сообщения: 13
Зарегистрирован: 2007-11-08 18:20:57

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение 6eremot » 2008-12-03 11:18:44

Да я вроде сразу обозначил что все лежит в mysql
zg писал(а):
6eremot писал(а):ибо все лежит в базе mysql
гм... фигасе, а чё раньше молчал?
6eremot писал(а):Так же существует база mysql, где лежат все данные по юзерам, свичам, портам и ip-адресам, т.е. какой юзер куда подключен и какой у него должен быть ip-адрес.
Ну все равно спасибо, с меня на пиво :drinks:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение zg » 2008-12-03 16:39:52

6eremot писал(а):Да я вроде сразу обозначил что все лежит в mysql
гм... и правда :smile: меня просто смутило, что ты выложил текстовые файлы, а не дамп... Надо было просто дамп выложить и сказать что нужно и на каком языке... Просто программирование на шелле достаточно специфично и редко юзает базу, в основном файлы.

kenny
мл. сержант
Сообщения: 78
Зарегистрирован: 2008-11-21 15:13:53
Откуда: Москва
Контактная информация:

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение kenny » 2008-12-17 23:08:07

Скиньте в личку какие команды выполняются непосредственно на свиче и я помогу, если решение не найдено еще :oops:

6eremot
рядовой
Сообщения: 13
Зарегистрирован: 2007-11-08 18:20:57

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение 6eremot » 2008-12-19 3:47:12

Спасибо, на самом свиче выполнить команды не составляет труда, скрипт плавно перешел из shell в perl, хотя может быть можно было бы его реализовать на shell :st:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Нужен скрипт, а мозгов не хватает написать...

Непрочитанное сообщение zg » 2008-12-19 6:50:04

обычно на чём удобней на том и реализуют. У шела есть один непростительный косяк - он не умеет работать с массивами. Плюс ещё пара неприятных моментов, поэтому сложные скрипты на нём не пишут, предпочитая перл.