/app/Http/Controllers/ApplicationsController.php

https://github.com/andreapollastri/cipi · PHP · 169 lines · 156 code · 13 blank · 0 comment · 18 complexity · d4b927c2d11ce12e0fe25640e4b379db MD5 · raw file

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Routing\UrlGenerator;
  4. use Illuminate\Support\Str;
  5. use Illuminate\Http\Request;
  6. use App\Application;
  7. use App\Server;
  8. use App\Alias;
  9. use phpseclib\Net\SSH2 as SSH;
  10. use PDF;
  11. class ApplicationsController extends Controller {
  12. protected $url;
  13. public function __construct(UrlGenerator $url) {
  14. $this->url = $url;
  15. }
  16. public function index() {
  17. $applications = Application::with('server')->with('aliases')->get();
  18. return view('applications', compact('applications'));
  19. }
  20. public function api() {
  21. return Application::orderBy('domain')->get();
  22. }
  23. public function create(Request $request) {
  24. $this->validate($request, [
  25. 'domain' => 'required',
  26. 'server_id' => 'required',
  27. 'php' => 'required'
  28. ]);
  29. if(Application::where('domain', $request->domain)->where('server_id', $request->server_id)->first()) {
  30. $request->session()->flash('alert-error', 'This domain is already taken on this server');
  31. return redirect('/applications');
  32. }
  33. $aliases = Alias::where('domain', $request->domain)->with('application')->get();
  34. foreach($aliases as $alias) {
  35. if($alias->application->server_id == $request->server_id) {
  36. $request->session()->flash('alert-error', 'This domain is already taken on this server');
  37. return redirect('/applications');
  38. }
  39. }
  40. $server = Server::where('id', $request->server_id)->where('status', 2)->firstOrFail();
  41. $user = 'cp'.hash('crc32', (Str::uuid()->toString())).rand(1,9);
  42. $pass = sha1(uniqid().microtime().$request->domain);
  43. $dbpass = sha1(microtime().uniqid().$request->ip);
  44. $appcode= sha1(uniqid().$request->domain.microtime().$request->server_id);
  45. $base = $request->basepath;
  46. $application = Application::create([
  47. 'domain' => $request->domain,
  48. 'server_id' => $request->server_id,
  49. 'username' => $user,
  50. 'password' => $pass,
  51. 'dbpass' => $dbpass,
  52. 'basepath' => $base,
  53. 'php' => $request->php,
  54. 'appcode' => $appcode,
  55. ]);
  56. if(!$application) {
  57. $request->session()->flash('alert-error', 'There was a problem! Retry.');
  58. return redirect('/applications');
  59. }
  60. $ssh = New SSH($server->ip, $server->port);
  61. if(!$ssh->login($server->username, $server->password)) {
  62. $request->session()->flash('alert-error', 'There was a problem with server connection.');
  63. return redirect('/applications');
  64. }
  65. $ssh->setTimeout(360);
  66. if($base) {
  67. $response = $ssh->exec('echo '.$server->password.' | sudo -S sudo sh /cipi/host-add.sh -u '.$user.' -p '.$pass.' -dbp '.$dbpass.' -b '.$base.' -php '.$request->php.' -a '.$appcode.' -r '.$this->url->to('/'));
  68. } else {
  69. $response = $ssh->exec('echo '.$server->password.' | sudo -S sudo sh /cipi/host-add.sh -u '.$user.' -p '.$pass.' -dbp '.$dbpass.' -php '.$request->php.' -a '.$appcode.' -r '.$this->url->to('/'));
  70. }
  71. if(strpos($response, '###CIPI###') === false) {
  72. $request->session()->flash('alert-error', 'There was a problem with server scripts.');
  73. return redirect('/applications');
  74. }
  75. $response = explode('###CIPI###', $response);
  76. if(strpos($response[1], 'Ok') === false) {
  77. $request->session()->flash('alert-error', 'There was a problem with server scripts.');
  78. return redirect('/applications');
  79. }
  80. $app = [
  81. 'user' => $user,
  82. 'pass' => $pass,
  83. 'dbname' => $user,
  84. 'dbuser' => $user,
  85. 'dbpass' => $dbpass,
  86. 'path' => $base,
  87. 'php' => $request->php,
  88. 'domain' => $request->domain,
  89. 'host' => $server->ip,
  90. 'port' => $server->port,
  91. ];
  92. return view('application', compact('app','appcode'));
  93. }
  94. public function destroy(Request $request) {
  95. $this->validate($request, [
  96. 'appcode' => 'required',
  97. ]);
  98. $application = Application::where('appcode', $request->appcode)->firstOrFail();
  99. $ssh = New SSH($application->server->ip, $application->server->port);
  100. if(!$ssh->login($application->server->username, $application->server->password)) {
  101. $request->session()->flash('alert-error', 'There was a problem with server connection.');
  102. return redirect('/applications');
  103. }
  104. $ssh->setTimeout(360);
  105. foreach ($application->aliases as $alias) {
  106. $ssh->exec('echo '.$application->server->password.' | sudo -S unlink /etc/nginx/sites-enabled/'.$alias->domain.'.conf');
  107. $ssh->exec('echo '.$application->server->password.' | sudo -S unlink /etc/nginx/sites-available/'.$alias->domain.'.conf');
  108. }
  109. $ssh->exec('echo '.$application->server->password.' | sudo -S sudo sh /cipi/host-del.sh -u '.$application->username.' -p '.$application->php);
  110. $application->delete();
  111. $request->session()->flash('alert-success', 'Application has been removed!');
  112. return redirect('/applications');
  113. }
  114. public function pdf($appcode) {
  115. $application = Application::where('appcode', $appcode)->firstOrFail();
  116. $data = [
  117. 'username' => $application->username,
  118. 'password' => $application->password,
  119. 'path' => $application->basepath,
  120. 'ip' => $application->server->ip,
  121. 'port' => $application->server->port,
  122. 'domain' => $application->domain,
  123. 'dbpass' => $application->dbpass,
  124. 'php' => $application->php,
  125. ];
  126. $pdf = PDF::loadView('pdf', $data);
  127. return $pdf->download($application->username.'_'.date('YmdHi').'_'.date('s').'.pdf');
  128. }
  129. public static function sslcheck($domain) {
  130. $ssl_check = @fsockopen('ssl://' . $domain, 443, $errno, $errstr, 30);
  131. $res = !! $ssl_check;
  132. if($ssl_check) { fclose($ssl_check); }
  133. return $res;
  134. }
  135. public function ssl($appcode) {
  136. $application = Application::where('appcode', $appcode)->first();
  137. if(!$application) {
  138. return abort(403);
  139. }
  140. $ssh = New SSH($application->server->ip, $application->server->port);
  141. if(!$ssh->login($application->server->username, $application->server->password)) {
  142. return abort(403);
  143. }
  144. $ssh->setTimeout(360);
  145. $response = $ssh->exec('echo '.$application->server->password.' | sudo -S sudo sh /cipi/ssl.sh -d '.$application->domain.' -c '.$application->username);
  146. if(strpos($response, '###CIPI###') === false) {
  147. abort(500);
  148. }
  149. $response = explode('###CIPI###', $response);
  150. if($response[1] == "Ok\n" && $this->sslcheck($application->domain)) {
  151. return 'OK';
  152. } else {
  153. return abort(500);
  154. }
  155. }
  156. }