Asterisk звонит на sip, город и мобильные - но не принимает звонки
ОС: Linux - Ububntu server 10.04 x64
Настроил астериск, попробовал позвонить на другой SIP (sipnet) и появилась проблема, пока я не сделаю перевод на себя же то друг- друга не услышим.
потом пробовал на г8ород позвонить - все нормально звонит и всё слышно - на мобильные то же самое всё нормально.
Пробовал позвонить с города на астериск - говорят что номер не правильный, пробовал с с другого sipnet там пишет что вызов завершон.
Кто знает в чём проблема?
| adt2k wrote: |
| в настройках |
мм а по точнее?? Я настраивал через интерфейс...
вот конфиги:
sip.conf
| Code: |
| ;! ;! Automatically generated configuration file ;! Filename: sip.conf (/etc/asterisk/sip.conf) ;! Generator: Manager ;! Creation Date: Mon Nov 22 23:43:29 2010 ;! [general] context = default allowoverlap = no ;allowtransfer=no ; Disable all transfers (unless enabled in peers or users) tcpenable = no ; Enable server for incoming TCP connections (default is no) tcpbindaddr = 0.0.0.0 ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces) srvlookup = yes subscribecontext = device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints,device-hints subscribecontext = device-hints subscribecontext = device-hints subscribecontext = device-hints subscribecontext = device-hints subscribecontext = device-hints subscribecontext = device-hints allowexternaldomains = yes allowguest = yes allowsubscribe = yes allowtransfer = yes alwaysauthreject = no autodomain = no callevents = no checkmwi = 10 compactheaders = no defaultexpiry = 120 dumphistory = no externrefresh = 10 g726nonstandard = no jbenable = no jbforce = no jblog = no maxcallbitrate = 384 maxexpiry = 3600 minexpiry = 60 mohinterpret = 1234 notifyringing = yes pedantic = no progressinband = never promiscredir = no realm = asterisk recordhistory = no registerattempts = 0 registertimeout = 20 relaxdtmf = no sendrpid = no sipdebug = no t1min = 100 t38pt_udptl = no tos_audio = none tos_sip = none tos_video = none trustrpid = no useragent = TEXSID usereqphone = yes videosupport = no disallow = all allow = dtmfmode = rfc2833 context = from-office type = friend [natted-phone](!,basic-options); another template inheriting basic-options nat = yes directmedia = no host = dynamic [public-phone](!,basic-options); another template inheriting basic-options nat = no directmedia = yes [my-codecs](!); a template for my preferred codecs disallow = all allow = ilbc allow = g729 allow = gsm allow = g723 allow = ulaw [ulaw-phone](!); and another one for ulaw-only disallow = all allow = ulaw ; Yet a third option... use UPDATE for media path redirection, [basic-options](!); a template dtmfmode = rfc2833 context = from-office type = friend [natted-phone](!,basic-options); another template inheriting basic-options nat = yes directmedia = no host = dynamic [public-phone](!,basic-options); another template inheriting basic-options nat = no directmedia = yes [my-codecs](!); a template for my preferred codecs disallow = all allow = ilbc allow = g729 allow = gsm allow = g723 allow = ulaw [ulaw-phone](!); and another one for ulaw-only disallow = all allow = ulaw |
users.conf
| Code: |
| ;! ;! Automatically generated configuration file ;! Filename: users.conf (/etc/asterisk/users.conf) ;! Generator: Manager ;! Creation Date: Mon Nov 22 23:47:41 2010 ;! [general] ; ; Full name of a user ; fullname = New User ; ; Starting point of allocation of extensions ; userbase = 6000 ; ; Create voicemail mailbox and use use macro-stdexten ; hasvoicemail = yes ; ; Set voicemail mailbox 6000 password to 1234 ; vmsecret = 1234 ; ; Create SIP Peer ; hassip = yes ; ; Create IAX friend ; hasiax = yes ; ; Create H.323 friend ; ;hash323 = yes ; ; Create manager entry ; hasmanager = no ; ; Set permissions for manager entry (see manager.conf.sample for documentation) ; (defaults to *all* permissions) ;managerread = system,call,log,verbose,command,agent,user,config ;managerwrite = system,call,log,verbose,command,agent,user,config ; ; Remaining options are not specific to users.conf entries but are general. ; callwaiting = yes threewaycalling = yes callwaitingcallerid = yes transfer = yes canpark = yes cancallforward = yes callreturn = yes callgroup = 1 pickupgroup = 1 [sipnet] host = sipnet.ru username = NUMBER secret = rhexbyby trunkname = sipnet ; GUI metadata context = DID_sipnet group = null hasexten = no hasiax = no hassip = yes registeriax = no registersip = yes trunkstyle = voip fromdomain = sipnet.ru insecure = no disallow = all allow = ulaw,alaw,gsm,g726 [6000] username = 6000 transfer = yes mailbox = 6000 call-limit = 100 type = peer fullname = Vasya Pupkin registersip = no host = dynamic callgroup = 1 type = peer context = DLPN_DialPlan1 cid_number = 6000 hasvoicemail = no vmsecret = email = threewaycalling = no hasdirectory = yes callwaiting = no hasmanager = yes hasagent = yes hassip = yes hasiax = no secret = PASSWORD nat = yes canreinvite = no dtmfmode = rfc2833 insecure = no pickupgroup = 1 autoprov = no label = macaddress = linenumber = 1 LINEKEYS = 1 managerread = system,call,log,verbose,command,agent,user,config,originate managerwrite = system,call,log,verbose,command,agent,user,config,originate disallow = all allow = ulaw,gsm |
Extensions.conf
| Code: |
| ;! ;! Automatically generated configuration file ;! Filename: extensions.conf (/etc/asterisk/extensions.conf) ;! Generator: Manager ;! Creation Date: Mon Nov 22 23:57:08 2010 ;! [general] static = yes writeprotect = no clearglobalvars = no [globals] CONSOLE = Console/dsp ; Console interface for demo ;CONSOLE=DAHDI/1 ;CONSOLE=Phone/phone0 IAXINFO = guest ; IAXtel username/password ;IAXINFO=myuser:mypass TRUNK = DAHDI/G2 ; Trunk interface TRUNKMSD = 1 ; MSD digits to strip (usually 1 or 0) FEATURES = DIALOPTIONS = RINGTIME = 20 FOLLOWMEOPTIONS = PAGING_HEADER = Intercom sipnet = SIP/sipnet GLOBAL_OUTBOUNDCID = 0031733237 GLOBAL_OUTBOUNDCIDNAME = 0031733237 CID_sipnet = 0031733237 ;TRUNK=IAX2/user:pass@provider [dundi-e164-canonical] [dundi-e164-customers] [dundi-e164-via-pstn] [dundi-e164-local] include => dundi-e164-canonical include => dundi-e164-customers include => dundi-e164-via-pstn [dundi-e164-switch] switch => DUNDi/e164 [dundi-e164-lookup] include => dundi-e164-local include => dundi-e164-switch [macro-dundi-e164] exten => s,1,Goto(${ARG1},1) include => dundi-e164-lookup [iaxtel700] exten => _91700XXXXXXX,1,Dial(IAX2/${GLOBAL(IAXINFO)}@iaxtel.com/${EXTEN:1}@iaxtel) [iaxprovider] ;switch => IAX2/user:[key]@myserver/mycontext [trunkint] exten => _9011.,1,Macro(dundi-e164,${EXTEN:4}) exten => _9011.,n,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) [trunkld] exten => _91NXXNXXXXXX,1,Macro(dundi-e164,${EXTEN:1}) exten => _91NXXNXXXXXX,n,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) [trunklocal] exten => _9NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) [trunktollfree] exten => _91800NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) exten => _91888NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) exten => _91877NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) exten => _91866NXXXXXX,1,Dial(${GLOBAL(TRUNK)}/${EXTEN:${GLOBAL(TRUNKMSD)}}) [international] ignorepat => 9 include => longdistance include => trunkint [longdistance] ignorepat => 9 include => local include => trunkld [local] ignorepat => 9 include => default include => trunklocal include => iaxtel700 include => trunktollfree include => iaxprovider ;Include parkedcalls (or the context you define in features conf) ;to enable call parking. include => parkedcalls [macro-trunkdial] exten => s,1,Dial(${ARG1}) exten => s,n,Goto(s-${DIALSTATUS},1) exten => s-NOANSWER,1,Hangup exten => s-BUSY,1,Hangup exten => _s-.,1,NoOp [stdexten] exten => _X.,50000(stdexten),NoOp(Start stdexten) exten => _X.,n,Set(LOCAL(ext)=${EXTEN}) exten => _X.,n,Set(LOCAL(dev)=${ARG1}) exten => _X.,n,Set(LOCAL(cntx)=${ARG2}) exten => _X.,n,Set(LOCAL(mbx)="${ext}"$["${cntx}" ? "@${cntx}" :: ""]) exten => _X.,n,Dial(${dev},20) ; Ring the interface, 20 seconds maximum exten => _X.,n,Goto(stdexten-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) exten => stdexten-NOANSWER,1,Voicemail(${mbx},u) ; If unavailable, send to voicemail w/ unavail announce exten => stdexten-NOANSWER,n,NoOp(Finish stdexten NOANSWER) exten => stdexten-NOANSWER,n,Return() ; If they press #, return to start exten => stdexten-BUSY,1,Voicemail(${mbx},b) ; If busy, send to voicemail w/ busy announce exten => stdexten-BUSY,n,NoOp(Finish stdexten BUSY) exten => stdexten-BUSY,n,Return() ; If they press #, return to start exten => _stdexten-.,1,Goto(stdexten-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${mbx}) ; If they press *, send the user into VoicemailMain exten => a,n,Return() [stdPrivacyexten] exten => _X.,60000(stdPrivacyexten),NoOp(Start stdPrivacyexten) exten => _X.,n,Set(LOCAL(ext)=${ARG1}) exten => _X.,n,Set(LOCAL(dev)=${ARG2}) exten => _X.,n,Set(LOCAL(dontcntx)=${ARG3}) exten => _X.,n,Set(LOCAL(tortcntx)=${ARG4}) exten => _X.,n,Set(LOCAL(cntx)=${ARG5}) exten => _X.,n,Set(LOCAL(mbx)="${ext}"$["${cntx}" ? "@${cntx}" :: ""]) exten => _X.,n,Dial(${dev},20,p) ; Ring the interface, 20 seconds maximum, call screening ; option (or use P for databased call _X.creening) exten => _X.,n,Goto(stdexten-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER) exten => stdexten-NOANSWER,1,Voicemail(${mbx},u) ; If unavailable, send to voicemail w/ unavail announce exten => stdexten-NOANSWER,n,NoOp(Finish stdPrivacyexten NOANSWER) exten => stdexten-NOANSWER,n,Return() ; If they press #, return to start exten => stdexten-BUSY,1,Voicemail(${mbx},b) ; If busy, send to voicemail w/ busy announce exten => stdexten-BUSY,n,NoOp(Finish stdPrivacyexten BUSY) exten => stdexten-BUSY,n,Return() ; If they press #, return to start exten => stdexten-DONTCALL,1,Goto(${dontcntx},s,1) ; Callee chose to send this call to a polite "Don't call again" script. exten => stdexten-TORTURE,1,Goto(${tortcntx},s,1) ; Callee chose to send this call to a telemarketer torture script. exten => _stdexten-.,1,Goto(stdexten-NOANSWER,1) ; Treat anything else as no answer exten => a,1,VoicemailMain(${mbx}) ; If they press *, send the user into VoicemailMain exten => a,n,Return [macro-page]; exten => s,1,ChanIsAvail(${ARG1},s) ; s is for ANY call exten => s,n,GoToIf([${AVAILORIGCHAN} = ""]?fail:autoanswer) exten => s,n(autoanswer),Set(_ALERT_INFO="RA") ; This is for the PolyComs exten => s,n,SIPAddHeader(Call-Info: Answer-After=0) ; This is for the Grandstream, Snoms, and Others exten => s,n,NoOp() ; Add others here and Post on the Wiki!!!! exten => s,n,Dial(${ARG1}) exten => s,n(fail),Hangup [demo] include => stdexten ; ; We start with what to do when a call first comes in. ; exten => s,1,Wait(1) ; Wait a second, just for fun exten => s,n,Answer ; Answer the line exten => s,n,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds exten => s,n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 seconds exten => s,n(restart),BackGround(demo-congrats) ; Play a congratulatory message exten => s,n(instruct),BackGround(demo-instruct) ; Play some instructions exten => s,n,WaitExten ; Wait for an extension to be dialed. exten => 2,1,BackGround(demo-moreinfo) ; Give some more information. exten => 2,n,Goto(s,instruct) exten => 3,1,Set(LANGUAGE()=fr) ; Set language to french exten => 3,n,Goto(s,restart) ; Start with the congratulations exten => 1000,1,Goto(default,s,1) ; ; We also create an example user, 1234, who is on the console and has ; voicemail, etc. ; exten => 1234,1,Playback(transfer,skip) ; "Please hold while..." ; (but skip if channel is not up) exten => 1234,n,Gosub(${EXTEN},stdexten(${GLOBAL(CONSOLE)})) exten => 1234,n,Goto(default,s,1) ; exited Voicemail exten => 1235,1,Voicemail(1234,u) ; Right to voicemail exten => 1236,1,Dial(Console/dsp) ; Ring forever exten => 1236,n,Voicemail(1234,b) ; Unless busy ; ; # for when they're done with the demo ; exten => #,1,Playback(demo-thanks) ; "Thanks for trying the demo" exten => #,n,Hangup ; Hang them up. ; ; A timeout and "invalid extension rule" ; exten => t,1,Goto(#,1) ; If they take too long, give up exten => i,1,Playback(invalid) ; "That's not valid, try again" ; ; Create an extension, 500, for dialing the ; Asterisk demo. ; exten => 500,1,Playback(demo-abouttotry) ; Let them know what's going on exten => 500,n,Dial(IAX2/guest@pbx.digium.com/s@default) ; Call the Asterisk demo exten => 500,n,Playback(demo-nogo) ; Couldn't connect to the demo site exten => 500,n,Goto(s,6) ; Return to the start over message. ; ; Create an extension, 600, for evaluating echo latency. ; exten => 600,1,Playback(demo-echotest) ; Let them know what's going on exten => 600,n,Echo ; Do the echo test exten => 600,n,Playback(demo-echodone) ; Let them know it's over exten => 600,n,Goto(s,6) ; Start over ; ; You can use the Macro Page to intercom a individual user exten => 76245,1,Macro(page,SIP/Grandstream1) ; or if your peernames are the same as extensions exten => _7XXX,1,Macro(page,SIP/${EXTEN}) ; ; ; System Wide Page at extension 7999 ; exten => 7999,1,Set(TIMEOUT(absolute)=60) exten => 7999,2,Page(Local/Grandstream1@page&Local/Xlite1@page&Local/1234@page/n,d) ; Give voicemail at extension 8500 ; exten => 8500,1,VoicemailMain exten => 8500,n,Goto(s,6) ; ; Here's what a phone entry would look like (IXJ for example) ; ;exten => 1265,1,Dial(Phone/phone0,15) ;exten => 1265,n,Goto(s,5) ; ; The page context calls up the page macro that sets variables needed for auto-answer ; It is in is own context to make calling it from the Page() application as simple as ; Local/{peername}@page ; [page] exten => _X.,1,Macro(page,SIP/${EXTEN}) [default] exten = o,1,Goto(default,6000,1) [macro-stdexten] exten = s,1,Set(__DYNAMIC_FEATURES=${FEATURES}) exten = s,2,Set(ORIG_ARG1=${ARG1}) exten = s,3,GotoIf($["${FOLLOWME_${ARG1}}" = "1"]?6:4) exten = s,4,Dial(${ARG2},${RINGTIME},${DIALOPTIONS}) exten = s,5,Goto(s-${DIALSTATUS},1) exten = s,6,Macro(stdexten-followme,${ARG1},${ARG2}) exten = s-NOANSWER,1,Voicemail(${ORIG_ARG1},u) exten = s-NOANSWER,2,Goto(default,s,1) exten = s-BUSY,1,Voicemail(${ORIG_ARG1},b) exten = s-BUSY,2,Goto(default,s,1) exten = _s-.,1,Goto(s-NOANSWER,1) exten = a,1,VoicemailMain(${ORIG_ARG1}) [macro-stdexten-followme] exten = s,1,Answer exten = s,2,Set(ORIG_ARG1=${ARG1}) exten = s,3,Dial(${ARG2},${RINGTIME},${DIALOPTIONS}) exten = s,4,Set(__FMCIDNUM=${CALLERID(num)}) exten = s,5,Set(__FMCIDNAME=${CALLERID(name)}) exten = s,6,Followme(${ORIG_ARG1},${FOLLOWMEOPTIONS}) exten = s,7,Voicemail(${ORIG_ARG1},u) exten = s-NOANSWER,1,Voicemail(${ORIG_ARG1},u) exten = s-BUSY,1,Voicemail(${ORIG_ARG1},b) exten = s-BUSY,2,Goto(default,s,1) exten = _s-.,1,Goto(s-NOANSWER,1) exten = a,1,VoicemailMain(${ORIG_ARG1}) [macro-pagingintercom] exten = s,1,SIPAddHeader(Alert-Info: ${PAGING_HEADER}) exten = s,2,Page(${ARG1},${ARG2}) exten = s,3,Hangup [conferences] [ringgroups] [queues] [voicemenus] exten = 7000,1,Goto(voicemenu-custom-1,s,1) [voicemailgroups] [directory] [page_an_extension] [pagegroups] [macro-undefined] exten = s,1,Set(CALLERID(all)=${IF($[${LEN(${ARG4})} > 2]?${ARG4}:)}) exten = s,n,Goto(${ARG1},${ARG2},${ARG3}) [macro-trunkdial-failover-0.3] exten = s,1,GotoIf($[${LEN(${FMCIDNUM})} > 6]?1-fmsetcid,1) exten = s,n,GotoIf($[${LEN(${GLOBAL_OUTBOUNDCIDNAME})} > 1]?1-setgbobname,1) exten = s,n,Set(CALLERID(num)=${IF($[${LEN(${CID_${CALLERID(num)}})} > 2]?${CID_${CALLERID(num)}}:)}) exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${ARG5})} > 2]?${ARG5}:)}) exten = s,n,GotoIf($[${LEN(${CALLERID(num)})} > 6]?1-dial,1) exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${CID_${ARG3}})} > 6]?${CID_${ARG3}}:${GLOBAL_OUTBOUNDCID})}) exten = s,n,Set(CALLERID(all)=${IF($[${LEN(${ARG5})} > 2]?${ARG5}:)}) exten = s,n,Goto(1-dial,1) exten = 1-setgbobname,1,Set(CALLERID(name)=${GLOBAL_OUTBOUNDCIDNAME}) exten = 1-setgbobname,n,Goto(s,3) exten = 1-fmsetcid,1,Set(CALLERID(num)=${FMCIDNUM}) exten = 1-fmsetcid,n,Set(CALLERID(name)=${FMCIDNAME}) exten = 1-fmsetcid,n,Goto(s,4) exten = 1-dial,1,Dial(${ARG1}) exten = 1-dial,n,Gotoif(${LEN(${ARG2})} > 0 ?1-${DIALSTATUS},1:1-out,1) exten = 1-CHANUNAVAIL,1,Dial(${ARG2}) exten = 1-CHANUNAVAIL,n,Hangup() exten = 1-CONGESTION,1,Dial(${ARG2}) exten = 1-CONGESTION,n,Hangup() exten = 1-out,1,Hangup() [queue-member-manager] exten = handle_member,1,Verbose(2, Looping through queues to log in or out queue members) exten = handle_member,n,Set(thisActiveMember=${CHANNEL(channeltype)}/${CHANNEL(peername)}) exten = handle_member,n,Set(queue_field=1) exten = handle_member,n,Set(thisQueueXtn=${CUT(QUEUES,\,,${queue_field})}) exten = handle_member,n,While($[${EXISTS(${thisQueueXtn})}]) exten = handle_member,n,Macro(member-loginlogout) exten = handle_member,n,Set(queue_field=$[${queue_field} + 1]) exten = handle_member,n,Set(thisQueueXtn=${CUT(QUEUES,\,,${queue_field})}) exten = handle_member,n,EndWhile() [macro-member-loginlogout] exten = s,1,Verbose(2, Logging queue member in or out of the request queue) exten = s,n,Set(thisQueue=${thisQueueXtn}) exten = s,n,Set(queueMembers=${QUEUE_MEMBER_LIST(${thisQueue})}) exten = s,n,MacroIf("${queueMembers}" = ""]?q_login) exten = s,n,Set(field=1) exten = s,n,Set(logged_in=0) exten = s,n,Set(thisQueueMember=${CUT(queueMembers,\,,${field})}) exten = s,n,While($[${EXISTS(${thisQueueMember})}]) exten = s,n,GotoIf($["${thisQueueMember}" != "${thisActiveMember}"]?check_next) exten = s,n,Set(logged_in=1) exten = s,n,ExitWhile() exten = s,n(check_next),Set(field=$[${field} + 1]) exten = s,n,Set(thisQueueMember=${CUT(queueMembers,\,,${field})}) exten = s,n,EndWhile() exten = s,n,MacroIf($[${logged_in} = 0]?q_login:q_logout) [macro-q_login] exten = s,1,Verbose(2, Logging ${thisActiveMember} into the ${thisQueue} queue) exten = s,n,AddQueueMember(${thisQueue},${thisActiveMember}) exten = s,n,Playback(silence/1) exten = s,n,ExecIf($["${AQMSTATUS}" = "ADDED"]?Playback(agent-loginok):Playback(an-error-has-occurred)) [macro-q_logout] exten = s,1,Verbose(2, Logged ${thisActiveMember} out of ${thisQueue} queue) exten = s,n,RemoveQueueMember(${thisQueue},${thisActiveMember}) exten = s,n,Playback(silence/1) exten = s,n,ExecIf($["${AQMSTATUS}" = "REMOVED"]?Playback(agent-loggedoff):Playback(an-error-has-occurred)) [asterisk_guitools] exten = executecommand,1,System(${command}) exten = executecommand,n,Hangup() exten = record_vmenu,1,Answer exten = record_vmenu,n,Playback(vm-intro) exten = record_vmenu,n,Record(${var1}) exten = record_vmenu,n,Playback(vm-saved) exten = record_vmenu,n,Playback(vm-goodbye) exten = record_vmenu,n,Hangup exten = play_file,1,Answer exten = play_file,n,Playback(${var1}) exten = play_file,n,Hangup [DID_sipnet] include = DID_sipnet_default [DID_sipnet_default] exten = 0031******,1,Goto(voicemenu-custom-1,s,1) [CallingRule_rulles] exten = _XXXXX.,1,Macro(trunkdial-failover-0.3,${sipnet}/${EXTEN:0},,sipnet,,0031******) [DLPN_DialPlan1] include = CallingRule_rulles include = default include = parkedcalls include = conferences include = ringgroups include = voicemenus include = queues include = voicemailgroups include = directory include = pagegroups include = page_an_extension [voicemenu-custom-1] include = default exten = s,1,NoOp(test) exten = s,2,Background(record/trunk1.mp3) |
Added after 1 minutes:
извините что всё скинул - просто не знаю куда лезть ибо новичёк в этом деле...
Last edited by mescaline2 on Thu Nov 25, 2010 11:31
тут рекламируют и требуют к прочтению одну книгу. почитайте пока на ап не отвечают.
есть раздел работа. есть поиск.
без обид. но не принято здесь помогать людям которые не хотят разбираться в проблеме.