112 lines
3.0 KiB
Lua
112 lines
3.0 KiB
Lua
|
local serial = require "serialization"
|
||
|
local fs = require "filesystem"
|
||
|
|
||
|
local tA = {...}
|
||
|
|
||
|
if #tA < 8 then
|
||
|
print([[livefdc requires 8 arguments, in this order:
|
||
|
- path to clean OpenOS installer
|
||
|
- path to repoinstaller-compatible disk
|
||
|
- comma-separated list of packages to install in the base system
|
||
|
- comma-separated list of packages to archive for live use
|
||
|
- comma-separated list of packages to archive for constrained use
|
||
|
- comma-separated list of extra packages to be unpacked when there is space
|
||
|
- comma-separated list of paths to move into the extra archive
|
||
|
- output path
|
||
|
]])
|
||
|
os.exit(1)
|
||
|
end
|
||
|
|
||
|
local function parsecs(str)
|
||
|
local rt = {}
|
||
|
for w in str:gmatch("[^,]+") do
|
||
|
rt[#rt+1] = w
|
||
|
end
|
||
|
return rt
|
||
|
end
|
||
|
|
||
|
local oospath = fs.canonical(tA[1])
|
||
|
local pkgpath = fs.canonical(tA[2])
|
||
|
local basepkg, livepkg, instpkg, extpkg = parsecs(tA[3]), parsecs(tA[4]), parsecs(tA[5]), parsecs(tA[6])
|
||
|
local archivepaths = parsecs(tA[7])
|
||
|
local outpath = fs.canonical(tA[8])
|
||
|
|
||
|
local f = io.open(pkgpath .. "/master/programs.cfg", "rb")
|
||
|
local pkgs = serial.unserialize(f:read("*a"))
|
||
|
f:close()
|
||
|
local ipkgs,opkgs = {}, {}
|
||
|
|
||
|
local function run(cmd)
|
||
|
print(cmd)
|
||
|
os.execute(cmd)
|
||
|
end
|
||
|
local function mkdir(path)
|
||
|
print("mkdir",path)
|
||
|
fs.makeDirectory(path)
|
||
|
end
|
||
|
local function copy(from,to)
|
||
|
print("copy",from,to)
|
||
|
fs.copy(from,to)
|
||
|
end
|
||
|
local function move(from,to)
|
||
|
print("move",from,to)
|
||
|
fs.rename(from,to)
|
||
|
end
|
||
|
|
||
|
local function installPkg(pkgname, dest)
|
||
|
local pkg, opkg = pkgs[pkgname], {}
|
||
|
assert(pkg, "package not available")
|
||
|
print(string.format("Installing %s to %s", pkgname, dest))
|
||
|
for k,v in pairs(pkg.files or {}) do
|
||
|
v = v:match("^//") and v:sub(2) or fs.concat("/usr", v)
|
||
|
mkdir(fs.concat(dest,v))
|
||
|
copy(pkgpath .. "/" .. k,fs.concat(dest,v,fs.name(k)))
|
||
|
opkg[k] = fs.concat(v,fs.name(k))
|
||
|
end
|
||
|
for k,v in pairs(pkg.dependencies or {}) do
|
||
|
if k:match("^https?://") then
|
||
|
v = v:match("^//") and v:sub(2) or fs.concat("/usr", v)
|
||
|
mkdir(fs.concat(dest,v))
|
||
|
copy(fs.concat(pkgpath, "external", k:match("^https://(.+)$")), fs.concat(dest,v,fs.name(k)))
|
||
|
opkg[k] = fs.concat(v,fs.name(k))
|
||
|
elseif not ipkgs[k] then
|
||
|
installPkg(k,dest)
|
||
|
end
|
||
|
end
|
||
|
ipkgs[pkgname] = pkg
|
||
|
opkgs[pkgname] = opkg
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
mkdir(outpath)
|
||
|
run(string.format("cp -rv '%s' '%s/img'",oospath,outpath))
|
||
|
|
||
|
for k,v in ipairs(basepkg) do
|
||
|
installPkg(v, fs.concat(outpath, "img"))
|
||
|
end
|
||
|
for k,v in ipairs(livepkg) do
|
||
|
installPkg(v, fs.concat(outpath, "live"))
|
||
|
end
|
||
|
for k,v in ipairs(instpkg) do
|
||
|
installPkg(v, fs.concat(outpath, "inst"))
|
||
|
end
|
||
|
for k,v in ipairs(extpkg) do
|
||
|
installPkg(v, fs.concat(outpath, "extra"))
|
||
|
end
|
||
|
|
||
|
for k,v in ipairs(archivepaths) do
|
||
|
mkdir(fs.concat(outpath, "extra", fs.path(v)))
|
||
|
move(fs.concat(outpath, "img", v), fs.concat(outpath, "extra", v))
|
||
|
end
|
||
|
|
||
|
local f = io.open(fs.concat(outpath, "img", "/etc/opdata.svd"), "wb")
|
||
|
f:write(serial.serialize(opkgs))
|
||
|
f:close()
|
||
|
|
||
|
local opwd = os.getenv("PWD")
|
||
|
for k,v in ipairs({"live","inst","extra"}) do
|
||
|
os.setenv("PWD", fs.concat(outpath, v))
|
||
|
run(string.format("mtar -czv '%s/img/.%s.mtar.lss' *", outpath, v))
|
||
|
end
|
||
|
os.setenv("PWD",opwd)
|