Jeremy Cline 0310b31
#! /bin/bash
1469491
# shellcheck disable=SC2164
Jeremy Cline 0310b31
Jeremy Cline 0310b31
RpmDir=$1
Jeremy Cline 0310b31
ModDir=$2
Jeremy Cline 0310b31
Dir="$1/$2"
Jeremy Cline 0310b31
# Note the list filename must have the format mod-[PACKAGE].list, for example,
Jeremy Cline 0310b31
# mod-internal.list or mod-extra.list.  The PACKAGE is used to create a
Jeremy Cline 0310b31
# override directory for the modules.
Jeremy Cline 0310b31
List=$3
Jeremy Cline 0310b31
Dest="$4"
Jeremy Cline 0310b31
8bce7ff
blacklist()
Jeremy Cline 0310b31
{
8bce7ff
	cat > "$RpmDir/etc/modprobe.d/$1-blacklist.conf" <<-__EOF__
Jeremy Cline 0310b31
	# This kernel module can be automatically loaded by non-root users. To
8bce7ff
	# enhance system security, the module is blacklisted by default to ensure
Jeremy Cline 0310b31
	# system administrators make the module available for use as needed.
Jeremy Cline 0310b31
	# See https://access.redhat.com/articles/3760101 for more details.
Jeremy Cline 0310b31
	#
8bce7ff
	# Remove the blacklist by adding a comment # at the start of the line.
Jeremy Cline 0310b31
	blacklist $1
Jeremy Cline 0310b31
__EOF__
Jeremy Cline 0310b31
}
Jeremy Cline 0310b31
8bce7ff
check_blacklist()
Jeremy Cline 0310b31
{
1469491
	mod=$(find "$RpmDir/$ModDir" -name "$1")
Jeremy Cline 0310b31
	[ ! "$mod" ] && return 0
1469491
	if modinfo "$mod" | grep -q '^alias:\s\+net-'; then
Jeremy Cline 0310b31
		mod="${1##*/}"
Jeremy Cline 0310b31
		mod="${mod%.ko*}"
8bce7ff
		echo "$mod has an alias that allows auto-loading. Blacklisting."
8bce7ff
		blacklist "$mod"
Jeremy Cline 0310b31
	fi
Jeremy Cline 0310b31
}
Jeremy Cline 0310b31
Jeremy Cline 0310b31
find_depends()
Jeremy Cline 0310b31
{
Jeremy Cline 0310b31
	dep=$1
1469491
	depends=$(modinfo "$dep" | sed -n -e "/^depends/ s/^depends:[ \t]*//p")
Jeremy Cline 0310b31
	[ -z "$depends" ] && exit
Jeremy Cline 0310b31
	for mod in ${depends//,/ }
Jeremy Cline 0310b31
	do
Jeremy Cline 0310b31
		match=$(grep "^$mod.ko" "$ListName")
Jeremy Cline 0310b31
		[ -z "$match" ] && continue
Jeremy Cline 0310b31
		# check if the module we are looking at is in mod-* too.
Jeremy Cline 0310b31
		# if so we do not need to mark the dep as required.
1469491
		mod2=${dep##*/}  # same as $(basename $dep), but faster
Jeremy Cline 0310b31
		match2=$(grep "^$mod2" "$ListName")
Jeremy Cline 0310b31
		if [ -n "$match2" ]
Jeremy Cline 0310b31
		then
Jeremy Cline 0310b31
			#echo $mod2 >> notreq.list
Jeremy Cline 0310b31
			continue
Jeremy Cline 0310b31
		fi
1469491
		echo "$mod".ko >> req.list
Jeremy Cline 0310b31
	done
Jeremy Cline 0310b31
}
Jeremy Cline 0310b31
Jeremy Cline 0310b31
foreachp()
Jeremy Cline 0310b31
{
Jeremy Cline 0310b31
	P=$(nproc)
Jeremy Cline 0310b31
	bgcount=0
1469491
	while read -r mod; do
Jeremy Cline 0310b31
		$1 "$mod" &
Jeremy Cline 0310b31
Jeremy Cline 0310b31
		bgcount=$((bgcount + 1))
1469491
		if [ $bgcount -eq "$P" ]; then
Jeremy Cline 0310b31
			wait -n
Jeremy Cline 0310b31
			bgcount=$((bgcount - 1))
Jeremy Cline 0310b31
		fi
Jeremy Cline 0310b31
	done
Jeremy Cline 0310b31
Jeremy Cline 0310b31
	wait
Jeremy Cline 0310b31
}
Jeremy Cline 0310b31
Jeremy Cline 0310b31
# Destination was specified on the command line
Jeremy Cline 0310b31
test -n "$4" && echo "$0: Override Destination $Dest has been specified."
Jeremy Cline 0310b31
1469491
pushd "$Dir"
Jeremy Cline 0310b31
1469491
OverrideDir=$(basename "$List")
Jeremy Cline 0310b31
OverrideDir=${OverrideDir%.*}
Jeremy Cline 0310b31
OverrideDir=${OverrideDir#*-}
1469491
mkdir -p "$OverrideDir"
Jeremy Cline 0310b31
Jeremy Cline 0310b31
rm -rf modnames
Jeremy Cline 0310b31
find . -name "*.ko" -type f > modnames
Jeremy Cline 0310b31
# Look through all of the modules, and throw any that have a dependency in
Jeremy Cline 0310b31
# our list into the list as well.
Jeremy Cline 0310b31
rm -rf dep.list dep2.list
Jeremy Cline 0310b31
rm -rf req.list req2.list
Jeremy Cline 0310b31
touch dep.list req.list
Jeremy Cline 0310b31
cp "$List" .
Jeremy Cline 0310b31
Jeremy Cline 0310b31
# This variable needs to be exported because it is used in sub-script
Jeremy Cline 0310b31
# executed by xargs
1469491
ListName=$(basename "$List")
1469491
export ListName
Jeremy Cline 0310b31
Jeremy Cline 0310b31
foreachp find_depends < modnames
Jeremy Cline 0310b31
Jeremy Cline 0310b31
sort -u req.list > req2.list
Jeremy Cline 0310b31
sort -u "$ListName" > modules2.list
Jeremy Cline 0310b31
join -v 1 modules2.list req2.list > modules3.list
Jeremy Cline 0310b31
1469491
while IFS= read -r mod
Jeremy Cline 0310b31
do
1469491
    # get the path for the module
1469491
    modpath=$(grep /"$mod" modnames)
1469491
    [ -z "$modpath" ] && continue
1469491
    echo "$modpath" >> dep.list
1469491
done < modules3.list
Jeremy Cline 0310b31
Jeremy Cline 0310b31
sort -u dep.list > dep2.list
Jeremy Cline 0310b31
Jeremy Cline 0310b31
if [ -n "$Dest" ]; then
1469491
    # now move the modules into the $Dest directory
1469491
    while IFS= read -r mod
1469491
    do
1469491
	newpath=$(dirname "$mod" | sed -e "s/kernel\\//$Dest\//")
1469491
	mkdir -p "$newpath"
1469491
	mv "$mod" "$newpath"
1469491
	echo "$mod" | sed -e "s/kernel\\//$Dest\//" | sed -e "s|^.|${ModDir}|g" >> "$RpmDir"/"$ListName"
1469491
    done < dep2.list
Jeremy Cline 0310b31
fi
Jeremy Cline 0310b31
Jeremy Cline 0310b31
popd
Jeremy Cline 0310b31
Jeremy Cline 0310b31
# If we're signing modules, we can't leave the .mod files for the .ko files
Jeremy Cline 0310b31
# we've moved in .tmp_versions/.  Remove them so the Kbuild 'modules_sign'
Jeremy Cline 0310b31
# target doesn't try to sign a non-existent file.  This is kinda ugly, but
Jeremy Cline 0310b31
# so are the modules-* packages.
Jeremy Cline 0310b31
1469491
while IFS= read -r mod
Jeremy Cline 0310b31
do
1469491
  modfile=$(basename "$mod" | sed -e 's/.ko/.mod/')
1469491
  rm .tmp_versions/"$modfile"
1469491
done < "$Dir"/dep2.list
Jeremy Cline 0310b31
1469491
if [ -z "$Dest" ]; then
1469491
	sed -e "s|^.|${ModDir}|g" "$Dir"/dep2.list > "$RpmDir/$ListName"
Jeremy Cline 0310b31
	echo "./$RpmDir/$ListName created."
Jeremy Cline 0310b31
	[ -d "$RpmDir/etc/modprobe.d/" ] || mkdir -p "$RpmDir/etc/modprobe.d/"
8bce7ff
	foreachp check_blacklist < "$List"
Jeremy Cline 0310b31
fi
Jeremy Cline 0310b31
Jeremy Cline 0310b31
# Many BIOS-es export a PNP-id which causes the floppy driver to autoload
Jeremy Cline 0310b31
# even though most modern systems don't have a 3.5" floppy driver anymore
Jeremy Cline 0310b31
# this replaces the old die_floppy_die.patch which removed the PNP-id from
Jeremy Cline 0310b31
# the module
1469491
dd59893
floppylist=("$RpmDir"/"$ModDir"/kernel/drivers/block/floppy.ko*)
1469491
if [[ -n ${floppylist[0]} && -f ${floppylist[0]} ]]; then
8bce7ff
     blacklist "floppy"
Jeremy Cline 0310b31
fi
Jeremy Cline 0310b31
Jeremy Cline 0310b31
# avoid an empty kernel-extra package
1469491
echo "$ModDir/$OverrideDir" >> "$RpmDir/$ListName"
Jeremy Cline 0310b31
1469491
pushd "$Dir"
Jeremy Cline 0310b31
rm modnames dep.list dep2.list req.list req2.list
Jeremy Cline 0310b31
rm "$ListName" modules2.list modules3.list
Jeremy Cline 0310b31
popd