#!/usr/bin/sh
#----------------------------------------------------------------------------
# /home/holbru/svneis/eis/trunk/security/ktls-utils/_ADMIN/ktls-utils-folder.sh - create ktls-utils folder
#
# Creation   :  2026-01-22 holbru
# Last update:  $Id$
#
# Copyright (c) 2026-@@YEAR@@ Holger Bruenjes, holgerbruenjes(at)gmx(dot)net
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
#
# usage
# ktls-utils-folder.sh
#                -v, --version       set package version
#                -w, --work          [create|add|list]
#                -p, --package       [optional] if multi binarie package
#
#                -m64                create eisfair-64 folder
#
# Example:  ktls-utils-folder.sh -v 1.2.16 -w create
#
#----------------------------------------------------------------------------

#exec 2> ktls-utils-folder-trace$$.log
#set -x


# ---------------------------------------------------------------------------
# create folder
# ---------------------------------------------------------------------------
create_folder()
{
    local version="$(echo ${1} | tr '.-' '_')"
    local build=${2}
    local package=${3}

    case ${build} in
    *-dev)
        bin_folder="${build%-dev}_dev dev"
        folder_list="${package:-${build}}"
        ;;
    *-static)
        bin_folder="${build%-dev-static}_dev_static static"
        folder_list="${package:-${build}}"
        ;;
    *)
        bin_folder="${build} main"
        folder_list="${package:-${build}}"
        ;;
    esac

    main="_ADMIN
          usr/sbin"

    dev="_ADMIN
         usr/lib${eis_version}
         usr/include"

    static="_ADMIN
            usr/lib${eis_version}"


    echo "${bin_folder}" |
    while read folder subfolder
    do
        folder=$(echo ${folder} | tr '.-' '_')

        if [ -d ../${eis_bin}bin_${folder}:${version} ]
        then
            echo "  ../${eis_bin}bin_${folder}:${version} already exist, creation aborted." >&2
            exit 1
        else
            mkdir -p -m 0755 ../${eis_bin}bin_${folder}:${version}

            for f in $(eval "echo \$${subfolder}")
            do
            mkdir -p -m 0755 ../${eis_bin}bin_${folder}:${version}/${f}
            done

            # create empty files.list
            touch ../${eis_bin}bin_${folder}:${version}/_ADMIN/${folder_list}-files.txt
        fi
    done
}

#----------------------------------------------------------------------------
# add folder
#----------------------------------------------------------------------------
add_folder()
{
    local version="$(echo ${1} | tr '.-' '_')"
    local build=${2}
    local package=${3}

    case ${build} in
    *-dev)
        bin_folder="${build%-dev}_dev dev"
        folder_list="${package:-${build}}"
        ;;
    *-static)
        bin_folder="${build%-dev-static}_dev_static static"
        folder_list="${package:-${build}}"
        ;;
    *)
        bin_folder="${build} main"
        folder_list="${package:-${build}}"
        ;;
    esac

    echo "${bin_folder}" |
    while read folder subfolder
    do
        folder=$(echo ${folder} | tr '.-' '_')

        # Strip ELF binaries
        for filename in $(find ../${eis_bin}bin_${folder}:${version} \
            -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) \
            -exec file {} \; |
            grep -v "^../bin_${folder}:${version}/\?usr/lib/debug" |
            grep -v ' shared object,' |
            grep -v '/lib/modules/' |
            sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped/\1/p')
        do
            echo "Strip: ${filename}"
            if echo "${filename}" | grep -q '\.so'
            then
                strip --strip-unneeded "${filename}"
                chmod 0644 "${filename}"
            else
                strip -R .note -R .comment "${filename}"
            fi
        done

        # Strip ELF shared objects
        # Please note we don't restrict our search to executable files because
        # our libraries are not (should not be, at least) +x.
        for filename in $(find ../${eis_bin}bin_${folder}:${version} \
            -type f -a \
            -exec file {} \; |
            grep -v "^../bin_${folder}:${version}/\?usr/lib/debug" |
            grep ' shared object,' |
            sed -n -e 's/^\(.*\):[  ]*ELF.*, not stripped/\1/p')
        do
            echo "Strip: ${filename}"
            strip --strip-unneeded "${filename}"
            if echo "${filename}" | grep -q '\.so'
            then
                chmod 0644 "${filename}"
            fi
        done

        if ! "${no_checkin:-false}"
        then
            svn -q add --force ../${eis_bin}bin_${folder}:${version}

            svn -q propset svn:keywords "Id" ../${eis_bin}bin_${folder}:${version}/_ADMIN/${folder_list}-files.txt
            svn -q propset svn:eol-style "native" ../${eis_bin}bin_${folder}:${version}/_ADMIN/${folder_list}-files.txt
        fi
    done
}

# ---------------------------------------------------------------------------
# list folder
# ---------------------------------------------------------------------------
list_folder()
{
    local version="$(echo ${1} | tr '.-' '_')"
    local build=${2}
    local package=${3}

    case ${build} in
    *-dev)
        bin_folder="${build%-dev}_dev dev"
        folder_list="${package:-${build}}"
        ;;
    *-static)
        bin_folder="${build%-dev-static}_dev_static static"
        folder_list="${package:-${build}}"
        ;;
    *)
        bin_folder="${build} main"
        folder_list="${package:-${build}}"
        ;;
    esac

    package_path=$(pwd | sed 's|^.*/trunk/||; s|_ADMIN||')

    echo "${bin_folder}" |
    while read folder subfolder
    do
        folder=$(echo ${folder} | tr '.-' '_')

        admin_dir="../../../_ADMIN"

        ${admin_dir}/create-list.sh -f -q -p ${eis_bin}bin_${folder}:${version} ${eis_script}${folder_list}

        rm -f ../${eis_bin}bin_${folder}:${version}/_ADMIN/${folder_list}-files.txt.backup

        if  "${no_checkin:-false}" &&
           [ -f ${admin_dir}/_user.copy_dir ]
        then
            . ${admin_dir}/_user.copy_dir
        fi
    done
}

# ---------------------------------------------------------------------------
# main
# ---------------------------------------------------------------------------

work=''           # create|add|list
version=''
package=''
eis_bin=''
eis_script=''
no_checkin=false

usage()
{
cat <<EOF

 Usage:
 ${0}
         -v, --version   set library version
         -w, --work      [create|add|list]
                         create  ->  the folder and files
                         add     ->  svn add folder and files set props
                         list    ->  create-list.sh work in this place-
          -p, --package  [optional] if multi binarie package

          -m64           create eisfair-64 folder

 Example:  ${0}-folder.sh -v 1.2.16 -w create

EOF
}


case ${#} in
    0)
        usage
        exit 1
    ;;
esac



### read parameters
while [ $# -ne 0 ]
do
    case ${1} in
    -v|--version)
        version="${2}"
        shift; shift
        ;;
    -w|--work)
        work="${2}"
        shift; shift
        ;;
    -p|--package)
        package="${2}"
        shift; shift
        ;;
    -m64)
        eis_version='64'
        eis_bin='eis64_'
        eis_script='eis64+'
        shift
        ;;
    *)
        usage
        exit 1
        ;;
    esac
done

if [ -z "${version}" ]
then
    echo
    echo "No version is given, ship aborted!"
    usage

    exit 1
fi

if [ -f ./no_checkin ]
then
    no_checkin=true
fi


folder_create=$(cat ./package-list | grep -v '^#')

case ${work} in
    create)
        for build in ${folder_create}
        do
            create_folder "${version}" "${build}" ${package}
        done
        ;;

    add)
        for build in ${folder_create}
        do
            add_folder "${version}" "${build}" ${package}
        done
        ;;

    list)
        for build in ${folder_create}
        do
            list_folder "${version}" "${build}" ${package}
        done
        ;;

    *)
        echo "only  '-w create|add|list' allowed"
        ;;
esac


# ---------------------------------------------------------------------------
# end
# ---------------------------------------------------------------------------
