вставка строк

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

вставка строк

Непрочитанное сообщение schizoid » 2009-09-16 11:59:51

есть файл вида:

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

# cat /usr/local/etc/netams.cfg.work
#NeTAMS version 3.4.0 (build 2916.1) compiled by root@freeserv.home
#configuration built Sat Feb 16 15:30:25 2008
#begin
#global variables configuration
debug no
language ru
user oid 02A6F4 name admin real-name "Eugene" crypted $1$$1CXSo9ZU3rRh4yE2MnSlV0 email admin@stl.ok.net.ua permit all
user oid 0C8EE2 name moder real-name "Igor" crypted $1$$Xe0JjU7YtEEOODQtwPL9F1 permit all

#services configuration

service server 0
login local
listen 20001
max-conn 6

service processor
lookup-delay 30
flow-lifetime 180
policy oid 0B4940 name ip target proto ip
restrict all drop local pass
unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip
unit host oid 033333 name server ip 193.16.45.26
unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.5" email eugene@localhost password 123 acct-policy ip
unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.18" password 123 acct-policy ip
unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.7" password 123 acct-policy ip

service storage 1
type mysql
host localhost
user netams
password NeTAMS
accept all

service data-source 1
type ip-traffic
source divert 199
layer7-detect urls

service login
storage 1
set name eugene password 123456 inact 0 abs 0
relogin yes

service monitor 0
#monitor to file /usr/tmp/mon_netams.log
monitor to storage 1
monitor unit 000001
monitor unit 000002
monitor unit 000003

service quota
policy ip
notify soft {owner}
notify hard {owner} 02A6F4
notify return {owner}

service alerter 0
report oid 06100 name rep1 type traffic period day detail simple
smtp-server localhost

service html
path /usr/local/www/data/site/stat
run 5min
url http://192.168.10.100/stat/
htaccess yes
client-pages all
account-pages all

service scheduler
oid 08FFFF time 5min action "html"


#end
при заведении нового юзера нужно скриптом добавить строки аля:

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

unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip
monitor unit 000004
на свои места, т.е. вида должен стать:
#NeTAMS version 3.4.0 (build 2916.1) compiled by root@freeserv.home
#configuration built Sat Feb 16 15:30:25 2008
#begin
#global variables configuration
debug no
language ru
user oid 02A6F4 name admin real-name "Eugene" crypted $1$$1CXSo9ZU3rRh4yE2MnSlV0 email admin@stl.ok.net.ua permit all
user oid 0C8EE2 name moder real-name "Igor" crypted $1$$Xe0JjU7YtEEOODQtwPL9F1 permit all

#services configuration

service server 0
login local
listen 20001
max-conn 6

service processor
lookup-delay 30
flow-lifetime 180
policy oid 0B4940 name ip target proto ip
restrict all drop local pass
unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip
unit host oid 033333 name server ip 193.16.45.26
unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.5" email eugene@localhost password 123 acct-policy ip
unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.18" password 123 acct-policy ip
unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.7" password 123 acct-policy ip
unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip

service storage 1
type mysql
host localhost
user netams
password NeTAMS
accept all

service data-source 1
type ip-traffic
source divert 199
layer7-detect urls

service login
storage 1
set name eugene password 123456 inact 0 abs 0
relogin yes

service monitor 0
#monitor to file /usr/tmp/mon_netams.log
monitor to storage 1
monitor unit 000001
monitor unit 000002
monitor unit 000003
monitor unit 000004

service quota
policy ip
notify soft {owner}
notify hard {owner} 02A6F4
notify return {owner}

service alerter 0
report oid 06100 name rep1 type traffic period day detail simple
smtp-server localhost

service html
path /usr/local/www/data/site/stat
run 5min
url http://192.168.10.100/stat/
htaccess yes
client-pages all
account-pages all

service scheduler
oid 08FFFF time 5min action "html"


#end

сейчас это делается так:

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

cat /usr/local/etc/netams.cfg |
{
while read str
do
   echo $str >> /usr/local/etc/netams.cfg.temp
   n=`echo ${str}| grep "unit host oid"| awk '{print $4}'` 2>&1 > /dev/null
   m=`echo ${str}| grep "monitor unit"| awk '{print $3}'` 2>&1 > /dev/null
   if [ "$n" = 0000$last_id ]; then
        echo "unit host oid 0000${id} name $name ip $v_ip description \"ip $r_ip\" password 123 acct-policy ip" >> /usr/local/etc/netams.cfg.
   fi

   if [ "$m" = 0000$last_id ]; then
        echo "monitor unit 0000${id}" >> /usr/local/etc/netams.cfg.temp
   fi
done
}

собсна работает, только медленно. подумал, что может как-то sed-ом это сделать, но что-то не выходит...
может подскажете что-нить?
ядерный взрыв...смертельно красиво...жаль, что не вечно...

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

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

Хостинг HostFood.ru

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35469
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: вставка строк

Непрочитанное сообщение Alex Keda » 2009-11-15 19:05:18

перлом - быстро будет =))
Убей их всех! Бог потом рассортирует...

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: вставка строк

Непрочитанное сообщение schizoid » 2009-11-16 11:01:21

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

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

Re: вставка строк

Непрочитанное сообщение zg » 2009-11-16 17:29:59

чё проще :smile: используй два маркера:

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

config.txt
....
....
# marker1

....
....
....
# marker2
потом эти маркеры заменяешь на нужную строку и этот же самый маркер.

Кода пара строк, работает мгновенно :roll:

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: вставка строк

Непрочитанное сообщение schizoid » 2009-11-16 23:21:40

тю, действительно :)
снкс за идею.
ядерный взрыв...смертельно красиво...жаль, что не вечно...

reLax
лейтенант
Сообщения: 638
Зарегистрирован: 2007-04-08 5:50:16

Re: вставка строк

Непрочитанное сообщение reLax » 2009-11-17 22:00:28

netamsctl уже отменили чтоли ? :)

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: вставка строк

Непрочитанное сообщение schizoid » 2009-11-19 16:00:48

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

reLax
лейтенант
Сообщения: 638
Зарегистрирован: 2007-04-08 5:50:16

Re: вставка строк

Непрочитанное сообщение reLax » 2009-11-19 20:03:42

Не знаю, ничего не терял. У нас netams стоит в качестве лимитирования трафика, иногда netamsctl использую при полной очистке базы для восстановления квот (все-таки netams иногда клинить начинает, когда делаешь некоторые изменения в конфиге, а забивать заново квоты слишком долго). Проблем пока не видел, короче :)

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: вставка строк

Непрочитанное сообщение schizoid » 2009-11-19 23:21:55

нуно будет посмотреть. я собсна после обновления версии не пробовал. может и правда, не изобретать велосипед.
хотя уже почти сделал ;)
ядерный взрыв...смертельно красиво...жаль, что не вечно...

reLax
лейтенант
Сообщения: 638
Зарегистрирован: 2007-04-08 5:50:16

Re: вставка строк

Непрочитанное сообщение reLax » 2009-11-20 19:09:50

Ну главное, чтобы оно работало, а уж каким образом - неважно. Хотя, что-то сделав сам - добавишь себе самому лишних скиллов :)

Просто, например, в твоем случае, после занесения в конфиг новой записи тебе придется перезапускать netams. В моем случае такое было-бы нежелательно, потому что если я девушке по доброте душевной дал лишнего инета посредством (config-quota:0)# set name natasha inactive, то после такой твоей правки конфига Наташу сразу же достаточно жестоко, со сбросом всеx активных сессий, выкинет из интернетов, асек и прочих мэйлагентов уже посредством pf:

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

 
pfctl -q -t NETAMS_INET -T add 192.168.0.100
pfctl -q -k 192.168.0.100
...
block return  in log quick on $IntIf inet proto tcp from <NETAMS_INET> to any port {80, 8080, 443, 21, 20, 5190, 2041, 2042}
В принципе, что и будет делать скрипт при перезапуске демона, указанный в конфиге netams'a access-script "/sbin/netams_inet.sh"

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

#!/bin/sh

KP_SUBNET="172.17.4."
PRIVATE_KEY="/root/.ssh/rsa.key"
KP_GW="x.x.x.x"
FILE="KP_ANOTHER_HOST"
REMOTE_HOST_DIR="/home/alex"
LOCAL_KP_NETAMS_INET="LKP_NETAMS_INET"

case $1 in
        DENY)
          if [ `echo $3 | grep $KP_SUBNET` ]
               then
                   echo $3 > /tmp/$FILE
                   scp -i $PRIVATE_KEY /tmp/$FILE alex@$KP_GW:${REMOTE_HOST_DIR}/$FILE > /dev/null 2>&1
                   ssh -l alex -i $PRIVATE_KEY $KP_GW "sudo /sbin/pfctl -q -t NETAMS_INET -T add -f ${REMOTE_HOST_DIR}/$FILE" > /dev/null 2>&1
                   pfctl -q -t $LOCAL_KP_NETAMS_INET -T add $3
                   pfctl -q -k $3
               else
                   pfctl -q -t NETAMS_INET -T add $3
                   pfctl -q -k $3
         fi
      ;;
       ALLOW)
          if [ `echo $3 | grep $KP_SUBNET` ]
               then
                   echo $3 > /tmp/$FILE
                   scp -i $PRIVATE_KEY /tmp/$FILE alex@$KP_GW:${REMOTE_HOST_DIR}/$FILE > /dev/null 2>&1
                   ssh -l alex -i $PRIVATE_KEY $KP_GW "sudo /sbin/pfctl -q -t NETAMS_INET -T delete -f ${REMOTE_HOST_DIR}/$FILE" > /dev/null 2>&1
                   pfctl -q -t $LOCAL_KP_NETAMS_INET -T delete $3
                   pfctl -q -k $3
               else
                   pfctl -q -t NETAMS_INET -T delete $3
                   pfctl -q -k $3
         fi
     ;;
esac

exit 0
При том, что на другой стороне обрабатываются команды только через sudo

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

alex    ALL=NOPASSWD: /sbin/pfctl -q -t NETAMS_INET -T add -f /home/alex/KP_ANOTHER_HOST, /sbin/pfctl -q -t NETAMS_INET -T delete -f /home/alex/KP_ANOTHER_HOST
У меня так netams примерно работает :) Смысл: коллектор один - а сенсоров, допустим, много.
А насчет netamsctl...Просто удобнее считаю...

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вставка строк

Непрочитанное сообщение ProFTP » 2009-11-21 2:24:48

schizoid писал(а):есть файл вида:
там можно использовать Сишные функции для не буферизированных дискрипторов syswrite, sysread, sysseek, sysopen - осуществляют не буферизованный вывод данных, не используя буферы стандартной системы ввода/вывода stdio.

примерно: узнать позицию абцаза после которого ИМЕННО оно должно вставить, опредить позицию в байтах функцией tell, потом вернутся вверх на 2 байт, (абзаца будет 1 или 2), чтобы быть на том абзаце, и вставить туда + добавить перевод каретки \n. и вставиться

т.е. вставить эту строку внутрь файла, именно разрезать функцией traceute файл и вставить
на счет traceute - вообщем там разрезать потом заполнить...

но там должно все получиться http://www.spravkaweb.ru/perl/print#truncate


так а в чем именно оно медленное? файл большой или ты много раз туда строки пытаешься вставить?
(если файл большой, то syswrite, sysread, sysseek должны подойти)
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вставка строк

Непрочитанное сообщение ProFTP » 2009-11-23 3:37:16

schizoid писал(а):он по-моему при сейве конфига что-то терял...
если вдруг не решишь, то вот я быстро наклепал, он делает, то что ты писал в первом посте (если конфиг такой)

единственное, что функция read не читает файл, если файл открыт для записи, по этому приходиться сначало открыть, потом закрыть, потом опять открыть и закрыть (3 раз тут я еще открыл чтобы найти абзац)

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

LOCK_SH Shared Lock - typically used when reading from a file
LOCK_EX Exclusive Lock - typically used when writing to a file
LOCK_NB Non-Blocking Lock - used if you do not want the script to stall if a lock is not obtained
LOCK_UN Unlock - unlocks the file: can lead to data loss (see below)

http://perldoc.perl.org/functions/flock.html
http://www.pageresource.com/cgirec/ptut15.htm

(я закомментировал, там в начале после open надо заблокировать для чтеняи наверное)

еще можно использовать транзакции: http://search.cpan.org/~muir/Object-Tra ... action.pod
может быть их как-то можно применить, если надо будет

вот скрипт:

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

#!/usr/bin/perl -w

#Written By ProFTP
#contact: rtyug@ukr.net

use Fcntl ':flock';

##
# to insert a line after an indention
#

###
#
# Example: ./perl.pl 'bla-bla'

# Filename
$file = 'netams.cfg';

# абзац перед которым вставить(на 1 меньше)
# indention before which to insert
$indention = 4;

# $ARGS[0] line which to insert "bla-bla "  ./perl.pl 'bla-bla'

$ARGV[0] = 'bla-bla' if ( !@ARGV || !$ARGV[0] );

# File Locking:
#
# http://perldoc.perl.org/functions/flock.html
# http://www.pageresource.com/cgirec/ptut15.htm

$/ = ''
  ; # Включить режим чтения абзацев - To set mode reading of indentions
open( F, $file ) or die "can't open $file: $!";
while (<F>) {

    if ( $. == $indention ) {
        $seeked = (tell) - 1; # на 1 байт вверх
        last;

    }
}
close F;

open( F, $file ) or die "can't open $file: $!";

seek F, 0, 2;
$ttel = tell;

seek F, $seeked, 0;
read F, $recl2, $ttel;

close F;

open( F, "+<" . $file ) or die "can't open $file: $!";

#     flock( LOG, LOCK_EX );
seek F, $seeked, 1;
truncate F, $seeked;
print F $ARGV[0] . "\n";
print F $recl2;

#    flock( LOG, LOCK_UN );

close F;

exit;

 
для теста, просто запустить можно

то что получилось

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

#NeTAMS version 3.4.0 (build 2916.1) compiled by root@freeserv.home
#configuration built Sat Feb 16 15:30:25 2008
#begin
#global variables configuration
debug no
language ru
user oid 02A6F4 name admin real-name "Eugene" crypted $1$$1CXSo9ZU3rRh4yE2MnSlV0 email admin@stl.ok.net.ua permit all
user oid 0C8EE2 name moder real-name "Igor" crypted $1$$Xe0JjU7YtEEOODQtwPL9F1 permit all

#services configuration

service server 0
login local
listen 20001
max-conn 6

service processor
lookup-delay 30
flow-lifetime 180
policy oid 0B4940 name ip target proto ip
restrict all drop local pass
unit net oid 022222 name stah_all ip 10.0.0.0 mask 255.255.255.0 description "net 10.0.0.0" password 123 no-local-pass acct-policy ip
unit host oid 033333 name server ip 193.16.45.26
unit host oid 000001 name eugene ip 10.0.0.1 description "ip 192.168.10.5" email eugene@localhost password 123 acct-policy ip
unit host oid 000002 name agent ip 10.0.0.2 description "ip 192.168.10.18" password 123 acct-policy ip
unit host oid 000003 name chetkiller ip 10.0.0.3 description "ip 192.168.10.7" password 123 acct-policy ip
unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip
bla-bla
bla-bla
bla-bla
bla-bla
bla-bla
bla2
bla2
bla2
unit host oid 000004 name sirius ip 10.0.0.4 description "ip 192.168.10.29" password 123 acct-policy ip

service storage 1
type mysql
host localhost
user netams
password NeTAMS
accept all
bla-bla

service data-source 1
type ip-traffic
source divert 199
layer7-detect urls

service login
storage 1
set name eugene password 123456 inact 0 abs 0
relogin yes

service monitor 0
#monitor to file /usr/tmp/mon_netams.log
monitor to storage 1
monitor unit 000001
monitor unit 000002
monitor unit 000003
monitor unit 000004

service quota
policy ip
notify soft {owner}
notify hard {owner} 02A6F4
notify return {owner}

service alerter 0
report oid 06100 name rep1 type traffic period day detail simple
smtp-server localhost

service html
path /usr/local/www/data/site/stat
run 5min
url http://192.168.10.100/stat/
htaccess yes
client-pages all
account-pages all

service scheduler
oid 08FFFF time 5min action "html"


#end
время time:

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

0.000u 0.011s 0:00.02 50.0%	4+916k 0+4io 0pf+0w
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение