mirror of
https://github.com/kenzok8/openwrt-packages
synced 2025-01-09 04:37:38 +08:00
update 2024-03-15 20:08:50
This commit is contained in:
parent
1d0393521e
commit
6698dc1755
@ -7,8 +7,8 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=luci-app-partexp
|
PKG_NAME:=luci-app-partexp
|
||||||
PKG_VERSION:=0.1.9
|
PKG_VERSION:=1.1.0
|
||||||
PKG_RELEASE:=20221201
|
PKG_RELEASE:=20240314
|
||||||
|
|
||||||
PKG_LICENSE:=Apache-2.0
|
PKG_LICENSE:=Apache-2.0
|
||||||
PKG_MAINTAINER:=Sirpdboy <herboy2008@gmail.com>
|
PKG_MAINTAINER:=Sirpdboy <herboy2008@gmail.com>
|
||||||
|
@ -1,80 +1,49 @@
|
|||||||
--[[
|
--[[
|
||||||
LuCI - Lua Configuration Partition Expansion
|
LuCI - Lua Configuration Partition Expansion
|
||||||
Copyright (C) 2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-partexp
|
Copyright (C) 2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/partexp
|
||||||
]]--
|
]]--
|
||||||
require "luci.util"
|
|
||||||
|
local fs = require "nixio.fs"
|
||||||
|
local http = require "luci.http"
|
||||||
|
local uci = require"luci.model.uci".cursor()
|
||||||
local name = 'partexp'
|
local name = 'partexp'
|
||||||
|
|
||||||
module("luci.controller.partexp", package.seeall)
|
module("luci.controller.partexp", package.seeall)
|
||||||
|
|
||||||
function index()
|
function index()
|
||||||
entry({"admin","system","partexp"},alias("admin", "system", "partexp", "global"),_("Partition Expansion"), 54)
|
local e = entry({"admin","system","partexp"},alias("admin", "system", "partexp", "global"),_("Partition Expansion"), 54)
|
||||||
-- entry({"admin", "system", "partexp", "global"}, form("partexp/global"), nil).leaf = true
|
e.dependent = false
|
||||||
|
e.acl_depends = { "luci-app-partexp" }
|
||||||
entry({"admin", "system", "partexp", "global"}, cbi('partexp/global', {hideapplybtn = true, hidesavebtn = true, hideresetbtn = true}), _('Partition Expansion'), 10).leaf = true
|
entry({"admin", "system", "partexp", "global"}, cbi('partexp/global', {hideapplybtn = true, hidesavebtn = true, hideresetbtn = true}), _('Partition Expansion'), 10).leaf = true
|
||||||
entry({"admin", "system", "partexp","partexprun"}, call("partexprun")).leaf = true
|
entry({"admin", "system", "partexp","partexprun"}, call("partexprun"))
|
||||||
|
entry({"admin", "system", "partexp", "check"}, call("act_check"))
|
||||||
|
end
|
||||||
|
function act_check()
|
||||||
|
|
||||||
|
http.prepare_content("text/plain; charset=utf-8")
|
||||||
|
local f=io.open("/etc/partexp/partexp.log", "r+")
|
||||||
|
local fdp=fs.readfile("/etc/partexp/lucilogpos") or 0
|
||||||
|
f:seek("set",fdp)
|
||||||
|
local a=f:read(2048000) or ""
|
||||||
|
fdp=f:seek()
|
||||||
|
fs.writefile("/etc/partexp/lucilogpos",tostring(fdp))
|
||||||
|
f:close()
|
||||||
|
http.write(a)
|
||||||
end
|
end
|
||||||
|
|
||||||
function get_log()
|
|
||||||
local e = {}
|
|
||||||
e.running = luci.sys.call("busybox ps -w | grep partexp | grep -v grep >/dev/null") == 0
|
|
||||||
e.log = fs.readfile("/etc/partexp/partexp.log") or ""
|
|
||||||
luci.http.prepare_content("application/json")
|
|
||||||
luci.http.write_json(e)
|
|
||||||
end
|
|
||||||
|
|
||||||
function partexprun()
|
function partexprun()
|
||||||
local uci = luci.model.uci.cursor()
|
local kconfig = http.formvalue('kconfig')
|
||||||
local keep_config = luci.http.formvalue('keep_config')
|
local aformat = http.formvalue('aformat')
|
||||||
local auto_format = luci.http.formvalue('auto_format')
|
local targetf = http.formvalue('targetf')
|
||||||
local target_function = luci.http.formvalue('target_function')
|
local targetd = http.formvalue('targetd')
|
||||||
local target_disk = luci.http.formvalue('target_disk')
|
uci:set(name, 'global', 'target_disk', targetd)
|
||||||
--uci:delete(name, '@global[0]', global)
|
uci:set(name, 'global', 'target_function', targetf)
|
||||||
uci:set(name, '@global[0]', 'target_disk', target_disk)
|
uci:set(name, 'global', 'auto_format', aformat)
|
||||||
uci:set(name, '@global[0]', 'target_function', target_function)
|
uci:set(name, 'global', 'keep_config', kconfig)
|
||||||
uci:set(name, '@global[0]', 'auto_format', auto_format)
|
|
||||||
uci:set(name, '@global[0]', 'keep_config', keep_config)
|
|
||||||
uci:commit(name)
|
uci:commit(name)
|
||||||
-- e = nixio.exec("/bin/sh", "-c" ,"/etc/init.d/partexp autopart")
|
fs.writefile("/etc/partexp/lucilogpos","0")
|
||||||
e = luci.sys.exec('/etc/init.d/partexp autopart')
|
http.prepare_content("application/json")
|
||||||
|
http.write('')
|
||||||
luci.http.prepare_content('application/json')
|
luci.sys.exec("/etc/init.d/partexp autopart > /etc/partexp/partexp.log 2>&1 &")
|
||||||
luci.http.write_json(e)
|
|
||||||
end
|
|
||||||
|
|
||||||
function outexec(cmd)
|
|
||||||
luci.http.prepare_content("text/plain")
|
|
||||||
local util = io.popen(cmd)
|
|
||||||
if util then
|
|
||||||
while true do
|
|
||||||
local ln = util:read("*l")
|
|
||||||
if not ln then break end
|
|
||||||
luci.http.write(ln)
|
|
||||||
luci.http.write("\n")
|
|
||||||
end
|
|
||||||
util:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function fork_exec(command)
|
|
||||||
local pid = nixio.fork()
|
|
||||||
if pid > 0 then
|
|
||||||
return
|
|
||||||
elseif pid == 0 then
|
|
||||||
-- change to root dir
|
|
||||||
nixio.chdir("/")
|
|
||||||
|
|
||||||
-- patch stdin, out, err to /dev/null
|
|
||||||
local null = nixio.open("/dev/null", "w+")
|
|
||||||
if null then
|
|
||||||
nixio.dup(null, nixio.stderr)
|
|
||||||
nixio.dup(null, nixio.stdout)
|
|
||||||
nixio.dup(null, nixio.stdin)
|
|
||||||
if null:fileno() > 2 then
|
|
||||||
null:close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- replace with target command
|
|
||||||
nixio.exec("/bin/sh", "-c", command)
|
|
||||||
end
|
|
||||||
end
|
end
|
@ -32,7 +32,7 @@ end
|
|||||||
|
|
||||||
local m,t,e
|
local m,t,e
|
||||||
m = Map("partexp", "<font color='green'>" .. translate("One click partition expansion mounting tool") .."</font>",
|
m = Map("partexp", "<font color='green'>" .. translate("One click partition expansion mounting tool") .."</font>",
|
||||||
translate( "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.<br/>For specific usage, see:") ..translate("<a href=\'https://github.com/sirpdboy/luci-app-partexp.git' target=\'_blank\'>GitHub @sirpdboy</a>") )
|
translate( "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.<br/>For specific usage, see:") ..translate("<a href=\'https://github.com/sirpdboy/luci-app-partexp.git' target=\'_blank\'>GitHub @sirpdboy:luci-app-partexp</a>") )
|
||||||
|
|
||||||
t=m:section(TypedSection,"global")
|
t=m:section(TypedSection,"global")
|
||||||
t.anonymous=true
|
t.anonymous=true
|
||||||
@ -40,8 +40,10 @@ t.anonymous=true
|
|||||||
e=t:option(ListValue,"target_function", translate("Select function"),translate("Select the function to be performed"))
|
e=t:option(ListValue,"target_function", translate("Select function"),translate("Select the function to be performed"))
|
||||||
e:value("/overlay", translate("Expand application space overlay (/overlay)"))
|
e:value("/overlay", translate("Expand application space overlay (/overlay)"))
|
||||||
-- e:value("/", translate("Use as root filesystem (/)"))
|
-- e:value("/", translate("Use as root filesystem (/)"))
|
||||||
|
-- e:value("/lnoverlay", translate("Soft chain partition expansion(/overlay)"))
|
||||||
e:value("/opt", translate("Used as Docker data disk (/opt)"))
|
e:value("/opt", translate("Used as Docker data disk (/opt)"))
|
||||||
e:value("/dev", translate("Normal mount and use by device name(/dev/x1)"))
|
e:value("/dev", translate("Normal mount and use by device name(/dev/x1)"))
|
||||||
|
e.default="/opt"
|
||||||
|
|
||||||
e=t:option(ListValue,"target_disk", translate("Destination hard disk"),translate("Select the hard disk device to operate"))
|
e=t:option(ListValue,"target_disk", translate("Destination hard disk"),translate("Select the hard disk device to operate"))
|
||||||
for i, d in ipairs(devices) do
|
for i, d in ipairs(devices) do
|
||||||
@ -52,32 +54,18 @@ for i, d in ipairs(devices) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
o=t:option(Flag,"keep_config",translate("Keep configuration"))
|
e=t:option(Flag,"keep_config",translate("Keep configuration"),translate("Tick means to retain the settings"))
|
||||||
o:depends("target_function", "/overlay")
|
e:depends("target_function", "/overlay")
|
||||||
o.default=0
|
e.default=0
|
||||||
|
|
||||||
o=t:option(Flag,'auto_format', translate('Format before use'))
|
e=t:option(Flag,'auto_format', translate('Format before use'),translate("Ticking indicates formatting"))
|
||||||
o:depends("target_function", "/opt")
|
e:depends("target_function", "/opt")
|
||||||
o:depends("target_function", "/dev")
|
e:depends("target_function", "/dev")
|
||||||
o.default=0
|
-- e:depends("target_function", "/lnoverlay")
|
||||||
|
e.default=0
|
||||||
|
|
||||||
o=t:option(DummyValue, '', '')
|
e=t:option(Button, "restart", translate("Perform operation"))
|
||||||
o.rawhtml = true
|
e.inputtitle=translate("Click to execute")
|
||||||
o.template ='partexp'
|
e.template ='partexp'
|
||||||
|
|
||||||
|
|
||||||
e=t:option(TextValue,"log")
|
|
||||||
e.rows=15
|
|
||||||
e.wrap="on"
|
|
||||||
e.readonly=true
|
|
||||||
e.cfgvalue=function(t,t)
|
|
||||||
return fs.readfile("/etc/partexp/partexp.log")or""
|
|
||||||
end
|
|
||||||
e.write=function(e,e,e)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- e =t:option(DummyValue, '', '')
|
|
||||||
-- e.rawhtml = true
|
|
||||||
-- e.template = 'partexplog'
|
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--[[
|
--[[
|
||||||
LuCI - Lua Configuration Interface
|
LuCI - Lua Configuration Interface
|
||||||
Copyright (C) 2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-partexp
|
Copyright (C) 2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/partexp
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
local fs = require "nixio.fs"
|
local fs = require "nixio.fs"
|
||||||
|
@ -1,106 +1,128 @@
|
|||||||
<%#
|
<%#
|
||||||
Copyright (C) 2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-partexp
|
Copyright (C) 2022-2024 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/partexp
|
||||||
-%>
|
-%>
|
||||||
<%
|
|
||||||
local fs = require "nixio.fs"
|
|
||||||
%>
|
|
||||||
|
|
||||||
<%+cbi/valueheader%>
|
<%+cbi/valueheader%>
|
||||||
|
<%local fs=require"nixio.fs"%>
|
||||||
<script src="/luci-static/vssr/jquery.min.js"></script>
|
<input type="button" class="btn cbi-button cbi-button-apply" id="apply_run_button" value="<%:Click to execute%>" onclick=" return apply_run(this) "/>
|
||||||
<label class="cbi-value-title"><%= translate("Select the function to be performed") %></label>
|
<div id="logview" style="display:none">
|
||||||
<div class="cbi-value-field">
|
<input type="checkbox" id="reversetag" value="reverse" onclick=" return reverselog()" style="vertical-align:middle;height: auto;"><%:reverse%></input>
|
||||||
<input class="cbi-button cbi-button-reload" id="go_partexprun" type="button" value="<%= translate("Perform operation") %>">
|
<textarea id="cbid.logview.1.conf" class="cbi-input-textarea" style="width: 100%;display:block;" data-update="change" rows="20" cols="80" readonly="readonly" > </textarea>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<fieldset class="cbi-section" style="display:none">
|
<script type="text/javascript">//<![CDATA[
|
||||||
<legend id="partexprun-legend">
|
|
||||||
<%:Collecting data...%>
|
|
||||||
</legend>
|
|
||||||
<span id="partexprun-output"></span>
|
|
||||||
</fieldset>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
const PARTEXP_RUN_URL = '<%=luci.dispatcher.build_url("admin", "system", "partexp","partexprun")%>';
|
||||||
const PARTEXP_RUN_URL = '<%=luci.dispatcher.build_url("admin", "system", "partexp","partexprun")%>';
|
const PARTEXP_CHECK = '<%=luci.dispatcher.build_url("admin", "system", "partexp","check")%>';
|
||||||
const PARTEXP_URL = '<%=luci.dispatcher.build_url("admin", "system", "partexp","global")%>';
|
|
||||||
|
|
||||||
var legend = document.getElementById('partexprun-legend');
|
var checkbtn = document.getElementById('apply_run_button');
|
||||||
var output = document.getElementById('partexprun-output');
|
|
||||||
|
|
||||||
|
var islogreverse = false;
|
||||||
$(document).ready(function(){
|
function reverselog(){
|
||||||
// alert("hello");
|
var lv = document.getElementById('cbid.logview.1.conf');
|
||||||
function go_run() {
|
lv.innerHTML=lv.innerHTML.split('\n').reverse().join('\n')
|
||||||
legend.style.display = 'none';
|
if (islogreverse){
|
||||||
output.innerHTML ='</p><%:After operation, restart the machine, please wait...%></p>';
|
islogreverse=false;
|
||||||
setTimeout(() => { window.location = PARTEXP_URL }, 6000);
|
}else{
|
||||||
}
|
islogreverse=true;
|
||||||
|
}
|
||||||
function go_err() {
|
return
|
||||||
legend.style.display = 'none';
|
}
|
||||||
output.innerHTML ='</p><%:Please delete the partition or share and try again%></p>';
|
function apply_run(btn){
|
||||||
setTimeout(() => { window.location = PARTEXP_URL }, 6000);
|
|
||||||
}
|
var sid='global'
|
||||||
$("#go_partexprun").click(function () {
|
var opt={
|
||||||
if (confirm('<%:Restart the device to take effect. Confirm whether to continue?%>'))
|
base:"cbid.partexp."+sid,
|
||||||
{
|
get:function(opt){
|
||||||
|
var id=this.base+'.'+opt;
|
||||||
prefix_array = $("#cbi-partexp .cbi-section-node").attr("id").split("-");
|
var obj=document.getElementsByName(id)[0] || document.getElementsByClassName(id)[0] || document.getElementById(id)
|
||||||
prefix_array[0] = "cbid";
|
if (obj){
|
||||||
prefix = prefix_array.join(".");
|
return obj;
|
||||||
output.innerHTML =
|
}else{
|
||||||
'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
|
return null;
|
||||||
'<%:Operation in progress, please wait...%>'
|
}
|
||||||
;
|
},
|
||||||
legend.parentNode.style.display = 'block';
|
getlist:function(opt){
|
||||||
legend.style.display = 'inline';
|
var id=this.base+'.'+opt;
|
||||||
var target_function = $("[name='" + prefix + ".target_function']").val();
|
var objs=document.getElementsByName(id) || document.getElementsByClassName(id);
|
||||||
if ($("[name='" + prefix + ".keep_config']").is(":checked")) {
|
var ret=[];
|
||||||
var keep_config = "1";
|
if (objs){
|
||||||
} else {
|
for (var i=0;i < objs.length;i++){
|
||||||
var keep_config = "0";
|
ret[i]=objs[i].value;
|
||||||
}
|
}
|
||||||
var target_disk = $("[name='" + prefix + ".target_disk']").val();
|
}else{
|
||||||
|
alert("<%:Fatal on get option,please help in debug%>:"+opt);
|
||||||
if ($("[name='" + prefix + ".auto_format']").is(":checked")) {
|
}
|
||||||
var auto_format = "1";
|
return ret;
|
||||||
} else {
|
},
|
||||||
var auto_format = "0";
|
query:function(param,src,tval="1",fval="0"){
|
||||||
}
|
var ret="&"+param+"=";
|
||||||
|
var obj=this.get(src);
|
||||||
|
if (obj){
|
||||||
var data = {
|
if (obj.type=="checkbox"){
|
||||||
keep_config: keep_config,
|
return ret+(obj.checked==true ? tval:fval);
|
||||||
target_disk: target_disk,
|
}else{
|
||||||
auto_format: auto_format,
|
return ret+encodeURIComponent(obj.value);
|
||||||
target_function: target_function
|
}
|
||||||
}
|
}
|
||||||
|
return ''
|
||||||
$.ajax({
|
}
|
||||||
type: "post",
|
|
||||||
url: PARTEXP_RUN_URL,
|
|
||||||
dataType: "json",
|
|
||||||
data: data,
|
|
||||||
success: function (d) {
|
|
||||||
if (d == 2) {
|
|
||||||
legend.style.display = 'none';
|
|
||||||
output.innerHTML ='</p><%:After operation, restart the machine, please wait...%></p>';
|
|
||||||
|
|
||||||
} else {
|
|
||||||
legend.style.display = 'none';
|
|
||||||
output.innerHTML ='</p> <%:Operation execution complete%></p>';
|
|
||||||
}
|
|
||||||
setTimeout(() => { window.location = PARTEXP_URL }, 5000);
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
btn.value='<%:Waiting,(executing)...%>';
|
||||||
|
btn.disabled=true;
|
||||||
|
|
||||||
|
|
||||||
|
var targetf=opt.get("target_function").value;
|
||||||
|
var targetd=opt.get("target_disk").value;
|
||||||
|
if (opt.get("auto_format"))
|
||||||
|
|
||||||
|
var aformat = opt.get("auto_format").checked ? 1 : 0;
|
||||||
|
else
|
||||||
|
var aformat = 0;
|
||||||
|
if (opt.get("keep_config"))
|
||||||
|
var kconfig = opt.get("keep_config").checked ? 1 : 0;
|
||||||
|
else
|
||||||
|
var kconfig = 0;
|
||||||
|
console.log(kconfig);
|
||||||
|
|
||||||
|
XHR.get('<%=url([[admin]], [[system]], [[partexp]], [[partexprun]])%>',{
|
||||||
|
targetf: targetf,
|
||||||
|
kconfig: kconfig,
|
||||||
|
targetd: targetd,
|
||||||
|
aformat: aformat
|
||||||
|
},function(x){});
|
||||||
|
poll_check();
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
function poll_check(){
|
||||||
|
var tag = document.getElementById('logview');
|
||||||
|
tag.style.display="block"
|
||||||
|
XHR.poll(3, '<%=url([[admin]], [[system]], [[partexp]], [[check]])%>', null,
|
||||||
|
function(x, data) {
|
||||||
|
var lv = document.getElementById('cbid.logview.1.conf');
|
||||||
|
if (x.responseText && lv) {
|
||||||
|
if (x.responseText=="\u0000"){
|
||||||
|
for(j = 0,len=this.XHR._q.length; j < len; j++) {
|
||||||
|
if (this.XHR._q[j].url == '<%=url([[admin]], [[system]], [[partexp]], [[check]])%>'){
|
||||||
|
this.XHR._q.splice(j,1);
|
||||||
|
checkbtn.disabled = false;
|
||||||
|
checkbtn.value = '<%:Click to execute%>';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (islogreverse){
|
||||||
|
lv.innerHTML = x.responseText.split('\n').reverse().join('\n')+lv.innerHTML;
|
||||||
|
}else{
|
||||||
|
lv.innerHTML += x.responseText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);}
|
||||||
|
|
||||||
|
|
||||||
|
//]]>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<%+cbi/valuefooter%>
|
<%+cbi/valuefooter%>
|
||||||
|
16
luci-app-partexp/luasrc/view/partexplog.htm
Normal file
16
luci-app-partexp/luasrc/view/partexplog.htm
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<%+cbi/valueheader%>
|
||||||
|
<textarea id="logview.list" class="cbi-input-textarea" style="width: 100%" rows="15" readonly="readonly"></textarea>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
const LOG_URL = '<%=luci.dispatcher.build_url("admin", "system", "partexp","realtime_log")%>';
|
||||||
|
|
||||||
|
XHR.poll(1, LOG_URL, null, (x, d) => {
|
||||||
|
let logview = document.getElementById("logview.list");
|
||||||
|
if (!d.running) {
|
||||||
|
XHR.halt();
|
||||||
|
}
|
||||||
|
logview.value = d.log;
|
||||||
|
logview.scrollTop = logview.scrollHeight;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<%+cbi/valuefooter%>
|
@ -1,6 +1,6 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Copyright (C) 2022 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-partexp"
|
"Copyright (C) 2022-2024 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-partexp"
|
||||||
"This is free software, licensed under the GNU General Public License v3."
|
"This is free software, licensed under the GNU General Public License v3."
|
||||||
|
|
||||||
msgid "Partition Expansion"
|
msgid "Partition Expansion"
|
||||||
@ -12,8 +12,8 @@ msgstr "一键分区扩容挂载工具"
|
|||||||
msgid "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.<br/>For specific usage, see:"
|
msgid "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.<br/>For specific usage, see:"
|
||||||
msgstr "自动对目标设备分区格式化挂载,如果有多分区建议手动删除所有分区再使用本工具.<br/>使用说明见:"
|
msgstr "自动对目标设备分区格式化挂载,如果有多分区建议手动删除所有分区再使用本工具.<br/>使用说明见:"
|
||||||
|
|
||||||
msgid "Select the function to be performed"
|
msgid "Waiting,(executing)..."
|
||||||
msgstr "选择需要执行的功能"
|
msgstr "稍等,努力执行中"
|
||||||
|
|
||||||
msgid "Expand application space overlay (/overlay)"
|
msgid "Expand application space overlay (/overlay)"
|
||||||
msgstr "用于overlay软件空间 (/overlay)"
|
msgstr "用于overlay软件空间 (/overlay)"
|
||||||
@ -27,6 +27,9 @@ msgstr "用作Docker数据盘 (/opt)"
|
|||||||
msgid "Normal mount and use by device name(/dev/x1)"
|
msgid "Normal mount and use by device name(/dev/x1)"
|
||||||
msgstr "按设备名普通挂载使用(/dev/x1)"
|
msgstr "按设备名普通挂载使用(/dev/x1)"
|
||||||
|
|
||||||
|
msgid "Soft chain partition expansion(/overlay)"
|
||||||
|
msgstr "分区软链扩容(/overlay)"
|
||||||
|
|
||||||
msgid "Destination hard disk"
|
msgid "Destination hard disk"
|
||||||
msgstr "目标硬盘"
|
msgstr "目标硬盘"
|
||||||
|
|
||||||
@ -42,6 +45,9 @@ msgstr "选择需要操作的硬盘设备"
|
|||||||
msgid "Select function"
|
msgid "Select function"
|
||||||
msgstr "选择功能"
|
msgstr "选择功能"
|
||||||
|
|
||||||
|
msgid "Click to execute"
|
||||||
|
msgstr "点击执行"
|
||||||
|
|
||||||
msgid "Perform operation"
|
msgid "Perform operation"
|
||||||
msgstr "执行操作"
|
msgstr "执行操作"
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
zh-cn
|
|
76
luci-app-partexp/po/zh_Hans/partexp.po
Normal file
76
luci-app-partexp/po/zh_Hans/partexp.po
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Copyright (C) 2022-2024 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-partexp"
|
||||||
|
"This is free software, licensed under the GNU General Public License v3."
|
||||||
|
|
||||||
|
msgid "Partition Expansion"
|
||||||
|
msgstr "分区扩容"
|
||||||
|
|
||||||
|
msgid "One click partition expansion mounting tool"
|
||||||
|
msgstr "一键分区扩容挂载工具"
|
||||||
|
|
||||||
|
msgid "Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.<br/>For specific usage, see:"
|
||||||
|
msgstr "自动对目标设备分区格式化挂载,如果有多分区建议手动删除所有分区再使用本工具.<br/>使用说明见:"
|
||||||
|
|
||||||
|
msgid "Waiting,(executing)..."
|
||||||
|
msgstr "稍等,努力执行中"
|
||||||
|
|
||||||
|
msgid "Expand application space overlay (/overlay)"
|
||||||
|
msgstr "用于overlay软件空间 (/overlay)"
|
||||||
|
|
||||||
|
msgid "Use as root filesystem (/)"
|
||||||
|
msgstr "用作根文件系统(/)"
|
||||||
|
|
||||||
|
msgid "Used as Docker data disk (/opt)"
|
||||||
|
msgstr "用作Docker数据盘 (/opt)"
|
||||||
|
|
||||||
|
msgid "Normal mount and use by device name(/dev/x1)"
|
||||||
|
msgstr "按设备名普通挂载使用(/dev/x1)"
|
||||||
|
|
||||||
|
msgid "Soft chain partition expansion(/overlay)"
|
||||||
|
msgstr "分区软链扩容(/overlay)"
|
||||||
|
|
||||||
|
msgid "Destination hard disk"
|
||||||
|
msgstr "目标硬盘"
|
||||||
|
|
||||||
|
msgid "Keep configuration"
|
||||||
|
msgstr "保留配置"
|
||||||
|
|
||||||
|
msgid "Format before use"
|
||||||
|
msgstr "使用前格式化"
|
||||||
|
|
||||||
|
msgid "Select the hard disk device to operate"
|
||||||
|
msgstr "选择需要操作的硬盘设备"
|
||||||
|
|
||||||
|
msgid "Select function"
|
||||||
|
msgstr "选择功能"
|
||||||
|
|
||||||
|
msgid "Click to execute"
|
||||||
|
msgstr "点击执行"
|
||||||
|
|
||||||
|
msgid "Perform operation"
|
||||||
|
msgstr "执行操作"
|
||||||
|
|
||||||
|
msgid "To make the operation effective, the device will restart. Are you sure to execute?"
|
||||||
|
msgstr "警告:操作一旦确定无法取消,设备将会重启,是否确定执行?"
|
||||||
|
|
||||||
|
msgid "Operation in progress, please wait..."
|
||||||
|
msgstr "操作执行中,请稍候..."
|
||||||
|
|
||||||
|
msgid "After operation, restart the machine, please wait..."
|
||||||
|
msgstr "操作完毕,机器重启,请稍候..."
|
||||||
|
|
||||||
|
msgid "Please delete the partition or share and try again"
|
||||||
|
msgstr "错误,请检查是否有足够空间或是共享使用中。"
|
||||||
|
|
||||||
|
msgid "Restart the device to take effect. Confirm whether to continue?"
|
||||||
|
msgstr "重启设备操作才生效,确定是否继续执行?"
|
||||||
|
|
||||||
|
msgid "Operation execution complete"
|
||||||
|
msgstr "操作执行完毕"
|
||||||
|
|
||||||
|
msgid "Ticking indicates formatting"
|
||||||
|
msgstr "打勾选择表示格式化"
|
||||||
|
|
||||||
|
msgid "Tick means to retain the settings"
|
||||||
|
msgstr "打勾选择表示保留设置"
|
@ -1,5 +1,5 @@
|
|||||||
config global
|
config global 'global'
|
||||||
option target_function '/overlay'
|
option target_function '/overlay'
|
||||||
option target_disk ''
|
option target_disk ''
|
||||||
option keep_config '1'
|
option keep_config '0'
|
||||||
option auto_format '1'
|
option auto_format '0'
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh /etc/rc.common
|
#!/bin/sh /etc/rc.common
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright (C) 2021-2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-partexp
|
# Copyright (C) 2021-2022 sirpdboy <herboy2008@gmail.com> https://github.com/sirpdboy/partexp
|
||||||
|
|
||||||
# This is free software, licensed under the Apache License, Version 2.0 .
|
# This is free software, licensed under the Apache License, Version 2.0 .
|
||||||
#
|
#
|
||||||
@ -29,18 +29,17 @@ limit_log() {
|
|||||||
|
|
||||||
init_env() {
|
init_env() {
|
||||||
[ -d "$LOGD" ] || mkdir -p $LOGD
|
[ -d "$LOGD" ] || mkdir -p $LOGD
|
||||||
[ ! -f "$LOG" ] && echo "" > $LOG
|
[ ! -f "$LOG" ] && echo " " > $LOG
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
gen_log()(
|
gen_log()(
|
||||||
[ -s $LOG ] && echo " ---------------------------------------------------------------------- " >> $LOG
|
log "---------------自动分区扩展挂载开始执行------------------ "
|
||||||
log "自动分区扩展挂载开始执行..."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
log(){
|
log(){
|
||||||
echo " $(date +'%Y-%m-%d %H:%M:%S') $*" >> $LOG
|
echo -e " $(date +'%Y-%m-%d %H:%M:%S') $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -50,6 +49,7 @@ get_config() {
|
|||||||
config_get_bool keep_config $1 keep_config 1
|
config_get_bool keep_config $1 keep_config 1
|
||||||
config_get_bool auto_format $1 auto_format 1
|
config_get_bool auto_format $1 auto_format 1
|
||||||
}
|
}
|
||||||
|
|
||||||
nfdisk(){
|
nfdisk(){
|
||||||
#Start partition
|
#Start partition
|
||||||
fdisk /dev/$a << EOF >/dev/null 2> /dev/null
|
fdisk /dev/$a << EOF >/dev/null 2> /dev/null
|
||||||
@ -63,118 +63,152 @@ EOF
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usamba(){
|
||||||
|
s=$1
|
||||||
|
s2=$2
|
||||||
|
[ -e "/etc/config/$s" ] && {
|
||||||
|
msum=$(grep -c "config sambashare" /etc/config/$s)
|
||||||
|
for i in $(seq 0 $((msum)))
|
||||||
|
do
|
||||||
|
pdev=`uci -q get $s.@sambashare[$i].path `
|
||||||
|
[ "$pdev" = "$s2" ] && {
|
||||||
|
uci delete $s.@sambashare[$i]
|
||||||
|
uci commit $s
|
||||||
|
log "分区/dev/$b被挂载$MOUNT共享使用,删除$s共享成功!"
|
||||||
|
sleep 5
|
||||||
|
/etc/init.d/$s restart
|
||||||
|
}
|
||||||
|
done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fdiskB(){
|
fdiskB(){
|
||||||
a=$1
|
a=$1
|
||||||
b=$2
|
b=$1$2
|
||||||
log "检测$a是否分区..."
|
log "检测$a是否分区..."
|
||||||
isP=`fdisk -l /dev/$a |grep -v "bytes"|grep "/dev/$a$b" `
|
isP=`fdisk -l /dev/$a |grep -v "bytes"|grep "/dev/$b" `
|
||||||
sleep 2
|
sleep 2
|
||||||
isfdisk=0
|
isfdisk=0
|
||||||
if [ ! "$isP" ];then
|
if [ ! "$isP" ];then
|
||||||
nfdisk
|
nfdisk
|
||||||
sleep 2
|
sleep 2
|
||||||
isfdisk=1
|
isfdisk=1
|
||||||
|
|
||||||
else
|
else
|
||||||
isfdisk=2
|
isfdisk=2
|
||||||
fi
|
fi
|
||||||
isP=`fdisk -l /dev/$a |grep -v "bytes" | grep "/dev/$a$b"`
|
|
||||||
|
isP=`fdisk -l /dev/$a |grep -v "bytes" | grep "/dev/$b"`
|
||||||
if [ "$isP" -a "$isfdisk" = 1 ] ;then
|
if [ "$isP" -a "$isfdisk" = 1 ] ;then
|
||||||
log "分区$a$b建立成功!"
|
log "分区$b建立成功!"
|
||||||
elif [ "$isP" -a "$isfdisk" = 2 ] ;then
|
elif [ "$isP" -a "$isfdisk" = 2 ] ;then
|
||||||
log "检测目标分区$a$b已存在."
|
log "检测目标分区$b已存在."
|
||||||
else
|
else
|
||||||
log "分区$a$b建立失败,没有足够的空间操作失败!"
|
log "分区$b建立失败,没有足够的空间操作失败!"
|
||||||
expquit 1
|
expquit 1
|
||||||
fi
|
fi
|
||||||
isD=`df -T | grep /dev/$a$b `
|
sleep 1
|
||||||
|
[ -e "/etc/config/dockerd" ] && /etc/init.d/dockerd stop >/dev/null 2> /dev/null
|
||||||
|
block detect > /etc/config/fstab
|
||||||
|
isD=` block info "/dev/$b" `
|
||||||
if [ "$isD" ];then
|
if [ "$isD" ];then
|
||||||
eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*")
|
MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*")
|
||||||
log "检测$a$b是不是被共享..."
|
|
||||||
sleep 1
|
|
||||||
if [ "$MOUNT" ] ; then
|
|
||||||
msum=$(grep -c "config sambashare" /etc/config/samba4)
|
|
||||||
for i in $(seq 0 $((msum-1)))
|
|
||||||
do
|
|
||||||
dev=`uci -q get samba4.@sambashare[$i].device `
|
|
||||||
[ $? -ne 0 ] && break
|
|
||||||
[ "$dev" = "$a$b" ] && {
|
|
||||||
uci delete samba4.@sambashare[$i]
|
|
||||||
uci commit
|
|
||||||
/etc/init.d/samba4 restart &
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
}
|
log "检测/dev/$b是不是被共享..."
|
||||||
done
|
if [ "x$MOUNT" != 'x' ] ; then
|
||||||
block umount /dev/$a$b
|
usamba samba4 $MOUNT
|
||||||
|
usamba samba $MOUNT
|
||||||
sleep 5
|
sleep 5
|
||||||
eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*")
|
umount $MOUNT || block umount /dev/$b
|
||||||
if [ "$MOUNT" ] ;then
|
sleep 5
|
||||||
log "分区$a$b被挂载$MOUNT共享使用,删除共享失败,请手动删除共享再重新操作!"
|
MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*")
|
||||||
|
if [ "x$MOUNT" != 'x' ] ;then
|
||||||
|
log "分区/dev/$b挂载$MOUNT使用中,自动删除失败!请手动删除共享或者取消其它插件的占用权限再重试!"
|
||||||
expquit 1
|
expquit 1
|
||||||
else
|
|
||||||
log "分区$a$b被挂载$MOUNT共享使用,自动删除共享成功!"
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
log "检测目标硬盘$a$b未被共享..."
|
log "检测目标设备$b未被共享..."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
isD=`df -T | grep /dev/$a$b | awk '{print $2}'`
|
#isD=`block info /dev/$b | awk -F 'TYPE=' '{print $2}'| sed 's,\",,g' `
|
||||||
|
TYPE='';eval $(block info "/dev/$b" | grep -o -e "TYPE=\S*")
|
||||||
if [ "$target_function" = "/" -o "$target_function" = "/overlay" ] ; then
|
if [ "$target_function" = "/" -o "$target_function" = "/overlay" ] ; then
|
||||||
mkfs.ext4 -L extroot /dev/$a$b >/dev/null 2> /dev/null
|
mkfs.ext4 -L extroot /dev/$b >/dev/null 2> /dev/null
|
||||||
log "硬盘/dev/$a$b格式化成功!"
|
log "设备/dev/$b格式化成功!"
|
||||||
elif [ "$auto_format" = "1" -o "$isfdisk" = "1" - ! "$isD" ] ; then
|
elif [ "$auto_format" = "1" -o "$isfdisk" = "1" ] ; then
|
||||||
mkfs.ext4 -F /dev/$a$b >/dev/null 2> /dev/null
|
mkfs.ext4 -F /dev/$b >/dev/null 2> /dev/null
|
||||||
log "硬盘/dev/$a$b格式化成功!"
|
log "设备/dev/$b格式化成功!"
|
||||||
|
elif [ "$TYPE" ];then
|
||||||
|
log "设备/dev/$b无需格式化!"
|
||||||
else
|
else
|
||||||
log "硬盘/dev/$a$b无需格式化!"
|
log "设备/dev/$b未格式化,无法正常使用!"
|
||||||
|
expquit 1
|
||||||
fi
|
fi
|
||||||
eval $(block info /dev/$a$b | grep -o -e "UUID=\S*")
|
|
||||||
if [ "$UUID" = "" ] ; then
|
[ -d "/mnt/$b" ] || mkdir -p /mnt/$b
|
||||||
log "获取/dev/$a$b分区信息失败!"
|
MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*")
|
||||||
expquit 1
|
if [ "x$MOUNT" != 'x' ] ;then
|
||||||
else
|
umount /mnt/$b || block umount /dev/$b
|
||||||
log "成功获取/dev/$a$b分区信息!"
|
MOUNT='';eval $(block info "/dev/$b" | grep -o -e "MOUNT=\S*")
|
||||||
fi
|
|
||||||
[ -d "/mnt/$a$b" ] || mkdir -p /mnt/$a$b
|
|
||||||
isM=`block info /dev/$a$b`
|
|
||||||
isD=`df -T | grep /dev/$a$b | awk '{print $2}'`
|
|
||||||
if [ "$isM" -a "$isD" ] ;then
|
|
||||||
umount /mnt/$a$b
|
|
||||||
eval $(block info "/dev/$a$b" | grep -o -e "MOUNT=\S*")
|
|
||||||
if [ "$MOUNT" ] ; then
|
if [ "$MOUNT" ] ; then
|
||||||
log "检测设备/dev/$a$b挂载$MOUNT,请取消读写权限再重试!"
|
log "检测设备/dev/$b被占用,请检查设备硬件或中止其他插件等占用权限再重试!"
|
||||||
expquit 1
|
expquit 1
|
||||||
else
|
|
||||||
[ "$isD" == "ntfs" ] && mount -t ntfs-3g /dev/$a$b /mnt/$a$b || mount -o rw,noatime,discard /dev/$a$b /mnt/$a$b
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
log "检测设备/dev/$a$b分区是$isD格式!"
|
TYPE='';eval $(block info "/dev/$b" | grep -o -e "TYPE=\S*")
|
||||||
|
log "检测设备/dev/$b分区是$TYPE格式!"
|
||||||
|
if [ "$TYPE" = "ntfs" ];then
|
||||||
|
if [ `which ntfs-3g ` ] ;then
|
||||||
|
mount -t ntfs-3g /dev/$b /mnt/$b >/dev/null 2> /dev/null
|
||||||
|
elif [ `which ntfs3 ` ] ;then
|
||||||
|
mount -t ntfs3 /dev/$b /mnt/$b >/dev/null 2> /dev/null
|
||||||
|
else
|
||||||
|
log "不支持NTFS分区挂载,请安装ntfs-3g或者ntfs3支持服务"
|
||||||
|
expquit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
mount /dev/$b /mnt/$b >/dev/null 2> /dev/null
|
||||||
|
fi
|
||||||
|
UUID='';eval $(block info /dev/$b | grep -o -e "UUID=\S*")
|
||||||
|
if [ ! "$UUID" ] ; then
|
||||||
|
log "获取/dev/$b设备UUID信息失败!"
|
||||||
|
expquit 1
|
||||||
|
else
|
||||||
|
log "获取/dev/$b设备UUID信息:$UUID成功"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$target_function" = "/" ] ; then
|
if [ "$target_function" = "/" ] ; then
|
||||||
mkdir -p /tmp/introot
|
mkdir -p /tmp/introot
|
||||||
mount --bind / /tmp/introot
|
mount --bind / /tmp/introot
|
||||||
tar -C /tmp/introot -cvf - . | tar -C /mnt/$a$b -xf -
|
tar -C /tmp/introot -cvf - . | tar -C /mnt/$b -xf -
|
||||||
umount /tmp/introot
|
umount /tmp/introot || block umount /tmp/introot
|
||||||
umount /mnt/$a$b
|
umount /mnt/$b || block umount /dev/$b
|
||||||
block detect > /etc/config/fstab
|
block detect > /etc/config/fstab
|
||||||
log "保留数据根目录扩展/dev/$a$b成功!"
|
OVERLAY=`uci -q get fstab.@mount[0].target `
|
||||||
uci set fstab.@global[0].delay_root="15"
|
if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then
|
||||||
uci -q set fstab.@mount[0].uuid="${UUID}"
|
uci -q set fstab.@mount[0].uuid="${UUID}"
|
||||||
uci -q set fstab.@mount[0].target='/'
|
uci -q set fstab.@mount[0].target='/'
|
||||||
uci -q set fstab.@mount[0].enabled='1'
|
uci -q set fstab.@mount[0].enabled='1'
|
||||||
uci commit fstab
|
fi
|
||||||
|
log "保留数据根目录扩展/dev/$b成功!"
|
||||||
|
|
||||||
|
seelp 5
|
||||||
|
log "设备重启才能生效"
|
||||||
expquit 2
|
expquit 2
|
||||||
|
|
||||||
elif [ "$target_function" = "/overlay" ] ; then
|
elif [ "$target_function" = "/overlay" ] ; then
|
||||||
if [ "$keep_config" = "1" ] ; then
|
if [ "$keep_config" = "1" ] ; then
|
||||||
|
|
||||||
# cp -a -f /overlay/* /mnt/$a$b/ || cp -a -f /rom/overlay/* /mnt/$a$b/
|
# cp -a -f /overlay/* /mnt/$b/ || cp -a -f /rom/overlay/* /mnt/$b/
|
||||||
tar -C /overlay -cvf - . | tar -C /mnt/$a$b/ -xf - || tar -C /rom/overlay -cvf - . | tar -C /mnt/$a$b/ -xf -
|
tar -C /overlay -cvf - . | tar -C /mnt/$b/ -xf - || tar -C /rom/overlay -cvf - . | tar -C /mnt/$b/ -xf -
|
||||||
umount /mnt/$a$b
|
umount /mnt/$b || block umount /dev/$b
|
||||||
block detect > /etc/config/fstab
|
block detect > /etc/config/fstab
|
||||||
|
OVERLAY=`uci -q get fstab.@mount[0].target `
|
||||||
|
if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then
|
||||||
|
uci -q set fstab.@mount[0].uuid="${UUID}"
|
||||||
|
uci -q set fstab.@mount[0].target='/overlay'
|
||||||
|
uci -q set fstab.@mount[0].enabled='0'
|
||||||
|
fi
|
||||||
msum=$(grep -c "'mount'" /etc/config/fstab)
|
msum=$(grep -c "'mount'" /etc/config/fstab)
|
||||||
for i in $(seq 0 $((msum-1)))
|
for i in $(seq 0 $((msum-1)))
|
||||||
do
|
do
|
||||||
@ -187,16 +221,21 @@ fdiskB(){
|
|||||||
done
|
done
|
||||||
uci set fstab.@global[0].delay_root="15"
|
uci set fstab.@global[0].delay_root="15"
|
||||||
uci commit fstab
|
uci commit fstab
|
||||||
log "保留数据overlay扩展/dev/$a$b成功!"
|
log "保留数据overlay扩展/dev/$b成功!"
|
||||||
log "设备重启才能生效,重启中..."
|
seelp 5
|
||||||
|
log "设备重启才能生效"
|
||||||
expquit 2
|
expquit 2
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
umount /mnt/$a$b
|
umount /mnt/$b || block umount /dev/$b
|
||||||
block detect > /etc/config/fstab
|
block detect > /etc/config/fstab
|
||||||
|
OVERLAY=`uci -q get fstab.@mount[0].target `
|
||||||
|
if [ "$OVERLAY" == "/overlay" -o "$OVERLAY" == "/dev/loop0" ] ;then
|
||||||
|
uci -q set fstab.@mount[0].uuid="${UUID}"
|
||||||
|
uci -q set fstab.@mount[0].target='/overlay'
|
||||||
|
uci -q set fstab.@mount[0].enabled='0'
|
||||||
|
fi
|
||||||
msum=$(grep -c "'mount'" /etc/config/fstab)
|
msum=$(grep -c "'mount'" /etc/config/fstab)
|
||||||
for i in $(seq 0 $((msum-1)))
|
for i in $(seq 0 $((msum-1)))
|
||||||
do
|
do
|
||||||
@ -209,12 +248,36 @@ fdiskB(){
|
|||||||
done
|
done
|
||||||
uci set fstab.@global[0].delay_root="15"
|
uci set fstab.@global[0].delay_root="15"
|
||||||
uci commit fstab
|
uci commit fstab
|
||||||
log "不保留数据overlay扩展/dev/$a$b成功!"
|
log "不保留数据overlay扩展/dev/$b成功!"
|
||||||
log "设备重启才能生效,重启中..."
|
|
||||||
|
seelp 5
|
||||||
|
log "设备重启才能生效"
|
||||||
expquit 2
|
expquit 2
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
elif [ "$target_function" = "/lnoverlay" ] ; then
|
||||||
|
umount /mnt/$b || block umount /dev/$b
|
||||||
|
|
||||||
|
block detect > /etc/config/fstab
|
||||||
|
mkdir -p $target_function
|
||||||
|
msum=$(grep -c "'mount'" /etc/config/fstab)
|
||||||
|
for i in $(seq 0 $((msum-1)))
|
||||||
|
do
|
||||||
|
zuuid=`uci -q get fstab.@mount[$i].uuid `
|
||||||
|
[ $? -ne 0 ] && break
|
||||||
|
if [ "$zuuid" = "$UUID" ] ; then
|
||||||
|
uci -q set fstab.@mount[$i].target="/mnt/$b"
|
||||||
|
uci -q set fstab.@mount[$i].enabled='1'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
uci commit fstab
|
||||||
|
ln -sf /mnt/$b /overlay
|
||||||
|
log "设备/dev/$b挂载/mnt/$b软链到/overlay扩容成功!"
|
||||||
|
log "设备重启才能生效"
|
||||||
|
expquit 2
|
||||||
else
|
else
|
||||||
|
umount /mnt/$b || block umount /dev/$b
|
||||||
|
|
||||||
block detect > /etc/config/fstab
|
block detect > /etc/config/fstab
|
||||||
mkdir -p $target_function
|
mkdir -p $target_function
|
||||||
msum=$(grep -c "'mount'" /etc/config/fstab)
|
msum=$(grep -c "'mount'" /etc/config/fstab)
|
||||||
@ -224,14 +287,14 @@ fdiskB(){
|
|||||||
[ $? -ne 0 ] && break
|
[ $? -ne 0 ] && break
|
||||||
if [ "$zuuid" = "$UUID" ] ; then
|
if [ "$zuuid" = "$UUID" ] ; then
|
||||||
|
|
||||||
[ "$target_function" = "/opt" ] && uci -q set fstab.@mount[$i].target="$target_function" || uci -q set fstab.@mount[$i].target="/mnt/$a$b"
|
[ "$target_function" = "/opt" ] && uci -q set fstab.@mount[$i].target="$target_function" || uci -q set fstab.@mount[$i].target="/mnt/$b"
|
||||||
|
|
||||||
uci -q set fstab.@mount[$i].enabled='1'
|
uci -q set fstab.@mount[$i].enabled='1'
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
uci commit fstab
|
uci commit fstab
|
||||||
[ "$target_function" = "/opt" ] && log "挂载/dev/$a$b到$target_function成功!" || log "挂载/dev/$a$b到/mnt/$a$b成功!"
|
[ "$target_function" = "/opt" ] && log "挂载/dev/$b到$target_function成功!" || log "挂载/dev/$b到/mnt/$b成功!"
|
||||||
log "设备重启才能生效,重启中..."
|
log "设备重启才能生效"
|
||||||
expquit 2
|
expquit 2
|
||||||
|
|
||||||
fi
|
fi
|
||||||
@ -242,24 +305,29 @@ autopart() {
|
|||||||
config_load partexp
|
config_load partexp
|
||||||
config_foreach get_config global
|
config_foreach get_config global
|
||||||
init_env
|
init_env
|
||||||
limit_log $LOG 500
|
|
||||||
# touch $LOCK
|
# touch $LOCK
|
||||||
cat $LOG 2>/dev/null | sed -n '$p' | grep -q '自动分区扩展挂载开始执行...' || gen_log
|
gen_log
|
||||||
|
log "此次执行操作功能:$target_function ,目标盘:/dev/$target_disk"
|
||||||
isB=`df -P|grep '/boot' | head -n1 | awk -F ' ' '{print $1}'`
|
|
||||||
isb=`fdisk -l | grep /dev/$target_disk | grep -v "bytes" | wc -l`
|
|
||||||
if [ "$isb" = 0 -o "$isb" = "" -o "$isb" = 1 ] ;then
|
|
||||||
isb=1
|
|
||||||
elif [ "$isb" = 3 -o "$isb" = 4 ] ;then
|
|
||||||
isb=3
|
|
||||||
fi
|
|
||||||
isP=`fdisk -l /dev/$target_disk |grep "Disk /dev/$target_disk"`
|
isP=`fdisk -l /dev/$target_disk |grep "Disk /dev/$target_disk"`
|
||||||
if [ "$isP" = "" ];then
|
if [ "$isP" = "" ];then
|
||||||
log "没有检测到/dev/$target_disk目标硬盘!操作失败!"
|
log "没有检测到/dev/$target_disk目标设备!操作失败!"
|
||||||
expquit 1
|
expquit 1
|
||||||
else
|
else
|
||||||
log "检测到操作目标硬盘:/dev/$target_disk$isb!"
|
isB="$(sed -n -e "\|\s/boot\s.*$|{s///p;q}" /etc/mtab)"
|
||||||
|
isb=`fdisk -l | grep /dev/$target_disk | grep -v "bytes" | wc -l`
|
||||||
|
if [ "$isb" = 0 -o "$isb" = 1 ] ;then
|
||||||
|
isb=1
|
||||||
|
|
||||||
|
log "检测到设备/dev/$target_disk分区数为$isb个!"
|
||||||
|
elif [ "$isb" = 3 -o "$isb" = 4 ] ;then
|
||||||
|
isb=3
|
||||||
|
|
||||||
|
log "检测到设备/dev/$target_disk分区数为$isb个!"
|
||||||
|
else
|
||||||
|
log "检测到设备/dev/$target_disk分区数$isb个,请备份数据后删除分区重新操作!"
|
||||||
|
expquit 1
|
||||||
|
fi
|
||||||
|
log "检测到操作目标设备:/dev/$target_disk$isb!"
|
||||||
case "$target_disk" in
|
case "$target_disk" in
|
||||||
sd*)
|
sd*)
|
||||||
[ "$isB" = "/dev/${target_disk}1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk 3 || fdiskB $target_disk $isb
|
[ "$isB" = "/dev/${target_disk}1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk 3 || fdiskB $target_disk $isb
|
||||||
@ -271,17 +339,16 @@ autopart() {
|
|||||||
[ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb
|
[ "$isB" = "/dev/${target_disk}p1" -a "$target_function" = "/overlay" ] && fdiskB $target_disk p3 || fdiskB $target_disk p$isb
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
log "未能识别/dev/$target_disk目标硬盘!请联系作者sirpdboy!"
|
log "目标设备/dev/$target_disk暂不支持!请联系作者sirpdboy!"
|
||||||
expquit 1
|
expquit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
fi
|
fi
|
||||||
# rm -f $LOCK
|
rm -f $LOCK
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
init_env
|
|
||||||
[ x$x = x1 ] && exit || autopart
|
[ x$x = x1 ] && exit || autopart
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -292,7 +359,8 @@ x=1
|
|||||||
|
|
||||||
expquit() {
|
expquit() {
|
||||||
rm -f $LOCK
|
rm -f $LOCK
|
||||||
echo $1
|
[ -e "/etc/config/dockerd" ] && /etc/init.d/dockerd restart >/dev/null 2> /dev/null
|
||||||
[ $1 == 2 ] &&reboot
|
sleep 5
|
||||||
|
[ $1 == 2 ] && log "重启中...\n" &&reboot
|
||||||
exit $1
|
exit $1
|
||||||
}
|
}
|
||||||
|
1
luci-app-partexp/root/etc/partexp/lucilogpos
Normal file
1
luci-app-partexp/root/etc/partexp/lucilogpos
Normal file
@ -0,0 +1 @@
|
|||||||
|
1043
|
1
luci-app-partexp/root/etc/partexp/partexp.log
Normal file
1
luci-app-partexp/root/etc/partexp/partexp.log
Normal file
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -1,5 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
chmod +x /etc/init.d/partexp >/dev/null 2>&1
|
chmod +x /etc/init.d/partexp >/dev/null 2>&1
|
||||||
|
[ `uci -q get partexp.global` ] || uci set partexp.global=global
|
||||||
|
LOGD=/etc/partexp
|
||||||
|
LOG=$LOGD/partexp.log
|
||||||
|
LOGPOS=$LOGD/lucilogpos
|
||||||
|
[ -d "$LOGD" ] || mkdir -p $LOGD
|
||||||
|
[ ! -f "$LOG" ] && echo "start" > $LOG
|
||||||
|
[ ! -f "$LOGPOS" ] && echo 'start' > $LOGPOS
|
||||||
rm -rf /tmp/luci-modulecache /tmp/luci-indexcache*
|
rm -rf /tmp/luci-modulecache /tmp/luci-indexcache*
|
||||||
exit 0
|
exit 0
|
||||||
|
Loading…
Reference in New Issue
Block a user