(22 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{admon/warning|This is a DRAFT.}} | {{admon/warning|This is a DRAFT.}} | ||
= | = Preupgrade Assistant contents Packaging guidelines = | ||
== How to package a | == How to package a Preupgrade Assistant contents == | ||
Contents files are | Contents files are packaged as a subpackage of main package (e.g mariadb). | ||
== Naming guidelines == | == Naming guidelines == | ||
Every Preupgrade Assistant content | Every Preupgrade Assistant content subpackage name must start with ''preupgrade-assistant-'' followed by original package name. | ||
For example | For example Preupgrade Assistant content subpackage for ''mariadb'' will be named ''preupgrade-assistant-mariadb''. | ||
== Dependencies == | == Dependencies == | ||
* All packages must have | |||
Requires: preupgrade-assistant | |||
BuildRequires: preupgrade-assistant-devel | |||
Devel package contains macros and contents validating check script. | |||
* All | == Architecture == | ||
* | * All ''preupgrade-assistant-*'' subpackages must be architecture independent, i.e. have <code>BuildArch: noarch</code>. | ||
== Macros == | |||
* Macro denoting the parent directory where the package files go is <code>%{preupgrade_dir}</code>. This currently expands to <code>/usr/share/preupgrade</code>. | |||
* Macro <code>%{preupg_number}</code> means source release from which the system is going to be upgraded, e.g. Fedora 22. | |||
* Macro <code>%{postupg_number}</code> means target release to which the system is going to be upgraded, e.g. Fedora 23. | |||
* Macro <code>%{preupg_results}</code> means where the contents files are generated | |||
* Macro <code>%{preupgrade_name}</code> means '''Fedora%{preupg_number}_%{postupg_number}''', e.g. Fedora22_23 | |||
* Macro <code>%{preupgrade_dir}</code> reference to '''/usr/share/preupgrade/%{preupgrade_name}''' | |||
== Prep section == | |||
Copy all contents files to '''%{preupgrade_name}/%{name}''' directory. | |||
Content files are: | |||
* INI file | |||
* check_script (python or bash) | |||
* text file with solution description. | |||
=== INI file structure === | |||
INI file is checked by '''%{preupgrade_build}''' script. If something is missing user is informed. | |||
[preupgrade] | |||
content_title: Short content name | |||
author: Your Name <yname@ydomain.com> | |||
content_description: 'Enter your description here' | |||
config_file: <configuration_file_separated_by_comma> THIS IS OPTIONAL. IT INFORMS ADMINISTRATOR WHAT FILES ARE AFFECTED | |||
check_script: <checking script name created during this guide> | |||
solution: <text_how_to_solve_a_problem_after_an_upgrade> | |||
applies_to: <specify_package_needs_to_be_on_system. if_not_installed_then_NOT_APPLICABLE> , comma separated | |||
requires: <specify_package_needs_to_be_on_system> THIS IS OPTIONAL | |||
The elements description: | |||
* content_title - Defines a single item to be checked as a part of a group. | |||
* author - Author of the content, will be used in automatically created header of scripts | |||
* content_description - Describes a rule and what the checks are. | |||
* config_file - Defines which configuration files are checked. | |||
* check_script - A script used for checking the system before upgrade. If the script does not exist, the user is notified and the group.xml autogeneration fails. | |||
* solution - Text file which describes how to solve a problem after an upgrade. | |||
* applies_to - Package checked by the script, if not available check will not run. Result is NOT_APPLICABLE. | |||
* requires - If a check script needs awk binary then package gawk should be mentioned here. | |||
=== Bash check script template === | |||
= | Template for bash check script | ||
#!/bin/bash | |||
. /usr/share/preupgrade/common.sh | |||
#END GENERATED SECTION | |||
# This check can be used if you need root privilegues | |||
# Copy your config file from RHEL6 (in case of scenario RHEL6_7) | |||
# to Temporary Directory | |||
CONFIG_FILE="full_path_to_your_config_file" | |||
mkdir -p $VALUE_TMP_PREUPGRADE/cleanconf/$(dirname $CONFIG_FILE) | |||
cp $CONFIG_FILE $VALUE_TMP_PREUPGRADE/cleanconf/$CONFIG_FILE | |||
# Now check you configuration file for options | |||
# and for other stuff related with configuration | |||
# If configuration can be used on target system (like RHEL7 in case of RHEL6_7) | |||
# the exit should be RESULT_PASS | |||
# If configuration can not be used on target system (like RHEL 7 in case of RHEL6_7) | |||
# scenario then result should be RESULT_FAIL. Correction of | |||
# configuration file is provided either by solution script | |||
# or by postupgrade script located in $VALUE_TMP_PREUPGRADE/postupgrade.d/ | |||
# if configuration file can be fixed then fix them in temporary directory | |||
# $VALUE_TMP_PREUPGRADE/$CONFIG_FILE and result should be RESULT_FIXED | |||
# More information about this issues should be described in solution.txt file | |||
# as reference to KnowledgeBase article. | |||
grep "Sometext" $CONFIG_FILE | |||
if [ $? -ne 0 ]; then | |||
log_info "Config file $CONFIG_FILE will be fixed by solution script" | |||
# postupgrade.d directory from your content is automatically copied by | |||
# preupgrade assistant into $VALUE_TMP_PREUPGRADE/postupgrade.d/ directory | |||
exit $RESULT_FAIL | |||
fi | |||
exit $RESULT_PASS | |||
=== Python check script template === | |||
Template for python check script | |||
#!/usr/bin/python | |||
# -*- Mode: Python; python-indent: 8; indent-tabs-mode: t -*- | |||
import sys, os, errno | |||
import datetime | |||
from preup.script_api import * | |||
#END GENERATED SECTION | |||
component = "Specify component name used for logging" | |||
# exit functions are exit_{pass,not_applicable, fixed, fail, etc.} | |||
# logging functions are log_{error, warning, info, etc.} | |||
# for logging in-place risk use functions log_{extreme, high, medium, slight}_risk | |||
def main(): | |||
if os.geteuid() != 0: | |||
sys.stdout.write("Need to be root.\n") | |||
log_slight_risk("The script needs to be run under root account") | |||
exit_error() | |||
if __name__ == "__main__": | |||
set_component(component) | |||
main() | |||
exit_pass() | |||
== Build section == | == Build section == | ||
Run command: | |||
%{preupgrade_build} %{preupgrade_name}/%{name}/ | |||
%{preupgrade_build} command has to succeed. Warning can be suppressed. | |||
== Install section == | == Install section == | ||
All files from | All files from ''preupgrade'' directory should be installed with | ||
mkdir -p ${buildroot}%{preupgrade_dir}/ | %install | ||
... | |||
mkdir -p ${buildroot}%{preupgrade_dir}/%{name} | |||
install -p -m 755 %{SourceY} ${buildroot}%{preupgrade_dir}/%{name}/check.sh | |||
install -p -m 644 %{SourceZ} ${buildroot}%{preupgrade_dir}/%{name}/solution.txt | |||
install -p -m 644 %{preupgrade_name}-%{preupg_results}/%{name}/group.xml ${buildroot}%{preupgrade_dir}/%{name}/group.xml | |||
== Files section == | == Files section == | ||
* Preupgrade Assistant files and directories | * Directory where Preupgrade Assistant installs files and directories must be owned by the subpackage | ||
% | %files | ||
* All files except text files should be | ... | ||
% | %files -n preupgrade-assistant-%{name} | ||
%{preupgrade_dir | %dir %{preupgrade_dir}/%{name} | ||
* All text files from content should be | * All files except text files should be listed like | ||
% | %files | ||
... | |||
%files -n preupgrade-assistant-%{name} | |||
%{preupgrade_dir}/%{name}/*.{sh,py} | |||
%{preupgrade_dir}/%{name}/*.xml | |||
* All text files from content should be listed via | |||
%files | |||
... | |||
%files -n preupgrade-assistant-%{name} | |||
%doc %{preupgrade_dir}/%{name}/*.txt | |||
== Directory ownership == | == Directory ownership == | ||
Directories <code>/usr/share/preupgrade</code> and | |||
<code>%{preupgrade_dir}</code> | |||
are owned by package ''preupgrade-assistant'' itself and should not be owned by your package. | |||
== Sample SPEC == | == Sample SPEC == | ||
<pre> | <pre> | ||
Name: foo | |||
Version: 1.0 | |||
Release: 1%{?dist} | |||
Summary: An example package | |||
URL: http://example.com | |||
License: MIT | |||
Source0: http://example.com/foo/foo-%{version}.tgz | |||
Source1: foo.ini | |||
Source2: foo.sh | |||
Source3: foo.txt | |||
[Bulk of foo packaging elided] | |||
%package -n preupgrade-assistant-%{name} | |||
%package -n preupgrade-assistant | |||
BuildRequires: preupgrade-assistant-devel | BuildRequires: preupgrade-assistant-devel | ||
Requires: preupgrade-assistant | Requires: preupgrade-assistant | ||
%description -n preupgrade-assistant | %description -n preupgrade-assistant-%{name} | ||
Files used by preupgrade to assist with upgrading between | |||
major releases of the foo package via fedup. | |||
%prep | %prep | ||
# Copy all content files to %{preupgrade_dir} | # Copy all content files to %{preupgrade_dir} | ||
mkdir -p | mkdir -p %{preupgrade_name}/%{name} | ||
cp %{ | cp %{SOURCE1} %{preupgrade_name}/%{name}/%{SOURCE1} | ||
cp %{ | cp %{SOURCE2} %{preupgrade_name}/%{name}/%{SOURCE2} | ||
cp %{ | cp %{SOURCE3} %{preupgrade_name}/%{name}/%{SOURCE3} | ||
%build | |||
%{preupgrade_build} %{preupgrade_name}/%{name}/ | |||
%install | %install | ||
mkdir -p %{ | mkdir -p %{buildroot}%{preupgrade_dir}/%{name} | ||
install -p -m 755 %{SOURCE2} %{buildroot}%{preupgrade_dir}/%{name}/%{SOURCE2} | |||
install -p -m 644 %{SOURCE3} %{buildroot}%{preupgrade_dir}/%{name}/%{SOURCE3} | |||
install -p -m 644 %{preupgrade_name}-%{preupg_results}/%{name}/group.xml %{buildroot}%{preupgrade_dir}/%{name}/group.xml | |||
%files -n preupgrade-assistant | %files -n preupgrade-assistant-%{name} | ||
%dir %{preupgrade_dir | %dir %{preupgrade_dir}/%{name} | ||
%doc %{preupgrade_dir | %doc %{preupgrade_dir}/%{name}/*.txt | ||
%{preupgrade_dir | %{preupgrade_dir}/%{name}/*.{py,sh} | ||
%{preupgrade_dir | %{preupgrade_dir}/%{name}/*.xml | ||
</pre> | </pre> |
Latest revision as of 08:35, 20 February 2015
Preupgrade Assistant contents Packaging guidelines
How to package a Preupgrade Assistant contents
Contents files are packaged as a subpackage of main package (e.g mariadb).
Naming guidelines
Every Preupgrade Assistant content subpackage name must start with preupgrade-assistant- followed by original package name.
For example Preupgrade Assistant content subpackage for mariadb will be named preupgrade-assistant-mariadb.
Dependencies
- All packages must have
Requires: preupgrade-assistant BuildRequires: preupgrade-assistant-devel
Devel package contains macros and contents validating check script.
Architecture
- All preupgrade-assistant-* subpackages must be architecture independent, i.e. have
BuildArch: noarch
.
Macros
- Macro denoting the parent directory where the package files go is
%{preupgrade_dir}
. This currently expands to/usr/share/preupgrade
. - Macro
%{preupg_number}
means source release from which the system is going to be upgraded, e.g. Fedora 22. - Macro
%{postupg_number}
means target release to which the system is going to be upgraded, e.g. Fedora 23. - Macro
%{preupg_results}
means where the contents files are generated - Macro
%{preupgrade_name}
means Fedora%{preupg_number}_%{postupg_number}, e.g. Fedora22_23 - Macro
%{preupgrade_dir}
reference to /usr/share/preupgrade/%{preupgrade_name}
Prep section
Copy all contents files to %{preupgrade_name}/%{name} directory.
Content files are:
- INI file
- check_script (python or bash)
- text file with solution description.
INI file structure
INI file is checked by %{preupgrade_build} script. If something is missing user is informed.
[preupgrade] content_title: Short content name author: Your Name <yname@ydomain.com> content_description: 'Enter your description here' config_file: <configuration_file_separated_by_comma> THIS IS OPTIONAL. IT INFORMS ADMINISTRATOR WHAT FILES ARE AFFECTED check_script: <checking script name created during this guide> solution: <text_how_to_solve_a_problem_after_an_upgrade> applies_to: <specify_package_needs_to_be_on_system. if_not_installed_then_NOT_APPLICABLE> , comma separated requires: <specify_package_needs_to_be_on_system> THIS IS OPTIONAL
The elements description:
- content_title - Defines a single item to be checked as a part of a group.
- author - Author of the content, will be used in automatically created header of scripts
- content_description - Describes a rule and what the checks are.
- config_file - Defines which configuration files are checked.
- check_script - A script used for checking the system before upgrade. If the script does not exist, the user is notified and the group.xml autogeneration fails.
- solution - Text file which describes how to solve a problem after an upgrade.
- applies_to - Package checked by the script, if not available check will not run. Result is NOT_APPLICABLE.
- requires - If a check script needs awk binary then package gawk should be mentioned here.
Bash check script template
Template for bash check script
#!/bin/bash . /usr/share/preupgrade/common.sh #END GENERATED SECTION # This check can be used if you need root privilegues # Copy your config file from RHEL6 (in case of scenario RHEL6_7) # to Temporary Directory CONFIG_FILE="full_path_to_your_config_file" mkdir -p $VALUE_TMP_PREUPGRADE/cleanconf/$(dirname $CONFIG_FILE) cp $CONFIG_FILE $VALUE_TMP_PREUPGRADE/cleanconf/$CONFIG_FILE # Now check you configuration file for options # and for other stuff related with configuration # If configuration can be used on target system (like RHEL7 in case of RHEL6_7) # the exit should be RESULT_PASS # If configuration can not be used on target system (like RHEL 7 in case of RHEL6_7) # scenario then result should be RESULT_FAIL. Correction of # configuration file is provided either by solution script # or by postupgrade script located in $VALUE_TMP_PREUPGRADE/postupgrade.d/ # if configuration file can be fixed then fix them in temporary directory # $VALUE_TMP_PREUPGRADE/$CONFIG_FILE and result should be RESULT_FIXED # More information about this issues should be described in solution.txt file # as reference to KnowledgeBase article. grep "Sometext" $CONFIG_FILE if [ $? -ne 0 ]; then log_info "Config file $CONFIG_FILE will be fixed by solution script" # postupgrade.d directory from your content is automatically copied by # preupgrade assistant into $VALUE_TMP_PREUPGRADE/postupgrade.d/ directory exit $RESULT_FAIL fi exit $RESULT_PASS
Python check script template
Template for python check script
#!/usr/bin/python # -*- Mode: Python; python-indent: 8; indent-tabs-mode: t -*- import sys, os, errno import datetime from preup.script_api import * #END GENERATED SECTION component = "Specify component name used for logging" # exit functions are exit_{pass,not_applicable, fixed, fail, etc.} # logging functions are log_{error, warning, info, etc.} # for logging in-place risk use functions log_{extreme, high, medium, slight}_risk def main(): if os.geteuid() != 0: sys.stdout.write("Need to be root.\n") log_slight_risk("The script needs to be run under root account") exit_error() if __name__ == "__main__": set_component(component) main() exit_pass()
Build section
Run command:
%{preupgrade_build} %{preupgrade_name}/%{name}/
%{preupgrade_build} command has to succeed. Warning can be suppressed.
Install section
All files from preupgrade directory should be installed with
%install ... mkdir -p ${buildroot}%{preupgrade_dir}/%{name} install -p -m 755 %{SourceY} ${buildroot}%{preupgrade_dir}/%{name}/check.sh install -p -m 644 %{SourceZ} ${buildroot}%{preupgrade_dir}/%{name}/solution.txt install -p -m 644 %{preupgrade_name}-%{preupg_results}/%{name}/group.xml ${buildroot}%{preupgrade_dir}/%{name}/group.xml
Files section
- Directory where Preupgrade Assistant installs files and directories must be owned by the subpackage
%files ... %files -n preupgrade-assistant-%{name} %dir %{preupgrade_dir}/%{name}
- All files except text files should be listed like
%files ... %files -n preupgrade-assistant-%{name} %{preupgrade_dir}/%{name}/*.{sh,py} %{preupgrade_dir}/%{name}/*.xml
- All text files from content should be listed via
%files ... %files -n preupgrade-assistant-%{name} %doc %{preupgrade_dir}/%{name}/*.txt
Directory ownership
Directories /usr/share/preupgrade
and
%{preupgrade_dir}
are owned by package preupgrade-assistant itself and should not be owned by your package.
Sample SPEC
Name: foo Version: 1.0 Release: 1%{?dist} Summary: An example package URL: http://example.com License: MIT Source0: http://example.com/foo/foo-%{version}.tgz Source1: foo.ini Source2: foo.sh Source3: foo.txt [Bulk of foo packaging elided] %package -n preupgrade-assistant-%{name} BuildRequires: preupgrade-assistant-devel Requires: preupgrade-assistant %description -n preupgrade-assistant-%{name} Files used by preupgrade to assist with upgrading between major releases of the foo package via fedup. %prep # Copy all content files to %{preupgrade_dir} mkdir -p %{preupgrade_name}/%{name} cp %{SOURCE1} %{preupgrade_name}/%{name}/%{SOURCE1} cp %{SOURCE2} %{preupgrade_name}/%{name}/%{SOURCE2} cp %{SOURCE3} %{preupgrade_name}/%{name}/%{SOURCE3} %build %{preupgrade_build} %{preupgrade_name}/%{name}/ %install mkdir -p %{buildroot}%{preupgrade_dir}/%{name} install -p -m 755 %{SOURCE2} %{buildroot}%{preupgrade_dir}/%{name}/%{SOURCE2} install -p -m 644 %{SOURCE3} %{buildroot}%{preupgrade_dir}/%{name}/%{SOURCE3} install -p -m 644 %{preupgrade_name}-%{preupg_results}/%{name}/group.xml %{buildroot}%{preupgrade_dir}/%{name}/group.xml %files -n preupgrade-assistant-%{name} %dir %{preupgrade_dir}/%{name} %doc %{preupgrade_dir}/%{name}/*.txt %{preupgrade_dir}/%{name}/*.{py,sh} %{preupgrade_dir}/%{name}/*.xml