diff options
Diffstat (limited to 'copy_jdk_configs.lua')
-rwxr-xr-x | copy_jdk_configs.lua | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/copy_jdk_configs.lua b/copy_jdk_configs.lua new file mode 100755 index 0000000..57b2592 --- /dev/null +++ b/copy_jdk_configs.lua @@ -0,0 +1,358 @@ +#!/usr/bin/lua +-- rpm call +-- debug=true lua -- copy_jdk_configs.lua --currentjvm "%{uniquesuffix %{nil}}" --jvmdir "%{_jvmdir %{nil}}" --origname "%{name}" --origjavaver "%{javaver}" --arch "%{_arch}" +--test call +-- debug=true lua -- copy_jdk_configs.lua --currentjvm "java-1.8.0-openjdk-1.8.0.65-3.b17.fc22.x86_64" --jvmdir "/usr/lib/jvm" --origname "java-1.8.0-openjdk" --origjavaver "1.8.0" --arch "x86_64" --jvmDestdir /home/jvanek/Desktop + +local M = {} + +if (os.getenv("debug") == "true") then + debug = true; +else + debug = false; +end + +local function debugOneLinePrint(string) + if (debug) then + print(string) + end ; +end + +function getPath(str, sep) + sep = sep or '/' + return str:match("(.*" .. sep .. ")") +end + +function splitToTable(source, pattern) + local i1 = string.gmatch(source, pattern) + local l1 = {} + for i in i1 do + table.insert(l1, i) + end + return l1 +end + +local function slurp(path) + local f = io.open(path) + local s = f:read("*a") + f:close() + return s +end + +function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +local function dirWithParents(path) + local s = "" + local dirs = splitToTable(path, "[^/]+") + for i, d in pairs(dirs) do + if (i == #dirs) then + break + end + s = s .. "/" .. d + local stat2 = posix.stat(s, "type"); + if (stat2 == nil) then + debugOneLinePrint(s .. " does not exists, creating") + if (not dry) then + posix.mkdir(s) + end + else + debugOneLinePrint(s .. " exists,not creating") + end + end +end + + +-- main function, +-- formelry main body +-- move to function resolved +-- https://bugzilla.redhat.com/show_bug.cgi?id=1892224 +-- for readability not indented, todo, indent once tuned + +function M.mainProgram(arg) + debugOneLinePrint("cjc: lua debug on") + local caredFiles = { "jre/lib/calendars.properties", + "jre/lib/content-types.properties", + "jre/lib/flavormap.properties", + "jre/lib/logging.properties", + "jre/lib/net.properties", + "jre/lib/psfontj2d.properties", + "jre/lib/sound.properties", + "jre/lib/deployment.properties", + "jre/lib/deployment.config", + "jre/lib/security/US_export_policy.jar", + "jre/lib/security/unlimited/US_export_policy.jar", + "jre/lib/security/limited/US_export_policy.jar", + "jre/lib/security/policy/unlimited/US_export_policy.jar", + "jre/lib/security/policy/limited/US_export_policy.jar", + "jre/lib/security/java.policy", + "jre/lib/security/java.security", + "jre/lib/security/local_policy.jar", + "jre/lib/security/unlimited/local_policy.jar", + "jre/lib/security/limited/local_policy.jar", + "jre/lib/security/policy/unlimited/local_policy.jar", + "jre/lib/security/policy/limited/local_policy.jar", + "jre/lib/security/nss.cfg", + "jre/lib/security/cacerts", + "jre/lib/security/blacklisted.certs", + "jre/lib/security/jssecacerts", + "jre/lib/security/trusted.certs", + "jre/lib/security/trusted.jssecerts", + "jre/lib/security/trusted.clientcerts", + "jre/lib/ext", + "jre/lib/security/blacklist", + "jre/lib/security/javaws.policy", + "jre/lib/security/nss.fips.cfg", + "lib/security", + "conf", + "lib/ext" } + + -- before import to allow run from spec + if (arg[1] == "--list") then + for i, file in pairs(caredFiles) do + print(file) + end + return 0; + end + + -- yum install lua-posix + local posix = require "posix" + + -- the one we are installing + local currentjvm = nil + local jvmdir = nil + local jvmDestdir = nil + local origname = nil + local origjavaver = nil + local arch = nil + local temp = nil; + local dry = false; + + for i = 1, #arg, 2 do + if (arg[i] == "--help" or arg[i] == "-h") then + print("all but jvmDestdir and debug are mandatory") + print(" --currentjvm") + print(" NVRA of currently installed java") + print(" --jvmdir") + print(" Directory where to find this kind of virtual machine. Generally /usr/lib/jvm") + print(" --origname") + print(" convinient switch to determine jdk. Generally java-1.X.0-vendor") + print(" --origjavaver") + print(" convinient switch to determine jdk's version. Generally 1.X.0") + print(" --arch") + print(" convinient switch to determine jdk's arch") + print(" --jvmDestdir") + print(" Migration/testing switch. Target Mostly same as jvmdir, but you may wont to copy ouside it.") + print(" --debug or $debug") + print(" Enables printing out whats going on. true/false. False by default") + print(" --temp") + print(" optional file to save intermediate result - directory configs were copied from") + print(" --dry") + print(" true/fase if true, then no changes will be written to disk except one tmp file. False by default") + print(" **** specil parasm ****") + print(" --list") + print(" if present on cmdline, list all cared files and exists") + os.exit(0) + end + if (arg[i] == "--currentjvm") then + currentjvm = arg[i + 1] + end + if (arg[i] == "--jvmdir") then + jvmdir = arg[i + 1] + end + if (arg[i] == "--origname") then + origname = arg[i + 1] + end + if (arg[i] == "--origjavaver") then + origjavaver = arg[i + 1] + end + if (arg[i] == "--arch") then + arch = arg[i + 1] + end + if (arg[i] == "--jvmDestdir") then + jvmDestdir = arg[i + 1] + end + if (arg[i] == "--debug") then + --no string, boolean, workaround + if (arg[i + 1] == "true") then + debug = true + end + end + if (arg[i] == "--dry") then + --no string, boolean, workaround + if (arg[i + 1] == "true") then + dry = true + end + end + if (arg[i] == "--temp") then + temp = arg[i + 1] + end + end + + if (jvmDestdir == nil) then + jvmDestdir = jvmdir + end + + if (debug) then + print("--currentjvm:"); + print(currentjvm); + print("--jvmdir:"); + print(jvmdir); + print("--jvmDestdir:"); + print(jvmDestdir); + print("--origname:"); + print(origname); + print("--origjavaver:"); + print(origjavaver); + print("--arch:"); + print(arch); + print("--debug:"); + print(debug); + end + + --trasnform substitute names to lua patterns + local name = string.gsub(string.gsub(origname, "%-", "%%-"), "%.", "%%.") + local javaver = string.gsub(origjavaver, "%.", "%%.") + + local jvms = { } + + debugOneLinePrint("started") + + foundJvms = posix.dir(jvmdir); + if (foundJvms == nil) then + debugOneLinePrint("no, or nothing in " .. jvmdir .. " exit") + return + end + + debugOneLinePrint("found " .. #foundJvms .. " jvms") + + for i, p in pairs(foundJvms) do + -- regex similar to %{_jvmdir}/%{name}-%{javaver}*%{_arch} bash command + if (string.find(p, name .. "%-" .. javaver .. ".*" .. arch) ~= nil) then + debugOneLinePrint("matched: " .. p) + if (currentjvm == p) then + debugOneLinePrint("this jdk is already installed. exiting lua script") + return + end ; + if (string.match(p, ".*-debug$")) then + print(p .. " matched but seems to be debug variant. Skipping") + else + table.insert(jvms, p) + end + else + debugOneLinePrint("NOT matched: " .. p) + end + end + + if (#jvms <= 0) then + debugOneLinePrint("no matching jdk in " .. jvmdir .. " exit") + return + end ; + + debugOneLinePrint("matched " .. #jvms .. " jdk in " .. jvmdir) + + --full names are like java-1.7.0-openjdk-1.7.0.60-2.4.5.1.fc20.x86_64 + table.sort(jvms, function(a, b) + -- version-sort + -- split on non word: . - + local l1 = splitToTable(a, "[^%.-]+") + local l2 = splitToTable(b, "[^%.-]+") + for x = 1, math.min(#l1, #l2) do + local l1x = tonumber(l1[x]) + local l2x = tonumber(l2[x]) + if (l1x ~= nil and l2x ~= nil) then + --if hunks are numbers, go with them + if (l1x < l2x) then + return true; + end + if (l1x > l2x) then + return false; + end + else + if (l1[x] < l2[x]) then + return true; + end + if (l1[x] > l2[x]) then + return false; + end + end + -- if hunks are equals then move to another pair of hunks + end + return a < b + + end) + + if (debug) then + print("sorted lsit of jvms") + for i, file in pairs(jvms) do + print(file) + end + end + + latestjvm = jvms[#jvms] + + if (temp ~= nil) then + src = jvmdir .. "/" .. latestjvm + debugOneLinePrint("temp declared as " .. temp .. " saving used dir of " .. src) + file = io.open(temp, "w") + file:write(src) + file:close() + end + + local readlinkOutput = os.tmpname() + + for i, file in pairs(caredFiles) do + local SOURCE = jvmdir .. "/" .. latestjvm .. "/" .. file + local DEST = jvmDestdir .. "/" .. currentjvm .. "/" .. file + debugOneLinePrint("going to copy " .. SOURCE) + debugOneLinePrint("to " .. DEST) + local stat1 = posix.stat(SOURCE, "type"); + if (stat1 ~= nil) then + debugOneLinePrint(SOURCE .. " exists") + dirWithParents(DEST) + -- Copy with -a to keep everything intact + local exe = "cp" .. " -ar " .. SOURCE .. " " .. DEST + local linkExe = "readlink" .. " -f " .. SOURCE .. " > " .. readlinkOutput + debugOneLinePrint("executing " .. linkExe) + os.remove(readlinkOutput) + os.execute(linkExe) + local link = trim(slurp(readlinkOutput)) + debugOneLinePrint(" ...link is " .. link) + if (not ((link) == (SOURCE))) then + debugOneLinePrint("WARNING link " .. link .. " where file " .. SOURCE .. " expected!") + debugOneLinePrint("Will try to copy link target rather then link itself!") + --replacing any NVRA by future NVRA (still execting to have NVRA for any multiple-installable targets + -- lua stubbornly consider dash as inteval. Replacing by dot to match X-Y more correct as X.Y rather then not at all + local linkDest = string.gsub(link, latestjvm:gsub("-", "."), currentjvm) + debugOneLinePrint("attempting to copy " .. link .. " to " .. linkDest) + if (link == linkDest) then + debugOneLinePrint("Those are identical files! Nothing to do!") + else + local exe2 = "cp" .. " -ar " .. link .. " " .. linkDest + dirWithParents(linkDest) + debugOneLinePrint("executing " .. exe2) + if (not dry) then + os.execute(exe2) + end + end + else + debugOneLinePrint("executing " .. exe) + if (not dry) then + os.execute(exe) + end + end + else + debugOneLinePrint(SOURCE .. " does not exists") + end + end + +end --unindented main function + +if (arg == nil) then + debugOneLinePrint("arg variable is nil, you have to call mainProgram manually") -- this can actually not be invoked, as the debug is set via arg +else + M.mainProgram(arg) +end + +return M |