You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
179 lines
6.6 KiB
179 lines
6.6 KiB
<?php |
|
|
|
namespace App\Http\Controllers; |
|
|
|
use Illuminate\Http\Request; |
|
use Illuminate\Support\Str; |
|
|
|
use App\Docker\Container; |
|
use App\Jobs\InitServer; |
|
use App\Models\ExposedPort; |
|
use App\Models\Server; |
|
use App\Models\Service; |
|
use Carbon\Carbon; |
|
use Exception; |
|
use Illuminate\Support\Facades\Auth; |
|
use Inertia\Inertia; |
|
|
|
|
|
class ServerController extends Controller |
|
{ |
|
public function start(Request $request) |
|
{ |
|
$server = Server::where("uuid", $request->id)->first(); |
|
if($server->status_id >= 3) { |
|
try { |
|
$container = new Container($server->container); |
|
$container->start(); |
|
$server->update([ |
|
"status_id" => 1, |
|
"start" => Carbon::now() |
|
]); |
|
return redirect()->back()->withErrors([ "message" => "Serveur lancé avec succès. Attendez quelque seconds avant de vous connectez." ]); |
|
} catch(Exception $e) { return redirect()->back()->withErrors([ "error" => "Impossible de démarré le serveur." ]); } |
|
|
|
} else { return redirect()->back()->withErrors([ "error" => "Serveur déjà ou entrain de démarré." ]); } |
|
} |
|
|
|
public function stop(Request $request) |
|
{ |
|
$server = Server::where("uuid", $request->id)->first(); |
|
if($server->status_id < 3) { |
|
try { |
|
$server->update([ |
|
"status_id" => 3, |
|
"end" => Carbon::now() |
|
]); |
|
$container = new Container($server->container); |
|
$container->stop(); |
|
return redirect()->back()->withErrors([ "message" => "Serveur arrêté avec succès. Merci de votre visite." ]); |
|
} catch(Exception $e) { return redirect()->back()->withErrors([ "error" => "Impossible de d'arrêter le serveur." ]); } |
|
|
|
} else { return redirect()->back()->withErrors([ "error" => "Serveur déjà ou entrain de s'arrêter." ]); } |
|
} |
|
|
|
/** |
|
* Display a listing of the resource. |
|
*/ |
|
public function index() |
|
{ |
|
return Inertia::render("Server/Index", [ |
|
"banner" => "/img/banner.gif", |
|
"servers" => (Auth::user()->admin ? Server::orderBy("start", "DESC")->orderBy("end", "DESC")->get() : Server::where("user_id", Auth::user()->id)->get())->jsonSerialize(), |
|
]); |
|
} |
|
|
|
/** |
|
* Show the form for creating a new resource. |
|
*/ |
|
public function create() |
|
{ |
|
return Inertia::render('Server/Create', [ |
|
"banner" => "/img/banner.jpg", |
|
"services" => Service::all() |
|
]); |
|
} |
|
|
|
/** |
|
* Store a newly created resource in storage. |
|
*/ |
|
public function store(Request $request) |
|
{ |
|
$request->validate([ |
|
"name" => "required|string", |
|
"service" => "required|string", |
|
"launch" => "nullable" |
|
]); |
|
|
|
$user = Auth::user(); |
|
if(!$user->admin && count($user->server) >= 2) return redirect()->back()->withErrors(["error" => "Vous avez déjà trop de servers. Veillez en supprimer un!"]); |
|
|
|
$service = Service::where("uuid", $request->service)->first(); |
|
if(!$service) return redirect()->back()->withErrors(["error" => "Impossible de trouver ce service!"]); |
|
$server = Server::create([ |
|
"uuid" => Str::uuid(), |
|
"name" => preg_replace('/[^a-zA-Z0-9_.-]/', '', $request->name), |
|
"service_id" => $service->id, |
|
"status_id" => 3, |
|
"user_id" => Auth::user()->id |
|
]); |
|
|
|
$config = config($server->service->config); |
|
$ports = explode("|", $server->service->ports); |
|
|
|
for ($i = 0; $i < count($ports); $i++) { |
|
$port = ExposedPort::where("usable", true)->first(); |
|
if(!$port) { |
|
$server->exposedPorts()->update([ "usable" => true ]); |
|
$server->exposedPorts()->detach(); |
|
$server->delete(); |
|
return redirect()->back()->withErrors(["error" => "Aucune place libre pour votre server, réessayer plus tard."]); |
|
} |
|
$server->exposedPorts()->attach($port->id); |
|
$port->update(["usable" => false]); |
|
|
|
$config["ExposedPorts"][$ports[$i] . "/" . $server->service->protocol] = (object)[]; |
|
$config["HostConfig"]["PortBindings"][$ports[$i] . "/" . $server->service->protocol] = [[ "HostPort" => "" . $port->number ]]; |
|
} |
|
|
|
dispatch(new InitServer($server, $config, $request->launch ? true : false)); |
|
return redirect(route("servers.index"))->withErrors([ "message" => "Serveur créer avec succès" . ($request->launch ? " et devrait se lancer d'une minute à l'autre." : ".") ]); |
|
} |
|
|
|
/** |
|
* Display the specified resource. |
|
*/ |
|
public function show(Request $request) |
|
{ |
|
$server = Server::where("uuid", $request->id)->firstOrFail(); |
|
|
|
return Inertia::render("Server/Show", [ |
|
"banner" => "/img/banner.webp", |
|
"server" => $server->jsonSerialize() |
|
]); |
|
} |
|
|
|
/** |
|
* Update the specified resource in storage. |
|
*/ |
|
public function update(Request $request) |
|
{ |
|
$request->validate([ |
|
"name" => "required|string|max:25", |
|
]); |
|
|
|
$server = Server::where("uuid", $request->id)->first(); |
|
$server->update([ |
|
"name" => preg_replace('/[^a-zA-Z0-9_.-]/', '', $request->name) |
|
]); |
|
return redirect()->back()->withErrors(["message" => "Nom changé avec succès."]); |
|
} |
|
|
|
public function makePublic(Request $request) |
|
{ |
|
$server = Server::where("uuid", $request->id)->first(); |
|
$server->update([ |
|
"public" => !$server->public, |
|
]); |
|
return redirect()->back()->withErrors(["message" => $server->public ? "Server rendu publiquement accéssible." : "Server rendu privé."]); |
|
} |
|
|
|
/** |
|
* Remove the specified resource from storage. |
|
*/ |
|
public function destroy(Request $request) |
|
{ |
|
$server = Server::where("uuid", $request->id)->first(); |
|
if($server->container) { |
|
try { |
|
$container = new Container($server->container); |
|
$data = $container->inspect()->State; |
|
if($data->Running || $data->Paused || $data->Restarting) $container->kill(); |
|
} catch(Exception) { return redirect()->back()->withErrors(["error" => "Problème pour éteindre le serveur. Réessayer!"]); } |
|
} |
|
$server->exposedPorts()->update([ "usable" => true ]); |
|
$server->exposedPorts()->detach(); |
|
$server->delete(); |
|
return redirect(route("servers.index"))->withErrors(["message" => "Server supprimer avec succès."]); |
|
} |
|
}
|
|
|