Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

19 февр. 2026 г.

Windows share with password, samba server debian 13

  • apt install samba
  • edit /etc/samba.conf, add
[data]
path= /data
readonly = no
guest ok = no
force create mode= 0770
directory mode = 2770

  • groupadd smbusers
  • mkdir /data
  • chgrp smbusers /data
  • chmod 2770 /data
  • useradd -N -s /sbin/nologin winuser
  • usermod -aG smbusers winuser
  • smbpasswd -a winuser
  • smbpasswd -e winuser
  • systemctl restart smbd

11 сент. 2025 г.

Asterisk sequence of audio files playback

The directory for every queue contains sequence of greetings named as 1.wav, 2.wav, 3.wav, etc.
Required to play those files before enter queue, in ascending order.


[subPlaySequence]
exten => start,1,NoOp(Play sequence from announce/queue/${ARG1})
   same => n,Set(i=1)
   same => n,While($[${i} < 15])
   same => n,Set(exists=${STAT(e,${ASTDATADIR}/sounds/ru/announce/queue/${ARG1}/${i}.wav)})
   same => n,ExecIf($[${exists} = 1]?Playback(announce/queue/${ARG1}/${i}))
   same => n,Set(i=$[${i} + 1])
   same => n,EndWhile
   same => n,Return

[incoming]
exten => 600,1,NoOp(${CALLERID(num)} Call to ${EXTEN})
 same => n,Answer()
 same => n,GoSub(subPlaySequence,start,1(callcenter))
 same => n,Queue(callcenter,120)

Asterisk mp3 mono monitor vs stereo monitor (left channel - one side, right channel - another)

[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(FULL_DIR=${DIR_RECORDS}${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/)
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${FULL_DIR}${fname}.wav"  "${FULL_DIR}${fname}.mp3" && rm -f "${FULL_DIR}${fname}.wav" && chmod o+r "${FULL_DIR}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${FULL_DIR}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);

[macro-stereorecording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(FULL_DIR=${DIR_RECORDS}${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/)
exten => s,n,Set(monwav=nice -n 19 /usr/bin/sox -M "${FULL_DIR}${fname}-in.wav" "${FULL_DIR}${fname}-out.wav" "${FULL_DIR}${fname}-joint.wav" && );
exten => s,n,Set(monmp3=nice -n 19 /usr/bin/lame -b 32 --silent "${FULL_DIR}${fname}-joint.wav" "${FULL_DIR}${fname}.mp3" && );
exten => s,n,Set(moncleanup=rm -f ${FULL_DIR}${fname}*.wav && chmod o+r "${FULL_DIR}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${FULL_DIR}${fname}.wav,bSr(${FULL_DIR}${fname}-in.wav)t(${FULL_DIR}${fname}-out.wav),${monwav}${monmp3}${moncleanup});
exten => s,n(no),Verbose(Exit stereo record);

 

12 авг. 2025 г.

Asterisk call to client, privacy warning before talk

A() - wav file to play callee
m - play moh to caller while play message to callee 

exten = _00XXXXXXXXXX,1,Verbose(1,"Call out with warning ${EXTEN} from ${CALLERID(num)}")
    same => n,Dial(sip/8${EXTEN:2}@provider,300,mA(announce/outwarn))
    same => n,Hangup()

1 июл. 2025 г.

13 февр. 2025 г.

Mysql/MariaDB table delete records by schedule

 1. /root/cleanup_records.sql

use DATABASE_NAME;
delete from TABLE_NAME where `DATE_FIELD` < DATE_SUB(CURDATE(),INTERVAL 3 MONTH);

2. crontab -e (/var/spool/cron/crontabs/root)


# m h  dom mon dow   command
0 0 * * * mysql -uroot <~/cleanup_records.sql

25 янв. 2025 г.

ufw cheatsheet

ufw disable/enable
ufw status verbose
ufw status numbered
ufw delete NUM
ufw delete deny NUM
ufw insert 1 deny in from XXX.XXX.XXX.XXX to any port 25 proto tcp
ufw app info 'OpenSSH' (see /etc/ufw/applications.d)
ufw allow proto tcp from XXX.XXX.XXX.XXX/24 to any port YYYY 
ufw reload (to apply rules)
ufw allow in on eth0 to any port 22
ufw logging on/off/low/medium/high/full
for NAT - /etc/ufw/before.rules
ufw allow 22/tcp comment 'open port 22 for ssh'
ufw allow <PORTFROM>:<PORTTO>/udp

 

29 окт. 2024 г.

Python script ping and log

import subprocess, time
while True:
    result = None
    try:
        result = subprocess.check_output(['ping','-w', '1', '-c', '1', '-n', '-q' ,'192.168.0.1'])
        result = result.decode("utf-8").split('/')
        result = float(result[4])
    except:
        with open("mon.log", "a") as myfile:
            myfile.write(time.strftime('%X %x %Z')+' Ping error.\n')
        myfile.close()
    print result
    if result > 5 :
        with open("mon.log", "a") as myfile:
            myfile.write(time.strftime('%X %x %Z')+' '+str(result)+'\n')
        myfile.close()
    time.sleep(1)

 

16 авг. 2024 г.

Asterisk Chanspy() - supervisor assistance

 exten => _555XXXX,1,Verbose(${CHANNELS()})
 same => n,Authenticate(2128)
 same => n,Answer
 same => n,Wait(1)
 same => n,ChanSpy(SIP/${EXTEN:3},qw)
 same => n,Hangup()

Where calling "555ext_num" connects to current conversation after password "2128#"

q - quiet mode
w - whisper mode (one side) 

8 февр. 2023 г.

Безопасный IVR по 1 цифре

Надо цифры DMTF поместить в отдельный контекст и добавить m, чтобы набиралась только одна цифра.


 [ivr]
exten => 1,1,Verbose(Switch to 102 from ivr)
 same => n,Dial(SIP/102,300)
 same => n,Hangup()

[incoming]
 same => s,Answer
 same => n,Set(TIMEOUT(response)=15)
 same => n,Background(announce/ivr,m,,ivr)
 same => n,Background(silence/5,m,,ivr)
 same => n,Goto(callcenter,74953223232,1)

2 дек. 2022 г.

Add disk to LVM array , extend ext4 filesystem

Not required

  • create partition
  • unmount volume (for ext4)

Check

df -h
fdisk -l
lsblk
lvdisplay
pvdisplay

Extend

pvcreate /dev/vdg
vgextend data /dev/vdg
lvextend -l +100%FREE /dev/data/lvol0
resize2fs -p /dev/mapper/data-lvol0






24 нояб. 2022 г.

Создание LVM массивов RAID5, thin provision, кэширование на SSD. Create LVM RAID5, thin provision, SSD cache.

 Задача - создать на новых дисках RAID5 массивы для хранения виртуальных машин в Proxmox, ISO и Backup.

Один массив - thin provision lvm, такие массивы позволяют легко создавать снапшоты, что делает резервное копирование легким и удобным. Но такие массивы не позволяют хранить ISO и бэкапы, то есть обычные файлы. 

Поэтому второй массив создадим обычным смонтированным каталогом, в терминах Proxmox - Directory. Так как LVM позволяет создавать кэшируемые массивы, настроим на нем кэш на NVME носителе, со скоростью около 2000 Mb/s, что примерно в 4 раза быстрее SATA.

11 июл. 2022 г.

Распределение входящих звонков между своим коллцентром и аутсорсингом

В зависимости от полученного случайного числа (равномерное распределение) передаем либо в свой, либо в посторонний КЦ. 50 - порог, если поменять, то соотношение переданных звонков изменится.

 same => n,Answer
 same => n,Set(TIMEOUT(response)=30)
 same => n,Background(announce/announce180122)
 same => n,Background(silence/5)
 same => n,Macro(recording,${CALLERID(num)},${EXTEN})
 same => n,Set(WhoServe=${RAND(1,100)})
 same => n,Verbose("WhoServe is ${WhoServe}")
 same => n,Gotoif($[${WhoServe} > 50]?ownday)
 same => n(outsourceday),Dial(sip/+74951112233@outsource,300,'g')
 same => n,Hangup()
 same => n(ownday),Queue(callcenter,t,,,600)
 same => n,Hangup()

13 мая 2022 г.

Linux ISCSI Initiator

 - Конфиг лежит в /etc/iscsi, но там 2 файла - настройки, касающиеся параметров подключения (которые можно оставить как есть, особенно если нет chap авторизации) и id хоста (initiatorname.iscsi).
 
- Сами устройства лежат в /var/lib/iscsi/nodes, появляются там после того, как мы опросили Target командой

    iscsiadm -m discovery --type sendtargets –p 192.168.1.1

31 мар. 2021 г.

Backup Asterisk configs and Databases to Yandex.Disk by cron task

wget http://repo.yandex.ru/yandex-disk/yandex-disk_latest_amd64.deb
dpkg -i yandex-disk_latest_amd64.deb
yandex-disk setup (set yandex account)
yandex-disk sync --exclude-dirs other,client,dirs,comma,separated
ls ~/Yandex.Disk
apt install p7zip-full

create script:
==============
#!/bin/bash
tar -c --recursion /etc/asterisk/* | 7z a -pPassWordForAESCrypt -si /root/Yandex.Disk/clientname/conf-`date +%Y-%m-%d-%H-%M`.7z
mysqldump -u MySqlUser -pMySqlPassword DataBaseName |7z a -pPassWordForAESCrypt -si /root/Yandex.Disk/clientname/db-`date +%Y-%m-%d-%H-%M`.sql.7z
tar -c --recursion /var/www/* | 7z a -pPassWordForAESCrypt -si /root/Yandex.Disk/clientname/www-`date +%Y-%m-%d-%H-%M`.7z
find /root/Yandex.Disk/clientname -name "*.7z" -mtime +30 -exec rm -f {} \;
yandex-disk sync --exclude-dirs other,client,dirs,comma,separated
==============

add script to cron (crontab -e)
for example - 3 times per week:

0 3 * * 1,3,5 /root/confbackup




11 дек. 2019 г.

Скопировать первую страницу со всех pdf to png

find ./*.pdf -exec pdftocairo -png -r 300 -f 1 -l 1 '{}' \; 

25 июл. 2019 г.

Asterisk - Loud alert (Громкое оповещение)

Проверено на телефонах Yealink.

exten => 330,1,Set(TIMEOUT(absolute)=60)
 same => n,SIPAddHeader(Call-info: answer-after=0)
 same => n,Page(SIP/101&SIP/102&SIP/107&SIP/126&SIP/133&SIP/134&SIP/143&
SIP/148&SIP/155&SIP/156&SIP/165&SIP/166&SIP/173&SIP/210&SIP/223)
 same => n,Hangup

В настройках телефона должен быть разрешен автоответ. По умолчанию разрешен, но мало ли.

24 июл. 2019 г.

Asterisk - Zabbix

Мониторим - количество подключенных аппаратов, задержка до городского транка, количество ожидающих в очереди, количество обслуживающих в очереди.

Ставим агент (debian - прямо из репозитария), разрешаем ему выполнять 'asterisk -x'
(sudoers, groups и.т.п.)

В параметрах агента  (/etc/zabbix/zabbix_agent.conf) добавляем

UserParameter=asterisk.trunkdelay,sudo /usr/sbin/asterisk  -x 'sip show peers'| awk '$0~/^trunkname/ {print substr($8,2,3)}'
UserParameter=asterisk.trunkstatus,sudo /usr/sbin/asterisk -x 'sip show peers'| awk '$0~/^trunkname/ {print $7}'|grep OK|wc -l
UserParameter=asterisk.activepeers,sudo /usr/sbin/asterisk -x 'sip show peers'| awk '$8~/OK/ {print $0}' |wc -l
UserParameter=asterisk.queuecalls,sudo /usr/sbin/asterisk -x 'queue show callcenter'| grep 'in call'  |wc -l
UserParameter=asterisk.queuequeue,sudo /usr/sbin/asterisk -x 'queue show callcenter'| grep 'callcenter has' |awk '{ print $3 }'



Шаблон:

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>

8 июл. 2019 г.

Set outbound CallerID Asterisk

Before Dial() command call the macro
You can use REGEX for extensions list or just compare one number.
[macro-SetOutCID]
exten => s,1,Verbose("External Caller ID setting for internal ${CALLERID(num)}...")
 same => n,ExecIf($[${REGEX("^(1011|1012|1013|1014)" ${CALLERID(num)})}]?Set(CALLERID(num)=4953229131))
 same => n,ExecIf($["${CALLERID(num)}" = "1040"]?Set(CALLERID(num)=4953229146))
 same => n,ExecIf($["${CALLERID(num)}" = "1041"]?Set(CALLERID(num)=4953229141))
 same => n,ExecIf($[${REGEX("^(1042|1043)" ${CALLERID(num)})}]?Set(CALLERID(num)=4953229156))
 same => n,ExecIf($["${CALLERID(num)}" = "1050"]?Set(CALLERID(num)=4953229151))
 same => n,ExecIf($["${CALLERID(num)}" = "2002"]?Set(CALLERID(num)=4953229120))
; and so on 
 same => n,ExecIf($["${CALLERID(num)}" = "5014"]?Set(CALLERID(num)=4953229198))
; last chance -  if no other options, set 4953229141 !!!
 same => n,ExecIf($[${LEN(${CALLERID(num)})} = 4]?Set(CALLERID(num)=4953229141))
 same => n,ExecIf($[${LEN(${CALLERID(num)})} = 0]?Set(CALLERID(num)=4953229141))
 same => n,Verbose("Outbound CallerID Set to ${CALLERID(num)}")



5 июл. 2019 г.

Asterisk - nightmode (ночной режим)

Если ночной режим включается и выключается автоматически, то используем функцию GotoIfTime:

exten => 3000,1,Answer
 same => n,GotoIfTime(8:00-19:00,mon-fri,*,*?open)
 same => n,Playback(announce/weekend)
 same => n,Hangup()
 same => n(open),Playback(announce/hello)
 same => n,Queue(callcenter,t,,,300)

Если ночной режим включаем вручную, то делаем так:

; toggle night mode variable 
=================================================
exten => 999,1,Answer()
 same => n,Verbose(1,"NIGHT=${GLOBAL(NIGHT)}")
 same => n,GotoIf(${GLOBAL(NIGHT)}?no)
 same => n,Set(GLOBAL(NIGHT)=1)
 same => n,Playback(announce/nighton)
 same => n,Hangup()
 same => n(no),Set(GLOBAL(NIGHT)=0)
 same => n,Playback(announce/nightoff)

 same => n,Hangup()

А потом проверяем значение переменной:

exten => _X.,1,Answer
 same => n,GotoIf(${GLOBAL(NIGHT)}?night)
 same => n,Background(announce/hello)
 same => n,Queue(callcenter,t,,,300)
 same => n,Hangup()
 same => n(night),Background(announce/weekend)
 same => n,Hangup()