filesystem/filesystem.spec
Zbigniew Jędrzejewski-Szmek c874ad66ba Disable sbin-merge changes
%bcond merged_sbin is added, with a default of 0.

With the default state, the spec file should behave identically to the version
before any changes related to the sbin merge we started. (In the pretrans
scriptlet, the order of mkdirs is different, but that shouldn't matter.)
2024-07-17 09:29:50 +02:00

513 lines
14 KiB
RPMSpec

%bcond merged_sbin 0
Summary: The basic directory layout for a Linux system
Name: filesystem
Version: 3.18
Release: %autorelease
License: LicenseRef-Fedora-Public-Domain
URL: https://pagure.io/filesystem
Source1: https://pagure.io/filesystem/raw/master/f/lang-exceptions
Source2: iso_639.sed
Source3: iso_3166.sed
Source4: sbin-filenames
BuildRequires: iso-codes
Requires(pre): setup
Provides: filesystem-afs = %{version}-%{release}
Obsoletes: filesystem-afs <= 3.14-2
%if %{with merged_sbin}
# A virtual provides that packages can use to make sure that the
# symlinks from /usr/sbin/foo to /usr/bin/foo will be automatically
# created (if /usr/sbin is not a symlink itself).
Provides: filesystem(unmerged-sbin-symlinks) = 1
%endif
# This is needed for rpm-4.20
%global debug_package %{nil}
%description
The filesystem package is one of the basic packages that is installed
on a Linux system. Filesystem contains the basic directory layout
for a Linux operating system, including the correct permissions for
the directories.
%package content
Summary: Directory ownership content of the filesystem package
License: Public Domain
%description content
This subpackage of filesystem package contains just the file with
the directories owned by the filesystem package. This can be used
during the build process instead of calling rpm -ql filesystem.
%prep
rm -f $RPM_BUILD_DIR/filelist
%build
%install
rm -rf %{buildroot}
mkdir %{buildroot}
install -p -c -m755 %SOURCE2 %{buildroot}/iso_639.sed
install -p -c -m755 %SOURCE3 %{buildroot}/iso_3166.sed
cd %{buildroot}
Paths=(
afs boot dev \
etc/{X11/{applnk,fontpath.d,xinit/{xinitrc,xinput}.d},xdg/autostart,opt,pm/{config.d,power.d,sleep.d},skel,sysconfig,keys/ima,pki,bash_completion.d,rwtab.d,statetab.d} \
home media mnt opt root run srv tmp \
usr/{bin,games,include,%{_lib}/{bpf,games,X11,pm-utils/{module.d,power.d,sleep.d}},lib/{debug/{.dwz,usr},games,locale,modules,sysimage,systemd/{system,user},sysusers.d,tmpfiles.d},libexec,local/{bin,etc,games,lib,%{_lib}/bpf,src,share/{applications,man/man{1,2,3,4,5,6,7,8,9,n,1x,2x,3x,4x,5x,6x,7x,8x,9x},info},libexec,include,},share/{aclocal,appdata,applications,augeas/lenses,backgrounds,bash-completion{,/completions,/helpers},desktop-directories,dict,doc,empty,fish/vendor_completions.d,games,gnome,help,icons,idl,info,licenses,man/man{1,2,3,4,5,6,7,8,9,n,1x,2x,3x,4x,5x,6x,7x,8x,9x,0p,1p,3p},metainfo,mime-info,misc,modulefiles,omf,pixmaps,sounds,themes,xsessions,X11/fonts,wayland-sessions,zsh/site-functions},src,src/kernels,src/debug} \
var/{adm,empty,ftp,lib/{games,misc,rpm-state},local,log,nis,preserve,spool/{mail,lpd},tmp,db,cache/bpf,opt,games,yp}
)
for i in "${Paths[@]}"; do
mkdir -p "$i"
done
ln -snf ../var/tmp usr/tmp
ln -snf spool/mail var/mail
ln -snf usr/bin bin
ln -snf usr/sbin sbin
ln -snf usr/lib lib
ln -snf usr/%{_lib} %{_lib}
ln -snf ../run var/run
ln -snf ../run/lock var/lock
ln -snf usr/bin usr/lib/debug/bin
ln -snf usr/lib usr/lib/debug/lib
ln -snf usr/%{_lib} usr/lib/debug/%{_lib}
ln -snf ../.dwz usr/lib/debug/usr/.dwz
ln -snf usr/sbin usr/lib/debug/sbin
%if %{with merged_sbin}
ln -snf bin usr/sbin
ln -snf bin usr/local/sbin
%else
mkdir -p usr/sbin
mkdir -p usr/local/sbin
%endif
sed -n -f %{buildroot}/iso_639.sed /usr/share/xml/iso-codes/iso_639.xml \
>%{buildroot}/iso_639.tab
sed -n -f %{buildroot}/iso_3166.sed /usr/share/xml/iso-codes/iso_3166.xml \
>%{buildroot}/iso_3166.tab
grep -v "^$" %{buildroot}/iso_639.tab | grep -v "^#" | while read a b c d ; do
[[ "$d" =~ "^Reserved" ]] && continue
[[ "$d" =~ "^No linguistic" ]] && continue
locale=$c
if [ "$locale" = "XX" ]; then
locale=$b
fi
echo "%lang(${locale}) /usr/share/locale/${locale}" >> $RPM_BUILD_DIR/filelist
echo "%lang(${locale}) %ghost %config(missingok) /usr/share/man/${locale}" >>$RPM_BUILD_DIR/filelist
done
cat %{SOURCE1} | grep -v "^#" | grep -v "^$" | while read loc ; do
locale=$loc
locality=
special=
[[ "$locale" =~ "@" ]] && locale=${locale%%%%@*}
[[ "$locale" =~ "_" ]] && locality=${locale##*_}
[[ "$locality" =~ "." ]] && locality=${locality%%%%.*}
[[ "$loc" =~ "_" ]] || [[ "$loc" =~ "@" ]] || special=$loc
# If the locality is not official, skip it
if [ -n "$locality" ]; then
grep -q "^$locality" %{buildroot}/iso_3166.tab || continue
fi
# If the locale is not official and not special, skip it
if [ -z "$special" ]; then
egrep -q "[[:space:]]${locale%%_*}[[:space:]]" \
%{buildroot}/iso_639.tab || continue
fi
echo "%lang(${locale}) /usr/share/locale/${loc}" >> $RPM_BUILD_DIR/filelist
echo "%lang(${locale}) %ghost %config(missingok) /usr/share/man/${loc}" >> $RPM_BUILD_DIR/filelist
done
rm -f %{buildroot}/iso_639.tab
rm -f %{buildroot}/iso_639.sed
rm -f %{buildroot}/iso_3166.tab
rm -f %{buildroot}/iso_3166.sed
cat $RPM_BUILD_DIR/filelist | grep "locale" | while read a b ; do
mkdir -p -m 755 %{buildroot}/$b/LC_MESSAGES
done
cat $RPM_BUILD_DIR/filelist | grep "/share/man" | while read a b c d; do
mkdir -p -m 755 %{buildroot}/$d/man{1,2,3,4,5,6,7,8,9,n,1x,2x,3x,4x,5x,6x,7x,8x,9x,0p,1p,3p}
done
for i in man{1,2,3,4,5,6,7,8,9,n,1x,2x,3x,4x,5x,6x,7x,8x,9x,0p,1p,3p}; do
echo "/usr/share/man/$i" >>$RPM_BUILD_DIR/filelist
done
mkdir -p %{buildroot}/usr/share/filesystem
#find all dirs in the buildroot owned by filesystem and store them
find %{buildroot} -mindepth 0 | sed -e 's|%{buildroot}|/|' -e 's|//|/|' \
| LC_ALL=C sort | grep -v filesystem >%{buildroot}%{_datadir}/filesystem/paths
%pretrans -p <lua>
--# If we are running in pretrans in a fresh root, there is no /usr and
--# symlinks. We cannot be sure, to be the very first rpm in the
--# transaction list. Let's create the needed base directories and symlinks
--# here, to place the files from other packages in the right locations.
--# When our rpm is unpacked by cpio, it will set all permissions and modes
--# later.
posix.mkdir("/usr")
posix.mkdir("/usr/bin")
posix.mkdir("/usr/lib")
posix.mkdir("/usr/lib/debug")
posix.mkdir("/usr/lib/debug/usr/")
posix.mkdir("/usr/lib/debug/usr/bin")
posix.mkdir("/usr/lib/debug/usr/lib")
posix.mkdir("/usr/lib/debug/usr/%{_lib}")
posix.mkdir("/usr/%{_lib}")
posix.symlink("usr/bin", "/bin")
posix.symlink("usr/sbin", "/sbin")
posix.symlink("usr/lib", "/lib")
posix.symlink("usr/bin", "/usr/lib/debug/bin")
posix.symlink("usr/lib", "/usr/lib/debug/lib")
posix.symlink("usr/%{_lib}", "/usr/lib/debug/%{_lib}")
posix.symlink("../.dwz", "/usr/lib/debug/usr/.dwz")
posix.symlink("usr/sbin", "/usr/lib/debug/sbin")
posix.symlink("usr/%{_lib}", "/%{_lib}")
posix.mkdir("/run")
posix.mkdir("/proc")
posix.mkdir("/sys")
posix.chmod("/proc", 0555)
posix.chmod("/sys", 0555)
st = posix.stat("/media")
if st and st.type == "link" then
os.remove("/media")
end
posix.mkdir("/var")
posix.symlink("../run", "/var/run")
posix.symlink("../run/lock", "/var/lock")
%if %{with merged_sbin}
posix.symlink("bin", "/usr/sbin")
posix.symlink("bin", "/usr/lib/debug/usr/sbin")
posix.symlink("bin", "/usr/local/sbin")
%else
posix.mkdir("/usr/sbin")
posix.mkdir("/usr/lib/debug/usr/sbin")
%endif
%if %{with merged_sbin}
%global sbin_filenames %{lua:
print('{\\n')
io.input(sources[4])
for v in io.lines() do
print(' ["'..v..'"] = true,\\n')
end
print('}')
}
%filetriggerin -p <lua> -- /usr/bin
--# This implements filesystem(unmerged-sbin-symlinks) feature.
st = posix.stat("/usr/sbin")
if not st or st.type == "link" then
return
end
filenames = %sbin_filenames
a = rpm.next_file()
while a do
name = a:match("^.+/(.+)$")
if filenames[name] then
b = "/usr/sbin/"..name
sta = posix.stat(a)
stb = posix.stat(b)
print(a, sta, b, stb)
if sta and not stb then
print('Symlinking /usr/sbin/'..name..'->/usr/bin/'..name)
posix.symlink("../bin/"..name, "/usr/sbin/"..name)
end
end
a = rpm.next_file()
end
%filetriggerpostun -p <lua> -- /usr/bin
--# This implements filesystem(unmerged-sbin-symlinks) feature.
st = posix.stat("/usr/sbin")
if not st or st.type == "link" then
return
end
filenames = %sbin_filenames
a = rpm.next_file()
while a do
name = a:match("^.+/(.+)$")
if filenames[name] then
b = "/usr/sbin/"..name
sta = posix.stat(a)
stb = posix.stat(b)
print(a, sta, b, stb)
if sta and not stb then
print('Symlinking '..b..'->/usr/bin/'..name)
posix.symlink("../bin/"..name, b)
elseif not sta and stb and stb.type == "link" then
target = posix.readlink(b)
if target == "../bin/"..name then
print('Removing', b)
os.remove(b)
else
print('Not touching '..b..' -> '..target)
end
end
end
a = rpm.next_file()
end
%filetriggerpostun -p <lua> -- /sbin /usr/sbin
--# This implements filesystem(unmerged-sbin-symlinks) feature.
st = posix.stat("/usr/sbin")
if not st or st.type == "link" then
return
end
filenames = %sbin_filenames
b = rpm.next_file()
while b do
name = b:match("^.+/(.+)$")
print('filetriggerpostun', b)
if filenames[name] then
a = "/usr/bin/"..name
sta = posix.stat(a)
stb = posix.stat(b)
if sta and not stb then
print('Symlinking /usr/sbin/'..name..'->'..a)
posix.symlink("../bin/"..name, "/usr/sbin/"..name)
end
end
b = rpm.next_file()
end
%global merge_scriptlet %{expand:
--# Symlink /usr/sbin→/usr/bin and /usr/local/sbin→/usr/local/bin if possible
for _,path in pairs({"/usr/sbin", "/usr/local/sbin"}) do
st = posix.stat(path)
if st and st.type ~= "link" then
good = true
items = rpm.glob(path.."/*")
for _,v in pairs(items) do
--# rpm.glob() returns the original pattern if match fails :(((
if v ~= path.."/*" then
st = posix.stat(v)
if not st then
print("Could not stat "..v)
else
if st.type ~= "link" then
print("/usr/sbin cannot be merged, found "..v)
good = false
break
end
target = posix.readlink(v)
name = v:match("^.+/(.+)$")
if target ~= "../bin/"..name then
print("/usr/sbin cannot be merged, "..v.." points to "..target)
good = false
break
end
end
end
end
if good then
print("All files under "..path.." are symlinks; linking to ./bin...")
for _,v in pairs(items) do
os.remove(v)
end
os.remove(path)
posix.symlink("bin", path)
print("...done")
end
end
end
}
%endif
%posttrans -p <lua>
--# we need to restorecon on some dirs created in %pretrans or by other packages
if posix.access ("/usr/sbin/restorecon", "x") then
rpm.execute("/usr/sbin/restorecon", "/var", "/var/run", "/var/lock", "/sys", "/boot", "/dev", "/media", "/afs")
rpm.execute("/usr/sbin/restorecon", "-r", "/usr/lib/debug")
end
%if %{with merged_sbin}
%merge_scriptlet
%transfiletriggerpostun -p <lua> -- /sbin /usr/sbin
%merge_scriptlet
%endif
%files content
%dir %{_datadir}/filesystem
%{_datadir}/filesystem/paths
%files -f filelist
%defattr(0755,root,root,0755)
%dir %attr(555,root,root) /
/bin
/sbin
%attr(555,root,root) /boot
%attr(555,root,root) /afs
/dev
%dir /etc
/etc/X11
/etc/xdg
/etc/opt
/etc/pm
/etc/skel
/etc/sysconfig
/etc/keys
/etc/pki
/etc/bash_completion.d/
%dir /etc/rwtab.d
%dir /etc/statetab.d
/home
/lib
%ifarch x86_64 ppc64 sparc64 s390x aarch64 ppc64le mips64 mips64el riscv64
/%{_lib}
%endif
/media
%dir /mnt
%dir /opt
%ghost %attr(555,root,root) /proc
%attr(550,root,root) /root
/run
/srv
%ghost %attr(555,root,root) /sys
%attr(1777,root,root) /tmp
%dir /usr
%attr(555,root,root) /usr/bin
%if %{with merged_sbin}
%ghost /usr/sbin
%else
%attr(555,root,root) /usr/sbin
%endif
/usr/games
/usr/include
%dir %attr(555,root,root) /usr/lib
%dir /usr/lib/sysimage
%dir /usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/user
%dir /usr/lib/sysusers.d
%dir /usr/lib/tmpfiles.d
%dir /usr/lib/locale
%dir /usr/lib/modules
%dir /usr/lib/debug
%dir /usr/lib/debug/.dwz
%ghost /usr/lib/debug/bin
%ghost /usr/lib/debug/lib
%ghost /usr/lib/debug/%{_lib}
%ghost %dir /usr/lib/debug/usr
%ghost /usr/lib/debug/usr/bin
%ghost /usr/lib/debug/usr/sbin
%ghost /usr/lib/debug/usr/lib
%ghost /usr/lib/debug/usr/%{_lib}
%ghost /usr/lib/debug/usr/.dwz
%ghost /usr/lib/debug/sbin
%attr(555,root,root) /usr/lib/games
%ifarch x86_64 ppc64 sparc64 s390x aarch64 ppc64le mips64 mips64el riscv64
%attr(555,root,root) /usr/%{_lib}
%else
%attr(555,root,root) /usr/lib/bpf
%attr(555,root,root) /usr/lib/X11
%attr(555,root,root) /usr/lib/pm-utils
%endif
/usr/libexec
%dir /usr/local
%if %{with merged_sbin}
%ghost /usr/local/sbin
%else
/usr/local/sbin
%endif
/usr/local/etc
/usr/local/bin
/usr/local/games
/usr/local/include
/usr/local/lib*
/usr/local/share
/usr/local/src
%dir /usr/share
/usr/share/aclocal
/usr/share/appdata
/usr/share/applications
/usr/share/augeas
/usr/share/backgrounds
%dir /usr/share/bash-completion
/usr/share/bash-completion/completions
/usr/share/bash-completion/helpers
/usr/share/desktop-directories
/usr/share/dict
/usr/share/doc
%attr(555,root,root) %dir /usr/share/empty
/usr/share/fish
/usr/share/games
/usr/share/gnome
/usr/share/help
/usr/share/icons
/usr/share/idl
/usr/share/info
%dir /usr/share/licenses
%dir /usr/share/locale
%dir /usr/share/man
/usr/share/metainfo
/usr/share/mime-info
/usr/share/misc
%dir /usr/share/modulefiles
/usr/share/omf
/usr/share/pixmaps
/usr/share/sounds
/usr/share/themes
/usr/share/xsessions
%dir /usr/share/X11
/usr/share/X11/fonts
/usr/share/wayland-sessions
/usr/share/zsh
/usr/src
/usr/tmp
%dir /var
/var/adm
%dir /var/cache
/var/cache/bpf
/var/db
/var/empty
/var/ftp
/var/games
/var/lib
/var/local
%ghost /var/lock
/var/log
/var/mail
/var/nis
/var/opt
/var/preserve
%ghost /var/run
%dir /var/spool
%attr(755,root,root) /var/spool/lpd
%attr(775,root,mail) /var/spool/mail
%attr(1777,root,root) /var/tmp
/var/yp
%changelog
%autochangelog