VirtualInterfaceConverter.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace ModulesGarden\ProxmoxAddon\App\Services\Cloud;
  3. use MGProvision\Proxmox\v2\models\IpConfig;
  4. use MGProvision\Proxmox\v2\models\Kvm;
  5. use MGProvision\Proxmox\v2\models\Lxc;
  6. use MGProvision\Proxmox\v2\models\NetworkDeviceKvm;
  7. use MGProvision\Proxmox\v2\models\NetworkDeviceLxc;
  8. use ModulesGarden\ProxmoxAddon\App\Enum\Cloud\ConfigurableOption;
  9. use ModulesGarden\ProxmoxAddon\App\Models\VirtualInterface;
  10. use ModulesGarden\ProxmoxAddon\App\Models\VmIpAddress;
  11. use ModulesGarden\ProxmoxAddon\Core\UI\Traits\WhmcsParams;
  12. use Illuminate\Database\Capsule\Manager as DB;
  13. class VirtualInterfaceConverter
  14. {
  15. use WhmcsParams;
  16. use ProductService;
  17. /**
  18. * @var Kvm|Lxc|null
  19. */
  20. protected $vm;
  21. /**
  22. * @var VirtualInterface[]
  23. */
  24. protected $virtualInterfaces;
  25. /**
  26. * @var NetworkDeviceKvm[]
  27. */
  28. protected $networkDevices;
  29. /**
  30. * @var IpConfig[]
  31. */
  32. protected $ipConfigs=[];
  33. /**
  34. * VirtualInterfaceConverter constructor.
  35. * @param Kvm|Lxc $vm
  36. * @param VirtualInterface[] $virtualInterfaces
  37. */
  38. public function __construct( $virtualInterfaces, $vm=null)
  39. {
  40. $this->vm = $vm;
  41. $this->virtualInterfaces = $virtualInterfaces;
  42. }
  43. public function convert(){
  44. $container=[];
  45. $rate = $this->getRate();
  46. $networkId = $this->freeNetworDeviceId();
  47. foreach ($this->virtualInterfaces as $virtualInterface){
  48. //public network
  49. if($virtualInterface->vn_id == 0){
  50. /**
  51. * @var $ip VmIpAddress
  52. */
  53. $ip = VmIpAddress::ofHostingId($virtualInterface->hosting_id)->ofIp($virtualInterface->ip)->first();
  54. }
  55. $bridge = $this->getBridge($virtualInterface);
  56. if ($this->configuration()->isQemu())
  57. {
  58. $networkDevice = new NetworkDeviceKvm('net' . $networkId);
  59. $networkDevice->setBridge($bridge)
  60. ->setRate($rate)
  61. ->setFirewall($this->configuration()->isNetworkFirewall() ? 1 : 0);
  62. //ip config
  63. $ipConfig = new IpConfig('ipconfig' . $networkId);
  64. //Public
  65. if($ip){
  66. $networkDevice->setModel($this->configuration()->getNetworkModel())
  67. ->setTag($ip->tag)
  68. ->setMacAddress($ip->mac_address)
  69. ->setTrunks($ip->trunks)
  70. ->setQueues(trim($this->configuration()->getQueues()));
  71. //ipv4
  72. if(!preg_match("/\:/",$virtualInterface->ip)){
  73. $ipConfig->setIp(trim($virtualInterface->ip))
  74. ->setCidr(trim($ip->cidr))
  75. ->setGw(trim($ip->gateway));
  76. }else{
  77. //ipv6
  78. $ipConfig->setIp6(trim($virtualInterface->ip))
  79. ->setCidr6(trim($ip->cidr))
  80. ->setGw6(trim($ip->gateway));
  81. }
  82. }else{
  83. $networkDevice->setModel($this->configuration()->getNetworkPrivateModel())
  84. ->setTag($virtualInterface->virtualNetwork->tag);
  85. $ipConfig->setIp(trim($virtualInterface->ip))
  86. ->setCidr(trim($virtualInterface->virtualNetwork->cidr))
  87. ->setGw(trim($virtualInterface->virtualNetwork->gateway));
  88. }
  89. if(!$this->configuration()->isOneNetworkDevice() || ( $this->configuration()->isOneNetworkDevice() && $networkDevice->getId() =="net0")){
  90. $this->networkDevices[] = $networkDevice;
  91. $this->ipConfigs[] = $ipConfig;
  92. }
  93. }
  94. //lxc
  95. if ($this->configuration()->isLxc())
  96. {
  97. $networkDevice = new NetworkDeviceLxc('net' . $networkId);
  98. $networkDevice->setName('eth' . $networkId)
  99. ->setBridge($bridge)
  100. ->setFirewall($this->configuration()->isNetworkFirewall() ? 1 : 0)
  101. ->setIp($virtualInterface->ip)
  102. ->setRate($rate);
  103. //Public
  104. if($ip){
  105. $networkDevice->setCidr($ip->cidr)
  106. ->setGw($ip->gateway)
  107. ->setTag($ip->tag)
  108. ->setHwaddr($ip->mac_address)
  109. ->setTrunks($ip->trunks);
  110. }else{
  111. $networkDevice->setCidr($virtualInterface->virtualNetwork->cidr)
  112. ->setGw($virtualInterface->virtualNetwork->gateway)
  113. ->setTag($virtualInterface->virtualNetwork->tag);
  114. }
  115. if(!$this->configuration()->isOneNetworkDevice() || ( $this->configuration()->isOneNetworkDevice() && $networkDevice->getId() =="net0")){
  116. $this->networkDevices[] = $networkDevice;
  117. }
  118. }
  119. //one network device for public ip only
  120. if($this->configuration()->isOneNetworkDevice() && $networkDevice->getId() !="net0" && $ip instanceof VmIpAddress ){
  121. $virtualInterface->net = "net0";
  122. $virtualInterface->save();
  123. $ip->net = "net0";
  124. $ip->save();
  125. }else{
  126. $virtualInterface->net = $networkDevice->getId();
  127. $virtualInterface->save();
  128. //public ip
  129. if($ip instanceof VmIpAddress){
  130. $ip->net = $networkDevice->getId();
  131. $ip->save();
  132. }
  133. }
  134. $networkId++;
  135. unset($ip);
  136. }
  137. }
  138. public function asConfig(){
  139. $this->convert();
  140. return array_merge($this->getNetworkDevicesAsConfig(), $this->getIpConfigsAsConfig());
  141. }
  142. public function getNetworkDevicesAsConfig(){
  143. $container=[];
  144. foreach ($this->networkDevices as $networkDevice){
  145. $container[$networkDevice->getId()] = $networkDevice->asConfig();
  146. }
  147. return $container;
  148. }
  149. public function getIpConfigsAsConfig(){
  150. $container=[];
  151. foreach ($this->ipConfigs as $ipConfig){
  152. $container[$ipConfig->getId()] = $ipConfig->asConfig();
  153. }
  154. return $container;
  155. }
  156. private function getRate(){
  157. $rate = null;
  158. if ($this->isWhmcsConfigOption(ConfigurableOption::NETWORK_RATE) && $this->getWhmcsConfigOption(ConfigurableOption::NETWORK_RATE) != "-1")
  159. {
  160. $rate = $this->getWhmcsConfigOption(ConfigurableOption::NETWORK_RATE);
  161. }
  162. else
  163. {
  164. if ($this->configuration()->getRate())
  165. {
  166. $rate = $this->configuration()->getRate();
  167. }
  168. }
  169. return $rate;
  170. }
  171. private function getBridge(VirtualInterface $virtualInterface){
  172. if($virtualInterface->vn_id == 0){
  173. return $this->configuration()->getBridge();
  174. }
  175. return $this->configuration()->getPrivateBridge() ? $this->configuration()->getPrivateBridge() : $this->configuration()->getBridge();
  176. }
  177. private function freeNetworDeviceId(){
  178. if($this->vm){
  179. return $this->vm->findFreeNetworDeviceId();
  180. }
  181. return 0;
  182. }
  183. }