2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 18:27:13 +08:00

特性:发布 20221130 版本

This commit is contained in:
耗子
2022-11-30 22:15:32 +08:00
parent 699562d504
commit 329f58da4b
24 changed files with 334 additions and 254 deletions

View File

@@ -1,30 +0,0 @@
<?php
/**
* 耗子Linux面板 - 数据库控制器
* @author 耗子
*/
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class DatabasesController extends Controller
{
public function get_mysql_list()
{
$password = Db::table('setting')->where('name', 'mysql_root_password')->value('value');
$db_raw = trim(shell_exec("/www/server/mysql/bin/mysql -u root -p".$password." -e \"SHOW DATABASES;\""));
$res['code'] = 0;
$res['msg'] = 'success';
$db = explode("\n", $db_raw);
foreach ($db as $key => $value) {
if ($value == 'Database' || $value == 'information_schema' || $value == 'mysql' || $value == 'performance_schema' || $value == 'sys') {
unset($db[$key]);
} else {
$res['data'][] = $value;
}
}
return response()->json($res);
}
}

View File

@@ -31,23 +31,6 @@ class InfosController extends Controller
"icon" => "layui-icon-website",
"jump" => "website/list"
),
array(
"name" => "database",
"title" => "数据库",
"icon" => "layui-icon-template-1",
"list" => array(
array(
"name" => "mysql",
"title" => "MySQL",
"jump" => "database/mysql"
),
array(
"name" => "postgresql",
"title" => "PostgreSQL",
"jump" => "database/postgresql"
)
)
),
array(
"name" => "monitor",
"title" => "监控",

View File

@@ -15,6 +15,7 @@ use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\Validation\ValidationException;
class PluginsController extends Controller
@@ -28,7 +29,7 @@ class PluginsController extends Controller
{
$data['code'] = 0;
$data['msg'] = 'success';
$data['data'] = $this->pluginList(false);
$data['data'] = $this->pluginList();
foreach ($data['data'] as $k => $v) {
// 获取首页显示状态
$shows = Plugin::query()->pluck('show', 'slug');
@@ -73,34 +74,28 @@ class PluginsController extends Controller
'slug' => 'required|max:255',
]);
$slug = $credentials['slug'];
} catch (Exception $e) {
} catch (ValidationException $e) {
return response()->json(['code' => 1, 'msg' => $e->getMessage()]);
}
// 通过slug获取插件信息
$pluginList = $this->pluginList();
// 循环插件列表查找对应的插件信息
$plugin_check = false;
$plugin_data = [];
$pluginCheck = false;
$pluginData = [];
foreach ($pluginList as $v) {
if ($v['slug'] == $slug) {
$plugin_data = $v;
$plugin_check = true;
$pluginData = $v;
$pluginCheck = true;
}
}
// 判断插件是否存在
if (!$plugin_check) {
if (!$pluginCheck) {
return response()->json(['code' => 1, 'msg' => '插件不存在']);
}
// 判断有无任务记录
$task_check = Task::query()->where('name', '安装'.$plugin_data['name'])->first();
if ($task_check) {
$data['code'] = 1;
$data['msg'] = '此插件已存在安装记录,请先删除!';
return response()->json($data);
}
// 判断插件是否已经安装
$installed = Task::query()->where('slug', $slug)->first();
$installed = isset(PLUGINS[$slug]);
if ($installed) {
$data['code'] = 1;
$data['msg'] = '请不要重复安装!';
@@ -109,10 +104,10 @@ class PluginsController extends Controller
// 入库等待安装
$task = new Task();
$task->name = '安装'.$plugin_data['name'];
$task->shell = $plugin_data['install'];
$task->name = '安装 '.$pluginData['name'];
$task->shell = $pluginData['install'];
$task->status = 'waiting';
$task->log = '/tmp/'.$plugin_data['slug'].'.log';
$task->log = '/tmp/'.$pluginData['slug'].'.log';
$task->save();
// 塞入队列
ProcessShell::dispatch($task->id)->delay(1);
@@ -136,32 +131,25 @@ class PluginsController extends Controller
'slug' => 'required|max:255',
]);
$slug = $credentials['slug'];
} catch (Exception $e) {
} catch (ValidationException $e) {
return response()->json(['code' => 1, 'msg' => $e->getMessage()]);
}
// 通过slug获取插件信息
$pluginList = $this->pluginList();
// 循环插件列表查找对应的插件信息
$plugin_check = false;
$plugin_data = [];
$pluginCheck = false;
$pluginData = [];
foreach ($pluginList as $v) {
if ($v['slug'] == $slug) {
$plugin_data = $v;
$plugin_check = true;
$pluginData = $v;
$pluginCheck = true;
}
}
// 判断插件是否存在
if (!$plugin_check) {
return response()->json(['code' => 1, 'msg' => '插件不存在']);
}
// 判断有无任务记录
$task_check = Task::query()->where('name', '卸载'.$plugin_data['name'])->first();
if ($task_check) {
$data['code'] = 1;
$data['msg'] = '此插件已存在卸载记录,请先删除!';
return response()->json($data);
// 判断插件是否存在
if (!$pluginCheck) {
return response()->json(['code' => 1, 'msg' => '插件不存在']);
}
// 判断是否是操作openresty
@@ -173,10 +161,67 @@ class PluginsController extends Controller
// 入库等待卸载
$task = new Task();
$task->name = '卸载'.$plugin_data['name'];
$task->shell = $plugin_data['uninstall'];
$task->name = '卸载 '.$pluginData['name'];
$task->shell = $pluginData['uninstall'];
$task->status = 'waiting';
$task->log = '/tmp/'.$plugin_data['slug'].'.log';
$task->log = '/tmp/'.$pluginData['slug'].'.log';
$task->save();
// 塞入队列
ProcessShell::dispatch($task->id)->delay(1);
$res['code'] = 0;
$res['msg'] = 'success';
$res['data'] = '任务添加成功';
return response()->json($res);
}
/**
* 更新插件
*/
public function update(Request $request): JsonResponse
{
// 消毒
try {
$credentials = $this->validate($request, [
'slug' => 'required|max:255',
]);
$slug = $credentials['slug'];
} catch (ValidationException $e) {
return response()->json(['code' => 1, 'msg' => $e->getMessage()]);
}
// 通过slug获取插件信息
$pluginList = $this->pluginList();
// 循环插件列表查找对应的插件信息
$pluginCheck = false;
$pluginData = [];
foreach ($pluginList as $v) {
if ($v['slug'] == $slug) {
$pluginData = $v;
$pluginCheck = true;
break;
}
}
// 判断插件是否存在
if (!$pluginCheck) {
return response()->json(['code' => 1, 'msg' => '插件不存在']);
}
// 判断插件是否已经安装
$installed = isset(PLUGINS[$slug]);
if (!$installed) {
$data['code'] = 1;
$data['msg'] = '插件未安装!';
return response()->json($data);
}
// 入库等待更新
$task = new Task();
$task->name = '更新 '.$pluginData['name'];
$task->shell = $pluginData['update'];
$task->status = 'waiting';
$task->log = '/tmp/'.$pluginData['slug'].'.log';
$task->save();
// 塞入队列
ProcessShell::dispatch($task->id)->delay(1);
@@ -229,10 +274,18 @@ class PluginsController extends Controller
]);
$slug = $credentials['slug'];
$show = $credentials['show'];
} catch (Exception $e) {
} catch (ValidationException $e) {
return response()->json(['code' => 1, 'msg' => $e->getMessage()]);
}
// 判断插件是否已经安装
$installed = isset(PLUGINS[$slug]);
if (!$installed) {
$data['code'] = 1;
$data['msg'] = '插件未安装!';
return response()->json($data);
}
Plugin::query()->where('slug', $slug)->update(['show' => $show]);
$res['code'] = 0;
$res['msg'] = 'success';

View File

@@ -15,24 +15,18 @@ class SettingsController extends Controller
{
/**
* 获取面板设置
* @param Request $request
* @return JsonResponse
*/
public function get(Request $request)
public function get(): JsonResponse
{
$settings = Setting::query()->get()->toArray();
foreach ($settings as $setting) {
$res['data'][$setting['name']] = $setting['value'];
}
if (!empty($settings)) {
$res['code'] = 0;
$res['msg'] = 'success';
} else {
$res['code'] = 1;
$res['msg'] = '面板设置获取失败';
$res['data'] = null;
}
$settings = Setting::all();
// 隐藏字段
$settings->makeHidden('id');
$settings->makeHidden('created_at');
$settings->makeHidden('updated_at');
$res['code'] = 0;
$res['msg'] = 'success';
$res['data'] = $settings->pluck('value', 'name');
return response()->json($res);
}
@@ -47,16 +41,9 @@ class SettingsController extends Controller
$settings = $request->all();
// 将数据入库
foreach ($settings as $key => $value) {
if ($key == 'access_token' || $key == 'username' || $key == 'password') {
if ($key == 'access_token') {
continue;
}
if ($key == 'mysql_root_password') {
$old_mysql_password = Setting::query()->where('name', 'mysql_root_password')->value('value');
if ($old_mysql_password != $value) {
shell_exec('mysql -uroot -p'.$old_mysql_password.' -e "ALTER USER \'root\'@\'localhost\' IDENTIFIED BY \''.$value.'\';"');
shell_exec('mysql -uroot -p'.$old_mysql_password.' -e "flush privileges;"');
}
}
Setting::query()->where('name', $key)->update(['value' => $value]);
}
$res['code'] = 0;

View File

@@ -23,7 +23,7 @@ class TasksController extends Controller
$task = Task::query()->where('status', 'running')->orWhere('status', 'waiting')->first();
$res['code'] = 0;
$res['msg'] = 'success';
if ($task) {
if (empty($task)) {
$res['data'] = false;
} else {
$res['data'] = true;

View File

@@ -29,7 +29,7 @@ class UsersController extends Controller
} catch (ValidationException $e) {
return response()->json([
'code' => 1,
'msg' => '参数错误',
'msg' => '参数错误'.$e->getMessage(),
'errors' => $e->errors()
], 422);
}

View File

@@ -9,10 +9,8 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Website;
use App\Models\Setting;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\ValidationException;
class WebsitesController extends Controller
@@ -23,9 +21,9 @@ class WebsitesController extends Controller
*/
public function getList(): JsonResponse
{
$website_lists = Website::query()->get();
$websiteList = Website::query()->get();
// 判空
if ($website_lists->isEmpty()) {
if ($websiteList->isEmpty()) {
return response()->json([
'code' => 0,
'msg' => '无数据',
@@ -35,7 +33,7 @@ class WebsitesController extends Controller
return response()->json([
'code' => 0,
'msg' => '获取成功',
'data' => $website_lists
'data' => $websiteList
]);
}
@@ -58,15 +56,31 @@ class WebsitesController extends Controller
'db_type' => 'required_if:db,true|max:10',
'db_name' => 'required_if:db,true|max:255',
'db_username' => 'required_if:db,true|max:255',
'db_password' => 'required_if:db,true|max:255',
'db_password' => ['required_if:db,true', 'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$/', 'min:8'],
]);
} catch (ValidationException $e) {
return response()->json([
'code' => 1,
'msg' => '参数错误',
'msg' => '参数错误'.$e->getMessage(),
'errors' => $e->errors()
], 200);
}
// 禁止添加重复网站
$website = Website::query()->where('name', $credentials['name'])->first();
if ($website) {
return response()->json([
'code' => 1,
'msg' => '网站已存在'
]);
}
// 禁止phpmyadmin作为名称
if ($credentials['name'] == 'phpmyadmin') {
return response()->json([
'code' => 1,
'msg' => '该名称为保留名称,请更换'
]);
}
// path为空时设置默认值
if (empty($credentials['path'])) {
$credentials['path'] = '/www/wwwroot/'.$credentials['name'];
@@ -228,20 +242,34 @@ EOF;
/**
* 获取网站全局设置
* @return
* @return JsonResponse
*/
public function get_website_default_settings()
public function getDefaultSettings(): JsonResponse
{
return '待开发功能';
$index = @file_get_contents('/www/server/nginx/html/index.html') ? file_get_contents('/www/server/nginx/html/index.html') : '';
$stop = @file_get_contents('/www/server/nginx/html/stop.html') ? file_get_contents('/www/server/nginx/html/stop.html') : '';
$res['code'] = 0;
$res['msg'] = 'success';
$res['data'] = [
'index' => $index,
'stop' => $stop,
];
return response()->json($res);
}
/**
* 保存网站全局设置
* @return
* @return JsonResponse
*/
public function save_website_default_settings()
public function saveDefaultSettings(): JsonResponse
{
return '待开发功能';
$index = request()->input('index');
$stop = request()->input('stop');
file_put_contents('/www/server/nginx/html/index.html', $index);
file_put_contents('/www/server/nginx/html/stop.html', $stop);
$res['code'] = 0;
$res['msg'] = 'success';
return response()->json($res);
}
/**