Console.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace ModulesGarden\Servers\ProxmoxCloudVps\App\Http\Client;
  3. use MGProvision\Proxmox\v2\Api;
  4. use MGProvision\Proxmox\v2\models\Kvm;
  5. use MGProvision\Proxmox\v2\models\Lxc;
  6. use ModulesGarden\ProxmoxAddon\App\Factory\ProxyServiceFactory;
  7. use ModulesGarden\ProxmoxAddon\App\Models\ModuleSettings;
  8. use ModulesGarden\ProxmoxAddon\App\Repositories\ModuleSettingRepository;
  9. use ModulesGarden\ProxmoxAddon\App\Repositories\ServerConfigurationRepository;
  10. use ModulesGarden\ProxmoxAddon\App\Services\ApiService;
  11. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\ProductService;
  12. use ModulesGarden\ProxmoxAddon\App\Services\Cloud\UserService;
  13. use ModulesGarden\ProxmoxAddon\App\Services\Utility;
  14. use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\AppParams;
  15. use ModulesGarden\Servers\ProxmoxCloudVps\App\Helpers\LicenseValidator;
  16. use ModulesGarden\Servers\ProxmoxCloudVps\App\UI\Home\Pages\DetailsContainer;
  17. use ModulesGarden\Servers\ProxmoxCloudVps\Core\Http\AbstractClientController;
  18. use ModulesGarden\Servers\ProxmoxCloudVps\Core\ModuleConstants;
  19. use ModulesGarden\Servers\ProxmoxCloudVps\Core\UI\Traits\WhmcsParams;
  20. use Symfony\Component\HttpFoundation\RedirectResponse;
  21. use Symfony\Component\HttpFoundation\StreamedResponse;
  22. use function ModulesGarden\Servers\ProxmoxCloudVps\Core\Helper\sl;
  23. class Console extends AbstractClientController
  24. {
  25. use WhmcsParams;
  26. use UserService;
  27. use ApiService;
  28. use ProductService;
  29. use BaseClientController;
  30. use LicenseValidator;
  31. /**
  32. * @var ModuleSettingRepository
  33. */
  34. protected $moduleConfiguration;
  35. /**
  36. * Console constructor.
  37. */
  38. public function __construct()
  39. {
  40. $this->initVm();;
  41. (new AppParams())->initFromWhmcsParams();
  42. }
  43. public function novnc()
  44. {
  45. $this->acl()->novnc();
  46. $this->moduleConfiguration = new ModuleSettingRepository();
  47. if($this->moduleConfiguration->getConsoleApiKey() && $this->moduleConfiguration->consoleHost && $this->isLicensePayingFullAnnuallyPrice()){
  48. $this->novncProxy();
  49. }
  50. $this->console(['novnc' => 1]);
  51. }
  52. public function xtermjs()
  53. {
  54. $this->acl()->xtermjs();
  55. $this->moduleConfiguration = new ModuleSettingRepository();
  56. if($this->moduleConfiguration->getConsoleApiKey() && $this->moduleConfiguration->consoleHost && $this->isLicensePayingFullAnnuallyPrice()){
  57. $this->xtermjsProxy();
  58. }
  59. $this->console(['xtermjs' => 1]);
  60. }
  61. private function console($request = [])
  62. {
  63. $vm = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVm();
  64. $serverHost = $this->getWhmcsParamByKey('serverip') ? $this->getWhmcsParamByKey('serverip') : $this->getWhmcsParamByKey('serverhostname');
  65. //Host
  66. $consoleHost = $this->getWhmcsParamByKey('serverhostname') ? $this->getWhmcsParamByKey('serverhostname') : $this->getWhmcsParamByKey('serverip');
  67. if ($this->configuration()->getConsoleHost())
  68. {
  69. $consoleHost = $this->configuration()->getConsoleHost();
  70. }
  71. //Port
  72. $consolePort = 8006;
  73. if(is_numeric($this->getWhmcsParamByKey('serverport'))){
  74. $consolePort = $this->getWhmcsParamByKey('serverport');
  75. }
  76. if (preg_match('/\:/', $consoleHost))
  77. {
  78. $ex = explode(":", $consoleHost);
  79. $consoleHost = $ex['0'];
  80. $consolePort = $ex['1'];
  81. }
  82. try
  83. {
  84. //User
  85. $vpsUser = $this->getUser();
  86. if (empty($vpsUser->username))
  87. {
  88. throw new \Exception('User does not have permissions to access noVNC console');
  89. }
  90. //Load Users API
  91. if(!preg_match('/\:/', $serverHost) && $this->getWhmcsParamByKey('serverport') ){
  92. $serverHost .=":".$this->getWhmcsParamByKey('serverport');
  93. }
  94. $api = new Api($serverHost, $vpsUser->username, $vpsUser->realm, $vpsUser->getPassword());
  95. $api->debug(ModuleSettings::isDebug());
  96. //User Authorization
  97. $ticket = $api->getLoginTicket();
  98. $request['token'] = $ticket['ticket'];
  99. $request['CSRFPreventionToken'] = $ticket['CSRFPreventionToken'];
  100. $request['console'] = $vm->getVirtualization();
  101. /* @deprecated $vars['virtualization'] since version 2.6.0 */
  102. $request['virtualization'] = $vm->getVirtualization();
  103. $request['node'] = $vm->getNode();
  104. $request['vmid'] = $vm->getVmid();
  105. }
  106. catch (\Exception $ex)
  107. {
  108. $request['error'] = $ex->getMessage();
  109. }
  110. $response = new RedirectResponse("https://{$consoleHost}:{$consolePort}/novnc/mgnovnc.html?" . http_build_query($request));
  111. $response->send();
  112. }
  113. public function spice()
  114. {
  115. $this->acl()->spice();
  116. $vm = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVm();
  117. $this->api();
  118. $proxy = $vm->spiceproxy();
  119. $consoleHost = $this->getWhmcsParamByKey('serverhostname') ? $this->getWhmcsParamByKey('serverhostname') : $this->getWhmcsParamByKey('serverip');
  120. if ($this->configuration()->getConsoleHost())
  121. {
  122. $consoleHost = $this->configuration()->getConsoleHost();
  123. }
  124. if ($consoleHost)
  125. {
  126. $ex = explode(":", $proxy['proxy']);
  127. $port = end($ex);
  128. $proxy['proxy'] = "http://{$consoleHost}:{$port}";
  129. }
  130. $content = "[virt-viewer]\r\n";
  131. foreach ($proxy as $k => $v)
  132. {
  133. $content .= "{$k}={$v}\r\n";
  134. }
  135. //Response
  136. $response = new StreamedResponse();
  137. $response->setStatusCode(200);
  138. $response->headers->set('Cache-Control', 'public');
  139. $response->headers->set('Content-Type', 'application/x-virt-viewer');
  140. $response->headers->set('Content-Transfer-Encoding', 'Binary');
  141. $response->setCallback(function () use ($content)
  142. {
  143. echo $content;
  144. });
  145. $fileName = Utility::generatePassword(8, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
  146. $fileName .= ".vv";
  147. $response->headers->set(
  148. 'Content-Disposition', "attachment; filename=\"{$fileName}\""
  149. );
  150. $response->send();
  151. exit();
  152. }
  153. /**
  154. * @return Kvm|Lxc
  155. */
  156. protected function vmAsUser(){
  157. if($this->vmAsUser){
  158. return $this->vmAsUser;
  159. }
  160. //User
  161. $vpsUser = $this->getUser();
  162. if (empty($vpsUser->username))
  163. {
  164. throw new \Exception('User does not have permissions to access noVNC console');
  165. }
  166. $serverHost = $this->getWhmcsParamByKey('serverip') ? $this->getWhmcsParamByKey('serverip') : $this->getWhmcsParamByKey('serverhostname');
  167. //Load Users API
  168. if(!preg_match('/\:/', $serverHost) && $this->getWhmcsParamByKey('serverport') ){
  169. $serverHost .=":".$this->getWhmcsParamByKey('serverport');
  170. }
  171. $api = new Api($serverHost, $vpsUser->username, $vpsUser->realm, $vpsUser->getPassword());
  172. $api->debug(ModuleSettings::isDebug());
  173. //websocket
  174. $vm = \ModulesGarden\ProxmoxAddon\Core\Helper\sl('Vm')->getVm();
  175. $vm->setApi($api);
  176. if(!$vm->isRunning()){
  177. throw new \Exception(sl('lang')->abtr("VM not running"));
  178. }
  179. return $this->vmUser = $vm;
  180. }
  181. public function novncProxy(){
  182. $vars=[
  183. 'novncAppUrl' => './modules/addons/proxmoxAddon/templates/client/default/novnc'
  184. ];
  185. if($this->isAdmin()){
  186. $vars['novncAppUrl']= '../modules/addons/proxmoxAddon/templates/client/default/novnc';
  187. }
  188. try{
  189. $vnc = $this->vmAsUser()->vncproxy(1);
  190. $vncHost = $this->vmAsUser()->vncWebsocketPath( $vnc);
  191. $clientIp = sl('request')->getClientIp();
  192. //proxy generate token
  193. $procyService = (new ProxyServiceFactory())->fromModuleConfiguration($this->moduleConfiguration);
  194. $vars['websocketUrl'] = $procyService->proxmox("https://".$vncHost, $clientIp, $this->vmAsUser()->getApi()->getAuthCookieAsArray());
  195. $vars['password'] = $vnc['ticket'];
  196. }catch (\Exception $ex){
  197. $vars['error'] = $ex->getMessage();
  198. }
  199. echo $this->getSmarty()
  200. ->view(ModuleConstants::getFullPathWhmcs().DS.'modules'.DS.'addons'.DS.'proxmoxAddon'.DS.'templates'.DS.'client'.DS.'default'.DS.'pages'.DS.'console'.DS.'novnc', $vars);
  201. exit();
  202. }
  203. public function xtermjsProxy(){
  204. $vars=[
  205. 'appUrl' => './modules/addons/proxmoxAddon/templates/client/default',
  206. ];
  207. if($this->isAdmin()){
  208. $vars['appUrl']= '../modules/addons/proxmoxAddon/templates/client/default';
  209. }
  210. try{
  211. $vnc = $this->vmAsUser()->termproxy();
  212. $vncHost = $this->vmAsUser()->vncWebsocketPath( $vnc);
  213. $clientIp = sl('request')->getClientIp();
  214. //proxy generate token
  215. $procyService = (new ProxyServiceFactory())->fromModuleConfiguration($this->moduleConfiguration);
  216. $vars['websocketUrl'] = $procyService->proxmox("https://".$vncHost, $clientIp, $this->vmAsUser()->getApi()->getAuthCookieAsArray());
  217. $vars['password'] = $vnc['ticket'];
  218. $vars['user'] =$vnc['user'];
  219. }catch (\Exception $ex){
  220. $vars['error'] = $ex->getMessage();
  221. }
  222. echo $this->getSmarty()
  223. ->view(ModuleConstants::getFullPathWhmcs().DS.'modules'.DS.'addons'.DS.'proxmoxAddon'.DS.'templates'.DS.'client'.DS.'default'.DS.'pages'.DS.'console'.DS.'xtermjs', $vars);
  224. exit();
  225. }
  226. }