понедельник, 6 марта 2017 г.

Шпаргалка по слотам (object.__slots__)

Для чего же нужны __slots__?
Снизить потребление памяти, экземпляром класса, путем ограничения количества поддерживаемых атрибутов.



При использовании __slots__, атрибут __dict__ будет недоступен. Если нужно иметь __dict__, его нужно добавить в __slots__, это будет означать что динамические атрибуты будут работать, тоесть добавляться в словарь __dict__.
Пример:


class A(object):
    """Класс со слотами.

    """
    __slots__ = ('a', 'b', 'c')



Соответственно при попытке доступа в __dict__ получим исключение:


In [1]: a = A()

In [2]: a.__dict__
---------------------------------------------------------
AttributeError        Traceback (most recent call last)
 in ()
----> 1 a.__dict__

AttributeError: 'A' object has no attribute '__dict__'

In [3]: dir(a)
Out[3]: 
['__class__',
 '__delattr__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 'a',
 'b',
 'c']



Если добавить __dict__ в слоты

class A(object):
    """Класс со слотами.

    """
    __slots__ = ('a', 'b', 'c', '__dict__')


Тогда:

In [4]: a = A()

In [5]: a.__dict__
Out[5]: {}

In [6]: dir(a)
Out[6]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 'a',
 'b',
 'c']



Не имея атрибута __weakref__, экземпляры классов со __slots__ не поддерживают слабые ссылки на себя. Для поддержки слабых ссылок нужно добавить в перечень атрибутов __weakref__ по тому же принципу как и __dict__.

При наследовании от класса со слотами если не объявлены слоты, будет доступен __dict__ соответственно и динамические аттрибуты будут работать. При этом поведение атрибутов объявленых в слотах родительского класса не пеняется.


class A(object):
    """Класс со слотами.

    """
    __slots__ = ('a', 'b', 'c')


class B(A):
    """Класс без слотов, но наследующий класс со слотами.

    """
    pass

In [7]: b = B()

In [8]: dir(b)
Out[8]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'a',
 'b',
 'c']

In [9]: b.__dict__
Out[9]: {}

In [10]: b.a
---------------------------------------------------------
AttributeError        Traceback (most recent call last)
 in ()
----> 1 b.a

AttributeError: a




При наследовании от класса не имеющего __slots__, родителем будет создан __dict__


class C(object):
    """Класс без слотов.

    """
    pass


class D(C):
    """Класс со слотами, но наследующий класс без слотов.

    """
    __slots__ = ('q', 'w', 'e')


In [11]: c = C()

In [12]: d = D()

In [13]: c.__dict__
Out[13]: {}

In [14]: d.__dict__
Out[14]: {}

In [15]: d.__slots__
Out[15]: ('q', 'w', 'e')

In [16]: dir(c)
Out[16]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']

In [17]: dir(d)
Out[17]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'e',
 'q',
 'w']


И еще, нельзя определить __slots__ для классов наследующихся от встроенных типов переменной длины, например long, str и tuple. Точнее определить можно, но ненужно :) так как получите исключение TypeError
Читать дальше...

вторник, 15 марта 2011 г.

Простое сравнение языков программирования Python PHP

После прочтения mocksoul.livejournal.com решил сравнить PHP и Python на том же коде.

Итак поехали:


IO Test: запись в файл.
test.php
<?php

$fp = fopen('/tmp/iotest', 'wb');
for ($i = 0; $i < 1000000; $i++)
{
fwrite($fp, $i);
}
fclose($fp);

?>

test.py
#!/usr/bin/env python

f = open('/tmp/iotest','wb');
for i in xrange(1000000):
f.write(str(i));
f.close()

Результаты (IO)
php 39.378192 сек.
python 8.538952 сек.
Честно говоря я даже растерялся

Hash Test: создание массивов
test.php
<?php
for ($i = 0; $i < 6000; $i++)
{
$x = array();
for ($j = 0; $j < 1000; $j++)
{
$x[$j] = $i;
$x[$j];
}
}
?>

test.py
#!/usr/bin/env python
for i in range(6000):
x={}
for j in range(1000):
x[j]=i
x[j]

Результаты (Hashing)
php 10.914512 сек.
python 11.578563 сек.

Console Test: Вывод на консоль. В этом тесте я уменьшил число
test.php
<?php
for ($i = 0; $i < 100000; $i++)
{
echo $i . "\n";
}
?>

test.py
#!/usr/bin/env python

for x in xrange(100000):
print x

Результаты (Console)
php 10.52952 сек.
python 10.96296 сек.
List Test: Заполнение списков.
test.php
<?php
for ($i = 0; $i < 3000; $i++)
{
$v = array('a', 'b', 'c', 'd', 'e', 'f', 'g');
for ($j = 0; $j < 1000; $j++)
{
array_push($v, $j);
$v[$j];
}
}
?>

test.py
#!/usr/bin/python
for i in range(3000):
v=['a','b','c','d','e','f','g']
for j in range(1000):
v.append(j)
v[j]

Результаты (List)
php 11.84869 сек.
python 6.69352 сек.
No Test. Просто ничего не делаем.
test.php
<?php

?>

test.py
#!/usr/bin/env python

Результаты (No Test)
php 0.020854 сек.
python 0.000003 сек.
Speed Test: Скорость итераций.
test.php
<?php
for ($i = 0; $i < 20000000; $i++)
{

}
?>

test.py
#!/usr/bin/env python
for x in xrange(20000000):
pass

Результаты (Speed)
php 11.82229 сек.
python 9.83335 сек.

Версии ПО:
PHP 5.3.2
Python 2.6.5
Версия ОС:
Linux 2.6.32-30-generic #59-Ubuntu SMP Tue Mar 1 21:30:21 UTC 2011 i686 GNU/Linux

Получился довольно интересный результат 4 из 6 тестов Python обошел PHP :)

При копировании материалов
ссылка на источник обязательна!


Читать дальше...

понедельник, 5 июля 2010 г.

Форматирование диска из консоли в Debian lenny GNU/Linux

Столкнулся с интересной ситуацией когда нужно было отформатировать диск с NTFS + данные воспользовался программой fdisk. Удалил раздел создал раздел Linux, записал изменения. После монтирования ошалел когда увидел старые данные на этом диске. В следующий раз заюзал cfdisk повторил все действия, но после монтирования снова прозрел хотя и был морально к этому готов. Но после непродолжительного гугления понял что я не один такой и воспользовался советом linuxforums.org а точней командой
mke2fs -j /dev/sdc1
получив при этом ext3 абсолютно пустой.
При копировании материалов
ссылка на источник обязательна!


Читать дальше...

среда, 30 июня 2010 г.

Установка и настройка Network Access Server Abills + Freeradius + pptpd + mysql + Apache2 + Squid на Debian GNU/Linux

О самой установке Debian GNU/Linux можно прочесть на debian.org.

Предполагается что система уже стоит и Internet получаем через NAT на eth1(IP 10.0.0.3), а локальная сеть на eth0(IP 192.168.4.1).
ПО которое нам понадобится

freeradius — радиус сервер
radiusclient1 — радиус клиент
mysql-server — сервер баз данных
apache2 — веб сервер
libdbi-perl libdbd-mysql-perl libdigest-md4-perl libdigest-sha1-perl libcrypt-des-perl — дополнительные библиотеки для интерпритатора Perl
sudo — программа ограничения привилегий
snmp — утилита для работы с Simple Network Management Protocol
pptpd — ВПН сервер
netdiag — набор утилит для диагностики работы сети
iptraf — утилита для просмотра сетевой статистики
mc — файловый менеджер
lynx — консольный браузер

Ставим все одной строкой
aptitude install freeradius radiusclient1 mysql-server apache2 libdbi-perl libdbd-mysql-perl libdigest-md4-perl libdigest-sha1-perl libcrypt-des-perl sudo snmp pptpd netdiag iptraf mc lynx

Настроим параметры системы при загрузке
# nano /etc/rc.local

дописываем
# Выполнить скрипт изменения переменных ядра
exec /etc/sysctl_tune.sh
# Восстановление настроек фаервола
iptables-restore /etc/iptables.conf

создадим скрипт изменения переменных ядра
# touch /etc/sysctl_tune.sh

делаем его исполняемым
# chmod +x /etc/sysctl_tune.sh

открываем для редактирования
# nano /etc/sysctl_tune.sh

вписываем

#!/bin/sh

# Включение форвардинга vpn
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# Включение форвардинга
echo "1" > /proc/sys/net/ipv4/ip_forward
# Увеличение размера очередей
echo "32000000" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo "14400" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo "60" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo "10" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo "4096" > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
echo "1" > /proc/sys/net/ipv4/tcp_syn_retries
Сколько секунд ожидать приема FIN до полного закрытия сокета
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo "0" > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo "0" > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo "0" > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo "1048576" > /proc/sys/net/core/rmem_max
echo "1048576" > /proc/sys/net/core/rmem_default
echo "1048576" > /proc/sys/net/core/wmem_max
echo "1048576" > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo "1" > /proc/sys/net/ipv4/tcp_orphan_retries

Указываем какие модули должны подгружаться при загрузке.
# nano /etc/modules

Дописываем в конец.
ip_conntrack
ip_gre
ip_nat_pptp
ip_conntrack_ftp
ip_nat_ftp

Настройка freeradius сервера
# echo "" > /etc/freeradius/users
# nano /etc/freeradius/users

пишем
DEFAULT Auth-Type = Accept

потом
# nano /etc/freeradius/acct_users

в конце дописываем
DEFAULT Acct-Status-Type == Start
Exec-Program = "/usr/abills/libexec/racct.pl"
DEFAULT Acct-Status-Type == Alive
Exec-Program = "/usr/abills/libexec/racct.pl"
DEFAULT Acct-Status-Type == Stop
Exec-Program = "/usr/abills/libexec/racct.pl"

Пропишем разрешенных клиентов
# nano /etc/freeradius/clients.conf

Всё ремарим и дописываем
client 127.0.0.1 {
secret = radsecret
shortname = shortname
}
client 192.168.4.1 {
secret = radsecret
shortname = shortname
}

Допишем пред и пост авторизацию для биллинга
# nano /etc/freeradius/radiusd.conf

после строк
unix {
radwtmp = ${logdir}/radwtmp
}

дописываем
abills_preauth
exec abills_preauth {
program = "/usr/abills/libexec/rauth.pl pre_auth"
wait = yes
input_pairs = request
shell_escape = yes
output_pairs = config
}

abills_postauth
exec abills_postauth {
program = "/usr/abills/libexec/rauth.pl post_auth"
wait = yes
input_pairs = request
shell_escape = yes
output_pairs = config
}

abills_auth
exec abills_auth {
program = "/usr/abills/libexec/rauth.pl"
wait = yes
input_pairs = request
shell_escape = yes
output = no
output_pairs = reply
}

abills_acc
exec abills_acc {
program = "/usr/abills/libexec/racct.pl"
wait = yes
input_pairs = request
shell_escape = yes
output = no
output_pairs = reply
}

правим /etc/freeradius/sites-available/default
# nano /etc/freeradius/sites-available/default

комментируем лишнее и добавляем недостающее
тут
authorize {
preprocess
abills_preauth
#chap
#mschap
suffix
#eap {
# ok = return
#}
#unix
files
abills_auth
#expiration
#logintime
#pap
}

здесь
preacct {
preprocess
#acct_unique
#suffix
abills_acc
}

и еще здесь
post-auth {
exec
Post-Auth-Type REJECT {
# attr_filter.access_reject
abills_postauth
}

и это тоже заремарить
#pre-proxy {
#}

#post-proxy {
# eap
#}

теперь нужно поправить файл со словарями
# nano /etc/freeradius/dictionary

в конце добавить
# Limit session traffic
ATTRIBUTE Session-Octets-Limit 227 integer
# What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out)
ATTRIBUTE Octets-Direction 228 integer
# Connection Speed Limit
ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer
ATTRIBUTE Acct-Interim-Interval 85 integer

Настройка radiusclient1
Пропишем сервера авторизации и аккаунтинга
# nano /etc/radiusclient/radiusclient.conf

вписываем
authserver 127.0.0.1
acctserver 127.0.0.1

добавим секретное слово для сервера
# nano /etc/radiusclient/servers

дописываем
127.0.0.1 radsecret

клиенту тоже нужно поправить файл словарей
# nano /etc/radiusclient/dictionary

в конце дописываем
ATTRIBUTE Acct-Interim-Interval 85 integer
ATTRIBUTE Session-Octets-Limit 227 integer
ATTRIBUTE Octets-Direction 228 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer
ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer

Настройка Apache2
Добавляем поддержку mod_rewrite.
# ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

Редактируем /etc/apache2/sites-enabled/000-default
# nano /etc/apache2/sites-enabled/000-default

удаляем все и пишем

DocumentRoot /usr/abills/cgi-bin/
Alias /abills "/usr/abills/cgi-bin/"


RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1]
Options Indexes ExecCGI SymLinksIfOwnerMatch

AddHandler cgi-script .cgi
Options Indexes ExecCGI FollowSymLinks
AllowOverride none
DirectoryIndex index.cgi
#Options ExecCGI

Order allow,deny
Deny from all


#Admin interface

AddHandler cgi-script .cgi
Options Indexes ExecCGI FollowSymLinks
AllowOverride none
DirectoryIndex index.cgi
order deny,allow
allow from all



Настройка pptpd
В файле options
# nano /etc/ppp/options

убрать ремарку
+chap

В файле pptpd-options
# nano /etc/ppp/pptpd-options

ремарим лишнее и дописываем недостающее
#require-mppe-128
#require-mschap-v2
plugin radius.so
plugin radattr.so
debug
ms-dns 192.168.4.1

В файле /etc/pptpd.conf
# nano /etc/pptpd.conf

всё удаляем и пишем
ppp /usr/sbin/pppd
option /etc/ppp/pptpd-options
debug
logwtmp
localip 172.16.255.254
listen 192.168.4.1

для работы шейпера в файле /etc/ppp/ip-up
# nano /etc/ppp/ip-up

дописываем в конце

if [ -f /var/run/radattr.$1 ]

then

DOWNSPEED=`/usr/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`

UPSPEED=`/usr/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`

FILTERS=`/usr/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`



/sbin/tc qdisc del dev $1 root > /dev/null

/sbin/tc qdisc del dev $1 ingress > /dev/null

##### speed server->client

if [ "$UPSPEED" != "0" ] ;

then

/sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1

/sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit burst 4k

/sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit burst 4k prio 1

/sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit burst 4k prio 2

/sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500

/sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500

/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10

/sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10

/sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10

fi

##### speed client->server

if [ "$DOWNSPEED" != "0" ] ;

then

/sbin/tc qdisc add dev $1 handle ffff: ingress

/sbin/tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNSPEED}kbit burst 12k drop flowid :1

fi

fi
# это для разрешения клиентам ходить в интернет
/sbin/iptables -t nat -A POSTROUTING -s $5 -j MASQUERADE
/sbin/iptables -t filter -A INPUT -s $5 -d 10.0.0.3 -p tcp -m tcp --dport 3128 -j ACCEPT
/sbin/iptables -t filter -A INPUT -s $5 -d 10.0.0.3 -p tcp -m tcp --dport 80 -j ACCEPT
/sbin/iptables -t filter -A INPUT -s $5 -d 10.0.0.3 -p tcp -m tcp --dport 110 -j ACCEPT
/sbin/iptables -t filter -A INPUT -s $5 -d 10.0.0.3 -p tcp -m tcp --dport 25 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -d $5 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -s $5 -j ACCEPT
/sbin/iptables -t filter -A OUTPUT -d $5 -j ACCEPT

Настройка Abills

Сначала нужно скачать архив с биллингом
# cd /root
# wget http://kent.dl.sourceforge.net/project/abills/abills/0.50/abills-0.50.tgz

Теперь распакуем его
# tar -xf abills-0.50.tgz

Переместим распакованный биллинг в директорию /usr/
# mv abills /usr/

Заходим в консоль mysql
# mysql -u root -p
mysql> CREATE DATABASE abills;
mysql> quit

Теперь нужно скинуть дамп в базу
# cd /usr/abills
# mysql -u root -p abills < abills.sql

Когда дамп залит нужно поправить конфиг Abills, для этого
# cd /usr/abills/libexec
# cp config.pl.default config.pl
# nano config.pl

поменять реквизиты доступа к базе данных. Для того чтобы использовать большие буквы в логине строку
$conf{USERNAMEREGEXP}="^[a-z0-9_][a-z0-9_-]*\$";

поменять на
$conf{USERNAMEREGEXP}="^[A-Za-z0-9_][A-za-z0-9_-]*\$";

Правим
# nano /etc/sudoers

дописываем
www-data ALL = NOPASSWD: /usr/abills/misc/pppd_kill

теперь настроим переодическое исполнение скриптов
# nano /etc/crontab

дописываем
*/5 * * * * root /usr/abills/libexec/billd -all
1 0 * * * root /usr/abills/libexec/periodic daily
1 0 1 * * root /usr/abills/libexec/periodic monthly
1 3 * * * root /usr/abills/libexec/periodic backup

устанавливаем права на файлы веб интерфейса
# chown -Rf www-data /usr/abills/cgi-bin

Теперь нужно создать недостающие каталоги и установить на них корректные права
# mkdir /usr/abills/backup
# chown www-data /usr/abills/backup
# mkdir /usr/abills/var
# mkdir /usr/abills/var/log

В файле
# nano /usr/abills/Abills/defs.conf

исправить пути к исполняемым файлам
$SNMPWALK = '/usr/bin/snmpwalk';
$SNMPSET = '/usr/bin/snmpset';
$GZIP = '/bin/gzip';
$TAR='/bin/tar';
$MYSQLDUMP = '/usr/bin/mysqldump';
$IFCONFIG='/sbin/ifconfig';

Открываем web-интерфейс админки по адресу http://вашхост/admin
Логин/пароль abills/abills их можно будет потом сменить.

Идем System configuration->NAS
Ip пишем 127.0.0.1
Выбираем тип pppd:pppd + Radius
Alive (sec.): 120
RADIUS Parameters (,): Acct-Interim-Interval=60

Теперь добавляем IP POOLs
Название: Любое
FIRST IP: 172.16.0.1
Количество: 256
Приоритет: по умолчанию "0"
STATIC: отмечаем если нужно

Проверить чтобы в файле hosts
# nano /etc/hosts

на всех IP имена хостов совпадали
127.0.0.1 localhost billing
192.168.4.1 billing
10.0.0.3 billing

теперь можно
# reboot

или
# shutdown -r now

Настройка мониторинга Squid в Abills

Подразумевается что Squid уже стоит и работает. В файл /etc/squid/squid.conf

# nano /etc/squid/squid.conf

добавить
acl abillsserver src 127.0.0.1/255.255.255.255
http_access allow manager abillsserver

а для transparent
http_port 127.0.0.1:3128 transparent

теперь нужно включить модуль squid
# nano /usr/abills/libexec/config.pl

в секции @MODULES добавить
'Squid'

а ниже дописать конфиг модуля
$conf{SQUID_HOST}='localhost'; #Squid host
$conf{SQUID_PORT}='3128'; #Squid port
$conf{SQUID_CACHEMGR_PASSWD}='your_squid_pass'; #Squid password
$conf{SQUID_RESOLVIP}=0; #Resolve Clients IP addreses

После успешной установки появляется меню - /Мониторинг/Squid/

Версии использованного ПО
# freeradius -v
freeradius: FreeRADIUS Version 2.0.4, for host i486-pc-linux-gnu

# mysql -u root -p

...Server version: 5.0.51a-24+lenny4 (Debian)...

# apache2 -v
Server version: Apache/2.2.9 (Debian)
Server built: Mar 28 2010 18:03:05

# pptpd -v
pptpd v1.3.4

# perl -v

This is perl, v5.10.0 built for i486-linux-gnu-thread-multi

При копировании материалов
ссылка на источник обязательна!


Читать дальше...

пятница, 18 сентября 2009 г.

Установка и настройка PostgreSQL на FreeBSD

Образовалась задача, поставить PostgreSQL на FreeBSD, а так как до этого я не сталкивался с PostgreSQL на FreeBSD да и вообще с PostgreSQL (раньше только с MySQL дружил, а с ним и под FreeBSD дружить просто когда знаешь что и где крутить), то пришлось многое прочитать и понять в короткие сроки.
Данный пост пишу в качестве руководства для дальнейшей работы ибо подозреваю что придется поставить еще пару таких-же серверов.
Итак установка.


в консоль пишем
# whereis postgresql82-server

получаем ответ
/usr/ports/database/postgresql82-server/

соответственно следующие команды
# cd /usr/ports/database/postgresql82-server/
# make config
# make install clean

после установки меняем пароль для пользователя pgsql
# passwd pgsql

теперь прикручиваем PostgreSQL в автозагрузку в файле /etc/rc.conf
postgresql_enable="YES"
postgresql_class="postgres"

после этого инициализируем кластер
# /usr/local/etc/rc.d/postgresql initdb

стартуем базу от пользователя pgsql
# su pgsql
$ /usr/local/etc/rc.d/postgresql start

подключаемся к PostgreSQL
$ psql template1

создаем пользователя
CREATE USER новый_пользователь WITH CREATEDB LOGIN PASSWORD 'его_пароль';

выходим и останавливаем PostgreSQL
Ctrl+D
$ /usr/local/etc/rc.d/postgresql stop

меняем доступ к базе данных в файле /var/pgsql/data/pg_hba.conf меняем true на password в следующих строках
local all all password
host all all 127.0.0.1/32 password

приступаем к работе
$ /usr/local/etc/rc.d/postgresql start

для удобного администрирования использую phpPgAdmn

P.S. Возможно пост еще будет редактироваться...
При копировании материалов
ссылка на источник обязательна!


Читать дальше...

воскресенье, 30 августа 2009 г.

Пересборка ядра и pppd для включения поддержки mppe/mppc на примере Ubuntu 8.04

Понадобилось мне установить подключение по PPPoE c mppe/mppc оказалось что в GNU/Linux по умолчанию нет поддержки mppe/mppc, а с версии ядра 2.6.15 только mppc. Достал бубен и начались ритуальные танцы. После шаманских действий все заработало. Здесь опишу основные заклинания для включения поддержки данного протокола, а настройку подключения PPPoE для GNU/Linux опишу в другой статье.
Итак приступим.

Ставим пакеты:
# apt-get install linux-source build-essential kernel-package libncurses5-dev fakeroot msort-gui pkg-config

Переходим в каталог с исходниками
# cd /usr/src

и распаковываем ядро
# tar -jxvf linux-source-2.6.XX.tar.bz2

переходим в каталог с исходником ядра
# cd ./linux-source-2.6.XX

для использования опций включенных в текущее ядро копируем конфиг
# cp /boot/config-`uname -r` ./.config

берем патч для соответствуещей версии ядра
распаковываем его в каталог
/usr/src/linux-source-2.6.XX

и накладываем командой
# patch -p1 < ptch_file_name

Теперь можно приступать к конфигурированию
# make menuconfig

Указываем какой конфиг использовать
Load an Alternate Configuration File

находим строку похожую на
microsoft compression/encription (NEW)

отмечаем его и в случае надобности нужные вам опции и сохраняем полученный конфиг
Save an Alternate Configuration File

Собираем и ставим новое ядро командами
# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-new.version kernel_image kernel_headers
# cd /usr/src
# dpkg -i linux-image-2.6.*.deb linux-headers-2.6.*.deb

Перегружаемся с новым ядром для проверки его работоспособности.
Если все прошло удачно то нужно пересобрать pppd.
Для этого качаем патч для pppd и исходник pppd. Распаковываем и из каталога с распакованным pppd команды
# patch -p1 < ptch_file_name
# ./configure
# make
# make install

настраиваем соединение и наслаждаемся серфингом.
При копировании материалов
ссылка на источник обязательна!


Читать дальше...

вторник, 11 августа 2009 г.

Настройка сервера доступа на FreeBSD (PPPOE + FREERADIUS)

Итак описываю ситуацию при которой мне впервые пришлось столкнуться с FreeBSD. После переезда в другой город(больше в 5 раз) пришел я устраиваться на работу к одному ISP меня взяли с испытательным сроком в 1 месяц и дали тестовое задание поднять NAS на FreeBSD. Его установку и настройку я опишу.

Дали мне машинку с CD приводом HDD 6.5Gb
1 CD FreeBSD 7.0 и доступ в интернет по внутренней сети.

Немного погуглил и прочитав про возможные подводные камни начал установку. Саму установку описывать нет смысла так как все предельно ясно.
Система установлена можно приниматься за работу.
# whereis pppoed
pppoed: /usr/libexec/pppoed

и мы увидим уже установленный демон PPPOE
Настроим его, для этого в файлах
/etc/ppp/ppp.conf

pppoe-in:
 set login
 allow mode direct
 set mru 1492
 set mtu 1492
 set speed sync
 set log Phase Chat LCP IPCP CCP tun command chap
 disable eap pap chap chap81
 enable lqr
 enable MSCHAPv2
 set timeout 0
 set ifaddr 10.0.0.1 10.0.0.2-254
 set dns 192.168.1.1 4.2.2.2
 accept dns


/etc/ppp/ppp.secret

USERNAME PASSWORD * * *


где USERNAME это имя тестового пользователя, а PASSWORD его пароль теперь можно проверить его работоспособность запускаем pppoe сервер командой
/usr/libexec/pppoed -p SERVICE_NAME -l pppoe-in IFACE_NAME

В данной конфигурации IP адрес клиенту назначается автоматически для использования конкретного адреса, нужно в файле
/etc/ppp/ppp.conf
убрать строку
set ifaddr 10.0.0.1 10.0.0.2-254

и запись в файле
/etc/ppp/ppp.secret
привести к виду
USERNAME PASSWORD 10.0.0.2 * *

аутентификация предусмотренная в данном случае MSCHAPv2 если требуется другой вид аутентификации то в файле
/etc/ppp/ppp.conf
измените строку
enable MSCHAPv2

так как нужно Вам.
Для аутентификации через FREERADIUS изменим предыдущий конфиг но сначала поставим FREERADIUS.
Набираем
# whereis freeradius

видим где лежит порт
freeradius: /usr/ports/net/freeradius

переходим в каталог порта
# cd /usr/ports/net/freeradius

и даем команды
# make config

устанавливаем нужные опции в том числе и поддержку MySQL жмем [OK]
# make

и
# make install

FREERADIUS с MySQL установлен можно приступить к конфигурации данной связки для этого команда
# echo "acct RADIUS_IP SECRET_KEY" >> /etc/radius.conf
# echo "auth RADIUS_IP SECRET_KEY" >> /etc/radius.conf

где RADIUS_IP – IP адрес radius сервера, SECRET_KEY – секретный ключ. SECRET_KEY устанавливается в файле
/usr/local/etc/raddb/clients.conf


client localhost {
secret = SECRET_KEY
shortname = localhost
}


в файле /usr/local/etc/raddb/sql.conf можно записать свои SQL запросы, описывать не вижу смысла ,примеров в интернете много.

меняем конфигурацию pppoed

/etc/ppp/ppp.conf

pppoe-in:
 set login
 allow mode direct
 set mru 1492
 set mtu 1492
 set speed sync
 set log Phase Chat LCP IPCP CCP tun command chap
 disable eap pap chap chap81
 enable lqr
 enable MSCHAPv2
 set timeout 0
 set radius /etc/radius.conf
 set ifaddr 10.0.0.1 10.0.0.2-254
 set dns 192.168.1.1 4.2.2.2
 accept dns


Для автозагрузки всего этого хозяйства нужно добавить в файл

/etc/rc.conf

radiusd_enable="YES"
pppoed_enable="YES"
pppoed_provider="SERVICE_NAME"
pppoed_flags="-l pppoe-in"
pppoed_interface="rl1"

При копировании материалов
ссылка на источник обязательна!


Читать дальше...