c874ad66ba
%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.)
513 lines
14 KiB
RPMSpec
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
|