Compare commits

..

610 commits
1.2 ... main

Author SHA1 Message Date
corbpie
525b1d29f0
Merge pull request #119 from cp6/dev3
3.0.0
2024-12-28 21:44:55 +11:00
cp6
2cd623d49e Updated README.md 2024-12-09 23:15:03 +11:00
cp6
79cc41c729 Fixed osIntToIcon() giving wrong icon 2024-12-09 22:48:50 +11:00
cp6
a91047dacf Fixed error in call when fetching IP who is data 2024-12-09 22:37:13 +11:00
cp6
00701650e6 Updated composer.lock file 2024-12-09 20:27:03 +11:00
cp6
8ffbe79a60 Updated README.md 2024-12-09 20:26:04 +11:00
cp6
5445e9d67f Added note to API 2024-12-09 19:09:20 +11:00
cp6
6f59fb628c Removed logging 2024-12-09 18:58:26 +11:00
cp6
97585e0f5b Added IP who is data fetch and update 2024-12-09 18:58:02 +11:00
cp6
146bd64803 Updated README.md 2024-12-09 17:05:17 +11:00
cp6
3b7c587249 Removed user being seeded 2024-12-09 17:03:32 +11:00
cp6
c662710300 Added IP who is data columns to the ips table 2024-12-09 16:59:04 +11:00
cp6
d180779133 Updated back and submit buttons in reseller and shared create to use new icon button components 2024-12-09 16:53:15 +11:00
cp6
37032e0344 Added icon to back-button.blade.php and submit-button.blade.php 2024-12-09 16:52:44 +11:00
cp6
71ab8e36ca Updated domains index "due in" column to format massive floats 2024-12-09 16:47:06 +11:00
cp6
946fe9b893 Added Datatables to domain index for sorting and searching ability 2024-12-09 16:45:31 +11:00
cp6
29b0f2aed1 Added Datatables to reseller index for sorting and searching ability 2024-12-09 16:44:07 +11:00
cp6
19a0f2f646 Added Datatables to shared index for sorting and searching ability 2024-12-09 16:42:43 +11:00
cp6
a7cce1cfff Minor update to servers index page formatting 2024-12-09 16:34:21 +11:00
cp6
44766c8fdd Updated osIntToIcon() 2024-12-09 16:33:12 +11:00
cp6
1666d57a9b Added OS's to OsSeeder.php 2024-12-09 16:32:49 +11:00
cp6
5ebbcce44c Updated webpack and package.json dependencies versions. NPM run dev 2024-12-09 16:24:07 +11:00
cp6
ac580c23ed Added fa-brands 2024-12-09 16:23:18 +11:00
cp6
526f360f2c Added datatables to server/index for sorting and searching ability.
Updated days due in to no longer give 8 digit long floats
2024-12-09 15:49:41 +11:00
cp6
720dc50852 Removed prefers-color-scheme: dark for .card 2024-12-09 15:37:59 +11:00
cp6
fcfa44f94f PHP 8.3 2024-12-09 15:37:23 +11:00
cp6
9f4738c75e Updated dependencies 2024-12-09 15:32:52 +11:00
cp6
cc9f585f5b Updated README.md 2024-05-14 22:52:25 +10:00
cp6
157e3edf5e Compiled styles 2024-05-14 22:52:15 +10:00
cp6
4b07be6417 Added darker card background style to style.css 2024-05-14 22:49:03 +10:00
cp6
12b7a81479 Updated submit-button to be py-1 2024-05-14 22:45:47 +10:00
cp6
c944fb907f Updated back-button to be py-1 2024-05-14 22:45:33 +10:00
cp6
d2237b74a6 Updated readme 2024-05-14 22:41:37 +10:00
cp6
6a5c6b7a61 Updated routes in web.php to use more readable format 2024-05-14 22:35:11 +10:00
cp6
9704ebc561 Added grouped middleware for auth 2024-05-14 22:31:30 +10:00
cp6
9d2cf82c31 Removed comments from web.php 2024-05-14 22:28:05 +10:00
cp6
f9e39e74bc Updated login and register form layout slightly 2024-05-14 22:27:08 +10:00
cp6
6e55018974 Fixed for settings not existing MK2 2024-05-14 21:52:38 +10:00
cp6
1aab332ef8 Fix for settings not existing 2024-05-14 21:52:13 +10:00
cp6
cd41dcdfff Updated PHP version in Dockerfile 2024-05-14 21:42:44 +10:00
cp6
2172236463 Updated assets 2024-05-14 21:42:02 +10:00
cp6
c9aa314155 Updated assets 2024-05-14 21:39:08 +10:00
cp6
5797e8c30a Fixed issue 104 2024-05-08 22:01:06 +10:00
cp6
c10d77d46b Updated package.json 2024-05-02 23:07:37 +10:00
cp6
ddecd8125e Updated Readme for v3.0.0 2024-05-02 23:01:13 +10:00
cp6
c5422fac09 Updated PHP version to 8.2
Updated Laravel version to 11
Updated packages
2024-05-02 23:00:26 +10:00
corbpie
25ff23d98d
Update README.md 2024-03-08 23:46:29 +11:00
corbpie
6df8b27337
Merge pull request #103 from HRA42/main
Added Arm Support
2023-11-21 11:26:06 +11:00
Henry Rausch
32580be6b4
Build and push Docker image with Buildx
The commit adds steps to build and push a Docker image using Buildx in the GitHub Actions workflow. It includes checking out the repository, installing the cosign tool, setting up Docker buildx, logging into the Docker registry, extracting metadata for Docker, and finally building and pushing the Docker image with the specified tags and platforms. The commit ensures that the image is only pushed when the event name is not a pull request.
2023-11-16 23:46:25 +01:00
Henry Rausch
0c3dd6b7e2
Update docker image push configuration
Changed the repository for pushing the docker image to GHCR from `ghcr.io/cp6/my-idlers` to `ghcr.io/hra42/my-idlers-arm64` in order to align with the updated repository naming convention.
2023-11-16 23:41:33 +01:00
Henry Rausch
27a0cd494a
Update tags in GitHub Actions workflow
This commit updates the tags in the GitHub Actions workflow for building Docker images. The previous tags `ghcr.io/cp6/my-idlers` are replaced with `ghcr.io/hra42/my-idlers-arm64`. This change ensures that the correct tags are used for the Docker image.
2023-11-16 23:38:46 +01:00
Henry Rausch
53bdc596a5
Build container image with support for both Linux/amd64 and Linux/arm64 platforms. 2023-11-16 23:37:00 +01:00
corbpie
2b1cfa0787
Merge pull request #101 from Gamerboy59/main
Update resources and remove duplicated webfa files
2023-10-06 09:31:54 +11:00
Gamerboy59
72c49d8e60
fixed some namings of the webfonts 2023-10-05 16:51:42 +02:00
Gamerboy59
8ee3a1ee43
Move webfa from css to public folder 2023-10-05 16:12:20 +02:00
Gamerboy59
60df780917 Update public resources 2023-09-26 23:26:24 +00:00
Gamerboy59
2f6078ac1c
make font url relative 2023-09-27 01:23:46 +02:00
Gamerboy59
8c1878267b
remove more duplicated webfa font files 2023-09-27 01:02:20 +02:00
Gamerboy59
0b2a6c6a49 Update public resources 2023-09-26 22:47:22 +00:00
Gamerboy59
3cf049f1be
fix folder structure to not duplicate again 2023-09-27 00:40:26 +02:00
Gamerboy59
8561e9c4b8
Add missing sass loader for mix 2023-09-27 00:11:20 +02:00
Gamerboy59
642293016f
remove duplicated font-files 2023-09-27 00:07:33 +02:00
corbpie
5ce233bfb8
Updated README.md for 2.3.2
Updated README.md for 2.3.2
2023-09-26 22:48:19 +10:00
corbpie
b8f5ee223d
Merge pull request #99 from cp6/dev
Added Geekbench 6
2023-09-26 22:42:11 +10:00
cp6
918320c876 servers\index.blade.php cleanup
servers\index.blade.php cleanup
2023-09-25 23:45:07 +10:00
cp6
ebf4e5243c Added LabelsAssigned::create into try catch
Added LabelsAssigned::create into try catch
2023-09-25 23:40:13 +10:00
cp6
f4bd6e6d66 Updated tests
Updated tests
1 was failing due to redirect for when no users exist
2023-09-24 21:35:34 +10:00
cp6
4179f70a4f Update home blade
Made Session conditional for showing details in footer to be 1 step
2023-09-22 11:01:56 +10:00
cp6
c296bd6be4 Updated details footer blade 2023-09-22 10:59:51 +10:00
cp6
76c7b0395d Updated details footer blade component
Made Session check conditional 1 step
2023-09-22 10:58:58 +10:00
cp6
da14c2dde3 Added GB6 values to server show and public show
Added GB6 values to server show and public show
2023-09-21 22:24:02 +10:00
cp6
827fc57af6 Update README.md 2023-09-20 22:33:39 +10:00
cp6
cca325cf2d Added geekbench 6 to Yabs
Added geekbench 6 inserts and varaibles to Yabs model
Updated JSON values accessor to include version 5 still
2023-09-20 22:26:00 +10:00
cp6
c19d831da5 Created migration for YABS geekbench 6 values
Created migration for YABS geekbench 6 values
2023-09-20 22:21:49 +10:00
cp6
df15ea3141 Formatting 2023-09-19 22:48:30 +10:00
cp6
047260b953 Added tabs to home page for stats and avg cards 2023-09-19 22:47:24 +10:00
corbpie
d4b75b204f
Update README.md
Added TODO for Geekbench 6 scores
2023-09-15 16:24:50 +10:00
cp6
5e6c0a60ff Removed unused ExampleComponent.vue 2023-09-14 23:53:05 +10:00
cp6
cfbc1bf3ca Updated homepage tables to remove card with padding, made tables rounded 2023-09-14 23:50:07 +10:00
cp6
f44c69caed Fixed save_yabs_as_txt causing settings update to fail validation 2023-09-14 23:44:27 +10:00
cp6
b2595fc920 Fixed pricing breakdown cache not being refreshed 2023-09-14 23:38:46 +10:00
cp6
e48678130a Removed YABS GB5 table row from server show
Removed YABS GB5 table row from server show
Need to implement GB6
2023-09-12 22:22:52 +10:00
cp6
25d338bc24 Update README.md 2023-09-11 23:32:37 +10:00
cp6
aadfc481ac timestamps false for LabelsAssigned
timestamps false for LabelsAssigned
2023-09-11 23:32:07 +10:00
corbpie
266d67f986
Merge pull request #95 from Gamerboy59/main
Fix for accessing an object instead of an array
2023-09-10 02:01:12 +10:00
Gamerboy59
3f4c46edbc
Fix for accessing an object instead of an array 2023-09-09 16:13:13 +02:00
cp6
ec2947936b Fix for accessing an object instead of an array
Fix for accessing an object instead of an array
2023-09-09 23:14:07 +10:00
cp6
6bbbc232bd Removed un-needed imports in Controllers 2023-08-20 21:25:45 +10:00
cp6
f0178ac74f Removed un-needed imports 2023-08-20 21:25:22 +10:00
cp6
966ff38320 Unused cleanup 2023-08-19 23:59:51 +10:00
cp6
7fcbd53c84 Cleaned up unused file imports 2023-08-19 23:58:51 +10:00
cp6
b20e405906 Used Eloquent 2023-08-19 23:58:25 +10:00
cp6
b512caecc7 Updated to use Eloquent rather than DB::table() 2023-08-19 23:52:59 +10:00
cp6
ae9b23cba7 Added return types 2023-08-19 23:48:34 +10:00
cp6
3bef30d861 Removed un unused create() and store() from YabsController.php 2023-08-19 23:46:52 +10:00
cp6
507f128bf6 Added return types 2023-08-19 23:46:18 +10:00
cp6
455cf45c29 Cleaned up Server.php
Added Return types on relations
2023-08-18 19:35:53 +10:00
cp6
afe5c1e525 Cleaned up queries that had un-needed '=' 2023-08-18 19:33:26 +10:00
cp6
877592f614 Updated count 2023-08-18 19:31:21 +10:00
cp6
e100203331 Updated counts to use Eloquent 2023-08-18 19:28:53 +10:00
cp6
65f0474ebe Merge remote-tracking branch 'origin/main' into main 2023-08-18 19:26:14 +10:00
cp6
de66fb2852 Fixed spelling mistake in array key 2023-08-18 19:26:00 +10:00
corbpie
c448a27a04
Update README.md for 2.3.1
Update README.md for 2.3.1
2023-08-17 22:03:01 +10:00
corbpie
3b82fd6564
Update README.md for 2.3.1
Update README.md for 2.3.1
2023-08-17 22:02:41 +10:00
corbpie
171eb63b9a
Update Pricing.php
Updated allPricing() to only be for active services, changed its cache name so this will instantly populate and work
2023-08-15 19:04:56 +10:00
corbpie
0aeb38d516
Merge pull request #92 from Gamerboy59/main
Update resources and fix register/login page
2023-08-07 17:44:48 +10:00
Gamerboy59
349599288b
Fix resource links 2023-08-06 13:34:28 +02:00
Gamerboy59
02c15e9622
Fix resource links 2023-08-06 13:29:41 +02:00
Gamerboy59
fcb99b1e31 Update css/js resources 2023-08-06 11:09:08 +00:00
Gamerboy59
72f22be781
Update package.json 2023-08-06 12:36:16 +02:00
Gamerboy59
e82941ba35
Update composer.json 2023-08-06 12:29:41 +02:00
cp6
5dbc6a5be5 Updated readme for version 2.3 2023-03-31 11:57:38 +11:00
cp6
a683f0ea42 Updated Settings.php
getSettings() now uses Eloquent rather than DB
Gave getSettings() return type of Settings
2023-03-31 11:56:18 +11:00
cp6
f488e10c2f Updated array() usages to be [] 2023-03-31 11:38:21 +11:00
cp6
8a6748f1b0 Added ability to upload own favicon
Must be either .ico, .jpg or .png format and under 40KB
Upload is done in /settings
Also removed save YABS to text input in settings form
2023-03-31 11:31:19 +11:00
cp6
f619f34081 Merge remote-tracking branch 'origin/main' into main 2023-03-30 23:16:45 +11:00
cp6
4dbfe6f7bd Removed CSS and JS files as these are no longer needed with the use of webpack 2023-03-30 23:16:27 +11:00
corbpie
2708d37450
Updated readme for 2.2.1 2023-03-20 23:41:30 +11:00
cp6
c24056c511 Fix for issue 89
Locations, OS and Providers now Alpha-Sorted correctly
2023-03-20 10:37:28 +11:00
cp6
39b9033bf8 Updated readme for version 2.2 2023-02-19 13:12:59 +11:00
corbpie
6e9591719e
Merge pull request #85 from Gamerboy59/laravel-10
Laravel 10 update
2023-02-19 13:02:42 +11:00
Gamerboy59
7ed69cbbc2
Delete package-lock.json
No specific functionality of a version is used thus I see no point in having this file as maintance overhead. Everybody should install the latest subversion.
2023-02-14 18:58:24 +01:00
Gamerboy59
102f02b064
Update package.json
Maybe devDeps and deps should be re-sorted.
2023-02-14 18:54:06 +01:00
Gamerboy59
792f010f27
Update Kernel.php
Use build in cors module of Laravel/framework which should work like the version of fruitcake.
2023-02-14 18:28:58 +01:00
Gamerboy59
cd03865162
Delete composer.lock
In my view it doesn't make sense to keep exact versions locked because no specific functions of such are used.
2023-02-14 18:27:43 +01:00
Gamerboy59
ba21329a20
Update composer.json
I havn't tested the dev dependencies and just used what composer put out as generated update. Everything seems to be working even the used functions of Guzzle appear working on php8.2 which isn't officially supported for this version. Fruitcake/cors is now part of Laravel/framework.
2023-02-14 18:25:37 +01:00
corbpie
6ecf12c226
Merge pull request #84 from Gamerboy59/appname-patch
Use app name at more places in app
2023-02-14 14:42:56 +11:00
Gamerboy59
7f83b922d2
Use app name at more places in app 2023-01-17 23:11:59 +01:00
cp6
7f88a38c73 Updated gitignore for fonts to be included
Updated gitignore for fonts to be included
2022-12-02 15:02:06 +11:00
corbpie
036122cfd8
Merge pull request #82 from cp6/Development
Updated version in readme
2022-12-02 14:36:40 +11:00
cp6
6f8d8cec37 Updated version in readme
Updated version in readme
2022-12-02 14:35:42 +11:00
corbpie
159d17e77b
Merge pull request #81 from cp6/Development
Development 2.1.9
2022-12-02 14:35:14 +11:00
cp6
055443f917 Updated readme
Updated readme
2022-12-02 14:28:45 +11:00
cp6
5dd23f6a46 Updated create views to replace previous sponsor provider as default
Updated create views to replace the previous sponsor provider that was the default
2022-12-02 14:09:00 +11:00
cp6
a01110dcd0 Added public css and js to .gitattributes
Added public css and js to .gitattributes
These do not need to be tracked
2022-12-02 14:03:07 +11:00
cp6
89525fd1c1 Added compiled assets
Added compiled assets so there can be no need to run NPM
2022-12-02 13:59:47 +11:00
cp6
e77c402aba Notes table migration (create)
Notes table migration (create)
2022-12-02 13:57:55 +11:00
cp6
924415eb66 Added & implemented notes
Added & implemented notes to servers, shared, reseller, domains, DNS and IPs

/notes is a CRUD resource
2022-12-02 13:57:28 +11:00
corbpie
1572ceaec8
Update README.md 2022-12-01 15:09:43 +11:00
cp6
0f0b06ee47 Updated readme for NPM usage
Updated readme for NPM usage
2022-11-13 21:58:01 +11:00
corbpie
14f1e808eb
Merge pull request #78 from cp6/Development
Changes for the move to NPM Webpack asset loading
2022-11-13 21:44:13 +11:00
cp6
28e58475b1 Updated package.json for "build"
Updated package.json for "build"
2022-11-13 16:27:34 +11:00
cp6
d16af57799 Added Datatables Bootstrap 5 package
Added Datatables Bootstrap 5 package
2022-11-13 15:55:34 +11:00
cp6
908b8df495 Updated server create blade view
Updated server create blade view for NPM webpack usage
2022-11-13 15:54:43 +11:00
cp6
26356b3cd7 Updated server index blade view
Updated server index blade view for NPM webpack usage
2022-11-13 15:54:27 +11:00
cp6
f0903e08f4 Updated app.blade.php for NPM webpack
Updated app.blade.php for NPM webpack
2022-11-13 15:53:57 +11:00
cp6
68f1d331f9 Updated index view blade for NPM webpack usage
Updated index view blade for NPM webpack usage
2022-11-13 15:53:05 +11:00
cp6
84902191e5 Updated delete modal component
Updated delete modal component to display none initially and have the id "confirmDeleteModal" to remove this class. This prevents the modal flashing up briefly on page laod
2022-11-13 15:47:24 +11:00
cp6
a9a3bc1ca1 Updated delete modal script to load after page loaded
Updated delete modal script to load after page loaded
2022-11-13 15:46:12 +11:00
cp6
7a2ed8887f Updated style.css to have the wide max width
Updated style.css to have the wide max width
2022-11-13 15:45:18 +11:00
cp6
290b11952b Added datatables bootstrap 5 to app.css
Added datatables bootstrap 5 to app.css
2022-11-13 15:44:53 +11:00
cp6
407d2b3368 Added axios and datatables bootstrap 5 to app.js
Added axios and datatables bootstrap 5 to app.js
2022-11-13 15:44:32 +11:00
cp6
b2b6dc36c9 Changes for the move to NPM Webpack asset loading
Changes for the move to Webpack asset loading
Bootstrap light and dark get own CSS files still
2022-11-12 14:04:04 +11:00
cp6
322898e62e Added domains limit to Shared and Reseller index view table
Added domains limit to Shared and Reseller index view table
2022-11-11 15:15:06 +11:00
cp6
14eac80912 Removed flat input bottom radius
Removed flat input bottom radius
2022-11-10 14:53:36 +11:00
cp6
0eaf09fa92 Removed logo option from auth card
Removed logo option from auth card
2022-11-10 14:53:08 +11:00
cp6
e31a785844 Updated destroy() methods for delete condition
Updated destroy() methods for delete condition
If not true then return with the error alert
2022-11-09 15:18:25 +11:00
cp6
43d22f8e16 Updated IPsController create variable names & added seed box to input
Updated IPsController create variable names & added seed boxes to select input
2022-11-09 15:05:55 +11:00
cp6
b7c02fc4fa Removed unneeded axios.min.js fixed modal delete header title
Removed unneeded axios.min.js

Fixed modal delete header title to be the IP
2022-11-08 11:20:23 +11:00
cp6
aef969532f Removed unneeded axios.min.js
Removed unneeded axios.min.js
2022-11-08 11:19:52 +11:00
cp6
42e8982e3f Updated and fixed location delete modal not showing
Updated and fixed location delete modal not showing
2022-11-08 11:17:06 +11:00
cp6
3bd9d5890c Updated all destroy() methods
Updated all destroy() methods to directly delete the resource rather than fetch from database which turns out is not needed
2022-11-08 11:14:07 +11:00
cp6
74691a6ed8 Added max length validation for OS, Provider and Location
Added max length validation for OS, Provider and Location
2022-11-08 10:39:05 +11:00
cp6
f6dee0d256 Updated YABS index view blade
Updated YABS index view blade
2022-11-07 16:06:20 +11:00
cp6
f300ef030d Updated index view blade titles for domains & misc
Updated index view blade titles for domains & misc
2022-11-06 21:41:24 +11:00
cp6
8cfb0d76a0 Updated create view blade titles for consistency
Updated create view blade titles for consistency
2022-11-06 21:39:52 +11:00
cp6
997b07a0b7 Update YabsController return formatting & compare data check
Update YabsController return formatting
Update for an is null check on data calling
2022-11-05 12:48:07 +11:00
cp6
34a12e6ffd Updated YABS single to be first() views updated for this
Updated YABS single use first()
Updated show and compare blade views
2022-11-05 12:47:08 +11:00
cp6
a397333aca Updated home.blade.php
Removed unnecessary auth & route check conditionals
Implemented card components
Removed container div element which is duplicated from parent layout
2022-11-05 11:59:03 +11:00
cp6
237577074d Created home page service tally card component
Created home page service tally card component
2022-11-05 11:57:28 +11:00
cp6
c154e2033a Created home page info card component
Created home page info card component
2022-11-05 11:57:17 +11:00
corbpie
897044f7db
Merge pull request #77 from wky0211/main
style: capitalization
2022-11-02 23:11:17 +11:00
wky0211
f0a756660e fix: URLs of README.md 2022-11-02 12:09:17 +00:00
wky0211
6b12e764c2 style: capitalization 2022-11-02 11:02:12 +00:00
cp6
1c0a82d533 Updated Server controller and create & edit views
Uses the resource id now
No passing hidden input id
Uses alert component for response
2022-10-31 16:02:50 +11:00
cp6
1b2f501744 Updated seedbox index yo use alerts component 2022-10-31 16:02:18 +11:00
cp6
b3a0e6313c Removed unused hidden inputs from create/edit blades 2022-10-31 16:01:59 +11:00
cp6
a8e1235922 Updated account index blade view
uses alert component for response
2022-10-31 16:01:16 +11:00
cp6
9d33f8ad6e Updated Reseller controller and create & edit views
Uses the resource id now
No passing hidden input id
Uses alert component for response
2022-10-31 16:00:43 +11:00
cp6
d79c571505 Updated Shared controller and create & edit views
Updated Shared controller and create & edit views

Uses the resource id now
No passing hidden input id
Uses alert component for response
2022-10-31 16:00:00 +11:00
cp6
724b7536a7 Updated resellerHosting() input parameter name
Updated resellerHosting() input parameter name to be $reseller_id
2022-10-31 15:58:47 +11:00
cp6
f7cdaeb342 Removed unused getProviders() function
Removed unused getProviders() function
2022-10-31 15:19:27 +11:00
cp6
09307828a1 Deleted unused YABS create blade view
Deleted unused YABS create blade view
2022-10-31 15:18:20 +11:00
cp6
955c3ffd67 Update settings index blade view
Implemented components
Using new data without array index [0]
2022-10-31 14:49:47 +11:00
cp6
ac0cf82e8d SettingsController update
Updated validation
Updated index view return
Update response from update
2022-10-31 14:46:07 +11:00
cp6
ae5c541516 Implemented text input component
Implemented text input component
2022-10-31 14:42:02 +11:00
cp6
5fbadf8063 Updated text input component
Updated text input component to include placeholder and error message output if exists
2022-10-31 14:41:26 +11:00
cp6
5f18ccff2c Added and implemented a form-check input component 2022-10-31 12:02:56 +11:00
cp6
1c90ff116e Fixed Undefined array key 0 in public servers blade view
Fixed Undefined array key 0 in public servers blade view
2022-10-31 12:02:40 +11:00
cp6
d9699a2ed6 Code cleanup renamed click function
Code cleanup renamed click function from onClk to fetchDnsRecords
2022-10-31 11:48:39 +11:00
cp6
285786d1a5 Minor comment fixup
Minor comment fixup
2022-10-31 11:17:30 +11:00
cp6
a20ce989dc Fixed domain cache not clearing on settings update
Fixed domain cache not clearing on settings update
2022-10-31 11:15:28 +11:00
cp6
10e2d7dbba Fix orderByProcess() input being null
Fix orderByProcess() input being null by having the input be 2 if the settings values via the session havent  been set
2022-10-31 11:14:26 +11:00
corbpie
1c8ec5fc6b
Merge pull request #74 from cp6/Development
2.1.8 Development to main
2022-10-20 15:49:15 +11:00
cp6
a56424bcaf Updated server show page for new add YABS method
Updated server show page for new add YABS method
2022-10-20 15:45:26 +11:00
cp6
bd7ca6c1cf Updated readme
Updated readme
2022-10-20 15:41:33 +11:00
cp6
846a5c3af5 Updated readme for 2.1.8
Updated readme for 2.1.8
2022-10-20 15:40:07 +11:00
cp6
4de5beb2ea Implemented the details footer component
More Implementing of the details footer component
2022-10-20 15:33:50 +11:00
cp6
dd8564a23e Implemented the new index layout for the index pages
Implemented the new index layout for the index pages.
domains, misc, reseller, seedboxes and shared use this layout
2022-10-20 14:57:30 +11:00
cp6
25822351ef Added new index layout
Added new index layout for the index pages of the CRUD as it includes vue.js for the confirm delete modal
2022-10-20 14:56:43 +11:00
cp6
beaf9af041 Updated order/sort by on index pages
Updated order/sort by on index pages
As using the relationship for price related sorts does not work this method does
2022-10-20 13:57:04 +11:00
cp6
eda9d1b945 Implemented the details footer component
Implemented the details footer component
2022-10-20 11:59:03 +11:00
cp6
c7a9e5ad80 Added details footer blade component
Added details footer blade component
2022-10-20 11:56:53 +11:00
cp6
7b602d3616 Updated confirmDeleteModal action
Updated confirmDeleteModal action
Made consistency in all the index blade files to use the component
2022-10-20 11:56:35 +11:00
cp6
9c1a853d6a Updated labels_assigned insert
Updated labels_assigned insert
2022-10-20 11:27:01 +11:00
cp6
2139629077 Updated updatePricing() to not need as_usd parameter
Updated updatePricing() to not need as_usd parameter
2022-10-20 11:17:34 +11:00
cp6
736b6c9479 Minor code update
Minor code update
2022-10-20 11:12:53 +11:00
cp6
17b7733258 Removed "add a YABs" button
Removed "add a YABs" button
No longer needed with the POST YABS
2022-10-20 11:09:13 +11:00
cp6
a649f1749e Added/Updated validation on store and update
Added/Updated validation on store and update
Updated update method in shared, server, seedboxes, reseller and misc
2022-10-20 11:06:44 +11:00
cp6
c45df61f10 Merge branch 'Development' of https://github.com/cp6/my-idlers into Development 2022-10-20 10:24:57 +11:00
cp6
b6d06a1f37 JS cleanup
JS cleanup
2022-10-20 10:24:35 +11:00
corbpie
54a705fb9b
Merge pull request #73 from cp6/main
Development up to main
2022-10-20 10:20:35 +11:00
cp6
0ad542afb4 Updated readme for 2.1.7
Updated readme for 2.1.7
2022-10-13 16:09:30 +11:00
cp6
ea8c15d2d8 Removed dashboard redirect from routes
Removed dashboard redirect from routes
2022-10-13 16:04:50 +11:00
cp6
83500fa58e Updated RouteServiceProvider::HOME for '/'
Updated RouteServiceProvider::HOME for '/' instead of '/dashboard'
2022-10-13 16:04:26 +11:00
cp6
2f639a3e95 Removed welcome and dashboard views
Removed welcome and dashboard views as these are unused
2022-10-13 16:03:54 +11:00
cp6
07194a299d Updated views title @section
Updated views title @section
This method removes the whitespace
2022-10-13 16:03:31 +11:00
cp6
3b35cae875 Implemented new response alert component into views
Implemented new response alert component into views
2022-10-13 14:36:21 +11:00
cp6
c52a55dd5a Added response alert for success and error
Added response alert for success and error
2022-10-13 14:34:00 +11:00
cp6
888171c970 Removed unused alert components
Removed unused alert components
2022-10-13 14:33:45 +11:00
cp6
cde2c8d8b6 Added input parameters for compareYabs()
Added input parameters for compareYabs()
Used abort(404) instead of return response()->view('errors.404',........
2022-10-13 14:21:27 +11:00
cp6
dcb8a78ff8 Updated the server choose compare method
Updated the server choose compare method
If 2 suitable servers aren't found then throw an error alert
2022-10-13 14:20:26 +11:00
cp6
4b3e72bc93 Updated the confirm delete modal JS
Updated the confirm delete modal JS
More readability
2022-10-13 14:19:39 +11:00
cp6
20d308b7be Removed unused labels.label with
Removed unused labels.label with
2022-10-13 13:43:09 +11:00
cp6
a1d81a3244 Updated cache timeframes
Updated cache timeframes
2022-10-13 13:37:02 +11:00
corbpie
d0d2cc71ac
Merge pull request #70 from cp6/Development
Added order by for index actions
2022-10-13 13:30:32 +11:00
cp6
b44b4bb259 Code cleanup
Removed unused osIdAsString function
Added return types to some functions
2022-10-05 11:58:19 +11:00
cp6
4abbd451b9 Added order by for index actions
Added order by setting
Order by for index
Updated showing 404 methods in serverController
2022-10-04 14:35:46 +11:00
cp6
41413a224f Updated server fixed server_type & virt
Updated server fixed server_type & virt
Merged server_type & virt into just server_type
Updated serviceServerType() for paramater types and a short/long return value
2022-10-04 11:13:57 +11:00
corbpie
ab650efa3c
Merge pull request #68 from imlonghao/patch-2
controller(server): fix update server ssh port
2022-09-27 14:36:36 +10:00
corbpie
e02f4f6b11
Merge pull request #67 from imlonghao/patch-1
fix: server page due in 0 days
2022-09-27 14:35:07 +10:00
imlonghao
3f669df922
controller(server): fix update server ssh port 2022-09-27 00:05:57 +08:00
imlonghao
dadef79367
fix: server page due in 0 days 2022-09-26 22:46:53 +08:00
cp6
2ae19112e3 Update readme
Update readme for composer
2022-09-26 13:24:53 +10:00
cp6
e9750f10ec Merge branch 'main' of https://github.com/cp6/my-idlers 2022-09-26 13:23:07 +10:00
cp6
78c2703a2b Added doctrine/dbal
Added doctrine/dbal
2022-09-26 13:22:52 +10:00
corbpie
263616ae6d
Merge pull request #64 from cp6/main
Merge main to dev
2022-09-22 13:36:10 +10:00
corbpie
bba4bf9e98
Merge pull request #63 from cp6/Development
Updated readme added run migrate
2022-09-22 13:34:38 +10:00
cp6
f81d12cac3 Updated readme added run migrate
Updated readme added run migrate
2022-09-22 13:33:21 +10:00
corbpie
e0f9f27414
Merge pull request #62 from cp6/Development
Development (2.1.6)
2022-09-22 13:31:20 +10:00
cp6
38dafff877 Readme for 2.1.6
Readme for 2.1.6
2022-09-22 13:30:34 +10:00
cp6
5ef21ec63f Added custom HTTP error pages
Added custom HTTP error pages
2022-09-22 13:29:12 +10:00
cp6
df9411e1bf Updated compare view for nullable values
Updated compare view for nullable values
2022-09-22 13:20:44 +10:00
cp6
df779ba633 Updated models and controllers to use first()
Updated models and controllers to use first() rather than get() with [0]
2022-09-22 13:20:23 +10:00
cp6
8221bf45d8 Removed unused functions in controllers
Removed unused functions in controllers
2022-09-22 12:59:58 +10:00
cp6
69a972e0d9 Updated & fixed YABS JSON parser
Fixed ram conversion
Fixed disk conversion
Fixed disk speed conversion
2022-09-22 12:26:56 +10:00
cp6
6b4f4e8437 Updated error alert component 2022-09-22 12:25:56 +10:00
cp6
d4052259cd Updated YABS table for GB5 values to be nullable
Updated YABS table for GB5 values to be nullable
2022-09-22 12:25:41 +10:00
cp6
51bad4a64b Fixed OS icons not showing for correct OS INT
Fixed OS icons not showing for correct OS INT
2022-09-22 12:25:19 +10:00
cp6
bb901ca703 Removed old YABS add/store method & functions
Removed old YABS store method & functions
2022-09-22 12:24:47 +10:00
cp6
9dc73ba4fe Fixed YABS JSON parsing disk as ram
Fixed YABS JSON parsing disk as ram
Added cache forget for YASB and server
2022-09-22 11:12:29 +10:00
corbpie
91a1466f09
Merge pull request #60 from cp6/Development
Development v2.1.5
2022-09-07 16:02:48 +10:00
cp6
5bf529661a Updated readme v 2.1.5
Updated readme v 2.1.5
2022-09-07 16:01:33 +10:00
cp6
49b9f4e4ad Updated readme for version 2.1.4
Updated readme for version 2.1.4
2022-09-07 15:50:23 +10:00
cp6
9e824e0cb6 Added version v2022-08-20 to YABS parser
Added version v2022-08-20 to YABS parser
2022-09-07 15:50:01 +10:00
cp6
a8a87a2e0f Updated server show page
Updated server show page for a click reveal YABS command to automatically POST the result. e.g

curl -sL yabs.sh | bash -s -- -s "http://domain.com/api/yabs/tnSJLyhz/THEUSERAPIKEYISHERE"
2022-09-07 14:00:21 +10:00
cp6
13a37242d2 Updated yabs/ POST API request
Needs the server for the YABS and users api key in the URL
2022-09-07 13:58:38 +10:00
cp6
badb640bd9 Updated storeYabs API function
Updated storeYabs API function
Now used to insert YABS from the POST request

-s flag
2022-09-07 13:57:43 +10:00
cp6
c79f67916e Added YABS from JSON parsing
Added YABS from JSON parsing
2022-09-07 13:56:56 +10:00
cp6
f36d73c04d Merge branch 'Development' of https://github.com/cp6/my-idlers into Development 2022-08-30 23:37:21 +10:00
cp6
d1eb588b11 Updated pricing model insertPricing() func
Updated pricing model insertPricing() function
Move as_usd parameter into the function
Updated is_active check as it is an int anyway
2022-08-30 23:37:05 +10:00
cp6
8f8ae8edb5 Updated YABS processor
Removed === and replaced with str_contains for the line validators

As when posting with API the \r character post-pending each line don't exist
2022-08-10 00:37:40 +10:00
cp6
007890855b Added YABS to API
Get YABS from API
Add/create/post/store YABS
2022-08-10 00:34:03 +10:00
cp6
3b9ff1ab85 Possible fix for YABs migration dropping multiple columns error
Possible fix for YABs migration dropping multiple columns error
2022-07-25 10:38:06 +10:00
cp6
59b3138dfb Possible YABs foreign keys migrations error fix
Possible YABs foreign keys migrations error fix
2022-07-25 10:33:54 +10:00
cp6
20058cb9c9 Issue 56 & 57 fix?
Issue 56 & 57 fix?
2022-07-22 23:49:18 +10:00
corbpie
82f3b62761
Merge pull request #55 from cp6/Development
Development 2.1.3
2022-07-20 14:55:51 +10:00
cp6
01e2613d90 Updated readme
Updated readme
2022-07-20 14:48:19 +10:00
cp6
e6943b4640 Updated readme for 2.1.3
Updated readme for 2.1.3
2022-07-20 14:47:37 +10:00
cp6
3340d296f9 Updated ApiController to use new Class fetching (Relationships)
Updated ApiController to use new Class fetching (Relationships)
2022-07-20 14:37:37 +10:00
cp6
bb07f86deb Updated Labels class
Removed unused function
Added assigned() hasMany
2022-07-20 14:36:19 +10:00
cp6
c9108efd63 Updated SeedBoxes class to use relationships + cache
Updated SeedBoxes class to use relationships + cache
2022-07-20 14:35:37 +10:00
cp6
356bd368a4 Updated Misc class to use relationships + cache
Updated Misc class to use relationships + cache
2022-07-20 14:35:12 +10:00
cp6
3d87c645dc Updated style max container width
Updated style max container width from 1320px to 1420px
2022-07-20 13:12:46 +10:00
cp6
b1a135b41b Updated YABs show for new values
Updated YABs show for new values (uptime, distro, swap)
2022-07-20 13:08:52 +10:00
cp6
47bfcea4c8 Added more YABs value saving & YABs save txt setting
Added more YABs value saving (uptime, distro, kernel and swap memory)
Added setting for saving YABs output to txt yes/no
2022-07-20 12:51:45 +10:00
cp6
b9aed757ad Added YABs to Json output
Added YABs to Json output
Cleaned up old unused functions
2022-07-20 00:20:15 +10:00
cp6
e46b7b3c63 Added back & edit icon button components
Added back & edit icon button components
2022-07-20 00:19:43 +10:00
cp6
88636b88c7 Updated Domains model for relationships
Updated Domains model for relationships
Added caching
2022-07-20 00:19:05 +10:00
cp6
36194efbd8 Updated Shared for data index
Updated Shared for data index
2022-07-19 15:55:37 +10:00
cp6
eb31701076 Updated Reseller model to use relationships
Updated Reseller model to use relationships
Added caching for Reseller
2022-07-19 15:55:10 +10:00
corbpie
dbc54c44d1
Merge pull request #54 from cp6/Development
Development (2.1.2)
2022-07-19 15:27:16 +10:00
cp6
1553f4e3f9 Updated readme for 2.1.2
Updated readme for 2.1.2
2022-07-19 15:26:25 +10:00
cp6
cf386e8776 Updated Labels class to have table name
Updated Labels class to have table name
2022-07-19 15:21:35 +10:00
cp6
aaac697774 Updated Shared class to use relationships
Updated Shared class to use relationships
No more joins
Added cache for all shared and single shared
2022-07-19 15:21:13 +10:00
cp6
0491f84ed4 Updated Server model & Added LabelsAssigned model
Huge update for Server to use relationships (no more joins)
Created LabelsAssigned class for the labels relationship
Removed pricingForService() function
Removed now unused server cache forgets
2022-07-19 13:12:51 +10:00
cp6
38fe21bbef Fixed switch in getIpForDomain()
Fixed switch in getIpForDomain()
2022-07-18 14:51:25 +10:00
cp6
db9c82f9db Fixed server compare initial selection
Fixed server compare initial selection
Will now work without having to select (re-select) options
2022-07-18 14:44:16 +10:00
cp6
5a4d0bf13f Updated DiskSpeed &NetworkSpeed for YABs relationship
Updated DiskSpeed &NetworkSpeed for YABs relationship
2022-07-18 14:43:22 +10:00
cp6
50d4b8b3e2 Added YABs compare & implemented cache for YABs
Added YABs compare
Made YABs calls use relationship with disk and network table
Update YABs views to reflect access changes in data
Implemented cache for YABs
Added Server function serverYabsAmount() to count YABs for a server id
2022-07-18 14:27:11 +10:00
corbpie
dc45ffb403
Merge pull request #53 from Gamerboy59/patch-1
Update composer.lock for improved PHP8.1 support
2022-07-11 15:22:33 +10:00
Gamerboy59
e1d448403c
Update composer.lock 2022-07-10 21:09:08 +02:00
corbpie
a752e2ab60
Merge pull request #52 from imlonghao/fix/cache
refresh servers cache on due date changed and one other change
2022-07-05 00:01:19 +10:00
imlonghao
6014663a9f
model(home): refresh servers cache on due date changed 2022-07-03 11:23:11 +08:00
cp6
39ffe0712b Fixed spacing in domain listing
Fixed spacing in domain listing
2022-06-28 11:33:07 +10:00
corbpie
8f004cfc79
Merge pull request #51 from imlonghao/feat/currency-rate-api
feat(pricing): add currency api
2022-06-28 11:31:41 +10:00
imlonghao
209528da15
feat(pricing): add currency api 2022-06-27 22:04:30 +08:00
corbpie
a9b3f4eed6
Merge pull request #50 from imlonghao/fix-broken-link
view(index): fix the broken link to misc page
2022-06-27 10:38:56 +10:00
imlonghao
32d93b7137
view(index): fix the broken link to misc page 2022-06-27 00:39:22 +08:00
corbpie
7dd8ce0905
Merge pull request #49 from imlonghao/cpu/fillable
model(server): add cpu to fillable
2022-06-26 21:35:25 +10:00
imlonghao
9fd7d3d33b
model(server): add cpu to fillable 2022-06-26 15:47:18 +08:00
cp6
7daf609b91 Fixed changes onto previous migration for YABs F key
Fixed changes onto previous migration for YABs F key
2022-06-24 12:41:30 +10:00
corbpie
6e1f4bb4ea
Merge pull request #47 from imlonghao/no-ghz
yabs: change Ghz to Mhz
2022-06-24 11:29:56 +10:00
cp6
ee73ea1a31 Fixed YABs, disk speed and network foreign key on delete issues
Fixed YABs, disk speed and network foreign key on delete issues
2022-06-24 11:17:59 +10:00
cp6
2f8db4ca24 Updated YABs processing for newer network location
Updated YABs processing for newer network location
2022-06-24 11:17:28 +10:00
imlonghao
2324944a09
yabs: change Ghz to Mhz 2022-06-23 22:41:28 +08:00
corbpie
6b34dd6b8a
Merge pull request #46 from cp6/Development
Development 2.1.1
2022-06-19 21:28:33 +10:00
cp6
c926dfb179 Updated readme for 2.1.1
Updated readme for 2.1.1
2022-06-19 21:27:34 +10:00
cp6
b9c756c8d5 Added pricing update with API
Added pricing update with API
2022-06-19 21:22:23 +10:00
cp6
b34780546b Added destroy and update server to API
Added destroy and update server to API
2022-06-19 16:30:27 +10:00
cp6
546f0ba565 Added YABs version v2022-06-11
Added YABs version v2022-06-11

Cleaned up version validation check
2022-06-19 15:30:32 +10:00
cp6
227677a62a Added POST API to create server
Added POST request to API to create a server
2022-06-19 14:56:19 +10:00
cp6
8230fed809 Updated readme
Updated readme
2022-06-01 23:37:23 +10:00
cp6
529376a12d Updated settings page layout
Updated settings page layout
2022-05-29 17:10:46 +10:00
cp6
025d206618 Updated doServicesCount func to be cached
Updated doServicesCount func to be cached
2022-05-29 17:02:49 +10:00
cp6
8e5a1f62c3 Added home page pricing break down func to cache
Added home page pricing break down func to cache
2022-05-29 16:56:13 +10:00
cp6
f72eec01f7 Extended settings cache expiration length
Extended settings cache expiration length
2022-05-29 16:50:15 +10:00
cp6
73f2d8f07f Added dashboard currency setting
Added dashboard currency setting
2022-05-29 16:46:55 +10:00
cp6
ff280e6c62 Added clockwork to git ignore
Added clockwork to git ignore
2022-05-29 16:46:24 +10:00
cp6
319be38fa9 Added dashboard currency setting migration
Added dashboard currency setting migration
2022-05-29 11:40:13 +10:00
cp6
4c333c5e6b Updated readme
Updated readme
2022-05-22 13:35:32 +10:00
corbpie
4d9b55bf17
Updated readme for logo inclusion
Updated readme for logo inclusion
2022-05-22 13:32:22 +10:00
cp6
77b8b88878 Added logo and ico
Added logo and ico
2022-05-22 13:29:59 +10:00
corbpie
fec3c95c02
Merge pull request #43 from m3nu/finalize-gh-workflow
Enable Docker image rebuild on every push, add PikaPods hosting option.
2022-05-19 23:45:11 +10:00
corbpie
36ea6f42c7
Merge pull request #44 from Gamerboy59/patch-1
Updating dependencies and require PHP8 now
2022-05-19 23:44:36 +10:00
Gamerboy59
8c50bb9074
Update composer.lock 2022-05-19 15:39:02 +02:00
Gamerboy59
4c5f769e7e
Update composer.json 2022-05-19 15:38:04 +02:00
Manu
2801dd9e52 Enable Docker image rebuild on every push, add PikaPods hosting option. 2022-05-17 16:36:07 +04:00
corbpie
2a6087b843
Merge pull request #42 from cp6/2.1.0
2.1.0
2022-05-16 23:17:37 +10:00
cp6
5e953d2c64 Updated readme
Updated readme
2022-05-16 23:16:40 +10:00
cp6
2c8ad166e4 Added demo site to Readme
Added demo site to Readme
2022-05-16 23:14:20 +10:00
cp6
61ae4e9011 Updated Readme
Updated Readme
2022-05-16 21:35:33 +10:00
cp6
908f8b904f Updated YABs insert for version v2022-05-06
Updated YABs insert for version v2022-05-06
2022-05-16 21:32:07 +10:00
cp6
f6cf9c7a65 Fixed YABs insert error displaying
Fixed YABs insert error displaying
2022-05-16 21:30:52 +10:00
cp6
464b2096c4 Updated Readme
Updated Readme
2022-05-16 16:46:48 +10:00
cp6
0bb3d75fef Updated Readme
Updated Readme
2022-05-16 16:46:08 +10:00
cp6
e1bbcc3c9f Added Seedbox to API
Added Seedbox to API
2022-05-16 16:36:58 +10:00
cp6
ebb8edaac3 Updated Home controller
Moved last logics into model

Added comments

Simplified calls
2022-05-16 16:22:19 +10:00
cp6
24a583f3fd Added setSettingsSession function
Added setSettingsSession function

Moved get settings from Home controller into settings model
2022-05-16 15:43:51 +10:00
cp6
fb22a50ff6 Updated foreign keys
Updated foreign keys: Removed location, provider and OS id keys
2022-05-16 15:39:10 +10:00
cp6
f9e6ec1da3 Updated DNS controller for labels insert & delete
Updated DNS controller for labels insert & delete
2022-05-16 14:54:37 +10:00
cp6
59f644a1c9 Added forget all_pricing cache to Server model
Added forget all_pricing cache to Server model
2022-05-16 14:45:22 +10:00
cp6
c041976731 Updated home blade for seedboxes
Updated home blade for seedboxes

Fixed the view button in new services table
2022-05-16 14:44:55 +10:00
cp6
81b8dcaa74 Removed defunct cache forget functions 2022-05-16 14:44:05 +10:00
cp6
f70d01552b Updated home page cache forget for Home model one
Updated home page cache forget for Home model one
2022-05-16 14:43:33 +10:00
cp6
8e968a60c9 Updated Home controller Added Home model
Moved most DB calls and logic into the model
2022-05-16 14:42:48 +10:00
cp6
07c0b8a655 Added Seed box CRUD
Added Seed box CRUD
2022-05-16 12:07:35 +10:00
cp6
e4f0d95128 Updated Providers controller
Moved show functions into model
2022-05-15 21:01:02 +10:00
cp6
4cf38ba45c Added Sao Paulo Brazil to locations
Added Sao Paulo Brazil to locations
2022-05-15 16:53:57 +10:00
cp6
810954c145 Added Kharkiv Ukraine to locations
Added Kharkiv Ukraine to locations
2022-05-15 16:51:44 +10:00
cp6
f5cc42c0fe Updated Reseller controller
Cleaned up, Moved DB calls to model
2022-05-15 16:49:54 +10:00
cp6
6d1cbef740 Updated Domains controller
Cleaned up, Moved DB calls to model
2022-05-15 16:22:47 +10:00
cp6
a054e83d1e Updated Shared controller
Moved DB calls to model
Used existing DB call functions
2022-05-15 12:01:48 +10:00
cp6
70622f827b Cleaned up servers controller
removed unused classes
2022-05-15 12:00:05 +10:00
cp6
e33559fddc Updated pricing, labels and dns calls to be cached
Updated pricing, labels and dns calls to be cached
2022-05-15 01:22:47 +10:00
cp6
2f3eaadb25 Cleaned up server controller
Moved DB calls into models & cached them
2022-05-15 01:21:51 +10:00
cp6
ed0d76df25 Updated servers index cache time to 1 month
Updated servers index cache time to 1 month
2022-05-15 00:45:33 +10:00
cp6
18c73aca95 Added and applied updatePricing function
Added and applied updatePricing function
2022-05-15 00:43:36 +10:00
cp6
9204a05654 Added insertPricing & allPricing function
Added insertPricing & allPricing function
2022-05-15 00:24:05 +10:00
cp6
3948dd50db Updated home layout most tally cards to be col-6
Updated home layout most tally cards to be col-6
2022-05-15 00:15:45 +10:00
cp6
779412a8da Updated label and DNS count to use cache
Updated label and DNS count to use cache
2022-05-15 00:15:20 +10:00
cp6
3ff6cfe56e Minor styling changes in dark theme
Minor styling changes in dark theme
2022-05-14 23:52:47 +10:00
cp6
da34256194 Added VMware for server virt type
Added VMware for server virt type
2022-05-14 23:39:31 +10:00
cp6
571c1c2d28 Removed server edit passed in data
Removed server edit passed in data
2022-05-14 23:36:16 +10:00
cp6
5ed5dc91a9 Updated server create view data
Updated server create view data
2022-05-09 16:03:17 +10:00
cp6
31f1faf8ee Added a dark mode theme
Added a dark mode theme with settings option
2022-05-09 15:57:02 +10:00
cp6
7b37eba517 Update all locations call type
Update all locations call type
2022-05-09 15:39:29 +10:00
cp6
1251fae0df Fixed providers cache
Fixed providers cache
2022-05-09 15:39:03 +10:00
cp6
d3125170e6 Fixed locations cache
Fixed locations cache
2022-05-09 15:00:33 +10:00
cp6
6da3af1364 Fixed OS cache
Fixed OS cache
2022-05-09 14:57:38 +10:00
cp6
06a3d71222 Added foreign keys
Added foreign keys to some tables
2022-05-09 14:42:09 +10:00
cp6
ecc9a61069 Cleaned up IPs & Label assignments
Cleaned up IPs & Label assignments when creating, updating and deleting
2022-05-09 14:35:07 +10:00
cp6
ff3d840b65 Removed .idea
Removed .idea
2022-05-09 11:40:29 +10:00
corbpie
edf11fed8a
Merge pull request #40 from Gamerboy59/patch-1
Update dependencies
2022-05-07 11:42:02 +10:00
Gamerboy59
9654db6b65
Update composer.lock 2022-05-05 16:01:48 +02:00
Gamerboy59
a8e83524d2
Update composer.json 2022-05-05 15:58:52 +02:00
corbpie
2834924045
Updated YABs version compatibility
Updated YABs version compatibility for version v2022-04-30
2022-05-01 13:23:23 +10:00
corbpie
2204970248
Merge pull request #37 from m3nu/main
Clean up Docker run.sh script, add GH Workflow for image updates
2022-03-14 21:15:52 +11:00
corbpie
8054e307f3
Merge pull request #36 from Gamerboy59/patch-1
Fixing some typos and set title to app.name
2022-03-14 21:13:58 +11:00
Manuel Riel
8eed4844e8 Avoid overwriting DB 2022-03-14 06:51:41 +00:00
Manuel Riel
bf2861853f Fix run.sh to run setup only once, add Docker example in README, add Workflow to update container 2022-03-14 06:19:11 +00:00
Gamerboy59
3e38b5ac09
Fixing some typos and set title to app.name
Fixing some typos in declarations
2022-03-14 00:05:38 +01:00
Gamerboy59
29df6d6b43
Email field name must be lower case 2022-03-14 00:03:06 +01:00
Gamerboy59
b1c4c81e4d
Email field name must be lower case 2022-03-14 00:02:54 +01:00
Gamerboy59
5bbf759d84
Email field name must be lower case 2022-03-14 00:02:03 +01:00
Gamerboy59
45bffa0bef
Email field name must be lower case 2022-03-14 00:01:47 +01:00
Gamerboy59
715adec419
Get CPU from database too
CPU was set as fixed value but now retrieving it from database object like all other settings
2022-03-13 23:54:25 +01:00
Gamerboy59
715be1a98e
Set app.name as title
Get title from .env config and set it as website name
2022-03-13 23:50:32 +01:00
Gamerboy59
584c01ca06
make dashboard cards href relative
Relative uri in case laravel isn't run on top level
2022-03-13 23:40:09 +01:00
corbpie
309971d60a
Merge pull request #35 from m3nu/main
Added Dockerfile, Fixed HTTPS
2022-03-14 09:40:05 +11:00
Manuel Riel
416d28c3df debug to false 2022-03-13 20:19:24 +00:00
Manuel Riel
4e661682c2 Add Dockerfile, fix https 2022-03-13 20:09:50 +00:00
cp6
5b1c1b663f Fixed sqlite not supporting 'IGNORE' on insert queries
Fixed sqlite not supporting 'IGNORE' on insert queries
2022-03-13 22:28:01 +11:00
cp6
35f96a6ee6 Added number formatting for summary cards
Added number formatting for summary cards
2022-03-13 22:15:46 +11:00
cp6
f096cc5ca6 Merge branch 'main' of https://github.com/cp6/my-idlers 2022-03-13 22:13:51 +11:00
cp6
f3c3d3a9f3 Updated Ram and Disk MB, GB and TB conversion to binary
Updated Ram and Disk MB, GB and TB conversion to binary
2022-03-13 22:13:45 +11:00
corbpie
40835b5800
Merge pull request #32 from Gamerboy59/main
Update dependencies to improve php8.1 support
2022-03-10 11:52:05 +11:00
cp6
8195fba66e Fix for Undefined array key 0 due to seed not being run
Fix for Undefined array key 0 due to seed not being run
2022-03-09 23:16:15 +11:00
Gamerboy59
4d6f78f653 Update dependencies to improve php8.1 support 2022-03-09 11:55:51 +01:00
cp6
2d8d3b5949 Formatting, added blade components to server edit
Formatting, added blade components to server edit
2022-03-09 13:46:23 +11:00
cp6
e9123763f8 Added settings for due soon & recently added amounts
Added settings for due soon & recently added amounts tables on the homepage
2022-03-09 13:41:12 +11:00
cp6
4688dd15ca Added new SUM cards for server specs
Added new SUM cards for server specs e.g Total CPU, ram, disk, bandwidth and different locations and providers
2022-03-09 13:18:30 +11:00
cp6
0ad3a2c812 Merge branch 'main' of https://github.com/cp6/my-idlers 2022-03-08 16:14:10 +11:00
cp6
894a0bc3d9 Updated readme
Updated readme
2022-03-08 16:13:49 +11:00
corbpie
6e914e3632
Cleanup
Cleanup
2022-03-08 14:00:19 +11:00
cp6
a09a65b1ea Updated readme (Removed MySQL requirement)
Updated readme (Removed MySQL requirement)
2022-03-08 11:03:45 +11:00
cp6
14bd846c67 Updated unique key naming to prevent conflicts
Updated unique key naming to prevent conflicts
2022-03-07 13:25:32 +11:00
cp6
770437bc5f Updated locations seeder array formatting
Updated locations seeder array formatting
2022-03-06 21:47:00 +11:00
cp6
a388ee630b Updated for sponsor (Cloud Five Limited)
Updated for sponsor (Cloud Five Limited)
2022-03-06 21:29:06 +11:00
corbpie
abceb514c7
Merge pull request #29 from istiak101/main
Add more data
2022-03-06 14:39:12 +11:00
Istiak Ferdous
0549b52e1a
add more data 2022-03-06 09:26:18 +06:00
cp6
f628a402eb Updated readme
Updated readme
2022-03-06 13:03:59 +11:00
cp6
642eb5a5b9 Updated servers public view ram value
Updated servers public view ram value
2022-03-06 13:01:31 +11:00
cp6
4d9883c7b9 ignore .idea
ignore .idea
2022-03-06 03:17:19 +11:00
cp6
8ac583f012 Goodbye .idea
Goodbye .idea
2022-03-06 03:16:26 +11:00
cp6
e1b42e6b23 Update .gitignore 2022-03-06 03:11:48 +11:00
cp6
07c7e9e9a6 Merge branch 'main' of https://github.com/cp6/my-idlers 2022-03-06 03:10:45 +11:00
cp6
a38f985ee5 Update .gitignore 2022-03-06 03:09:49 +11:00
corbpie
eee1fbc432
Delete AUTH.php 2022-03-06 03:07:58 +11:00
corbpie
d645dbbd25
Delete update1.4to1.5.sql 2022-03-06 03:07:34 +11:00
corbpie
70aaebc484
Merge pull request #28 from cp6/v2
V2 (Laravel re-make)
2022-03-06 03:06:58 +11:00
cp6
e1232433ad Merge branch 'main' into v2 2022-03-06 03:06:11 +11:00
cp6
da83aa1f23 Fix
Fix
2022-03-06 02:58:25 +11:00
cp6
d429ecd44d Revert "Revert "V2 (Laravel re-make)""
This reverts commit a7e0c005c0.
2022-03-06 02:29:58 +11:00
cp6
a7e0c005c0 Revert "V2 (Laravel re-make)"
This reverts commit d13e170f22.
2022-03-06 02:28:04 +11:00
cp6
e410eed97c V2 (Laravel re-make)
V2 (Laravel re-make)
2022-03-06 02:22:28 +11:00
cp6
d13e170f22 V2 (Laravel re-make)
V2 (Laravel re-make)
2022-03-06 02:22:16 +11:00
cp6
347d1a3186 V2 (Laravel re-make)
V2 (Laravel re-make)
2022-03-06 02:21:57 +11:00
cp6
fd22b0bf58 V2 (Laravel re-make)
V2 (Laravel re-make)
2022-03-06 02:02:12 +11:00
cp6
972edfc66e Updated readme for v2
Updated readme for v2
2022-03-06 01:56:43 +11:00
cp6
e59f66e023 Formatting
Formatting
2022-03-06 01:56:35 +11:00
cp6
7b30823dc6 Fixed servers compare index reference error
Fixed servers compare index reference error
2022-03-06 01:43:21 +11:00
cp6
70b6a50666 Added OS and currency defaults to settings form
Added OS and currency defaults to settings form
2022-03-06 00:55:10 +11:00
cp6
2d42001e7f Updated creates for defaults settings
Updated creates for defaults settings
2022-03-06 00:54:56 +11:00
cp6
a9adf342c0 Added os select component
Added os select component
2022-03-06 00:54:24 +11:00
cp6
a7d0e07723 Added default OS and currency to settings
Added default OS and currency to settings
2022-03-06 00:53:57 +11:00
cp6
07d90e1b8a Updated server create and index blades
Updated server create and index blades
2022-03-05 16:40:04 +11:00
cp6
3e4c3bc79e Updated servers index blade
Updated servers index blade
2022-03-05 16:28:57 +11:00
cp6
9305789b7b Updated servers edit next_due_date to be date validated
Updated servers edit next_due_date to be date validated
2022-03-05 15:05:35 +11:00
cp6
d129e966b9 Updated On YABs delete foreget serevrs cache 2022-03-05 14:14:15 +11:00
cp6
dbb5225d45 Updated currency defaults in create blades
Updated currency defaults in create blades
2022-03-05 14:13:48 +11:00
cp6
de8bce9bc2 Updated register card heading
Updated register card heading
2022-03-05 13:23:15 +11:00
cp6
c83e0887a1 Removed servers, shared and domain examples seed
Removed servers, shared and domain examples seed
2022-03-05 13:22:23 +11:00
cp6
07de2843cf Added modal style to misc index
Added modal style to misc index
2022-03-05 12:08:58 +11:00
cp6
5670441c4b Updated misc create default date for owned since
Updated misc create default date for owned since
2022-03-05 12:08:41 +11:00
cp6
c079e72104 Formatting fixes
Formatting fixes
2022-03-05 12:02:10 +11:00
cp6
e844820f31 Updated server show blade
Updated server show blade
2022-03-05 12:01:56 +11:00
cp6
3bf5643b14 Added Vue to servers compare choose
Added Vue to servers compare choose
2022-03-05 11:57:42 +11:00
cp6
2ad4a87b3d Fixed network unique index
Fixed network unique index
2022-03-05 11:57:24 +11:00
cp6
b4f214f376 Updated yabs delete
Updated yabs delete
2022-03-05 11:57:12 +11:00
cp6
b3ed167ed9 Updated servers show blade
Updated servers show blade
2022-03-05 11:28:28 +11:00
cp6
87322fd2b5 Updated settings to be fillable
Updated settings to be fillable
2022-03-05 11:06:58 +11:00
cp6
fbc22c14b4 Disabled demo user on seed
Disabled demo user on seed
2022-03-05 11:06:35 +11:00
cp6
58aabe8fc1 Fixed show_public on servers create
Fixed show_public on servers create
2022-03-05 11:06:15 +11:00
cp6
e84f404af8 If no users exist redirect to /register from /login
If no users exist redirect to /register from /login
2022-03-05 11:05:59 +11:00
cp6
6dfcaea04f If no users exist redirect to /register from /login
If no users exist redirect to /register from /login
2022-03-05 11:05:50 +11:00
cp6
52a5c2427c Updated migrations for primary keys
Updated migrations for primary keys
2022-03-05 11:05:30 +11:00
cp6
d4f2b57b02 Added labels to dns show controller
Added labels to dns  show controller
2022-03-05 01:11:56 +11:00
cp6
de34f87bb2 Updated dns show blade
Updated dns show blade
2022-03-05 01:11:18 +11:00
cp6
df6d85a7ea Updated ips migration for unique index
Updated ips migration for unique index
2022-03-05 01:02:39 +11:00
cp6
b7ce9b7402 Updated labels_assigned migration for unique key index
Updated labels_assigned migration for unique key index
2022-03-05 01:00:21 +11:00
cp6
85e4024258 Updated dns view blade
Updated dns view blade
2022-03-05 01:00:03 +11:00
cp6
829df33abd Updated misc show blade
Updated misc show blade
2022-03-05 00:33:51 +11:00
cp6
9ce7bbd410 Added non active servers tab, table and cache
Added non active servers tab, table and cache
2022-03-04 16:11:25 +11:00
cp6
f76aaf2e2a Updated migrations for unique
Updated migrations for unique
2022-03-03 14:51:47 +11:00
cp6
57468e7a87 Removed unused migrations
Removed unused migrations
2022-03-03 14:51:31 +11:00
cp6
01cf83a31c Added all labels cache
Added all labels cache
2022-03-03 14:45:32 +11:00
cp6
92bc68401a Added all locations cache
Added all locations cache
2022-03-03 14:43:54 +11:00
cp6
a005fc4576 Added all providers cache
Added all providers cache
2022-03-03 14:39:51 +11:00
cp6
693af83f6b Added IPs link to navigation layout 2022-03-03 14:08:00 +11:00
cp6
fbcf8d66de Updated empty checks on misc and dns index
Updated empty checks on misc and dns index
2022-03-03 11:53:42 +11:00
cp6
35eb6baa10 Updated for blade components shared & reseller views
Updated for blade components shared & reseller views
2022-03-03 11:53:15 +11:00
cp6
9c240c5c52 Added locations and providers show on empty
Added locations and providers show on empty
2022-03-03 00:03:42 +11:00
cp6
1f33eebf3c Added providers view
Added providers view
2022-03-03 00:00:58 +11:00
cp6
dc78044e47 Added locations view
Added locations view
2022-03-02 23:57:45 +11:00
cp6
87a186fb75 Updated error file title
Updated error file title
2022-03-02 16:07:36 +11:00
cp6
78e7e8927a Database factories formatting
Database factories formatting
2022-03-02 16:02:59 +11:00
cp6
de63bf0ab3 Database seeder formatting
Database seeder formatting
2022-03-02 16:01:57 +11:00
cp6
ba685c5504 Updated readme
Updated readme
2022-03-02 15:50:28 +11:00
cp6
c006dbbeac Formatting
Formatting
2022-03-02 15:46:17 +11:00
cp6
a1df4d6b78 Updated public servers view
Updated public servers view
2022-03-02 15:36:38 +11:00
cp6
026643a7e0 Updated shared create & edit for blade components
Updated shared create & edit for blade components
2022-03-02 15:00:09 +11:00
cp6
5be2891985 Updated reseller create & edit for blade components
Updated reseller create & edit for blade components
2022-03-02 14:47:27 +11:00
cp6
6e337fbcbb Updated servers create default owned since date
Updated servers create default owned since date
2022-03-02 14:46:55 +11:00
cp6
47cb84749d Formatting
Formatting
2022-03-02 14:46:35 +11:00
cp6
bc4b19650a Added show_public for servers
Added show_public for servers
2022-03-02 13:52:55 +11:00
cp6
8dd2ee6393 Added labels for reseller services
Added labels for reseller services
2022-03-02 01:36:59 +11:00
cp6
53a1059e69 Updated API key output
Updated API key output
2022-03-02 01:36:25 +11:00
cp6
7adb5ddff2 Update labels show
Update labels show
2022-03-02 01:12:20 +11:00
cp6
298dc28dc6 Updated reseller controller ip filter
Updated reseller controller ip filter
2022-03-02 01:12:09 +11:00
cp6
4563ccd471 Updated labels_assigned label_id to not be unique
Updated labels_assigned label_id to not be unique
2022-03-02 01:11:44 +11:00
cp6
2d832f0159 Added cache for all servers
Added cache for all servers
2022-03-02 00:42:50 +11:00
cp6
413aac5d2f Added home page cache forgets upon CUD
Added home page cache forgets upon CUD
2022-03-01 15:59:46 +11:00
cp6
07b8cd14c1 Added cache for home page
Added cache for home page
2022-03-01 15:59:13 +11:00
cp6
077c048dda Updated shared for IP address CRUD
Updated shared for IP address CRUD
2022-02-22 16:06:23 +11:00
cp6
cb2ff263fb Updated reseller for IP address CRUD
Updated reseller for IP address CRUD
2022-02-22 15:59:30 +11:00
cp6
9eafe5fa55 Updated servers API for IP addresses
Updated servers API for IP addresses
2022-02-22 13:41:55 +11:00
cp6
d5620294e2 Added IP addresses API
Added IP addresses API
2022-02-22 13:38:44 +11:00
cp6
e15b317bb4 Updated servers for new IP CRUD
Updated servers for new IP CRUD
2022-02-22 13:30:39 +11:00
cp6
226c1ed4c2 Updated IP controller for store, update and delete
Updated IP controller for store, update and delete
2022-02-21 14:47:36 +11:00
cp6
12d52bee46 Updated IPs create
Updated IPs create
2022-02-21 14:47:19 +11:00
cp6
136119affe Updated IPs index
Updated IPs index
2022-02-21 14:47:13 +11:00
cp6
2257d758c3 Updated IPs index blade
Updated IPs index blade
2022-02-21 11:57:21 +11:00
cp6
e0996975d3 Updated IPs create blade
Updated IPs create blade
2022-02-21 11:57:13 +11:00
cp6
4b158f08a8 Updated IPs controller
Updated IPs controller
2022-02-21 11:57:04 +11:00
cp6
68e9045dc3 Ips index
Ips index
2022-02-21 11:29:54 +11:00
cp6
23fa967981 Updated IPs route
Updated IPs route
2022-02-21 11:29:41 +11:00
cp6
894321fad6 Added Vue and axios to DNS index
Added Vue and axios to DNS index
2022-02-21 11:29:25 +11:00
cp6
ff59a86c19 Update routes for IPs controller
Update routes for IPs controller
2022-02-21 11:24:46 +11:00
cp6
178154c7f0 Update routes for IPs controller
Update routes for IPs controller
2022-02-21 11:23:40 +11:00
cp6
807221a7c0 Removed semi colon
Removed semi colon
2022-02-21 11:18:15 +11:00
cp6
abca765044 Create IP address controller, model and migration
Create IP address controller, model and migration
2022-02-21 11:17:59 +11:00
cp6
dd1d6c0ef1 Created ip address route
Created ip address route
2022-02-21 11:17:43 +11:00
cp6
d920c7da6a Updated session value checks
Updated session value checks
2022-02-20 23:00:09 +11:00
cp6
149d87704f Added session setting to public servers show controller
Added session setting to public servers show controller
2022-02-20 22:58:20 +11:00
cp6
f6f389f6b7 Added protection for the settings
Added protection for the settings to the view
2022-02-20 22:57:55 +11:00
cp6
48c0066767 Added more session setting for the settings
Added more session setting for the settings
2022-02-20 22:57:32 +11:00
cp6
6a00748563 Updated servers public page
Updated servers public page to show if logged in
2022-02-20 22:43:38 +11:00
cp6
3ab9f65da5 Updated error blade file
Updated error blade file to show status code 404 if not set
2022-02-20 22:38:17 +11:00
cp6
2c44e3b3ad Updated auth validation component to be an alert
Updated auth validation component to be an alert
2022-02-20 22:18:02 +11:00
cp6
9f53afb409 Updated blade components to use Bootstrap classes
Updated blade components to use Bootstrap classes
2022-02-20 22:00:05 +11:00
cp6
9308110bd8 Removed unused assets from guest.blade
Removed unused assets from guest.blade
2022-02-20 21:59:35 +11:00
cp6
db42066a66 Updated views that use Vue to the new self hosted asset
Updated views that use Vue to the new self hosted asset
2022-02-20 21:52:46 +11:00
cp6
e27fa57e02 Updated app.blade removed unneeded assets
Updated app.blade removed unneeded assets
2022-02-20 21:52:19 +11:00
cp6
4544d5265c Added self hosted axios JS file
Added self hosted axios JS file
2022-02-20 21:51:43 +11:00
cp6
79abfee8a7 Added self hosted Vue JS file
Added self hosted Vue JS file
2022-02-20 21:51:36 +11:00
cp6
345d50b8ae Updated insert label query
Updated insert label query
2022-02-20 16:39:52 +11:00
cp6
c892295de7 Added labels for shared hosting services
Added labels for shared hosting services
2022-02-20 16:39:40 +11:00
cp6
508bca32bd Update home service types in table
Made them non uppercase except VPS
2022-02-20 16:22:13 +11:00
cp6
c3f1a021b3 Added errors alert to yabs index
Added errors alert to yabs index
2022-02-20 16:19:31 +11:00
cp6
d70f4c4453 Updated YABs accepted versions
Updated YABs accepted versions
2022-02-20 16:19:18 +11:00
cp6
51de05b917 Added labels fetch for Domains show
Added labels fetch for Domains show
2022-02-20 15:55:11 +11:00
cp6
a3b7cfb88f Updated shared show blade
Updated shared show blade
2022-02-20 15:54:48 +11:00
cp6
35492de070 Updated resellers show blade
Updated resellers show blade
2022-02-20 15:54:39 +11:00
cp6
81986ebfd6 Updated domains show blade
Updated domains show blade
2022-02-20 15:54:30 +11:00
cp6
cefbbf2dbe Added created_at to domain seeder
Added created_at to domain seeder
2022-02-20 15:54:17 +11:00
cp6
dbb4d870aa Added type column to home view tables
Added type column to home view tables
2022-02-20 00:34:13 +11:00
cp6
30f18c9419 Added created_at to os seeder
Added created_at to os seeder
2022-02-20 00:32:22 +11:00
cp6
9db3af4bd1 Created shared hosting seeder
Created shared hosting seeder
2022-02-20 00:32:11 +11:00
cp6
479d66ee68 Added OS to API
Added OS to API
2022-02-20 00:19:47 +11:00
cp6
333c55e0f9 Added OS link to navigation bar
Added OS link to navigation bar
2022-02-20 00:08:50 +11:00
cp6
8c2ae4882e Updated servers show blade to hide empty data on no yabs
Updated servers show blade to hide empty data on no yabs
2022-02-20 00:07:35 +11:00
cp6
70916abc05 Updated views to reflect cpu_model
Updated views to reflect cpu_model
2022-02-20 00:07:03 +11:00
cp6
783f95ca7e Update YABs cpu to be cpu_model
Update YABs cpu to be cpu_model
2022-02-20 00:06:32 +11:00
cp6
adb589c60a Updated OsController
Updated OsController
2022-02-19 23:57:48 +11:00
cp6
702eccf3d0 Added name fillable for OS
Added name fillable for OS
2022-02-19 23:57:29 +11:00
cp6
61c8fd4e26 Added timestamps to OS table
Added timestamps to OS table
2022-02-19 23:57:19 +11:00
cp6
1000148e86 Added OS controller views
Added OS controller views
2022-02-19 23:57:06 +11:00
cp6
cb471bd71a Updated use OS controller in routes file
Updated use OS controller in routes file
2022-02-19 23:44:06 +11:00
cp6
2abdf25c45 Created OS route and controller
Created OS route and controller
2022-02-19 23:42:59 +11:00
cp6
d5b5d46bd6 Added ext-json to composer.json
Added ext-json to composer.json
2022-02-19 23:34:52 +11:00
cp6
e4c961ebb9 Updated servers show controller and blade view
Updated servers show controller and blade view
2022-02-19 23:34:37 +11:00
cp6
30e4adcb10 Added location, provider and os strings to servers API
Added location, provider and os strings to servers API
2022-02-19 11:33:04 +11:00
cp6
7f7a579f27 Removed defunct providers/list route
Removed defunct providers/list route
2022-02-19 00:39:24 +11:00
cp6
61dd766e0c Removed test API route
Removed test API route
2022-02-19 00:32:29 +11:00
cp6
74ce12dc3e Removed commented out code from domains seeder
Removed commented out code from domains seeder
2022-02-19 00:27:07 +11:00
cp6
8a4166d91c Updated servers seeder location ids
Updated servers seeder location ids
2022-02-19 00:26:14 +11:00
cp6
8113ee4e9d Updated owned since to be nullable in misc_services table
Updated owned since to be nullable in misc_services table
2022-02-19 00:25:03 +11:00
cp6
d7dd4d3895 Added screenshots
Added screenshots
2022-02-19 00:14:52 +11:00
corbpie
955e3de89f
Merge pull request #27 from cp6/dev
Dev
2022-02-19 00:01:17 +11:00
corbpie
2fd5fb2874
Merge branch 'main' into dev 2022-02-19 00:01:03 +11:00
corbpie
22902e2fa6
updated versioning
updated versioning
2022-02-18 23:58:58 +11:00
cp6
39ff408ddd updated readme for v2
updated readme for v2
2022-02-18 23:56:51 +11:00
cp6
d34223b5cd Removed debugging
Removed debugging
2022-02-18 23:56:41 +11:00
cp6
8ce691d930 Updated readme
Updated readme
2022-02-18 16:05:28 +11:00
cp6
e61e006b64 composer.json updates
composer.json updates
2022-02-18 15:55:05 +11:00
cp6
a314ac99ef Initial v2 commit
Initial v2 commit

Laravel project
2022-02-18 15:48:32 +11:00
corbpie
ff39b4f01e
Merge pull request #26 from cp6/v2
Added notice about V2
2022-02-04 23:51:25 +11:00
corbpie
91928b6d54
Added notice about V2
Added notice about V2
2022-02-04 23:50:18 +11:00
corbpie
e7ab76ca9a
Added demo URL
Added demo URL
2021-08-19 17:24:28 +10:00
cp6
21ffe15e66 Fixed Swap and Bandwidth min values
Fixed Swap and Bandwidth min values
2021-04-10 16:21:34 +10:00
cp6
e7c84abc30 Updated SQL for auth
Updated SQL for auth
2021-03-17 11:37:49 +11:00
cp6
c435d43137 Updated calls for user session
Users token session must be set for calls to work
2021-03-17 11:33:54 +11:00
cp6
5fafca6dd4 Added AUTH file
If you have 0 accounts this file will allow you to create one. Navigate to it if you have > 0 accounts then it will delete itself.
2021-03-17 11:32:59 +11:00
cp6
50b30ba0cb Added auth class
Added auth class for user account
2021-03-17 11:31:43 +11:00
corbpie
fa987790cd
Updated readme version badge
Updated readme version badge to 1.4
2021-02-07 10:30:07 +11:00
cp6
cae5e5e8fc Readme for 1.4
Readme for 1.4
2021-02-07 01:28:39 +11:00
corbpie
7eb2409d27
Merge pull request #17 from cp6/dev
ASN add
2021-02-07 01:09:29 +11:00
cp6
6e93fe9582 Added display ASN in modal
Displays the ASN if no null and a link to more ripe.net data
2021-02-07 01:08:34 +11:00
cp6
374fb846e5 Added get ASN feature
Get the ASN name and number for the servers ip adress. This is able to be turned off with the CONST GET_ASN_INFO.

Thanks to ripe.net for this service
2021-02-07 00:58:41 +11:00
cp6
c927d166a4 Update calls.php 2021-02-07 00:23:52 +11:00
corbpie
7e9d237fdd
Merge pull request #16 from cp6/dev
1.4 changes
2021-02-06 23:23:26 +11:00
cp6
da2daf2120 Updated readme screenshots
Updated readme screenshots
2021-02-03 11:43:12 +11:00
cp6
0d9416f481 Added check for PHP version
Page stops loading and alert is shown if version less than  7.4
2021-02-03 00:29:26 +11:00
cp6
389a082fbc Added comapre servers section
Ability to compare metrics between two servers
2021-02-02 15:53:27 +11:00
cp6
ee8a193c18 Added delete saved YABs files when deleting server
Delete saved YABs files when deleting server
2021-02-01 14:46:37 +11:00
cp6
e6fa1dc0ea Added save YABs to file constant
Added save YABs to file constant which was previously a function param
2021-02-01 14:31:12 +11:00
cp6
bdf013ce05 Fixed attach domain too error when null
Fixed attach domain too error when null and vieing more info modal
2021-02-01 14:12:49 +11:00
cp6
9ef12f08b1 Added YABs insert error handling & messages
Makes possiblility of corrupt DB data less and wont go through with insert if conditions arent met.
2021-02-01 14:06:57 +11:00
corbpie
d6c23a97e3
Merge pull request #14 from cp6/dev
1.3
2021-01-31 12:47:56 +11:00
cp6
c00e8d7671 Updated readme for 1.3
Updated readme for 1.3
2021-01-31 12:46:46 +11:00
cp6
41fe156359 Updated server modal edit formating
Updated server modal edit formating for medium/large screens
2021-01-31 12:36:45 +11:00
cp6
1549d0694c Updated view more modal formating
Updated view more modal to be more wider (less longer) on medium/large screens
2021-01-31 12:00:50 +11:00
cp6
ffe56a3576 Updated search to include tags and labels
Updated search to include tags and labels
2021-01-31 00:31:11 +11:00
cp6
92178d1818 Added label column
Added label column
2021-01-31 00:27:35 +11:00
cp6
44975099ad Added label input/field for servers
Added label input/field for servers
2021-01-31 00:24:32 +11:00
cp6
cb7f87edc5 Update SQL 1.2 to 1.3
Update SQL 1.2 to 1.3
2021-01-31 00:24:07 +11:00
cp6
cf353906e7 Added attach domain to server or shared hosting
Added attach domain to server or shared hosting
2021-01-31 00:03:38 +11:00
cp6
00039c4d08 Fixed active status switching for object view type
Fixed active status switching for object view type
2021-01-30 11:23:18 +11:00
cp6
c882d47026 Added a constant to set view as Cards or Table
Added a constant to set view as Cards or Table.

"CARDS", "TABLE" this means on page load that default view will be showing.
2021-01-30 11:19:05 +11:00
corbpie
a91d787e3e
Merge pull request #10 from asimzeeshan/main
Updating calls.php to fix GET statement
2021-01-30 10:17:17 +11:00
cp6
3de0b0956c Fixed domain and shared hosting deletion
Fixed domain and shared hosting deletion
2021-01-30 10:10:27 +11:00
cp6
69d6922ff3 Added KB/s to MB/s conversion 2021-01-30 10:04:13 +11:00
Asim Zeeshan
97dab8809a
Merge branch 'main' into main 2021-01-29 20:00:38 +05:00
Asim Zeeshan
a89f624b08 Using native dns_get_record() instead of whatsmydns.net 2021-01-29 19:52:01 +05:00
corbpie
941b2752df
Merge pull request #11 from cp6/dev
Fixed DNS API GET requests
2021-01-30 01:45:53 +11:00
cp6
e876d93005 Fixed DNS API GET requests
Fixed DNS API GET requests
2021-01-30 01:32:07 +11:00
Asim Zeeshan
bce776296b Updating calls.php to fix GET statement 2021-01-29 19:30:36 +05:00
corbpie
aa4a4f9b0d
Merge pull request #6 from cp6/dev
Fixed wrong url for DNS & up/down calls
2021-01-29 12:01:25 +11:00
cp6
b5ea9d2506 Fixed wrong url for DNS & up/down calls
Fixed wrong url for DNS & up/down calls
2021-01-29 11:58:35 +11:00
368 changed files with 151150 additions and 14828 deletions

15
.editorconfig Normal file
View file

@ -0,0 +1,15 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2

8
.gitattributes vendored Normal file
View file

@ -0,0 +1,8 @@
* text=auto
*.css linguist-vendored
*.scss linguist-vendored
*.js linguist-vendored
CHANGELOG.md export-ignore
/public/css/* -diff
/public/js/* -diff

79
.github/workflows/main.yml vendored Normal file
View file

@ -0,0 +1,79 @@
name: Docker
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on:
push:
branches: [ "main" ]
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
- name: Install cosign
if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@main
with:
cosign-release: 'v1.11.0'
# Workaround: https://github.com/docker/build-push-action/issues/461
- name: Setup Docker buildx
uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
latest
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v2
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max

60
.gitignore vendored Normal file
View file

@ -0,0 +1,60 @@
### Laravel ###
vendor/
node_modules/
npm-debug.log
# Laravel 4 specific
bootstrap/compiled.php
app/storage/
# Laravel 5 & Lumen specific
public/storage
public/hot
storage/*.key
.env.*.php
.env.php
.env
Homestead.yaml
Homestead.json
# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer
.rocketeer/
# Created by https://www.gitignore.io/api/phpstorm
### PhpStorm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### PhpStorm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
storage/clockwork/
!public/

13
.styleci.yml Normal file
View file

@ -0,0 +1,13 @@
php:
preset: laravel
disabled:
- no_unused_imports
finder:
not-name:
- index.php
- server.php
js:
finder:
not-name:
- webpack.mix.js
css: true

14
Dockerfile Normal file
View file

@ -0,0 +1,14 @@
FROM php:8.2-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql sockets
RUN curl -sS https://getcomposer.org/installer | php -- \
--install-dir=/usr/local/bin --filename=composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY . .
RUN composer install
ENV APP_ENV production
ENTRYPOINT ["/app/run.sh"]

369
README.md
View file

@ -1,122 +1,339 @@
# My idlers
A web app for displaying, organizing and storing information about servers (VPS), shared hosting and domains.
A self-hosted web app for displaying, organizing and storing information about your servers (VPS/Dedi), shared &
reseller hosting, seedboxes,
domains, DNS and misc services.
Despite what the name infers this self hosted web app isn't just for storing idling server information.
By using 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.
Despite what the name infers this self-hosted web app isn't just for storing idling server information. By using
a [YABS](https://github.com/masonr/yet-another-bench-script) output you can get disk & network speed values along with
GeekBench 5 & 6 scores to do easier comparing and sorting. Of course storing other services e.g. web hosting is possible
and supported too with My idlers.
[![Generic badge](https://img.shields.io/badge/version-1.2-blue.svg)](https://shields.io/)
[![Generic badge](https://img.shields.io/badge/version-3.0.0-blue.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Laravel-11.0-red.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/PHP-8.3-purple.svg)](https://shields.io/) [![Generic badge](https://img.shields.io/badge/Bootstrap-5.3-pink.svg)](https://shields.io/)
## 1.2 changes:
**If you have version 1.1 or less already installed please run ```update.sql```**
* Added table view type (use switcher icon to change to this view)
* Added auto get IPv4/IPv6 based on hostname (Click icon at hostname input)
* Added up/down status (Click OS icon)
* Updated the order by table for better formatting
* Removed unused buttons from the CSS
* Updated Minor style changes
* Updated `update.sql` for pre-existing installations only.
* Updated when type DEDI selected "is_dedi" will be toggled
* Updated IPv4 no longer required field
* Fixed no location and/or provider causing uneven cards
* Updated delete labels
* Updated domain terms to be annual and longer only
* Fixed error when all speedtests are "busy"
* Updated `my_idlers.sql` for changes
<img src="https://raw.githubusercontent.com/cp6/my-idlers/main/public/My%20Idlers%20logo.jpg" width="128" height="128" />
[View demo site](https://demo.myidlers.com/)
**Note:** Create, Update and Delete are disabled on the demo site.
## Project sponsor
Currently seeking a project sponsor
## 3.0.0 changes (9 December 2024):
* Updated PHP version to 8.3
* Updated Laravel version to ^11
* Updated composer package versions
* Updated routes into middleware grouping for auth
* Updated login and register forms
* Updated servers, shared, reseller and domains pages to use Datatables
* Added icons to back and submit button components
* Added icon button to shared and reseller create pages
* Added several updated OS versions to OsSeeder
* Added Font awesome Brands webfont
* Added IP whois data columns to the ips table
* Added IP whois data fetching and updating DB
* Added Note to API
* Fixed OS icons not loading in servers index page
* Fixed Settings being called without being created (existing)
* Fixed issue with OS: `Call to a member function toJson() on array`
* Fixed due in (days) column showing a massive float
* Removed 1 user being seeded
* Removed doctrine/dbal
#### Please run the following if updating from an existing install:
```shell
composer update
php artisan migrate
php artisan route:cache
php artisan cache:clear
```
## Requires
* PHP 7.4 (compatible with 8.0)
* MySQL
* PHP 8.3
## Features
* Add servers
* Add shared hosting
* Add domains
* [Auto suggest locations](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-location.gif)
* [Auto suggest providers](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-provider.gif)
* [Auto get IP's from hostname](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ips-from-hostname.gif)
* [Check up/down status](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ping-up-feature.gif)
* Get YABs data from output
* Save & view YABs output
* Update YABs disk & network results
* Get YABS data from output
* Compare 2 servers
* Save & view YABS output
* Update YABS disk & network results
* Next due date system
* Multi currency compatibility
* Multi payment-term compatibility
* Pre-defined operating systems
* Assign tags
* Assign labels
* Assign server type (KVM, OVZ, LXC & dedi)
* Easy to edit values
* Order by table
* Search items
* Tally/stats card
* One-page design
* Assign notes
## Install
* Download [the zip](https://github.com/cp6/my-idlers/archive/main.zip) and unpack the files from ```my-idlers-main/``` into your directory of choice.
* Run `my_idlers.sql` in MySQL.
* Run `git clone https://github.com/cp6/my-idlers.git` into your directory of choice
* Run `composer install`
* Run `cp .env.example .env`
* Edit (If needed) MySQL details in .env
* Run `php artisan key:generate`
* Run `php artisan make:database my_idlers` to create database
* Run `php artisan migrate:fresh --seed` to create tables and seed data
* Run `php artisan serve`
* **Only run ```update.sql``` if you have version 1.1 or less already installed.**
## Updating
* Edit ```class.php``` lines ```13-16``` for your MySQL details.
* Edit ```class.php``` lines ```8-10``` for card order type.
If you already have at least version 2.0 installed:
* Run `git clone https://github.com/cp6/my-idlers.git`
* Run `composer install`
* Run `composer update`
* Run `php artisan migrate`
* Run `php artisan route:cache`
* Run `php artisan cache:clear`
## Run using Docker
```
docker run \
-p 8000:8000\
-e APP_URL=https://... \
-e DB_HOST=... \
-e DB_DATABASE=... \
-e DB_USERNAME=... \
-e DB_PASSWORD=... \
ghcr.io/cp6/my-idlers:latest
docker exec ... php artisan migrate:fresh --seed --force # Set up database one time
```
## Managed Hosting
Run with a single click on [PikaPods.com](https://www.pikapods.com/)
[![PikaPods](https://www.pikapods.com/static/run-button.svg)](https://www.pikapods.com/pods?run=my-idlers)
## Adding a YABS benchmark
yabs.sh now has JSON formatted response and can POST the output directly from calling the script.
With My idlers you can use your API key and the server id to directly POST the benchmark result
`https://yourdomain.com/api/yabs/SERVERID/USERAPIKEYISHERE`
Example yabs.sh call to POST the result:
`curl -sL yabs.sh | bash -s -- -s "https://yourdomain.com/api/yabs/SERVERID/USERAPIKEYISHERE"`
## Credits
IP who is data provided by [ipwhois.io](https://ipwhois.io/documentation)
## API endpoints
For GET requests the header must have `Accept: application/json` and your API token (found at `/account`)
`Authorization : Bearer API_TOKEN_HERE`
All API requests must be appended with `api/` e.g `mydomain.com/api/servers/gYk8J0a7`
**GET request:**
`dns/`
`dns/{id}`
`domains/`
`domains/{id}`
`servers`
`servers/{id}`
`labels/`
`labels/{id}`
`locations/`
`locations/{id}`
`misc/`
`misc/{id}`
`networkSpeeds/`
`networkSpeeds/{id}`
`os/`
`os/{id}`
`pricing/`
`pricing/{id}`
`providers/`
`providers/{id}`
`reseller/`
`reseller/{id}`
`seedbox/`
`seedbox/{id}`
`settings/`
`shared/`
`shared/{id}`
`note/{id}`
**POST requests**
Create a server
`/servers`
Body content template
```json
{
"active": 1,
"show_public": 0,
"hostname": "test.domain.com",
"ns1": "ns1",
"ns2": "ns2",
"server_type": 1,
"os_id": 2,
"provider_id": 10,
"location_id": 15,
"ssh_port": 22,
"bandwidth": 2000,
"ram": 2024,
"ram_type": "MB",
"ram_as_mb": 2024,
"disk": 30,
"disk_type": "GB",
"disk_as_gb": 30,
"cpu": 2,
"has_yabs": 0,
"was_promo": 1,
"ip1": "127.0.0.1",
"ip2": null,
"owned_since": "2022-01-01",
"currency": "USD",
"price": 4.00,
"payment_term": 1,
"as_usd": 4.00,
"usd_per_month": 4.00,
"next_due_date": "2022-02-01"
}
```
**PUT requests**
Update a server
`/servers/ID`
Body content template
```json
{
"active": 1,
"show_public": 0,
"hostname": "test.domain.com",
"ns1": "ns1",
"ns2": "ns2",
"server_type": 1,
"os_id": 2,
"provider_id": 10,
"location_id": 15,
"ssh_port": 22,
"bandwidth": 2000,
"ram": 2024,
"ram_type": "MB",
"ram_as_mb": 2024,
"disk": 30,
"disk_type": "GB",
"disk_as_gb": 30,
"cpu": 2,
"has_yabs": 0,
"was_promo": 1,
"owned_since": "2022-01-01"
}
```
Update pricing
`/pricing/ID`
Body content template
```json
{
"price": 10.50,
"currency": "USD",
"term": 1
}
```
**DELETE requests**
Delete a server
`/servers/ID`
## Notes
**There is no authentication provided!**
Either use on a local network or put behind authentication.
**Public viewable listings**
**Supporting YABS commands:**
If enabled the public viewable table for your server listings is at `/servers/public`
You can configure what you want viewable at ```/settings```
```curl -sL yabs.sh | bash```
**Due date / due soon**
This is simply just a reminder. If the homepage is requested (viewed) when a service is over due date it will get reset
to plus the term from the old due date.
E.g if the term is a month then the due date gets updated to be 1 month from the old due date.
**Supporting YABS commands:**
```curl -sL yabs.sh | bash```
or
```curl -sL yabs.sh | bash -s -- -r```
**Make sure YABs output starts at the first line which is:**
Logo icons created by Freepik - Flaticon
```# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #```
## Screenshots for v2
[![My idlers screenshot1](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-home-2.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-home-2.jpg)
**A trimmed Bootstrap is used.** Only the used classes and elements are in ```style.css```
Therefore adding more obscure columns or Bootstrap classes will not initially work as intended until you put this source css into ```style.css```.
[![My idlers screenshot2](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-server-view.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-server-view.jpg)
**Auto complete provider & location are text inputs!** This means that if your choice isn't there then simply type it out
and upon form submission it gets added to the pool to choose from next time.
[![My idlers screenshot3](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-servers-home.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-servers-home.jpg)
### Screenshots
[![My idlers screenshot4](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-YABs.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-YABs.jpg)
[![Screenshot1](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data.jpg)
[![My idlers screenshot5](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-add-server_2.png)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-add-server_2.png)
[![My idlers screenshot6](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-servers-compare.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-servers-compare.jpg)
[![screenshot2](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-MORE-1.1.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-MORE-1.1.jpg)
[![screenshot3](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-EDIT-1.1.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-EDIT-1.1.jpg)
[![screenshot4](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-order-table.png)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-order-table.png)
[![screenshot5](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-tally-card.png)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-tally-card.png)
[![screenshot6](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-table-view.png)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-data-table-view.png)
[![Auto complete location](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-location.gif)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-location.gif)
[![Auto complete provider](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-provider.gif)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-auto-provider.gif)
[![Auto complete IP's](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ips-from-hostname.gif)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ips-from-hostname.gif)
[![Get up/down status](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ping-up-feature.gif)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-ping-up-feature.gif)
[![Table scrolling x](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-table-view.gif)](https://cdn.write.corbpie.com/wp-content/uploads/2021/01/my-idlers-self-hosted-server-domain-information-table-view.gif)
[![My idlers screenshot7](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-Ips.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-Ips.jpg)
[![My idlers screenshot8](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-labels.jpg)](https://cdn.write.corbpie.com/wp-content/uploads/2022/03/My-idlers-v2-labels.jpg)

View file

@ -0,0 +1,33 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class CreateDatabaseCommand extends Command
{
protected $signature = 'make:database {name}';
protected $description = 'Creates my_idlers database';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$schemaName = $this->argument('name') ?: config("database.connections.mysql.database");
$charset = config("database.connections.mysql.charset",'utf8mb4');
$collation = config("database.connections.mysql.collation",'utf8mb4_unicode_ci');
config(["database.connections.mysql.database" => null]);
$query = "CREATE DATABASE IF NOT EXISTS $schemaName CHARACTER SET $charset COLLATE $collation;";
DB::statement($query);
config(["database.connections.mysql.database" => $schemaName]);
}
}

41
app/Console/Kernel.php Normal file
View file

@ -0,0 +1,41 @@
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}

View file

@ -0,0 +1,40 @@
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
}

View file

@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class AccountController extends Controller
{
public function index()
{
return view('account.index');
}
public function update(Request $request)
{
$user = Auth::user();
$user->name = $request->name;
$user->email = $request->email;
$user->save();
return redirect()->route('account.index')
->with('success', 'Account Updated Successfully.');
}
}

View file

@ -0,0 +1,510 @@
<?php
namespace App\Http\Controllers;
use App\Models\Domains;
use App\Models\IPs;
use App\Models\Labels;
use App\Models\Misc;
use App\Models\NetworkSpeed;
use App\Models\Note;
use App\Models\OS;
use App\Models\Pricing;
use App\Models\Providers;
use App\Models\Reseller;
use App\Models\SeedBoxes;
use App\Models\Server;
use App\Models\Shared;
use App\Models\User;
use App\Models\Yabs;
use DataTables;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
class ApiController extends Controller
{
protected function getAllServers()
{
$servers = Server::allServers()->toJson(JSON_PRETTY_PRINT);
return response($servers, 200);
}
protected function getServer($id)
{
$server = Server::server($id)->toJson(JSON_PRETTY_PRINT);
return response($server, 200);
}
protected function getAllPricing()
{
$pricing = Pricing::all()->toJson(JSON_PRETTY_PRINT);
return response($pricing, 200);
}
protected function getPricing($id)
{
$pricing = Pricing::where('id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($pricing, 200);
}
protected function getAllNetworkSpeeds()
{
$ns = NetworkSpeed::all()->toJson(JSON_PRETTY_PRINT);
return response($ns, 200);
}
protected function getNetworkSpeeds($id)
{
$ns = NetworkSpeed::where('server_id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($ns, 200);
}
protected function getAllLabels()
{
$labels = Labels::all()->toJson(JSON_PRETTY_PRINT);
return response($labels, 200);
}
protected function getLabel($id)
{
$label = Labels::where('id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($label, 200);
}
protected function getAllShared()
{
$shared = Shared::allSharedHosting()->toJson(JSON_PRETTY_PRINT);
return response($shared, 200);
}
protected function getShared($id)
{
$shared = Shared::sharedHosting($id)->toJson(JSON_PRETTY_PRINT);
return response($shared, 200);
}
protected function getAllReseller()
{
$reseller = Reseller::allResellerHosting()->toJson(JSON_PRETTY_PRINT);
return response($reseller, 200);
}
protected function getReseller($id)
{
$reseller = Reseller::resellerHosting($id)->toJson(JSON_PRETTY_PRINT);
return response($reseller, 200);
}
protected function getAllSeedbox()
{
$reseller = SeedBoxes::allSeedboxes()->toJson(JSON_PRETTY_PRINT);
return response($reseller, 200);
}
protected function getSeedbox($id)
{
$reseller = SeedBoxes::seedbox($id)->toJson(JSON_PRETTY_PRINT);
return response($reseller, 200);
}
protected function getAllDomains()
{
$domains = Domains::allDomains()->toJson(JSON_PRETTY_PRINT);
return response($domains, 200);
}
protected function getDomains($id)
{
$domain = Domains::domain($id)->toJson(JSON_PRETTY_PRINT);
return response($domain, 200);
}
protected function getAllMisc()
{
$misc = Misc::allMisc()->toJson(JSON_PRETTY_PRINT);
return response($misc, 200);
}
protected function getMisc($id)
{
$misc = Misc::misc($id)->toJson(JSON_PRETTY_PRINT);
return response($misc, 200);
}
protected function getAllDns()
{
$dns = DB::table('d_n_s')
->get()->toJson(JSON_PRETTY_PRINT);
return response($dns, 200);
}
protected function getDns($id)
{
$dns = DB::table('d_n_s')
->where('id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($dns, 200);
}
protected function getAllLocations()
{
$locations = DB::table('locations')
->get()->toJson(JSON_PRETTY_PRINT);
return response($locations, 200);
}
protected function getLocation($id)
{
$location = DB::table('locations')
->where('id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($location, 200);
}
protected function getAllProviders()
{
$providers = DB::table('providers')
->get()->toJson(JSON_PRETTY_PRINT);
return response($providers, 200);
}
protected function getProvider($id)
{
$providers = DB::table('providers')
->where('id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($providers, 200);
}
protected function getAllSettings()
{
$settings = DB::table('settings')
->get()->toJson(JSON_PRETTY_PRINT);
return response($settings, 200);
}
protected function getAllOs()
{
$os = OS::allOS()->toJson(JSON_PRETTY_PRINT);
return response($os, 200);
}
protected function getOs($id)
{
$os = DB::table('os as o')
->where('o.id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($os, 200);
}
protected function getAllIPs()
{
$ip = IPs::all()->toJson(JSON_PRETTY_PRINT);
return response($ip, 200);
}
protected function getIP($id)
{
$ip = DB::table('ips as i')
->where('i.id', $id)
->get()->toJson(JSON_PRETTY_PRINT);
return response($ip, 200);
}
public function getAllProvidersTable(Request $request)
{
if ($request->ajax()) {
$data = Providers::latest()->get();
$dt = Datatables::of($data)
->addIndexColumn()
->addColumn('action', function ($row) {
$actionBtn = '<form action="' . route('providers.destroy', $row['id']) . '" method="POST"><i class="fas fa-trash text-danger ms-3" @click="modalForm" id="btn-' . $row['name'] . '" title="' . $row['id'] . '"></i> </form>';
return $actionBtn;
})
->rawColumns(['action'])
->make(true);
return $dt;
}
}
protected function checkHostIsUp(string $hostname)
{//Check if host/ip is "up"
($fp = @fsockopen($hostname, 80, $errCode, $errStr, 1)) ? $result = true : $result = false;
if ($fp) {
@fclose($fp);
}
return response(array('is_online' => $result), 200);
}
protected function getIpForDomain(string $domainname, string $type)
{//Gets IP from A record for a domain
switch ($type) {
case "A":
$data = dns_get_record($domainname, DNS_A);
if (isset($data['0']['ip'])) {
return response(array('ip' => $data['0']['ip']), 200);
}
break;
case "AAAA":
$data = dns_get_record($domainname, DNS_AAAA);
if (isset($data['0']['ipv6'])) {
return response(array('ip' => $data['0']['ipv6']), 200);
}
break;
}
return response(array('ip' => null), 200);
}
protected function storeServer(Request $request)
{
$rules = [
'hostname' => 'min:3',
'server_type' => 'required|integer',
'os_id' => 'required|integer',
'provider_id' => 'required|integer',
'location_id' => 'required|integer',
'ssh_port' => 'required|integer',
'ram' => 'required|integer',
'ram_as_mb' => 'required|integer',
'disk' => 'required|integer',
'disk_as_gb' => 'required|integer',
'cpu' => 'required|integer',
'bandwidth' => 'required|integer',
'was_promo' => 'required|integer',
'active' => 'required|integer',
'show_public' => 'required|integer',
'ip1' => 'ip',
'ip2' => 'ip',
'owned_since' => 'required|date',
'ram_type' => 'required|string|size:2',
'disk_type' => 'required|string|size:2',
'currency' => 'required|string|size:3',
'price' => 'required|numeric',
'payment_term' => 'required|integer',
'next_due_date' => 'date',
];
$messages = [
'required' => ':attribute is required',
'min' => ':attribute must be longer than 3',
'integer' => ':attribute must be an integer',
'string' => ':attribute must be a string',
'size' => ':attribute must be exactly :size characters',
'numeric' => ':attribute must be a float',
'ip' => ':attribute must be a valid IP address',
'date' => ':attribute must be a date Y-m-d',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json(['result' => 'fail', 'messages' => $validator->messages()], 400);
}
$server_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(1, $server_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
if (!is_null($request->ip1)) {
IPs::insertIP($server_id, $request->ip1);
}
if (!is_null($request->ip2)) {
IPs::insertIP($server_id, $request->ip2);
}
$insert = Server::create([
'id' => $server_id,
'hostname' => $request->hostname,
'server_type' => $request->server_type,
'os_id' => $request->os_id,
'ssh_port' => $request->ssh_port,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'ram' => $request->ram,
'ram_type' => $request->ram_type,
'ram_as_mb' => ($request->ram_type === 'MB') ? $request->ram : ($request->ram * 1024),
'disk' => $request->disk,
'disk_type' => $request->disk_type,
'disk_as_gb' => ($request->disk_type === 'GB') ? $request->disk : ($request->disk * 1024),
'owned_since' => $request->owned_since,
'ns1' => $request->ns1,
'ns2' => $request->ns2,
'bandwidth' => $request->bandwidth,
'cpu' => $request->cpu,
'was_promo' => $request->was_promo,
'show_public' => (isset($request->show_public)) ? 1 : 0
]);
Server::serverRelatedCacheForget();
if ($insert) {
return response()->json(array('result' => 'success', 'server_id' => $server_id), 200);
}
return response()->json(array('result' => 'fail', 'request' => $request->post()), 500);
}
public function destroyServer(Request $request)
{
$items = Server::find($request->id);
(!is_null($items)) ? $result = $items->delete() : $result = false;
$p = new Pricing();
$p->deletePricing($request->id);
Labels::deleteLabelsAssignedTo($request->id);
IPs::deleteIPsAssignedTo($request->id);
Server::serverRelatedCacheForget();
if ($result) {
return response()->json(array('result' => 'success'), 200);
}
return response()->json(array('result' => 'fail'), 500);
}
public function updateServer(Request $request)
{
$rules = [
'hostname' => 'string|min:3',
'server_type' => 'integer',
'os_id' => 'integer',
'provider_id' => 'integer',
'location_id' => 'integer',
'ssh_port' => 'integer',
'ram' => 'integer',
'ram_as_mb' => 'integer',
'disk' => 'integer',
'disk_as_gb' => 'integer',
'cpu' => 'integer',
'bandwidth' => 'integer',
'was_promo' => 'integer',
'active' => 'integer',
'show_public' => 'integer',
'owned_since' => 'date',
'ram_type' => 'string|size:2',
'disk_type' => 'string|size:2',
'currency' => 'string|size:3',
'price' => 'numeric',
'payment_term' => 'integer',
'next_due_date' => 'date',
];
$messages = [
'required' => ':attribute is required',
'min' => ':attribute must be longer than 3',
'integer' => ':attribute must be an integer',
'string' => ':attribute must be a string',
'size' => ':attribute must be exactly :size characters',
'numeric' => ':attribute must be a float',
'date' => ':attribute must be a date Y-m-d',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json(['result' => 'fail', 'messages' => $validator->messages()], 400);
}
$server_update = Server::where('id', $request->id)->update(request()->all());
Server::serverRelatedCacheForget();
Server::serverSpecificCacheForget($request->id);
if ($server_update) {
return response()->json(array('result' => 'success', 'server_id' => $request->id), 200);
}
return response()->json(array('result' => 'fail', 'request' => $request->post()), 500);
}
public function updatePricing(Request $request)
{
$rules = [
'price' => 'required|numeric',
'currency' => 'required|string|size:3',
'term' => 'required|integer',
'active' => 'integer',
'next_due_date' => 'date',
];
$messages = [
'required' => ':attribute is required',
'integer' => ':attribute must be an integer',
'string' => ':attribute must be a string',
'size' => ':attribute must be exactly :size characters',
'numeric' => ':attribute must be a float',
'date' => ':attribute must be a date Y-m-d',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json(['result' => 'fail', 'messages' => $validator->messages()], 400);
}
$pricing = new Pricing();
$request->as_usd = $pricing->convertToUSD($request->price, $request->currency);
$request->usd_per_month = $pricing->costAsPerMonth($request->as_usd, $request->term);
$price_update = Pricing::where('id', $request->id)->update(request()->all());
Cache::forget("all_pricing");
Server::serverRelatedCacheForget();
if ($price_update) {
return response()->json(array('result' => 'success', 'server_id' => $request->id), 200);
}
return response()->json(array('result' => 'fail', 'request' => $request->post()), 500);
}
public function storeYabs(Request $request, Server $server, string $key): \Illuminate\Http\JsonResponse
{
$r = User::where('api_token', $key)->first();
if (!isset($r->id)) {
return response()->json(['error' => 'Unauthenticated'], 401);
}
$insert = Yabs::insertFromJson($request, $server->id);
if ($insert) {
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 response()->json(array('message' => 'Successfully added YABS'), 200);
}
return response()->json(array('error' => 'Server error'), 500);
}
public function getAllYabs()
{
$yabs = Yabs::allYabs()->toJson(JSON_PRETTY_PRINT);
return response($yabs, 200);
}
protected function getYabs($id)
{
$yabs = Yabs::yabs($id)->toJson(JSON_PRETTY_PRINT);
return response($yabs, 200);
}
protected function getNote($id)
{
$note = Note::where('id', $id)->firstOrFail('note')->pluck('note');
return response($note, 200)->header('Content-Type', 'text/plain');
}
}

View file

@ -0,0 +1,59 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*
* @return \Illuminate\View\View
*/
public function create()
{
$users = User::all();
if ($users->count() === 0) {//Only allow 1 user for this app
return redirect('/register');
}
return view('auth.login');
}
/**
* Handle an incoming authentication request.
*
* @param \App\Http\Requests\Auth\LoginRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

View file

@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ConfirmsPasswords;
class ConfirmPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Confirm Password Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password confirmations and
| uses a simple trait to include the behavior. You're free to explore
| this trait and override any functions that require customization.
|
*/
use ConfirmsPasswords;
/**
* Where to redirect users when the intended url fails.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
}

View file

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
class ConfirmablePasswordController extends Controller
{
/**
* Show the confirm password view.
*
* @return \Illuminate\View\View
*/
public function show()
{
return view('auth.confirm-password');
}
/**
* Confirm the user's password.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function store(Request $request)
{
if (! Auth::guard('web')->validate([
'email' => $request->user()->email,
'password' => $request->password,
])) {
throw ValidationException::withMessages([
'password' => __('auth.password'),
]);
}
$request->session()->put('auth.password_confirmed_at', time());
return redirect()->intended(RouteServiceProvider::HOME);
}
}

View file

@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class EmailVerificationNotificationController extends Controller
{
/**
* Send a new email verification notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(Request $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME);
}
$request->user()->sendEmailVerificationNotification();
return back()->with('status', 'verification-link-sent');
}
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class EmailVerificationPromptController extends Controller
{
/**
* Display the email verification prompt.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function __invoke(Request $request)
{
return $request->user()->hasVerifiedEmail()
? redirect()->intended(RouteServiceProvider::HOME)
: view('auth.verify-email');
}
}

View file

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
}

View file

@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}

View file

@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
class NewPasswordController extends Controller
{
/**
* Display the password reset view.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\View\View
*/
public function create(Request $request)
{
return view('auth.reset-password', ['request' => $request]);
}
/**
* Handle an incoming new password request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'token' => ['required'],
'email' => ['required', 'email'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view. If there is an error we can
// redirect them back to where they came from with their error message.
return $status == Password::PASSWORD_RESET
? redirect()->route('login')->with('status', __($status))
: back()->withInput($request->only('email'))
->withErrors(['email' => __($status)]);
}
}

View file

@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
class PasswordResetLinkController extends Controller
{
/**
* Display the password reset link request view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.forgot-password');
}
/**
* Handle an incoming password reset link request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'email' => ['required', 'email'],
]);
// We will send the password reset link to this user. Once we have attempted
// to send the link, we will examine the response then see the message we
// need to show to the user. Finally, we'll send out a proper response.
$status = Password::sendResetLink(
$request->only('email')
);
return $status == Password::RESET_LINK_SENT
? back()->with('status', __($status))
: back()->withInput($request->only('email'))
->withErrors(['email' => __($status)]);
}
}

View file

@ -0,0 +1,75 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\Models\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'api_token' => Str::random(60)
]);
}
}

View file

@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\Settings;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View
*/
public function create()
{
$users = User::all();
if ($users->count() >= 1) {//Only allow 1 user for this app
return redirect('/login');
}
return view('auth.register');
}
/**
* Handle an incoming registration request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'api_token' => Str::random(60)
]);
event(new Registered($user));
Auth::login($user);
return redirect('/');
}
}

View file

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
}

View file

@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails;
class VerificationController extends Controller
{
/*
|--------------------------------------------------------------------------
| Email Verification Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling email verification for any
| user that recently registered with the application. Emails may also
| be re-sent if the user didn't receive the original email message.
|
*/
use VerifiesEmails;
/**
* Where to redirect users after verification.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
}

View file

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
class VerifyEmailController extends Controller
{
/**
* Mark the authenticated user's email address as verified.
*
* @param \Illuminate\Foundation\Auth\EmailVerificationRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function __invoke(EmailVerificationRequest $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
}

View file

@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

View file

@ -0,0 +1,137 @@
<?php
namespace App\Http\Controllers;
use App\Models\DNS;
use App\Models\Labels;
use App\Models\Reseller;
use App\Models\Server;
use App\Models\Domains;
use App\Models\Shared;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class DNSController extends Controller
{
public function index()
{
$dn = DB::table('d_n_s')->get();
return view('dns.index', compact(['dn']));
}
public function create()
{
$Servers = Server::all();
$Domains = Domains::all();
$Shareds = Shared::all();
$Resellers = Reseller::all();
return view('dns.create', compact(['Servers', 'Domains', 'Shareds', 'Resellers']));
}
public function store(Request $request)
{
$request->validate([
'hostname' => 'required|string|min:2',
'address' => 'required|string|min:2',
'dns_type' => 'required|string',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$dns_id = Str::random(8);
DNS::create([
'id' => $dns_id,
'hostname' => $request->hostname,
'dns_type' => $request->dns_type,
'address' => $request->address,
'server_id' => ($request->server_id !== 'null') ? $request->server_id : null,
'shared_id' => ($request->shared_id !== 'null') ? $request->shared_id : null,
'reseller_id' => ($request->reseller_id !== 'null') ? $request->reseller_id : null,
'domain_id' => ($request->domain_id !== 'null') ? $request->domain_id : null
]);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $dns_id);
Cache::forget('dns_count');
return redirect()->route('dns.index')
->with('success', 'DNS Created Successfully.');
}
public function show(DNS $dn)
{
$dns = DNS::findOrFail($dn->id);
$labels = DB::table('labels_assigned as l')
->join('labels', 'l.label_id', 'labels.id')
->where('l.service_id', $dn->id)
->get(['labels.label']);
return view('dns.show', compact(['dn', 'dns', 'labels']));
}
public function edit(DNS $dn)
{
$Servers = Server::all();
$Domains = Domains::all();
$Shareds = Shared::all();
$Resellers = Reseller::all();
$dn = DNS::findOrFail($dn->id);
$labels = DB::table('labels_assigned as l')
->join('labels', 'l.label_id', 'labels.id')
->where('l.service_id', $dn->id)
->get(['labels.id']);
return view('dns.edit', compact(['dn', 'labels', 'Servers', 'Domains', 'Shareds', 'Resellers']));
}
public function update(Request $request, DNS $dn): \Illuminate\Http\RedirectResponse
{
$request->validate([
'hostname' => 'required|string|min:2',
'address' => 'required|string|min:2',
'dns_type' => 'required|string',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$dn->update([
'hostname' => $request->hostname,
'dns_type' => $request->dns_type,
'address' => $request->address,
'server_id' => ($request->server_id !== 'null') ? $request->server_id : null,
'shared_id' => ($request->shared_id !== 'null') ? $request->shared_id : null,
'reseller_id' => ($request->reseller_id !== 'null') ? $request->reseller_id : null,
'domain_id' => ($request->domain_id !== 'null') ? $request->domain_id : null
]);
Labels::deleteLabelsAssignedTo($dn->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $dn->id);
return redirect()->route('dns.index')
->with('success', 'DNS updated Successfully.');
}
public function destroy(DNS $dn): \Illuminate\Http\RedirectResponse
{
if ( $dn->delete()){
Cache::forget('dns_count');
Labels::deleteLabelsAssignedTo($dn->id);
return redirect()->route('dns.index')
->with('success', 'DNS was deleted Successfully.');
}
return redirect()->route('dns.index')
->with('error', 'DNS was not deleted.');
}
}

View file

@ -0,0 +1,11 @@
<?php
namespace App\Http\Controllers;
use App\Models\DiskSpeed;
use Illuminate\Http\Request;
class DiskSpeedController extends Controller
{
}

View file

@ -0,0 +1,148 @@
<?php
namespace App\Http\Controllers;
use App\Models\Domains;
use App\Models\Home;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\Providers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class DomainsController extends Controller
{
public function index()
{
$domains = Domains::allDomains();
return view('domains.index', compact(['domains']));
}
public function show(Domains $domain)
{//Need to modern
$domain_info = Domains::domain($domain->id);
return view('domains.show', compact(['domain_info']));
}
public function create()
{
return view('domains.create');
}
public function store(Request $request)
{
$request->validate([
'domain' => 'required|string|min:2',
'extension' => 'required|string|min:2',
'ns1' => 'sometimes|nullable|min:2',
'ns2' => 'sometimes|nullable|min:2',
'ns3' => 'sometimes|nullable|min:2',
'provider_id' => 'integer',
'payment_term' => 'integer',
'price' => 'numeric',
'next_due_date' => 'required|date',
'owned_since' => 'sometimes|nullable|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$domain_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(4, $domain_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Domains::create([
'id' => $domain_id,
'domain' => $request->domain,
'extension' => $request->extension,
'ns1' => $request->ns1,
'ns2' => $request->ns2,
'ns3' => $request->ns3,
'provider_id' => $request->provider_id,
'owned_since' => $request->owned_since
]);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $domain_id);
Cache::forget("all_domains");
Home::homePageCacheForget();
return redirect()->route('domains.index')
->with('success', 'Domain Created Successfully.');
}
public function edit(Domains $domain)
{
$domain_info = Domains::domain($domain->id);
return view('domains.edit', compact(['domain_info']));
}
public function update(Request $request, Domains $domain)
{
$request->validate([
'domain' => 'required|string|min:2',
'extension' => 'required|string|min:2',
'ns1' => 'sometimes|nullable|min:2',
'ns2' => 'sometimes|nullable|min:2',
'ns3' => 'sometimes|nullable|min:2',
'provider_id' => 'integer',
'payment_term' => 'integer',
'price' => 'numeric',
'next_due_date' => 'required|date',
'owned_since' => 'sometimes|nullable|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$pricing = new Pricing();
$pricing->updatePricing($domain->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
$domain->update([
'domain' => $request->domain,
'extension' => $request->extension,
'ns1' => $request->ns1,
'ns2' => $request->ns2,
'ns3' => $request->ns3,
'provider_id' => $request->provider_id,
'owned_since' => $request->owned_since,
'active' => (isset($request->is_active)) ? 1 : 0
]);
Labels::deleteLabelsAssignedTo($domain->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $domain->id);
Cache::forget("all_domains");
Cache::forget("domain.{$domain->id}");
Cache::forget("labels_for_service.{$domain->id}");
Home::homePageCacheForget();
return redirect()->route('domains.index')
->with('success', 'Domain Updated Successfully.');
}
public function destroy(Domains $domain)
{
if ($domain->delete()){
$p = new Pricing();
$p->deletePricing($domain->id);
Labels::deleteLabelsAssignedTo($domain->id);
Cache::forget("all_domains");
Cache::forget("domain.{$domain->id}");
Home::homePageCacheForget();
return redirect()->route('domains.index')
->with('success', 'Domain was deleted Successfully.');
}
return redirect()->route('domains.index')
->with('error', 'Domain was not deleted.');
}
}

View file

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers;
use App\Models\DNS;
use App\Models\Home;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\Settings;
use App\Process;
use Illuminate\Support\Facades\Session;
class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
$p = new Process();
$p->startTimer();
//Get & set the settings, 1 minute cache
$settings = Settings::getSettings();
Settings::setSettingsToSession($settings);
//Check for past due date and refresh the due date if so:
$due_soon = Home::doDueSoon(Home::dueSoonData());
//Orders services most recently added first, cached with limit from settings
$recently_added = Home::recentlyAdded();
//Get count tally for each of the services type
$service_count = Home::doServicesCount(Home::servicesCount());
//Get pricing for weekly, monthly, yearly, 2 yearly
$pricing_breakdown = Home::breakdownPricing(Pricing::allPricing());
//Summary of servers specs
$server_summary = Home::serverSummary();
$p->stopTimer();
$information = [
'servers' => $service_count['servers'],
'domains' => $service_count['domains'],
'shared' => $service_count['shared'],
'reseller' => $service_count['reseller'],
'misc' => $service_count['other'],
'seedbox' => $service_count['seedbox'],
'labels' => Labels::labelsCount(),
'dns' => DNS::dnsCount(),
'total_services' => $service_count['total'],
'total_inactive' => $pricing_breakdown['inactive_count'],
'total_cost_weekly' => number_format($pricing_breakdown['total_cost_weekly'], 2),
'total_cost_monthly' => number_format($pricing_breakdown['total_cost_monthly'], 2),
'total_cost_yearly' => number_format($pricing_breakdown['total_cost_yearly'], 2),
'total_cost_2_yearly' => number_format(($pricing_breakdown['total_cost_yearly'] * 2), 2),
'due_soon' => $due_soon,
'newest' => $recently_added,
'execution_time' => number_format($p->getTimeTaken(), 2),
'servers_summary' => $server_summary,
'currency' => Session::get('dashboard_currency')
];
return view('home', compact('information'));
}
}

View file

@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers;
use App\Models\IPs;
use App\Models\Reseller;
use App\Models\SeedBoxes;
use App\Models\Server;
use App\Models\Shared;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class IPsController extends Controller
{
public function index()
{
$ips = IPs::all();
return view('ips.index', compact(['ips']));
}
public function create()
{
$servers = Server::all();
$shareds = Shared::all();
$resellers = Reseller::all();
$seed_boxes = SeedBoxes::all();
return view('ips.create', compact(['servers', 'shareds', 'resellers', 'seed_boxes']));
}
public function store(Request $request)
{
$request->validate([
'address' => 'required|ip|min:2',
'ip_type' => 'required|string|size:4',
'service_id' => 'required|string'
]);
$ip_id = Str::random(8);
$ip = IPs::create([
'id' => $ip_id,
'address' => $request->address,
'is_ipv4' => ($request->ip_type === 'ipv4') ? 1 : 0,
'service_id' => $request->service_id,
'active' => 1
]);
$fetch = IPs::getUpdateIpInfo($ip);
return redirect()->route('IPs.index')
->with('success', 'IP address created Successfully.');
}
public function destroy(IPs $IP)
{
if ($IP->delete()) {
return redirect()->route('IPs.index')
->with('success', 'IP address was deleted Successfully.');
}
return redirect()->route('IPs.index')
->with('error', 'IP was not deleted.');
}
public function getUpdateWhoIs(IPs $IP): \Illuminate\Http\RedirectResponse
{
$result = IPs::getUpdateIpInfo($IP);
if ($result) {
return redirect()->route('IPs.index')
->with('success', 'IP address updated Successfully.');
}
return redirect()->route('IPs.index')
->with('error', 'IP was not updated.');
}
}

View file

@ -0,0 +1,73 @@
<?php
namespace App\Http\Controllers;
use App\Models\Labels;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class LabelsController extends Controller
{
public function index()
{
$labels = Labels::all();
return view('labels.index', compact(['labels']));
}
public function create()
{
return view('labels.create');
}
public function store(Request $request)
{
$request->validate([
'label' => 'required|string|min:2'
]);
Labels::create([
'id' => Str::random(8),
'label' => $request->label
]);
Cache::forget('all_labels');
Cache::forget('labels_count');
return redirect()->route('labels.index')
->with('success', 'Label Created Successfully.');
}
public function show(Labels $label)
{
$labels = DB::table('labels_assigned as las')
->leftJoin('pricings as p', 'las.service_id', 'p.service_id')
->leftJoin('servers as s', 'las.service_id', 's.id')
->leftJoin('shared_hosting as sh', 'las.service_id', 'sh.id')
->leftJoin('reseller_hosting as r', 'las.service_id', 'r.id')
->leftJoin('domains as d', 'las.service_id', 'd.id')
->where('las.label_id', $label->id)
->get(['p.service_type', 'p.service_id', 's.hostname', 'sh.main_domain as shared', 'r.main_domain as reseller', 'd.domain', 'd.extension']);
return view('labels.show', compact(['label', 'labels']));
}
public function destroy(Labels $label)
{
if ($label->delete()) {
Cache::forget('labels_count');
Labels::deleteLabelAssignedAs($label->id);
Cache::forget('all_labels');
return redirect()->route('labels.index')
->with('success', 'Label was deleted Successfully.');
}
return redirect()->route('labels.index')
->with('error', 'Label was not deleted.');
}
}

View file

@ -0,0 +1,75 @@
<?php
namespace App\Http\Controllers;
use App\Models\Locations;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class LocationsController extends Controller
{
public function index()
{
$locations = Locations::allLocations();
return view('locations.index', compact(['locations']));
}
public function create()
{
return view('locations.create');
}
public function store(Request $request)
{
$request->validate([
'location_name' => 'required|string|min:2|max:255'
]);
Locations::create([
'name' => $request->location_name
]);
Cache::forget('locations');
return redirect()->route('locations.index')
->with('success', 'Location Created Successfully.');
}
public function show(Locations $location)
{
$servers = DB::table('servers as s')
->where('s.location_id', $location->id)
->get(['s.id', 's.hostname'])
->toArray();
$shared = DB::table('shared_hosting as s')
->where('s.location_id', $location->id)
->get(['s.id', 's.main_domain as main_domain_shared'])
->toArray();
$reseller = DB::table('reseller_hosting as r')
->where('r.location_id', $location->id)
->get(['r.id', 'r.main_domain as main_domain_reseller'])
->toArray();
$data = array_merge($servers, $shared, $reseller);
return view('locations.show', compact(['location', 'data']));
}
public function destroy(Locations $location)
{
if ($location->delete()){
Cache::forget('locations');
return redirect()->route('locations.index')
->with('success', 'Location was deleted Successfully.');
}
return redirect()->route('locations.index')
->with('error', 'Location was not deleted.');
}
}

View file

@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers;
use App\Models\Home;
use App\Models\Misc;
use App\Models\Pricing;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class MiscController extends Controller
{
public function index()
{
$misc = Misc::allMisc();
return view('misc.index', compact(['misc']));
}
public function create()
{
return view('misc.create');
}
public function show(Misc $misc)
{
$misc_data = Misc::misc($misc->id);
return view('misc.show', compact(['misc_data']));
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|min:3',
'price' => 'required|numeric',
'payment_term' => 'required|integer',
'currency' => 'required|string|size:3',
'owned_since' => 'sometimes|nullable|date',
'next_due_date' => 'required|date'
]);
$misc_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(5, $misc_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Misc::create([
'id' => $misc_id,
'name' => $request->name,
'owned_since' => $request->owned_since
]);
Cache::forget("all_misc");
Home::homePageCacheForget();
return redirect()->route('misc.index')
->with('success', 'Misc service created Successfully.');
}
public function edit(Misc $misc)
{
$misc_data = Misc::misc($misc->id);
return view('misc.edit', compact('misc_data'));
}
public function update(Request $request, Misc $misc)
{
$request->validate([
'name' => 'required|string|min:3',
'price' => 'required|numeric',
'payment_term' => 'required|integer',
'currency' => 'required|string|size:3',
'owned_since' => 'sometimes|nullable|date',
'next_due_date' => 'required|date'
]);
$misc->update([
'name' => $request->name,
'owned_since' => $request->owned_since,
'active' => (isset($request->is_active)) ? 1 : 0
]);
$pricing = new Pricing();
$pricing->updatePricing($misc->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Cache::forget("all_misc");
Cache::forget("misc.{$misc->id}");
Home::homePageCacheForget();
return redirect()->route('misc.index')
->with('success', 'Misc service updated Successfully.');
}
public function destroy(Misc $misc)
{
if ($misc->delete()) {
$p = new Pricing();
$p->deletePricing($misc->id);
Cache::forget("all_misc");
Cache::forget("misc.{$misc->id}");
Home::homePageCacheForget();
return redirect()->route('misc.index')
->with('success', 'Misc service was deleted Successfully.');
}
return redirect()->route('misc.index')
->with('error', 'Misc service was not deleted.');
}
}

View file

@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use App\Models\NetworkSpeed;
use Illuminate\Http\Request;
class NetworkSpeedController extends Controller
{
}

View file

@ -0,0 +1,123 @@
<?php
namespace App\Http\Controllers;
use App\Models\DNS;
use App\Models\Domains;
use App\Models\IPs;
use App\Models\Note;
use App\Models\Reseller;
use App\Models\Server;
use App\Models\Shared;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class NoteController extends Controller
{
public function index()
{
$notes = Note::allNotes();
return view('notes.index', compact('notes'));
}
public function create()
{
$servers = Server::all();
$shareds = Shared::all();
$resellers = Reseller::all();
$domains = Domains::all();
$dns = DNS::all();
$ips = IPs::all();
return view('notes.create', compact(['servers', 'shareds', 'resellers', 'domains', 'dns', 'ips']));
}
public function store(Request $request)
{
$request->validate([
'service_id' => 'required|string|size:8',
'note' => 'required|string',
]);
try {
$note_id = Str::random(8);
$a = Note::create([
'id' => $note_id,
'service_id' => $request->service_id,
'note' => $request->note
]);
} catch (\Exception $e) {
if ($e->getCode() === "23000") {
$message = "A note already exists for this service";
} else {
$message = "Error inserting note";
}
return redirect()->route('notes.create')
->withInput($request->input())->with('error', $message);
}
Cache::forget('all_notes');
return redirect()->route('notes.index')
->with('success', 'Note created successfully.');
}
public function edit(Note $note)
{
$note = Note::note($note->service_id);
$servers = Server::all();
$shareds = Shared::all();
$resellers = Reseller::all();
$domains = Domains::all();
$dns = DNS::all();
$ips = IPs::all();
return view('notes.edit', compact(['note', 'servers', 'shareds', 'resellers', 'domains', 'dns', 'ips']));
}
public function update(Request $request, Note $note)
{
$request->validate([
'service_id' => 'required|string|size:8',
'note' => 'required|string'
]);
$note->update([
'service_id' => $request->service_id,
'note' => $request->note
]);
Cache::forget('all_notes');
Cache::forget("note.$note->service_id");
return redirect()->route('notes.index')
->with('success', 'Note was updated successfully.');
}
public function show(Note $note)
{
$note = Note::note($note->service_id);
return view('notes.show', compact(['note']));
}
public function destroy(Note $note)
{
if ($note->delete()) {
Cache::forget("all_notes");
Cache::forget("note.$note->service_id");
return redirect()->route('notes.index')
->with('success', 'Note was deleted successfully.');
}
return redirect()->route('notes.index')
->with('error', 'Note was not deleted.');
}
}

View file

@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers;
use App\Models\OS;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class OsController extends Controller
{
public function index()
{
$os = OS::allOS()->toArray();
return view('os.index', compact(['os']));
}
public function create()
{
return view('os.create');
}
public function store(Request $request)
{
$request->validate([
'os_name' => 'required|string|min:2|max:255'
]);
OS::create([
'name' => $request->os_name
]);
Cache::forget('operating_systems');
return redirect()->route('os.index')
->with('success', 'OS Created Successfully.');
}
public function destroy(OS $o)
{
if ($o->delete()) {
Cache::forget('operating_systems');
return redirect()->route('os.index')
->with('success', 'OS was deleted Successfully.');
}
return redirect()->route('os.index')
->with('error', 'OS was not deleted.');
}
}

View file

@ -0,0 +1,11 @@
<?php
namespace App\Http\Controllers;
use App\Models\Pricing;
use Illuminate\Http\Request;
class PricingController extends Controller
{
}

View file

@ -0,0 +1,59 @@
<?php
namespace App\Http\Controllers;
use App\Models\Providers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ProvidersController extends Controller
{
public function index()
{
$providers = Providers::allProviders();
return view('providers.index', compact(['providers']));
}
public function create()
{
return view('providers.create');
}
public function store(Request $request)
{
$request->validate([
'provider_name' => 'required|string|min:2|max:255'
]);
Providers::create([
'name' => $request->provider_name
]);
Cache::forget('providers');
return redirect()->route('providers.index')
->with('success', 'Provider Created Successfully.');
}
public function show(Providers $provider)
{
$data = Providers::showServicesForProvider($provider->id);
return view('providers.show', compact(['provider', 'data']));
}
public function destroy(Providers $provider)
{
if ($provider->delete()) {
Cache::forget('providers');
return redirect()->route('providers.index')
->with('success', 'Provider was deleted Successfully.');
}
return redirect()->route('providers.index')
->with('error', 'Provider was not deleted.');
}
}

View file

@ -0,0 +1,194 @@
<?php
namespace App\Http\Controllers;
use App\Models\Home;
use App\Models\IPs;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\Reseller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class ResellerController extends Controller
{
public function index()
{
$resellers = Reseller::allResellerHosting();
return view('reseller.index', compact(['resellers']));
}
public function create()
{
return view('reseller.create');
}
public function store(Request $request)
{
$request->validate([
'domain' => 'required|min:4',
'reseller_type' => 'required|string',
'disk' => 'integer',
'os_id' => 'integer',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'accounts' => 'integer',
'domains' => 'integer',
'sub_domains' => 'integer',
'bandwidth' => 'integer',
'email' => 'integer',
'ftp' => 'integer',
'db' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$reseller_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(3, $reseller_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
if (!is_null($request->dedicated_ip)) {
IPs::insertIP($reseller_id, $request->dedicated_ip);
}
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $reseller_id);
Reseller::create([
'id' => $reseller_id,
'main_domain' => $request->domain,
'accounts' => $request->accounts,
'reseller_type' => $request->reseller_type,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'was_promo' => $request->was_promo,
'domains_limit' => $request->domains,
'subdomains_limit' => $request->sub_domains,
'email_limit' => $request->email,
'ftp_limit' => $request->ftp,
'db_limit' => $request->db
]);
Cache::forget("all_reseller");
Home::homePageCacheForget();
return redirect()->route('reseller.index')
->with('success', 'Reseller hosting created Successfully.');
}
public function show(Reseller $reseller)
{
$reseller = Reseller::resellerHosting($reseller->id);
return view('reseller.show', compact(['reseller']));
}
public function edit(Reseller $reseller)
{
$reseller = Reseller::resellerHosting($reseller->id);
return view('reseller.edit', compact(['reseller']));
}
public function update(Request $request, Reseller $reseller)
{
$request->validate([
'domain' => 'required|min:4',
'reseller_type' => 'required|string',
'disk' => 'integer',
'os_id' => 'integer',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'accounts' => 'integer',
'domains' => 'integer',
'sub_domains' => 'integer',
'bandwidth' => 'integer',
'email' => 'integer',
'ftp' => 'integer',
'db' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$reseller->update([
'main_domain' => $request->domain,
'reseller_type' => $request->reseller_type,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'accounts' => $request->accounts,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'was_promo' => $request->was_promo,
'domains_limit' => $request->domains,
'subdomains_limit' => $request->sub_domains,
'email_limit' => $request->email,
'ftp_limit' => $request->ftp,
'db_limit' => $request->db
]);
$pricing = new Pricing();
$pricing->updatePricing($reseller->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($reseller->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $reseller->id);
IPs::deleteIPsAssignedTo($reseller->id);
if (!is_null($request->dedicated_ip)) {
IPs::insertIP($reseller->id, $request->dedicated_ip);
}
Cache::forget("all_reseller");
Cache::forget("reseller_hosting.{$reseller->id}");
Cache::forget("labels_for_service.{$reseller->id}");
Home::homePageCacheForget();
return redirect()->route('reseller.index')
->with('success', 'Reseller hosting updated Successfully.');
}
public function destroy(Reseller $reseller)
{
if ($reseller->delete()) {
$p = new Pricing();
$p->deletePricing($reseller->id);
Labels::deleteLabelsAssignedTo($reseller->id);
IPs::deleteIPsAssignedTo($reseller->id);
Cache::forget("all_reseller");
Cache::forget("reseller_hosting.$reseller->id");
Home::homePageCacheForget();
return redirect()->route('reseller.index')
->with('success', 'Reseller hosting was deleted Successfully.');
}
return redirect()->route('reseller.index')
->with('error', 'Reseller was not deleted.');
}
}

View file

@ -0,0 +1,163 @@
<?php
namespace App\Http\Controllers;
use App\Models\Home;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\SeedBoxes;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class SeedBoxesController extends Controller
{
public function index()
{
$seedboxes = SeedBoxes::allSeedboxes();
return view('seedboxes.index', compact(['seedboxes']));
}
public function create()
{
return view('seedboxes.create');
}
public function store(Request $request)
{
$request->validate([
'title' => 'required|string|min:2',
'hostname' => 'sometimes|nullable|string|min:2',
'seed_box_type' => 'required|string',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'disk' => 'integer',
'bandwidth' => 'integer',
'port_speed' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$seedbox_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(6, $seedbox_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($seedbox_id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $seedbox_id);
SeedBoxes::create([
'id' => $seedbox_id,
'title' => $request->title,
'hostname' => $request->hostname,
'seed_box_type' => $request->seed_box_type,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'port_speed' => $request->port_speed,
'was_promo' => $request->was_promo
]);
Cache::forget("all_seedboxes");
Home::homePageCacheForget();
return redirect()->route('seedboxes.index')
->with('success', 'Seed box created Successfully.');
}
public function show(SeedBoxes $seedbox)
{
$seedbox_data = SeedBoxes::seedbox($seedbox->id);
return view('seedboxes.show', compact(['seedbox_data']));
}
public function edit(SeedBoxes $seedbox)
{
$seedbox_data = SeedBoxes::seedbox($seedbox->id);
return view('seedboxes.edit', compact(['seedbox_data']));
}
public function update(Request $request, SeedBoxes $seedbox)
{
$request->validate([
'title' => 'required|string|min:2',
'hostname' => 'sometimes|nullable|string|min:2',
'seed_box_type' => 'required|string',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'disk' => 'integer',
'bandwidth' => 'integer',
'port_speed' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$seedbox->update([
'title' => $request->title,
'hostname' => $request->hostname,
'seed_box_type' => $request->seed_box_type,
'location_id' => $request->location_id,
'provider_id' => $request->provider_id,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'port_speed' => $request->port_speed,
'was_promo' => $request->was_promo
]);
$pricing = new Pricing();
$pricing->updatePricing($seedbox->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($seedbox->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $seedbox->id);
Cache::forget("all_seedboxes");
Cache::forget("seedbox.{$seedbox->id}");
Cache::forget("labels_for_service.{$seedbox->id}");
Home::homePageCacheForget();
return redirect()->route('seedboxes.index')
->with('success', 'Seed box updated Successfully.');
}
public function destroy(SeedBoxes $seedbox)
{
if ($seedbox->delete()) {
$p = new Pricing();
$p->deletePricing($seedbox->id);
Labels::deleteLabelsAssignedTo($seedbox->id);
Cache::forget("all_seedboxes");
Cache::forget("seedbox.{$seedbox->id}");
Home::homePageCacheForget();
return redirect()->route('seedboxes.index')
->with('success', 'Seed box was deleted Successfully.');
}
return redirect()->route('seedboxes.index')
->with('error', 'Seed box was not deleted.');
}
}

View file

@ -0,0 +1,246 @@
<?php
namespace App\Http\Controllers;
use App\Models\IPs;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\Server;
use App\Models\Settings;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Str;
class ServerController extends Controller
{
public function index()
{
$servers = Server::allActiveServers();
$non_active_servers = Server::allNonActiveServers();
return view('servers.index', compact(['servers', 'non_active_servers']));
}
public function showServersPublic()
{
$settings = Settings::getSettings();
Settings::setSettingsToSession($settings);
if ((Session::get('show_servers_public') === 1)) {
$servers = Server::allPublicServers();
return view('servers.public-index', compact('servers'));
}
abort(404);
}
public function create()
{
return view('servers.create');
}
public function store(Request $request)
{
$request->validate([
'hostname' => 'required|min:5',
'ip1' => 'sometimes|nullable|ip',
'ip2' => 'sometimes|nullable|ip',
'ns1' => 'sometimes|nullable|string',
'ns2' => 'sometimes|nullable|string',
'server_type' => 'integer',
'ssh_port' => 'integer',
'bandwidth' => 'integer',
'ram' => 'required|numeric',
'disk' => 'required|integer',
'os_id' => 'required|integer',
'provider_id' => 'required|integer',
'location_id' => 'required|integer',
'price' => 'required|numeric',
'cpu' => 'required|integer',
'was_promo' => 'integer',
'next_due_date' => 'required|date',
'owned_since' => 'sometimes|nullable|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$server_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(1, $server_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
if (!is_null($request->ip1)) {
IPs::insertIP($server_id, $request->ip1);
}
if (!is_null($request->ip2)) {
IPs::insertIP($server_id, $request->ip2);
}
Server::create([
'id' => $server_id,
'hostname' => $request->hostname,
'server_type' => $request->server_type,
'os_id' => $request->os_id,
'ssh' => $request->ssh_port,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'ram' => $request->ram,
'ram_type' => $request->ram_type,
'ram_as_mb' => ($request->ram_type === 'MB') ? $request->ram : ($request->ram * 1024),
'disk' => $request->disk,
'disk_type' => $request->disk_type,
'disk_as_gb' => ($request->disk_type === 'GB') ? $request->disk : ($request->disk * 1024),
'owned_since' => $request->owned_since,
'ns1' => $request->ns1,
'ns2' => $request->ns2,
'bandwidth' => $request->bandwidth,
'cpu' => $request->cpu,
'was_promo' => $request->was_promo,
'show_public' => (isset($request->show_public)) ? 1 : 0
]);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $server_id);
Server::serverRelatedCacheForget();
return redirect()->route('servers.index')
->with('success', 'Server Created Successfully.');
}
public function show(Server $server)
{
$server_data = Server::server($server->id);
return view('servers.show', compact(['server_data']));
}
public function edit(Server $server)
{
$server_data = Server::server($server->id);
return view('servers.edit', compact(['server_data']));
}
public function update(Request $request, Server $server)
{
$request->validate([
'hostname' => 'required|min:5',
'ip1' => 'sometimes|nullable|ip',
'ip2' => 'sometimes|nullable|ip',
'ns1' => 'sometimes|nullable|string',
'ns2' => 'sometimes|nullable|string',
'server_type' => 'integer',
'ssh_port' => 'integer',
'bandwidth' => 'integer',
'ram' => 'required|numeric',
'disk' => 'required|integer',
'os_id' => 'required|integer',
'provider_id' => 'required|integer',
'location_id' => 'required|integer',
'price' => 'required|numeric',
'cpu' => 'required|integer',
'was_promo' => 'integer',
'next_due_date' => 'required|date',
'owned_since' => 'sometimes|nullable|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$server->update([
'hostname' => $request->hostname,
'server_type' => $request->server_type,
'os_id' => $request->os_id,
'ssh' => $request->ssh_port,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'ram' => $request->ram,
'ram_type' => $request->ram_type,
'ram_as_mb' => ($request->ram_type === 'MB') ? $request->ram : ($request->ram * 1024),
'disk' => $request->disk,
'disk_type' => $request->disk_type,
'disk_as_gb' => ($request->disk_type === 'GB') ? $request->disk : ($request->disk * 1024),
'owned_since' => $request->owned_since,
'ns1' => $request->ns1,
'ns2' => $request->ns2,
'bandwidth' => $request->bandwidth,
'cpu' => $request->cpu,
'was_promo' => $request->was_promo,
'active' => (isset($request->is_active)) ? 1 : 0,
'show_public' => (isset($request->show_public)) ? 1 : 0
]);
$pricing = new Pricing();
$pricing->updatePricing($server->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($server->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $server->id);
IPs::deleteIPsAssignedTo($server->id);
for ($i = 1; $i <= 8; $i++) {//Max of 8 ips
$obj = 'ip' . $i;
if (isset($request->$obj) && !is_null($request->$obj)) {
IPs::insertIP($server->id, $request->$obj);
}
}
Server::serverRelatedCacheForget();
Server::serverSpecificCacheForget($server->id);
return redirect()->route('servers.index')
->with('success', 'Server Updated Successfully.');
}
public function destroy(Server $server)
{
if ($server->delete()) {
$p = new Pricing();
$p->deletePricing($server->id);
Labels::deleteLabelsAssignedTo($server->id);
IPs::deleteIPsAssignedTo($server->id);
Server::serverRelatedCacheForget();
return redirect()->route('servers.index')
->with('success', 'Server was deleted Successfully.');
}
return redirect()->route('servers.index')
->with('error', 'Server was not deleted.');
}
public function chooseCompare()
{//NOTICE: Selecting servers is not cached yet
$all_servers = Server::where('has_yabs', 1)->get();
if (isset($all_servers[1])) {
return view('servers.choose-compare', compact('all_servers'));
}
return redirect()->route('servers.index')
->with('error', 'You need atleast 2 servers with a YABS to do a compare');
}
public function compareServers($server1, $server2)
{
$server1_data = Server::server($server1);
if (!isset($server1_data[0]->yabs[0])) {
abort(404);
}
$server2_data = Server::server($server2);
if (!isset($server2_data[0]->yabs[0])) {
abort(404);
}
return view('servers.compare', compact('server1_data', 'server2_data'));
}
}

View file

@ -0,0 +1,98 @@
<?php
namespace App\Http\Controllers;
use App\Models\Settings;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Storage;
class SettingsController extends Controller
{
public function index()
{
return view('settings.index', ['setting' => Settings::where('id', 1)->first()]);
}
public function update(Request $request)
{
$request->validate([
'dark_mode' => 'required|integer|min:0|max:1',
'show_versions_footer' => 'required|integer|min:0|max:1',
'show_server_value_ip' => 'required|integer|min:0|max:1',
'show_server_value_hostname' => 'required|integer|min:0|max:1',
'show_server_value_provider' => 'required|integer|min:0|max:1',
'show_server_value_location' => 'required|integer|min:0|max:1',
'show_server_value_price' => 'required|integer|min:0|max:1',
'show_server_value_yabs' => 'required|integer|min:0|max:1',
'save_yabs_as_txt' => 'integer|min:0|max:1',
'default_currency' => 'required|string|size:3',
'default_server_os' => 'required|integer',
'due_soon_amount' => 'required|integer|between:0,12',
'recently_added_amount' => 'required|integer|between:0,12',
'currency' => 'required|string|size:3',
'sort_on' => 'required|integer|between:1,10',
'favicon' => 'sometimes|nullable|mimes:ico,jpg,png|max:40',
]);
$settings = Settings::where('id', 1)->first();
if ($request->favicon) {//Has a favicon upload
$file = $request->favicon;
$extension = $file->getClientOriginalExtension();
$favicon_filename = "favicon.$extension";
if ($favicon_filename !== $settings->favicon && $settings->favicon !== 'favicon.ico') {
Storage::disk('public_uploads')->delete($settings->favicon);//Delete old favicon
}
$file->storeAs("", $favicon_filename, "public_uploads");//Save into /public
}
$do_update = $settings->update([
'dark_mode' => $request->dark_mode,
'show_versions_footer' => $request->show_versions_footer,
'show_servers_public' => $request->show_servers_public,
'show_server_value_ip' => $request->show_server_value_ip,
'show_server_value_hostname' => $request->show_server_value_hostname,
'show_server_value_provider' => $request->show_server_value_provider,
'show_server_value_location' => $request->show_server_value_location,
'show_server_value_price' => $request->show_server_value_price,
'show_server_value_yabs' => $request->show_server_value_yabs,
'save_yabs_as_txt' => 0,
'default_currency' => $request->default_currency,
'default_server_os' => $request->default_server_os,
'due_soon_amount' => $request->due_soon_amount,
'recently_added_amount' => $request->recently_added_amount,
'dashboard_currency' => $request->currency,
'sort_on' => $request->sort_on,
'favicon' => $favicon_filename ?? $settings->favicon
]);
Cache::forget('due_soon');//Main page due_soon cache
Cache::forget('recently_added');//Main page recently_added cache
Cache::forget('pricing_breakdown');//Main page pricing breakdown
Cache::forget('settings');//Main page settings cache
//Clear because they are affected by settings change (sort_on)
Cache::forget('all_servers');
Cache::forget('all_active_servers');
Cache::forget('all_shared');
Cache::forget('all_seedboxes');
Cache::forget('all_reseller');
Cache::forget('all_misc');
Cache::forget('all_domains');
Settings::setSettingsToSession(Settings::getSettings());
if ($do_update) {
return redirect()->route('settings.index')
->with('success', 'Settings Updated Successfully.');
}
return redirect()->route('settings.index')
->with('error', 'Settings failed to update.');
}
}

View file

@ -0,0 +1,190 @@
<?php
namespace App\Http\Controllers;
use App\Models\Home;
use App\Models\IPs;
use App\Models\Labels;
use App\Models\Pricing;
use App\Models\Shared;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class SharedController extends Controller
{
public function index()
{
$shared = Shared::allSharedHosting();
return view('shared.index', compact(['shared']));
}
public function create()
{
return view('shared.create');
}
public function store(Request $request)
{
$request->validate([
'domain' => 'required|min:4',
'shared_type' => 'required|string',
'disk' => 'integer',
'os_id' => 'integer',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'domains' => 'integer',
'sub_domains' => 'integer',
'bandwidth' => 'integer',
'email' => 'integer',
'ftp' => 'integer',
'db' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$shared_id = Str::random(8);
$pricing = new Pricing();
$pricing->insertPricing(2, $shared_id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($shared_id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $shared_id);
IPs::deleteIPsAssignedTo($shared_id);
if (!is_null($request->dedicated_ip)) {
IPs::insertIP($shared_id, $request->dedicated_ip);
}
Shared::create([
'id' => $shared_id,
'main_domain' => $request->domain,
'shared_type' => $request->shared_type,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'was_promo' => $request->was_promo,
'domains_limit' => $request->domains,
'subdomains_limit' => $request->sub_domains,
'email_limit' => $request->email,
'ftp_limit' => $request->ftp,
'db__limit' => $request->db
]);
Cache::forget('all_shared');
Home::homePageCacheForget();
return redirect()->route('shared.index')
->with('success', 'Shared hosting created Successfully.');
}
public function show(Shared $shared)
{
$shared = Shared::sharedHosting($shared->id);
return view('shared.show', compact(['shared']));
}
public function edit(Shared $shared)
{
$shared = Shared::sharedHosting($shared->id);
return view('shared.edit', compact(['shared']));
}
public function update(Request $request, Shared $shared)
{
$request->validate([
'domain' => 'required|min:4',
'shared_type' => 'required|string',
'disk' => 'integer',
'os_id' => 'integer',
'provider_id' => 'integer',
'location_id' => 'integer',
'price' => 'numeric',
'payment_term' => 'integer',
'was_promo' => 'integer',
'owned_since' => 'sometimes|nullable|date',
'domains' => 'integer',
'sub_domains' => 'integer',
'bandwidth' => 'integer',
'email' => 'integer',
'ftp' => 'integer',
'db' => 'integer',
'next_due_date' => 'required|date',
'label1' => 'sometimes|nullable|string',
'label2' => 'sometimes|nullable|string',
'label3' => 'sometimes|nullable|string',
'label4' => 'sometimes|nullable|string',
]);
$shared->update([
'main_domain' => $request->domain,
'shared_type' => $request->shared_type,
'provider_id' => $request->provider_id,
'location_id' => $request->location_id,
'disk' => $request->disk,
'disk_type' => 'GB',
'disk_as_gb' => $request->disk,
'owned_since' => $request->owned_since,
'bandwidth' => $request->bandwidth,
'was_promo' => $request->was_promo,
'domains_limit' => $request->domains,
'subdomains_limit' => $request->sub_domains,
'email_limit' => $request->email,
'ftp_limit' => $request->ftp,
'db_limit' => $request->db
]);
$pricing = new Pricing();
$pricing->updatePricing($shared->id, $request->currency, $request->price, $request->payment_term, $request->next_due_date);
Labels::deleteLabelsAssignedTo($shared->id);
Labels::insertLabelsAssigned([$request->label1, $request->label2, $request->label3, $request->label4], $shared->id);
Cache::forget("labels_for_service.{$shared->id}");
IPs::deleteIPsAssignedTo($shared->id);
if (isset($request->dedicated_ip)) {
IPs::insertIP($shared->id, $request->dedicated_ip);
}
Cache::forget("shared_hosting.{$shared->id}");
Cache::forget('all_shared');
Home::homePageCacheForget();
return redirect()->route('shared.index')
->with('success', 'Shared hosting updated Successfully.');
}
public function destroy(Shared $shared)
{
if ($shared->delete()) {
$p = new Pricing();
$p->deletePricing($shared->id);
Labels::deleteLabelsAssignedTo($shared->id);
IPs::deleteIPsAssignedTo($shared->id);
Cache::forget("shared_hosting.$shared->id");
Cache::forget('all_shared');
Home::homePageCacheForget();
return redirect()->route('shared.index')
->with('success', 'Shared hosting was deleted Successfully.');
}
return redirect()->route('shared.index')
->with('error', 'Shared was not deleted.');
}
}

View file

@ -0,0 +1,77 @@
<?php
namespace App\Http\Controllers;
use App\Models\Server;
use App\Models\Yabs;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class YabsController extends Controller
{
public function index()
{
return view('yabs.index', ['yabs' => Yabs::allYabs()]);
}
public function show(Yabs $yab)
{
return view('yabs.show', ['yabs' => Yabs::yabs($yab->id)]);
}
public function destroy(Yabs $yab)
{
if ($yab->delete()) {
if (Server::serverYabsAmount($yab->server_id) === 0) {
DB::table('servers')
->where('id', $yab->server_id)
->update(['has_yabs' => 0]);
}
Cache::forget('all_yabs');
Cache::forget("yabs.{$yab->id}");
return redirect()->route('yabs.index')
->with('success', 'YABS was deleted Successfully.');
}
return redirect()->route('yabs.index')
->with('error', 'YABS was not deleted.');
}
public function chooseYabsCompare()
{
$all_yabs = Yabs::allYabs();
if (isset($all_yabs[1])) {
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(string $yabs1, string $yabs2)
{
$yabs1_data = Yabs::yabs($yabs1);
if (is_null($yabs1_data)) {
abort(404);
}
$yabs2_data = Yabs::yabs($yabs2);
if (is_null($yabs2_data)) {
abort(404);
}
return view('yabs.compare', compact('yabs1_data', 'yabs2_data'));
}
public function yabsToJson(Yabs $yab): array
{
$all_yabs = Yabs::yabs($yab->id)[0];
return Yabs::buildYabsArray($all_yabs);
}
}

71
app/Http/Kernel.php Normal file
View file

@ -0,0 +1,71 @@
<?php
namespace App\Http;
use App\Console\Commands\CreateDatabaseCommand;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
protected $commands = [
CreateDatabaseCommand::class
];
}

View file

@ -0,0 +1,21 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
}

View file

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}

View file

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
class PreventRequestsDuringMaintenance extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array
*/
protected $except = [
//
];
}

View file

@ -0,0 +1,32 @@
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null ...$guards
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
}

View file

@ -0,0 +1,18 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
'password',
'password_confirmation',
];
}

View file

@ -0,0 +1,20 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustHosts as Middleware;
class TrustHosts extends Middleware
{
/**
* Get the host patterns that should be trusted.
*
* @return array
*/
public function hosts()
{
return [
$this->allSubdomainsOfApplicationUrl(),
];
}
}

View file

@ -0,0 +1,28 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string|null
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;
}

View file

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
}

View file

@ -0,0 +1,93 @@
<?php
namespace App\Http\Requests\Auth;
use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
class LoginRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => ['required', 'string', 'email'],
'password' => ['required', 'string'],
];
}
/**
* Attempt to authenticate the request's credentials.
*
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function authenticate()
{
$this->ensureIsNotRateLimited();
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'email' => __('auth.failed'),
]);
}
RateLimiter::clear($this->throttleKey());
}
/**
* Ensure the login request is not rate limited.
*
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function ensureIsNotRateLimited()
{
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
return;
}
event(new Lockout($this));
$seconds = RateLimiter::availableIn($this->throttleKey());
throw ValidationException::withMessages([
'email' => trans('auth.throttle', [
'seconds' => $seconds,
'minutes' => ceil($seconds / 60),
]),
]);
}
/**
* Get the rate limiting throttle key for the request.
*
* @return string
*/
public function throttleKey()
{
return Str::lower($this->input('email')).'|'.$this->ip();
}
}

34
app/Models/DNS.php Normal file
View file

@ -0,0 +1,34 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class DNS extends Model
{
use HasFactory;
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = ['id', 'service_id', 'hostname', 'dns_type', 'address', 'server_id', 'domain_id'];
public static $dns_types = ['A', 'AAAA', 'DNAME', 'MX', 'NS', 'SOA', 'TXT', 'URI'];
public static function dnsCount()
{
return Cache::remember('dns_count', now()->addMonth(1), function () {
return DNS::count();
});
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
}

24
app/Models/DiskSpeed.php Normal file
View file

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DiskSpeed extends Model
{
use HasFactory;
public $incrementing = false;
protected $keyType = 'string';
protected $table = 'disk_speed';
protected $fillable = ['id', 'server_id', 'd_4k', 'd_4k_type', 'd_4k_as_mbps', 'd_64k', 'd_64k_type', 'd_64k_as_mbps', 'd_512k', 'd_512k_type', 'd_512k_as_mbps', 'd_1m', 'd_1m_type', 'd_1m_as_mbps'];
public function yabs(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Yabs::class, 'id', 'id');
}
}

63
app/Models/Domains.php Normal file
View file

@ -0,0 +1,63 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class Domains extends Model
{
use HasFactory;
public $incrementing = false;
protected $table = 'domains';
protected $keyType = 'string';
protected $fillable = ['id', 'domain', 'extension', 'ns1', 'ns2', 'ns3', 'price', 'currency', 'payment_term', 'owned_since', 'provider_id', 'next_due_date'];
public static function allDomains()
{//All domains and relationships (no using joins)
return Cache::remember("all_domains", now()->addMonth(1), function () {
$query = Domains::with(['provider', 'price', 'labels']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "domains.id"), $options[1]);
}
return $query->get();
});
}
public static function domain(string $domain_id)
{//Single domains and relationships (no using joins)
return Cache::remember("domain.$domain_id", now()->addMonth(1), function () use ($domain_id) {
return Domains::where('id', $domain_id)
->with(['provider', 'price', 'labels'])->first();
});
}
public function provider(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Providers::class, 'id', 'provider_id');
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
public function labels(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'service_id', 'id');
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
}

210
app/Models/Home.php Normal file
View file

@ -0,0 +1,210 @@
<?php
namespace App\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
class Home extends Model
{
use HasFactory;
public static function homePageCacheForget(): void
{
Cache::forget('services_count');//Main page services_count cache
Cache::forget('due_soon');//Main page due_soon cache
Cache::forget('recently_added');//Main page recently_added cache
Cache::forget('all_pricing');//All the pricing
Cache::forget('services_count_all');
Cache::forget('pricing_breakdown');
}
public static function servicesCount()
{
return Cache::remember('services_count', now()->addHours(6), function () {
return DB::table('pricings')
->select('service_type', DB::raw('COUNT(*) as amount'))
->groupBy('service_type')
->where('active', 1)
->get();
});
}
public static function dueSoonData()
{
return Cache::remember('due_soon', now()->addHours(6), function () {
return DB::table('pricings as p')
->leftJoin('servers as s', 'p.service_id', 's.id')
->leftJoin('shared_hosting as sh', 'p.service_id', 'sh.id')
->leftJoin('reseller_hosting as r', 'p.service_id', 'r.id')
->leftJoin('domains as d', 'p.service_id', 'd.id')
->leftJoin('misc_services as ms', 'p.service_id', 'ms.id')
->leftJoin('seedboxes as sb', 'p.service_id', 'sb.id')
->where('p.active', 1)
->orderBy('next_due_date', 'ASC')
->limit(Session::get('due_soon_amount'))
->get(['p.*', 's.hostname', 'd.domain', 'd.extension', 'r.main_domain as reseller', 'sh.main_domain', 'ms.name', 'sb.title']);
});
}
public static function serverSummary()
{
return Cache::remember('servers_summary', now()->addHours(6), function () {
$cpu_sum = DB::table('servers')->get()->where('active', 1)->sum('cpu');
$ram_mb = DB::table('servers')->get()->where('active', 1)->sum('ram_as_mb');
$disk_gb = DB::table('servers')->get()->where('active', 1)->sum('disk_as_gb');
$bandwidth = DB::table('servers')->get()->where('active', 1)->sum('bandwidth');
$locations_sum = DB::table('servers')->get()->where('active', 1)->groupBy('location_id')->count();
$providers_sum = DB::table('servers')->get()->where('active', 1)->groupBy('provider_id')->count();
return array(
'cpu_sum' => $cpu_sum,
'ram_mb_sum' => $ram_mb,
'disk_gb_sum' => $disk_gb,
'bandwidth_sum' => $bandwidth,
'locations_sum' => $locations_sum,
'providers_sum' => $providers_sum,
);
});
}
public static function recentlyAdded()
{
return Cache::remember('recently_added', now()->addHours(6), function () {
return DB::table('pricings as p')
->leftJoin('servers as s', 'p.service_id', 's.id')
->leftJoin('shared_hosting as sh', 'p.service_id', 'sh.id')
->leftJoin('reseller_hosting as r', 'p.service_id', 'r.id')
->leftJoin('domains as d', 'p.service_id', 'd.id')
->leftJoin('misc_services as ms', 'p.service_id', 'ms.id')
->leftJoin('seedboxes as sb', 'p.service_id', 'sb.id')
->where('p.active', 1)
->orderBy('created_at', 'DESC')
->limit(Session::get('recently_added_amount'))
->get(['p.*', 's.hostname', 'd.domain', 'd.extension', 'r.main_domain as reseller', 'sh.main_domain', 'ms.name', 'sb.title']);
});
}
public static function doDueSoon($due_soon)
{
$pricing = new Pricing();
$count = $altered_due_soon = 0;
$server_due_date_changed = false;
foreach ($due_soon as $service) {
if (Carbon::createFromFormat('Y-m-d', $service->next_due_date)->isPast()) {
$months = $pricing->termAsMonths($service->term);//Get months for term to update the next due date to
$new_due_date = Carbon::createFromFormat('Y-m-d', $service->next_due_date)->addMonths($months)->format('Y-m-d');
DB::table('pricings')//Update the DB
->where('service_id', $service->service_id)
->update(['next_due_date' => $new_due_date]);
$due_soon[$count]->next_due_date = $new_due_date;//Update array being sent to view
$altered_due_soon = 1;
if ($service->service_type === 1) {
$server_due_date_changed = true;
Server::serverSpecificCacheForget($service->service_id);
}
} else {
break;//Break because if this date isnt past than the ones after it in the loop wont be either
}
$count++;
}
if ($server_due_date_changed) {
Server::serverRelatedCacheForget();
}
if ($altered_due_soon === 1) {//Made changes to due soon so re-write it
Cache::put('due_soon', $due_soon);
}
return $due_soon;
}
public static function breakdownPricing($all_pricing): array
{
$pricing = json_decode($all_pricing, true);
return Cache::remember('pricing_breakdown', now()->addWeek(1), function () use ($pricing) {
$total_cost_weekly = $total_cost_pm = $inactive_count = 0;
foreach ($pricing as $price) {
if ($price['active'] === 1) {
if (Session::get('dashboard_currency') !== 'USD') {
$the_price = Pricing::convertFromUSD($price['as_usd'], Session::get('dashboard_currency'));
} else {
$the_price = $price['as_usd'];
}
if ($price['term'] === 1) {//1 month
$total_cost_weekly += ($the_price / 4);
$total_cost_pm += $the_price;
} elseif ($price['term'] === 2) {//3 months
$total_cost_weekly += ($the_price / 12);
$total_cost_pm += ($the_price / 3);
} elseif ($price['term'] === 3) {// 6 month
$total_cost_weekly += ($the_price / 24);
$total_cost_pm += ($the_price / 6);
} elseif ($price['term'] === 4) {// 1 year
$total_cost_weekly += ($the_price / 48);
$total_cost_pm += ($the_price / 12);
} elseif ($price['term'] === 5) {//2 years
$total_cost_weekly += ($the_price / 96);
$total_cost_pm += ($the_price / 24);
} elseif ($price['term'] === 6) {//3 years
$total_cost_weekly += ($the_price / 144);
$total_cost_pm += ($the_price / 36);
}
} else {
$inactive_count++;
}
}
$total_cost_yearly = ($total_cost_pm * 12);
return array(
'total_cost_weekly' => $total_cost_weekly,
'total_cost_monthly' => $total_cost_pm,
'total_cost_yearly' => $total_cost_yearly,
'inactive_count' => $inactive_count,
);
});
}
public static function doServicesCount($services_count): array
{
$services_count = json_decode($services_count, true);
return Cache::remember('services_count_all', now()->addWeek(1), function () use ($services_count) {
$servers_count = $domains_count = $shared_count = $reseller_count = $other_count = $seedbox_count = $total_services = 0;
foreach ($services_count as $sc) {
$total_services += $sc['amount'];
if ($sc['service_type'] === 1) {
$servers_count = $sc['amount'];
} else if ($sc['service_type'] === 2) {
$shared_count = $sc['amount'];
} else if ($sc['service_type'] === 3) {
$reseller_count = $sc['amount'];
} else if ($sc['service_type'] === 4) {
$domains_count = $sc['amount'];
} else if ($sc['service_type'] === 5) {
$other_count = $sc['amount'];
} else if ($sc['service_type'] === 6) {
$seedbox_count = $sc['amount'];
}
}
return array(
'servers' => $servers_count,
'shared' => $shared_count,
'reseller' => $reseller_count,
'domains' => $domains_count,
'other' => $other_count,
'seedbox' => $seedbox_count,
'total' => $total_services
);
});
}
}

81
app/Models/IPs.php Normal file
View file

@ -0,0 +1,81 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class IPs extends Model
{
use HasFactory;
public $table = 'ips';
protected $keyType = 'string';
protected $fillable = ['id', 'service_id', 'address', 'is_ipv4', 'active', 'continent', 'country', 'region', 'city', 'org', 'isp', 'asn', 'timezone_gmt', 'fetched_at'];
public $incrementing = false;
public static function deleteIPsAssignedTo($service_id): void
{
DB::table('ips')->where('service_id', $service_id)->delete();
}
public static function insertIP(string $service_id, string $address): IPs
{
return self::create(
[
'id' => Str::random(8),
'service_id' => $service_id,
'address' => $address,
'is_ipv4' => (filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) ? 0 : 1,
'active' => 1
]
);
}
public static function ipsForServer(string $server_id)
{
return Cache::remember("ip_addresses.$server_id", now()->addHours(1), function () use ($server_id) {
return json_decode(DB::table('ips as i')
->where('i.service_id', $server_id)
->get(), true);
});
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
public static function getUpdateIpInfo(IPs $IP): bool
{
$response = Http::get("https://ipwhois.app/json/{$IP->address}");
if ($response->ok()) {
$data = $response->json();
$IP->update([
'continent' => $data['continent'],
'country' => $data['country'],
'region' => $data['region'],
'city' => $data['city'],
'org' => $data['org'],
'isp' => $data['isp'],
'asn' => $data['asn'],
'timezone_gmt' => $data['timezone_gmt'],
'fetched_at' => now()
]);
}
return $response->ok();
}
}

60
app/Models/Labels.php Normal file
View file

@ -0,0 +1,60 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Mockery\Exception;
class Labels extends Model
{
use HasFactory;
public $incrementing = false;
protected $table = 'labels';
protected $keyType = 'string';
protected $fillable = ['id', 'label', 'server_id', 'server_id_2', 'domain_id', 'domain_id_2', 'shared_id', 'shared_id_2'];
public static function deleteLabelsAssignedTo($service_id): void
{
LabelsAssigned::where('service_id', $service_id)->delete();
}
public static function deleteLabelAssignedAs($label_id): void
{
LabelsAssigned::where('label_id', $label_id)->delete();
}
public static function insertLabelsAssigned(array $labels_array, string $service_id): void
{
for ($i = 1; $i <= 4; $i++) {
if (!is_null($labels_array[($i - 1)])) {
try {
LabelsAssigned::create([
'label_id' => $labels_array[($i - 1)],
'service_id' => $service_id
]);
} catch (Exception $exception) {
}
}
}
}
public static function labelsCount(): int
{
return Cache::remember('labels_count', now()->addMonth(1), function () {
return Labels::count();
});
}
public function assigned(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'label_id', 'id');
}
}

View file

@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class LabelsAssigned extends Model
{
use HasFactory;
public $incrementing = false;
public $timestamps = false;
public $table = 'labels_assigned';
protected $fillable = ['label_id', 'service_id'];
protected $keyType = 'string';
public function label(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Labels::class, 'id', 'label_id');
}
}

25
app/Models/Locations.php Normal file
View file

@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class Locations extends Model
{
use HasFactory;
protected $fillable = ['name'];
protected $table = 'locations';
protected $keyType = 'string';
public static function allLocations(): array
{
return Cache::remember("locations", now()->addMonth(1), function () {
return self::orderBy('name')->get()->toArray();
});
}
}

60
app/Models/Misc.php Normal file
View file

@ -0,0 +1,60 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class Misc extends Model
{
use HasFactory;
public $incrementing = false;
protected $table = 'misc_services';
protected $keyType = 'string';
protected $fillable = ['id', 'name', 'owned_since'];
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$array = Settings::orderByProcess(Session::get('sort_on') ?? 2);//created_at desc if not set
if (!in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$builder->orderBy($array[0], $array[1]);
}
});
}
public static function allMisc()
{//All misc and relationships (no using joins)
return Cache::remember("all_misc", now()->addMonth(1), function () {
$query = Misc::with(['price']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "misc_services.id"), $options[1]);
}
return $query->get();
});
}
public static function misc(string $misc_id)
{//Single misc and relationships (no using joins)
return Cache::remember("misc.$misc_id", now()->addMonth(1), function () use ($misc_id) {
return Misc::where('id', $misc_id)
->with(['price'])->first();
});
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
}

View file

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class NetworkSpeed extends Model
{
use HasFactory;
public $incrementing = false;
protected $keyType = 'string';
protected $table = 'network_speed';
protected $fillable = ['id', 'server_id', 'location', 'send', 'send_type', 'send_as_mbps', 'receive', 'receive_type', 'receive_as_mbps', 'created_at', 'updated_at'];
public function yabs(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Yabs::class, 'id', 'id');
}
}

65
app/Models/Note.php Normal file
View file

@ -0,0 +1,65 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class Note extends Model
{
use HasFactory;
public $incrementing = false;
protected $table = 'notes';
protected $keyType = 'string';
protected $fillable = ['id', 'service_id', 'note'];
public static function note(string $service_id): Note
{
return Cache::remember("note.$service_id", now()->addMonth(1), function () use ($service_id) {
return self::where('service_id', $service_id)->with(['server', 'shared', 'reseller', 'domain', 'dns', 'ip'])->first();
});
}
public static function allNotes()
{
return Cache::remember("all_notes", now()->addMonth(1), function () {
return self::with(['server', 'shared', 'reseller', 'domain', 'dns', 'ip'])->orderBy('created_at', 'desc')->get();
});
}
public function server(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Server::class, 'service_id', 'id');
}
public function shared(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Shared::class, 'service_id', 'id');
}
public function reseller(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Reseller::class, 'service_id', 'id');
}
public function domain(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Domains::class, 'service_id', 'id');
}
public function dns(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(DNS::class, 'service_id', 'id');
}
public function ip(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(IPs::class, 'service_id', 'id');
}
}

25
app/Models/OS.php Normal file
View file

@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
class OS extends Model
{
use HasFactory;
protected $fillable = ['name'];
protected $keyType = 'string';
protected $table = 'os';
public static function allOS()
{
return Cache::remember("operating_systems", now()->addMonth(1), function () {
return self::orderBy('name')->get();
});
}
}

151
app/Models/Pricing.php Normal file
View file

@ -0,0 +1,151 @@
<?php
namespace App\Models;
use Exception;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class Pricing extends Model
{
use HasFactory;
protected $table = 'pricings';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = ['service_id', 'service_type', 'currency', 'price', 'term', 'as_usd', 'usd_per_month', 'next_due_date'];
private static function refreshRates(): object
{
if (Cache::has("currency_rates")) {
return Cache::get("currency_rates");
}
$response_json = file_get_contents("https://open.er-api.com/v6/latest/USD");
if (false === $response_json) {
Log::error("do file_get_contents failed");
return (object)null;
}
try {
$response = json_decode($response_json);
if ('success' === $response->result) {
return Cache::remember("currency_rates", now()->addWeek(1), function () use ($response) {
return $response->rates;
});
}
Log::error("server response is " . $response->result . ", expecting success");
} catch (Exception $e) {
Log::error("failed to request v6.exchangerate-api.com", ['err' => $e]);
}
return (object)null;
}
private static function getRates($currency): float
{
$rate = self::refreshRates()->$currency;
return $rate ?? 1.00;
}
public static function getCurrencyList(): array
{
return array_keys((array)self::refreshRates());
}
public static function convertFromUSD(string $amount, string $convert_to): float
{
return $amount * self::getRates($convert_to);
}
public function convertToUSD(string $amount, string $convert_from): float
{
return $amount / self::getRates($convert_from);
}
public function costAsPerMonth(string $cost, int $term): float
{
if ($term === 1) {
return $cost;
} elseif ($term === 2) {
return ($cost / 3);
} elseif ($term === 3) {
return ($cost / 6);
} elseif ($term === 4) {
return ($cost / 12);
} elseif ($term === 5) {
return ($cost / 24);
} elseif ($term === 6) {
return ($cost / 36);
} else {
return $cost;
}
}
public function termAsMonths(int $term): int
{
if ($term === 1) {
return 1;
} elseif ($term === 2) {
return 3;
} elseif ($term === 3) {
return 6;
} elseif ($term === 4) {
return 12;
} elseif ($term === 5) {
return 24;
} elseif ($term === 6) {
return 36;
} else {
return 62;
}
}
public function deletePricing($id): void
{
DB::table('pricings')->where('service_id', $id)->delete();
}
public function insertPricing(int $type, string $service_id, string $currency, float $price, int $term, string $next_due_date, int $is_active = 1): Pricing
{
$as_usd = $this->convertToUSD($price, $currency);
return self::create([
'service_type' => $type,
'service_id' => $service_id,
'currency' => $currency,
'price' => $price,
'term' => $term,
'as_usd' => $as_usd,
'usd_per_month' => $this->costAsPerMonth($as_usd, $term),
'next_due_date' => $next_due_date,
'active' => $is_active
]);
}
public function updatePricing(string $service_id, string $currency, float $price, int $term, string $next_due_date, int $is_active = 1): int
{
$as_usd = $this->convertToUSD($price, $currency);
return DB::table('pricings')
->where('service_id', $service_id)
->update([
'currency' => $currency,
'price' => $price,
'term' => $term,
'as_usd' => $as_usd,
'usd_per_month' => $this->costAsPerMonth($as_usd, $term),
'next_due_date' => $next_due_date,
'active' => $is_active
]);
}
public static function allPricing()
{
return Cache::remember('all_active_pricing', now()->addWeek(1), function () {
return Pricing::where('active', 1)->get();
});
}
}

46
app/Models/Providers.php Normal file
View file

@ -0,0 +1,46 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class Providers extends Model
{
use HasFactory;
protected $fillable = ['name'];
protected $keyType = 'string';
protected $table = 'providers';
public static function allProviders(): array
{
return Cache::remember("providers", now()->addMonth(1), function () {
return self::orderBy('name')->get()->toArray();
});
}
public static function showServicesForProvider($provider): array
{
$servers = DB::table('servers as s')
->where('s.provider_id', $provider)
->get(['s.id', 's.hostname'])
->toArray();
$shared = DB::table('shared_hosting as s')
->where('s.provider_id', $provider)
->get(['s.id', 's.main_domain as main_domain_shared'])
->toArray();
$reseller = DB::table('reseller_hosting as r')
->where('r.provider_id', $provider)
->get(['r.id', 'r.main_domain as main_domain_reseller'])
->toArray();
return array_merge($servers, $shared, $reseller);
}
}

86
app/Models/Reseller.php Normal file
View file

@ -0,0 +1,86 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
class Reseller extends Model
{
use HasFactory;
protected $table = 'reseller_hosting';
protected $keyType = 'string';
protected $fillable = ['id', 'active', 'accounts', 'main_domain', 'has_dedicated_ip', 'ip', 'reseller_type', 'provider_id', 'location_id', 'bandwidth', 'disk', 'disk_type', 'disk_as_gb', 'domains_limit', 'subdomains_limit', 'ftp_limit', 'email_limit', 'db_limit', 'was_promo', 'owned_since'];
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$array = Settings::orderByProcess(Session::get('sort_on') ?? 2);//created_at desc if not set
if (!in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$builder->orderBy($array[0], $array[1]);
}
});
}
public static function allResellerHosting()
{//All reseller hosting and relationships (no using joins)
return Cache::remember("all_reseller", now()->addMonth(1), function () {
$query = Reseller::with(['location', 'provider', 'price', 'ips', 'labels']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "reseller_hosting.id"), $options[1]);
}
return $query->get();
});
}
public static function resellerHosting(string $reseller_id)
{//Single reseller hosting and relationships (no using joins)
return Cache::remember("reseller_hosting.$reseller_id", now()->addMonth(1), function () use ($reseller_id) {
return Reseller::where('id', $reseller_id)
->with(['location', 'provider', 'price', 'ips', 'labels'])->first();
});
}
public function ips(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(IPs::class, 'service_id', 'id');
}
public function location(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Locations::class, 'id', 'location_id');
}
public function provider(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Providers::class, 'id', 'provider_id');
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
public function labels(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'service_id', 'id');
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
}

75
app/Models/SeedBoxes.php Normal file
View file

@ -0,0 +1,75 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class SeedBoxes extends Model
{
use HasFactory;
protected $table = 'seedboxes';
protected $keyType = 'string';
public $incrementing = false;
protected $fillable = ['id', 'active', 'title', 'hostname', 'seed_box_type', 'provider_id', 'location_id', 'bandwidth', 'port_speed', 'disk', 'disk_type', 'disk_as_gb', 'was_promo', 'owned_since'];
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$array = Settings::orderByProcess(Session::get('sort_on') ?? 2);//created_at desc if not set
if (!in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$builder->orderBy($array[0], $array[1]);
}
});
}
public static function allSeedboxes()
{//All seedboxes and relationships (no using joins)
return Cache::remember("all_seedboxes", now()->addMonth(1), function () {
$query = SeedBoxes::with(['location', 'provider', 'price']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "seedboxes.id"), $options[1]);
}
return $query->get();
});
}
public static function seedbox(string $seedbox_id)
{//Single seedbox and relationships (no using joins)
return Cache::remember("seedbox.$seedbox_id", now()->addMonth(1), function () use ($seedbox_id) {
return SeedBoxes::where('id', $seedbox_id)
->with(['location', 'provider', 'price'])->first();
});
}
public function location(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Locations::class, 'id', 'location_id');
}
public function provider(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Providers::class, 'id', 'provider_id');
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
public function labels(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'service_id', 'id');
}
}

239
app/Models/Server.php Normal file
View file

@ -0,0 +1,239 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
use Illuminate\Database\Eloquent\Builder;
class Server extends Model
{
use HasFactory;
protected $table = 'servers';
protected $keyType = 'string';
public $incrementing = false;
protected $fillable = ['id', 'hostname', 'ipv4', 'ipv6', 'server_type', 'os_id', 'location_id', 'provider_id',
'ram', 'disk', 'ram_type', 'disk_type', 'ns1', 'ns2', 'label', 'bandwidth', 'ram_as_mb', 'disk_as_gb',
'has_yabs', 'was_promo', 'owned_since', 'ssh', 'active', 'show_public', 'cpu'];
/**
* @var mixed
*/
private $id;
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$array = Settings::orderByProcess(Session::get('sort_on') ?? 2);//created_at desc if not set
if (!in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$builder->orderBy($array[0], $array[1]);
}
});
}
public static function allServers()
{//All servers and relationships (no using joins)
return Cache::remember("all_servers", now()->addMonth(1), function () {
$query = Server::with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "servers.id"), $options[1]);
}
return $query->get();
});
}
public static function server(string $server_id): Server
{//Single server and relationships (no using joins)
return Cache::remember("server.$server_id", now()->addMonth(1), function () use ($server_id) {
return Server::where('id', $server_id)
->with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels'])->first();
});
}
public static function allActiveServers()
{//All ACTIVE servers and relationships replaces activeServersDataIndexPage()
return Cache::remember("all_active_servers", now()->addMonth(1), function () {
$query = Server::where('active', 1)
->with(['location', 'provider', 'os', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels', 'price']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "servers.id"), $options[1]);
}
return $query->get();
});
}
public static function allNonActiveServers()
{//All NON ACTIVE servers and relationships replaces nonActiveServersDataIndexPage()
return Cache::remember("non_active_servers", now()->addMonth(1), function () {
return Server::where('active', 0)
->with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels'])
->get();
});
}
public static function allPublicServers()
{//server data that will be publicly viewable (values in settings)
return Cache::remember("public_server_data", now()->addMonth(1), function () {
return Server::where('show_public', 1)
->with(['location', 'provider', 'os', 'price', 'ips', 'yabs', 'yabs.disk_speed', 'yabs.network_speed', 'labels'])
->get();
});
}
public static function serviceServerType(int $type, bool $short = true): string
{
if ($type === 1) {
return "KVM";
} elseif ($type === 2) {
return "OVZ";
} elseif ($type === 3) {
if (!$short) {
return "Dedicated";
}
return "DEDI";
} elseif ($type === 4) {
return "LXC";
} elseif ($type === 6) {
return "VMware";
} elseif ($type === 7) {
return "NAT";
} else {
if (!$short) {
return "Semi-dedicated";
}
return "SEMI-DEDI";
}
}
public static function osIntToIcon(int $os, string $os_name): string
{
if ($os === 1) {//None
return "<i class='fas fa-expand' title='{$os_name}'></i>";
} else if ($os <= 3) {//Centos
return "<i class='fa-brands fa-centos os-icon' title='{$os_name}'></i>";
} elseif (($os > 7 && $os <= 10) || $os === 44) {//Debian
return "<i class='fa-brands fa-linux os-icon' title='{$os_name}'></i>";
} elseif (($os > 11 && $os < 15) || $os === 43) {//Fedora
return "<i class='fa-brands fa-fedora os-icon' title='{$os_name}'></i>";
} elseif (($os > 14 && $os < 18) || $os === 46) {//FreeBSD
return "<i class='fa-brands fa-linux os-icon' title='{$os_name}'></i>";
} elseif (($os > 17 && $os < 21) || $os === 42) {//OpenBSD
return "<i class='fa-brands fa-linux os-icon' title='{$os_name}'></i>";
} elseif (($os > 25 && $os < 32) || $os === 41) {//Ubuntu
return "<i class='fa-brands fa-ubuntu os-icon' title='{$os_name}'></i>";
} elseif (($os > 32 && $os < 38) || $os === 40) {//Windows
return "<i class='fa-brands fa-windows os-icon' title='{$os_name}'></i>";
} else {//OTHER ISO CUSTOM etc
return "<i class='fa-solid fa-compact-disc os-icon' title='{$os_name}'></i>";
}
}
public static function tableRowCompare(string $val1, string $val2, string $value_type = '', bool $is_int = true): string
{
//<td class="td-nowrap plus-td">+303<span class="data-type">MBps</span></td>
$str = '<td class="td-nowrap ';
$value_append = '<span class="data-type">' . $value_type . '</span>';
if ($is_int) {
$val1 = (int)$val1;
$val2 = (int)$val2;
}
if ($val1 > $val2) {//val1 is greater than val2
$result = '+' . ($val1 - $val2);
if (!empty($value_type)) {
$result = '+' . ($val1 - $val2) . $value_append;
}
$str .= 'plus-td">' . $result . '</td>';
} elseif ($val1 < $val2) {//val1 is less than val2
$result = '-' . ($val2 - $val1);
if (!empty($value_type)) {
$result = '-' . ($val2 - $val1) . $value_append;
}
$str .= 'neg-td">' . $result . '</td>';
} else {//Equal
$result = 0;
if (!empty($value_type)) {
$result = '0' . $value_append;
}
$str .= 'equal-td">' . $result . '</td>';
}
return $str;
}
public static function serverRelatedCacheForget(): void
{
Cache::forget('all_servers');//All servers
Cache::forget('services_count');//Main page services_count cache
Cache::forget('due_soon');//Main page due_soon cache
Cache::forget('recently_added');//Main page recently_added cache
Cache::forget('all_active_servers');//all active servers cache
Cache::forget('non_active_servers');//all non active servers cache
Cache::forget('servers_summary');//servers summary cache
Cache::forget('public_server_data');//public servers
Cache::forget('all_pricing');//All pricing
Cache::forget('services_count_all');
Cache::forget('pricing_breakdown');
Cache::forget('all_active_pricing');
}
public static function serverSpecificCacheForget(string $server_id): void
{
Cache::forget("server.$server_id");//Will replace one below
Cache::forget("service_pricing.$server_id");//Pricing
}
public static function serverYabsAmount(string $server_id): int
{//Returns amount of YABS a server has
return Yabs::where('server_id', $server_id)->count();
}
public function yabs(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(Yabs::class, 'server_id', 'id');
}
public function ips(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(IPs::class, 'service_id', 'id');
}
public function location(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Locations::class, 'id', 'location_id');
}
public function provider(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Providers::class, 'id', 'provider_id');
}
public function os(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(OS::class, 'id', 'os_id');
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
public function labels(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'service_id', 'id');
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
}

77
app/Models/Settings.php Normal file
View file

@ -0,0 +1,77 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class Settings extends Model
{
use HasFactory;
protected $table = 'settings';
protected $fillable = ['id', 'show_versions_footer', 'show_servers_public', 'show_server_value_ip', 'show_server_value_hostname', 'show_server_value_provider', 'show_server_value_location', 'show_server_value_price', 'show_server_value_yabs', 'save_yabs_as_txt', 'default_currency', 'default_server_os', 'due_soon_amount', 'recently_added_amount', 'dark_mode', 'dashboard_currency', 'sort_on', 'favicon'];
public static function getSettings(): Settings
{
return Cache::remember('settings', now()->addWeek(1), function () {
$settings = self::where('id', 1)->first();
if (is_null($settings)){
$settings = Settings::create();
}
return $settings;
});
}
public static function setSettingsToSession($settings): void
{
Session::put('dark_mode', $settings->dark_mode ?? 0);
Session::put('timer_version_footer', $settings->show_versions_footer ?? 1);
Session::put('show_servers_public', $settings->show_servers_public ?? 0);
Session::put('show_server_value_ip', $settings->show_server_value_ip ?? 0);
Session::put('show_server_value_hostname', $settings->show_server_value_hostname ?? 0);
Session::put('show_server_value_price', $settings->show_server_value_price ?? 0);
Session::put('show_server_value_yabs', $settings->show_server_value_yabs ?? 0);
Session::put('show_server_value_provider', $settings->show_server_value_provider ?? 0);
Session::put('show_server_value_location', $settings->show_server_value_location ?? 0);
Session::put('save_yabs_as_txt', $settings->save_yabs_as_txt ?? 0);
Session::put('default_currency', $settings->default_currency ?? 'USD');
Session::put('default_server_os', $settings->default_server_os ?? 1);
Session::put('due_soon_amount', $settings->due_soon_amount ?? 6);
Session::put('recently_added_amount', $settings->recently_added_amount ?? 6);
Session::put('dashboard_currency', $settings->dashboard_currency ?? 'USD');
Session::put('sort_on', $settings->sort_on ?? 1);
Session::put('favicon', $settings->favicon ?? 'favicon.ico');
Session::save();
}
public static function orderByProcess(int $value): array
{
if ($value === 1) {//created_at ASC
return ['created_at', 'asc'];
} elseif ($value === 2) {//created_at DESC
return ['created_at', 'desc'];
} elseif ($value === 3) {//next_due_date ASC
return ['next_due_date', 'asc'];
} elseif ($value === 4) {//next_due_date DESC
return ['next_due_date', 'desc'];
} elseif ($value === 5) {//as_usd ASC
return ['as_usd', 'asc'];
} elseif ($value === 6) {//as_usd DESC
return ['as_usd', 'desc'];
} elseif ($value === 7) {//owned_since ASC
return ['owned_since', 'asc'];
} elseif ($value === 8) {//owned_since DESC
return ['owned_since', 'desc'];
} elseif ($value === 9) {//updated_at ASC
return ['updated_at', 'asc'];
} elseif ($value === 10) {//updated_at DESC
return ['updated_at', 'desc'];
}
return ['created_at', 'desc'];
}
}

85
app/Models/Shared.php Normal file
View file

@ -0,0 +1,85 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
class Shared extends Model
{
use HasFactory;
public $table = 'shared_hosting';
protected $keyType = 'string';
protected $fillable = ['id', 'active', 'main_domain', 'has_dedicated_ip', 'ip', 'shared_type', 'provider_id', 'location_id', 'bandwidth', 'disk', 'disk_type', 'disk_as_gb', 'domains_limit', 'subdomains_limit', 'ftp_limit', 'email_limit', 'db_limit', 'was_promo', 'owned_since'];
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::addGlobalScope('order', function (Builder $builder) {
$array = Settings::orderByProcess(Session::get('sort_on') ?? 2);//created_at desc if not set
if (!in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$builder->orderBy($array[0], $array[1]);
}
});
}
public static function allSharedHosting()
{//All shared hosting and relationships (no using joins)
return Cache::remember("all_shared", now()->addMonth(1), function () {
$query = Shared::with(['location', 'provider', 'price', 'ips', 'labels']);
if (in_array(Session::get('sort_on'), [3, 4, 5, 6], true)) {
$options = Settings::orderByProcess(Session::get('sort_on'));
$query->orderBy(Pricing::select("pricings.$options[0]")->whereColumn("pricings.service_id", "shared_hosting.id"), $options[1]);
}
return $query->get();
});
}
public static function sharedHosting(string $shared_id)
{//Single shared hosting and relationships (no using joins)
return Cache::remember("shared_hosting.$shared_id", now()->addMonth(1), function () use ($shared_id) {
return Shared::where('id', $shared_id)
->with(['location', 'provider', 'price', 'ips', 'labels'])->first();
});
}
public function ips(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(IPs::class, 'service_id', 'id');
}
public function location(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Locations::class, 'id', 'location_id');
}
public function provider(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Providers::class, 'id', 'provider_id');
}
public function price(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Pricing::class, 'service_id', 'id');
}
public function labels(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(LabelsAssigned::class, 'service_id', 'id');
}
public function note(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Note::class, 'service_id', 'id');
}
}

44
app/Models/User.php Normal file
View file

@ -0,0 +1,44 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'email',
'password',
'api_token'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}

337
app/Models/Yabs.php Normal file
View file

@ -0,0 +1,337 @@
<?php
namespace App\Models;
use DateTime;
use Exception;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class Yabs extends Model
{
use HasFactory;
public $incrementing = false;
protected $keyType = 'string';
protected $table = 'yabs';
protected $fillable = ['id', 'server_id', 'has_ipv6', 'aes', 'vm', 'output_date', 'cpu_cores', 'cpu_freq', 'cpu_model', 'ram', 'ram_type', 'ram_mb', 'disk', 'disk_type', 'disk_gb', 'gb5_single', 'gb5_multi', 'gb5_id', 'gb6_single', 'gb6_multi', 'gb6_id', '4k', '4k_type', '4k_as_mbps', '64k', '64k_type', '64k_as_mbps', '512k', '512k_type', '512k_as_mbps', '1m', '1m_type', '1m_as_mbps', 'location', 'send', 'send_type', 'send_as_mbps', 'receive', 'receive_type', 'receive_as_mbps', 'uptime', 'distro', 'kernel', 'swap', 'swap_type', 'swap_mb'];
public static function yabs(string $yabs_id)
{
return Cache::remember("yabs.$yabs_id", now()->addMonth(1), function () use ($yabs_id) {
return self::where('id', $yabs_id)->with(['server', 'disk_speed', 'network_speed', 'server.location', 'server.provider'])
->first();
});
}
public static function allYabs()
{
return Cache::remember("all_yabs", now()->addMonth(1), function () {
return self::with(['server', 'disk_speed', 'network_speed', 'server.location', 'server.provider'])
->get();
});
}
public function server(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(Server::class, 'id', 'server_id');
}
public function disk_speed(): \Illuminate\Database\Eloquent\Relations\HasOne
{
return $this->hasOne(DiskSpeed::class, 'id', 'id');
}
public function network_speed(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(NetworkSpeed::class, 'id', 'id');
}
public static function buildYabsArray($data): array
{
$speed_tests = [];
foreach ($data->network_speed as $ns) {
$speed_tests[] = [
'location' => $ns->location,
'send' => $ns->send . ' ' . $ns->send_type,
'receive' => $ns->receive . ' ' . $ns->receive_type,
];
}
return [
'date_time' => $data->output_date,
'location' => $data->server->location->name,
'provider' => $data->server->provider->name,
'uptime' => $data->uptime,
'distro' => $data->distro,
'kernel' => $data->kernel,
'cpu' => [
'cores' => $data->cpu_cores,
'speed_mhz' => $data->cpu_freq,
'model' => $data->cpu_model,
'aes' => $data->aes === 1,
'vm' => $data->vm === 1,
'GB5_single' => $data->gb5_single,
'GB5_multi' => $data->gb5_multi,
],
'ram' => [
'amount' => $data->ram . ' ' . $data->ram_type,
'mb' => $data->ram_mb,
'swap' => [
'amount' => $data->swap ?? null . ' ' . $data->swap_type ?? null,
'mb' => $data->swap_mb ?? null,
],
],
'disk' => [
'amount' => $data->disk . ' ' . $data->disk_type,
'gb' => $data->disk_gb,
'speed_tests' => [
'4k' => $data->disk_speed->d_4k . ' ' . $data->disk_speed->d_4k_type,
'64k' => $data->disk_speed->d_64k . ' ' . $data->disk_speed->d_64k_type,
'512k' => $data->disk_speed->d_512k . ' ' . $data->disk_speed->d_512k_type,
'1m' => $data->disk_speed->d_1m . ' ' . $data->disk_speed->d_1m_type,
],
],
'network' => [
'has_ipv6' => $data->has_ipv6 === 1,
'speed_tests' => $speed_tests
],
];
}
public static function speedAsMbps(string $string): float
{
$data = explode(" ", $string);
if ($data[0] === 'busy') {
return 0;
}
if ($data[1] === "Gbits/sec") {
return $data[0] * 1000;
} else if ($data[1] === "Mbits/sec") {
return $data[0];
} else {//Kbps
return $data[0] / 1000;
}
}
public static function speedType(string $string): string
{
$data = explode(" ", $string);
if ($data[0] === 'busy') {
return "MBps";
}
if ($data[1] === "Gbits/sec") {
return "GBps";
} else if ($data[1] === "Mbits/sec") {
return "MBps";
} else {//Kbps
return "KBps";
}
}
public static function speedAsFloat(string $string): float
{
$data = explode(" ", $string);
if ($data[0] === 'busy') {
return 0;
}
return (float)$data[0];
}
public static function formatRunTime(string $date): string
{
return DateTime::createFromFormat('Ymd-His', $date)->format('Y-m-d H:i:s');
}
public static function gb5IdFromURL(string $url): int
{
return str_replace("https://browser.geekbench.com/v5/cpu/", "", $url);
}
public static function gb6IdFromURL(string $url): int
{
return str_replace("https://browser.geekbench.com/v6/cpu/", "", $url);
}
public static function KBstoMBs(int $kbs): float
{
return $kbs / 1000;
}
public static function insertFromJson($data, string $server_id): bool
{
$data = (object)$data;
try {
$date_ran = self::formatRunTime($data->time);
$version = $data['version'];
$has_ipv4 = $data['net']['ipv4'];
$has_ipv6 = $data['net']['ipv6'];
//OS
$arch = $data['os']['arch'];
$distro = $data['os']['distro'];
$kernel = $data['os']['kernel'];
$uptime = $data['os']['uptime'];
//CPU
$model = $data['cpu']['model'];
$cores = $data['cpu']['cores'];
$freq = $data['cpu']['freq'];
$aes = $data['cpu']['aes'];
$virt = $data['cpu']['virt'];
//RAM Disk
$ram = $data['mem']['ram'];
$swap = $data['mem']['swap'];
$disk = $data['mem']['disk'];
$gb5_single = $gb5_multi = $gb5_id = $gb6_single = $gb6_multi = $gb6_id = null;
foreach ($data['geekbench'] as $gb) {
if ($gb['version'] === 5) {
$gb5_single = $gb['single'];
$gb5_multi = $gb['multi'];
$gb5_id = self::gb5IdFromURL($gb['url']);
} elseif ($gb['version'] === 6) {
$gb6_single = $gb['single'];
$gb6_multi = $gb['multi'];
$gb6_id = self::gb6IdFromURL($gb['url']);
}
}
$yabs_id = Str::random(8);
if ($ram > 999999) {
$ram_f = ($ram / 1024 / 1024);
$ram_type = 'GB';
} else {
$ram_f = ($ram / 1024);
$ram_type = 'MB';
}
if ($disk > 100000000) {
$disk_f = ($disk / 1024 / 1024 / 1024);
$disk_type = 'TB';
} else {
$disk_f = ($disk / 1024 / 1024);
$disk_type = 'GB';
}
self::create([
'id' => $yabs_id,
'server_id' => $server_id,
'has_ipv6' => $has_ipv6,
'aes' => $aes,
'vm' => $virt,
'distro' => $distro,
'kernel' => $kernel,
'uptime' => $uptime,
'cpu_model' => $model,
'cpu_cores' => $cores,
'cpu_freq' => (float)$freq,
'ram' => $ram_f,
'ram_type' => $ram_type,
'ram_mb' => ($ram / 1024),
'swap' => $swap / 1024,
'swap_mb' => ($swap / 1024),
'swap_type' => 'MB',
'disk' => $disk_f,
'disk_gb' => ($disk / 1024 / 1024),
'disk_type' => $disk_type,
'output_date' => $date_ran,
'gb5_single' => $gb5_single,
'gb5_multi' => $gb5_multi,
'gb5_id' => $gb5_id,
'gb6_single' => $gb6_single,
'gb6_multi' => $gb6_multi,
'gb6_id' => $gb6_id
]);
//fio
foreach ($data['fio'] as $ds) {
if ($ds['bs'] === '4k') {
$d4k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
$d4k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
$d4k_mbps = self::KBstoMBs($ds['speed_rw']);
}
if ($ds['bs'] === '64k') {
$d64k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
$d64k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
$d64k_mbps = self::KBstoMBs($ds['speed_rw']);
}
if ($ds['bs'] === '512k') {
$d512k = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
$d512k_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
$d512k_mbps = self::KBstoMBs($ds['speed_rw']);
}
if ($ds['bs'] === '1m') {
$d1m = ($ds['speed_rw'] > 999999) ? ($ds['speed_rw'] / 1000 / 1000) : $ds['speed_rw'] / 1000;
$d1m_type = ($ds['speed_rw'] > 999999) ? 'GB/s' : 'MB/s';
$d1m_mbps = self::KBstoMBs($ds['speed_rw']);
}
}
DiskSpeed::create([
'id' => $yabs_id,
'server_id' => $server_id,
'd_4k' => $d4k,
'd_4k_type' => $d4k_type,
'd_4k_as_mbps' => $d4k_mbps,
'd_64k' => $d64k,
'd_64k_type' => $d64k_type,
'd_64k_as_mbps' => $d64k_mbps,
'd_512k' => $d512k,
'd_512k_type' => $d512k_type,
'd_512k_as_mbps' => $d512k_mbps,
'd_1m' => $d1m,
'd_1m_type' => $d1m_type,
'd_1m_as_mbps' => $d1m_mbps
]);
//iperf
foreach ($data['iperf'] as $st) {
($has_ipv4) ? $match = 'IPv4' : $match = 'IPv6';
if ($st['mode'] === $match) {
if ($st['send'] !== "busy " || $st['recv'] !== "busy ") {
NetworkSpeed::create([
'id' => $yabs_id,
'server_id' => $server_id,
'location' => $st['loc'],
'send' => self::speedAsFloat($st['send']),
'send_type' => self::speedType($st['send']),
'send_as_mbps' => self::speedAsMbps($st['send']),
'receive' => self::speedAsFloat($st['recv']),
'receive_type' => self::speedType($st['recv']),
'receive_as_mbps' => self::speedAsMbps($st['recv'])
]);
}
}
}
//Update server
$update_server = DB::table('servers')
->where('id', $server_id)
->update([
'ram' => $ram_f,
'ram_type' => $ram_type,
'ram_as_mb' => ($ram / 1024),
'disk' => $disk_f,
'disk_as_gb' => ($disk / 1024 / 1024),
'disk_type' => $disk_type,
'cpu' => $cores,
'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
return false;
}
return true;
}
}

43
app/Process.php Normal file
View file

@ -0,0 +1,43 @@
<?php
namespace App;
class Process
{
public string $start_time;
public string $end_time;
public function startTimer(): void
{
$this->start_time = microtime(true);
}
public function stopTimer(): void
{
$this->end_time = microtime(true);
}
public function getTimeTaken(): float
{//In seconds
return ($this->end_time - $this->start_time) * 100;
}
public static function paymentTermIntToString(int $term): string
{
if ($term === 1) {
return "p/m";
} elseif ($term === 2) {
return "p/qtr";
} elseif ($term === 3) {
return "p/hy";
} elseif ($term === 4) {
return "p/y";
} elseif ($term === 5) {
return "p/2y";
} elseif ($term === 6) {
return "p/3y";
} else {
return "unknown";
}
}
}

View file

@ -0,0 +1,28 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
}

View file

@ -0,0 +1,30 @@
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
}

View file

@ -0,0 +1,21 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}

View file

@ -0,0 +1,32 @@
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
//
}
}

View file

@ -0,0 +1,66 @@
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/';
/**
* The controller namespace for the application.
*
* When present, controller route declarations will automatically be prefixed with this namespace.
*
* @var string|null
*/
// protected $namespace = 'App\\Http\\Controllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
if (config('app.env') === 'production') {
\Illuminate\Support\Facades\URL::forceScheme('https');
}
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
}

View file

@ -0,0 +1,18 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class AppLayout extends Component
{
/**
* Get the view / contents that represents the component.
*
* @return \Illuminate\View\View
*/
public function render()
{
return view('layouts.app');
}
}

View file

@ -0,0 +1,19 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class CurrencySelect extends Component
{
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
return view('components.currency-select');
}
}

View file

@ -0,0 +1,18 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class GuestLayout extends Component
{
/**
* Get the view / contents that represents the component.
*
* @return \Illuminate\View\View
*/
public function render()
{
return view('layouts.guest');
}
}

View file

@ -0,0 +1,25 @@
<?php
namespace App\View\Components;
use App\Models\Labels;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\Component;
class LabelsSelect extends Component
{
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
$all_labels = Cache::rememberForever('all_labels', function () {
return Labels::all();
});
return view('components.labels-select', [
'labels' => $all_labels
]);
}
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\View\Components;
use App\Models\Locations;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\Component;
class LocationsSelect extends Component
{
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
$all_locations = Locations::allLocations();
return view('components.locations-select', [
'locations' => $all_locations
]);
}
}

View file

@ -0,0 +1,17 @@
<?php
namespace App\View\Components;
use App\Models\OS;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\Component;
class OsSelect extends Component
{
public function render()
{
return view('components.os-select', [
'os' => OS::allOS()->toArray()
]);
}
}

View file

@ -0,0 +1,28 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class PricingSelect extends Component
{
/**
* Create a new component instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
return view('components.pricing-select');
}
}

View file

@ -0,0 +1,24 @@
<?php
namespace App\View\Components;
use App\Models\Providers;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\Component;
class ProvidersSelect extends Component
{
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
$all_providers = Providers::allProviders();
return view('components.providers-select', [
'providers' => $all_providers
]);
}
}

View file

@ -0,0 +1,28 @@
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class TermSelect extends Component
{
/**
* Create a new component instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
return view('components.term-select');
}
}

53
artisan Normal file
View file

@ -0,0 +1,53 @@
#!/usr/bin/env php
<?php
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);

File diff suppressed because one or more lines are too long

1537
assets/css/style.css vendored

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more