Re: [HELP NEEDED] LUA expert to help convert fedora-release %post scripts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/03/2016 04:00 PM, Stephen Gallagher wrote:
> I'm attaching the current fedora-release.spec and convert-to-edition bash script
> for perusal.

I'm attaching a lightly tested Lua conversion.  I'm not familiar with
all the scenarios to test, so I thought I'd post what I have quite
early.  Most of the pieces should be in place.

Florian

%define release_name Twenty Four
%define dist_version 24
%define bug_version 24

Summary:        Fedora release files
Name:           fedora-release
Version:        24
Release:        0.12
License:        MIT
Group:          System Environment/Base
URL:            http://fedoraproject.org
Source:         %{name}-%{version}.tar.bz2
Source1:        convert-to-edition.lua
Obsoletes:      redhat-release
Provides:       redhat-release
Provides:       system-release
Provides:       system-release(%{version})

# Kill off the fedora-release-nonproduct package
Provides:       fedora-release-nonproduct = %{version}
Obsoletes:      fedora-release-nonproduct <= 23-0.3
Provides:       fedora-release-standard = 22-0.8
Obsoletes:      fedora-release-standard < 22-0.8


Requires:       fedora-repos(%{version})
BuildArch:      noarch

%description
Fedora release files such as various /etc/ files that define the release.

%package cloud
Summary:        Base package for Fedora Cloud-specific default configurations
Provides:       system-release-cloud
Provides:       system-release-cloud(%{version})
Provides:       system-release-product
Requires:       fedora-release = %{version}-%{release}

%description cloud
Provides a base package for Fedora Cloud-specific configuration files to
depend on.

%package server
Summary:        Base package for Fedora Server-specific default configurations
Provides:       system-release-server
Provides:       system-release-server(%{version})
Provides:       system-release-product
Requires:       fedora-release = %{version}-%{release}
Requires:       systemd
Requires:       cockpit
Requires:       rolekit
Requires(post):	sed
Requires(post):	systemd

%description server
Provides a base package for Fedora Server-specific configuration files to
depend on.

%package workstation
Summary:        Base package for Fedora Workstation-specific default configurations
Provides:       system-release-workstation
Provides:       system-release-workstation(%{version})
Provides:       system-release-product
Requires:       fedora-release = %{version}-%{release}
# needed for captive portal support
Requires:       NetworkManager-config-connectivity-fedora
Requires(post): /usr/bin/glib-compile-schemas
Requires(postun): /usr/bin/glib-compile-schemas

%description workstation
Provides a base package for Fedora Workstation-specific configuration files to
depend on.

%prep
%setup -q
sed -i 's|@@VERSION@@|%{dist_version}|g' Fedora-Legal-README.txt

%build

%install
install -d $RPM_BUILD_ROOT/etc
echo "Fedora release %{version} (%{release_name})" > $RPM_BUILD_ROOT/etc/fedora-release
echo "cpe:/o:fedoraproject:fedora:%{version}" > $RPM_BUILD_ROOT/etc/system-release-cpe

# Symlink the -release files
ln -s fedora-release $RPM_BUILD_ROOT/etc/redhat-release
ln -s fedora-release $RPM_BUILD_ROOT/etc/system-release

# Create the common os-release file
install -d $RPM_BUILD_ROOT/usr/lib/os.release.d/
cat << EOF >>$RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-fedora
NAME=Fedora
VERSION="%{dist_version} (%{release_name})"
ID=fedora
VERSION_ID=%{dist_version}
PRETTY_NAME="Fedora %{dist_version} (%{release_name})"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:fedoraproject:fedora:%{dist_version}"
HOME_URL="https://fedoraproject.org/";
BUG_REPORT_URL="https://bugzilla.redhat.com/";
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=%{bug_version}
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=%{bug_version}
PRIVACY_POLICY_URL=https://fedoraproject.org/wiki/Legal:PrivacyPolicy
EOF

# Create the common /etc/issue
echo "\S" > $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-fedora
echo "Kernel \r on an \m (\l)" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-fedora
echo >> $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-fedora

# Create /etc/issue.net
echo "\S" > $RPM_BUILD_ROOT/usr/lib/issue.net
echo "Kernel \r on an \m (\l)" >> $RPM_BUILD_ROOT/usr/lib/issue.net
ln -s ../usr/lib/issue.net $RPM_BUILD_ROOT/etc/issue.net

# Create os-release and issue files for the different editions
# Cloud
cp -p $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-fedora \
      $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-cloud
echo "VARIANT=\"Cloud Edition\"" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-cloud
echo "VARIANT_ID=cloud" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-cloud
sed -i -e "s|(%{release_name})|(Cloud Edition)|g" $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-cloud

# Server
cp -p $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-fedora \
      $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-server
echo "VARIANT=\"Server Edition\"" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-server
echo "VARIANT_ID=server" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-server
sed -i -e "s|(%{release_name})|(Server Edition)|g" $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-server

cp -p $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-fedora \
      $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-server
echo "Admin Console: https://\4:9090/ or https://[\6]:9090/"; >> $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-server
echo >> $RPM_BUILD_ROOT/usr/lib/os.release.d/issue-server

# Workstation
cp -p $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-fedora \
      $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-workstation
echo "VARIANT=\"Workstation Edition\"" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-workstation
echo "VARIANT_ID=workstation" >> $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-workstation
sed -i -e "s|(%{release_name})|(Workstation Edition)|g" $RPM_BUILD_ROOT/usr/lib/os.release.d/os-release-workstation

# Create the symlink for /etc/os-release
# We don't create the /usr/lib/os-release symlink until %%post
# so that we can ensure that the right one is referenced.
ln -s ../usr/lib/os-release $RPM_BUILD_ROOT/etc/os-release

# Create the symlink for /etc/issue
# We don't create the /usr/lib/os-release symlink until %%post
# so that we can ensure that the right one is referenced.
ln -s ../usr/lib/issue $RPM_BUILD_ROOT/etc/issue

# Set up the dist tag macros
install -d -m 755 $RPM_BUILD_ROOT%{_rpmconfigdir}/macros.d
cat >> $RPM_BUILD_ROOT%{_rpmconfigdir}/macros.d/macros.dist << EOF
# dist macros.

%%fedora                %{dist_version}
%%dist                .fc%{dist_version}
%%fc%{dist_version}                1
EOF

# Add presets
mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/user-preset/
mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-preset/
mkdir -p $RPM_BUILD_ROOT/usr/lib/os.release.d/presets

# Default system wide
install -m 0644 85-display-manager.preset $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-preset/
install -m 0644 90-default.preset $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-preset/
install -m 0644 99-default-disable.preset $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-preset/
# Fedora Server
install -m 0644 80-server.preset $RPM_BUILD_ROOT%{_prefix}/lib/os.release.d/presets/
# Fedora Workstation
install -m 0644 80-workstation.preset $RPM_BUILD_ROOT%{_prefix}/lib/os.release.d/presets/

# Override the list of enabled gnome-shell extensions for Workstation
mkdir -p $RPM_BUILD_ROOT%{_datadir}/glib-2.0/schemas/
install -m 0644 org.gnome.shell.gschema.override $RPM_BUILD_ROOT%{_datadir}/glib-2.0/schemas/

# Copy the make_edition script to /usr/sbin
mkdir -p $RPM_BUILD_ROOT/%{_prefix}/sbin/
install -m 0744 convert-to-edition $RPM_BUILD_ROOT/%{_prefix}/sbin/

%post -p <lua>
%include %{SOURCE1}
-- On initial installation, we'll at least temporarily put the non-product
-- symlinks in place. It will be overridden by fedora-release-$EDITION
-- %%post sections because we don't write the /usr/lib/variant file until
-- %%posttrans to avoid trumping the fedora-release-$EDITION packages.
-- This is necessary to avoid breaking systemctl scripts since they rely on
-- /usr/lib/os-release being valid. We can't wait until %%posttrans to default
-- to os-release-fedora.
if arg[2] == "0" then
    set_release(fedora)
    set_issue(fedora)
end

-- We also want to forcibly set these paths on upgrade if we are explicitly
-- set to "nonproduct"
if read_variant() == "nonproduct" then
    convert_to_edition("nonproduct", false)
end

%posttrans -p <lua>
%include %{SOURCE1}
-- If we get to %%posttrans and nothing created /usr/lib/variant, set it to
-- nonproduct.
if posix.stat(VARIANT_FILE) == nil then
    convert_to_edition("nonproduct", true)
end

%post cloud -p <lua>
%include %{SOURCE1}
install_edition("cloud")

%preun cloud -p <lua>
%include %{SOURCE1}
uninstall_edition("cloud")

%post server -p <lua>
%include %{SOURCE1}
install_edition("server")

%preun server -p <lua>
%include %{SOURCE1}
uninstall_edition("server")

%post workstation -p <lua>
%include %{SOURCE1}
install_edition("workstation")

%preun workstation -p <lua>
%include %{SOURCE1}
uninstall_edition("workstation")

%postun workstation
if [ $1 -eq 0 ] ; then
    glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
fi

%posttrans workstation
glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :


%files
%defattr(-,root,root,-)
%{!?_licensedir:%global license %%doc}
%license LICENSE Fedora-Legal-README.txt
%ghost /usr/lib/variant
%dir /usr/lib/os.release.d
%dir /usr/lib/os.release.d/presets
%config %attr(0644,root,root) /usr/lib/os.release.d/os-release-fedora
%ghost /usr/lib/os-release
/etc/os-release
%config %attr(0644,root,root) /etc/fedora-release
/etc/redhat-release
/etc/system-release
%config %attr(0644,root,root) /etc/system-release-cpe
%config %attr(0644,root,root) /usr/lib/os.release.d/issue-fedora
%ghost /usr/lib/issue
%config(noreplace) /etc/issue
%config %attr(0644,root,root) /usr/lib/issue.net
%config(noreplace) /etc/issue.net
%attr(0644,root,root) %{_rpmconfigdir}/macros.d/macros.dist
%dir /usr/lib/systemd/user-preset/
%dir %{_prefix}/lib/systemd/system-preset/
%{_prefix}/lib/systemd/system-preset/85-display-manager.preset
%{_prefix}/lib/systemd/system-preset/90-default.preset
%{_prefix}/lib/systemd/system-preset/99-default-disable.preset
/usr/sbin/convert-to-edition

%files cloud
%{!?_licensedir:%global license %%doc}
%license LICENSE
%config %attr(0644,root,root) /usr/lib/os.release.d/os-release-cloud


%files server
%{!?_licensedir:%global license %%doc}
%license LICENSE
%config %attr(0644,root,root) /usr/lib/os.release.d/os-release-server
%config %attr(0644,root,root) /usr/lib/os.release.d/issue-server
%ghost %{_prefix}/lib/systemd/system-preset/80-server.preset
%config %attr(0644,root,root) /usr/lib/os.release.d/presets/80-server.preset

%files workstation
%{!?_licensedir:%global license %%doc}
%license LICENSE
%config %attr(0644,root,root) /usr/lib/os.release.d/os-release-workstation
%{_datadir}/glib-2.0/schemas/org.gnome.shell.gschema.override
%ghost %{_prefix}/lib/systemd/system-preset/80-workstation.preset
%config %attr(0644,root,root) /usr/lib/os.release.d/presets/80-workstation.preset

%changelog
* Mon Feb 29 2016 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.12
- Only run grub2-mkconfig for platforms that support it
- Remove erroneous RPM_BUILD_ROOT variables in convert-to-edition

* Fri Feb 26 2016 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.11
- Fix upgrade bug in Workstation and Cloud

* Tue Feb 23 2016 Dennis Gilmore <dennis@xxxxxxxx> - 24-0.10
- setup for f24 being branched

* Thu Jan 21 2016 Stephen Gallagher <sgallagh@xxxxxxxxxx> 24-0.9
- Install Edition presets only for the configured Edition
- Add script to convert from non-edition to an Edition
- Fix upgrade bugs with non-edition installs
- Explicitly set issue-fedora for cloud installs
- Resolves: rhbz#1288205

* Tue Dec 15 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> 24-0.8
- Fix copy-paste error for Workstation os-release and issue

* Tue Sep 29 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> 24-0.7
- Rework os-release and issue mechanism to avoid upgrade issues such as
  competing fedora-release-$EDITION packages
- Make a non-product install persistent (it won't be converted to an Edition
  install if something pulls in a fedora-release-$EDITION package

* Mon Sep 28 2015 Dennis Gilmore <dennis@xxxxxxxx> - 24-0.6
- set bug_version to be rawhide rhbz#1259287

* Tue Sep 15 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.5
- Do not clobber /etc/issue[.net] customizations

* Wed Sep 09 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.4
- Update preset file with FESCo decisions
- https://fedorahosted.org/fesco/ticket/1472

* Wed Sep 09 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.3
- Enclose IPv6 addresses in square brackets in /etc/issue

* Mon Aug 24 2015 Stephen Gallagher <sgallagh@xxxxxxxxxx> - 24-0.2
- Make /etc/issue configurable per-edition
- Resolves: RHBZ#1239089

* Tue Jul 14 2015 Dennis Gilmore <dennis@xxxxxxxx> - 24-0.1
- setup for rawhide being f24
-- This is intended to be run as an RPM scriptlet.

local VARIANT_FILE = "/usr/lib/variant"
local disable_presets = false

local function read_variant()
   local variant
   local f = io.open("/usr/lib/variant", "r")
   if f ~= nil then
      while true do
	 local line = f:read()
	 if line == nil then
	    break
	 end
	 local m = line:match("^VARIANT_ID=([^\n]+)")
	 if m ~= nil then
	    variant = m
	 end
      end
   end
   return variant
end

local function writefile(path, data)
   local tmp = path .. ".convert-to-edition"
   local f = io.open(tmp, "w+")
   if f == nil then
      return
   end
   f:write(data)
   f:close()
   if not os.rename(tmp, path) then
      os.remove(tmp)
   end
end

local function symlink(from, to)
   os.remove(to)
   assert(posix.symlink(from, to))
end

local function execute(...)
   local pid = posix.fork()
   if pid == 0 then
      posix.exec(...)
      posix.exit(1)
   elseif pid ~= -1 then
      local status = posix.wait(pid)
      if status ~= 0 then
	 local program = ...
	 error(program .. " exited with status " .. status)
      end
   end
end

local function clear_presets()
   local path = "/usr/lib/systemd/system-preset"
   for file in posix.files(path) do
      if file:match("^80-.*%.preset$") then
	 os.remove(path .. "/" .. file)
      end
   end
end

local function read_presets(path)
   local result = {}
   local f = assert(io.open(path))
   if f ~= nil then
      while true do
	 local line = f:read()
	 if line == nil then
	    break
	 end
	 local cmd, arg = line:match("^([^ \t]+)[ \t]+([^\n \t]+)")
	 if cmd == "enable" or cmd == "disable" then
	    result[#result + 1] = arg
	 end
	 f:close()
      end
   end
   return result
end

local function set_variant(variant)
   writefile(VARIANT_FILE, "VARIANT_ID=" .. variant .. "\n")
end

local function set_release(release)
   symlink("./os.release.d/os-release-" .. release, "/usr/lib/os-release")
end

local function set_issue(release)
   symlink("./os.release.d/issue-" .. release, "/usr/lib/issue")
end

local variants = {
   cloud = {release = "cloud", issue = "fedora", presets = false},
   nonproduct = {release = "fedora", issue = "fedora", presets = false},
   server = {release = "server", issue = "server", presets = true},
   server = {release = "workstation", issue = "fedora", presets = true},
}

local function set_presets(edition)
   if variants[edition].presets then
      local target = "/usr/lib/systemd/system-preset/80-" .. edition .. ".preset"
      symlink("../../os.edition.d/presets/80-" .. edition .. ".preset", target)
      local presets = read_presets(target)
      os.execute("/usr/bin/systemctl", "preset", "-q",
		 table.unpack(presets))
   end
end

local function convert_to_edition(edition, do_presets)
   local variant = variants[edition]
   if variant == nil then
      error("undefined edition: " .. edition)
   end
   set_release(variant.release)
   set_issue(variant.issue)
   clear_presets()

   if do_presets then
      set_presets(edition)
   end

   local grub = "/usr/sbin/grub2-mkconfig"
   if posix.access(grub) then
      execute(grub, "-o", "/boot/grub2/grub.cfg")
   end
   print("This system has been converted to " .. edition)
end

local function install_edition(edition)
   -- Create the variant file if it does not already exist. This needs
   -- to be done on both installation and upgrade, to ensure that we
   -- upgrade from F23 and earlier properly.
   if not posix.access(VARIANT_FILE, "f") then
      set_variant(edition)
   end
   if read_variant() == edition then
      -- (On initial installation only), fix up after %%systemd_post
      -- in packages possibly installed before our preset file was
      -- added
      -- On upgrades, do not enable or disable presets to avoid
      -- surprising the user
      local initial_install = arg[2] == "1"
      convert_to_edition(edition, initial_install)
   end
end

local function uninstall_edition(edition)
   -- If we are uninstalling, we need to reset the variant file and
   -- force the os-release file back to os-release-fedora.  We do this
   -- in %%preun so that we don't have any time where the os-release
   -- symlink is dangling (since in %%postun, the os-release-$EDITION
   -- file will have already been removed)
   if arg[2] == "0" then
      if read_variant() == edition then
	 convert_to_edition("nonproduct", false)
      end
   end
end
--
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxxx
http://lists.fedoraproject.org/admin/lists/devel@xxxxxxxxxxxxxxxxxxxxxxx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]
  Powered by Linux