php-скрипт для массовой рассылки писем.

so_mailer (Simple-order mailer) предназначен для массовой рассылки писем и тех случаев, когда в одном скрипте по циклу функцией mail() это делать нельзя по причине ограничений либо на время выполнения скрипта (Fatal error: Maximum execution time of N second exceeded), либо на количество отправленных сообщений в период времени, накладываемого хостингом.
Continue reading


Простой шлюз на iptables для раздачи интернета с модемного соединения (ppp0) в Linux(Debian и Ubuntu).

В данной статье рассмотрен пример скрипта iptables для организации шлюза. Должен признать, что для организации совсем простого выхода в интернет через компьютер на Linux, подключенный к интернету через модемное соединение (например 3G модем) она содержит много лишнего и поначалу может запутать. Поэтому опишу совсем простой случай.
Continue reading


Подключение и использование disk.yandex(Яндекс Диск) в Linux(Ubuntu, Debian)

Устанавливаем davfs2

Пакет, небходимый для монтирования WebDAV к локальной файловой системе

apt-get install davfs2

Создаём каталог для монтирования

mkdir /mnt/yadisk

Прописываем правило для монтирования в /etc/fstab

Надо в /etc/fstab добавить

https://webdav.yandex.ru /mnt/yadisk davfs users,uid=1000,uid=1000,rw 0 0

параметр users тут означает, что имя пользователя и пароль будут браться из /etc/davfs2/secrets

Задаём имя пользователя и пароль для подключения

Добавляем в /etc/davfs2/secrets строчку

https://webdav.yandex.ru        your_username      *******

Монтируем

#mount -a

p.s. описан не совсем рабочий вариант, так как сеть поднимается, как правило, после монтирования дисков. Да исправит каждый по вкусу своему, кто на крон повесит, кто руками mount -a запустит


Использование openssl

Формирование самоподписного сертификата

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.key
  • cert.pem — сертификат, содержащий открытый ключ и информацию о том, кому выдан
  • cert.key — закрытый ключ, предназначенный для создания подписей или расшифровки

Дальше отвечаем на несколько вопросов

Generating a 1024 bit RSA private key
........++++++
....++++++
writing new private key to 'cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Samara State
Locality Name (eg, city) []:Samara
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
Organizational Unit Name (eg, section) []:Kitchen
Common Name (eg, YOUR name) []:Andrey Inutcin
Email Address []:inutcin@gmail.com

Чтобы не вводить эти параметры интерактивное можно использовать опцию -subj:

openssl req -new -x509 -days 9999 -nodes -subj /C=RU/O=My\ site/CN=my.site.com/emailAddress=admin@site.com -out cert.pem -keyout cert.key

Проверка(валидация) сертификата

$ openssl verify cert.pem

Как видно ниже из текста ошибки, это самоподписный сертификат

cert.pem: /C=RU/ST=Samara State/L=Samara/O=Home/OU=Kitchen/CN=Andrey Inutcin/emailAddress=inutcin@gmail.com
error 18 at 0 depth lookup:self signed certificate
OK

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

$ openssl x509 -in cert.pem -noout -text

В выводе и открытый ключ, и подпись сертификата и информация о владельце и сроки использования

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            98:11:41:86:23:df:91:b3
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RU, ST=Samara State, L=Samara, O=Home, OU=Kitchen, CN=Andrey Inutcin/emailAddress=inutcin@gmail.com
        Validity
            Not Before: Jan 29 13:57:48 2011 GMT
            Not After : Jan 29 13:57:48 2012 GMT
        Subject: C=RU, ST=Samara State, L=Samara, O=Home, OU=Kitchen, CN=Andrey Inutcin/emailAddress=inutcin@gmail.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:b0:5a:f9:03:36:84:bb:8d:45:78:5c:6b:ac:c6:
                    9d:d9:87:08:21:1d:9e:7f:e0:ac:e4:69:c2:53:0b:
                    5f:8c:91:0e:2d:60:77:52:0b:bd:fd:a9:a6:58:6c:
                    39:90:e7:8f:19:b6:fc:0f:c0:1e:30:63:29:39:af:
                    c3:4d:9f:74:f8:bc:dc:c3:a8:97:74:ff:c1:52:e8:
                    e1:04:5a:5d:8b:cf:f6:1d:bf:be:d6:a9:59:37:4d:
                    86:bd:bb:a1:19:4a:7c:74:bf:5f:2d:ab:28:7d:3d:
                    0e:a5:bf:8a:26:8f:40:b7:7e:6d:4e:d4:a0:ba:e3:
                    47:90:32:70:56:7c:a6:85:37
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                5D:62:E9:7F:6E:53:36:35:7A:B5:6A:CB:C1:AB:7C:54:BF:AF:04:9B
            X509v3 Authority Key Identifier:
                keyid:5D:62:E9:7F:6E:53:36:35:7A:B5:6A:CB:C1:AB:7C:54:BF:AF:04:9B
                DirName:/C=RU/ST=Samara State/L=Samara/O=Home/OU=Kitchen/CN=Andrey Inutcin/emailAddress=inutcin@gmail.com
                serial:98:11:41:86:23:DF:91:B3

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
        af:f4:a9:c0:21:cd:ab:e2:55:fd:59:87:50:a9:0b:7f:7e:de:
        a9:09:eb:29:be:d8:9e:7f:0c:1a:23:b1:a6:6e:7a:45:3e:79:
        56:ad:67:74:a0:e0:9c:80:6a:cd:a4:6f:af:d5:f8:d1:11:1c:
        a4:b4:2a:50:62:aa:e2:ef:60:28:fc:45:04:6d:be:77:11:66:
        04:37:82:89:50:eb:2e:3b:1e:ec:ce:f7:a4:77:da:7a:61:e3:
        c8:28:da:5c:a9:62:e8:7a:ca:8d:01:12:e2:20:84:5f:a3:6c:
        f1:e9:e2:28:d7:0e:90:bf:dc:42:0a:f3:f4:ad:22:5d:29:c5:
        8d:e8

Настройка https

nginx

/etc/nginx/ssl.conf
# Подключение самоподписанного сертификата
# генерация сертификата:
# openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

ssl			on;
ssl_protocols		SSLv3 TLSv1;
ssl_certificate		/etc/nginx/ssl/cert.pem;
ssl_certificate_key	/etc/nginx/ssl/cert.key;

Apache

FIXME

Создание электронной подписи файла

$ openssl dgst -sha1 -sign cert.key -out sign.cr filename
  • -sign cert.key — указываем закрытый ключ
  • filename — подписываемый файл
  • -out sign.cr — указываем файл, в который сохранится подпись
  • -sha1 — метод хэширования содержимого файла. Подписать можно лишь очень ограниченный объём информации, поэтому, как правило хэш-сумму файла. То есть сначала создаётся SHA1-хэш файла

Создаётся файл подписи длинной sign.cr 120 байт

Проверка электронной подписи файла

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

$ openssl x509 -pubkey -noout -in cert.pem > pubkey.pem

При использовании вместо публичного ключа сертификата мы получим сообщение unable to load key file, так что преобразование — операция обязательная.

Затем, с помощью этого ключа, произведём проверку подписи

$ openssl rsautl -verify -certin -inkey cert.pem -out filename.hash -in sign.cr

Если подпись верна, то получим

Verified OK

Если попытаемся изменить подписанный файл, то получим

Verification Failure

Cсылки по теме


Подсчет трафика

В статье про настройку маршрутизации и организацию доступа подсети в internet есть несколько правил, пишущих логи о пролетающих в маршрутизаторе пакетах. Настало время их художественно причесать, для удобного составления отчетов.

Предварительный парсинг логов

Данный скрипт читает /var/log/debug, парсит из него логи iptables в файлик в /var/log/traflogs/, после чего очищает/var/log/debug.

#!/usr/bin/perl -w

my $LOG_FILENAME = "/var/log/debug";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon = $mon +1;
$year = $year + 1900;
my $TAB_OUTPUT = "/var/log/traflogs/$year-$mon-$mday-$hour-$min-$sec.csv";

my %MONS = (
    "Jan"=>"01",
    "Feb"=>"02",
    "Mar"=>"03",
    "Apr"=>"04",
    "May"=>"05",
    "Jun"=>"06",
    "Jul"=>"07",
    "Aug"=>"08",
    "Sep"=>"09",
    "Oct"=>"10",
    "Nov"=>"11",
    "Dec"=>"12"
);

open (A,$LOG_FILENAME);
open (B,">".$TAB_OUTPUT);
$count = 0;
print B "datetime\t\ti_in\ti_out\tsource\t\tdestination\tletgth\tproto\tsport\tdport\tresult\n";
print B "-----------------------------------------------------------------------------------------------------------------\n";
while(<A>){
    if(~/(\w+)\s+(\d+)\s+([\d:]+)\s+.*?\]\s+.*?(\w+)\s+
        IN=([\d\w]*)\s+OUT=([\d\w]*)\s+.*?SRC=([\d\.]+)\s+DST=([\d\.]+)\s+LEN=(\d+).*?
        PROTO=(\w+)\s+SPT=(\d+)\s+DPT=(\d+)/xig){
        $count = $count + $9;
        print B "$year-$MONS{$1}-".($2<10?"0$2":$2)." $3\t$5\t$6\t$7\t$8\t$9\t$10\t$11\t$12\t$4\n";
    }

}
close(A);
close(B);
`cat /dev/null > /var/log/debug`

Разумно повесить его на cron, чтобы каждый час формировал такую табличку

# head /var/log/traflogs/2011-1-5-17-55-1.csv
datetime                i_in    i_out   source          destination     letgth  proto   sport   dport   result
-----------------------------------------------------------------------------------------------------------------
2011-01-05 16:55:07     eth0    ppp0    192.168.0.1     77.88.57.177    274     TCP     50488   5222    ACCEPT
2011-01-05 16:55:08     ppp0    eth0    77.88.57.177    192.168.0.1     40      TCP     5222    50488   ACCEPT
2011-01-05 16:55:09     eth0    ppp0    192.168.0.1     77.88.57.177    226     TCP     50488   5222    ACCEPT
2011-01-05 16:55:09     ppp0    eth0    77.88.57.177    192.168.0.1     40      TCP     5222    50488   ACCEPT
2011-01-05 16:55:12     eth0    ppp0    192.168.0.1     77.88.57.177    114     TCP     50488   5222    ACCEPT
2011-01-05 16:55:12     ppp0    eth0    77.88.57.177    192.168.0.1     40      TCP     5222    50488   ACCEPT
2011-01-05 16:55:16     eth0    ppp0    192.168.0.1     77.88.57.177    290     TCP     50488   5222    ACCEPT
2011-01-05 16:55:17     ppp0    eth0    77.88.57.177    192.168.0.1     40      TCP     5222    50488   ACCEPT

Размещение логов в БД

Создадим 3 таблички в БД MySQL

CREATE TABLE `devs` (
  `id` tinyint(2) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

CREATE TABLE `protos` (
  `id` tinyint(2) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |

CREATE TABLE `packs` (
  `dat` datetime DEFAULT NULL,
  `i_dev_id` tinyint(2) UNSIGNED NOT NULL DEFAULT '0',
  `o_dev_id` tinyint(2) UNSIGNED NOT NULL DEFAULT '0',
  `i_ip` int(11) UNSIGNED DEFAULT NULL,
  `o_ip` int(11) UNSIGNED DEFAULT NULL,
  `size` smallint(5) DEFAULT NULL,
  `proto_id` tinyint(2) UNSIGNED DEFAULT NULL,
  `i_port` smallint(5) DEFAULT NULL,
  `o_port` smallint(5) DEFAULT NULL,
  `accept` enum('0','1') NOT NULL DEFAULT '0',
  KEY `i_dev_id` (`i_dev_id`),
  KEY `o_dev_id` (`o_dev_id`),
  KEY `proto_id` (`proto_id`),
  KEY `i_port` (`i_port`),
  KEY `o_port` (`o_port`),
  KEY `dat` (`dat`),
  KEY `accept` (`accept`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Следующий скрипт читает содержимое каталога /var/log/traflogs/, все файлы *.csv перегоняет в *.csv.sql, после чего загружает их в БД с последующим удалением исходников *.csv

#!/usr/bin/perl -w

my $CSV_DIR = "/var/log/traflogs";
my $counter = 0;
my ($datetime,$i_dev,$o_dev,$i_ip,$o_ip,$size,$proto,$i_port,$o_port);

my %DEVS = (
""=>'0',
"eth0"=>'1',
"eth1"=>'2',
"eth2"=>'3',
"ppp0"=>'4',
"lo"=>"5"
);
my %PROTOS = (
'TCP'=>'1',
'UDP'=>'2'
);

opendir($dd, $CSV_DIR);
while($filename = readdir($dd)){
    if($filename ne '.' && $filename ne '..' && $filename=~/^.*\.csv$/g){
        chomp($filename);
        print $filename."\n";
        open (A,"$CSV_DIR/$filename");
        open (B,">$CSV_DIR/$filename.sql");
        $counter = 0;
        while(<A>){
            $counter = $counter+1;
            if($counter>2){
                ($datetime,$i_dev,$o_dev,$i_ip,$o_ip,$size,$proto,$i_port,$o_port,$result) = split /\t/;
                chomp($result);
                $i_dev = $DEVS{$i_dev};
                $o_dev = $DEVS{$o_dev};
                $proto = $PROTOS{$proto};
                $i_ip = ip_to_int($i_ip);
                $o_ip = ip_to_int($o_ip);
                print B "insert into packs values('$datetime','$i_dev','$o_dev','$i_ip','$o_ip','$size','$proto','$i_port','$o_port','".
                ($result eq 'ACCEPT'?"1":"0")
                ."');\n";
            }
        }
        close(A);
        close(B);
        `mysql -u root -ptoor trafd < $CSV_DIR/$filename.sql`;
        unlink("$CSV_DIR/$filename");
        unlink("$CSV_DIR/$filename.sql");
    }
}
closedir($dd);

sub ip_to_int{
    my ($ip) = @_;
    my ($a3,$a2,$a1,$a0) = split(/[^\d]/,$ip);
    return $a3*256*256*256 + $a2*256*256 + $a1*256 +$a0;
}

В результате имеем таблицу packs набитую информацией о пакетах.

Простые запросы для отчетов по трафику

Размер входящего трафика по портам

SELECT 
    i_port,
    round(sum(size)/1024/1024,3) AS MBytes 
FROM 
    packs 
WHERE 
    (
        (i_dev_id=4 AND o_dev_id=0) OR (i_dev_id=4 AND o_dev_id!=0)
    ) AND 
    accept='1' 
GROUP BY 
    i_port 
ORDER BY 
    MBytes DESC 
LIMIT 
    32

Получаем вот такой результат

+--------+--------+
| i_port | MBytes |
+--------+--------+
|     80 | 27.688 |
|     53 |  0.997 |
|    443 |  0.262 |
|   5222 |  0.205 |
|    123 |  0.052 |
|  11350 |  0.014 |
|  32767 |  0.004 |
|     25 |  0.001 |
|    110 |  0.001 |
|  12350 |  0.001 |
|   5277 |  0.001 |
|   7777 |  0.001 |
|  20253 |  0.000 |
|  24332 |  0.000 |
|  29605 |  0.000 |
|  32285 |  0.000 |
|  31902 |  0.000 |
|  21705 |  0.000 |
|  22306 |  0.000 |
|   4779 |  0.000 |
|  17944 |  0.000 |
|  22068 |  0.000 |
|  25343 |  0.000 |
|   4762 |  0.000 |
|  10176 |  0.000 |
|   1600 |  0.000 |
|   1720 |  0.000 |
|   1659 |  0.000 |
|   8625 |  0.000 |
|  27076 |  0.000 |
|  27858 |  0.000 |
|  27755 |  0.000 |
+--------+--------+

Размер исходящего трафика по портам

SELECT 
    o_port,
    round(sum(size)/1024/1024,3) AS MBytes 
FROM 
    packs 
WHERE 
    (
        (o_dev_id=4 AND i_dev_id=0) OR (o_dev_id=4 AND i_dev_id!=0)
    ) AND 
    accept='1' 
GROUP BY 
    o_port 
ORDER BY 
    MBytes DESC 
LIMIT 
    32

Даёт следующий результат

+--------+--------+
| o_port | MBytes |
+--------+--------+
|     80 |  7.067 |
|     53 |  0.418 |
|   5222 |  0.133 |
|    443 |  0.094 |
|    123 |  0.056 |
|  32767 |  0.031 |
|  11350 |  0.003 |
|    110 |  0.002 |
|   7777 |  0.002 |
|  32285 |  0.001 |
|  14439 |  0.001 |
|  17418 |  0.001 |
|   8776 |  0.001 |
|   5975 |  0.001 |
|   1899 |  0.001 |
|  13645 |  0.001 |
|  12350 |  0.001 |
|   3990 |  0.001 |
|   6615 |  0.001 |
|   8342 |  0.001 |
|   8625 |  0.001 |
|   9466 |  0.001 |
|   1636 |  0.001 |
|  19776 |  0.001 |
|   1090 |  0.001 |
|  21879 |  0.001 |
|  16385 |  0.001 |
|  27858 |  0.001 |
|  21520 |  0.001 |
|     25 |  0.001 |
|  28555 |  0.001 |
|  28222 |  0.001 |
+--------+--------+

Отчет о последних отброшенных пакетах

SELECT
    dat AS `date`,
    i.name AS `IN`,
    o.name AS `OUT`,
    o_port AS dport, 
    i_port AS sport, 
    INET_NTOA(i_ip) AS `from`,
    INET_NTOA(o_ip) AS `to`,
    IF(proto_id=1,'TCP','UDP') AS `proto`  
FROM 
    devs AS i 
        RIGHT JOIN 
    packs 
        ON i.id=packs.i_dev_id 
        LEFT JOIN 
    devs AS o 
        ON o.id=packs.o_dev_id 
WHERE 
    accept='0'
ORDER BY
    `date` DESC 
LIMIT 
    32;

Получаем что-то вроде

+---------------------+------+------+-------+-------+-------------+---------------+-------+
| date                | IN   | OUT  | dport | sport | from        | to            | proto |
+---------------------+------+------+-------+-------+-------------+---------------+-------+
| 2011-01-05 15:38:53 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:38:53 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:28:09 | NULL | lo   |   953 | 32767 | 127.0.0.1   | 127.0.0.1     | TCP   |
| 2011-01-05 15:28:03 | NULL | lo   |   953 | 32767 | 127.0.0.1   | 127.0.0.1     | TCP   |
| 2011-01-05 15:28:00 | NULL | lo   |   953 | 32767 | 127.0.0.1   | 127.0.0.1     | TCP   |
| 2011-01-05 15:26:52 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:26:52 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:14:52 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:14:52 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:02:51 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 15:02:51 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:50:51 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:50:51 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:38:50 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:38:50 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:26:49 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:26:49 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:14:49 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:14:49 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:02:48 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 14:02:48 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 13:50:48 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 13:50:48 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 13:38:47 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 13:38:47 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
| 2011-01-05 13:26:46 | eth0 | NULL |   138 |   138 | 192.168.0.1 | 192.168.0.255 | UDP   |
+---------------------+------+------+-------+-------+-------------+---------------+-------+

При желании запросы можно разнообразить


Настройка DNS-сервера(Bind)

Установка bind

# apt-get install bind9

Создание файла зоны

Создадим файл для зоны local (наша локальная сеть)

;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     local. root.local. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      local.
@       IN      A       192.168.1.1
debmybook       IN      A       192.168.1.64
baza            IN      A       192.168.0.128
desktop1        IN      A       192.168.0.1

Подключение зоны

Добавим в /etc/bind/named.conf.default-zones

Следующие строчки

zone "local"{
        type master;
        file "/etc/bind/db.local";
};

То есть определим зону и её файл

Назначение серверов перенаправления запросов

То есть пропишем следующие DNS-серверы, которым будет перенаправлен запрос, если наш не сможет его обработать. Для этого в файле cat /etc/bind/named.conf.options раскомментируем(или пропишем в секции options{ … }) следующие строчки

        forwarders {
                83.149.19.123;
        };

Запуск

# /etc/init.d/bind9 restart

Информатор о состоянии баланса Мегафон

Информация о состоянии баланса будет получаться из web-интерфейса управления аккаунтом и писаться в файлик, чтобы оттуда без труда забирать приложением

Мегафон

#!/usr/bin/perl -w
use POSIX;

#============ Настройки скрипта ===============================
# URL по которому получаем ID сессии
my $url1 = "https://serviceguide.megafonvolga.ru/ps/scc/php/check.php";
# URL по которому получаем информацию об аккаунте
my $url2 = "https://serviceguide.megafonvolga.ru/SCWWW/ACCOUNT_INFO";
# Логин и пароль для входа в сервисгид
my $login = "927***";
my $password = "****";
# Путь до wget
my $wget_path = "/usr/bin/wget";
# Временный файл
my $balance_tmp_file = "/tmp/megafon.balance";
# Файл, в который пишется результат
my $balance_file = "/var/log/megafon.info";
# Файл лога
my $log_file = "/var/log/balance.log";

# Загружаем XML с id сессии
my $command = "$wget_path -o /dev/null -O $balance_tmp_file --post-data=\"LOGIN=$login&PASSWORD=$password\" \"$url1\"";
`$command`;
open (A,$balance_tmp_file);
my ($session_id) = <A>;
close(A);
chomp($session_id);
loger("Download megafon session_id XML ",$session_id);

# Парсим ID сессии
$session_id =~s|<SESSION_ID>(.*)</SESSION_ID>|$1|gi;
loger("Parsing megafon session_id XML ",$session_id=~/[\d\w\.]+/gi);

# Загружаем информацию об аккаунте, передав ID сессии
$command = "$wget_path -o /dev/null -O $balance_tmp_file --post-data=\"SESSION_ID=$session_id\" \"$url2\"";
`$command`;

# Получаем баланс и записываем в результат
open (A,$balance_tmp_file);
my $balance = join "", <A>;
close(A);
chomp($balance);
loger("Download megafon account info ",$balance);

# Парсим баланс
loger("Parsing megafon account info",$balance=~/balance.*?>.*?([\d\.]+).*?</gim);

`echo "balance:$1" > $balance_file`;

# Убираем за собой
unlink($balance_tmp_file);

sub loger{
    my ($string, $result) = @_;
    my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
    open(B,">>".$log_file);
    if($result){
        print B "[Ok] ".$now_string." $string\n";
    }
    else{
        print B "[FAILED] ".$now_string." $string\n";exit(0);
    }
    close(B);
}

Сей скрипт так же пишет логи о своей работе вида

[Ok] Срд Янв  5 17:50:02 2011 Download megafon session_id XML
[Ok] Срд Янв  5 17:50:02 2011 Parsing megafon session_id XML
[Ok] Срд Янв  5 17:50:04 2011 Download megafon account info
[Ok] Срд Янв  5 17:50:04 2011 Parsing megafon account info

Настройка подключения к Internet через ррр(3G-модем)

Итак, единственный доступный мне способ подключения к internet — это usb-модем от Мегафона. С момента написания этой статьи многое было понято заново, переосмысленно и думаю тут я углублюсь в техническую сторону его настройки.

Установка

Для начала нам необходим пакет ppp, ну и make, если ещё не стоит

# apt-get install ppp make

Затем, закачиваем вот этот файлик huawei.tar.bz2 распаковываем, и выполняем

# make install_ubuntu

Ubuntu и Debian — генетически очень близки и ничего удивительного, что пакеты от одного подходят и другому.

В процессе «установки» из этого пакета достаётся несколько файлов и размещается где надо. Что это за файлы

/etc/udev/rules.d/99-huawei.rules

Это правило для udev, благодаря которрому и удаётся использовать huawei-e220 как модем, а не как CD-диск, которым он вначале прикидывается. Вот его содержимое. Знатоки udev наверняка найдут в нём много интересного, я же просто приведу его как есть.

##
#
# udev rule for HUAWEI E220 3G HSDPA Modem
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# (c)opyleft    OOZIE < oozie@poczta.fm >
#
# This file prevents the pseudo scsi cdrom device from enabling,
# thus providing a workaround for kernel versions < 2.6.20
#
##

SUBSYSTEM=="block", \
ACTION=="add", \
SYSFS{idVendor}=="12d1", \
SYSFS{idProduct}=="1003", \
IMPORT{program}="huawei-mobile.sh", \
OPTIONS="ignore_device"

/etc/ppp/peers/huawei-e220

Это pppd — конфиг для соединения с провайдером. Содержит основные настройки ppp-соединения. D него я наставил камментов для пояснения, так как с этим файлом у меня возникли некоторые сложности, заставившие прибегнуть к паре грязных хаков.

# /etc/ppp/peers/huawei-e220 pppd script
# pppd call huawei-e220

/dev/ttyUSB0    # Устройство модема
3600000         # Скорость соединения
noipdefault     # Использовать локальный IP и IP-шлюза выдаваемые провайдером
defaultroute    # Создать при соединении маршрут по уполчанию на IP шлюза провайдера
persist
noauth
nodetach
userpeerdns     # Использовать IP DNS серверов, выдаваемых провайдером
connect "/usr/sbin/chat -vf /etc/chatscripts/huawei-e220.chat" #Использовать этот скрипт соединения

/etc/chatscripts/huawei-e220.chat

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

TIMEOUT 3
ABORT BUSY
ABORT 'NO CARRIER'
ABORT VOICE
ABORT 'NO DIALTONE'
ABORT 'NO DIAL TONE'
ABORT 'NO ANSWER'
ABORT DELAYED
"" ATZ
OK ATQ0V1E1S0=0&C1&D2
OK ATDT*99#
CONNECT ""

Запуск

Собственно всё, что нужно — запустить pppd, передав ему в качестве параметра имя провайдера huawei-e220

#pppd call huawei-e220&

Читерство

А теперь о грустном, несмотря на присутствие в /etc/ppp/peers/huawei-e220 строчки

defaultroute

И отсутствию(я её убрал, так как собирался использовать свой DNS)

usepeerdns

Я поимел 2 проблемы

  1. После установки соединения, маршрут по умолчанию так и не появлялся
  2. Несмотря на заверения документации, после соединения DNS-серверы в /etc/ppp/resolv.conf прописывались те, которые присылал провайдер, а не те, которые мне были необходимы, и лежали в /etc/resolv.conf.

Зная, что в качестве шлюза ppp-соединения свегда получается 10.64.64.64, я пошел на то, чтобы прописать в /etc/rc.local(этот скрипт всегда исполняется после загрузки системы), следующее

pppd call huawei-e220 &            # Поднимаем ppp-соединение
route add default gw 10.64.64.64   # Прокидываем маршрут по умолчанию
cp /etc/resolv.conf /etc/ppp       # Подсовываем свои DNS-серверы

После перезагрузки получаем машинку, подключенную к Internet


Как нам зарегистрировать домен?

Первое что нужно уяснить на счет домена, это то, что ДОМЕН ВЫДАЁТСЯ КОНКРЕТНОМУ ЛИЦУ ИЛИ ОРГАНИЗАЦИИ, ваше право обладания им фиксируется регистратором на основе предъявленных вами удостоверяющих документов: паспорт(для физического лица) или учредительные документы(для юр.лица).

И при его регистрации, передаче и восстановлении утерянного над ним контроля вам потребуется предъявить регистратору эти документы. Как правило, при регистрации требуют лишь внести данные из этих документов в специальную форму, а затем подтвердить их сканами или ксерокопиями оригиналов. И хотя для простейшие операции с ним (например произвести делегирование) может сделать любой, имеющий доступ к панели администрирования домена, отчуждение домена может быть произведено только с согласия его владельца или в случае нарушения им правил использования или законодательства, регулирующего эту область.

Второе что нужно уяснить ДОМЕН НЕ ПОКУПАЕТСЯ, А БЕССРОЧНО БЕРЁТСЯ В АРЕНДУ у организации, занимающейся распределением доменов в той или иной зоне (ru, org и пр.). Аренда домена оформляется(производится регистрация) вами через лицензированных представителей этой организации, коими и являются регистраторыдоменов (http://nic.ruhttp://reg.ru и пр.). При условии соблюдения договора регистрации домена(пример договора) и своевременной оплаты домен может оставаться у вас сколь угодно долго.

Третье — как зарегистрировать домен? Практика показывает, что с помощью сторонней компании регистрировать домены как минимум не проще, так как (см.первое) регистратор очно или заочно работает только с его будущим владельцем, и тут есть три пути.

  1. Самостоятельно заполнить форму договора публичной оферты (например тут или тут или у другого регистратора) и следовать дальнейшим инструкциям
  2. Если домен нужен срочно его может зарегистрировать на себя кто угодно, а потом организовать процедуру передачи домена. Процедура сложнее процедуры регистрации. И все это при условии тёплых и доверительных отношений между вами и тем, кто будет регистрировать.
  3. Отправить компании, которая подрядилась зарегистрировать ваш домен все необходимые учредительные документы, чтобы она могла заполнить договор и анкету(в случае регистрации на основе договора публичной оферты).

Разъяснение прозвучавших ранее терминов

Регистратор Организация, предоставляющая услуги регистрации доменов, лицензированная для этого и предоставляющая все необходимое для этого с юридической и технической точки зрения

Регистрация — процесс оформление аренды доменного имени через регистратора.

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

Делегирование — фактически — это назначение домену обслуживающих его NS-серверов(тех, которые будут выдавать информацию о web-сервере, отдающем контент или почтовом сервере).

Делегирование домена

Делегирование домена

Зарегистрированный, но не делегированный домен не может использоваться для размещения сайта.

Арендная плата — как правило берётся ежегодно. Если она не внесена в срок — домен блокируется, если после месяца блокировки плата не вносится — освобождается и его может зарегистрировать любой желающий и после этого контроль над ним восстановить будет невозможно.


Можно грабить КОРОВАНЫ

Ниже приводятся сообщения из темы одного форума, тему удалили, так как организация флешмобов там не одобряется. Но мне стало жалко, что такой материал может пропасть. Как позже мне объяснили, у ведущих семинары по пикапу компьютерщики считаются благодатной аудиторией, из за распространённого мифа о их задротстве и проблемах с личной жизнью. Итак:

(14:25:55) 9513513: привет
(14:26:41) r-asian: Привет
(14:27:02) r-asian: Чем могу быть полезен?
(14:27:57) 9513513: Про РМЭС проек слышал?
(14:29:10) r-asian: Вродь
(14:29:22) r-asian: А вообще - вдоль
(14:29:45) 9513513: не интересует тема соблазнения девушек?
(14:29:47) r-asian: Я за традиционные семейные ценности.
Кроме этого какие-нибудь вопросы есть?
(14:30:27) 9513513: а это не разрушает их,наоборот-помогает
(15:09:23) r-asian: Тебя что ли соблазнять? :-)
(15:11:08) 9513513: девушек
(15:11:43) 9513513: меня девушки только интересуют!
(15:12:59) r-asian: А раз тебя девушки интересуют, то какого члена ко мне
            стучишься? :-)
(15:13:48) 9513513: я советую проект РМЭС!!!сам прошел и это не хухры-мухры!!!!
(15:16:21) r-asian: > сам прошел и это не хухры-мухры!!!!

А что? Трали-вали?
И что значит прошел, игрушка что ли такая, типа кваки третьей?
(15:16:54) 9513513: элитный мужской тренинг,направленный на повышение навыков
             соблазнения девушек!
(15:18:47) r-asian: А корованы там грабить можно?
(15:19:25) 9513513: в смысле?
(15:20:05) r-asian: Ну-у-у-у-у....нафиг нужет такой тренинг где нельзя грабить
             корованы...

Предлагаю постучать в аську засранцу-спамеру, и возмутиться отсутствуем у них возможности грабить корованы. Номер — в логе.

[14:33:21] boombick: Здравствуйте, у меня есть вопрос по проекту РМЭС. Можно
            задать?
[14:34:01] 9513513: да
[14:34:14] boombick: Скажите, а корованы грабить можно?
[14:36:04] 9513513: www.rmes.ru   там найдешь,что те надо
[14:38:13] boombick: а вдруг там вирус? Я очень боюсь вирусов, а мне сказали,
             что все можно по аське узнать
[14:41:40] 9513513: ты не боись и смотри!
[14:43:04] boombick: о, круто как.. а это точно работает?
[14:43:32] 9513513: и отдыхает тожже
[14:44:05] boombick: у меня просто прыщей очень много и борода. И уменя до сих
            пор не было девушки, они все убегают когда я им говорю освоих
            фантазиях. Точнее была одна, но в школе еще
[14:44:24] 9513513: Учительница?
[14:45:26] boombick: ну почти.. Мне просто очень хочется грабить корованы
[14:46:17] 9513513: эт не по адресу!!!
[14:47:45] boombick: жаль :(
-=KPOT=- (15:29:21 24/01/2008)
интересуют тренинги с возможностью грабить караваны
и тренировки этих навыков
почему у вас таких нет?
это ж отставание от моды
 Sanek T™ (15:32:56 24/01/2008)
www.rmes.ru
 -=KPOT=- (15:33:14 24/01/2008)
та верблюды или автоматизировано?
 Sanek T™ (15:39:20 24/01/2008)
vt[fybpbhjdfyj!
 Sanek T™ (15:39:29 24/01/2008)
механизировано
 -=KPOT=- (15:40:13 24/01/2008)
нее мне с верблюдами надо
 -=KPOT=- (15:40:22 24/01/2008)
и с караванами
 Sanek T™ (15:40:29 24/01/2008)
эт в тур фирму
 -=KPOT=- (15:40:44 24/01/2008)
не мне тренинг нуден
 Sanek T™ (15:41:11 24/01/2008)
скорее всего не нужен!
(12:40:27 PM) anonymousI: Здравствуйте, это тут центр РМЭС
(12:43:26 PM) Sanek T™: да!Верблюды интересуют?:-D
(12:43:35 PM) anonymousI: нет
(12:43:45 PM) anonymousI: интересует можно-ли грабить корованы
(12:44:08 PM) Sanek T™: не по адресу
(12:45:58 PM) anonymousI: странно, мне сказали у вас там тренинг по грабле
                корованов
[14:28:31] xpahos: Добрый день
[14:30:02] 9513513: Про РМЭС проект слышал?
[14:30:38] xpahos: да, он грабит караваны ?
[14:31:27] 9513513: да и девечьи сердца
[14:32:03] xpahos: меня интересуют только караваны, когда ждать ебилдов ?
[14:34:06] 9513513: www.rmes.ru
[14:34:42] xpahos: а ебилды где ? я там ничего не нашел
[14:36:55] 9513513: правильно,там таких не держат!!
[14:37:19] xpahos: а каких держат ? вы патрегоугоднеки ?
[14:37:58] 9513513: :)
[14:38:26] xpahos: ну так что ? где ебилды ?
14:36:30: Как грабить корованы не подскажете?
14:37:33: www.rmes.ru    Все узнаешь на этом сайте!
14:40:02: К сожалению, не могу на данный момент зайти на сайт. Немогли бы вы
            послать мне цитату относительно именно корованов?
14:40:36: пустыня.com
14:41:42: Ну я же написал не имею возможности загрузить сайт. И вы точно не
            путаете караван с корованом?
14:48:14: Ну та вы поможете мне с корованами?
14:48:53: не,только с поездом Самара-Олупка!
14:49:56: Простите что беспокою вас в поезде... Но вы таки что нибудь знаете о
            корованах?
14:50:40: :-D
14:51:56: Не пытайтесь отделаться от меня загадочной улыбкой! Поймите это для
            меня жизненно важно.
(13:45:02) Chicane: у меня тут вопрос по проэкту РМЭС...
(13:45:24) Chicane: задать можно?
(13:46:18) Chicane: ау
(13:48:01) 9513513: про корованы?
(13:48:06) Chicane: нет
(13:48:58) 9513513: дерзай
(13:49:04) Chicane: там ебилды будут?
(13:49:26) Chicane: и ожидается ли вендекапец после прохождения тренинга?
(13:49:35) 9513513: без тебя не будут!
(13:49:49) Chicane: а со мной?
(13:50:00) 9513513: один
(13:50:26) Chicane: один ебилд?
(13:51:01) Chicane: чёрт, наипали - обещали еще и корованны
(14:52:43) Igron: Добрый день.
(14:52:50) Igron: Мне посоветовали выйти на вас.
(14:53:07) Sanek T™: продолжай
(14:53:21) Igron: Что такое "РМЭС проект"?
(14:53:29) Igron: Расскажите пожалуйста.
(14:53:52) Sanek T™: www.rmes.ru
(14:54:07) Igron: А можно поподробнее, что это такое?
(14:54:34) Igron: И еще интересует, есть ли корпоративная версия для нашего
            предприятия?
(14:54:50) Sanek T™: организуем!
(14:54:50) Igron: Мы хотим пройти тренинг всеми сотрудниками...
(14:55:11) Igron: Особенно если там будет возможность грабить корованы? Таковая
            имеется?
(14:55:25) Igron: Заранее благодарен
(14:55:45) Sanek T™: да,в избытке
14:44:01 Kreps: добрый день, был на сайте www.rmes.ru, но у меня остались
            некоторые воросы, можно к вам обратиться за помощью
14:44:45 Sanek T™: на счет караванов?
14:45:32 Kreps: да именно, народ хочет знать: "Можно ли грабить КОРОВАНЫ?!"
14:47:34 Sanek T™:народу над зрелищь и хлеба!ТЫ готов на это?
14:49:19 Kreps: народу срочно нужны ебилды и летающие коровы, конечно только
            после огробления корованов