среда, 20 апреля 2022 г.

x11vnc как демон

Создаем "Удаленный рабочий стол" как сервис в linux.


Создал файл следующего содержимого:

 cat > /etc/systemd/system/x11vnc.service <<\eof
[Unit]
Description=VNC Server for X11
Requires=display-manager.service
After=network-online.target ##optional for better performance
Wants=network-online.target ##optional for better performance
[Service]
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /etc/x11vnc.pwd -shared -forever -rfbport 5909 -o /var/log/x11vnc.log
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
eof
echo Zadajte parol dlja dostupa:
x11vnc -storepasswd /etc/x11vnc.pwd
echo Zapusk:
echo systemctl start x11vnc
systemctl daemon-reload

Опишу что делаем с помощью него:
- создаем файл /etc/systemd/system/x11vnc.service, который будет являться демоном системы;
- создаем пароль для доступа;
- обновляем в системе список демонов.

Основой сервера удаленных рабочих столов служит x11vnc.
Сам демон не включен в автоматический старт после загрузки системы, мне не нужен был постоянный доступ к рабочему столу. Для запуска используем:

systemctl start x11vnc

Можно включить демон на постоянно:

systemctl enable x11vnc

Пробуем подключиться. Для Windows использовал UltraVNC Viewer,  а в Debian - Remmina.

среда, 25 сентября 2019 г.

FreePBX (памятка 2)

Копируем библиотеку для 3G модема chan_dongle.so.

Создаем файл 92-ttyUSB.rules со следующим содержимым:

# ustanowka praw ttyUSB* dlja asterisk
KERNEL=="ttyUSB*", MODE="0660", OWNER="asterisk", GROUP="dialout"

Создаем файл dongle.conf со следующим содержимым:

[general]

interval=15   ; Number of seconds between trying to connect to devices

;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
;jbenable = yes   ; Enables the use of a jitterbuffer on the receiving side of a
    ; Dongle channel. Defaults to "no". An enabled jitterbuffer will
    ; be used only if the sending side can create and the receiving
    ; side can not accept jitter. The Dongle channel can't accept jitter,
    ; thus an enabled jitterbuffer on the receive Dongle side will always
    ; be used if the sending side can create jitter.

;jbforce = no   ; Forces the use of a jitterbuffer on the receive side of a Dongle
    ; channel. Defaults to "no".

;jbmaxsize = 200  ; Max length of the jitterbuffer in milliseconds.

;jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is
    ; resynchronized. Useful to improve the quality of the voice, with
    ; big jumps in/broken timestamps, usually sent from exotic devices
    ; and programs. Defaults to 1000.

;jbimpl = fixed   ; Jitterbuffer implementation, used on the receiving side of a Dongle
    ; channel. Two implementations are currently available - "fixed"
    ; (with size always equals to jbmaxsize) and "adaptive" (with
    ; variable size, actually the new jb of IAX2). Defaults to fixed.

;jbtargetextra = 40  ; This option only affects the jb when 'jbimpl = adaptive' is set.
    ; The option represents the number of milliseconds by which the new jitter buffer
    ; will pad its size. the default is 40, so without modification, the new
    ; jitter buffer will set its size to the jitter value plus 40 milliseconds.
    ; increasing this value may help if your network normally has low jitter,
    ; but occasionally has spikes.

;jblog = no   ; Enables jitterbuffer frame logging. Defaults to "no".
;-----------------------------------------------------------------------------------

[defaults]
; now you can set here any not required device settings as template
;   sure you can overwrite in any [device] section this default values

;context=default   ; context for incoming calls
;context=from-trunk1-cust
context=from-trunk
group=0    ; calling group
rxgain=0   ; increase the incoming volume; may be negative
txgain=0   ; increase the outgoint volume; may be negative
autodeletesms=yes  ; auto delete incoming sms
resetdongle=yes   ; reset dongle during initialization with ATZ command
u2diag=-1   ; set ^U2DIAG parameter on device (0 = disable everything except modem function) ; -1 not use ^U2DIAG command
usecallingpres=yes  ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation  by default use default network settings
disablesms=no   ; disable of SMS reading from device when received
    ;  chan_dongle has currently a bug with SMS reception. When a SMS gets in during a
    ;  call chan_dongle might crash. Enable this option to disable sms reception.
    ;  default = no

;language=en   ; set channel default language
language=ru
smsaspdu=yes   ; if 'yes' send SMS in PDU mode, feature implementation incomplete and we strongly recommend say 'yes'
mindtmfgap=45   ; minimal interval from end of previews DTMF from begining of next in ms
mindtmfduration=80  ; minimal DTMF tone duration in ms
mindtmfinterval=200  ; minimal interval between ends of DTMF of same digits in ms

callwaiting=auto  ; if 'yes' allow incoming calls waiting; by default use network settings
    ; if 'no' waiting calls just ignored
disable=no   ; OBSOLETED by initstate: if 'yes' no load this device and just ignore this section

initstate=start   ; specified initial state of device, must be one of 'stop' 'start' 'remote'
    ;   'remove' same as 'disable=yes'

exten=+123456789012  ; exten for start incoming calls, only in case of Subscriber Number not available!, also set to CALLERID(ndid)

dtmf=relax   ; control of incoming DTMF detection, possible values:
    ;   off    - off DTMF tones detection, voice data passed to asterisk unaltered
    ;              use this value for gateways or if not use DTMF for AVR or inside dialplan
    ;   inband - do DTMF tones detection
    ;   relax  - like inband but with relaxdtmf option
    ;  default is 'relax' by compatibility reason

; dongle required settings
[dongle0]
context=from-trunk-Mobile-v180e
audio=/dev/ttyUSB1  ; tty port for audio connection;  no default value
data=/dev/ttyUSB2  ; tty port for AT commands;   no default value

; or you can omit both audio and data together and use imei=123456789012345 and/or imsi=123456789012345
;  imei and imsi must contain exactly 15 digits !
;  imei/imsi discovery is available on Linux only
imei=123456789012345
imsi=123456789012345

; if audio and data set together with imei and/or imsi audio and data has precedence
;   you can use both imei and imsi together in this case exact match by imei and imsi required



редактируем файл extensions_custom.conf:

[from-trunk-Mobile]
exten => _X!,1,Noop(from-pstn-custom,${CALLERID(num)},${CHANNEL(linkedid)})
exten => _X!,n,System(echo ${CHANNEL(linkedid)}_${UNIQUEID}_${EXTEN} > /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Set(__IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Set(__IN_CALLERID=${IF($[${LEN(${IN_CALLERID})}=6]?375162${IN_CALLERID}:${IF($["${IN_CALLERID:0:2}"="80"]?375${IN_CALLERID:2}:${IF($["${IN_CALLERID:0:1}"="8"]?375${IN_CALLERID:1}:${IF($["${IN_CALLERID:0:4}"="+375"]?${IN_CALLERID:1}:${IN_CALLERID})})})})})
exten => _X!,n,Set(CALLERID(num)=${IN_CALLERID})
exten => _X!,n,Set(CALLERID(name)=${CALLERID(num)})
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${CHANNEL(linkedid)}.txt)
exten => _X!,n,Goto(from-trunk,${EXTEN},1)

FreePBX (памятка 1)


extensions_override_freepbx.conf - правки через подключение по ssh или напрямую на сервере FreePBX. Скопировав готовые правила, добавим запуск своих скриптов:
 
[macro-dial-one]
include => macro-dial-one-custom
exten => s,1,Set(DEXTEN=${ARG3})
exten => s,n,Set(__CRM_SOURCE=${CALLERID(num)})
exten => s,n(setexttocall),ExecIf($[${LEN(${EXTTOCALL})}=0 & ${LEN(${DEXTEN})}>0]?Set(__EXTTOCALL=${DEXTEN}))
exten => s,n,Set(DIALSTATUS_CW=)
exten => s,n,GosubIf($["${FROM_DID}"!="" & "${SCREEN}"="" & "${SIGNORE}"="" & "${DB(AMPUSER/${DEXTEN}/screen)}"!=""]?screen,1())
exten => s,n,GosubIf($["${DB(CF/${DEXTEN})}"!=""]?cf,1())
exten => s,n,GotoIf($["${DEXTEN:-1}"="#" | "${DB(DND/${DEXTEN})}"=""]?skip1)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n(skip1),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?continue)
exten => s,n,Set(EXTHASCW=${IF($["${CWIGNORE}"!=""]? :${DB(CW/${DEXTEN})})})
exten => s,n,GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!="" | "${DB(CFU/${DEXTEN})}"!=""]?next1:cwinusebusy)
exten => s,n(next1),GotoIf($["${DB(CFU/${DEXTEN})}"!="" & ("${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN")]?docfu:skip3)
exten => s,n(docfu),Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=NOANSWER)
exten => s,n,Goto(nodial)
exten => s,n(skip3),GotoIf($["${EXTHASCW}"="" | "${DB(CFB/${DEXTEN})}"!=""]?next2:continue)
exten => s,n(next2),GotoIf($["${EXTENSION_STATE(${DEXTEN})}"="NOT_INUSE" | "${EXTENSION_STATE(${DEXTEN})}"="UNAVAILABLE" | "${EXTENSION_STATE(${DEXTEN})}"="UNKNOWN"]?continue)
exten => s,n,ExecIf($["${DB(CFB/${DEXTEN})}"!="" & "${CFIGNORE}"=""]?Set(DIALSTATUS=BUSY))
exten => s,n,GotoIf($["${EXTHASCW}"!="" | "${DEXTEN:-1}"="#"]?cwinusebusy)
exten => s,n,Set(DEXTEN=)
exten => s,n,Set(DIALSTATUS=BUSY)
exten => s,n,Goto(nodial)
exten => s,n(cwinusebusy),GotoIf($["${EXTHASCW}"!="" & "${CWINUSEBUSY}"="true"]?next3:continue)
exten => s,n(next3),ExecIf($["${EXTENSION_STATE(${DEXTEN})}"!="UNAVAILABLE" & "${EXTENSION_STATE(${DEXTEN})}"!="NOT_INUSE" & "${EXTENSION_STATE(${DEXTEN})}"!="UNKNOWN"]?Set(DIALSTATUS_CW=BUSY))
exten => s,n(continue),GotoIf($["${DEXTEN}"=""]?nodial)
exten => s,n,GosubIf($["${DEXTEN:-1}"!="#"]?dstring,1():dlocal,1())
exten => s,n,GotoIf($[${LEN(${DSTRING})}=0]?nodial)
exten => s,n,GotoIf($["${DEXTEN:-1}"="#"]?skiptrace)
exten => s,n,GosubIf($[${REGEX("^[\+]?[0-9]+$" ${CALLERID(number)})} = 1]?ctset,1():ctclear,1())
exten => s,n(skiptrace),Set(D_OPTIONS=${IF($["${NODEST}"!="" & ${REGEX("(M[(]auto-blkvm[)])" ${ARG2})} != 1]?${ARG2}M(auto-blkvm):${ARG2}M(my-1^${ARG1}^${CDR(cnam)}^${ARG3}))})
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${HASH(SIPHEADERS,Alert-Info)}"=""]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,Noop(Blind Transfer: ${BLINDTRANSFER}, Attended Transfer: ${ATTENDEDTRANSFER}, User: ${AMPUSER}, Alert Info: ${ALERT_INFO})
exten => s,n,ExecIf($["${ALERT_INFO}"="" & ${LEN(${AMPUSER})}!=0 & ${LEN(${BLINDTRANSFER})}=0 & ${LEN(${ATTENDEDTRANSFER})}=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${BLINDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($[${LEN(${ATTENDEDTRANSFER})}!=0]?Set(ALERT_INFO=))
exten => s,n,ExecIf($["${RVOL}"!=""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${RVOL}))
exten => s,n,ExecIf($["${RVOL}"="" & "${DB(AMPUSER/${EXTTOCALL}/rvolume)}" != ""]?Set(ALERT_INFO=${IF($["${ALERT_INFO}"!=""]?${ALERT_INFO}:Normal)}\;volume=${DB(AMPUSER/${EXTTOCALL}/rvolume)}))
exten => s,n,GosubIf($["${ALERT_INFO}"!="" & "${ALERT_INFO}"!=" "]?func-set-sipheader,s,1(Alert-Info,${ALERT_INFO}))
exten => s,n,ExecIf($[("${MOHCLASS}"!="default") & ("${MOHCLASS}"!="")]?Set(CHANNEL(musicclass)=${MOHCLASS}))
exten => s,n,GosubIf($["${QUEUEWAIT}"!=""]?qwait,1())
exten => s,n,Set(__CWIGNORE=${CWIGNORE})
exten => s,n,Set(__KEEPCID=TRUE)
exten => s,n,GotoIf($["${USEGOTO}"="1"]?usegoto,1)
exten => s,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cidname)}" = "" || "${DB(AMPUSER/${AMPUSER}/cidname)}" = ""]?godial)
exten => s,n,Gosub(sub-presencestate-display,s,1(${EXTTOCALL}))
exten => s,n,Set(CONNECTEDLINE(name,i)=${DB(AMPUSER/${EXTTOCALL}/cidname)}${PRESENCESTATE_DISPLAY})
exten => s,n,Set(CONNECTEDLINE(num)=${EXTTOCALL})
exten => s,n,Set(D_OPTIONS=${D_OPTIONS}I)
exten => s,n(godial),Macro(dialout-one-predial-hook,)
exten => s,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(D_OPTIONS=${STRREPLACE(D_OPTIONS,T)}I))
exten => s,n(dialapp),Noop()
exten => s,n,ExecIf($["${ivrreturn}" = "1"]?Set(D_OPTIONS=${D_OPTIONS}g))
exten => s,n(dial),Dial(${DSTRING},${ARG1},${D_OPTIONS}b(func-apply-sipheaders^s^1))
exten => s,n,ExecIf($["${DIALSTATUS}"="ANSWER" & "${CALLER_DEST}"!=""]?MacroExit())
exten => s,n,ExecIf($["${DIALSTATUS_CW}"!=""]?Set(DIALSTATUS=${DIALSTATUS_CW}))
exten => s,n,GosubIf($[("${SCREEN}"!=""&("${DIALSTATUS}"="TORTURE"|"${DIALSTATUS}"="DONTCALL"))|"${DIALSTATUS}"="ANSWER"]?s-${DIALSTATUS},1())
exten => s,n,MacroExit()
exten => s,n(nodial),Noop()
exten => s,n,ExecIf($["${DIALSTATUS}" = ""]?Set(DIALSTATUS=NOANSWER))
exten => s,n,Noop(Returned from dial-one with nothing to call and DIALSTATUS: ${DIALSTATUS})
exten => s,n,MacroExit()
exten => s,n,GotoIf($["${ZULU_RAW_TYPE}"!="Sangomacrm-url"]?crm-save)
exten => s,n,AGI(sangomacrm.agi,true)
exten => s,n,Goto(zulu-event)
exten => s,n(crm-save),AGI(sangomacrm.agi)
 
exten => h,1,Macro(hangupcall,)
 
exten => usegoto,1,Set(USEGOTO=)
exten => usegoto,n,Goto(from-internal,${DSTRING},1)
 
exten => screen,1,GotoIf($["${DB(AMPUSER/${DEXTEN}/screen)}"!="nomemory" | "${CALLERID(number)}"=""]?memory)
exten => screen,n,ExecIf($[${REGEX("^[0-9a-zA-Z ]+$" ${CALLERID(number)})} = 1]?System(rm -f ${ASTVARLIBDIR}/sounds/priv-callerintros/${CALLERID(number)}.*))
exten => screen,n(memory),Set(__SCREEN=${DB(AMPUSER/${DEXTEN}/screen)})
exten => screen,n,Set(__SCREEN_EXTEN=${DEXTEN})
exten => screen,n,Set(ARG2=${ARG2}p)
exten => screen,n,Return()
 
exten => cf,1,Set(CFAMPUSER=${IF($["${AMPUSER}"=""]?${CALLERID(number)}:${AMPUSER})})
exten => cf,n,ExecIf($["${DB(CF/${DEXTEN})}"="${CFAMPUSER}" | "${DB(CF/${DEXTEN})}"="${REALCALLERIDNUM}" | "${CUT(CUT(BLINDTRANSFER,-,1),/,1)}" = "${DB(CF/${DEXTEN})}" | "${DEXTEN}"="${DB(CF/${DEXTEN})}"]?Return())
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != "0" & "${DB(AMPUSER/${DEXTEN}/cfringtimer)}" != ""]?Set(ARG1=${IF($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}"="-1"]? : ${DB(AMPUSER/${DEXTEN}/cfringtimer)})}))
exten => cf,n,ExecIf($["${DB(AMPUSER/${DEXTEN}/cfringtimer)}" == "0"]?Set(ARG1=${IF($["${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)}"="-1"]? : ${DB(FREEPBXCONF/CFRINGTIMERDEFAULT)})}))
exten => cf,n,Set(DEXTEN=${IF($["${CFIGNORE}"=""]?"${DB(CF/${DEXTEN})}#": )})
exten => cf,n,ExecIf($["${DEXTEN}"!=""]?Return())
exten => cf,n,Set(DIALSTATUS=NOANSWER)
exten => cf,n,Return()
 
exten => qwait,1,ExecIf($["${SAVEDCIDNAME}" = ""]?Set(__SAVEDCIDNAME=${CALLERID(name)}))
exten => qwait,n,Set(ELAPSED=${MATH($[${EPOCH}+30-${QUEUEWAIT}]/60,int)})
exten => qwait,n,Set(CALLERID(name)=M${ELAPSED}:${SAVEDCIDNAME})
exten => qwait,n,Return()
 
exten => ctset,1,Set(DB(CALLTRACE/${DEXTEN})=${CALLERID(number)})
exten => ctset,n,Return()
 
exten => ctclear,1,Noop(Deleting: CALLTRACE/${DEXTEN} ${DB_DELETE(CALLTRACE/${DEXTEN})})
exten => ctclear,n,Return()
 
exten => dstring,1,Set(DSTRING=)
exten => dstring,n,Set(DEVICES=${DB(AMPUSER/${DEXTEN}/device)})
exten => dstring,n,ExecIf($["${DEVICES}"=""]?Return())
exten => dstring,n,ExecIf($["${DEVICES:0:1}"="&"]?Set(DEVICES=${DEVICES:1}))
exten => dstring,n,Set(LOOPCNT=${FIELDQTY(DEVICES,&)})
exten => dstring,n,Set(ITER=1)
exten => dstring,n(begin),Set(THISDIAL=${DB(DEVICE/${CUT(DEVICES,&,${ITER})}/dial)})
exten => dstring,n,GosubIf($["${ASTCHANDAHDI}" = "1"]?zap2dahdi,1())
exten => dstring,n,GotoIf($["${THISDIAL:0:5}"!="PJSIP"]?docheck)
exten => dstring,n,Noop(Debug: Found PJSIP Destination ${THISDIAL})
exten => dstring,n,GotoIf($[ ${REGEX("(/.+/|@)" ${THISDIAL})} = 1 ]?doset)
exten => dstring,n,Noop(Debug: Updating PJSIP Destination with PJSIP_DIAL_CONTACTS)
exten => dstring,n,Set(THISDIAL=${PJSIP_DIAL_CONTACTS(${THISDIAL:6})})
exten => dstring,n,ExecIf($["${THISDIAL}"=""]?Set(DIALSTATUS=CHANUNAVAIL))
exten => dstring,n(docheck),GotoIf($["${THISDIAL}"=""]?skipset)
exten => dstring,n(doset),Set(DSTRING=${DSTRING}${THISDIAL}&)
exten => dstring,n(skipset),Set(ITER=$[${ITER}+1])
exten => dstring,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)
exten => dstring,n,ExecIf($["${DSTRING:-1}"!="&"]?Return())
exten => dstring,n,Set(DSTRING=${DSTRING:0:$[${LEN(${DSTRING})}-1]})
exten => dstring,n,Return()
 
exten => dlocal,1,Set(DSTRING=${IF($["${ARG1}"=""]?${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}:Local/${DEXTEN:0:${MATH(${LEN(${DEXTEN})}-1,int)}}@from-internal/n)})
exten => dlocal,n,Set(USEGOTO=${IF($["${ARG1}"=""]?1:0)})
exten => dlocal,n,Return()
 
exten => zap2dahdi,1,ExecIf($["${THISDIAL}" = ""]?Return())
exten => zap2dahdi,n,Set(NEWDIAL=)
exten => zap2dahdi,n,Set(LOOPCNT2=${FIELDQTY(THISDIAL,&)})
exten => zap2dahdi,n,Set(ITER2=1)
exten => zap2dahdi,n(begin2),Set(THISPART2=${CUT(THISDIAL,&,${ITER2})})
exten => zap2dahdi,n,ExecIf($["${THISPART2:0:3}" = "ZAP"]?Set(THISPART2=DAHDI${THISPART2:3}))
exten => zap2dahdi,n,Set(NEWDIAL=${NEWDIAL}${THISPART2}&)
exten => zap2dahdi,n,Set(ITER2=$[${ITER2} + 1])
exten => zap2dahdi,n,GotoIf($[${ITER2} <= ${LOOPCNT2}]?begin2)
exten => zap2dahdi,n,Set(THISDIAL=${NEWDIAL:0:$[${LEN(${NEWDIAL})}-1]})
exten => zap2dahdi,n,Return()
 
exten => s-ANSWER,1,Noop(Call successfully answered - Hanging up now)
exten => s-ANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-ANSWER,n(bye),Macro(hangupcall,)
 
exten => s-TORTURE,1,Goto(app-blackhole,musiconhold,1)
exten => s-TORTURE,n,Macro(hangupcall,)
 
exten => s-DONTCALL,1,Answer
exten => s-DONTCALL,n,Wait(1)
exten => s-DONTCALL,n,Zapateller()
exten => s-DONTCALL,n,Playback(ss-noservice)
exten => s-DONTCALL,n,Macro(hangupcall,)
 
exten => s-CHANUNAVAIL,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-CHANUNAVAIL,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-CHANUNAVAIL,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-CHANUNAVAIL,n,Return()
 
exten => s-NOANSWER,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-NOANSWER,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-NOANSWER,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-NOANSWER,n,Return()
 
exten => s-BUSY,1,Macro(vm,${SCREEN_EXTEN},BUSY,${IVR_RETVM})
exten => s-BUSY,n,GotoIf($["${ivrreturn}" = "1"]?${IVR_CONTEXT},return,1)
exten => s-BUSY,n(return),ExecIf($["${IVR_RETVM}"!="RETURN" | "${IVR_CONTEXT}"=""]?Hangup())
exten => s-BUSY,n,Return()
 
;--== end of [macro-dial-one] ==--;
 
 
[macro-auto-blkvm]
include => macro-auto-blkvm-custom
exten => s,1,ExecIf($["${FROMQ}" = "true" & "${CALLFILENAME}" != "" & "${CDR(recordingfile)}" = ""]?Set(CDR(recordingfile)=${CALLFILENAME}.${MON_FMT}))
exten => s,n,Set(__MACRO_RESULT=)
exten => s,n,Set(CFIGNORE=)
exten => s,n,Set(MASTER_CHANNEL(CFIGNORE)=)
exten => s,n,Set(FORWARD_CONTEXT=from-internal)
exten => s,n,Set(MASTER_CHANNEL(FORWARD_CONTEXT)=from-internal)
exten => s,n,Macro(blkvm-clr,)
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(num))=${DIALEDPEERNUMBER}))
exten => s,n,ExecIf($[!${REGEX("[^0-9]" ${DIALEDPEERNUMBER})} && "${DB(AMPUSER/${AMPUSER}/cidname)}" != ""]?Set(MASTER_CHANNEL(CONNECTEDLINE(name))=${DB(AMPUSER/${DIALEDPEERNUMBER}/cidname)}))
exten => s,n,Macro(my-2,${DIALEDPEERNUMBER},${CALLINGPRES},${SIPCALLID})
 
;--== end of [macro-auto-blkvm] ==--;
 




extensions_custom.conf - правки через web-интерфейс FreePBX:


[from-trunk-my-custom]
exten => _X!,1,System(echo ${UNIQUEID}_${EXTEN} > /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,System(echo ${CALLERID(num)} >> /tmp/tr_${UNIQUEID}_${CALLERID(num)}.txt)
exten => _X!,n,Set(_IN_CALLERID=${CALLERID(num)})
exten => _X!,n,Goto(from-trunk,${EXTEN},1)
 
[macro-my-1]
exten => s,1,Noop(macro-my-1,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_01?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-1)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_1.txt)
exten => s,n,MacroExit()
 
[macro-my-2]
exten => s,1,Noop(macro-my-2,${CALLERID(num)},${FROMEXTEN},${TIMESTR},${UNIQUEID})
exten => s,n,Set(StrURL=http://zzz.ttttt.yyy/cgi-bin/test_02?s_=0&n_=1&e_=0&add_=)
exten => s,n,Set(ParamURL=external,${CALLERID(num)},${FROMEXTEN},${STRREPLACE(TIMESTR,"-",",")},${UNIQUEID},macro_my-2)
exten => s,n,System(echo '${StrURL}${ParamURL}' > /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(SSS=${StrURL}${ParamURL})
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,Set(CURLOPT(httptimeout)=3)
exten => s,n,Set(SSS=$[CURL(${SSS})])
exten => s,n,System(echo '${SSS}' >> /tmp/${UNIQUEID}_${CALLERID(num)}_2.txt)
exten => s,n,MacroExit()

суббота, 15 июля 2017 г.

Debian 9 + Xfce + TouchPad


apt-get install xserver-xorg-input-synaptics

/usr/share/X11/xorg.conf.d/70-synaptics.conf

/etc/X11/xorg.conf.d/70-synaptics.conf
Section "InputClass"
    Identifier "touchpad catchall"
    Driver "synaptics"
    MatchIsTouchpad "on"
        Option "TapButton1" "1"
        Option "TapButton2" "3"
        Option "TapButton3" "2"
EndSection

пятница, 7 июля 2017 г.

Debian 9 (Stretch) + Realtek usb wi-fi (RTL8187B)

Столкнулся с проблемой на Debian 9 (Stretch) со встроенной в ноутбук беспроводной сетевой картой на чипсете Realtek RTL8187B.
Установка пакета firmware-realtek (дополнительные не свободные прошивки к сетевым картам Realtek) не помогла. Сеть видна, а соединения ни с одной доступной сетью не происходило.

Решение оказалось довольно простым.
Дописать в конфигурационный файл /etc/NetworkManager/NetworkManager.conf строки:

[device]
wifi.scan-rand-mac-address=no

В итоге содержимое файла такое:
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=false
[device]
wifi.scan-rand-mac-address=no
После перезагрузки системы, связь с сетью устанавливается.

среда, 1 февраля 2017 г.

SIS 771/671 + Debian 8, установка правильного разрешения экрана.

Устанавливал на ноутбук с видеокартой SIS 771/671 ОС Debian8 Jessie (актуально и для Debian 9 Stretch) и столкнулся с проблемой - разрешение экрана не возможно выставить в оригинальном формате, максимум 1024*768.
Решение проблемы было найдено на просторах интернета и оказалось довольно простым.

Запускаем терминал. Повышаем свои права до root-а с помощью su  (или воспользовавшись sudo) запускаем ниже приведенную команду:

nano /etc/X11/xorg.conf

Этим мы создаем конфигурационный файл для X-ов. Заполняем его следующими строчками:

Section "Device"
  Identifier "Generic Video Card"
    VendorName  "Silicon Integrated Systems [SiS]"
        BoardName   "771/671 PCIE VGA Display Adapter"
    Busid "PCI:1:0:0"
    Driver "vesa"
    Screen 0
        Option "UseFBDev" "true"
        Option "DPMS"
        Option "ShadowFB"
        Option "MaxXFBMem"
        VideoRam 262016
        Option "RenderAccel" "true"
        Option "AllowGLXWithComposite" "true"
        Option "backingstore" "true"
        Option "AddARGBGLXVisuals" "True"
EndSection
Section "Monitor"
    Identifier    "Configured Monitor"
    Vendorname    "Generic LCD Display"
    Modelname    "LCD Panel 1280x800"
    HorizSync 20-107
        VertRefresh 50-185
  modeline  "800x600@56" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync
  modeline  "800x600@60" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync
  modeline  "1280x768@60" 80.14 1280 1344 1480 1680 768 769 772 795 -hsync +vsync
  modeline  "1280x720@60" 74.48 1280 1336 1472 1664 720 721 724 746 -hsync +vsync
  modeline  "1280x800@60" 83.46 1280 1344 1480 1680 800 801 804 828 -hsync +vsync
    Gamma    1.0
EndSection
Section "Screen"
    Identifier    "Default Screen"
    Monitor        "Configured Monitor"
    Device        "Configured Video Device"
    Defaultdepth    24
    SubSection "Display"
        Depth    24
        Virtual    1280    768
        Modes        "1280x768@60"    "1280x720@60"    "800x600@60"    "1280x800@60"    "800x600@56"
    EndSubSection
EndSection
Section "Module"
    Load "dri"
    Load "dbe" # Double-Buffering Extension
    Load "v4l" # Video for Linux
    Load "extmod"
    Load "type1"
    Load "freetype"
    Load "glx" # 3D layer
    Load "GLcore"
    Load "i2c"
    Load "bitmap"
    Load "ddc"
    Load "int10"
    Load "vbe"
    Load "speedo"
    Load "record"
EndSection
Section "DRI"
        Mode 0666
EndSection

Сохраняем и перезагружаем систему.
Пользуемся.


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

Установка Debian 6 на старый ноутбук. Третий этап.

Третий этап. Берем напильник....

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

Yamaha YMF-744 и Debian Squeeze.

По адресу http://wiki.debian.org/snd-ymfpci написано решение проблемы, правда на английском языке. Поэтому я решил написать мини-инструкцию на русском. В некотором смысле грубый перевод, со своими дополнениями и разъяснениями.
Нам необходимо установить звуковую систему "alsa", вместе с ее утилитами и пакет с набором программ для возможности дальнейших действий - создания необходимых файлов:
sudo aptitude install alsa-base alsa-utils build-essential
С помощью следующей команды скачаем необходимый файл, точнее архив с исходными кодами, из интернета:
wget ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.0.25.tar.bz2
Тут у меня появилась проблема - данный адрес, точнее сервер, на момент написания, не был доступен, пришлось искать зеркало. Вот по этому адресу http://mirrors.zerg.biz/alsa/firmware/alsa-firmware-1.0.25.tar.bz2 у меня получилось скачать необходимый файл. В этом случае измените в выше написанной команде адрес.

Небольшое отступление от основной темы. В нашей системе уже есть не только программа для закачки - "wget", но даже интернет браузер - "w3m", программа для работы с архивами - "tar" и много других, которые работают в консоли. Попробуйте ввести вот эту команду:
w3m debian.org
или
w3m alsa-project.org
У вас начнется загружаться страничка по введенному адресу. Как видите, консолью можно пользоваться и не только для ввода одних сплошных команд, а даже просмотреть в интернете нужную информацию. Для выхода  из браузера нажмите клавишу "q" и соответственно подтвердите действие нажав - "y".

Сейчас необходимо извлечь из скачанного архива файлы, для чего вводим:
tar xvf alsa-firmware-1.0.25.tar.bz2
Осталось "исходники" превратить в рабочие данные - модули:
cd alsa-firmware-1.0.25
./configure
cd ymfpci && make
Устанавливаем модули, просто скопировав их в систему:
sudo mkdir -p /usr/local/lib/firmware/yamaha
sudo cp *fw /usr/local/lib/firmware/yamaha
Загружаем их в систему:
sudo modprobe -r snd-ymfpci
sudo modprobe snd-ymfpci
Добавляем свою учетную запись в группу "audio", вместо "user" введите имя своей учетной записи:
sudo adduser user audio
Теперь нам нужно отрегулировать уровни звука, для этого вводим:
alsamixer
Появится псевдографический интерфейс со столбиками. Нас интересуют каналы "Master", "Master M", "Headphone", "PCM". Передвигаемся по ним стрелками влево-вправо, для изменения уровня — стрелки вверх-вниз, еще есть внизу столбика "MM" — означает "mute", т.е. звук выключен, чтобы включить звук — нажмите клавишу "m". Сначала можете отключить "mute" и отрегулировать уровень, например до значения "81", на всех вышеперечисленных каналах. После регулировки, для выхода, жмем клавишу "Esc".
Осталось проверить работоспособность колонок:
aplay /usr/share/sounds/alsa/Noise.wav
speaker-test -tsine -f440 -c2
speaker-test -twav -c2
Для прерывания теста нажмите "Ctrl"+"c".

"Иксы", продолжаем добавлять функционал.

Со звуком разобрались, продолжим добавлять новые "окошки", точнее программы работающие в среде "FluxBox". Чтобы не прыгать из "иксов" в консоль, запустим последнюю, в виде дополнительного приложения, с помощью быстрых клавиш - нажмите сочетание клавиш "Alt"+"F1".
Раз есть простая возможность использовать консоль в "FluxBox", будем загружать "иксы" минуя вход через консоль, с последующим ручным запуском через "startx". Для этого нам нужно установить вспомогательную программу - графический дисплейный менеджер (Display Manager) - вот неоторые из них: GDM (GNOME Display Manger), KDM (KDE Display Manger), XDM (X Display Manger), SLiM (Simple Login Manager). Установим "slim":
sudo apt-get install slim
Чтобы увидеть новый способ входа в систему перезагружаем компьютер.
Если в консоли мы использовали "mc" для обзора дисковой системы (директорий и файлов), то для более привычной работы в "FluxBox" нам нужно будет установить файл-менеджер для "иксов". Конечно, если вам еще интересен "mc" - никто не запрещает им пользоваться. Устанавливаем "PCManFM":
sudo apt-get install pcmanfm
После установки можно запустить его через меню "Приложения"->"Управление файлами"->"PCManFM". Тут нас ожидает мелкая неприятность - отсутствуют иконки файлов и директорий.
И опять в консоль:
nano ~/.gtkrc-2.0
Дописываем строчку:
gtk-icon-theme-name = "nuoveXT2"
Выходим из редактора с сохранением изменений. Запускаем еще раз "PCManFM". Вам, наверно, этот способ запуска программы со временем будет утомителен, поэтому чтобы каждый раз не искать в меню "PCManFM", назначим его вызов через комбинацию клавиш "Win"+"F", где "Win" клавиша с изображением флага "Windows". Откроем файл настроек клавиш в редакторе:
nano ~/.fluxbox/keys
И допишем в конце строчку:
Mod4 F : Exec pcmanfm
Закрываем с сохранением и выбираем в меню "FluxBox" "Reconfigure", а затем - "Restart", чтобы применить изменения. Попробуйте нажать "Win"+"F" - у вас должен запуститься "PCManFM".
К файлам простейший способ доступа у нас появился. Теперь будем добавлять программы для работы с файлами, кстати, во втором этапе мы уже установили "AbiWord" - с помощью которой можно создавать и редактировать текстовые документы. Попробуйте открыть текстовый файл с расширением ".txt" или ".doc" в файловом менеджере. Появится окно с предложением выбрать приложение. Во вкладке "Установленное приложение" выбираем "Офис"->"AbiWord", также можно поставить соответствующую "птичку" для назначения программы по умолчанию для данного типа файла.
Займемся следующими файлами - картинками и фотографиями, т.е. графическими. Сначала установим программу просмотра "GPicView":
sudo apt-get install gpicview
Попробуйте назначить эту программу для файла с картинкой, вышеописанным способом, выбрав во вкладке "Установленное приложение" - "Стандартные"->"Image Viewer". Можно аналогично назначить и остальные графические типы файлов, но у "GPicView" есть свой механизм - нажимаем предпоследний значок ("Настройки") в программе и нажимаем на кнопку "Сделать GPicView просмотрщиком изображений по-умолчанию". Попробуйте теперь открыть графический файл с другим расширением.
Теперь решим вопрос чем открывать файлы архивов:
sudo apt-get install xarchiver
Файлы с текстовой и графической информацией, а также архивы, вы уже можете просматривать. Сейчас поставим программы для работы с интернетом: веб-браузер и почтовый клиент - "Iceape", для работы с ftp-серверами - "FileZilla", для отправки текстовых сообщений - "Pidgin". Запустим установку этих трех программ одной командой:
sudo apt-get install iceape filezilla pidgin


Допишем параметры раскладки клавиатуры в файл ".xsessionrc", для пользователя:
nano ~/.xsessionrc
Следующую строку:
setxkbmap -layout "us,ru" -option "grp:ctrl_shift_toogle, grp_led:scroll"
Этой строчкой устанавливаем два языка (английский и русский), комбинацию клавиш для переключения раскладки — "Ctrl"+"Shift" и индикацию раскладки светодиодом "SсrollLock" на клавиатуре. 
Устанавливаем индикатор переключателя раскладок клавиатуры:
sudo apt-get install fbxkb

Для устранения проблем отображения картинки флага с английской раскладкой делаем следующее (по умолчанию вместо флага картинка с вопросами):
sudo cp /usr/share/fbxkb/images/zz.png /usr/share/fbxkb/images/zz_old.png
sudo cp /usr/share/fbxkb/images/us.png /usr/share/fbxkb/images/zz.png
Еще один штрих, добавляем в автозагрузку. Открываем файл в редакторе:
nano ~/.fluxbox/startup

Перед строчкой содержащей "exec fluxbox", добавляем следующую:
fbxkb &

Выходим из редактора с сохранением.
После перезагрузки "иксов" изменения вступят в силу. Кстати, чтобы завершить работу с "Fluxbox", не обязательно выбирать в меню "Exit", можно нажать следующее сочетание клавиш - "Ctrl"+"Alt"+"Del", что аналогично, т.к. назначено по умолчанию на завершение работы.
Теперь вам будет видно какая раскладка включена, а если используется отдельная клавиатура, то еще будет индикация светодиодом "ScrollLock" на ней.
Так, программ наставили, индикацию раскладок установили, можно пользоваться... Неудобно и долго заходить в меню и запускать программу? Вспомним про файл "keys":
nano ~/.fluxbox/keys
Добавим быстрые клавиши:
Mod4 W : Exec x-www-browser
Mod4 I : Exec pidgin
Mod4 Escape : Exec conky