ApplicationsController.php 5.8 KB

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