mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 20:48:42 +08:00
特性:发布 20221130 版本
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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" => "监控",
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -29,7 +29,7 @@ class UsersController extends Controller
|
||||
} catch (ValidationException $e) {
|
||||
return response()->json([
|
||||
'code' => 1,
|
||||
'msg' => '参数错误',
|
||||
'msg' => '参数错误:'.$e->getMessage(),
|
||||
'errors' => $e->errors()
|
||||
], 422);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user