-
Notifications
You must be signed in to change notification settings - Fork 224
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
353 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
|
||
|
||
include $(TOPDIR)/rules.mk | ||
|
||
PKG_VERSION:=1.0.2-20231208 | ||
PKG_RELEASE:= | ||
|
||
LUCI_TITLE:=LuCI support for 1Panel | ||
LUCI_PKGARCH:=all | ||
LUCI_DEPENDS:=+lsblk +zoneinfo-asia +docker +luci-lib-taskd +luci-lib-docker | ||
|
||
define Package/luci-app-istorepanel/conffiles | ||
/etc/config/istorepanel | ||
endef | ||
|
||
include $(TOPDIR)/feeds/luci/luci.mk | ||
|
||
# call BuildPackage - OpenWrt buildroot signature |
7 changes: 7 additions & 0 deletions
7
applications/luci-app-istorepanel/luasrc/controller/istorepanel.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
|
||
module("luci.controller.istorepanel", package.seeall) | ||
|
||
function index() | ||
entry({"admin", "services", "istorepanel"}, alias("admin", "services", "istorepanel", "config"), _("1Panel"), 30).dependent = true | ||
entry({"admin", "services", "istorepanel", "config"}, cbi("istorepanel")) | ||
end |
73 changes: 73 additions & 0 deletions
73
applications/luci-app-istorepanel/luasrc/model/cbi/istorepanel.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
--[[ | ||
LuCI - Lua Configuration Interface | ||
]]-- | ||
|
||
local taskd = require "luci.model.tasks" | ||
local docker = require "luci.docker" | ||
local istorepanel_model = require "luci.model.istorepanel" | ||
local m, s, o | ||
|
||
m = taskd.docker_map("istorepanel", "istorepanel", "/usr/libexec/istorec/istorepanel.sh", | ||
translate("1Panel"), | ||
translate("1Panel is the new generation Linux server maintenance panel.") | ||
.. translate("Official website:") .. ' <a href=\"https://1panel.cn/\" target=\"_blank\">https://1panel.cn/</a>') | ||
|
||
local dk = docker.new({socket_path="/var/run/docker.sock"}) | ||
local dockerd_running = dk:_ping().code == 200 | ||
local docker_info = dockerd_running and dk:info().body or {} | ||
local docker_aspace = 0 | ||
if docker_info.DockerRootDir then | ||
local statvfs = nixio.fs.statvfs(docker_info.DockerRootDir) | ||
docker_aspace = statvfs and (statvfs.bavail * statvfs.bsize) or 0 | ||
end | ||
|
||
s = m:section(SimpleSection, translate("Service Status"), translate("1Panel status:")) | ||
s:append(Template("istorepanel/status")) | ||
|
||
s = m:section(TypedSection, "main", translate("Setup"), | ||
(docker_aspace < 2147483648 and | ||
(translate("The free space of Docker is less than 2GB, which may cause the installation to fail.") | ||
.. "<br>") or "") .. translate("The following parameters will only take effect during installation or upgrade:")) | ||
s.addremove=false | ||
s.anonymous=true | ||
|
||
o = s:option(Value, "port", translate("Port").."<b>*</b>") | ||
o.default = "8063" | ||
o.datatype = "port" | ||
o:depends("hostnet", 0) | ||
|
||
o = s:option(Value, "username", "username") | ||
o.datatype = "string" | ||
o.default = '1panel' | ||
|
||
o = s:option(Value, "password", "password") | ||
o.password = true | ||
o.datatype = "string" | ||
o.default = "password" | ||
|
||
o = s:option(Value, "ver", "version") | ||
o.datatype = "string" | ||
o:value("v1.10.10-lts", "v1.10.10-lts") | ||
o:value("v1.10.11-lts", "v1.10.11-lts") | ||
o.default = 'v1.10.11-lts' | ||
|
||
o = s:option(Value, "image_name", translate("Image").."<b>*</b>") | ||
o.rmempty = false | ||
o.datatype = "string" | ||
o:value("linkease/istorepanel:latest", "linkease/istorepanel:latest") | ||
o.default = "linkease/istorepanel:latest" | ||
|
||
local blocks = istorepanel_model.blocks() | ||
local home = istorepanel_model.home() | ||
|
||
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>") | ||
o.rmempty = false | ||
o.datatype = "string" | ||
|
||
local paths, default_path = istorepanel_model.find_paths(blocks, home, "Configs") | ||
for _, val in pairs(paths) do | ||
o:value(val, val) | ||
end | ||
o.default = default_path | ||
|
||
return m |
55 changes: 55 additions & 0 deletions
55
applications/luci-app-istorepanel/luasrc/model/istorepanel.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
local util = require "luci.util" | ||
local jsonc = require "luci.jsonc" | ||
|
||
local istorepanel = {} | ||
|
||
istorepanel.blocks = function() | ||
local f = io.popen("lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json", "r") | ||
local vals = {} | ||
if f then | ||
local ret = f:read("*all") | ||
f:close() | ||
local obj = jsonc.parse(ret) | ||
for _, val in pairs(obj["blockdevices"]) do | ||
local fsize = val["fssize"] | ||
if fsize ~= nil and string.len(fsize) > 10 and val["mountpoint"] then | ||
-- fsize > 1G | ||
vals[#vals+1] = val["mountpoint"] | ||
end | ||
end | ||
end | ||
return vals | ||
end | ||
|
||
istorepanel.home = function() | ||
local uci = require "luci.model.uci".cursor() | ||
local home_dirs = {} | ||
home_dirs["main_dir"] = uci:get_first("quickstart", "main", "main_dir", "/root") | ||
home_dirs["Configs"] = uci:get_first("quickstart", "main", "conf_dir", home_dirs["main_dir"].."/Configs") | ||
home_dirs["Public"] = uci:get_first("quickstart", "main", "pub_dir", home_dirs["main_dir"].."/Public") | ||
home_dirs["Downloads"] = uci:get_first("quickstart", "main", "dl_dir", home_dirs["Public"].."/Downloads") | ||
home_dirs["Caches"] = uci:get_first("quickstart", "main", "tmp_dir", home_dirs["main_dir"].."/Caches") | ||
return home_dirs | ||
end | ||
|
||
istorepanel.find_paths = function(blocks, home_dirs, path_name) | ||
local default_path = '' | ||
local configs = {} | ||
|
||
default_path = home_dirs[path_name] .. "/1Panel" | ||
if #blocks == 0 then | ||
table.insert(configs, default_path) | ||
else | ||
for _, val in pairs(blocks) do | ||
table.insert(configs, val .. "/" .. path_name .. "/1Panel") | ||
end | ||
local without_conf_dir = "/root/" .. path_name .. "/1Panel" | ||
if default_path == without_conf_dir then | ||
default_path = configs[1] | ||
end | ||
end | ||
|
||
return configs, default_path | ||
end | ||
|
||
return istorepanel |
31 changes: 31 additions & 0 deletions
31
applications/luci-app-istorepanel/luasrc/view/istorepanel/status.htm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
<% | ||
local util = require "luci.util" | ||
local container_status = util.trim(util.exec("/usr/libexec/istorec/istorepanel.sh status")) | ||
local container_install = (string.len(container_status) > 0) | ||
local container_running = container_status == "running" | ||
-%> | ||
<div class="cbi-value"> | ||
<label class="cbi-value-title"><%:Status%></label> | ||
<div class="cbi-value-field"> | ||
<% if container_running then %> | ||
<button class="cbi-button cbi-button-success" disabled="true"><%:1Panel is running%></button> | ||
<% else %> | ||
<button class="cbi-button cbi-button-negative" disabled="true"><%:1Panel is not running%></button> | ||
<% end %> | ||
</div> | ||
</div> | ||
<% | ||
if container_running then | ||
local port=util.trim(util.exec("/usr/libexec/istorec/istorepanel.sh port")) | ||
if port == "" then | ||
port="10086" | ||
end | ||
-%> | ||
<div class="cbi-value cbi-value-last"> | ||
<label class="cbi-value-title"> </label> | ||
<div class="cbi-value-field"> | ||
|
||
<input type="button" class="btn cbi-button cbi-button-apply" name="start" value="<%:Open 1Panel%>" onclick="window.open('http://'+location.hostname+':<%=port%>/entrance', '_blank')"> | ||
</div> | ||
</div> | ||
<% end %> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
msgid "" | ||
msgstr "Content-Type: text/plain; charset=UTF-8" | ||
|
||
msgid "Official website:" | ||
msgstr "官方网站:" | ||
|
||
msgid "1Panel is the new generation Linux server maintenance panel." | ||
msgstr "1Panel 是新一代的 Linux 服务器运维管理面板" | ||
|
||
msgid "Config path" | ||
msgstr "配置文件路径" | ||
|
||
msgid "Port" | ||
msgstr "端口" | ||
|
||
msgid "Service Status" | ||
msgstr "服务状态" | ||
|
||
msgid "1Panel status:" | ||
msgstr "1Panel 的状态信息如下:" | ||
|
||
msgid "Setup" | ||
msgstr "安装配置" | ||
|
||
msgid "The following parameters will only take effect during installation or upgrade:" | ||
msgstr "以下参数只在安装或者升级时才会生效:" | ||
|
||
msgid "Status" | ||
msgstr "状态" | ||
|
||
msgid "1Panel is running" | ||
msgstr "1Panel 运行中" | ||
|
||
msgid "1Panel is not running" | ||
msgstr "1Panel 未运行" | ||
|
||
msgid "Open 1Panel" | ||
msgstr "打开 1Panel" | ||
|
||
msgid "The free space of Docker is less than 2GB, which may cause the installation to fail." | ||
msgstr "Docker 可用空间已不足2GB,可能导致安装失败。" | ||
|
||
msgid "Please make sure there has enough space" | ||
msgstr "请确保有足够空间" |
8 changes: 8 additions & 0 deletions
8
applications/luci-app-istorepanel/root/etc/config/istorepanel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
config main | ||
option 'port' '10086' | ||
# option 'config_path' '' | ||
# option 'ver' 'v1.10.10-lts' | ||
# option 'entrance' 'entrance' | ||
# option 'username' '1panel' | ||
# option 'password' 'password' | ||
|
117 changes: 117 additions & 0 deletions
117
applications/luci-app-istorepanel/root/usr/libexec/istorec/istorepanel.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#!/bin/sh | ||
# Author Xiaobao([email protected]) | ||
|
||
ACTION=${1} | ||
shift 1 | ||
|
||
do_install() { | ||
local port=`uci get istorepanel.@main[0].port 2>/dev/null` | ||
local image_name=`uci get istorepanel.@main[0].image_name 2>/dev/null` | ||
local config=`uci get istorepanel.@main[0].config_path 2>/dev/null` | ||
local entrance=`uci get istorepanel.@main[0].entrance 2>/dev/null` | ||
local username=`uci get istorepanel.@main[0].username 2>/dev/null` | ||
local password=`uci get istorepanel.@main[0].password 2>/dev/null` | ||
local ver=`uci get istorepanel.@main[0].ver 2>/dev/null` | ||
|
||
if [ -z "$config" ]; then | ||
echo "config path is empty!" | ||
exit 1 | ||
fi | ||
|
||
[ -z "$port" ] && port=10086 | ||
[ -z "$ver" ] && ver='v1.10.10-lts' | ||
[ -z "$username" ] && username='1panel' | ||
[ -z "$password" ] && password='password' | ||
[ -z "$entrance" ] && entrance='entrance' | ||
|
||
mkdir -p $config | ||
|
||
cat > $config/env <<EOF | ||
export PANEL_BASE_DIR=${config} | ||
export PANEL_PORT=${port} | ||
export DEFAULT_ENTRANCE=${entrance} | ||
export DEFAULT_USERNAME=${username} | ||
export DEFAULT_PASSWORD=${password} | ||
export PANELVER=${ver} | ||
EOF | ||
|
||
[ -z "$image_name" ] && image_name="linkease/istorepanel:latest" | ||
echo "docker pull ${image_name}" | ||
docker pull ${image_name} | ||
docker rm -f istorepanel | ||
|
||
if [ ! -f "/tmp/localtime" ]; then | ||
/etc/init.d/system reload | ||
fi | ||
|
||
local cmd="docker run --restart=unless-stopped -d -h 1PanelServer \ | ||
--cgroupns=host \ | ||
--cap-add SYS_ADMIN \ | ||
--tmpfs /tmp \ | ||
--network host \ | ||
-v /sys/fs/cgroup:/sys/fs/cgroup \ | ||
-v /var/run:/var2/run \ | ||
-v \"$config:/iStorePanel\" " | ||
|
||
cmd="$cmd\ | ||
--dns=172.17.0.1 \ | ||
--dns=223.5.5.5 " | ||
|
||
local tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`" | ||
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz" | ||
|
||
cmd="$cmd -v /mnt:/mnt" | ||
mountpoint -q /mnt && cmd="$cmd:rslave" | ||
cmd="$cmd --name istorepanel \"$image_name\"" | ||
|
||
echo "$cmd" | ||
eval "$cmd" | ||
|
||
echo "Installing 1panel" | ||
for b in {1..30} | ||
do | ||
sleep 3 | ||
docker_status=`docker ps --all -f 'name=istorepanel' --format '{{.State}}'` | ||
if [[ $docker_status == *running* ]]; then | ||
docker exec istorepanel /app/reinstall.sh | ||
break; | ||
else | ||
echo "istorepanel is not running, wait..." | ||
fi | ||
done | ||
} | ||
|
||
usage() { | ||
echo "usage: $0 sub-command" | ||
echo "where sub-command is one of:" | ||
echo " install Install the istorepanel" | ||
echo " upgrade Upgrade the istorepanel" | ||
echo " rm/start/stop/restart Remove/Start/Stop/Restart the istorepanel" | ||
echo " status 1Panel status" | ||
echo " port 1Panel port" | ||
} | ||
|
||
case ${ACTION} in | ||
"install") | ||
do_install | ||
;; | ||
"upgrade") | ||
do_install | ||
;; | ||
"rm") | ||
docker rm -f istorepanel | ||
;; | ||
"start" | "stop" | "restart") | ||
docker ${ACTION} istorepanel | ||
;; | ||
"status") | ||
docker ps --all -f 'name=istorepanel' --format '{{.State}}' | ||
;; | ||
"port") | ||
echo `uci get istorepanel.@main[0].port 2>/dev/null` | ||
;; | ||
*) | ||
usage | ||
exit 1 | ||
;; | ||
esac |