Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Info file parameter support #1896

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions .github/workflows/ci-live.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: CI - ISO definition

on:
push:
paths:
# NOTE: GitHub Actions do not allow using YAML references, the same path
# list is used below for the pull request event. Keep both lists in sync!!

# this file as well
- .github/workflows/ci-live.yml
# any change in the service subfolder
- live/**

pull_request:
paths:
# NOTE: GitHub Actions do not allow using YAML references, the same path
# list is used above for the push event. Keep both lists in sync!!

# this file as well
- .github/workflows/ci-live.yml
# any change in the service subfolder
- live/**

# allow running manually
workflow_dispatch:

jobs:
ruby_tests:
runs-on: ubuntu-latest
env:
COVERAGE: 1

defaults:
run:
working-directory: ./live

strategy:
fail-fast: false
matrix:
distro: [ "tumbleweed" ]

container:
image: registry.opensuse.org/yast/head/containers_${{matrix.distro}}/yast-ruby

steps:

- name: Git Checkout
uses: actions/checkout@v4

- name: Configure and refresh repositories
# disable unused repositories to have faster refresh
run: zypper modifyrepo -d repo-non-oss repo-openh264 repo-update && zypper ref

- name: Install Ruby development files
run: zypper --non-interactive install
make

- name: Run the tests
run: make check
3 changes: 3 additions & 0 deletions live/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,7 @@ build: $(DESTDIR)
$(MAKE) all
(cd $(DESTDIR) && osc build -M $(FLAVOR) images)

check:
for i in ./test/*_test.*; do $${i}; done

.PHONY: build all clean
1 change: 1 addition & 0 deletions live/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ This directory contains a set of files that are used to build the Agama Live ISO
PXE boot, see a separate [PXE documentation](PXE.md) for more details about the PXE boot
- [config-cdroot](config-cdroot) subdirectory contains file which are copied to the uncompressed
root of the ISO image, the files can be accessed just by mounting the ISO file or the DVD medium
- [test](test) subdirectory contains tests to verify correctness of content. Can be run with `make check`

## Building the Sources

Expand Down
21 changes: 21 additions & 0 deletions live/root/etc/systemd/system/agama-cmdline-process.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[Unit]
Description=Agama kernel cmdline processing

# have to be after network to be able to download info files
# TODO: what to do in air gap scenario where we still need process cmdline?
After=network-online.target

# before starting the Agama servers so they read configuration parsed
Before=agama-web-server.service
Before=agama.service
Before=x11-autologin.service

[Service]
Type=oneshot
Environment=TERM=linux
ExecStart=agama-kernel-cmdline.sh
StandardInput=tty
TimeoutSec=0

[Install]
WantedBy=default.target
8 changes: 3 additions & 5 deletions live/root/etc/systemd/system/agama-self-update.service
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ Description=Agama self-update

After=network-online.target

# and after we process agama params like info which can contain password
After=agama-cmdline-process.service

# before starting the Agama servers so they use the new packages
Before=agama-web-server.service
Before=agama.service
Expand All @@ -11,11 +14,6 @@ Before=x11-autologin.service
Before=live-password-dialog.service
Before=live-password-systemd.service

# kernel command line option
ConditionKernelCommandLine=|agama.self_update
# linuxrc/YaST backward compatibility
ConditionKernelCommandLine=|agama.selfupdate

[Service]
Type=oneshot
Environment=TERM=linux
Expand Down
5 changes: 2 additions & 3 deletions live/root/etc/systemd/system/live-password-cmdline.service
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ Before=agama-web-server.service
Before=live-password-dialog.service
Before=live-password-systemd.service

# plain text password or hashed password passed via kernel command line
ConditionKernelCommandLine=|live.password
ConditionKernelCommandLine=|live.password_hash
# and after we process agama params like info which can contain password
After=agama-cmdline-process.service

[Service]
ExecStart=live-password --kernel
Expand Down
4 changes: 2 additions & 2 deletions live/root/etc/systemd/system/live-password-dialog.service
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ [email protected]
[email protected]
[email protected]

# kernel command line option
ConditionKernelCommandLine=live.password_dialog
# and after we process agama params like info which can contain kernel parameters
After=agama-cmdline-process.service

[Service]
Type=oneshot
Expand Down
4 changes: 2 additions & 2 deletions live/root/etc/systemd/system/live-password-systemd.service
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ [email protected]
[email protected]
[email protected]

# kernel command line option
ConditionKernelCommandLine=live.password_systemd
# and after we process agama params like info which can contain kernel parameters
After=agama-cmdline-process.service

[Service]
Type=oneshot
Expand Down
4 changes: 4 additions & 0 deletions live/root/usr/bin/agama-kernel-cmdline.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#! /bin/sh

kernel-cmdline-conf.sh
info-cmdline-conf.sh
4 changes: 4 additions & 0 deletions live/root/usr/bin/agama-self-update
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
# This script updates the Agama packages in the Live system from the
# Agama Devel OBS project.

# check if self-update is required
if ! grep -q "[[:space:]^]agama.self_update=1\([[:space:]]\|$\)" /etc/agama.d/cmdline.conf; then
exit 0
fi

# first try a quick and simple solution, refreshing the distributions repository takes a
# lot of time so try using only the agama-devel for update
Expand Down
23 changes: 23 additions & 0 deletions live/root/usr/bin/info-cmdline-conf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#! /bin/sh

set -e

TARGET="${1:-/etc/agama.d/cmdline.conf}"
INFO_CONTENT="${2:-/etc/agama.d/cmdline.info.conf}"

expand_info_arg() {
INFO_URL=$(sed -n 's/\(.*[[:space:]]\|^\)agama\.info=\([^[:space:]]\+\).*/\2/p' "$TARGET")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This picks up only one info file. Linuxrc supports multiple info arguments. Then it downloads and merges all info files.

This might be pretty useful. You can have a generic info file and an optional debugging one which additionally enables some debug features. This avoids duplicating the common parts between the info files. Just use the common one and if needed easily add the debugging one.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And linuxrc supports nested info files, you can use info= in info file as well... 😉

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know about both of those linuxrc features and it is possible to implement it, I just do not see much usage for it. What I see so far from bug reports is that there is just single info file param that contain required parameters. In the end there is not so much parameters you need to use and usually it is more like debug.info and if needed some production.info file.
I plan to document this limitation to old linuxrc behavior and if there is interest in extending it, we can always do it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It also allow different locations not sure if the same supported by curl... so something to document too.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeap, also true

if [ -z "${INFO_URL}" ]; then
return 0
fi

curl --silent "${INFO_URL}" > "${INFO_CONTENT}"
# remove info param
sed -in 's/\([[:space:]]\|^\)agama\.info=[^[:space:]]\+//' "${TARGET}"
# and add content of info file
cat "${INFO_CONTENT}" >> "${TARGET}"

return 0
}

expand_info_arg
32 changes: 32 additions & 0 deletions live/root/usr/bin/kernel-cmdline-conf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#! /bin/sh

SOURCE="${1:-/proc/cmdline}"
TARGET="${2:-/etc/agama.d/kernel.cmdline.conf}"

write_kernel_args() {
DIR=$(dirname "${TARGET}")
mkdir -p "$DIR"
# ensure that kernel cmdline line is created to avoid reading agama params
# if there is no kernel params
touch "${TARGET}"

for _i in $(cat "${SOURCE}"); do
case ${_i} in
# remove all agama kernel params
# Add here also all linuxrc supported parameters
LIBSTORAGE_* | YAST_* | agama* | Y2* | ZYPP_* | autoyast* )
_found=1
;;
esac

if [ -z "$_found" ]; then
echo "Non-Agama parameter found ($_i)"
echo -n " $_i" >>"${TARGET}"
fi
unset _found
done

return 0
}

write_kernel_args
18 changes: 14 additions & 4 deletions live/root/usr/bin/live-password
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ msg_box() {
}

ask_password() {
# check if user wants dialog password
if ! grep -q "[[:space:]^]live.password_dialog=1\([[:space:]]\|$\)" /etc/agama.d/cmdline.conf; then
exit 0
fi

if ! PWD1=$(dialog --keep-tite --title "$TITLE" --backtitle "$BTITLE" --stdout --insecure --passwordbox "Password:" 8 40); then
confirm_exit
ask_password
Expand All @@ -36,7 +41,7 @@ ask_password() {
confirm_exit
ask_password
fi

if [ "$PWD1" != "$PWD2" ]; then
msg_box "Passwords do not match.\nPlease try again."
ask_password
Expand All @@ -51,6 +56,10 @@ ask_password() {

# functions for entering the password using the "systemd-ask-password" tool
ask_password_systemd() {
# check if user wants systemd password
if ! grep -q "[[:space:]^]live.password_systemd=1\([[:space:]]\|$\)" /etc/agama.d/cmdline.conf; then
exit 0
fi
if ! PWD1=$(systemd-ask-password --timeout=0 "Set login password: "); then
exit 1
fi
Expand Down Expand Up @@ -141,13 +150,14 @@ random_password() {
}

if [ "$1" = "--kernel" ]; then
# get the password from the kernel command line
PWD=$(awk -F 'live.password=' '{sub(/ .*$/, "", $2); print $2}' < /proc/cmdline)
# get the password from the kernel command line. It can contain newlines
PWD=$(grep 'live.password=' < /etc/agama.d/cmdline.conf | awk -F 'live.password=' '{sub(/ .*$/, "", $2); print $2}')
if [ -n "$PWD" ]; then
echo "$PWD" | passwd --stdin
fi

PWD=$(awk -F 'live.password_hash=' '{sub(/ .*$/, "", $2); print $2}' < /proc/cmdline)
# get the password hash from the kernel command line. It can contain newlines
PWD=$(grep 'live.password_hash=' < /etc/agama.d/cmdline.conf | awk -F 'live.password_hash=' '{sub(/ .*$/, "", $2); print $2}')
if [ -n "$PWD" ]; then
usermod -p "$PWD" root
fi
Expand Down
1 change: 1 addition & 0 deletions live/src/config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ systemctl enable agama-hostname.service
systemctl enable agama-proxy-setup.service
systemctl enable agama-certificate-issue.path
systemctl enable agama-certificate-wait.service
systemctl enable agama-cmdline-process.service
systemctl enable agama-welcome-issue.service
systemctl enable agama-avahi-issue.service
systemctl enable agama-url-issue.service
Expand Down
1 change: 1 addition & 0 deletions live/test/fixtures/expected/cmdline
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BOOT_IMAGE=/boot/vmlinuz splash=silent mitigations=auto quiet nosimplefb=1
3 changes: 3 additions & 0 deletions live/test/fixtures/expected/info_cmdline
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BOOT_IMAGE=/boot/vmlinuz splash=silent nosimplefb=1
agama.install_url=ftp://test.com/repo
live.password=secret
2 changes: 2 additions & 0 deletions live/test/fixtures/expected/info_cmdline.info
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
agama.install_url=ftp://test.com/repo
live.password=secret
1 change: 1 addition & 0 deletions live/test/fixtures/source/cmdline
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BOOT_IMAGE=/boot/vmlinuz splash=silent agama.auto=ftp://example.suse.cz/profile.json LIBSTORAGE_MULTIPATH=1 mitigations=auto Y2DEBUG=1 quiet nosimplefb=1
1 change: 1 addition & 0 deletions live/test/fixtures/source/info_cmdline
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BOOT_IMAGE=/boot/vmlinuz splash=silent agama.info=https://pastebin.com/raw/krzAVL8S nosimplefb=1
51 changes: 51 additions & 0 deletions live/test/info_cmdline_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#! /usr/bin/rspec
require "tmpdir"

describe "info-cmdline-conf.sh" do
let(:script_path) { File.expand_path("../root/usr/bin/info-cmdline-conf.sh", __dir__, ) }

context "There is no info parameter" do
let(:source_path) { File.expand_path("fixtures/source/cmdline", __dir__, ) }
let(:expected_path) { File.expand_path("fixtures/source/cmdline", __dir__, ) }


it "does nothing" do
Dir.mktmpdir do |tmpdir|
target_path = File.join(tmpdir, "cmdline")
FileUtils.cp(source_path, target_path)
info_path = File.join(tmpdir, "cmdline.info")
command = "#{script_path} #{target_path} #{info_path}"
cmd_result = system(command)
expect(cmd_result).to eq true
expected = File.read(expected_path)
result = File.read(target_path)
expect(result).to eq expected
expect(File.exists?(info_path)).to eq false
end
end
end

context "There is info parameter" do
let(:source_path) { File.expand_path("fixtures/source/info_cmdline", __dir__, ) }
let(:expected_path) { File.expand_path("fixtures/expected/info_cmdline", __dir__, ) }
let(:expected_info_path) { File.expand_path("fixtures/expected/info_cmdline.info", __dir__, ) }

it "removes info parameter and add its content" do
Dir.mktmpdir do |tmpdir|
target_path = File.join(tmpdir, "cmdline")
FileUtils.cp(source_path, target_path)
info_path = File.join(tmpdir, "cmdline.info")
command = "#{script_path} #{target_path} #{info_path}"
cmd_result = system(command)
expect(cmd_result).to eq true
expected = File.read(expected_path)
result = File.read(target_path)
expect(result).to eq expected

expected_info = File.read(expected_info_path)
result_info = File.read(info_path)
expect(result_info).to eq expected_info
end
end
end
end
20 changes: 20 additions & 0 deletions live/test/kernel_cmdline_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#! /usr/bin/rspec
require "tmpdir"

describe "kernel-cmdline-conf.sh" do
it "filters out any agama params" do
script_path = File.expand_path("../root/usr/bin/kernel-cmdline-conf.sh", __dir__, )
source_path = File.expand_path("fixtures/source/cmdline", __dir__, )
expected_path = File.expand_path("fixtures/expected/cmdline", __dir__, )
tmpdir = Dir.mktmpdir do |tmpdir|
target_path = File.join(tmpdir, "cmdline")
command = "#{script_path} #{source_path} #{target_path}"
puts command
cmd_result = system(command)
expect(cmd_result).to eq true
expected = File.read(expected_path)
result = File.read(target_path)
expect(result).to eq expected
end
end
end
Loading