PageRenderTime 58ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/build/classes/YaffmapGlobalUpdate.php

https://github.com/wurststulle/yaffmap-backend
PHP | 201 lines | 174 code | 2 blank | 25 comment | 44 complexity | fad306bf950e7de29f2a4e03c2273b94 MD5 | raw file
  1. <?php
  2. class YaffmapGlobalUpdate extends Yaffmap{
  3. public function __construct($request = null, $response = null){
  4. call_user_func_array('parent::__construct', array($request, $response));
  5. // $allowed = array();
  6. // $this->checkInput($allowed);
  7. }
  8. public function globalUpdate(){
  9. if(isset($this->request['node'])){
  10. $request = Yaffmap::decodeJson($this->request['node']);
  11. $globalUpdateInterval = $this->request['updateIntervalGlobal'];
  12. foreach($request as $item){
  13. $firstIp = null;
  14. $node = null;
  15. $wlIfaces = array();
  16. foreach($item->iface as $if){
  17. if($firstIp == null && $item->name == ""){
  18. if(Net_IPv4::validateIP($if->ipv4Addr)){
  19. $firstIp = $if->ipv4Addr;
  20. }
  21. if(Net_IPv6::checkIPv6($if->ipv6Addr)){
  22. $firstIp = $if->ipv6Addr;
  23. }
  24. }
  25. if(Net_IPv6::checkIPv6($if->ipv6Addr) && Net_IPv4::validateIP($if->ipv4Addr)){
  26. $node = AddrMapNodeQuery::create()
  27. ->filterByIpv4addr($if->ipv4Addr)
  28. ->filterByIpv6addr($if->ipv6Addr)
  29. ->findOne();
  30. }elseif(Net_IPv6::checkIPv6($if->ipv6Addr)){
  31. $node = AddrMapNodeQuery::create()->filterByIpv4addr($if->ipv4Addr)->findOne();
  32. }elseif(Net_IPv4::validateIP($if->ipv4Addr)){
  33. $node = AddrMapNodeQuery::create()->filterByIpv6addr($if->ipv6Addr)->findOne();
  34. }else{
  35. throw new Exception('ipv4/6 address is invalid.');
  36. }
  37. if($node == null){
  38. // node does not exist
  39. // create new addrMap and wl interface
  40. $addrMap = new AddrMap();
  41. $addrMap->setId(md5(mt_rand(1, 100000).$if->ipv4Addr.$if->ipv6Addr.date('U')));
  42. $addrMap->setIpv4addr($if->ipv4Addr);
  43. $addrMap->setIpv6addr($if->ipv6Addr);
  44. $addrMap->setIsGlobalUpdated(true);
  45. $addrMap->save();
  46. $wlIf = new WlIface();
  47. $wlIf->setId(md5(mt_rand(1, 100000).$if->ipv4Addr.$if->ipv6Addr.date('U')));
  48. $wlIf->setIsDummy(1);
  49. $wlIf->setAddrMap($addrMap);
  50. // link address map to wl interface and store wl interface in $wlIfaces collection
  51. $wlIfaces[] = $wlIf->copy();
  52. }
  53. }
  54. if($node == null){
  55. // could not match any ip to a node, create new dummy node
  56. $node = new FfNode();
  57. if($item->name == ""){
  58. // no hostname given, use first ip
  59. $node->setHostname($firstIp);
  60. }else{
  61. $node->setHostname($item->name);
  62. }
  63. $node->setLatitude($item->latitude);
  64. $node->setLongitude($item->longitude);
  65. $node->setDefGateway($item->defGateway);
  66. $node->setIsHna((($item->isHna == 'true')?true:false));
  67. // add random nodeID
  68. $node->setId(md5($item->latitude.$item->longitude.mt_rand(1, 1000).$item->name.date('U')));
  69. $node->setIsGlobalUpdated(true);
  70. $node->setUpdateIntervalNode($globalUpdateInterval);
  71. $node->save();
  72. $wlDevice = WlDevice::createDummy($node);
  73. // add all items of $wlIfaces to this wlDevice
  74. foreach($wlIfaces as $wlIface){
  75. $wlIface->setWlDevice($wlDevice);
  76. $wlIface->save();
  77. }
  78. }else{
  79. // node was found, add all items of addrMaps to this node
  80. // ifaces are added to a random device
  81. $ffNode = $node->getFfNode();
  82. /* @var $ffNode FfNode */
  83. // update existing (dummy) node
  84. if($item->name == ""){
  85. // no hostname given, use first ip
  86. $ffNode->setHostname($firstIp);
  87. }else{
  88. $ffNode->setHostname($item->name);
  89. }
  90. if(!($ffNode->getLatitude() != null && $item->latitude == null || $ffNode->getLongitude() != null && $item->longitude == null)){
  91. // if lat/lon is empty in request, but already in database, do nothing, else do...
  92. $ffNode->setLatitude($item->latitude);
  93. $ffNode->setLongitude($item->longitude);
  94. }
  95. $ffNode->setDefGateway($item->defGateway);
  96. $ffNode->setIsHna((($item->isHna == 'true')?true:false));
  97. if($ffNode->getIsGlobalUpdated()){
  98. // update global update interval of global updated nodes
  99. $ffNode->setUpdateIntervalNode($globalUpdateInterval);
  100. }
  101. $ffNode->setReplicatedBy('');
  102. $ffNode->save();
  103. $wlDevice = $ffNode->getWlDevices()->getFirst();
  104. foreach($wlIfaces as $wlIface){
  105. $wlIface->setWlDevice($wlDevice);
  106. $wlIface->save();
  107. }
  108. }
  109. }
  110. }
  111. if(isset($this->request['link'])){
  112. $request = Yaffmap::decodeJson($this->request['link']);
  113. foreach($request->link as $link){
  114. if($request->ipv == 4){
  115. if(!Net_IPv4::validateIP($link->sAddr)){
  116. throw new EInvalidIpAddr($link->sAddr);
  117. }
  118. if(!Net_IPv4::validateIP($link->dAddr)){
  119. throw new EInvalidIpAddr($link->dAddr);
  120. }
  121. // ipv4 source address given
  122. $sAddr = AddrMapQuery::create()->filterByIpv4addr($link->sAddr)->findOneOrCreate();
  123. $dAddr = AddrMapQuery::create()->filterByIpv4addr($link->dAddr)->findOneOrCreate();
  124. }elseif($request->ipv == 0){
  125. // mac address given
  126. $sAddr = AddrMapQuery::create()->filterByMacAddr($link->sAddr)->findOneOrCreate();
  127. $dAddr = AddrMapQuery::create()->filterByMacAddr($link->dAddr)->findOneOrCreate();
  128. }else{
  129. // ipv6 address given
  130. $sAddr = AddrMapQuery::create()->filterByIpv6addr($link->sAddr)->findOneOrCreate();
  131. $dAddr = AddrMapQuery::create()->filterByIpv6addr($link->dAddr)->findOneOrCreate();
  132. }
  133. if($sAddr->isNew() && $dAddr->isNew()){
  134. // source and dest not found
  135. $sourceNode = FfNode::createDummy($link->sAddr);
  136. $sourceWlDevice = WlDevice::createDummy($sourceNode);
  137. $sAddr->setIsGlobalUpdated(true);
  138. $sAddr->save();
  139. $sourceWlIf = WlIface::createDummy($sourceWlDevice, $sAddr);
  140. $destNode = FfNode::createDummy($link->dAddr);
  141. $destWlDevice = WlDevice::createDummy($destNode);
  142. $dAddr->setIsGlobalUpdated(true);
  143. $dAddr->save();
  144. WlIface::createDummy($destWlDevice, $dAddr);
  145. }elseif(!($sAddr->isNew()) && $dAddr->isNew()){
  146. // dest address not in database
  147. if(!$sAddr->getIsGlobalUpdated()){
  148. // source was updated by node, skip global updating this link
  149. continue;
  150. }
  151. $destNode = FfNode::createDummy($link->dAddr);
  152. $destWlDevice = WlDevice::createDummy($destNode);
  153. $dAddr->setIsGlobalUpdated(true);
  154. $dAddr->save();
  155. $destWlIf = WlIface::createDummy($destWlDevice, $dAddr);
  156. }elseif($sAddr->isNew() && !($dAddr->isNew())){
  157. // source address not in database
  158. if(!$dAddr->getIsGlobalUpdated()){
  159. // destination was updated by node, skip global updating this link
  160. continue;
  161. }
  162. $sourceNode = FfNode::createDummy($link->sAddr);
  163. $sourceWlDevice = WlDevice::createDummy($sourceNode);
  164. $sAddr->setIsGlobalUpdated(true);
  165. $sAddr->save();
  166. WlIface::createDummy($sourceWlDevice, $sAddr);
  167. }else{
  168. if(!($sAddr->getIsGlobalUpdated()) || !($dAddr->getIsGlobalUpdated())){
  169. // if source or destination address is not global updated, skip
  170. continue;
  171. }
  172. }
  173. $metricType = MetricTypeQuery::create()->filterByName($request->metricType)->findOneOrCreate();
  174. if($metricType->isNew()){
  175. $metricType->save();
  176. }
  177. $rpType = RpQuery::create()
  178. ->filterByName($request->rp)
  179. ->filterByMetricType($metricType)
  180. ->filterByIpv($request->ipv)
  181. ->findOneOrCreate();
  182. if($rpType->isNew()){
  183. $rpType->save();
  184. }
  185. $rp = RpLinkQuery::create()->filterBySourceAddrMap($sAddr)->filterByDestAddrMap($dAddr)->findOneOrCreate();
  186. $rp->setRx($link->rx);
  187. $rp->setTx($link->tx);
  188. $rp->setCost($link->cost);
  189. $rp->setRp($rpType);
  190. $rp->setIsGlobalUpdated(true);
  191. $rp->save();
  192. }
  193. }
  194. $this->response->setResponseCode(YaffmapResponse::OPERATION_SUCCEDED);
  195. $this->response->setResponseMsg('Operation Succeded.');
  196. return $this->response;
  197. }
  198. }
  199. ?>