ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ '0'), $conditions); $where = array(); foreach ($conditions as $field => $value) { $value = mysql_real_escape_string($value); $where[] = "{$field} = '{$value}'"; } $where = implode(' AND ', $where); $sql = "SELECT * FROM yate_systems WHERE {$where}"; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'yate_systemConfigs() failed.'); exit; } $gateways = array(); while ($row = mysql_fetch_assoc($result)) { $gateways[] = $row; } return $gateways; } function tb_fetchStatisticsSystems() { $sql = 'SELECT * FROM tb_systems WHERE disabled = 0 AND statistics = 1'; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'tb_fetchStatisticsSytems() failed.'); exit; } $gateways = array(); while ($row = mysql_fetch_array($result)) { $gateways[] = $row; } return $gateways; } function yate_fetchCDRsSystems() { $sql = 'SELECT * FROM yate_systems WHERE disabled = 0 AND import_cdrs = 1'; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'tb_fetchCDRsSystems() failed.'); exit; } $gateways = array(); while ($row = mysql_fetch_array($result)) { $gateways[] = $row; } return $gateways; } function tb_fetchNAPs($system_id) { $sql = 'SELECT id, name, type, customer_id, parent_nap, prefix FROM tb_naps WHERE system = ' . $system_id . ' ORDER BY IF(parent_nap = 0, id, parent_nap), parent_nap != 0'; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'tb_fetchNAPs() failed.'); exit; } $naps = array(); $napid2name = array(); while ($row = mysql_fetch_assoc($result)) { #$naps[$row['name']] = $row; if ($row['parent_nap'] != '0') { //vNAP $naps[$napid2name[$row['parent_nap']]]['vnaps'][$row['id']] = $row; } else { $naps[$row['name']] = $row; $napid2name[$row['id']] = $row['name']; } } return $naps; } function tb_fetchCauseCodes($system_id = 0) { // Shared Causecodes for all systems $sql = 'SELECT code, id, effective FROM tb_causecodes'; # WHERE system = ' . $system_id; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'tb_fetchCauseCodes() failed.'); exit; } $causecodes = array(); while ($row = mysql_fetch_array($result)) { $causecodes[$row['code']] = array('id' => $row['id'], 'effective' => $row['effective']); } return $causecodes; } function yate_fetchCdrFiles($config) { if ($config['disabled']) { return false; } $output = yate_fetchCdrFilesListing($config); echo "Found " . count($output) . " files...." . $output . "....." ; print_r($output); print("Found " . count($output) . " files."); foreach ($output as $file) { $cdrfile_id = yate_cdrFileNew($config['id'], $file); yate_downloadCdrFile($config, $file, $cdrfile_id); } if ($config['host2'] == '') { print('No secondary host defined.'); return; } /*echo 'Getting files from secondary host...'; debug_cprint('Getting files from secondary host...'); $config['host'] = $config['host2']; $output = tb_fetchCdrFilesListing($config); echo "Found " . count($output) . " files on secondary Host..." . $output ." ....."; debug_cprint("Found " . count($output) . " files on secondary Host."); foreach ($output as $file) { $dest_file = str_replace('.log.gz', '.h2.log.gz', $file); //$dest_file = $file; $cdrfile_id = tb_cdrFileNew($config['id'], $dest_file); tb_downloadCdrFile($config, $file, $cdrfile_id, $dest_file); } */ } function yate_fetchCdrFilesListing($config) { //$cmd = '/usr/bin/ssh ' . $config['host'] . ' "find ' . $config['cdr_path'] . ' -name \'' . CDR_FILE_PATTERN . '\' -maxdepth 1 -printf \'%f\n\'"'; $cmd = '/usr/bin/ssh ' . $config['host'] . ' "find ' . $config['cdr_path'] . ' -name \'' . CDR_FILE_PATTERN . '\' -maxdepth 1 -printf \'%f\n\'"'; //$cmd = ' find ' . $config['cdr_path'] . ' -name \'' . CDR_FILE_PATTERN . '\' -maxdepth 1 -printf \'%f\n\''; print($cmd); $output = array(); $ret_val = -1; exec($cmd, $output, $ret_val); print('$output : ' . implode("\n", $output)); if ($ret_val != 0) { return false; } sort($output); return $output; } function yate_downloadCdrFile($config, $file, $cdrfile_id, $dest_file = '') { debug_cprint("Download '$file'."); echo "Download '$file'."; if ($dest_file == '') { $dest_file = $file; } $cmd = "/usr/bin/scp -q '{$config['host']}:{$config['cdr_path']}/$file' '" . TTFILE_PATH . "/incoming/$dest_file'"; //$cmd = "cp '{$config['cdr_path']}/$file' '" . TTFILE_PATH . "/incoming/$dest_file'"; $output = array(); $ret_val = -1; exec($cmd, $output, $ret_val); if ($ret_val != 0) { echo 'Shell exec failed: ' . $cmd ."\n\n"; print_r($output); tb_cdrFileStatus($cdrfile_id, 'ERROR'); return false; } // Remote rename //$cmd = " mv '{$config['cdr_path']}/$file' '{$config['cdr_path']}/downloaded/$file' "; $cmd = "/usr/bin/ssh {$config['host']} 'mv \"{$config['cdr_path']}/$file\" \"{$config['cdr_path']}/228/$file\"'"; $output = array(); $ret_val = -1; exec($cmd, $output, $ret_val); if ($ret_val != 0) { echo 'Shell exec failed: ' . $cmd ."\n\n"; print_r($output); yate_cdrFileStatus($cdrfile_id, 'ERROR'); return false; } // Local rename if (!rename(TTFILE_PATH . "/incoming/$dest_file", TTFILE_PATH . "/ready/$dest_file")) { echo "Local rename to /ready/ failed! File: '{$dest_file}', Id: {$cdrfile_id}\n"; yate_cdrFileStatus($cdrfile_id, 'ERROR'); return false; } $cmd = "gzip -f -d " . TTFILE_PATH . "/ready/$dest_file"; $output = array(); $ret_val = -1; exec($cmd, $output, $ret_val); if ($ret_val != 0) { echo 'Shell exec failed: ' . $cmd ."\n\n"; print_r($output); yate_cdrFileStatus($cdrfile_id, 'ERROR'); return false; } yate_cdrFileStatus($cdrfile_id, 'DOWNLOADED'); return true; } function yate_cdrFileNew($system_id, $file) { $sql = "INSERT INTO yate_cdr_files SET system = '$system_id', filename = '{$file}', last_timestamp = NULL, last_modified = '" . date('Y-m-d H:i:s') . "'"; if (!mysql_query($sql)) { echo mysql_errorhandler($sql, 'cdrFileNew() failed.'); exit; } $cdr_file_id = mysql_insert_id(); return $cdr_file_id; } function yate_cdrFileTimestamp($cdrfile_id, $last_timestamp) { $sql = "UPDATE yate_cdr_files SET last_timestamp = '$last_timestamp' WHERE id = $cdrfile_id"; if (!mysql_query($sql)) { echo mysql_errorhandler($sql, 'cdrFileTimestamp() failed.'); exit; } } function yate_cdrFileStatus($cdrfile_id, $status) { $sql = "INSERT INTO yate_cdr_files_status SET cdrfile_id = {$cdrfile_id}, status = '{$status}', last_modified = '" . date('Y-m-d H:i:s') . "'"; if (!mysql_query($sql)) { echo mysql_errorhandler($sql, 'cdrFileStatus() failed.'); exit; } #$cdr_file_id = mysql_insert_id(); } function yate_getUnparsedCdrFiles($system_id) { $sql = "SELECT f.id, f.filename FROM yate_cdr_files AS f INNER JOIN yate_cdr_files_status AS s ON (f.id = s.cdrfile_id) WHERE f.system = $system_id AND s.status = 'DOWNLOADED' AND NOT EXISTS (SELECT id FROM yate_cdr_files_status AS s1 WHERE s1.cdrfile_id = f.id AND s1.status = 'PARSED') AND NOT EXISTS (SELECT id FROM yate_cdr_files_status AS s1 WHERE s1.cdrfile_id = f.id AND s1.status = 'ERROR')"; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'fetchCdrFiles() failed.'); exit; } $files = array(); while ($row = mysql_fetch_array($result)) { $files[$row['id']] = $row['filename']; } return $files; } function tb_findNAP($system_id, $NAP, $field = false, $bnumber = '') { static $systems = array(); if (!isset($systems[$system_id])) { $systems[$system_id] = tb_fetchNAPs($system_id); } #var_export($systems); $NAP = strtoupper($NAP); // Not found. if (!isset($systems[$system_id][$NAP])) { return false; } // No vNAP set or not wanted if ($bnumber == '' or !isset($systems[$system_id][$NAP]['vnaps'])) { return $field ? $systems[$system_id][$NAP][$field] : $systems[$system_id][$NAP]; } $found = false; foreach ($systems[$system_id][$NAP]['vnaps'] as $vnap) { if (substr($bnumber, 0, strlen($vnap['prefix'])) == $vnap['prefix']) { $found = true; break; } } if ($found) { return $field ? $vnap[$field] : $vnap; } return false; } function tb_findNAPbyId($system_id, $nap_id, $field = false) { static $systems = array(); if (!isset($systems[$system_id])) { $sql = 'SELECT id, name, type, customer_id FROM tb_naps WHERE system = ' . $system_id; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'tb_fetchNAPs() failed.'); exit; } $systems[$system_id] = array(); while ($row = mysql_fetch_array($result)) { $systems[$system_id][$row['id']] = $row; } } if (isset($systems[$system_id][$nap_id])) { return $field ? $systems[$system_id][$nap_id][$field] : $systems[$system_id][$nap_id]; } else { return false; } } function tb_findCauseCode($system_id, $cause_code, $field = false) { static $systems = array(); if (!isset($systems[$system_id])) { $systems[$system_id] = tb_fetchCauseCodes($system_id); } if (isset($systems[$system_id][$cause_code])) { return $field ? $systems[$system_id][$cause_code][$field] : $systems[$system_id][$cause_code]; } else { return false; } } function tb_compareNAPs($localNAPs, $remoteNAPs, $system = false) { if ($system) { $systeminfo = "System {$system}: "; } else { $systeminfo = ''; } global $mysql_local; $msg = ''; foreach ($localNAPs as $localNAP) { if (!isset($remoteNAPs[$localNAP['remote_id']])) { $msg .= "{$systeminfo}NAP only local! (deleted on gateway?) Id: {$localNAP['remote_id']}, Name: {$localNAP['name']}, Type: {$localNAP['type']}\n"; $msg .= "-> This should not happen. Please investigate and create the remote NAP.\n"; /*if ($system) { $sql = "DELETE FROM tb_naps WHERE system = {$system} AND id = {$localNAP['id']}"; #echo "$sql\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'compareNAPs() failed.'); exit; } $msg .= "-> Local NAP deleted.\n"; }*/ continue; } $remoteNAP = $remoteNAPs[$localNAP['remote_id']]; // Delete so we can check if there are any remote NAPs left over unset($remoteNAPs[$localNAP['remote_id']]); if (strtoupper($remoteNAP['name']) != $localNAP['name']) { $msg .= "{$systeminfo}Name changed! Remote Id: {$localNAP['remote_id']}, Local name: {$localNAP['name']}, Remote name: {$remoteNAP['name']}\n"; if ($system) { $sql = "UPDATE tb_naps SET name = '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "' WHERE system = {$system} AND remote_id = {$localNAP['remote_id']}"; #echo "$sql\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'compareNAPs() failed.', $mysql_local); exit; } $msg .= "-> Local NAP updated.\n"; } continue; } if ($remoteNAP['type'] != $localNAP['type']) { $msg .= "{$systeminfo}Type changed! Remote Id: {$localNAP['remote_id']}, Local type: {$localNAP['type']}, Remote type: {$remoteNAP['type']}\n"; $msg .= "-> This should not happen. Please investigate and adjust the types.\n"; continue; } } if (!empty($remoteNAPs)) { foreach ($remoteNAPs as $remoteNAP) { $msg .= "{$systeminfo}New remote NAP! Id: {$remoteNAP['id']}, Name: {$remoteNAP['name']}, Type: {$remoteNAP['type']}\n"; if ($system) { $sql = "INSERT INTO tb_naps (system, remote_id, name, type) VALUES ($system, {$remoteNAP['id']}, '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "', {$remoteNAP['type']})"; /*$sql = "REPLACE INTO tb_naps (system, id, name, type) VALUES ($system, {$remoteNAP['id']}, '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "', {$remoteNAP['type']});"; #echo "$sql\n";*/ if (!mysql_query($sql, $mysql_local)) { if (mysql_errno($mysql_local) != 1062) { echo $msg; echo mysql_errorhandler($sql, 'tb_compareNAPs() failed.', $mysql_local); exit; } $msg .= "Cannot insert NAP! Please Update\n"; // NAP id changed... // TODO: Just change remote_id? /*$sql = "UPDATE tb_naps SET remote_id = {$remoteNAP['id']} WHERE system = {$system} AND name = '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "'"; if (!$result = mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'compareNAPs() failed.', $mysql_local); exit; } */ /* $sql = "SELECT id FROM tb_naps WHERE system = $system AND name = '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "'"; if (!$result = mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'compareNAPs() failed.', $mysql_local); exit; } $row = mysql_fetch_assoc($result); if ($row['id'] == $remoteNAP['id']) { echo $msg; echo "Assert failed! New NAP cannot be inserted, name and id are equal?\nNew NAP:\n"; var_export($remoteNAP); exit; } $msg .= "-> Local NAP exists. Updating....\n"; $msg .= tb_updateNAPid($system, $row['id'], $remoteNAP['id']); $sql = "UPDATE tb_naps SET id = {$remoteNAP['id']}, type = {$remoteNAP['type']} WHERE system = $system AND name = '" . mysql_real_escape_string(strtoupper($remoteNAP['name'])) . "'"; if (!$result = mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'compareNAPs() failed.', $mysql_local); exit; } */ } else { $msg .= "-> Local NAP created.\n"; } } } } return $msg; } function tb_updateNAPid($system, $old_id, $new_id) { global $mysql_local; $msg = ''; $sql = "UPDATE `tb_statistics` SET nap = $new_id WHERE nap = $old_id AND system = $system"; $msg .= "Updated `tb_statistics`, nap: $old_id => $new_id\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'tb_updateNAPid failed.'); exit; } $sql = "SELECT `customer_id` FROM `tb_naps` WHERE `system` = '{$system}' GROUP BY `customer_id`"; if (!$result = mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'tb_updateNAPid failed.'); exit; } while ($row = mysql_fetch_array($result)) { $sql = "UPDATE `ctb_{$row['customer_id']}_details` AS d, `ctb_{$row['customer_id']}_cdrs` AS c SET d.route_out = $new_id WHERE d.route_out = $old_id AND d.cdr_id = c.id AND c.system = $system"; $msg .= "Updated `ctb_{$row['customer_id']}_details`, route_out: $old_id => $new_id\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'tb_updateNAPid failed.'); exit; } $sql = "UPDATE `ctb_{$row['customer_id']}_cdrs` SET route_out = $new_id WHERE route_out = $old_id AND system = $system"; $msg .= "Updated `ctb_{$row['customer_id']}_cdrs`, route_out: $old_id => $new_id\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'tb_updateNAPid failed.'); exit; } $sql = "UPDATE `ctb_{$row['customer_id']}_cdrs` SET route_in = $new_id WHERE route_in = $old_id AND system = $system"; $msg .= "Updated `ctb_{$row['customer_id']}_cdrs`, route_in: $old_id => $new_id\n"; if (!mysql_query($sql, $mysql_local)) { echo $msg; echo mysql_errorhandler($sql, 'tb_updateNAPid failed.'); exit; } } return $msg; } function tb_showCauseCodeselect($config = array(), $selected = '') { $sql = "SELECT id, name FROM tb_causecodes ORDER BY id"; $result = mysql_query($sql); $options = ''; while ($row = mysql_fetch_assoc($result)) { if (substr($row['name'], 0, 4) == 'Q850') { $sub = " ({$row['id']})"; } else { $sub = ''; } $selected_tag = $row['id'] == $selected ? ' selected="selected"' : ''; $options .= ""; } $autosubmit = $config['auto_submit'] ? ' onChange="this.form.submit();"' : ''; if ($config['default_text'] === true) { $default = ""; } elseif ($config['default_text']) { $default = ""; } else { $default = ''; } $name = $config['name'] ? $config['name'] : 'causecode'; return ""; } function tb_showSystemSelect($config = array(), $selected = '') { $sql = "SELECT id, name FROM tb_systems WHERE disabled = 0 ORDER BY id"; $result = mysql_query($sql); $options = ''; while ($row = mysql_fetch_assoc($result)) { $selected_tag = $row['id'] == $selected ? ' selected="selected"' : ''; $options .= ""; } $autosubmit = $config['auto_submit'] ? ' onChange="this.form.submit();"' : ''; if ($config['default_text'] === true) { $default = ""; } elseif ($config['default_text']) { $default = ""; } else { $default = ''; } $name = $config['name'] ? $config['name'] : 'system'; return ""; } function tb_showNAPselect($customer_id = false, $config = array(), $selected = '') { if ($customer_id) { $where = " AND n.customer_id = $customer_id"; } else { $where = ''; } $sql = "SELECT s.name AS system_name, s.id AS system_id, n.id, n.name, n.type FROM tb_naps AS n INNER JOIN tb_systems s ON (s.id = n.system) WHERE s.disabled = 0 $where ORDER BY s.id, n.id"; $result = mysql_query($sql); $system = ''; $options = ''; while ($row = mysql_fetch_assoc($result)) { if ($row['system_name'] != $system) { $system = $row['system_name']; if ($system != '') { $options .= ''; } $options .= ''; } $value = $config['nap_only'] ? $row['id'] : "{$row['system_id']}-{$row['id']}"; $selected_tag = $value == $selected ? ' selected="selected"' : ''; $options .= ""; } if ($system != '') { $options .= ''; } $autosubmit = $config['auto_submit'] ? ' onChange="this.form.submit();"' : ''; if ($config['default_text'] === true) { $default = ""; } elseif ($config['default_text']) { $default = ""; } else { $default = ''; } $name = $config['name'] ? $config['name'] : 'nap'; return ""; } function tb_GetWhereString($condition='', $prefix = 'c.') { if ($_REQUEST['carrier_in']) { $_REQUEST['route_in'] = tb_GetCarrierRoutes($_SESSION['login_customerid'], $_REQUEST['carrier_in']); } if ($_REQUEST['carrier_out']) { $_REQUEST['route_out'] = tb_GetCarrierRoutes($_SESSION['login_customerid'], $_REQUEST['carrier_out']); } if (is_array($_REQUEST['route_in'])) { foreach ($_REQUEST['route_in'] as $key => $route_in) { if (!intval($route_in)) { unset($_REQUEST['route_in'][$key]); } } if (count($_REQUEST['route_in']) > 0) { $where[] = "{$prefix}route_in IN ('".implode("','", $_REQUEST['route_in'])."')"; } else { $where[] = '1=0'; } } elseif ($_REQUEST['route_in']) { $where[] = "{$prefix}route_in = '".$_REQUEST['route_in']."'"; } if (is_array($_REQUEST['route_out'])) { foreach ($_REQUEST['route_out'] as $key => $route_out) { if (!intval($route_out)) { unset($_REQUEST['route_out'][$key]); } } if (count($_REQUEST['route_out']) > 0) { $where[] = "{$prefix}route_out IN ('".implode("','", $_REQUEST['route_out'])."')"; } else { $where[] = '1=0'; } } elseif ($_REQUEST['route_out']) { $where[] = "{$prefix}route_out = '".$_REQUEST['route_out']."'"; } $effective = intval($_REQUEST['effective']); if ($effective == 1) { $where[] = "{$prefix}effective = 1"; } elseif ($effective == 2) { $where[] = "{$prefix}effective = 0"; } if ($_REQUEST['duration'] != '') { $duration = intval($_REQUEST['duration']); switch (intval($_REQUEST['duration_cmp'])) { case 0: $cmp = '<'; break; case 1: $cmp = '='; break; case 2: $cmp = '>'; break; } $where[] = "{$prefix}chargeable_duration {$cmp} {$duration}"; } if ($_REQUEST['causecode']) { $where[] = "{$prefix}effective_causecode = " . intval($_REQUEST['causecode']); } if ($_REQUEST['anumber']) { if ($_REQUEST['alike'] == '@') { $where[] = "{$prefix}anumber = '".$_REQUEST['anumber']."'"; } else { $where[] = sprintf("{$prefix}anumber LIKE '%s'", mysql_real_escape_string(str_replace(array('@', '*'), array($_REQUEST['anumber'],'%'), $_REQUEST['alike']))); } } if ($_REQUEST['bnumber']) { if ($_REQUEST['blike'] == '@') { $where[] = "{$prefix}bnumber = '".$_REQUEST['bnumber']."'"; } else { $where[] = sprintf("{$prefix}bnumber LIKE '%s'", mysql_real_escape_string(str_replace(array('@', '*'), array($_REQUEST['bnumber'],'%'), $_REQUEST['blike']))); } } $where[] = "date BETWEEN '".GenerateDateTime('start')."' AND '".GenerateDateTime('ende')."'"; if (is_array($where)) { return "WHERE ".implode(" AND ", $where).$condition; } } function tb_GetCarrierRoutes($CustomerID, $carrier) { $sql = "SELECT id FROM tb_naps WHERE customer_id = $CustomerID AND carrier = $carrier"; if (!$result = mysql_query($sql)) { echo mysql_errorhandler($sql, 'selecting carrier failed.'); return; } if (mysql_num_rows($result) == 0) { #echo 'No routes for carrier present'; return array(); } while ($row = mysql_fetch_row($result)) { $ret[] = $row[0]; } return $ret; } function tb_findCustomer($system_id, $route_in, $route_out) { $customer_id = tb_findNAPbyId($system_id, $route_in, 'customer_id'); if ($customer_id) { return $customer_id; } $customer_id = tb_findNAPbyId($system_id, $route_out, 'customer_id'); return $customer_id ? $customer_id : 0; } function tb_createCustomerTables($customer_id) { global $mysql_local; $sql = << 0, 'ISDN' => 1, 'SS7' => 2, 'SIP' => 3, 'MEDIA_ONLY_VOIP' => 4, 'MEDIA_ONLY_TDM' => 5, 'CASR2' => 6 ); if ($IdAsKey) { $protocols = array_flip($protocols); } return $protocols; }