Skip to content

Commit

Permalink
add simple raid support
Browse files Browse the repository at this point in the history
  • Loading branch information
lisaac committed Jan 4, 2020
1 parent c78d566 commit 9606f58
Show file tree
Hide file tree
Showing 6 changed files with 593 additions and 252 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ A Simple Disk Manager for LuCI, support disk partition and format, support raid/
- e2fsprogs
- btrfs-progs (Optional)
- mdadm (Optional)
- kmod-md-raid456 (Optional)
- kmod-md-linear (Optional)

### Compile
``` bash
Expand Down
160 changes: 109 additions & 51 deletions luasrc/model/cbi/diskman/disks.lua
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,20 @@ m.template = "diskman/cbi/xsimpleform"
-- disable submit and reset button
m.submit = false
m.reset = false
-- rescan disks
rescan = m:section(SimpleSection)
rescan_button = rescan:option(Button, "_rescan")
rescan_button.inputtitle= translate("Rescan Disks")
rescan_button.template = "diskman/cbi/inlinebutton"
rescan_button.inputstyle = "add"
rescan_button.forcewrite = true
rescan_button.write = function(self, section, value)
luci.util.exec("echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null")
if dm.command.mdadm then
luci.util.exec(d.command.mdadm .. " --assemble --scan")
end
luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman"))
end

-- disks
local disks = dm.list_devices()
Expand All @@ -37,36 +51,109 @@ d:option(DummyValue, "sata_ver", translate("SATA Version"))
d:option(DummyValue, "health", translate("Health"))
d:option(DummyValue, "status", translate("Status"))

-- edit = d:option(Button, "partition", translate("Edit Partition"))
-- edit.inputstyle = "edit"
-- edit.inputtitle = "Edit"
-- -- overwrite write function to add click event function
-- -- however, this function will be executed after built-in submit function finishes
-- edit.write = function(self, section)
-- local url = luci.dispatcher.build_url("admin/system/disk/partition")
-- url = url .. "/" .. devices[section].path:match("/dev/(.+)")
-- luci.http.redirect(url)
-- end
d.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s")

rescan = m:section(SimpleSection)
rescan_button = rescan:option(Button, "_rescan")
rescan_button.inputtitle= translate("Rescan Disks")
rescan_button.template = "diskman/cbi/inlinebutton"
rescan_button.inputstyle = "add"
rescan_button.forcewrite = true
rescan_button.write = function(self, section, value)
luci.util.exec("echo '- - -' | tee /sys/class/scsi_host/host*/scan > /dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman"))
-- raid devices
if dm.command.mdadm then
local raid_devices = dm.list_raid_devices()
-- raid_devices = diskmanager.getRAIDdevices()
if next(raid_devices) ~= nil then
local r = m:section(Table, raid_devices, translate("RAID Devices"))
r.config = "_raid"
r:option(DummyValue, "path", translate("Path"))
r:option(DummyValue, "level", translate("RAID mode"))
r:option(DummyValue, "size_formated", translate("Size"))
r:option(DummyValue, "p_table", translate("Partition Table"))
r:option(DummyValue, "status", translate("Status"))
r:option(DummyValue, "members_str", translate("Members"))
r:option(DummyValue, "active", translate("Active"))
-- local redit = r:option(Button, "rpartition")
-- redit.inputstyle = "edit"
-- redit.inputtitle = "Edit"
-- redit.write = function(self, section)
-- local url = luci.dispatcher.build_url("admin/system/diskman/partition")
-- url = url .. "/" .. raid_devices[section].path:match("/dev/(.+)")
-- luci.http.redirect(url)
-- end
r.extedit = luci.dispatcher.build_url("admin/system/diskman/partition/%s")
end

end

--tabs
tab_section = m:section(SimpleSection)
tab_section.tabs = {
mount_point = translate("Mount Point")
}
tab_section.default_tab = "mount_point"
tab_section.template="diskman/disk_info_tab"

-- raid functions
if dm.command.mdadm then
local rname, rmembers, rlevel
tab_section.tabs.raid = translate("Raid")
local r = m:section(SimpleSection, translate("RAID Creation"))
r.template="diskman/cbi/xnullsection"
r.config = "raid"
local r_name = r:option(Value, "_name", translate("Raid Name"))
r_name.placeholder = "/dev/md0"
r_name.write = function(self, section, value)
rname = value
end
local r_level = r:option(ListValue, "_level", translate("Raid Level"))
local valid_raid = luci.util.exec("lsmod | grep md_mod")
if valid_raid:match("linear") then
r_level:value("linear", "Linear")
end
if valid_raid:match("raid456") then
r_level:value("5", "Raid 5")
r_level:value("6", "Raid 6")
end
if valid_raid:match("raid1") then
r_level:value("1", "Raid 1")
end
if valid_raid:match("raid0") then
r_level:value("0", "Raid 0")
end
if valid_raid:match("raid10") then
r_level:value("10", "Raid 10")
end
r_level.write = function(self, section, value)
rlevel = value
end
local r_member = r:option(DynamicList, "_member", translate("Raid Member"))
for dev, info in pairs(disks) do
if not info.inuse and #info.partitions == 0 then
r_member:value(info.path, info.path.. " ".. info.size_formated)
end
for i, v in ipairs(info.partitions) do
if not v.inuse then
r_member:value("/dev/".. v.name, "/dev/".. v.name .. " ".. v.size_formated)
end
end
end
r_member.write = function(self, section, value)
rmembers = value
end
local r_create = r:option(Button, "_create")
r_create.render = function(self, section, scope)
self.title = " "
self.inputtitle = translate("Create Raid")
self.inputstyle = "add"
Button.render(self, section, scope)
end
r_create.write = function(self, section, value)
-- mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb6 /dev/sdc5
local res = dm.create_raid(rname, rlevel, rmembers)
if res:match("^ERR") then
m.errmessage = translate(res)
return
end
dm.gen_mdadm_config()
luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman"))
end
end

-- mount point
local mount_point = dm.get_mount_points()
local _mount_point = {}
Expand Down Expand Up @@ -137,10 +224,10 @@ local btn_umount = table_mp:option(Button, "_mount", translate("Mount"))
btn_umount.forcewrite = true
btn_umount.render = function(self, section, scope)
if mount_point[section].device == 0 then
self.inputtitle = " Mount "
self.inputtitle = " "..translate("Mount").." "
btn_umount.inputstyle = "add"
else
self.inputtitle = "Umount"
self.inputtitle = translate("Umount")
btn_umount.inputstyle = "remove"
end
Button.render(self, section, scope)
Expand All @@ -154,41 +241,12 @@ btn_umount.write = function(self, section, value)
res = luci.util.exec("umount "..mount_point[section].mount_point .. " 2>&1")
end
if res:match("^mount:") then
m.message = luci.util.pcdata(res)
m.errmessage = luci.util.pcdata(res)
else
luci.http.redirect(luci.dispatcher.build_url("admin/system/diskman"))
end
end


-- raid devices
if dm.command.mdadm then
tab_section.tabs.raid = translate("Raid")
local raid_devices = {}
-- raid_devices = diskmanager.getRAIDdevices()
r = m:section(Table, raid_devices, translate("RAID Devices"))
r.config = "raid"
path = r:option(DummyValue, "path", translate("Path"))
level = r:option(DummyValue, "level", translate("RAID mode"))
size = r:option(DummyValue, "size", translate("Size"))
status = r:option(DummyValue, "status", translate("Status"))
members = r:option(DummyValue, "members_str", translate("Members"))
remove = r:option(Button, "remove", translate("Remove"))
remove.inputstyle = "remove"
remove.write = function(self, section)
sys.call("/usr/bin/disk-raid-helper.sh remove "..raid_devices[section].path.." &> /dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/system/disk"))
end
-- redit = r:option(Button, "rpartition", translate("Edit Partition"))
-- redit.inputstyle = "edit"
-- redit.inputtitle = "Edit"
-- redit.write = function(self, section)
-- local url = luci.dispatcher.build_url("admin/system/disk/partition")
-- url = url .. "/" .. raid_devices[section].path:match("/dev/(.+)")
-- luci.http.redirect(url)
-- end
r.extedit = luci.dispatcher.build_url("admin/system/disk/partition/%s")
end
-- -- btrfs
if dm.command.btrfs then
tab_section.tabs.btrfs = translate("Btrfs")
Expand Down
Loading

0 comments on commit 9606f58

Please sign in to comment.