ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Sviatoslav Sviridov <svd@altlinux.ru>
To: ALT Devel discussion list <devel@lists.altlinux.org>
Subject: Re: [devel] Q: /etc/net 0.8 и Compact 3.0
Date: Sun, 16 Apr 2006 14:01:55 +0300
Message-ID: <44422423.1020605@altlinux.ru> (raw)
In-Reply-To: <4440D6A7.6020604@altlinux.ru>


[-- Attachment #1.1: Type: text/plain, Size: 4372 bytes --]

Sviatoslav Sviridov пишет: 
> ...
>
> Какие еще существенные изменения будут в 0.8.0? Подозреваю, что "код 
> лучше" может быть причиной появления новых "неисправимых преимуществ" ;)
>
> В частности, меня интересует будут ли какие-нить изенения в части 
> работы с pptp и с resolv.conf?

Ну вот, сегодня опять пришлось руками лезть в ipv4route... решил по 
горячим следам вспомнить давнишние свои размышления на эту тему и 
попытаться воплотить их в коде...

Итого:
Имеется настроенное pptp соединение (интерфейс ppp0).
Проблема в том, что defaultroute на это соединение мне поднимать не 
надо, а значит надо прописывать маршруты на подсеть (подсети). etcnet 
сам этого делать не умеет, поэтому надо это делать самостоятельно в 
/etc/net/ifaces/ipv4route.

Первая проблема в том, что для того, чтобы прописать правильный маршрут 
надо как минимум один раз поднять pp(t)p интерфейс и посмотреть кто же 
там будет peer и адрес из какой сети нам дадут.

Если с адресом сети в моем случае и нет проблемы, я его знаю и он 
меняться не собирается, то вот peer является второй проблемой. Он может 
менятся вермя от времени... т.е., в совершенно неожиданные моменты 
времени я могу получить неработающее соединение (до тех пор, пока не 
обновлю ipv4rote).. Итого, я несколько раз уже добавлял маршруты в 
ipv4route (срабатывает только один, на остальные идет ругань, но зато 
так меньше вероятность сломаться :))... Сегодня пришлось бы вписывать 
четвертую строчку с маршрутом на одну и ту же сеть...

Однако попытался пойти другим путем :)

На данный момент имеем ситуацию, при которой нельзя настроить впн 
соединение так, чтобы оно "просто работало" (головная боль писателя 
конфигуратора? ;) ) Если возможность создавать требуемые маршруты не 
можеть быть встроена непосредственно в etcnet (как я понимаю, pilot 
этого делать не собирается), то было бы неплохо предоставить такие 
возможности, чтобы требуемую конфигурацию можно было бы легко создать 
имеющимися средствами. В данном случае - чтобы в ipv4route можно было бы 
задавать правила, которые раскрывались бы в момент исполнения в 
соостветствии с текущей конфигурацией. Например, так:

$MY_NETWORK/$MY_MASK via $PEER

Для простоты реализации я воспользовался шеллом как готовым средством, 
умеющим раскрывать значения переменных ;) Тем более, что сам etcnet 
вовсю этим пользуется внутри себя (здесь появляется дополнительное 
ограничение: имена надо выбирать таким образом, чтобы они не 
пересекались с теми, что уже используются в etcnet).

Алгоритм следующий:
- в ipv4route прописываются маршруты с использованием шелловских переменных
- перед обработкой ipv4route обрабатывается вывод "$IP addr show dev 
$NAME" и устанавливаются значения необходимых переменных
- во время обработки ipv4route в каждой строчке раскрываются значения 
переменных. Если какая-то переменная не раскрылась, то такая строчка 
просто отбрасывается
- по окончании обработки созданные переменные удаляются

При этом такой подход можно использовать не только для ipv4route, но и в 
других местах etcnet.

То, что получилось и сейчас работает, приаттачено.

Сейчас для меня важно было только подхватывать правильный peer, поэтому 
только это и сделано :)
Следующим шагом хотелось вычислить адрес сети на основании заданной 
маски (в случае pp(t)p адрес сети не назначется сервером, а маска 
выставляется только для peer, причем там я видел только /32). Для 
соединений типа link/ether маску сети можно брать прямо из 
установленного адреса (вида x.x.x.x/m), для link/ppp ее  надо будет 
задавать извне... но в данный момент мне заниматься этим стало лень и 
некогда :), так что отсылаю на суд общественности то, что есть :) Это не 
готовый патч для включения в состав, а всего лишь proof of concept пока что.

У меня это работает со следующим содержимым ipv4route:

10.6.0.0/16 via $PEER_IPADDR1
172.27.0.0/16 via $PEER_IPADDR1

Для задания универсальной конфигурации, которая работала бы "из коробки" 
без вмешательства пользователя, надо по полученному ip адресу задать 
адрес сети, взяв маску, соответствующую классу сети.

Здесь, конечно, есть большая неприятность в том, что фалы конфигурации 
становятся подвержены shell injection... Каким образом можно снизить 
такой риск?

-- 
Best regards,
Sviatoslav Sviridov
--
Q:  How many IBM CPU's does it take to execute a job?
A:  Four; three to hold it down, and one to rip its head off.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: etcnet-smartroutes.patch --]
[-- Type: text/x-patch; name="etcnet-smartroutes.patch", Size: 1433 bytes --]

--- /etc/net/scripts/functions.orig	2006-04-15 01:02:00 +0300
+++ /etc/net/scripts/functions	2006-04-16 13:42:21 +0300
@@ -4,7 +4,15 @@
 	[ -s "$optionsfile" ] && . $optionsfile
 done
 
-DENOISE="egrep ^[^#]"
+denoise()
+{
+    local line
+    [ -s "$1" ] && cat "$1"| while read line; do
+	eval "set -u;echo \"$line\"" 2>/dev/null
+    done|egrep -v '(^#|\$)'
+}
+
+DENOISE="denoise"
 
 # Stolen from /etc/init.d/functions and improved.
 is_yes()
--- /etc/net/scripts/config-ipv4.orig	2005-08-10 11:08:40 +0300
+++ /etc/net/scripts/config-ipv4	2006-04-16 12:50:23 +0300
@@ -75,6 +75,10 @@ config_routes_rules()
 {
 	# setup routes
 	local SRCFILE=`profiled_filename $MYIFACEDIR/ipv4route`
+	# get available device information
+	DEVINFO=`$IP addr show dev $NAME`
+	DEVCONFIG=`echo $DEVINFO|tr ' ' '\n'|awk -v force_mask="$FORCE_NETMASK" -f $SCRIPTDIR/parse.awk`
+	eval "$DEVCONFIG"
 	[ -s "$SRCFILE" ] && $DENOISE "$SRCFILE" | \
 	while read FIRST REST; do
 	# If there is no operation, substitute default, otherwise keep.
@@ -88,6 +92,12 @@ config_routes_rules()
 		esac
 		print_progress
 	done
+	
+	# Unset variables
+	DEVCONF_UNSET=`echo "$DEVCONFIG"|sed -e 's:^\([^=]*\)=.*:unset \1:'`
+	eval "$DEVCONF_UNSET"
+	unset DEVCONF_UNSET
+	unset DEVCONFIG
 
 	# Setup rules only after routes are Ok, so that route tables are
 	# already populated when rule starts routing traffic to them.

[-- Attachment #1.3: parse.awk --]
[-- Type: text/plain, Size: 898 bytes --]

BEGIN {
	addr_num=0
}

function get_mask(prefix,    suffix) {
	if (prefix <= 0)
		return 0
	if (prefix >= 32)
		return 0xffffffff

	suffix = 32 - prefix
	return lshift(rshift(0xffffffff, suffix), suffix)
}

function decode_mask(mask,    m1, m2, m3, m4) {
	m1 = rshift(and(mask, 0xff000000), 24)
	m2 = rshift(and(mask, 0x00ff0000), 16)
	m3 = rshift(and(mask, 0x0000ff00),  8)
	m4 =        and(mask, 0x000000ff)
	return sprintf("%d.%d.%d.%d", m1, m2, m3, m4)
}

/inet/ {
	getline ipaddr

	split(ipaddr, a, "/")
	printf "IPADDR%d=%s\n", ++addr_num, a[1]
	if ( length(force_mask) > 0 ) {
		printf "NETMASK%d=%s\n", addr_num, decode_mask(get_mask(force_mask))
	} else if ( a[2] )
		printf "NETMASK%d=%s\n", addr_num, decode_mask(get_mask(a[2]))

}

/peer/ {
	getline peer
	split(peer, p, "/")
	mask = get_mask(p[2])
	printf "PEER_IPADDR%d=%s\n", addr_num, p[1]
}

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 252 bytes --]

  parent reply	other threads:[~2006-04-16 11:01 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-14 13:37 Denis Ovsienko
2006-04-14 13:45 ` Anton Farygin
2006-04-14 14:03   ` Denis Ovsienko
2006-04-14 14:29 ` Sergey Y. Afonin
2006-04-14 14:39   ` Michael Shigorin
2006-04-14 14:54     ` Sergey Y. Afonin
2006-04-14 19:43   ` Denis Ovsienko
2006-04-15  8:42     ` Michael Shigorin
2006-04-15 11:19 ` Sviatoslav Sviridov
2006-04-15 12:13   ` Valery V. Inozemtsev
2006-04-15 12:15     ` Andrey Rahmatullin
2006-04-15 12:20       ` Valery V. Inozemtsev
2006-04-15 13:09         ` Andrey Rahmatullin
2006-04-15 16:11           ` Sviatoslav Sviridov
2006-04-16  7:53   ` Denis Ovsienko
2006-04-16 11:01   ` Sviatoslav Sviridov [this message]
2006-04-16 12:21     ` Michael Shigorin
2006-04-17 18:08 ` Andrey Brindeew
2006-04-18 11:07 ` Sergey Y. Afonin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44422423.1020605@altlinux.ru \
    --to=svd@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git