From 7e109deb2ce1754ef2677e62cd4628da2522ee32 Mon Sep 17 00:00:00 2001
From: MSVSphere Packaging Team <packager@msvsphere-os.ru>
Date: Tue, 26 Nov 2024 15:45:39 +0300
Subject: [PATCH] import copy-jdk-configs-4.1-6.el10

---
 .copy-jdk-configs.metadata           |   0
 .gitignore                           |   0
 SOURCES/LICENSE                      |  14 ++
 SOURCES/copy_jdk_configs.lua         | 358 +++++++++++++++++++++++++++
 SOURCES/copy_jdk_configs_fixFiles.sh | 281 +++++++++++++++++++++
 SPECS/copy-jdk-configs.spec          | 209 ++++++++++++++++
 6 files changed, 862 insertions(+)
 create mode 100644 .copy-jdk-configs.metadata
 create mode 100644 .gitignore
 create mode 100644 SOURCES/LICENSE
 create mode 100755 SOURCES/copy_jdk_configs.lua
 create mode 100755 SOURCES/copy_jdk_configs_fixFiles.sh
 create mode 100644 SPECS/copy-jdk-configs.spec

diff --git a/.copy-jdk-configs.metadata b/.copy-jdk-configs.metadata
new file mode 100644
index 0000000..e69de29
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/SOURCES/LICENSE b/SOURCES/LICENSE
new file mode 100644
index 0000000..fa6a936
--- /dev/null
+++ b/SOURCES/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2015 Red Hat inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms are permitted
+provided that the above copyright notice and this paragraph are
+duplicated in all such forms and that any documentation,
+advertising materials, and other materials related to such
+distribution and use acknowledge that the software was developed
+by the Red Hat inc. The name of the Red Hat inc. may not be used
+to endorse or promote products derived from this software without
+specific prior written permission. THIS SOFTWARE IS PROVIDED
+``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/SOURCES/copy_jdk_configs.lua b/SOURCES/copy_jdk_configs.lua
new file mode 100755
index 0000000..57b2592
--- /dev/null
+++ b/SOURCES/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
diff --git a/SOURCES/copy_jdk_configs_fixFiles.sh b/SOURCES/copy_jdk_configs_fixFiles.sh
new file mode 100755
index 0000000..2e5d603
--- /dev/null
+++ b/SOURCES/copy_jdk_configs_fixFiles.sh
@@ -0,0 +1,281 @@
+#!/bin/bash
+config=$1
+target=$2
+
+debug(){
+  if [ "x$debug" == "xtrue" ] ; then
+    echo "$@"
+  fi
+}
+
+debug "cjc: bash debug is on"
+
+isJavaConfig() {
+  local arg="${1}"
+  local relpath=`realpath -s $arg`
+  local realink=`readlink -f $arg`
+  if [[  ${relpath} = /usr/lib/jvm/java* || ${relpath} = /etc/java/java* ]] ; then
+    if [[  ${realink} = /usr/lib/jvm/java* || ${realink} = /etc/java/java* ]] ; then
+        debug "$arg / ${relpath} / ${realink} is correct jdk folder"
+      return 0
+    fi
+  fi
+  debug "$arg / ${relpath} / ${realink} is not jdk folder, file/dir should be skipped"
+  return 1
+}
+
+cmdvDebug() {
+  if [ "x$debug" == "xtrue" ] ; then
+    "$@" -v
+  else
+    "$@" 1>/dev/null 2>&1
+  fi
+}
+
+mvDebug() {
+  cmdvDebug mv "$@"
+}
+
+rmDebug() {
+  local switch=""
+  for x in "$@" ; do 
+    if [[ $x == -* ]] ; then
+      switch="$switch $x"
+    elif isJavaConfig "$x" ; then
+      cmdvDebug rm $switch "$x"
+    fi
+  done
+}
+
+rmdirDebug() {
+  local switch=""
+  for x in "$@" ; do 
+    if [[ $x == -* ]] ; then
+      switch="$switch $x"
+    elif isJavaConfig "$x" ; then
+      cmdvDebug rmdir $switch "$x"
+    fi
+  done
+}
+
+#we should be pretty strict about removing once used (even "used" [with fail]) config file, as it may corrupt another installation
+clean(){
+  debug "cleanup: removing $config"
+  if [ "x$debug" == "xtrue" ] ; then
+   rm -rf $config -v
+  else
+   rm -rf $config 1>/dev/null 2>&1
+  fi
+}
+
+if [ "x" == "x$config" ] ; then
+  debug "no config file specified"
+  exit 1
+fi
+
+if [ ! -f  "$config" ] ; then
+  debug "$config file do not exists"
+  # expected case, when no migration happened
+  exit 0
+fi 
+
+if [ "x" == "x$target" ] ; then
+  debug "no target dir specified"
+  clean
+  exit 2
+fi
+
+if [ ! -d  "$target" ] ; then
+  debug "$target is not directory"
+  clean
+  exit 22
+fi 
+
+source=`cat $config` 
+
+if [ "x" == "x$source" ] ; then
+  debug "no information in $config"
+  clean
+  exit 3
+fi
+
+if [ ! -d  "$source" ] ; then
+  debug "$source from $config is not directory"
+  clean
+  exit 33
+fi 
+
+
+listLinks(){
+  find $1 -type l -print0 | xargs -0 ls -ld | sed "s; \+-> \+;_->_;g" | sed "s;.* $1;$1;"
+}
+
+printIfExists(){
+  if [ -e $ffileCandidate ] ; then
+    echo $1
+  else
+    # stdout can be captured, therefore stderr
+    debug "skipping not-existing link-target-dir $1" 1>&2
+  fi
+}
+
+createListOfLinksTargetsDirectories(){
+  pushd $source >/dev/null 2>&1 
+    local links=`listLinks $1`
+    for x in $links ; do 
+      echo "$x" | grep "jre-abrt" > /dev/null
+      if [ $? -eq 0 ] ; then
+        continue
+      fi
+      local ffileCandidate=$(echo $x | sed "s/.*_->_//") ;
+# ignoring relative paths as they may lead who know where later   
+# there can be simlink relative to position, so push is not catching all
+      if [ "$ffileCandidate" != "${ffileCandidate#/}" ] ; then
+        if [ -d $ffileCandidate ] ; then
+# should we accept the links to directories themselves?
+          printIfExists $ffileCandidate
+        else
+          printIfExists `dirname $ffileCandidate`
+        fi
+      fi
+    done | sort | uniq
+  popd >/dev/null 2>&1 
+}
+
+sourceLinks=`listLinks $source`
+targetLinks=`listLinks $target`
+sourceLinksDirsTarget=`createListOfLinksTargetsDirectories  $source`
+targetLinksDirsTarget=`createListOfLinksTargetsDirectories  $target`
+
+debug "source: $source"
+debug "target: $target"
+
+debug "sourceLinks:
+$sourceLinks"
+debug "targetLinks:
+$targetLinks"
+
+debug "sourceLinksDirsTarget:
+$sourceLinksDirsTarget"
+debug "targetLinksDirsTarget:
+$targetLinksDirsTarget"
+
+sourceSearchPath="$source $sourceLinksDirsTarget"
+targetSearchPath="$target $targetLinksDirsTarget"
+
+work(){
+  if [ "X$1" == "Xrpmnew" -o "X$1" == "Xrpmorig" ] ; then
+    debug "Working with $1 (1)"
+  else
+    debug "unknown parameter: $1"
+    return 1
+  fi
+
+  local files=`find $targetSearchPath | grep "\\.$1$"`
+  for file in $files ; do
+    local sf1=`echo $file | sed "s/\\.$1$//"`
+    local sf2=`echo $sf1 | sed "s/$targetName/$srcName/"`
+    # was file modified in origianl installation?
+    rpm -Vf $source | grep -q $sf2
+    if [ $? -gt 0 ] ; then
+     if [ "X$1" == "Xrpmnew" ] ; then
+       debug "$sf2 was NOT modified, removing possibly corrupted $sf1 and renaming from $file"
+       mvDebug -f $file $sf1
+       if [ $? -eq 0 ] ; then
+         echo "restored $file to $sf1"
+       else
+         debug "FAILED to restore $file to $sf1"
+       fi
+    fi
+     if [ "X$1" == "Xrpmorig" ] ; then
+       debug "$sf2 was NOT modified, removing possibly corrupted $file"
+       rmDebug $file
+    fi
+    else
+     debug "$sf2 was modified, keeping $file, and removing the duplicated original"
+     # information is now backuped, in new directory anyway. Removing future rpmsave to allow rpm -e
+     rmDebug -f $sf2
+     # or its corresponding backup
+     rmDebug -f $sf2.$1
+    fi
+done
+}
+
+
+srcName=`basename $source`
+targetName=`basename $target`
+
+work rpmnew
+work rpmorig
+
+debug "Working with rpmorig (2)"
+# simply moving old rpmsaves to new dir
+# fix for config (replace) leftovers
+files=`find $sourceSearchPath | grep "\\.rpmorig$"`
+  for file in $files ; do
+    rpmsaveTarget=`echo $file | sed "s/$srcName/$targetName/"`
+    debug "relocating $file to $rpmsaveTarget"
+    if [ -e $rpmsaveTarget ] ; then
+      rmDebug $file
+    else
+      mvDebug $file $rpmsaveTarget
+    fi
+  done
+
+debug "Working with rpmsave (1)"
+files=`find $sourceSearchPath | grep "\\.rpmsave$"`
+  for file in $files ; do
+    rpmsaveTarget=`echo $file | sed "s/$srcName/$targetName/"`
+    debug "relocating $file to $rpmsaveTarget"
+    if [ -e $rpmsaveTarget ] ; then
+      rmDebug $file
+    else
+      mvDebug $file $rpmsaveTarget
+    fi
+  done
+
+
+#warning: file /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64-debug/jre/lib/applet: remove failed: No such file or directory
+#warning: file /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64-debug/jre/lib/amd64/client: remove failed: No such file or directory
+#warning: file /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64/jre/lib/amd64/xawt: remove failed: No such file or directory
+#those dirs might be mepty by installtion, filling to not be rmeoved later
+#use exported CJC_BLACKDIRS_ADD to extend it in runtime/spec file
+blackdirs=""
+internal_blackdirs="jre/lib/applet jre/lib/*/client jre/lib/locale/*/LC_MESSAGES jre/lib/*/xawt jre/javaws properties/version properties jre/lib/endorsed jre/lib/boot lib/missioncontrol/p2/org.eclipse.equinox.p2.engine/profileRegistry/JMC.profile/.data"
+for x in $internal_blackdirs $CJC_BLACKDIRS_ADD ; do 
+  blackdirs="$blackdirs $source/$x"
+done
+
+for blackdir in $blackdirs; do
+  if [ -e $blackdir ] ; then
+    debug "nasty $blackdir  exists, filling"
+    touch $blackdir/C-J-C_placeholder
+  else
+    debug "nasty $blackdir  DONT exists, ignoring"
+  fi
+done
+
+debug "cleaning legacy leftowers"
+if [ "x$debug" == "xtrue" ] ; then
+  emptyCandidates=`find $sourceSearchPath -empty -type d`
+else
+  emptyCandidates=`find $sourceSearchPath -empty -type d 2>/dev/null`
+fi
+if [ ! "x$emptyCandidates" == "x" ] ; then
+  rmdirDebug $emptyCandidates
+fi
+rmdirDebug $sourceSearchPath
+
+# and remove placeholders
+for blackdir in $blackdirs; do
+  if [ -e $blackdir ] ; then
+    debug "nasty $blackdir  exists, cleaning placeholder"
+    rmDebug $blackdir/C-J-C_placeholder
+  else
+    debug "nasty $blackdir  DONT exists, ignoring again"
+  fi
+done
+
+clean
+
+exit 0
diff --git a/SPECS/copy-jdk-configs.spec b/SPECS/copy-jdk-configs.spec
new file mode 100644
index 0000000..fba94e6
--- /dev/null
+++ b/SPECS/copy-jdk-configs.spec
@@ -0,0 +1,209 @@
+%global project copy_jdk_configs
+%global file %{project}.lua
+%global fixFile %{project}_fixFiles.sh
+%global rpm_state_dir %{_localstatedir}/lib/rpm-state
+
+Name:    copy-jdk-configs
+
+# hash relevant to version tag
+%global  htag 88d3ed89f30d8b0eb4877d860fa8d951f224f156
+Version: 4.1
+Release: 6%{?dist}
+Summary: JDKs configuration files copier
+
+License:  BSD
+URL:      https://pagure.io/%{project}
+Source0:  %{URL}/blob/%{htag}/f/%{file}
+Source1:  %{URL}/blob/%{htag}/f/LICENSE
+Source2:  %{URL}/blob/%{htag}/f/%{fixFile}
+
+# we need to duplicate msot of the percents in that script so they survive rpm expansion (even in that sed they have to be duplicated)
+%global pretrans_install %(cat %{SOURCE0} | sed s/%%/%%%%/g | sed s/\\^%%%%/^%%/g) 
+
+BuildArch: noarch
+
+Requires: lua
+Requires: lua-posix
+# rh1965305 - copy-jdk-configs script uses find and xargs but RPM does not depend on them
+Requires: findutils
+OrderWithRequires: findutils
+
+%description
+Utility script to transfer JDKs configuration files between updates or for
+archiving. With script to fix incorrectly created rpmnew files
+
+%prep
+cp -a %{SOURCE1} .
+
+
+%build
+#blob
+
+%pretrans -p <lua>
+function createPretransScript()
+-- the sript must be available during pretrans, so multiply it to tmp
+  os.execute("mkdir -p %{rpm_state_dir}")
+  temp_path="%{rpm_state_dir}/%{file}"
+-- print("generating " .. temp_path)
+  file = io.open(temp_path, "w")
+  file:write([[%{pretrans_install}]])
+  file:close()
+end
+
+-- in netinst, the above call may fail. pcall should save instalation (as there is nothing to copy anyway)
+-- https://bugzilla.redhat.com/show_bug.cgi?id=1295701
+-- todo, decide whether to check for {rpm_state_dir} and skip on not-existing, or keep creating
+if pcall(createPretransScript) then
+-- ok
+else
+--  print("Error running %{name} pretrans.")
+end
+
+%install
+mkdir -p $RPM_BUILD_ROOT/%{_libexecdir}
+cp -a %{SOURCE0} $RPM_BUILD_ROOT/%{_libexecdir}/%{file}
+cp -a %{SOURCE2} $RPM_BUILD_ROOT/%{_libexecdir}/%{fixFile}
+
+%posttrans
+# remove file created in pretrans
+# echo "removing %{rpm_state_dir}/%{file}" || :
+rm "%{rpm_state_dir}/%{file}" 2> /dev/null || :
+
+%files 
+%{_libexecdir}/%{file}
+%{_libexecdir}/%{fixFile}
+%license LICENSE
+
+%changelog
+* Tue Nov 26 2024 MSVSphere Packaging Team <packager@msvsphere-os.ru> - 4.1-6
+- Rebuilt for MSVSphere 10
+
+* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 4.1-6
+- Bump release for June 2024 mass rebuild
+
+* Wed Jan 24 2024 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
+* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
+* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
+
+* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
+
+* Thu Sep 29 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-1
+- update to attempt to solve bug which could delete empty dirs in /etc
+
+* Wed Sep 28 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.1-0
+- update to attempt to solve bug which could delete empty dirs in /etc
+
+* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
+
+* Wed Jan 19 2022 Fedora Release Engineering <releng@fedoraproject.org> - 4.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
+
+* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
+
+* Tue Jun 08 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.0-1
+- added requires and orderWithRequires of findutils to provide find and xargs (rh1965305)
+
+* Thu Apr 29 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.0-0
+- bumped to 4.0 to resolve remvoed rpm 4.17 removing arg from global table
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-8
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Tue Jun 30 2020 Andrew Hughes <gnu.andrew@redhat.com> - 3.7-6
+- Rebuilt for lua 5.4.0.
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.7-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Wed May 02 2018 Jiri Vanek <jvanek@redhat.com> - 3.7-1
+- udpated to latst relase
+- configurable blacklist
+- listed all java keystores
+
+* Wed May 02 2018 Jiri Vanek <jvanek@redhat.com> - 3.3-12
+- blackidrs put on single line
+
+* Wed May 02 2018 Jiri Vanek <jvanek@redhat.com> - 3.3-11
+- added more files to balcklist based on oralce and ibm jdks
+
+* Mon Apr 30 2018 Jiri Vanek <jvanek@redhat.com> - 3.3-10
+- added javaws.policy and blacklist
+
+* Tue Apr 03 2018 Jiri Vanek <jvanek@redhat.com> - 3.3-5
+- fixed rhbz#1541838
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Wed Oct 18 2017 Jiri Vanek <jvanek@redhat.com> - 3.3-2
+- added another subdirs for policies files
+
+* Wed Oct 18 2017 Jiri Vanek <jvanek@redhat.com> - 3.3-1
+- handled new paths for policies files
+
+* Thu Oct 05 2017 Jiri Vanek <jvanek@redhat.com> - 3.1-1
+- moved to newest release 3.1 whcih conf and lib/security as directories
+
+* Thu Oct 05 2017 Jiri Vanek <jvanek@redhat.com> - 3.0-1
+- moved to newest release 3.0 whcih support linked configs
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 2.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Wed Feb 22 2017 Fedora Release Engineering <releng@fedoraproject.org> - 2.2.3
+- updated to latest head
+
+* Wed Feb 22 2017 Fedora Release Engineering <releng@fedoraproject.org> - 2.2.2
+- added "jre/lib/security/blacklisted.certs" to cared files
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 2.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Fri Feb 03 2017 Jiri Vanek <jvanek@redhat.com> - 2.1-1
+- moved to newest release 2.1
+
+* Fri Jan 20 2017 Jiri Vanek <jvanek@redhat.com> - 2.0-1
+- moved to new upstream at pagure.io
+- moved to newest release 2.0
+- added new script of copy_jdk_configs_fixFiles.sh 
+- copy_jdk_configs.lua  aligned to it
+
+* Tue Aug 09 2016 Jiri Vanek <jvanek@redhat.com> - 1.2-1
+- updated to 1,3 which fixing nss minor issue
+
+* Tue Jul 12 2016 Jiri Vanek <jvanek@redhat.com> - 1.1-5
+- posttrans silenced, the error is appearing only in state, when there is nothing to copy
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Fri Jan 08 2016 Jiri Vanek <jvanek@redhat.com> - 1.1-3
+- pretrasn lua call now done in pcall (protected call)
+- also posttrans now always return 0
+
+* Wed Dec 16 2015 Jiri Vanek <jvanek@redhat.com> - 1.1-2
+- package now "installs" also during pretrans, so pretrasn scripts can use it
+- pretrasn "install" is removed in postrans
+
+* Wed Nov 25 2015 Jiri Vanek <jvanek@redhat.com> - 1.1-1
+- initial package