commit
e0f9f27414
28
README.md
28
README.md
|
@ -8,7 +8,7 @@ Despite what the name infers this self hosted web app isn't just for storing idl
|
||||||
a [YABs](https://github.com/masonr/yet-another-bench-script) output you can get disk & network speed values along with
|
a [YABs](https://github.com/masonr/yet-another-bench-script) output you can get disk & network speed values along with
|
||||||
GeekBench 5 scores to do easier comparing and sorting.
|
GeekBench 5 scores to do easier comparing and sorting.
|
||||||
|
|
||||||
[![Generic badge](https://img.shields.io/badge/version-2.1.5-blue.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Laravel-9.0-red.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/PHP-8.1-purple.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Bootstrap-5.1-pink.svg)](https://shields.io/)
|
[![Generic badge](https://img.shields.io/badge/version-2.1.6-blue.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Laravel-9.0-red.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/PHP-8.1-purple.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Bootstrap-5.1-pink.svg)](https://shields.io/)
|
||||||
|
|
||||||
<img src="https://raw.githubusercontent.com/cp6/my-idlers/main/public/My%20Idlers%20logo.jpg" width="128" height="128" />
|
<img src="https://raw.githubusercontent.com/cp6/my-idlers/main/public/My%20Idlers%20logo.jpg" width="128" height="128" />
|
||||||
|
|
||||||
|
@ -20,14 +20,12 @@ GeekBench 5 scores to do easier comparing and sorting.
|
||||||
|
|
||||||
[Cloud Five Limited](https://cloud-v.net/) for providing the hosting for demo installation.
|
[Cloud Five Limited](https://cloud-v.net/) for providing the hosting for demo installation.
|
||||||
|
|
||||||
## 2.1.5 changes (7th September 2022):
|
## 2.1.6 changes (22th September 2022):
|
||||||
|
|
||||||
#### Note:
|
#### You can no longer use the form to submit YABS results
|
||||||
yabs.sh now has JSON formatted response and it is possible to POST the output directly from calling the script.
|
yabs.sh now has JSON formatted response and can POST the output directly from calling the script.
|
||||||
|
|
||||||
This will become the only method to add YABS results but using the form method still works for now.
|
With My idlers you can use your API key and the server id to directly POST the benchmark result
|
||||||
|
|
||||||
This version updates the yabs/ POST API to include the server id and your api key:
|
|
||||||
|
|
||||||
`http://domain.com/api/yabs/tnSJLyhz/USERAPIKEYISHERE`
|
`http://domain.com/api/yabs/tnSJLyhz/USERAPIKEYISHERE`
|
||||||
|
|
||||||
|
@ -42,11 +40,17 @@ php artisan route:cache
|
||||||
php artisan cache:clear
|
php artisan cache:clear
|
||||||
```
|
```
|
||||||
|
|
||||||
* Added YABS JSON parsing
|
* Removed old method and functions for adding a YABS result
|
||||||
* Updated store YABS API function (Uses yabs.sh JSON)
|
* Fixed YABS JSON parser disk being the ram value
|
||||||
* Updated YABS POST API request (Uses yabs.sh JSON)
|
* Fixed YABS JSON parser disk conversion (MB & GB)
|
||||||
* Updated server show page to display code to run and post a YABS on server
|
* Fixed YABS JSON parser RAM conversion (MB & GB)
|
||||||
* Updated pricing model insertPricing() func
|
* Fixed OS icons for server index page (showing wrongly)
|
||||||
|
* Added custom HTTP error pages
|
||||||
|
* Updated yabs table for gb5 values to be nullable
|
||||||
|
* Updated error alert component
|
||||||
|
* Updated posting YABS now clears relevant caches
|
||||||
|
* Updated models and controllers to use first()
|
||||||
|
* Update yabs compare view blade for nullable values
|
||||||
|
|
||||||
## Requires
|
## Requires
|
||||||
|
|
||||||
|
|
|
@ -7,23 +7,5 @@ use Illuminate\Http\Request;
|
||||||
|
|
||||||
class DiskSpeedController extends Controller
|
class DiskSpeedController extends Controller
|
||||||
{
|
{
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function store(Request $request)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function destroy(DiskSpeed $diskSpeed)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ class DomainsController extends Controller
|
||||||
|
|
||||||
public function show(Domains $domain)
|
public function show(Domains $domain)
|
||||||
{//Need to modern
|
{//Need to modern
|
||||||
$domain_info = Domains::domain($domain->id)[0];
|
$domain_info = Domains::domain($domain->id);
|
||||||
return view('domains.show', compact(['domain_info']));
|
return view('domains.show', compact(['domain_info']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ class DomainsController extends Controller
|
||||||
|
|
||||||
public function edit(Domains $domain)
|
public function edit(Domains $domain)
|
||||||
{
|
{
|
||||||
$domain_info = Domains::domain($domain->id)[0];
|
$domain_info = Domains::domain($domain->id);
|
||||||
return view('domains.edit', compact(['domain_info']));
|
return view('domains.edit', compact(['domain_info']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ class MiscController extends Controller
|
||||||
|
|
||||||
public function show(Misc $misc)
|
public function show(Misc $misc)
|
||||||
{
|
{
|
||||||
$misc_data = Misc::misc($misc->id)[0];
|
$misc_data = Misc::misc($misc->id);
|
||||||
return view('misc.show', compact(['misc_data']));
|
return view('misc.show', compact(['misc_data']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ class MiscController extends Controller
|
||||||
|
|
||||||
public function edit(Misc $misc)
|
public function edit(Misc $misc)
|
||||||
{
|
{
|
||||||
$misc_data = Misc::misc($misc->id)[0];
|
$misc_data = Misc::misc($misc->id);
|
||||||
return view('misc.edit', compact('misc_data'));
|
return view('misc.edit', compact('misc_data'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,18 +7,4 @@ use Illuminate\Http\Request;
|
||||||
|
|
||||||
class NetworkSpeedController extends Controller
|
class NetworkSpeedController extends Controller
|
||||||
{
|
{
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function show(NetworkSpeed $networkSpeed)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function destroy(NetworkSpeed $networkSpeed)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,6 @@ class ResellerController extends Controller
|
||||||
|
|
||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
|
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'domain' => 'required|min:4',
|
'domain' => 'required|min:4',
|
||||||
'reseller_type' => 'required',
|
'reseller_type' => 'required',
|
||||||
|
@ -94,13 +93,13 @@ class ResellerController extends Controller
|
||||||
|
|
||||||
public function show(Reseller $reseller)
|
public function show(Reseller $reseller)
|
||||||
{
|
{
|
||||||
$reseller = Reseller::resellerHosting($reseller->id)[0];
|
$reseller = Reseller::resellerHosting($reseller->id);
|
||||||
return view('reseller.show', compact(['reseller']));
|
return view('reseller.show', compact(['reseller']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Reseller $reseller)
|
public function edit(Reseller $reseller)
|
||||||
{
|
{
|
||||||
$reseller = Reseller::resellerHosting($reseller->id)[0];
|
$reseller = Reseller::resellerHosting($reseller->id);
|
||||||
return view('reseller.edit', compact(['reseller']));
|
return view('reseller.edit', compact(['reseller']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,13 +78,13 @@ class SeedBoxesController extends Controller
|
||||||
|
|
||||||
public function show(SeedBoxes $seedbox)
|
public function show(SeedBoxes $seedbox)
|
||||||
{
|
{
|
||||||
$seedbox_data = SeedBoxes::seedbox($seedbox->id)[0];
|
$seedbox_data = SeedBoxes::seedbox($seedbox->id);
|
||||||
return view('seedboxes.show', compact(['seedbox_data']));
|
return view('seedboxes.show', compact(['seedbox_data']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(SeedBoxes $seedbox)
|
public function edit(SeedBoxes $seedbox)
|
||||||
{
|
{
|
||||||
$seedbox_data = SeedBoxes::seedbox($seedbox->id)[0];
|
$seedbox_data = SeedBoxes::seedbox($seedbox->id);
|
||||||
return view('seedboxes.edit', compact(['seedbox_data']));
|
return view('seedboxes.edit', compact(['seedbox_data']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,14 +118,14 @@ class ServerController extends Controller
|
||||||
|
|
||||||
public function show(Server $server)
|
public function show(Server $server)
|
||||||
{
|
{
|
||||||
$server_data = Server::server($server->id)[0];
|
$server_data = Server::server($server->id);
|
||||||
|
|
||||||
return view('servers.show', compact(['server_data']));
|
return view('servers.show', compact(['server_data']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Server $server)
|
public function edit(Server $server)
|
||||||
{
|
{
|
||||||
$server_data = Server::server($server->id)[0];
|
$server_data = Server::server($server->id);
|
||||||
|
|
||||||
return view('servers.edit', compact(['server_data']));
|
return view('servers.edit', compact(['server_data']));
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,13 +90,13 @@ class SharedController extends Controller
|
||||||
|
|
||||||
public function show(Shared $shared)
|
public function show(Shared $shared)
|
||||||
{
|
{
|
||||||
$shared = Shared::sharedHosting($shared->id)[0];
|
$shared = Shared::sharedHosting($shared->id);
|
||||||
return view('shared.show', compact(['shared']));
|
return view('shared.show', compact(['shared']));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(Shared $shared)
|
public function edit(Shared $shared)
|
||||||
{
|
{
|
||||||
$shared = Shared::sharedHosting($shared->id)[0];
|
$shared = Shared::sharedHosting($shared->id);
|
||||||
return view('shared.edit', compact(['shared']));
|
return view('shared.edit', compact(['shared']));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,100 +22,12 @@ class YabsController extends Controller
|
||||||
|
|
||||||
public function create()
|
public function create()
|
||||||
{
|
{
|
||||||
$Servers = Server::all();
|
abort(404);//Use new YABS json output POST method -s "URL"
|
||||||
return view('yabs.create', compact(['Servers']));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
$process = new Process();
|
abort(404);//Storing YABS now done through APiController
|
||||||
|
|
||||||
$yabs = $process->yabsOutputAsJson($request->server_id, $request->yabs);
|
|
||||||
|
|
||||||
if (isset($yabs['error_id'])) {
|
|
||||||
return back()->withErrors(["yabs" => 'Problem inserting YABs. Error id ' . $yabs['error_id']])->withInput();
|
|
||||||
}
|
|
||||||
//No errors, do insert
|
|
||||||
|
|
||||||
$yabs_id = Str::random(8);
|
|
||||||
|
|
||||||
Yabs::create([
|
|
||||||
'id' => $yabs_id,
|
|
||||||
'server_id' => $request->server_id,
|
|
||||||
'has_ipv6' => $yabs['has_ipv6'],
|
|
||||||
'aes' => $yabs['aes'],
|
|
||||||
'vm' => $yabs['vm'],
|
|
||||||
'output_date' => $yabs['output_date'],
|
|
||||||
'cpu_cores' => $yabs['cpu_cores'],
|
|
||||||
'cpu_freq' => $yabs['cpu_freq'],
|
|
||||||
'cpu_model' => $yabs['cpu'],
|
|
||||||
'ram' => $yabs['ram'],
|
|
||||||
'ram_type' => $yabs['ram_type'],
|
|
||||||
'ram_mb' => $yabs['ram_mb'],
|
|
||||||
'swap' => $yabs['swap'],
|
|
||||||
'swap_type' => $yabs['swap_type'],
|
|
||||||
'swap_mb' => $yabs['swap_mb'],
|
|
||||||
'disk' => $yabs['disk'],
|
|
||||||
'disk_type' => $yabs['disk_type'],
|
|
||||||
'disk_gb' => $yabs['disk_gb'],
|
|
||||||
'gb5_single' => $yabs['GB5_single'],
|
|
||||||
'gb5_multi' => $yabs['GB5_mult'],
|
|
||||||
'gb5_id' => $yabs['GB5_id'],
|
|
||||||
'uptime' => $yabs['uptime'],
|
|
||||||
'distro' => $yabs['distro'],
|
|
||||||
'kernel' => $yabs['kernel']
|
|
||||||
]);
|
|
||||||
|
|
||||||
DiskSpeed::create([
|
|
||||||
'id' => $yabs_id,
|
|
||||||
'server_id' => $request->server_id,
|
|
||||||
'd_4k' => $yabs['disk_speed']['4k_total'],
|
|
||||||
'd_4k_type' => $yabs['disk_speed']['4k_total_type'],
|
|
||||||
'd_4k_as_mbps' => $yabs['disk_speed']['4k_total_mbps'],
|
|
||||||
'd_64k' => $yabs['disk_speed']['64k_total'],
|
|
||||||
'd_64k_type' => $yabs['disk_speed']['64k_total_type'],
|
|
||||||
'd_64k_as_mbps' => $yabs['disk_speed']['64k_total_mbps'],
|
|
||||||
'd_512k' => $yabs['disk_speed']['512k_total'],
|
|
||||||
'd_512k_type' => $yabs['disk_speed']['512k_total_type'],
|
|
||||||
'd_512k_as_mbps' => $yabs['disk_speed']['512k_total_mbps'],
|
|
||||||
'd_1m' => $yabs['disk_speed']['1m_total'],
|
|
||||||
'd_1m_type' => $yabs['disk_speed']['1m_total_type'],
|
|
||||||
'd_1m_as_mbps' => $yabs['disk_speed']['1m_total_mbps']
|
|
||||||
]);
|
|
||||||
|
|
||||||
foreach ($yabs['network_speed'] as $y) {
|
|
||||||
NetworkSpeed::create([
|
|
||||||
'id' => $yabs_id,
|
|
||||||
'server_id' => $request->server_id,
|
|
||||||
'location' => $y['location'],
|
|
||||||
'send' => $y['send'],
|
|
||||||
'send_type' => $y['send_type'],
|
|
||||||
'send_as_mbps' => $y['send_type_mbps'],
|
|
||||||
'receive' => $y['receive'],
|
|
||||||
'receive_type' => $y['receive_type'],
|
|
||||||
'receive_as_mbps' => $y['receive_type_mbps']
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$update_server = DB::table('servers')
|
|
||||||
->where('id', $request->server_id)
|
|
||||||
->update([
|
|
||||||
'ram' => $yabs['ram'],
|
|
||||||
'ram_type' => $yabs['ram_type'],
|
|
||||||
'ram_as_mb' => ($yabs['ram_type'] === 'GB') ? ($yabs['ram'] * 1024) : $yabs['ram'],
|
|
||||||
'disk' => $yabs['disk'],
|
|
||||||
'disk_type' => $yabs['disk_type'],
|
|
||||||
'disk_as_gb' => ($yabs['disk_type'] === 'TB') ? ($yabs['disk'] * 1024) : $yabs['disk'],
|
|
||||||
'cpu' => $yabs['cpu_cores'],
|
|
||||||
'has_yabs' => 1
|
|
||||||
]);
|
|
||||||
|
|
||||||
Cache::forget('all_active_servers');//all servers cache
|
|
||||||
Cache::forget('non_active_servers');//all servers cache
|
|
||||||
Cache::forget('all_yabs');//Forget the all YABs cache
|
|
||||||
|
|
||||||
return redirect()->route('yabs.index')
|
|
||||||
->with('success', 'Success inserting YABs');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show(Yabs $yab)
|
public function show(Yabs $yab)
|
||||||
|
@ -145,9 +57,15 @@ class YabsController extends Controller
|
||||||
public function chooseYabsCompare()
|
public function chooseYabsCompare()
|
||||||
{
|
{
|
||||||
$all_yabs = Yabs::allYabs();
|
$all_yabs = Yabs::allYabs();
|
||||||
|
|
||||||
|
if (isset($all_yabs[1])){
|
||||||
return view('yabs.choose-compare', compact('all_yabs'));
|
return view('yabs.choose-compare', compact('all_yabs'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return redirect()->route('yabs.index')
|
||||||
|
->with('error', 'You need atleast 2 YABS to do a compare');
|
||||||
|
}
|
||||||
|
|
||||||
public function compareYabs($yabs1, $yabs2)
|
public function compareYabs($yabs1, $yabs2)
|
||||||
{
|
{
|
||||||
$yabs1_data = Yabs::yabs($yabs1);
|
$yabs1_data = Yabs::yabs($yabs1);
|
||||||
|
@ -171,5 +89,4 @@ class YabsController extends Controller
|
||||||
return Yabs::buildYabsArray($all_yabs);
|
return Yabs::buildYabsArray($all_yabs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Domains extends Model
|
||||||
{//Single domains and relationships (no using joins)
|
{//Single domains and relationships (no using joins)
|
||||||
return Cache::remember("domain.$domain_id", now()->addMonth(1), function () use ($domain_id) {
|
return Cache::remember("domain.$domain_id", now()->addMonth(1), function () use ($domain_id) {
|
||||||
return Domains::where('id', $domain_id)
|
return Domains::where('id', $domain_id)
|
||||||
->with(['provider', 'price', 'labels', 'labels.label'])->get();
|
->with(['provider', 'price', 'labels', 'labels.label'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ class Misc extends Model
|
||||||
{//Single misc and relationships (no using joins)
|
{//Single misc and relationships (no using joins)
|
||||||
return Cache::remember("misc.$misc_id", now()->addMonth(1), function () use ($misc_id) {
|
return Cache::remember("misc.$misc_id", now()->addMonth(1), function () use ($misc_id) {
|
||||||
return Misc::where('id', $misc_id)
|
return Misc::where('id', $misc_id)
|
||||||
->with(['price'])->get();
|
->with(['price'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ class Reseller extends Model
|
||||||
{//Single reseller hosting and relationships (no using joins)
|
{//Single reseller hosting and relationships (no using joins)
|
||||||
return Cache::remember("reseller_hosting.$shared_id", now()->addMonth(1), function () use ($shared_id) {
|
return Cache::remember("reseller_hosting.$shared_id", now()->addMonth(1), function () use ($shared_id) {
|
||||||
return Reseller::where('id', $shared_id)
|
return Reseller::where('id', $shared_id)
|
||||||
->with(['location', 'provider', 'price', 'ips', 'labels', 'labels.label'])->get();
|
->with(['location', 'provider', 'price', 'ips', 'labels', 'labels.label'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ class SeedBoxes extends Model
|
||||||
{//Single seedbox and relationships (no using joins)
|
{//Single seedbox and relationships (no using joins)
|
||||||
return Cache::remember("seedbox.$seedbox_id", now()->addMonth(1), function () use ($seedbox_id) {
|
return Cache::remember("seedbox.$seedbox_id", now()->addMonth(1), function () use ($seedbox_id) {
|
||||||
return SeedBoxes::where('id', $seedbox_id)
|
return SeedBoxes::where('id', $seedbox_id)
|
||||||
->with(['location', 'provider', 'price', 'labels.label'])->get();
|
->with(['location', 'provider', 'price', 'labels.label'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ class Server extends Model
|
||||||
{//Single server and relationships (no using joins)
|
{//Single server and relationships (no using joins)
|
||||||
return Cache::remember("server.$server_id", now()->addMonth(1), function () use ($server_id) {
|
return Cache::remember("server.$server_id", now()->addMonth(1), function () use ($server_id) {
|
||||||
return Server::where('id', $server_id)
|
return Server::where('id', $server_id)
|
||||||
->with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels', 'labels.label'])->get();
|
->with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels', 'labels.label'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,17 +91,17 @@ class Server extends Model
|
||||||
return "<i class='fas fa-expand' title='{$os_name}'></i>";
|
return "<i class='fas fa-expand' title='{$os_name}'></i>";
|
||||||
} else if ($os <= 3) {//Centos
|
} else if ($os <= 3) {//Centos
|
||||||
return "<i class='fab fa-centos os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-centos os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 3 && $os <= 6) {//Debain
|
} elseif ($os > 7 && $os <= 11) {//Debain
|
||||||
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 6 && $os < 10) {//Fedora
|
} elseif ($os > 12 && $os < 15) {//Fedora
|
||||||
return "<i class='fab fa-fedora os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-fedora os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 10 && $os < 13) {//FreeBSD
|
} elseif ($os > 14 && $os < 18) {//FreeBSD
|
||||||
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 13 && $os < 16) {//OpenBSD
|
} elseif ($os > 17 && $os < 21) {//OpenBSD
|
||||||
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-linux os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 15 && $os < 21) {//Ubuntu
|
} elseif ($os > 25 && $os < 32) {//Ubuntu
|
||||||
return "<i class='fab fa-ubuntu os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-ubuntu os-icon' title='{$os_name}'></i>";
|
||||||
} elseif ($os > 20 && $os < 26) {//Windows
|
} elseif ($os > 32 && $os < 38) {//Windows
|
||||||
return "<i class='fab fa-windows os-icon' title='{$os_name}'></i>";
|
return "<i class='fab fa-windows os-icon' title='{$os_name}'></i>";
|
||||||
} else {//OTHER ISO CUSTOM etc
|
} else {//OTHER ISO CUSTOM etc
|
||||||
return "<i class='fas fa-compact-disc os-icon' title='{$os_name}'></i>";
|
return "<i class='fas fa-compact-disc os-icon' title='{$os_name}'></i>";
|
||||||
|
|
|
@ -30,7 +30,7 @@ class Shared extends Model
|
||||||
{//Single shared hosting and relationships (no using joins)
|
{//Single shared hosting and relationships (no using joins)
|
||||||
return Cache::remember("shared_hosting.$shared_id", now()->addMonth(1), function () use ($shared_id) {
|
return Cache::remember("shared_hosting.$shared_id", now()->addMonth(1), function () use ($shared_id) {
|
||||||
return Shared::where('id', $shared_id)
|
return Shared::where('id', $shared_id)
|
||||||
->with(['location', 'provider', 'price', 'ips', 'labels', 'labels.label'])->get();
|
->with(['location', 'provider', 'price', 'ips', 'labels', 'labels.label'])->first();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ class Yabs extends Model
|
||||||
|
|
||||||
$yabs_id = Str::random(8);
|
$yabs_id = Str::random(8);
|
||||||
|
|
||||||
if ($ram > 10) {
|
if ($ram > 999999) {
|
||||||
$ram_f = ($ram / 1024 / 1024);
|
$ram_f = ($ram / 1024 / 1024);
|
||||||
$ram_type = 'GB';
|
$ram_type = 'GB';
|
||||||
} else {
|
} else {
|
||||||
|
@ -204,11 +204,11 @@ class Yabs extends Model
|
||||||
$ram_type = 'MB';
|
$ram_type = 'MB';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($disk > 10000) {
|
if ($disk > 100000000) {
|
||||||
$disk_f = ($ram / 1024 / 1024);
|
$disk_f = ($disk / 1024 / 1024 / 1024);
|
||||||
$disk_type = 'TB';
|
$disk_type = 'TB';
|
||||||
} else {
|
} else {
|
||||||
$disk_f = ($ram / 1024);
|
$disk_f = ($disk / 1024 / 1024);
|
||||||
$disk_type = 'GB';
|
$disk_type = 'GB';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,23 +242,23 @@ class Yabs extends Model
|
||||||
//Fio
|
//Fio
|
||||||
foreach ($data['fio'] as $ds) {
|
foreach ($data['fio'] as $ds) {
|
||||||
if ($ds['bs'] === '4k') {
|
if ($ds['bs'] === '4k') {
|
||||||
$d4k = ($ds['speed_rw'] > 1000000) ? ($ds['speed_rw'] / 1000) : $ds['speed_rw'];
|
$d4k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
|
||||||
$d4k_type = ($ds['speed_rw'] > 1000000) ? 'GB/s' : 'MB/s';
|
$d4k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
|
||||||
$d4k_mbps = self::KBstoMBs($ds['speed_rw']);
|
$d4k_mbps = self::KBstoMBs($ds['speed_rw']);
|
||||||
}
|
}
|
||||||
if ($ds['bs'] === '64k') {
|
if ($ds['bs'] === '64k') {
|
||||||
$d64k = ($ds['speed_rw'] > 1000000) ? ($ds['speed_rw'] / 1000) : $ds['speed_rw'];
|
$d64k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
|
||||||
$d64k_type = ($ds['speed_rw'] > 1000000) ? 'GB/s' : 'MB/s';
|
$d64k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
|
||||||
$d64k_mbps = self::KBstoMBs($ds['speed_rw']);
|
$d64k_mbps = self::KBstoMBs($ds['speed_rw']);
|
||||||
}
|
}
|
||||||
if ($ds['bs'] === '512k') {
|
if ($ds['bs'] === '512k') {
|
||||||
$d512k = ($ds['speed_rw'] > 1000000) ? ($ds['speed_rw'] / 1000) : $ds['speed_rw'];
|
$d512k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
|
||||||
$d512k_type = ($ds['speed_rw'] > 1000000) ? 'GB/s' : 'MB/s';
|
$d512k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
|
||||||
$d512k_mbps = self::KBstoMBs($ds['speed_rw']);
|
$d512k_mbps = self::KBstoMBs($ds['speed_rw']);
|
||||||
}
|
}
|
||||||
if ($ds['bs'] === '1m') {
|
if ($ds['bs'] === '1m') {
|
||||||
$d1m = ($ds['speed_rw'] > 1000000) ? ($ds['speed_rw'] / 1000) : $ds['speed_rw'];
|
$d1m = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
|
||||||
$d1m_type = ($ds['speed_rw'] > 1000000) ? 'GB/s' : 'MB/s';
|
$d1m_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
|
||||||
$d1m_mbps = self::KBstoMBs($ds['speed_rw']);
|
$d1m_mbps = self::KBstoMBs($ds['speed_rw']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -314,6 +314,11 @@ class Yabs extends Model
|
||||||
'has_yabs' => 1
|
'has_yabs' => 1
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Cache::forget("yabs.$yabs_id");
|
||||||
|
Cache::forget("all_yabs");
|
||||||
|
Cache::forget("server.$server_id");
|
||||||
|
Cache::forget("all_servers");
|
||||||
|
|
||||||
} catch (Exception $e) {//Not valid JSON
|
} catch (Exception $e) {//Not valid JSON
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
402
app/Process.php
402
app/Process.php
|
@ -44,406 +44,4 @@ class Process
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function floatValue(string $string): float
|
|
||||||
{//Keeps only numbers and . AKA a float
|
|
||||||
return preg_replace('/[^0-9,.]/', '', trim($string));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function intValue(string $string): int
|
|
||||||
{//Keeps only numbers AKA an int
|
|
||||||
return (int)preg_replace('/[^0-9]/', '', trim($string));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function removeFloat(string $string): string
|
|
||||||
{//Removes float from a string
|
|
||||||
return ltrim(preg_replace('/[^A-Za-z\-,.]/', '', $string), '.');
|
|
||||||
}
|
|
||||||
|
|
||||||
private function trimRemoveR(string $string): string
|
|
||||||
{//Removes \r and does a trim()
|
|
||||||
return trim(str_replace("\r", '', $string));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function datatype(string $string): string
|
|
||||||
{//Formats data type (ram and disk)
|
|
||||||
if (str_contains($string, 'M')) {
|
|
||||||
return 'MB';//Megabytes
|
|
||||||
} elseif (str_contains($string, 'G')) {
|
|
||||||
return 'GB';//Gigabytes
|
|
||||||
} elseif (str_contains($string, 'K')) {
|
|
||||||
return 'KB';//Kilobytes
|
|
||||||
} elseif (str_contains($string, 'T')) {
|
|
||||||
return 'TB';//TeraBytes
|
|
||||||
} elseif (str_contains($string, 'B')) {
|
|
||||||
return 'BT';//Bytes
|
|
||||||
} else {
|
|
||||||
return "GB";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function GBtoMB(string $gb): float
|
|
||||||
{//Gigabyte to Megabyte conversion
|
|
||||||
return ($gb * 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function TBtoGB(string $tb): float
|
|
||||||
{//Terabyte to Gigabyte conversion
|
|
||||||
return ($tb * 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function GBpstoMBps(string $gbps, bool $format = false): float
|
|
||||||
{//Gigabits to Megabits
|
|
||||||
if ($format) {
|
|
||||||
return (float)number_format(((float)$gbps * 1024), 3);
|
|
||||||
}
|
|
||||||
return (float)$gbps * 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function diskSpeedAsMbps(string $type, string $value): float
|
|
||||||
{//If value type GB/s convert to MB/s, KB/s to MB/s
|
|
||||||
if ($type === "GB/s") {
|
|
||||||
return $this->GBpstoMBps($value);
|
|
||||||
}
|
|
||||||
if ($type === "KB/s") {
|
|
||||||
return (float)($value / 1024);
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function networkSpeedAsMbps(string $type, string $value): float
|
|
||||||
{//If value type GBps convert to MB/s
|
|
||||||
if ($type === "GBps") {
|
|
||||||
return $this->GBpstoMBps($value);
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function yabsSpeedValues(array $data): array
|
|
||||||
{//Formats YABs speed test for speed value and type as array
|
|
||||||
$data = explode('|', implode($data));
|
|
||||||
if ($data[2] === 'busy') {
|
|
||||||
$send = $send_type = NULL;
|
|
||||||
} else {
|
|
||||||
$send = (float)$data[2];
|
|
||||||
if ($this->removeFloat($data[2]) === 'Mbitssec') {
|
|
||||||
$send_type = "MBps";
|
|
||||||
} elseif ($this->removeFloat($data[2]) === 'Gbitssec') {
|
|
||||||
$send_type = "GBps";
|
|
||||||
} elseif ($this->removeFloat($data[2]) === 'Kbitssec') {
|
|
||||||
$send_type = "KBps";
|
|
||||||
} else {
|
|
||||||
$send_type = $this->removeFloat($data[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($data[3] === 'busy') {
|
|
||||||
$receive = $receive_type = NULL;
|
|
||||||
} else {
|
|
||||||
$receive = (float)$data[3];
|
|
||||||
if ($this->removeFloat($data[3]) === 'Mbitssec') {
|
|
||||||
$receive_type = "MBps";
|
|
||||||
} elseif ($this->removeFloat($data[3]) === 'Gbitssec') {
|
|
||||||
$receive_type = "GBps";
|
|
||||||
} elseif ($this->removeFloat($data[3]) === 'Kbitssec') {
|
|
||||||
$receive_type = "KBps";
|
|
||||||
} else {
|
|
||||||
$receive_type = $this->removeFloat($data[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return array('send' => $send, 'send_type' => $send_type, 'receive' => $receive, 'receive_type' => $receive_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function yabsSpeedLoc(array $data): array
|
|
||||||
{//Formats YABs speed test provider and location as array
|
|
||||||
if ($data[1] === '|') {
|
|
||||||
$provider = $data[0];
|
|
||||||
} else {
|
|
||||||
$provider = $data[0] . ' ' . $data[1];
|
|
||||||
}
|
|
||||||
if ($data[2] !== '|') {
|
|
||||||
$location = $data[2] . ' ' . str_replace(',', '', $data[3]);
|
|
||||||
} else {
|
|
||||||
$location = $data[3] . ' ' . str_replace(',', '', $data[4]);
|
|
||||||
}
|
|
||||||
return array('provider' => $provider, 'location' => $location);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function yabsOutputAsJson(string $server_id, string $data_from_form): array
|
|
||||||
{
|
|
||||||
$allowed_versions = ['v2021-12-28', 'v2022-02-18', 'v2022-04-30', 'v2022-05-06', 'v2022-06-11', 'v2022-08-20'];
|
|
||||||
|
|
||||||
$file_name = date('Y') . '/' . date('m') . '/' . time() . '.txt';
|
|
||||||
|
|
||||||
Storage::disk('local')->put($file_name, $data_from_form);
|
|
||||||
|
|
||||||
$file = Storage::disk('local')->get($file_name);
|
|
||||||
|
|
||||||
if ($file) {
|
|
||||||
$array = explode("\n", $file);
|
|
||||||
if (!Session::get('save_yabs_as_txt')) {//Check if we want YABs txt to stay
|
|
||||||
Storage::disk('local')->delete($file_name);//Delete file
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 10, 'error_message' => 'Issue writing/reading txt file');
|
|
||||||
}
|
|
||||||
|
|
||||||
//dd($array);//Good for debugging the lines
|
|
||||||
|
|
||||||
if (count($array) < 46) {
|
|
||||||
return array('error_id' => 9, 'error_message' => 'Less than 46 lines');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str_contains($array[0], "# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #")) {
|
|
||||||
if (!str_contains($array[1],"# Yet-Another-Bench-Script #")) {
|
|
||||||
return array('error_id' => 8, 'error_message' => 'Didnt copy output correctly');
|
|
||||||
}
|
|
||||||
|
|
||||||
$version_array = explode(' ', preg_replace('!\s+!', ' ', $this->trimRemoveR($array[2])));
|
|
||||||
if (in_array($version_array[1], $allowed_versions, true)) {//YABs version is allowed
|
|
||||||
if ($version_array[1] === 'v2022-05-06' || $version_array[1] === 'v2022-06-11') {//These versions added in more responses
|
|
||||||
$cpu = $this->trimRemoveR(str_replace(':', '', strstr($array[11], ': ')));
|
|
||||||
$cpu_spec = explode(' ', strstr($array[12], ': '));//: 2 @ 3792.872 MHz
|
|
||||||
$ram_line = $this->trimRemoveR(str_replace(':', '', strstr($array[15], ': ')));
|
|
||||||
$ram = (float)$ram_line;
|
|
||||||
$ram_type = $this->datatype($ram_line);
|
|
||||||
$swap_line = $this->trimRemoveR(str_replace(':', '', strstr($array[16], ': ')));
|
|
||||||
$swap = (float)$swap_line;
|
|
||||||
$swap_type = $this->datatype($swap_line);
|
|
||||||
$disk_line = $this->trimRemoveR(str_replace(':', '', strstr($array[17], ': ')));
|
|
||||||
$disk = (float)$disk_line;
|
|
||||||
$disk_type = $this->datatype($disk_line);
|
|
||||||
$io_3 = explode(' ', preg_replace('!\s+!', ' ', $array[27]));
|
|
||||||
$io_6 = explode(' ', preg_replace('!\s+!', ' ', $array[33]));
|
|
||||||
(str_contains($array[13], 'Enabled')) ? $aes_ni = true : $aes_ni = false;
|
|
||||||
(str_contains($array[14], 'Enabled')) ? $vm_amd_v = true : $vm_amd_v = false;
|
|
||||||
$uptime = str_replace(["Uptime : ", "\r"], '', $array[10]);
|
|
||||||
$distro = str_replace(["Distro : ", "\r"], '', $array[18]);
|
|
||||||
$kernel = str_replace(["Kernel : ", "\r"], '', $array[19]);
|
|
||||||
} else {
|
|
||||||
$cpu = $this->trimRemoveR(str_replace(':', '', strstr($array[10], ': ')));
|
|
||||||
$cpu_spec = explode(' ', strstr($array[11], ': '));//: 2 @ 3792.872 MHz
|
|
||||||
$ram_line = $this->trimRemoveR(str_replace(':', '', strstr($array[14], ': ')));
|
|
||||||
$ram = (float)$ram_line;
|
|
||||||
$ram_type = $this->datatype($ram_line);
|
|
||||||
$swap_line = $this->trimRemoveR(str_replace(':', '', strstr($array[15], ': ')));
|
|
||||||
$swap = (float)$swap_line;
|
|
||||||
$swap_type = $this->datatype($swap_line);
|
|
||||||
$disk_line = $this->trimRemoveR(str_replace(':', '', strstr($array[16], ': ')));
|
|
||||||
$disk = (float)$disk_line;
|
|
||||||
$disk_type = $this->datatype($disk_line);
|
|
||||||
$io_3 = explode(' ', preg_replace('!\s+!', ' ', $array[24]));
|
|
||||||
$io_6 = explode(' ', preg_replace('!\s+!', ' ', $array[30]));
|
|
||||||
(str_contains($array[12], 'Enabled')) ? $aes_ni = true : $aes_ni = false;
|
|
||||||
(str_contains($array[13], 'Enabled')) ? $vm_amd_v = true : $vm_amd_v = false;
|
|
||||||
}
|
|
||||||
$cpu_cores = $cpu_spec[1];
|
|
||||||
$cpu_freq = $cpu_spec[3];
|
|
||||||
|
|
||||||
|
|
||||||
$d4k_as_mbps = $this->diskSpeedAsMbps($io_3[3], $this->floatValue($io_3[2]));
|
|
||||||
$d64k_as_mbps = $this->diskSpeedAsMbps($io_3[7], $this->floatValue($io_3[6]));
|
|
||||||
$d512k_as_mbps = $this->diskSpeedAsMbps($io_6[3], $this->floatValue($io_6[2]));
|
|
||||||
$d1m_as_mbps = $this->diskSpeedAsMbps($io_6[7], $this->floatValue($io_6[6]));
|
|
||||||
$disk_test_arr = array(
|
|
||||||
'4k_total' => $this->floatValue($io_3[2]),
|
|
||||||
'4k_total_type' => $io_3[3],
|
|
||||||
'4k_total_mbps' => $d4k_as_mbps,
|
|
||||||
'64k_total' => $this->floatValue($io_3[6]),
|
|
||||||
'64k_total_type' => $io_3[7],
|
|
||||||
'64k_total_mbps' => $d64k_as_mbps,
|
|
||||||
'512k_total' => $this->floatValue($io_6[2]),
|
|
||||||
'512k_total_type' => $io_6[3],
|
|
||||||
'512k_total_mbps' => $d512k_as_mbps,
|
|
||||||
'1m_total' => $this->floatValue($io_6[6]),
|
|
||||||
'1m_total_type' => $io_6[7],
|
|
||||||
'1m_total_mbps' => $d1m_as_mbps,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isset($array[40])) {
|
|
||||||
if ($version_array[1] === 'v2022-05-06' || $version_array[1] === 'v2022-06-11') {
|
|
||||||
if (str_contains($array[43], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//No ipv6
|
|
||||||
//Has short ipv4 network speed testing (-r)
|
|
||||||
$has_ipv6 = false;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 41;
|
|
||||||
$gb_s = 47;
|
|
||||||
$gb_m = 48;
|
|
||||||
$gb_url = 49;
|
|
||||||
} elseif (str_contains($array[45], "Geekbench 4 Benchmark Test:")) {
|
|
||||||
return array('error_id' => 6, 'error_message' => 'GeekBench 5 only allowed');
|
|
||||||
} elseif ($array[45] === "Geekbench 5 test failed. Run manually to determine cause.\r") {
|
|
||||||
return array('error_id' => 7, 'error_message' => 'GeekBench test failed');
|
|
||||||
} elseif (str_contains($array[46], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//No ipv6
|
|
||||||
//Has full ipv4 network speed testing
|
|
||||||
$has_ipv6 = false;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 44;
|
|
||||||
$gb_s = 44;
|
|
||||||
$gb_m = 45;
|
|
||||||
$gb_url = 46;
|
|
||||||
} elseif (str_contains($array[47], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//No ipv6
|
|
||||||
//Has full ipv4 network speed testing
|
|
||||||
$has_ipv6 = false;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 45;
|
|
||||||
$gb_s = 51;
|
|
||||||
$gb_m = 52;
|
|
||||||
$gb_url = 53;
|
|
||||||
} elseif (str_contains($array[43], "iperf3 Network Speed Tests (IPv6):")) {
|
|
||||||
//HAS ipv6
|
|
||||||
//Has short ipv4 & ipv6 network speed testing
|
|
||||||
$has_ipv6 = true;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 41;
|
|
||||||
$gb_s = 55;
|
|
||||||
$gb_m = 56;
|
|
||||||
$gb_url = 57;
|
|
||||||
} elseif (str_contains($array[56], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//HAS ipv6
|
|
||||||
//Has full ipv4 & ipv6 network speed testing
|
|
||||||
$has_ipv6 = true;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 44;
|
|
||||||
$gb_s = 60;
|
|
||||||
$gb_m = 61;
|
|
||||||
$gb_url = 62;
|
|
||||||
} elseif (str_contains($array[59], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//HAS ipv6
|
|
||||||
//Has full ipv4 & ipv6 network speed testing
|
|
||||||
$has_ipv6 = true;
|
|
||||||
$start_st = 39;
|
|
||||||
$end_st = 45;
|
|
||||||
$gb_s = 63;
|
|
||||||
$gb_m = 64;
|
|
||||||
$gb_url = 65;
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 5, 'error_message' => 'Not correct YABs command output');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (str_contains($array[45], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//No ipv6
|
|
||||||
//Has short ipv4 network speed testing (-r)
|
|
||||||
$has_ipv6 = false;
|
|
||||||
$start_st = 36;
|
|
||||||
$end_st = 43;
|
|
||||||
$gb_s = 49;
|
|
||||||
$gb_m = 50;
|
|
||||||
$gb_url = 51;
|
|
||||||
} elseif (str_contains($array[45], "Geekbench 4 Benchmark Test:")) {
|
|
||||||
return array('error_id' => 6, 'error_message' => 'GeekBench 5 only allowed');
|
|
||||||
} elseif (str_contains($array[45], "Geekbench 5 test failed. Run manually to determine cause.")) {
|
|
||||||
return array('error_id' => 7, 'error_message' => 'GeekBench test failed');
|
|
||||||
} elseif (str_contains($array[40], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//No ipv6
|
|
||||||
//Has full ipv4 network speed testing
|
|
||||||
$has_ipv6 = false;
|
|
||||||
$start_st = 36;
|
|
||||||
$end_st = 38;
|
|
||||||
$gb_s = 44;
|
|
||||||
$gb_m = 45;
|
|
||||||
$gb_url = 46;
|
|
||||||
} elseif (str_contains($array[40], "iperf3 Network Speed Tests (IPv6):")) {
|
|
||||||
//HAS ipv6
|
|
||||||
//Has short ipv4 & ipv6 network speed testing
|
|
||||||
$has_ipv6 = true;
|
|
||||||
$start_st = 36;
|
|
||||||
$end_st = 38;
|
|
||||||
$gb_s = 52;
|
|
||||||
$gb_m = 53;
|
|
||||||
$gb_url = 54;
|
|
||||||
} elseif (str_contains($array[56], "Geekbench 5 Benchmark Test:")) {
|
|
||||||
//HAS ipv6
|
|
||||||
//Has full ipv4 & ipv6 network speed testing
|
|
||||||
$has_ipv6 = true;
|
|
||||||
$start_st = 36;
|
|
||||||
$end_st = 43;
|
|
||||||
$gb_s = 60;
|
|
||||||
$gb_m = 61;
|
|
||||||
$gb_url = 62;
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 5, 'error_message' => 'Not correct YABs command output');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 4, 'error_message' => 'Not correct formatting');
|
|
||||||
}
|
|
||||||
$geekbench_single = $this->intValue($array[$gb_s]);
|
|
||||||
$geekbench_multi = $this->intValue($array[$gb_m]);
|
|
||||||
$geek_full_url = explode(' ', preg_replace('!\s+!', ' ', $array[$gb_url]));
|
|
||||||
$gb5_id = (int)substr($geek_full_url[3], strrpos($geek_full_url[3], '/') + 1);//
|
|
||||||
$has_a_speed_test = false;
|
|
||||||
|
|
||||||
($ram_type === 'GB') ? $ram_mb = $this->GBtoMB($ram) : $ram_mb = $ram;
|
|
||||||
($swap_type === 'GB') ? $swap_mb = $this->GBtoMB($swap) : $swap_mb = $swap;
|
|
||||||
($disk_type === 'TB') ? $disk_gb = $this->TBtoGB($disk) : $disk_gb = $disk;
|
|
||||||
|
|
||||||
$date = date_create($array[6]);
|
|
||||||
|
|
||||||
$output = [
|
|
||||||
'id' => $server_id,
|
|
||||||
'has_ipv6' => $has_ipv6,
|
|
||||||
'output_date' => date_format($date, 'Y-m-d H:i:s'),
|
|
||||||
'process_date' => date('Y-m-d H:i:s'),
|
|
||||||
'cpu_cores' => (int)$cpu_cores,
|
|
||||||
'cpu_freq' => (float)$cpu_freq,
|
|
||||||
'cpu' => $cpu,
|
|
||||||
'ram' => $ram,
|
|
||||||
'ram_type' => $ram_type,
|
|
||||||
'ram_mb' => $ram_mb,
|
|
||||||
'swap' => $swap,
|
|
||||||
'swap_type' => $swap_type,
|
|
||||||
'swap_mb' => $swap_mb,
|
|
||||||
'disk' => $disk,
|
|
||||||
'disk_type' => $disk_type,
|
|
||||||
'disk_gb' => $disk_gb,
|
|
||||||
'aes' => $aes_ni,
|
|
||||||
'vm' => $vm_amd_v,
|
|
||||||
'GB5_single' => $geekbench_single,
|
|
||||||
'GB5_mult' => $geekbench_multi,
|
|
||||||
'GB5_id' => $gb5_id,
|
|
||||||
'uptime' => $uptime ?? null,
|
|
||||||
'distro' => $distro ?? null,
|
|
||||||
'kernel' => $kernel ?? null,
|
|
||||||
];
|
|
||||||
|
|
||||||
$output['disk_speed'] = $disk_test_arr;
|
|
||||||
|
|
||||||
$speed_test_arr = array();
|
|
||||||
|
|
||||||
for ($i = $start_st; $i <= $end_st; $i++) {
|
|
||||||
if (str_contains($array[$i], 'busy')) {
|
|
||||||
//Has a "busy" result, No insert
|
|
||||||
} else {
|
|
||||||
$data = explode(' ', preg_replace('!\s+!', ' ', $array[$i]));
|
|
||||||
$send_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['send_type'], $this->yabsSpeedValues($data)['send']);
|
|
||||||
$recieve_as_mbps = $this->networkSpeedAsMbps($this->yabsSpeedValues($data)['receive_type'], $this->yabsSpeedValues($data)['receive']);
|
|
||||||
$speed_test_arr[] = array(
|
|
||||||
'location' => $this->yabsSpeedLoc($data)['location'],
|
|
||||||
'send' => $this->yabsSpeedValues($data)['send'],
|
|
||||||
'send_type' => $this->yabsSpeedValues($data)['send_type'],
|
|
||||||
'send_type_mbps' => $send_as_mbps,
|
|
||||||
'receive' => $this->yabsSpeedValues($data)['receive'],
|
|
||||||
'receive_type' => $this->yabsSpeedValues($data)['receive_type'],
|
|
||||||
'receive_type_mbps' => $recieve_as_mbps
|
|
||||||
);
|
|
||||||
$has_a_speed_test = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($has_a_speed_test) {
|
|
||||||
$output['network_speed'] = $speed_test_arr;
|
|
||||||
}
|
|
||||||
return $output;
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 4, 'error_message' => 'Wrong YABs version');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return array('error_id' => 3, 'error_message' => 'Didnt start at right spot');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
18
database/migrations/2022_09_22_020501_update_yabs_table.php
Normal file
18
database/migrations/2022_09_22_020501_update_yabs_table.php
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('yabs', function($table)
|
||||||
|
{
|
||||||
|
$table->integer('gb5_single')->nullable()->change();
|
||||||
|
$table->integer('gb5_multi')->nullable()->change();
|
||||||
|
$table->integer('gb5_id')->nullable()->change();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,9 +1,5 @@
|
||||||
@if ($errors->any())
|
@if ($message = Session::get('error'))
|
||||||
<div class="alert alert-danger">
|
<div class="alert alert-danger" role="alert">
|
||||||
<ul>
|
<p class="my-1">{{ $message }}</p>
|
||||||
@foreach ($errors->all() as $error)
|
</div>
|
||||||
<li>{{ $error }}</li>
|
|
||||||
@endforeach
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
@endif
|
@endif
|
||||||
|
|
5
resources/views/errors/401.blade.php
Normal file
5
resources/views/errors/401.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Unauthorized'))
|
||||||
|
@section('code', '401')
|
||||||
|
@section('message', __('Unauthorized'))
|
5
resources/views/errors/403.blade.php
Normal file
5
resources/views/errors/403.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Forbidden'))
|
||||||
|
@section('code', '403')
|
||||||
|
@section('message', __($exception->getMessage() ?: 'Forbidden'))
|
|
@ -1,51 +1,5 @@
|
||||||
@section('title') {{'Error'}}
|
@extends('errors::minimal')
|
||||||
@if(isset($status))
|
|
||||||
{{$status}}
|
|
||||||
@else
|
|
||||||
404
|
|
||||||
@endif
|
|
||||||
@endsection
|
|
||||||
@section('style')
|
|
||||||
<style>
|
|
||||||
.page-not-found-div {
|
|
||||||
height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-not-found-div h1 {
|
@section('title', __('Not Found'))
|
||||||
font-size: 8rem;
|
@section('code', '404')
|
||||||
color: #e73974;
|
@section('message', __('Page not Found'))
|
||||||
}
|
|
||||||
|
|
||||||
.page-not-found-div h3 {
|
|
||||||
font-size: 2.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-not-found-div .center-div {
|
|
||||||
width: 100%;
|
|
||||||
padding: 0.2rem;
|
|
||||||
text-align: center;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@endsection
|
|
||||||
<x-app-layout>
|
|
||||||
<div class="page-not-found-div">
|
|
||||||
<div class="center-div">
|
|
||||||
@if(isset($status))
|
|
||||||
<h1>{{$status}}</h1>
|
|
||||||
@else
|
|
||||||
<h1>Error</h1>
|
|
||||||
@endif
|
|
||||||
@if(isset($title))
|
|
||||||
<h3 class="mt-2">{{$title}}</h3>
|
|
||||||
@endif
|
|
||||||
@if(isset($message))
|
|
||||||
<p class="mt-4">{{$message}}</p>
|
|
||||||
@endif
|
|
||||||
<p class="mt-4"><a href="{{route('/')}}" class="text-decoration-none">Go home</a></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</x-app-layout>
|
|
||||||
|
|
5
resources/views/errors/419.blade.php
Normal file
5
resources/views/errors/419.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Page Expired'))
|
||||||
|
@section('code', '419')
|
||||||
|
@section('message', __('Page Expired'))
|
5
resources/views/errors/429.blade.php
Normal file
5
resources/views/errors/429.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Too Many Requests'))
|
||||||
|
@section('code', '429')
|
||||||
|
@section('message', __('Too Many Requests'))
|
5
resources/views/errors/500.blade.php
Normal file
5
resources/views/errors/500.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Server Error'))
|
||||||
|
@section('code', '500')
|
||||||
|
@section('message', __('Server Error'))
|
5
resources/views/errors/503.blade.php
Normal file
5
resources/views/errors/503.blade.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
@extends('errors::minimal')
|
||||||
|
|
||||||
|
@section('title', __('Service Unavailable'))
|
||||||
|
@section('code', '503')
|
||||||
|
@section('message', __('Service Unavailable'))
|
53
resources/views/errors/layout.blade.php
Normal file
53
resources/views/errors/layout.blade.php
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<title>@yield('title')</title>
|
||||||
|
|
||||||
|
<!-- Styles -->
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #636b6f;
|
||||||
|
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||||
|
font-weight: 100;
|
||||||
|
height: 100vh;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.full-height {
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-center {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.position-ref {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 36px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="flex-center position-ref full-height">
|
||||||
|
<div class="content">
|
||||||
|
<div class="title">
|
||||||
|
@yield('message')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
21
resources/views/errors/minimal.blade.php
Normal file
21
resources/views/errors/minimal.blade.php
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>@yield('title')</title>
|
||||||
|
<style>
|
||||||
|
@charset "UTF-8";h1,p{margin-top:0}.container,.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0}.row,body{display:flex}.main,.sub{text-align:center!important}:root{--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,rgba(255, 255, 255, 0.15),rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}.main,h1{font-weight:500;line-height:1.2}h1{margin-bottom:.5rem;font-size:calc(1.375rem + 1.5vw)}p{margin-bottom:1rem}a{color:var(--bs-link-color);color:#277dfd;text-decoration:none}a:hover{color:var(--bs-link-hover-color)}.container,.row>*{width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5)}.container{margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){h1{font-size:2.5rem}.container{max-width:1140px}}@media (min-width:1400px){.container{max-width:1320px}}.row{flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;max-width:100%;margin-top:var(--bs-gutter-y)}.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.w-100{width:100%!important}.justify-content-center{justify-content:center!important}.m-auto{margin:auto!important}body,html{height:100%}body{align-items:center;background-color:#fbfbfb}.main{font-size:2.1rem;padding-bottom:.8rem!important;margin-bottom:0;padding-top:.2rem!important}.sub{font-size:1rem;font-weight:300;color:#000000a8}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main class="w-100 m-auto">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<h1 class="main">@yield('code')</h1>
|
||||||
|
<p class="sub">@yield('message'). <a href="{{route('/')}}">Go home</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -88,13 +88,21 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-nowrap">GB5 single</td>
|
<td class="td-nowrap">GB5 single</td>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->gb5_single}}</td>
|
<td class="td-nowrap">{{$yabs1_data[0]->gb5_single}}</td>
|
||||||
|
@if(!is_null($yabs1_data[0]->gb5_single) && !is_null($yabs2_data[0]->gb5_single))
|
||||||
{!! \App\Models\Server::tableRowCompare($yabs1_data[0]->gb5_single, $yabs2_data[0]->gb5_single, '') !!}
|
{!! \App\Models\Server::tableRowCompare($yabs1_data[0]->gb5_single, $yabs2_data[0]->gb5_single, '') !!}
|
||||||
|
@else
|
||||||
|
<td>-</td>
|
||||||
|
@endif
|
||||||
<td class="td-nowrap">{{$yabs2_data[0]->gb5_single}}</td>
|
<td class="td-nowrap">{{$yabs2_data[0]->gb5_single}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-nowrap">GB5 multi</td>
|
<td class="td-nowrap">GB5 multi</td>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->gb5_multi}}</td>
|
<td class="td-nowrap">{{$yabs1_data[0]->gb5_multi}}</td>
|
||||||
|
@if(!is_null($yabs1_data[0]->gb5_multi) && !is_null($yabs2_data[0]->gb5_multi))
|
||||||
{!! \App\Models\Server::tableRowCompare($yabs1_data[0]->gb5_multi, $yabs2_data[0]->gb5_multi, '') !!}
|
{!! \App\Models\Server::tableRowCompare($yabs1_data[0]->gb5_multi, $yabs2_data[0]->gb5_multi, '') !!}
|
||||||
|
@else
|
||||||
|
<td>-</td>
|
||||||
|
@endif
|
||||||
<td class="td-nowrap">{{$yabs2_data[0]->gb5_multi}}</td>
|
<td class="td-nowrap">{{$yabs2_data[0]->gb5_multi}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -181,7 +189,7 @@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
@if($yabs1_data[0]->network_speed[3]->location === $yabs2_data[0]->network_speed[3]->location)
|
@if(isset($yabs1_data[0]->network_speed[3]) && $yabs1_data[0]->network_speed[3]->location === $yabs2_data[0]->network_speed[3]->location)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[3]->location}} send</td>
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[3]->location}} send</td>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[3]->send_as_mbps}}<span
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[3]->send_as_mbps}}<span
|
||||||
|
@ -199,7 +207,7 @@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
@if($yabs1_data[0]->network_speed[4]->location === $yabs2_data[0]->network_speed[4]->location)
|
@if(isset($yabs1_data[0]->network_speed[4]) && $yabs1_data[0]->network_speed[4]->location === $yabs2_data[0]->network_speed[4]->location)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->location}} send</td>
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->location}} send</td>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->send_as_mbps}}<span
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->send_as_mbps}}<span
|
||||||
|
@ -217,7 +225,7 @@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
@if($yabs1_data[0]->network_speed[4]->location === $yabs2_data[0]->network_speed[5]->location)
|
@if(isset($yabs1_data[0]->network_speed[4]) && $yabs1_data[0]->network_speed[4]->location === $yabs2_data[0]->network_speed[5]->location)
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->location}} send</td>
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->location}} send</td>
|
||||||
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->send_as_mbps}}<span
|
<td class="td-nowrap">{{$yabs1_data[0]->network_speed[4]->send_as_mbps}}<span
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
<div class="container" id="app">
|
<div class="container" id="app">
|
||||||
<x-delete-confirm-modal></x-delete-confirm-modal>
|
<x-delete-confirm-modal></x-delete-confirm-modal>
|
||||||
<x-card class="shadow mt-3">
|
<x-card class="shadow mt-3">
|
||||||
<a href="{{ route('yabs.create') }}" class="btn btn-primary mb-3">Add YABs</a>
|
|
||||||
<a href="{{ route('yabs.compare-choose') }}" class="btn btn-success mb-3">Compare YABs</a>
|
<a href="{{ route('yabs.compare-choose') }}" class="btn btn-success mb-3">Compare YABs</a>
|
||||||
<x-errors-alert></x-errors-alert>
|
<x-errors-alert></x-errors-alert>
|
||||||
<x-success-alert></x-success-alert>
|
<x-success-alert></x-success-alert>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user