Andrea Pollastri 5 年之前
父节点
当前提交
499534c2a9
共有 5 个文件被更改,包括 464 次插入27 次删除
  1. 69 0
      app/Http/Controllers/ServersController.php
  2. 3 3
      app/Http/Controllers/SetupController.php
  3. 0 24
      public/app.js
  4. 386 0
      resources/views/servers.blade.php
  5. 6 0
      routes/web.php

+ 69 - 0
app/Http/Controllers/ServersController.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use App\Server;
+
+class ServersController extends Controller
+{
+
+    public function index() {
+        $servers = Server::all();
+        return view('servers', compact('servers'));
+    }
+
+    public function create(Request $request) {
+        $this->validate($request, [
+            'name' => 'required',
+            'ip' => 'required'
+        ]);
+        if($request->ip == $request->server('SERVER_ADDR')) {
+            $request->session()->flash('alert-error', 'You can\'t install a client server into the same Cipi Server!');
+            return redirect('/servers');
+        }
+        $usrchars = str_shuffle('abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890');
+        $pwdchars = str_shuffle('abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890-_!?^#()[]{}');
+        Server::create([
+            'name'      => $request->name,
+            'provider'  => $request->provider,
+            'location'  => $request->location,
+            'ip'        => $request->ip,
+            'port'      => 22,
+            'username'  => hash('crc32', substr($usrchars, 0, 64)).uniqid().substr($pwdchars, 0, 11),
+            'password'  => substr($pwdchars, 0, 64),
+            'dbroot'    => substr($pwdchars, 0, 48),
+            'servercode'=> md5(uniqid().microtime().$request->name),
+        ]);
+        $request->session()->flash('alert-success', 'Server '.$request->name.' has been created!');
+        return redirect('/servers');
+    }
+
+    public function changeip(Request $request) {
+        $this->validate($request, [
+            'servercode' => 'required',
+            'ip'         => 'required'
+        ]);
+        $server = Server::where('servercode', $request->servercode)->first();
+        if($request->ip == $request->server('SERVER_ADDR')) {
+            $request->session()->flash('alert-error', 'You can\'t setup the same Cipi IP!');
+            return redirect('/servers');
+        }
+        $server->ip = $request->input('ip');
+        $server->save();
+        $request->session()->flash('alert-success', 'The IP of server '.$server->name.' has been updated!');
+        return redirect('/servers');
+    }
+
+    public function destroy(Request $request) {
+        $this->validate($request, [
+            'servercode' => 'required',
+        ]);
+        $server = Server::where('servercode', $request->servercode)->first();
+        $request->session()->flash('alert-success', 'Server '.$server->name.' has been deleted!');
+        $server->delete();
+        return redirect('/servers');
+    }
+
+}

+ 3 - 3
app/Http/Controllers/SetupController.php

@@ -24,7 +24,7 @@ class SetupController extends Controller
         $user->name  = $request->name;
         $user->name  = $request->name;
         $user->email = $request->email;
         $user->email = $request->email;
         $user->save();
         $user->save();
-        $request->session()->flash('alert-success','Profile has been updated!');
+        $request->session()->flash('alert-success', 'Profile has been updated!');
         return redirect('/settings');
         return redirect('/settings');
     }
     }
 
 
@@ -39,12 +39,12 @@ class SetupController extends Controller
             return redirect('/settings');
             return redirect('/settings');
         }
         }
         if (!Hash::check($request->current, $user->password)) {
         if (!Hash::check($request->current, $user->password)) {
-            $request->session()->flash('alert-error','Wrong password!');
+            $request->session()->flash('alert-error', 'Wrong password!');
             return redirect('/settings');
             return redirect('/settings');
         }
         }
         $user->password = Hash::make($request->password);
         $user->password = Hash::make($request->password);
         $user->save();
         $user->save();
-        $request->session()->flash('alert-success','Password has been updated!');
+        $request->session()->flash('alert-success', 'Password has been updated!');
         return redirect('/settings');
         return redirect('/settings');
     }
     }
 
 

+ 0 - 24
public/app.js

@@ -77,27 +77,3 @@
     //load forms polyfill + iVal feature
     //load forms polyfill + iVal feature
     webshim.polyfill('forms');
     webshim.polyfill('forms');
 })();
 })();
-
-//Cipi cloud icon
-function cloudicon(provider) {
-    switch (provider) {
-        case 'aws':
-            return '<i class="fa-fw fab fa-aws"></i><span style="display:none">'+provider+'</span>';
-            break;
-        case 'linode':
-            return '<i class="fa-fw fab fa-linode"></i><span style="display:none">'+provider+'</span>';
-            break;
-        case 'do':
-            return '<i class="fa-fw fab fa-digital-ocean"></i><span style="display:none">'+provider+'</span>';
-            break;
-        case 'google':
-            return '<i class="fa-fw fab fa-google"></i><span style="display:none">'+provider+'</span>';
-            break;
-        case 'azure':
-            return '<i class="fa-fw fab fa-microsoft"></i><span style="display:none">'+provider+'</span>';
-            break;
-        default:
-            return '<span style="font-size:10px;font-weight:400;text-transform:capitalize;">'+provider+'</span>';
-            break;
-    }
-}

+ 386 - 0
resources/views/servers.blade.php

@@ -0,0 +1,386 @@
+@extends('layouts.app')
+
+
+
+@section('title')
+Servers
+@endsection
+
+
+
+@section('content')
+<div class="row">
+    <div class="col">
+        <a href="#" class="btn btn-sm btn-primary shadow-sm float-right" data-toggle="modal" data-target="#createModal">
+            <i class="fas fa-plus fa-sm text-white-50"></i> CREATE NEW
+        </a>
+    </div>
+</div>
+<div class="space"></div>
+@if(Session::has('alert-success'))
+    <div class="alert alert-success" role="alert">
+        <b><i class="fa fa-check" aria-hidden="true"></i></b> {{ Session::get('alert-success') }}
+    </div>
+@endif
+    @if(Session::has('alert-error'))
+    <div class="alert alert-danger" role="alert">
+        <b><i class="fa fa-times" aria-hidden="true"></i></b> {{ Session::get('alert-error') }}
+    </div>
+@endif
+<div class="card shadow mb-4">
+    <div class="card-body">
+        <div class="table-responsive">
+            <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
+                <thead>
+                    <tr>
+                        <th class="text-center">Server</th>
+                        <th class="text-center">IP</th>
+                        <th class="text-center d-none d-lg-table-cell">Provider</th>
+                        <th class="text-center d-none d-lg-table-cell">Location</th>
+                        <th class="text-center">Actions</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach ($servers as $server)
+                        <tr>
+                            <td class="text-center">
+                                @if ($server->complete == 0)
+                                    <button type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#setupModal" data-servercode="{{ $server->servercode }}" data-serverip="{{ $server->ip }}">"{{ $server->name }}" has to be install</button>
+                                @elseif ($server->complete == 1)
+                                    <button type="button" class="btn btn-warning btn-sm">"{{ $server->name }}" is coming...</button>
+                                @else
+                                    {{ $server->name }}
+                                @endif
+                            </td>
+                            <td class="text-center">
+                                {{ $server->ip }}
+                                <i data-toggle="modal" data-target="#changeipModal" class="far fa-edit" data-servercode="{{ $server->servercode }}" data-serverip="{{ $server->ip }}" style="color:gray; cursor: pointer;"></i>
+                            </td>
+                            <td class="text-center d-none d-lg-table-cell">
+                                @switch($server->provider)
+                                    @case('aws')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('Aws')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('AWS')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('Amazon')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('amazon')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('AMAZON')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('AmazonWebService')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('Amazon web service')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('amazonwebservice')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('AMAZONWEBSERVICE')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('Amazon Web Service')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('amazon web service')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('AMAZON WEB SERVICE')
+                                        <i class="fab fa-aws"></i>
+                                        @break
+                                    @case('DO')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('do')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('Digital Ocean')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('digitalocean')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('DIGITAL OCEAN')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('digital ocean')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('DigitalOcean')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('DIGITALOCEAN')
+                                        <i class="fab fa-digital-ocean"></i>
+                                        @break
+                                    @case('Google')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('google')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('GOOGLE')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('GoogleCloud')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('Google Cloud')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('google cloud')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('GOOGLE CLOUD')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('GOOGLECLOUD')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('googlecloud')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('glg')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('GLG')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @case('Glg')
+                                        <i class="fab fa-google"></i>
+                                        @break
+                                    @default
+                                    {{ $server->provider }}
+                                @endswitch
+                            </td>
+                            <td class="text-center d-none d-lg-table-cell">{{ $server->location }}</td>
+                            <td class="text-center">
+                            <i data-toggle="modal" data-target="#deleteModal" class="fas fa-trash-alt" data-servercode="{{ $server->servercode }}" data-servername="{{ $server->name }}" style="color:gray; cursor: pointer;"></i>
+                            </td>
+                        </tr>
+                    @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+@endsection
+
+
+
+@section('extra')
+<!-- CREATE -->
+<div class="modal fade" id="createModal" tabindex="-1" role="dialog" aria-labelledby="createModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <form action="/server/create" method="POST" class="ws-validate">
+                @csrf
+                <div class="modal-header">
+                    <h5 class="modal-title" id="createModalLabel">Create a new server</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group row">
+                        <label for="name" class="col-md-4 col-form-label text-md-right">Name*</label>
+                        <div class="col-md-6">
+                            <div class="form-group">
+                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" required autocomplete="off" autofocus placeholder="E.g. 'Production'">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="ip" class="col-md-4 col-form-label text-md-right">Ip*</label>
+                        <div class="col-md-6">
+                            <div class="form-group">
+                                <input id="ip" type="text" class="form-control" name="ip" autocomplete="off" required placeholder="E.g. '123.123.123.123'">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="provider" class="col-md-4 col-form-label text-md-right">Provider</label>
+                        <div class="col-md-6">
+                            <div class="form-group">
+                                <input id="provider" type="text" class="form-control" name="provider" autocomplete="off" placeholder="E.g. 'Digital Ocean'">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label for="location" class="col-md-4 col-form-label text-md-right">Location</label>
+                        <div class="col-md-6">
+                            <div class="form-group">
+                                <input id="location" type="text" class="form-control" name="location" autocomplete="off" placeholder="E.g. 'New York - NYC3'">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                    <button type="submit" class="btn btn-primary">Create server</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+
+<!-- SETUP -->
+<div class="modal fade" id="setupModal" tabindex="-1" role="dialog" aria-labelledby="setupModalLabel" aria-hidden="true">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="setupModalLabel">Server Setup</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                To install your server:<br>
+                <ul>
+                    <li>Use a clean VPS with Ubuntu Server 18.04</li>
+                    <li>Login into your VPS via SSH (as root):<br>
+                        <code><i>ssh root@<span class="server-ip"></span></i></code>
+                    </li>
+                    <li>Run this command:<br>
+                        <code><i>wget -O - {{ url('/sh/go') }}/<span class="server-id"></span>/ | bash</i></code>
+                    </li>
+                    <li>Installation may take up to about 5 minutes minimum which may also depend on your server internet speed</li>
+                    <li>Before install Cipi, please make sure your server is an Ubuntu 18.04 x86_64 LTS (Fresh installation)</li>
+                    <li>Hardware Requirement: More than 1GB of HDD / At least 1 core processor / 512MB minimum RAM / At least 1 public IP Address</li>
+                    <li>Please open port 22, 80 and 443 to install Cipi</li>
+                    <li>Cipi would not work with NAT VPN and OpenVZ</li>
+                    <li>AWS by default disables root login. To login as root inside AWS, login as default user and then use command sudo -s</li>
+                </ul>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<!-- CHANGE IP -->
+<div class="modal fade" id="changeipModal" tabindex="-1" role="dialog" aria-labelledby="changeipModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <form action="/server/changeip" method="POST" class="ws-validate">
+                @csrf
+                <input type="hidden" name="servercode" id="server-code-ip" value="">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="changeipModalLabel">Update Server IP</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class=" row">
+                        <div class="col-sm-12">
+                            <div class="form-group">
+                                <input type="text" id="server-ip" required class="form-control" name="ip">
+                            </div>
+                            <i class="fas fa-exclamation-circle" style="margin-left: 5px;"></i> Before submit changes, be sure about your new IP!
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                    <button type="submit" class="btn btn-primary">Update</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+
+<!-- DELETE -->
+<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <form action="/server/destroy" method="POST" class="ws-validate">
+                @csrf
+                <input type="hidden" name="servercode" id="server-code" value="">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="deleteModalLabel">Delete server</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class=" row">
+                        <div class="col-sm-12">
+                            <h4>Are you sure to delete server <b><span id="server-name"></span></b>?</h4>
+                            <div style="min-height: 20px;"></div>
+                            <div class="form-group">
+                                <select class="form-control" name="server_id" required id="server-list">
+                                    <option value="">Select...</option>
+                                    <option value="">YES! I'm sure!!!</option>
+                                </select>
+                            </div>
+                            <div style="min-height: 20px;"></div>
+                            <h6 class="text-danger">You can not reverse this action.</h6>
+                            <h6 class="text-danger">You will loose control on this server</h6>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                    <button type="submit" class="btn btn-primary">Delete server</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+@endsection
+
+
+
+@section('css')
+<link rel="stylesheet" href="https://allyoucan.cloud/cdn/datatable/1.10.13/css/dataTables.css">
+@endsection
+
+
+
+@section('js')
+<script src="https://allyoucan.cloud/cdn/datatable/1.10.13/js/dataTables.js"></script>
+<script>
+	$(document).ready(function() {
+		$('#dataTable').DataTable();
+	});
+</script>
+<script>
+$('#setupModal').on('show.bs.modal', function (event) {
+    var button = $(event.relatedTarget)
+    var servercode = button.data('servercode')
+    var serverip = button.data('serverip')
+    var modal = $(this)
+    modal.find('.server-id').text(servercode)
+    modal.find('.server-ip').text(serverip)
+})
+</script>
+<script>
+$('#deleteModal').on('show.bs.modal', function (event) {
+    var button = $(event.relatedTarget)
+    var servercode = button.data('servercode')
+    var servername = button.data('servername')
+    var modal = $(this)
+    modal.find('#server-code').val(servercode)
+    modal.find('#server-name').text(servername)
+})
+$('#changeipModal').on('show.bs.modal', function (event) {
+    var button = $(event.relatedTarget)
+    var servercode = button.data('servercode')
+    var serverip = button.data('serverip')
+    var modal = $(this)
+    modal.find('#server-code-ip').val(servercode)
+    modal.find('#server-ip').val(serverip)
+})
+</script>
+@endsection

+ 6 - 0
routes/web.php

@@ -32,6 +32,12 @@ Route::group(['prefix' => 'sh'], function () {
 
 
 Route::group(['middleware' => 'auth'], function () {
 Route::group(['middleware' => 'auth'], function () {
     Route::get('/dashboard', 'DashboardController@index');
     Route::get('/dashboard', 'DashboardController@index');
+    Route::get('/servers', 'ServersController@index');
+    Route::group(['prefix' => 'server'], function () {
+        Route::post('/create', 'ServersController@create');
+        Route::post('/destroy', 'ServersController@destroy');
+        Route::post('/changeip', 'ServersController@changeip');
+    });
     Route::group(['prefix' => 'settings'], function () {
     Route::group(['prefix' => 'settings'], function () {
         Route::get('/', 'SetupController@index');
         Route::get('/', 'SetupController@index');
         Route::post('/profile', 'SetupController@profile');
         Route::post('/profile', 'SetupController@profile');