среда, 24 октября 2012 г.

Выводим список таблиц с количеством записей в mysql

Хочу привести небольшой пример запроса, с помощью которого можно получить список таблиц в mysql базе с количеством записей :
SELECT table_name, table_rows 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = '**YOUR DATABASE**';

Вывод будет такой:




вторник, 9 октября 2012 г.

Проблема с Wait IO в Linux

Wait I/O - это параметр который показывает какой процент времени работающие процессы были заблокированы, ожидая когда операция ввода -вывода закончится.

Вот и мне пришлось столкнуться с такой проблемой. Стал замечать, что один из серверов стал периодически "залипать". Вывод команды top показал что в этот момент wa-процент составлял от 90% до 100%, что было просто не допустимо.

Запустим vmstat, чтобы убедиться в наличии проблемы


Как видно на картинке - действительно параметр wa подскакивает до 100.

Чтобы отследить "проблемный" процесс - воспользуемся небольшим сочетанием команд:

while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done

Через некоторое время виновник был найден


Оказалось что в cron попал скрипт который предназначался не этому серверу. Скрипт был убран и все стало на свои места. 

Также хочу добавить, что причина Wait IO может быть различна. Но всегда ответ кроется в процессах со статусом "D".

По материалам chile-offshore.com



понедельник, 8 октября 2012 г.

Хабр издевается или что будет с капчей дальше

Сегодня зайдя на Хабр, увидел замечательную капчу. Хочу и с вами поделиться. Возмутительно! =))

четверг, 4 октября 2012 г.

generated/bounds.h no such file or directory

Лечим ошибку, которая возникает при попытке скомпилировать драйвера:
generated/bounds.h no such file or directory

Лечится очень просто: необходимо сгенерировать необходимые заголовки командой:
cd /usr/src/linux && make modules_prepare 

вторник, 11 сентября 2012 г.

Поиск IP адресов в файле, используя bash

Понадобилось мне тут вывести список всех IP-адресов, встречающихся в файле. Сделать это можно следующей командой
cat /etc/named.conf | grep listen-on | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

понедельник, 10 сентября 2012 г.

Новый сервер DLNA

Привез сервер на который мы установим Debian 6 c Xen и FreeNAS+DLNA. Жена была не очень рада такой махине в нашей маленькой квартире. Еще и заводится он так, как будто самолет взлетает =)




По параметрам он не очень мощный по современным меркам(хотя у него 2 процессора и 4 scsi винта в рейде 1+0), но нам для эксперимента с развертыванием домашнего сервера хватит. 

Twitter feed

Всем привет. Создал twitter feed аккаунт для блога. Подписывайтесь по ссылке

четверг, 6 сентября 2012 г.

Мониторинг транков Asterisk с уведомлением о проблеме по почте

Хочу привести пример php скрипта, который я иногда использую для мониторинга транков. Я поменщаю его в cron с интервалом в 15 минут. После срабатывания он проверит транки. Если есть не работающий - дает паузу в 20 секунд. Снова проверяет состоняние транков. Если ничего не изменилось - перегружаем модуль chan_sip в asterisk. И если это не могло - шлем email с отчетом по почте, указанной в переменной $report_email.
Скрипт не мой лично - но нареканий в работе у меня нет.
Если у кого то не отоборажается - выложил скрипт сюда https://gist.github.com/3656293

вторник, 4 сентября 2012 г.

Нужна помощь по BIND

Обращаюсь за помощью по настройке BIND. Есть DNS сервер который выполнет функцию кеширующего DNS. Проблема в том что при резолве он берет значение ttl у домена. И спустя какое то время, если пропадает интернет, он не может разрезолвить хост. Может кто нибудь знает как можно BIND заставить игнорировать значение TTL и поставить свое?

четверг, 30 августа 2012 г.

Как узнать ip адрес интерфейса и вывести только его

Маленький пример о том как использовать ifconfig, cut и awk чтобы вывести только ip адрес. Вывод команды ifconfig будет таким

$ /sbin/ifconfig

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:69527 errors:0 dropped:0 overruns:0 frame:0
          TX packets:69527 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:41559546 (39.6 MiB)  TX bytes:41559546 (39.6 MiB)
eth0      Link encap:Ethernet  HWaddr 00:17:9A:0A:F6:44
          inet addr:192.168.2.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::217:9aff:fe0a:f644/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:227614 errors:0 dropped:0 overruns:0 frame:0
          TX packets:60421 errors:0 dropped:0 overruns:0 carrier:0
          collisions:272 txqueuelen:1000
          RX bytes:69661583 (66.4 MiB)  TX bytes:10361043 (9.8 MiB)
          Interrupt:17
ra0       Link encap:Ethernet  HWaddr 00:50:56:C0:00:01
          inet addr:192.168.1.2  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1024 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1320 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


Выведем нужный нам интерфейс и исключим все, кроме строки с IP-адресом:

$ /sbin/ifconfig eth0| grep 'inet addr:'
inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0

Теперь подключим утилиту cut для того чтобы отделить IP. Говоря просым языком, cut разделит строку в виртуальный массив через ":" и возьмет 2-й элемент этого массива. Вывод будет таким:

$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2
192.168.2.1  Bcast

Ну и в конце с помощью awk вытаскиваем IP. Финальная команда будет выглядеть так:

$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
192.168.2.1

Истрочник

понедельник, 27 августа 2012 г.

Установка драйвера для NetGear WNA1100 USB WiFi адаптера

Попросили меня на днях подключить драйвер для WiFi адаптера NetGear WNA1100 USB. Выглядит сей девайс следующим образом (см. картинку).


Интересен он тем, что может работать в режиме Access Point в связке с hostapd. Итак, втыкаем этот девайс в машину и смотрим что адаптер определился:


[root@host src]# lsusb 
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0846:9030 NetGear, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Если у вас также - значит поехали далее. Устанавливаем linux-headers, build-essential и качаем драйвера:

[root@host ~]# apt-get install linux-headers-$(uname -r)
[root@host ~]# apt-­get install build-essential
[root@host src]# cd /usr/src
[root@host src]# wget http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2

Далее распаковываем наше добро, переходим в каталог с распакованными драйверами и даем команду на выбор необходимого модуля. Нас интересует только ath9k_htc.

[root@host src]# tar xf compat-wireless-2.6.tar.bz2
[root@host src]# tar xf linux­-headers
[root@host src]# cd compat-wireless-2.6
[root@host src]# ./scripts/driver­select ath9k_htc

Компилируем модули:

[root@host src]# make
[root@host src]# make install

После того как вы успешно откомпилировалось качаем firmware и кладем его в каталог /lib/firmware. (Небольшое замечание: иногда, если исходники ядра уже были и из них собирались модули или ядро, то нужно перейти в каталог с исходниками ядра и дать команду "make modules_prepare").

[root@host src]# wget http://linuxwireless.org/download/htc_fw/1.3/htc_9271.fw
[root@host src]# mv ./htc_9271.fw /lib/firmware

Подгружаем модуль и убеждаемся что все корректно загрузилось:

[root@host src]# modprobe ath9k_htc

[root@host src]# lsmod | grep ath9
ath9k_htc              42366  0 
mac80211              286250  1 ath9k_htc
ath9k_common            1371  1 ath9k_htc
ath9k_hw              300480  2 ath9k_htc,ath9k_common
ath                    11078  3 ath9k_htc,ath9k_common,ath9k_hw
cfg80211              128110  3 ath9k_htc,mac80211,ath
compat                  8652  5 ath9k_htc,mac80211,ath9k_common,ath9k_hw,cfg80211


На этом все! Можно ставить hostapd и заставить wifi адаптер работать в режиме AP. Мой конфиг hostpad выглядит следующим образом:


[root@host ~]# cat /etc/hostapd/hostapd.conf 
interface=wlan0
driver=nl80211
logger_stdout=-1
logger_stdout_level=2
ssid=Test
hw_mode=g
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]
channel=5
auth_algs=3
max_num_sta=5
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

четверг, 23 августа 2012 г.

Закрываем доступ к сайту с помощью .htpasswd и .htaccess

Эта заметка скорее не для общего обозрения, а чисто для себя. Бывает что нужно быстро закрыть доступ к некоему http-ресурсу. И я каждый раз ищу документацию по опциям htaccess и htpasswd. Чтобы этого не делать - лучше выложу у себя в блоге. Может кому-то пригодится.

Итак, в настройках apache разрешаем Override. Это для того, чтобы можно было .htaccess задействовать. Пример virtualhost:


< VirtualHost *:80 >
    ServerAdmin worldisfreedom@gmail.com
    DocumentRoot /home/www/www.alertme.ru/html
    ServerName alertme.ru
    < Directory / >
      Options FollowSymLinks
        AllowOverride All
            < /Directory >
    ErrorLog /home/www/www.alertme.ru/logs/error.log
    CustomLog /home/www/www.alertme.ru/logs/access.log common
< /VirtualHost >


Даем команду на reload apache:

# /sbin/service/httpd reload

Далее переходим в ту директорию, которую хотим закрыть и создаем там файл .htaccess со следующим содержимым:

AuthUserFile /home/www/www.voip-lab.ru/html/admin/.htpasswd
AuthName EnterPassword
AuthType Basic
Require user admin

Далее, в той же директории(или любой какой угодно-главное путь не забыть в .htaccess поменять) создаем файл .htpasswd командой

# htpasswd -c .htpasswd admin

И задаем пароль.

Ура! Я больше не буду искать эту инфу =))

среда, 22 августа 2012 г.

Редирект в nginx или использование rewrite и proxy_pass

Возникла тут задачка сделать редирект с помощью nginx при определенном запросе к сайту. Для осуществления нашей задачи я приведу пример конфига:


 server {
         listen       80;
         server_name  www.site.ru site.ru;
         reset_timedout_connection  on;
         location ~* /Service {
            proxy_pass http://avia.go2see.ru;
         }
         location ~* /Service2 {
            rewrite ^ http://demo.site.ru/Service2 permanent;
         }
         location / {
             proxy_pass http://www/;
             proxy_next_upstream error timeout invalid_header http_500 http_503;
             proxy_set_header   Host             $host;
             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_connect_timeout 120;                                                                                                                                                                                                                                      
         }
 }

Отличие rewrite от proxy_pass состоит в том, что редирект будет выглядеть "открыто". Т.е. страничка автоматичеси переадресуется по новому адресу. 

В случае в proxy_pass запрос уйдет "прозрачно", т.е. пользователь даже не поймет что был запрос по новому url адресу.



понедельник, 20 августа 2012 г.

Как привязать ssl к nginx

В данной заметке я расскажу как быстро привязать ssl сертификат к nginx. Испытания мы  проведем тестовом сервере с тестовым сертификатом, который запросим у Comodo.

Итак, для начала определимся что у нас есть. А есть у нас один nginx сервер который смотрит в Интернет. И, для простоты, один внутренний (с ip 10.10.10.10) для которого и будет создаваться стандартное и ssl подключение. Конечно, серверов может быть сколько угодно. Но мы с вами сейчас не будем усложнять.

Для начала нам необходимо создать CSR-запрос на сертификат. Бесплатно можно его сделать либо напрямую у Comodo, либо через сайт http://www.freessl.su/. Мы будет делать через http://www.freessl.su/.

Конфигурационные файлы от nginx у меня лежат в каталоге /etc/nginx. Создаем там подкаталог ssl и переходим в него.

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl

Далее необходимо создать CSR запрос. Для этого сначала создадим файл приватного ключа следующей командой:

# openssl genrsa -des3 -out secure.website.ru.key 2048

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

# openssl genrsa -out secure.website.ru.key 2048

Далее создадим файл запроса на генерацию сертификата. Для этого пишем команду:

# openssl req -new -key  secure.website.ru.key -out  secure.website.ru.csr

И заполняем поля. После этого будет сгенерирован файл /etc/nginx/ssl/secure.website.ru.csr. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.

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

Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /etc/nginx/ssl/secure.website.ru.crt.

#cat secure_website_ru.crt >> /etc/nginx/ssl/secure.website.ru.crt
#cat secure_website_ru.ca_bundle >> /etc/nginx/ssl/secure.website.ru.crt

На этом формирование сертификата закончено. Переходим к настройке nginx. Для нашего случая конфигурация /etc/nginx/nginx.conf будет выглядеть следующим образом:

user  nginx;

worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {
    worker_connections  2048;
}


http {
    upstream www {
        server 10.10.10.10 weight=1 max_fails=3 fail_timeout=120;
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

#Секция для стандартного подключение по 80 порту
     server {
         listen       80;
         server_name  secure.website.ru;
         reset_timedout_connection  on;
         location / {
             proxy_pass http://www/;
             proxy_next_upstream error timeout invalid_header http_500 http_503;
             proxy_set_header   Host             $host;
             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_connect_timeout 100;
         }
    }

 # Секция для подключения по ssl
    server {
        listen          443 ssl;
        server_name     secure.website.ru;

        access_log      logs/ssl-access.log;
        error_log       logs/ssl-error.log;

        ssl_certificate      ssl/secure.website.ru.crt;
        ssl_certificate_key  ssl/secure.website.ru.key;
        ssl_verify_depth 3;
      
        keepalive_timeout    60;
        location / {
                proxy_pass  http://www/;
                proxy_next_upstream error timeout invalid_header http_500 http_5
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_redirect     off;
      }
 }
}

Сохраняем и перезапускаем nginx.

# service nginx reload

Вдаваться в детали настроек я не хочу. Про них очень хорошо написано в официальной документации nginx.

Единственное что хотелось бы подчеркнуть, что если вы хотите на 1 сервер повесить несколько разных ssl сертификатов на порт 443, то просто добавить такую конфигурацию не получится:

server {
    listen           443;
    server_name      www.example.com;
    ssl              on;
    ssl_certificate  www.example.com.crt;
    ...
}

server {
    listen           443;
    server_name      www.example.org;
    ssl              on;
    ssl_certificate  www.example.org.crt;
    ...
}

В такой конфигурации браузер получит сертификат первого сервера, т.е. www.example.com, независимо от запрашиваемого имени сервера. Это связано с поведением протокола SSL. SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос, и nginx не знает имени запрашиваемого сервера. Следовательно, он лишь может предложить сертификат сервера по умолчанию.

Решение данного вопроса вы можете найти по ссылке.

На этом базовая настройка nginx законена.

четверг, 16 августа 2012 г.

Моя прелесть или uptime сервера

Хочу похвастать uptime-ом одним из серверов, который выполняет функцию Voip-сервера и шлюза на базе NEOPbx.


Учитывая что сервер активно используется - думаю есть повод гордиться. Выкладывайте в комментах свои "My Precious" =)

Настраиваем домашний файловый сервер на основе Xen и Freenas / Часть 1 - Установка Xen на Debian

Данной небольшой заметкой я начну серию статей о хитрой связке Xen и Freenas. Почему хитрой, ответит на вопрос серия требований. Далее, под системой я буду понимать всю связку Xen c Freenas со всеми дополнениями и фунционалом.

Требования:
  • Система должна представлять собой файловое хранилище.
  • Система должна уметь закачивать .torrent файлы через web интерфейс и dropbox
  • Система должна иметь DLNA сервер для последующего воспроизведения
  • Нужно модифицировать web-интефейс transmission для нативного перезапуска DLNA службы на основном сервере.
  • Орагнизовать запуск на скачку .torrent с мобольных девайсов
  • Пробросить жесткий диск из Dom0 во FreeNAS
По службам получается приблизительно такая картина:



За неимением Android девайса не могу сказать что нам понадобится для запуска закачки на сервере. Но обещаю ближе к финалу найти телефончик. Протестить и дополнить схему.

В итоге мы подключим жесткий диск и прокинем его в гостевую машину. Далее, поскольку если   одновременно смонтировать ЖД и прокинуть в гостевую машину, появляются глюки(по понятным причинам), а адекватно работающий DLNA-сервер мне удалось найти только под Linux,- мы смотнируем по nfs содержимое FreeNAS сервера в Debian. По производительности вы ничего не потеряете, а вот возможных глюков можно избежать.

Далее мы установим dropbox на сервер Debian и натравим его на смонтированный по nfs (под)каталог.

И в заключение в transmission мы добавим волшебную кнопочку, которая будет на Debian сервере перезапускать minidlna службу. А сделаем это с помощью javascript+php+ssh с авторизацией по ключу.

Итак, инсталляцию гипервизора я буду производить на дистрибутив squeeze. Нам нужно всего 4 команды и сделать ребут сервера.

# apt-get install xen-linux-system
# apt-get install xen-qemu-dm-4.0
# dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen
# update-grub

По умолчанию у вас должна загрузиться система с новым ядром с поддержкой XEN. В следующей части мы установим на Debian - sshd, dlna, nfsd, dropbox и настроим iptables.



среда, 15 августа 2012 г.

Новый опрос

В блог я, конечно, стал писать гораздо реже, в связи с сильной загруженностью. Но прошу Вас ответить на опрос который я разместил в панели справа. Я хочу показать и рассказать каким образом можно организовать связку между xen, freenas, dlna, dropbox, ipad и/или iphone. Основная задача такой связки в том, что я могу с любого устройства (и даже все локальной сети) на сервере запустить закачку torrent-файла с последующим просмотром его на телевизоре с поддержкой DLNA. Если вам (не)интересно прошу ответить в опросе.

вторник, 14 августа 2012 г.

Выполнение скрипта при обращении к хосту

Однажды у меня возникла задача - как сделать так, чтобы при обращении к определенному ip на шлюзе запускался некий скрипт или программа. В этом посте я хочу привести пример на perl с использованием tcpdump. В этом скрипте если было обращение с хоста 192.168.0.104 к 93.158.134.61 произойдет перезапуск DLNA сервера. Я использую его в связке со своим телевизором подключенном к локальной сети. Таким образом мне удалось перезапускать DLNA службу, если я открыл на телевизоре сайт yandex.ru. Ну и собственно сам скрипт:


#!/usr/bin/perl
$LIMIT = shift || 5000;
$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
    if (/^\S/) {
  last unless $LIMIT--;
while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g)  {
       #print "$client -> $host\t$&\n";
       if(($host=="93.158.134.61") and ($client="192.168.0.104")){
              system('/sbin/service minidlna restart&');}
}
undef $client; undef $host; undef $packet;
($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
       if /P \d+:\d+\((\d+)\)/ && $1 > 0;
    }
    next unless $client && $host;
    s/\s+//;
    s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
    tr/\x1F-\x7E\r\n//cd;
    $packet .= $_;
}

понедельник, 13 августа 2012 г.

PS1 или меняем строку приглашения

Работая  одновременно с большым количеством линуксовых серваков я подумал что было бы удобно, если в строке риглашения выводилось не только сообщение о хосте, пользователе но и ip адресе текущей машины. Сказано - сделано. Открываем файл .bashrc в домашнем каталоге и дописываем в него строку

export "PS1=[`/sbin/ifconfig eth0 | /usr/bin/perl -ne 'if ( m/^\s*inet (?:addr:)?([\d.]+).*?cast/ ) { print qq($1\n); exit 0; }'`][\u@\h \W] # "


Сохраняем и переподключаемся. И в результате видим нашу красоту. Теперь я буду путаться гораздо меньше =)

четверг, 28 июня 2012 г.

Примеры замены подстроки в файлах на perl, sed, awk

Часто бывает нужно заменить какую то 1 строку в конфигурационном файле из скрипта. Чтобы далеко не ходить можно использовать следующие примеры скриптов.

1. Замена подстроки в одном файле с помощью sed

$ cat ./file.txt
I have three dogs.

$ sed -e 's/dog/cat/g' ./file.txt
I have three cats.

2. Замена подстроки в одном файле с помощью perl (вариант короче, но нужен perl)

perl -e 's/dog/cat/g' -pi ./filename

3. Замена подстроки в нескольких файлах с помощью простого bash-скрипта
#!/bin/bash
f="cat"
t="dog"
for i in `egrep -r $f ./www | grep -v svn | cut -d ":" -f1`
do
    reg="s/$f/$t/g"
    sed -e $reg $i > ${i}.bak
    mv ${i}.bak $i
    echo $i
done

4. Замена подстроки в нескольких файлах с помощью perl одной командой
egrep -rl "dog" ./ | xargs -i perl -pi -e 's/dog/cat/g' '{}'

5. Замена подстроки в нескольких файлах с помощью awk одной командой 
awk '{gsub("cat", "dog", $0); print > FILENAME}' ./*


Источник: http://www.gnuman.ru/stuff/sed/

понедельник, 30 января 2012 г.

NEOPBX

Ну вот мы с хорошим другом и партнером подошли к финалу разработки платформы ip-телефонии NEOPbx.RU! Разработка велась в течении полутора лет и мы очень рады что у нас получился действительно качественный и не дорогой продукт, сделанный, как говорится от людей и для людей. Цена вопроса всего 14990 рублей. Купить можно на



Возможности нашего продукта просто огромны. Вот их небольшая часть.

Пользовательские:

Личный кабинет абонента. Просмотр личной статистики и управление своим номером
Полностью русскоязычный Web-интерфейс
Факс сервер — отправка факса через Web, прием и рассылка факсов по электронной почте

Модуль автоматической настройки телефонов для их удаленного администрирования

Сетевые:

Встроенная функция роутера избавит вас от покупки второго сетевого устройства


Сервер VPN поможет организовать безопасный доступ в главный офис из филиалов


WIMAX — Поддержка модема Yota в качестве резервного интернет-канала


Возможность работы с GSM-модемами «NEOPbx» в качестве голосовых каналов. 

Сервисные:


Firewall поможет гибко управлять сетевым трафиком и пресечь попытки несанкционированного доступа к АТС
Функция резервного копирования по расписанию
Модуль безопасности блокирует несанкционированные попытки регистрации на АТС в случае подбора пароля или с неразрешенного IP адреса
Возможность работы с внешними носителями информации USB и SD/MMC расширяет дисковое пространство для записи и хранения разговоров, факсов и резервных копий
Несколько скринов: