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

<?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."]);
}
}