ApplicationsController.php 6.6 KB

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