uvol: unbreak build and adapt to updated ucode

* Fix build which was broken by a wrong path in the Makefile.

Adapt to ucode commit 4618807 ("main: rework CLI frontend"):
 * ucode now no longer needs the {% %} around each code file, remove
   that and safe one level of indentation.
 * ARGV now no longer includes ucode executable and script itself

Fixes: 6350c7bc6 ("uvol: replace with re-write in ucode")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Daniel Golle 2022-03-31 21:41:17 +01:00
parent 8324c1fe06
commit 22d202e3a5
No known key found for this signature in database
GPG key ID: 5A8F39C31C3217CA
6 changed files with 932 additions and 943 deletions

View file

@ -67,7 +67,7 @@ define Package/autopart/install
endef endef
define Package/uvol/install define Package/uvol/install
$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/uvol/backends $(1)/usr/sbin $(1)/etc/uci-defaults $(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/lib/uvol/backends $(1)/usr/sbin $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/uvol.init $(1)/etc/init.d/uvol $(INSTALL_BIN) ./files/uvol.init $(1)/etc/init.d/uvol
$(INSTALL_DATA) ./files/blockdev_common.uc $(1)/usr/lib/uvol/ $(INSTALL_DATA) ./files/blockdev_common.uc $(1)/usr/lib/uvol/
$(INSTALL_DATA) ./files/uci.uc $(1)/usr/lib/uvol/ $(INSTALL_DATA) ./files/uci.uc $(1)/usr/lib/uvol/

View file

@ -1,8 +1,8 @@
{%
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// Helper functions used to identify the boot device // Helper functions used to identify the boot device
// adapted from /lib/functions.sh
let cmdline_get_var = function(var) { // adapted from /lib/functions.sh
let cmdline_get_var = function(var) {
let cmdline = fs.open("/proc/cmdline", "r"); let cmdline = fs.open("/proc/cmdline", "r");
let allargs = cmdline.read("all"); let allargs = cmdline.read("all");
cmdline.close(); cmdline.close();
@ -13,20 +13,20 @@
return join("=", el); return join("=", el);
} }
return ret; return ret;
}; };
// adapted from /lib/upgrade/common.sh // adapted from /lib/upgrade/common.sh
let get_blockdevs = function() { let get_blockdevs = function() {
let devs = []; let devs = [];
for (let dev in fs.glob('/dev/*')) for (let dev in fs.glob('/dev/*'))
if (fs.stat(dev).type == "block") if (fs.stat(dev).type == "block")
push(devs, split(dev, '/')[-1]); push(devs, split(dev, '/')[-1]);
return devs; return devs;
}; };
// adapted from /lib/upgrade/common.sh // adapted from /lib/upgrade/common.sh
let get_uevent_major_minor = function(file) { let get_uevent_major_minor = function(file) {
let uevf = fs.open(file, "r"); let uevf = fs.open(file, "r");
if (!uevf) if (!uevf)
return null; return null;
@ -42,10 +42,10 @@
} }
uevf.close(); uevf.close();
return r; return r;
}; };
// adapted from /lib/upgrade/common.sh // adapted from /lib/upgrade/common.sh
let get_bootdev = function(void) { let get_bootdev = function(void) {
let rootpart = cmdline_get_var("root"); let rootpart = cmdline_get_var("root");
let uevent = null; let uevent = null;
@ -78,6 +78,7 @@
ord(bduuid, 7), ord(bduuid, 6), ord(bduuid, 7), ord(bduuid, 6),
ord(bduuid, 8), ord(bduuid, 9), ord(bduuid, 8), ord(bduuid, 9),
ord(bduuid, 10), ord(bduuid, 11), ord(bduuid, 12), ord(bduuid, 13), ord(bduuid, 14), ord(bduuid, 15)); ord(bduuid, 10), ord(bduuid, 11), ord(bduuid, 12), ord(bduuid, 13), ord(bduuid, 14), ord(bduuid, 15));
if (uuidarg == uuid) { if (uuidarg == uuid) {
uevent = sprintf("/sys/class/block/%s/uevent", bd); uevent = sprintf("/sys/class/block/%s/uevent", bd);
break; break;
@ -103,10 +104,10 @@
uevent = sprintf("/sys/class/block/%s/../uevent", split(rootpart, '/')[-1]); uevent = sprintf("/sys/class/block/%s/../uevent", split(rootpart, '/')[-1]);
} }
return get_uevent_major_minor(uevent); return get_uevent_major_minor(uevent);
}; };
// adapted from /lib/upgrade/common.sh // adapted from /lib/upgrade/common.sh
let get_partition = function(dev, num) { let get_partition = function(dev, num) {
for (let bd in get_blockdevs()) { for (let bd in get_blockdevs()) {
let r = get_uevent_major_minor(sprintf("/sys/class/block/%s/uevent", bd)); let r = get_uevent_major_minor(sprintf("/sys/class/block/%s/uevent", bd));
if (r.major == dev.major && r.minor == dev.minor + num) { if (r.major == dev.major && r.minor == dev.minor + num) {
@ -115,9 +116,8 @@
} }
} }
return null; return null;
}; };
blockdev_common = {}; blockdev_common = {};
blockdev_common.get_partition = get_partition; blockdev_common.get_partition = get_partition;
blockdev_common.get_bootdev = get_bootdev; blockdev_common.get_bootdev = get_bootdev;
%}

View file

@ -1,4 +1,3 @@
{%
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// LVM2 backend for uvol // LVM2 backend for uvol
// (c) 2022 Daniel Golle <daniel@makrotopia.org> // (c) 2022 Daniel Golle <daniel@makrotopia.org>
@ -10,9 +9,9 @@
// By setting the UCI option 'vg_name' in the 'uvol' section in /etc/config/fstab // By setting the UCI option 'vg_name' in the 'uvol' section in /etc/config/fstab
// you may set an arbitrary LVM2 volume group to back uvol instad. // you may set an arbitrary LVM2 volume group to back uvol instad.
let lvm_exec = "/sbin/lvm"; let lvm_exec = "/sbin/lvm";
function lvm(cmd, ...args) { function lvm(cmd, ...args) {
let lvm_json_cmds = [ "lvs", "pvs", "vgs" ]; let lvm_json_cmds = [ "lvs", "pvs", "vgs" ];
try { try {
let json_param = ""; let json_param = "";
@ -39,9 +38,9 @@
printf("Failed to parse lvm cli output: %s\n%s\n", e, e.stacktrace[0].context); printf("Failed to parse lvm cli output: %s\n%s\n", e, e.stacktrace[0].context);
} }
return null; return null;
} }
function pvs() { function pvs() {
let fstab = cursor.get_all('fstab'); let fstab = cursor.get_all('fstab');
for (let k, section in fstab) { for (let k, section in fstab) {
if (section['.type'] != 'uvol' || !section.vg_name) if (section['.type'] != 'uvol' || !section.vg_name)
@ -56,9 +55,9 @@
return tmp.report.pv[0].vg_name; return tmp.report.pv[0].vg_name;
else else
return null; return null;
} }
function vgs(vg_name) { function vgs(vg_name) {
let tmp = lvm("vgs", "-o", "vg_extent_size,vg_extent_count,vg_free_count", "-S", sprintf("\"vg_name=%s\"", vg_name)); let tmp = lvm("vgs", "-o", "vg_extent_size,vg_extent_count,vg_free_count", "-S", sprintf("\"vg_name=%s\"", vg_name));
let ret = null; let ret = null;
if (tmp && tmp.report.vg) { if (tmp && tmp.report.vg) {
@ -73,9 +72,9 @@
return ret[0]; return ret[0];
else else
return null; return null;
} }
function lvs(vg_name, vol_name, extra_exp) { function lvs(vg_name, vol_name, extra_exp) {
let ret = []; let ret = [];
if (!vol_name) if (!vol_name)
vol_name = ".*"; vol_name = ".*";
@ -91,9 +90,9 @@
} }
} }
return ret; return ret;
} }
function getdev(lv) { function getdev(lv) {
if (!lv) if (!lv)
return null; return null;
@ -108,9 +107,9 @@
return split(dms, '/')[-1] return split(dms, '/')[-1]
} }
return null; return null;
} }
function lvm_init(ctx) { function lvm_init(ctx) {
cursor = ctx.cursor; cursor = ctx.cursor;
fs = ctx.fs; fs = ctx.fs;
if (!fs.access(lvm_exec, "x")) if (!fs.access(lvm_exec, "x"))
@ -126,30 +125,30 @@
uvol_uci_remove = ctx.uci_remove; uvol_uci_remove = ctx.uci_remove;
uvol_uci_init = ctx.uci_init; uvol_uci_init = ctx.uci_init;
return true; return true;
} }
function lvm_free() { function lvm_free() {
if (!vg || !vg.vg_free_count || !vg.vg_extent_size) if (!vg || !vg.vg_free_count || !vg.vg_extent_size)
return 2; return 2;
return sprintf("%d", vg.vg_free_count * vg.vg_extent_size); return sprintf("%d", vg.vg_free_count * vg.vg_extent_size);
} }
function lvm_total() { function lvm_total() {
if (!vg || !vg.vg_extent_count || !vg.vg_extent_size) if (!vg || !vg.vg_extent_count || !vg.vg_extent_size)
return 2; return 2;
return sprintf("%d", vg.vg_extent_count * vg.vg_extent_size); return sprintf("%d", vg.vg_extent_count * vg.vg_extent_size);
} }
function lvm_align() { function lvm_align() {
if (!vg || !vg.vg_extent_size) if (!vg || !vg.vg_extent_size)
return 2; return 2;
return sprintf("%d", vg.vg_extent_size); return sprintf("%d", vg.vg_extent_size);
} }
function lvm_list(vol_name) { function lvm_list(vol_name) {
let vols = []; let vols = [];
if (!vg_name) if (!vg_name)
@ -174,9 +173,9 @@
} }
return vols; return vols;
} }
function lvm_size(vol_name) { function lvm_size(vol_name) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 2; return 2;
@ -185,9 +184,9 @@
return 2; return 2;
return sprintf("%d", res[0].lv_size); return sprintf("%d", res[0].lv_size);
} }
function lvm_status(vol_name) { function lvm_status(vol_name) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -200,9 +199,9 @@
return 1; return 1;
return 0; return 0;
} }
function lvm_device(vol_name) { function lvm_device(vol_name) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -215,9 +214,9 @@
return 22; return 22;
return getdev(res[0]); return getdev(res[0]);
} }
function lvm_updown(vol_name, up) { function lvm_updown(vol_name, up) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -254,17 +253,17 @@
return lvchange_r.retval; return lvchange_r.retval;
return 0 return 0
} }
function lvm_up(vol_name) { function lvm_up(vol_name) {
return lvm_updown(vol_name, true); return lvm_updown(vol_name, true);
} }
function lvm_down(vol_name) { function lvm_down(vol_name) {
return lvm_updown(vol_name, false); return lvm_updown(vol_name, false);
} }
function lvm_create(vol_name, vol_size, vol_mode) { function lvm_create(vol_name, vol_size, vol_mode) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -332,9 +331,9 @@
return ret.retval; return ret.retval;
return 0; return 0;
} }
function lvm_remove(vol_name) { function lvm_remove(vol_name) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -352,9 +351,9 @@
uvol_uci_remove(vol_name); uvol_uci_remove(vol_name);
uvol_uci_commit(vol_name); uvol_uci_commit(vol_name);
return 0; return 0;
} }
function lvm_dd(in_fd, out_fd, vol_size) { function lvm_dd(in_fd, out_fd, vol_size) {
let rem = vol_size; let rem = vol_size;
let buf; let buf;
while ((buf = in_fd.read(vg.vg_extent_size)) && (rem > 0)) { while ((buf = in_fd.read(vg.vg_extent_size)) && (rem > 0)) {
@ -365,9 +364,9 @@
out_fd.write(buf); out_fd.write(buf);
} }
return rem; return rem;
} }
function lvm_write(vol_name, vol_size) { function lvm_write(vol_name, vol_size) {
if (!vol_name || !vg_name) if (!vol_name || !vg_name)
return 22; return 22;
@ -418,9 +417,9 @@
return 22; return 22;
} }
return 0; return 0;
} }
function lvm_detect() { function lvm_detect() {
let temp_up = []; let temp_up = [];
let inactive_lv = lvs(vg_name, null, "lv_skip_activation!=0"); let inactive_lv = lvs(vg_name, null, "lv_skip_activation!=0");
for (let lv in inactive_lv) { for (let lv in inactive_lv) {
@ -441,27 +440,26 @@
lvm("lvchange", "-k", "y", lv_full_name); lvm("lvchange", "-k", "y", lv_full_name);
} }
return 0; return 0;
} }
function lvm_boot() { function lvm_boot() {
return 0; return 0;
} }
backend.backend = "LVM"; backend.backend = "LVM";
backend.priority = 50; backend.priority = 50;
backend.init = lvm_init; backend.init = lvm_init;
backend.boot = lvm_boot; backend.boot = lvm_boot;
backend.detect = lvm_detect; backend.detect = lvm_detect;
backend.free = lvm_free; backend.free = lvm_free;
backend.align = lvm_align; backend.align = lvm_align;
backend.total = lvm_total; backend.total = lvm_total;
backend.list = lvm_list; backend.list = lvm_list;
backend.size = lvm_size; backend.size = lvm_size;
backend.status = lvm_status; backend.status = lvm_status;
backend.device = lvm_device; backend.device = lvm_device;
backend.up = lvm_up; backend.up = lvm_up;
backend.down = lvm_down; backend.down = lvm_down;
backend.create = lvm_create; backend.create = lvm_create;
backend.remove = lvm_remove; backend.remove = lvm_remove;
backend.write = lvm_write; backend.write = lvm_write;
%}

View file

@ -1,11 +1,10 @@
{%
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// UBI backend for uvol // UBI backend for uvol
// (c) 2022 Daniel Golle <daniel@makrotopia.org> // (c) 2022 Daniel Golle <daniel@makrotopia.org>
// //
// This plugin uses UBI on NAND flash as a storage backend for uvol. // This plugin uses UBI on NAND flash as a storage backend for uvol.
function read_file(file) { function read_file(file) {
let fp = fs.open(file); let fp = fs.open(file);
if (!fp) if (!fp)
return null; return null;
@ -13,9 +12,9 @@
let var = rtrim(fp.read("all")); let var = rtrim(fp.read("all"));
fp.close(); fp.close();
return var; return var;
} }
function mkdtemp() { function mkdtemp() {
math = require("math"); math = require("math");
let r1 = math.rand(); let r1 = math.rand();
let r2 = math.rand(); let r2 = math.rand();
@ -26,9 +25,9 @@
let dirname = sprintf("/tmp/uvol-%s", randstr); let dirname = sprintf("/tmp/uvol-%s", randstr);
fs.mkdir(dirname, 0700); fs.mkdir(dirname, 0700);
return dirname; return dirname;
} }
function ubi_get_dev(vol_name) { function ubi_get_dev(vol_name) {
let wcstring = sprintf("uvol-[rw][owpd]-%s", vol_name); let wcstring = sprintf("uvol-[rw][owpd]-%s", vol_name);
for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) { for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) {
let vol_ubiname = read_file(sprintf("%s/name", vol_dir)); let vol_ubiname = read_file(sprintf("%s/name", vol_dir));
@ -36,26 +35,26 @@
return fs.basename(vol_dir); return fs.basename(vol_dir);
} }
return null; return null;
} }
function vol_get_mode(vol_dev, mode) { function vol_get_mode(vol_dev, mode) {
let vol_name = read_file(sprintf("/sys/devices/virtual/ubi/%s/%s/name", ubidev, vol_dev)); let vol_name = read_file(sprintf("/sys/devices/virtual/ubi/%s/%s/name", ubidev, vol_dev));
return substr(vol_name, 5, 2); return substr(vol_name, 5, 2);
} }
function mkubifs(vol_dev) { function mkubifs(vol_dev) {
let temp_mp = mkdtemp(); let temp_mp = mkdtemp();
system(sprintf("mount -t ubifs /dev/%s %s", vol_dev, temp_mp)); system(sprintf("mount -t ubifs /dev/%s %s", vol_dev, temp_mp));
system(sprintf("umount %s", temp_mp)); system(sprintf("umount %s", temp_mp));
fs.rmdir(temp_mp); fs.rmdir(temp_mp);
return 0; return 0;
} }
function block_hotplug(action, devname) { function block_hotplug(action, devname) {
return system(sprintf("ACTION=%s DEVNAME=%s /sbin/block hotplug", action, devname)); return system(sprintf("ACTION=%s DEVNAME=%s /sbin/block hotplug", action, devname));
} }
function ubi_init(ctx) { function ubi_init(ctx) {
cursor = ctx.cursor; cursor = ctx.cursor;
fs = ctx.fs; fs = ctx.fs;
@ -79,23 +78,23 @@
uvol_uci_init = ctx.uci_init; uvol_uci_init = ctx.uci_init;
return true; return true;
} }
function ubi_free() { function ubi_free() {
let availeb = read_file(sprintf("/sys/devices/virtual/ubi/%s/avail_eraseblocks", ubidev)); let availeb = read_file(sprintf("/sys/devices/virtual/ubi/%s/avail_eraseblocks", ubidev));
return sprintf("%d", availeb * ebsize); return sprintf("%d", availeb * ebsize);
} }
function ubi_align() { function ubi_align() {
return sprintf("%d", ebsize); return sprintf("%d", ebsize);
} }
function ubi_total() { function ubi_total() {
let totaleb = read_file(sprintf("/sys/devices/virtual/ubi/%s/total_eraseblocks", ubidev)); let totaleb = read_file(sprintf("/sys/devices/virtual/ubi/%s/total_eraseblocks", ubidev));
return sprintf("%d", totaleb * ebsize); return sprintf("%d", totaleb * ebsize);
} }
function ubi_status(vol_name) { function ubi_status(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -108,18 +107,18 @@
!fs.access(sprintf("/dev/ubiblock%s", substr(vol_dev, 3)), "r")) return 1; !fs.access(sprintf("/dev/ubiblock%s", substr(vol_dev, 3)), "r")) return 1;
return 0; return 0;
} }
function ubi_size(vol_name) { function ubi_size(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
let vol_size = read_file(sprintf("/sys/devices/virtual/ubi/%s/%s/data_bytes", ubidev, vol_dev)); let vol_size = read_file(sprintf("/sys/devices/virtual/ubi/%s/%s/data_bytes", ubidev, vol_dev));
return sprintf("%d", vol_size); return sprintf("%d", vol_size);
} }
function ubi_device(vol_name) { function ubi_device(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -131,9 +130,9 @@
return sprintf("/dev/%s", vol_dev); return sprintf("/dev/%s", vol_dev);
return null; return null;
} }
function ubi_create(vol_name, vol_size, vol_mode) { function ubi_create(vol_name, vol_size, vol_mode) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (vol_dev) if (vol_dev)
return 17; return 17;
@ -175,9 +174,9 @@
return ret; return ret;
return 0; return 0;
} }
function ubi_remove(vol_name) { function ubi_remove(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -196,9 +195,9 @@
uvol_uci_commit(vol_name); uvol_uci_commit(vol_name);
return 0; return 0;
} }
function ubi_up(vol_name) { function ubi_up(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -226,9 +225,9 @@
return block_hotplug("add", vol_dev); return block_hotplug("add", vol_dev);
} }
return 0; return 0;
} }
function ubi_down(vol_name) { function ubi_down(vol_name) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -252,9 +251,9 @@
return ret; return ret;
} }
return 0; return 0;
} }
function ubi_list(search_name) { function ubi_list(search_name) {
let volumes = []; let volumes = [];
for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) { for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) {
let vol = {}; let vol = {};
@ -274,9 +273,9 @@
push(volumes, vol); push(volumes, vol);
} }
return volumes; return volumes;
} }
function ubi_detect() { function ubi_detect() {
let tmpdev = []; let tmpdev = [];
for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) { for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) {
let vol_ubiname = read_file(sprintf("%s/name", vol_dir)); let vol_ubiname = read_file(sprintf("%s/name", vol_dir));
@ -319,9 +318,9 @@
system(sprintf("ubiblock --remove /dev/%s", vol_dev)); system(sprintf("ubiblock --remove /dev/%s", vol_dev));
return 0; return 0;
} }
function ubi_boot() { function ubi_boot() {
for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) { for (vol_dir in fs.glob(sprintf("/sys/devices/virtual/ubi/%s/%s_*", ubidev, ubidev))) {
let vol_dev = fs.basename(vol_dir); let vol_dev = fs.basename(vol_dir);
let vol_ubiname = read_file(sprintf("%s/name", vol_dir)); let vol_ubiname = read_file(sprintf("%s/name", vol_dir));
@ -331,9 +330,9 @@
system(sprintf("ubiblock --create /dev/%s", vol_dev)); system(sprintf("ubiblock --create /dev/%s", vol_dev));
} }
} }
function ubi_write(vol_name, write_size) { function ubi_write(vol_name, write_size) {
let vol_dev = ubi_get_dev(vol_name); let vol_dev = ubi_get_dev(vol_name);
if (!vol_dev) if (!vol_dev)
return 2; return 2;
@ -356,23 +355,22 @@
system(sprintf("ubirename /dev/%s \"uvol-wo-%s\" \"uvol-rd-%s\"", ubidev, vol_name, vol_name)); system(sprintf("ubirename /dev/%s \"uvol-wo-%s\" \"uvol-rd-%s\"", ubidev, vol_name, vol_name));
return 0; return 0;
} }
backend.backend = "UBI"; backend.backend = "UBI";
backend.priority = 20; backend.priority = 20;
backend.init = ubi_init; backend.init = ubi_init;
backend.boot = ubi_boot; backend.boot = ubi_boot;
backend.detect = ubi_detect; backend.detect = ubi_detect;
backend.free = ubi_free; backend.free = ubi_free;
backend.align = ubi_align; backend.align = ubi_align;
backend.total = ubi_total; backend.total = ubi_total;
backend.list = ubi_list; backend.list = ubi_list;
backend.size = ubi_size; backend.size = ubi_size;
backend.status = ubi_status; backend.status = ubi_status;
backend.device = ubi_device; backend.device = ubi_device;
backend.up = ubi_up; backend.up = ubi_up;
backend.down = ubi_down; backend.down = ubi_down;
backend.create = ubi_create; backend.create = ubi_create;
backend.remove = ubi_remove; backend.remove = ubi_remove;
backend.write = ubi_write; backend.write = ubi_write;
%}

View file

@ -1,4 +1,3 @@
{%
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// UCI tools for uvol // UCI tools for uvol
// (c) 2022 Daniel Golle <daniel@makrotopia.org> // (c) 2022 Daniel Golle <daniel@makrotopia.org>
@ -136,4 +135,3 @@ uvol_uci = {
return 0; return 0;
} }
}; };
%}

View file

@ -1,13 +1,9 @@
#!/usr/bin/ucode #!/usr/bin/ucode
{%
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
// uvol - storage volume manager for OpenWrt // uvol - storage volume manager for OpenWrt
// (c) 2022 Daniel Golle <daniel@makrotopia.org> // (c) 2022 Daniel Golle <daniel@makrotopia.org>
function help() { let help_output = "uvol storage volume manager
%}
uvol storage volume manager
syntax: uvol command ... syntax: uvol command ...
commands: commands:
@ -29,25 +25,28 @@ commands:
1 - volume is not ready for use 1 - volume is not ready for use
2 - volume doesn'y exist 2 - volume doesn'y exist
write volname size write to volume from stdin, size in bytes write volname size write to volume from stdin, size in bytes
{% "
}
let fs = require("fs"); function help() {
let uci = require("uci"); printf("%s", help_output);
let cursor = uci ? uci.cursor() : null; );
let ctx = {}; let fs = require("fs");
ctx.cursor = cursor; let uci = require("uci");
ctx.fs = fs; let cursor = uci ? uci.cursor() : null;
include("/usr/lib/uvol/uci.uc");
ctx.uci_add = uvol_uci.uvol_uci_add;
ctx.uci_remove = uvol_uci.uvol_uci_remove;
ctx.uci_commit = uvol_uci.uvol_uci_commit;
ctx.uci_init = uvol_uci.uvol_uci_init;
let backend = null; let ctx = {};
let tried_backends = []; ctx.cursor = cursor;
for (plugin in fs.glob("/usr/lib/uvol/backends/*.uc")) { ctx.fs = fs;
include("/usr/lib/uvol/uci.uc");
ctx.uci_add = uvol_uci.uvol_uci_add;
ctx.uci_remove = uvol_uci.uvol_uci_remove;
ctx.uci_commit = uvol_uci.uvol_uci_commit;
ctx.uci_init = uvol_uci.uvol_uci_init;
let backend = null;
let tried_backends = [];
for (plugin in fs.glob("/usr/lib/uvol/backends/*.uc")) {
let current_backend = {}; let current_backend = {};
include(plugin, { backend: current_backend }); include(plugin, { backend: current_backend });
push(tried_backends, current_backend.backend); push(tried_backends, current_backend.backend);
@ -56,41 +55,38 @@ commands:
type(current_backend.priority) == "int" && type(current_backend.priority) == "int" &&
backend.priority > current_backend.priority) backend.priority > current_backend.priority)
continue; continue;
if (type(current_backend.init) == "function" && if (type(current_backend.init) == "function" &&
current_backend.init(ctx)) { current_backend.init(ctx)) {
backend = current_backend; backend = current_backend;
break; break;
} }
} }
if (!backend) { if (!backend) {
printf("No backend available. (tried: %s)\n", join(" ", tried_backends)); printf("No backend available. (tried: %s)\n", join(" ", tried_backends));
printf("To setup devices with block storage install 'autopart'.\n"); printf("To setup devices with block storage install 'autopart'.\n");
exit(2); exit(2);
} }
shift(ARGV); let cmd = shift(ARGV);
shift(ARGV);
let cmd = shift(ARGV);
if (!cmd || cmd == "-h" || cmd == "help") { if (!cmd || cmd == "-h" || cmd == "help") {
help(); help();
return cmd?0:22; return cmd?0:22;
} }
if (!(cmd in keys(backend))) { if (!(cmd in keys(backend))) {
printf("command %s not found\n", cmd); printf("command %s not found\n", cmd);
return 22; return 22;
} }
let json_output = false; let json_output = false;
if (ARGV[0] == "-j") { if (ARGV[0] == "-j") {
json_output = true; json_output = true;
shift(ARGV); shift(ARGV);
} }
let legacy_output = function(var) { let legacy_output = function(var) {
let out = ""; let out = "";
if (type(var) == "array") { if (type(var) == "array") {
for (let line in var) { for (let line in var) {
@ -102,11 +98,11 @@ commands:
out += "\n"; out += "\n";
} }
return out; return out;
}; };
if (type(backend[cmd]) == "string") { if (type(backend[cmd]) == "string") {
printf("%s\n", backend[cmd]); printf("%s\n", backend[cmd]);
} else if (type(backend[cmd]) == "function") { } else if (type(backend[cmd]) == "function") {
let ret = backend[cmd](...ARGV); let ret = backend[cmd](...ARGV);
if (type(ret) == "int") if (type(ret) == "int")
exit(ret); exit(ret);
@ -119,12 +115,11 @@ commands:
else else
printf("%s", legacy_output(ret)); printf("%s", legacy_output(ret));
} }
} else { } else {
if (json_output) if (json_output)
printf("%.J\n", backend[cmd]); printf("%.J\n", backend[cmd]);
else else
printf("%s\n", legacy_output(backend[cmd])); printf("%s\n", legacy_output(backend[cmd]));
} }
return 0; exit(0);
%}