Administrator Guide Obs Admin
User Manual: Pdf
Open the PDF directly: View PDF .
Page Count: 117
Administrator Guide
Administrator Guide: Open Build Service
by Karsten Keil
Publication Date: 01/29/2018
SUSE LLC
10 Canal Park Drive
Suite 200
Cambridge MA 02141
USA
https://www.suse.com/documentation
Copyright © 2016
Copyright © 2006– 2018 SUSE LLC and contributors. All rights reserved.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or (at your option) version 1.3; with the Invariant Section being this copyright
notice and license. A copy of the license version 1.2 is included in the section entitled “GNU Free Documentation
License”.
For SUSE trademarks, see http://www.suse.com/company/legal/ . All other third-party trademarks are the property of their respective owners. Trademark symbols (®, ™ etc.) denote trademarks of SUSE and its affiliates.
Asterisks (*) denote third-party trademarks.
All information found in this book has been compiled with utmost attention to detail. However, this does not
guarantee complete accuracy. Neither SUSE LLC, its affiliates, the authors nor the translators shall be held liable
for possible errors or the consequences thereof.
Contents
About this Guide vi
1
1.1
Installation and Configuration 1
Planning 1
Resource Planning 1
1.2
Simple Installation 2
Back-end Installation 2 • Front-end Installation 5 • Online
Configuration 8
1.3
Worker Farm 11
1.4
Distributed Setup 11
1.5
Monitoring 14
Endpoint Checks 14 • Common Checks 15 • Other Checks 17
2
2.1
File System Overview 18
Configuration Files 18
Front-end Configuration 18 • Back-end Configuration 26
2.2
Log Files 47
Front-end 47 • Back-end 47
2.3
/srv/obs Tree 48
build Directory 48 • cloudupload Directory 49 • db
Directory 49 • diffcache Directory 49 • events
Directory 49 • info Directory 50 • jobs Directory 50 • log
Directory 50 • projects Directory 50 • remotecache
Directory 50 • repos Directory 50 • repos_sync
Directory 50 • run Directory 51 • sources Directory 51 • trees
Directory 51 • upload Directory 51 • workers Directory 51
iii
Administrator Guide
2.4
Metadata 52
OBS Revision Control 52 • Project Metadata 53 • Package
Metadata 55 • Attribute Metadata 55 • Job Files 56
3
3.1
Administration 58
Tools 58
obs_admin 58 • osc 61
3.2
Managing Build Targets 64
Interconnect 64 • Importing Distributions 65
3.3
Source Services 68
Using Services for Validation 69 • Different Modes When Using
Services 69 • Storage of Source Service Definitions 70 • Dropping a
Source Service Again 71
3.4
Dispatch Priorities 71
The /build/_dispatchprios API Call 72 • dispatch_adjust Array 73
3.5
Publisher Hooks 74
Configuring Publisher Hooks 74 • Example Publisher Scripts 76
3.6
Unpublisher Hooks 77
Configuring Unpublisher Hooks 78 • Example Unpublisher Scripts 79
3.7
Managing Users and Groups 81
User and Group Roles 81 • Standalone User and Group
Database 81 • Proxy Mode 82 • LDAP/Active
Directory 83 • Authentication Methods 89
3.8
Message Bus for Event Notifications 91
RabbitMQ 91
3.9
3.10
4
iv
Backup 99
Spider Identification 99
Troubleshooting 102
4.1
General Hints 102
4.2
Debugging Front-end Problems 103
Administrator Guide
A
v
GNU Licenses 104
A.1
GNU General Public License 104
A.2
GNU Free Documentation License 106
Administrator Guide
About this Guide
This guide is part of the Open Build Service documentation. These books are considered to
contain only reviewed content, establishing the reference documentation of OBS.
This guide does not focus on a specific OBS version. It is also not a replacement of the documentation inside of the openSUSE Wiki (https://en.opensuse.org/Portal:Build_Service) . However, content from the wiki may be included in these books in a consolidated form.
1 Available Documentation
The following documentation is available for OBS:
Administrator Guide
This guide offers information about the initial setup and maintenance for running Open
Build Service instances.
Article “Beginnerʼs Guide”
This guide describes basic workflows for working with packages on Open Build Service.
This includes checking out a package from an upstream project, creating patches, branching a repository, and more.
Book “Best Practice Guide”
This guide offers step-by-step instructions for the most common features of the Open Build
Service and the openSUSE Build Service.
Book “Reference Guide”
This guide covers ideas and motivations, concepts and processes of the Open Build Service
and also covers administration topics.
Book “User Guide”
This guide is intended for users and developers who want to dig deeper into Open Build
Service. It contains information on backgrounds, setting up your computer for working
with OBS, and usage scenarios.
vi
Available Documentation
2 Feedback
Several feedback channels are available:
Bugs and Enhancement Requests
Help for openSUSE is provided by the community. Refer to https://en.opensuse.org/Porfor more information.
tal:Support
Bug Reports
To report bugs for Open Build Service, go to https://bugzilla.opensuse.org/ , log in, and
click New.
Mail
For feedback on the documentation of this product, you can also send a mail to doc-
team@suse.com . Make sure to include the document title, the product version and the
publication date of the documentation. To report errors or suggest enhancements, provide
a concise description of the problem and refer to the respective section number and page
(or URL).
3 Documentation Conventions
The following notices and typographical conventions are used in this documentation:
/etc/passwd : directory names and le names
PLACEHOLDER : replace PLACEHOLDER with the actual value
PATH : the environment variable PATH
ls , --help : commands, options, and parameters
user : users or groups
package name : name of a package
Alt
,
Alt
– F1 : a key to press or a key combination; keys are shown in uppercase as on
a keyboard
File, File Save As: menu items, buttons
Dancing Penguins (Chapter Penguins, ↑Another Manual): This is a reference to a chapter in
another manual.
vii
Feedback
Commands that must be run with root privileges. Often you can also prefix these commands with the sudo command to run them as non-privileged user.
root # command
geeko > sudo command
Commands that can be run by non-privileged users.
geeko > command
Notices
Warning: Warning Notice
Vital information you must be aware of before proceeding. Warns you about security
issues, potential loss of data, damage to hardware, or physical hazards.
Important: Important Notice
Important information you should be aware of before proceeding.
Note: Note Notice
Additional information, for example about differences in software versions.
Tip: Tip Notice
Helpful information, like a guideline or a piece of practical advice.
4 Contributing to the Documentation
The OBS documentation is written by the community. And you can help too!
Especially as an advanced user or an administrator of OBS, there will be many topics where
you can pitch in even if your English is not the most polished. Conversely, if you are not very
experienced with OBS but your English is good: We rely on community editors to improve the
language.
viii
Contributing to the Documentation
This guide is written in DocBook XML which can be converted to HTML or PDF documentation.
To clone the source of this guide, use Git:
git clone https://github.com/openSUSE/obs-docu.git
To learn how to validate and generate the OBS documentation, see the le README .
To submit changes, use GitHub pull requests:
1. Fork your own copy of the repository.
2. Commit your changes into the forked repository.
3. Create a pull request. This can be done at https://github.com/openSUSE/obs-docu
.
It is even possible to host instance-specific content in the official Git repository, but it needs to
be tagged correctly. For example, parts of this documentation are tagged as . In this case, the paragraph will only become visible when creating the openSUSE ver-
sion of a guide.
ix
Contributing to the Documentation
1 Installation and Configuration
1.1 Planning
For testing an own OBS instance and for small setups like only packaging some scripts from
your administrators into RPMS and creating proper installation sources from them, the ready
to use obs-server appliance images are the easiest way. You can download them from http://
openbuildservice.org/download/
.
To use the OBS for your Linux software development with many packages, projects and users,
consider setting up an own installation. Depending on the number of users, projects, and architectures, you can split up the back-end (called partitioning) and have separate hosts for the
front-end and the database.
But for most installations it is still OK to run everything but workers one host with enough
resources.
For flexibility and if you want some kind of high availability it is recommended to use virtualization for the different components.
1.1.1
Resource Planning
Normally for a small to middle installation a setup with everything except workers on one host
is sufficient. You should have separate /srv volume for the back-end data, XFS as le system
is best choice.
For each scheduler architecture you should add 4 GB RAM and one CPU core. For each build
distribution you should add at least 50GB disk space per architecture.
A medium instance with about 50 users can easily run on a machine with 16GB RAM 4 cores
and 1 TB storage. The storage of course depend on the size of your projects and how often you
have new versions.
For bigger installations you can use separate networks for back-end communication, workers
and front-end.
1
Planning
The reference installation on build.opensuse.org with lot of users, distributions runs on a partitioned setup with:
a mysql cluster as database
api-server: 16GB RAM 4 cores 50GB disk
separate binary back-ends (scheduler, dispatcher, reposerver, publisher, warden)
source server 11 GB RAM, 4 cores, 3 TB disk (RAM used mainly for caching)
main back-end: 62 GB RAM (oversized), 16TB disk
lot of workers (see - https://build.opensuse.org/monitor )
For build time and performance the count and performance of available worker hosts more
important as the remaining parts.
1.2 Simple Installation
Simple installation means, all OBS services running on the same machine.
Important
It is very important that you read the README.SETUP le coming with your OBS version
and follow the instructions there, because here maybe changes to this version.
Before you start the installation of the OBS, you should make sure that your hosts have the
correct fully qualified hostname and DNS is working and can resolve all names.
1.2.1
Back-end Installation
The back-end hosts all sources and built packages. It also schedules the jobs. You need to install
the "obs-server" package for this. You need to check the /usr/lib/obs/server/BSConfig.pm le,
but the defaults should be good enough for the simple case.
You can control the different back-end components via systemctl. Basically you can enable/disable the service during booting the system and start/stop/restart it in a running system. For
more information, see https://www.freedesktop.org/software/systemd/man/systemctl.html#Commands
2
. For example, to restart the repository server use
Simple Installation
systemctl restart obsrepserver.service
TABLE 1.1: SERVICE NAMES
Component
Service Name
Remarks
Source Server
obssrcserver.service
Repository
Server obsrepserver.service
Source
Services obsservice.service
Download
obsdodup.service
since 2.7
Delta Storage
obsdeltastore.service
since 2.7
Scheduler
obsscheduler.service
Dispatcher
obsdispatcher.service
Publisher
obspublisher.service
Signer
obssigner.service
Warden
obswarden.service
The sequence in the table reflects the start sequence, you need to enable the services with
systemctl start
rst and then you can start them:
systemctl start obssrcserver.service
systemctl start obsrepserver.service
systemctl start obsservice.service
systemctl start obsdodup.service
systemctl start obsdeltastore.service
systemctl start obsscheduler.service
systemctl start obsdispatcher.service
systemctl start obspublisher.service
systemctl start obssigner.service
systemctl start obswarden.service
3
Back-end Installation
Warning
The commands start services which are accessible from the outside. Do not do this on a
system connected to an untrusted network or make sure to block the ports with a firewall.
1.2.1.1
Cloud Upload Setup
In order to setup the Cloud Upload feature you will need to configure the tools required per each
cloud provider. Right now we only support the AWS Amazon Cloud (https://aws.amazon.com )
as provider.
1.2.1.1.1
How does the AWS's authentication work for uploading images?
We are going to use the role based authentication provided by Amazon to enable the OBS instance to upload images to other user's accounts.
The users will obtain an external ID (automatically created and unique) and the OBS account
ID to create an Identity and Access Management (IAM) role. After the user created the role, he
needs to provide the Amazon Resource Name (ARN) of the role to OBS. OBS will use this ARN
to obtain temporary credentials, therefore an uploader account is necessary which we need to
configure (see AWS authentication credentials setup). OBS will use the ARN to obtain temporary
credentials for the users account to upload the appliance. The ARN and the external ID are not
considered as a secret.
FIGURE 1.1: AWS AUTHENTICATION FOR ROLE BASED ACCESS
The whole workflow is described in the AWS documentation (https://docs.aws.amazon.com/IAM/
latest/UserGuide/id_roles_create_for-user_externalid.html)
4
.
Back-end Installation
1.2.1.1.2
AWS authentication credentials setup
For uploading images in AWS two tools are needed internally the aws CLI (https://aws.amazon.com/cli)
and the ec2uploadimg (https://github.com/SUSE/Enceladus/tree/master/ec2u-
tils/ec2uploadimg)
(those are installed as dependencies). For setting this up you have to con-
figure both tools in the machine where the cloud upload workers will be running.
The configurations are stored in /etc/obs/cloudupload (the clouduploader home directory). In
this directory there is a .ec2utils.conf le which contains e.g. the helper instance AMIs (see
this example (https://github.com/SUSE/Enceladus/blob/master/ec2utils/ec2utils.conf.example) ).
In the /.aws/credentials le the AWS credentials of the OBS account are stored (see this documentation (https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)
1.2.2
).
Front-end Installation
You need to install the "obs-api" package for this and a MySQL server.
1.2.2.1
MySQL Setup
Make sure that the mysql server is started on every system reboot (use "insserv mysql" for permanent start). You should run mysql_secure_installation and follow the instructions.
Create the empty production databases:
# mysql -u root -p
mysql> create database api_production;
mysql> quit
Use a separate MySQL user (for example, obs ) for the OBS access:
# mysql -u root -p
mysql> create user 'obs'@'%' identified by 'TopSecretPassword';
mysql> create user 'obs'@'localhost' identified by 'TopSecretPassword';
mysql> GRANT all privileges ON api_production.*
TO 'obs'@'%', 'obs'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit
Configure your MySQL user and password in the "production" section of the api config: /srv/
www/obs/api/config/database.yml
Example:
# MySQL (default setup).
5
Versions 4.1 and 5.0 are recommended.
Front-end Installation
#
# Get the fast C bindings:
#
gem install mysql
#
(on OS X: gem install mysql -- --include=/usr/local/lib)
# And be sure to use new-style password hashing:
#
http://dev.mysql.com/doc/refman/5.0/en/old-client.html
production:
adapter: mysql2
database: api_production
username: obs
password: TopSecretPassword
encoding: utf8
timeout: 15
pool: 30
Now populate the database
cd /srv/www/obs/api/
sudo RAILS_ENV="production" rake db:setup
sudo RAILS_ENV="production" rake writeconfiguration
sudo chown -R wwwrun.www log tmp
Now you are done with the database setup.
1.2.2.2
Apache Setup
Now we need to configure the Web server. By default, you can reach the familiar web user
interface and also api both on port 443 speaking https. Repositories can be accessed via http
on port 82 (once some packages are built). An overview page about your OBS instance can be
found behind 'http://localhost'.
The obs-api package comes with an Apache vhost le, which does not need to get modified
when you stay with these defaults: /etc/apache2/vhosts.d/obs.conf
Install the required packages via
zypper in obs-api apache2 apache2-mod_xforward rubygem-passenger-apache2 memcached
Add the following Apache modules in /etc/sysconfig/apache2 :
APACHE_MODULES="... passenger rewrite proxy proxy_http xforward headers socache_shmcb"
Enable SSL in /etc/sysconfig/apache2 via
6
Front-end Installation
APACHE_SERVER_FLAGS="SSL"
For production systems you should order official SSL certificates. For testing follow the instructions to create a self signed SSL certificate:
mkdir /srv/obs/certs
openssl genrsa -out /srv/obs/certs/server.key 1024
openssl req -new -key /srv/obs/certs/server.key \
-out /srv/obs/certs/server.csr
openssl x509 -req -days 365 -in /srv/obs/certs/server.csr \
-signkey /srv/obs/certs/server.key -out /srv/obs/certs/server.crt
cat /srv/obs/certs/server.key /srv/obs/certs/server.crt \
> /srv/obs/certs/server.pem
To allow the usage of https API in Web UI code you need to trust your certificate as well:
cp /srv/obs/certs/server.pem /etc/ssl/certs/
c_rehash /etc/ssl/certs/
1.2.2.3
API Configuration
Check and edit /srv/www/obs/api/config/options.yml
If you change the hostnames/ips of the api, you need to adjust frontend_host accordingly. If
you want to use LDAP, you need to change the LDAP settings as well. Look at the Section 3.7,
“Managing Users and Groups” for details. You will nd examples and more details in the Section 2.1,
“Configuration Files”.
It is recommended to enable
use_xforward: true
as well here.
Afterwards you can start the OBS web api and make it permanent via
systemctl enable apache2
systemctl start apache2
systemctl enable obsapidelayed.service
systemctl start obsapidelayed.service
systemctl enable memcached.service
systemctl start memcached.service
Now you have you own empty instance running and you can do some online configuration steps.
7
Front-end Installation
1.2.3
Online Configuration
To customize the OBS instance you may need to configure some settings via the OBS API and
Web user interface.
First you should change the password of the Admin account, for this you need rst login as user
Admin in the Web UI with the default password "opensuse". Click on the Admin link (right top
of the page), here you can change the password.
After changing the Admin password, set up osc to use the Admin account for more changes.
Here an example:
osc -c ~/.obsadmin_osc.rc -A https://api.testobs.org
Follow the instructions on the terminal.
Warning
The password is stored in clear text in this le by default, so you need to give this le
restrictive access rights, only read/write access for your user should be allowed. osc
allows to store the password in other ways (in keyrings for example), refer to the osc
documentation for this.
Now you can check out the main configuration of the OBS:
osc -c ~/.obsadmin_osc.rc api /configuration >/tmp/obs.config
cat /tmp/obs.config
Open Build Service
<p class="description">
The <a href="http://openbuildservice.org"> Open Build Service (OBS)</a>
is an open and complete distribution development platform that provides a
transparent
infrastructure for development of Linux distributions, used by openSUSE, MeeGo
and other distributions.
Supporting also Fedora, Debian, Ubuntu, RedHat and other Linux distributions.
</p>
<p class="description">
The OBS is developed under the umbrella of the <a href="http://
www.opensuse.org">openSUSE project<
/a>. Please find further informations on the <
a href="http://wiki.opensuse.org/openSUSE:Build_Service">openSUSE Project wiki
pages</a>.
8
Online Configuration
</p>
<p class="description">
The Open Build Service developer team is greeting you. In case you use your OBS
productive
in your facility, please do us a favor and add yourself at <
a href="http://wiki.opensuse.org/openSUSE:Build_Service_installations">
this wiki page</a>. Have fun and fast build times!
</p>
private
on
off
on
allow
off
on
off
on
off
on
on
on
unconfigured@openbuildservice.org
^home:.+
home projects
armv7l
i586
x86_64
Important
unlisted_projects_filter only admit Regular Expression (see RLIKE specifications of
MySQL/MariaDB for more information) and unlisted_projects_filter_description is part
of the link shown in the project list for filtering
You should edit this le according to your preferences, then sent it back to the server:
osc -c ~/.obsadmin_osc.rc api /configuration -T /tmp/obs.config
9
Online Configuration
If you want to use an interconnect to another OBS instance to reuse the build targets you can
do this as Admin via the Web UI or create a project with a remoteurl tag (see Section 2.4.2,
“Project Metadata”)
openSUSE.org Project
This project refers to projects hosted on the Build Service
[...]
Use openSUSE.org:openSUSE:12.3 for example to build against the
openSUSE:12.3 project as specified on the opensuse.org Build Service.
https://api.opensuse.org/public
You can create the project using a le with the above content with osc like this:
osc -c ~/.obsadmin_osc.rc meta prj openSUSE.org -F /tmp/openSUSE.org.meta
You also can import binary distribution, see Section 3.2.2, “Importing Distributions” for this.
The OBS has a list of available distributions used for build. This list is displayed to user, if they
are adding repositories to their projects. This list can be managed via the API path /distributions
osc -c ~/.obsadmin_osc.rc api /distributions > /tmp/distributions.xml
Example distributions.xml le:
SLE-12-SP1
SUSE:SLE-12-SP1
SLE-12-SP1
standard
http://www.suse.com/
x86_64
You can add your own distributions here and update the list on the server:
osc -c ~/.obsadmin_osc.rc api /distributions -T /tmp/distributions.xml
10
Online Configuration
1.3 Worker Farm
To not burden your OBS back-end daemons with the unpredictable load package builds can
produce (think someone builds a monstrous package like LibreOffice) you should not run OBS
workers on the same host as the rest of the back-end daemons.
Important
You back-end need to be configured to use the correct hostnames for the repo and source
server and the ports need to be reachable by the workers. Also, the IP addresses of the
workers need to be allowed to connect the services. (look at the /usr/lib/obs/server/BSConfig.pm::ipaccess array).
You can deploy workers quite simply using the worker appliance. Or install a minimum system
plus the obs-worker package on the hardware.
Edit the /etc/sysconfig/obs-server le, at least OBS_SRC_SERVER, OBS_REPO_SERVERS and
OBS_WORKER_INSTANCES need to be set. More details in the Section 2.1, “Configuration Files”.
start the worker:
systemctl enable obsworker
systemctl start obsworker
1.4 Distributed Setup
All OBS back-end daemons can also be started on individual machines in your network. Also,
the front-end Web server and the MySQL server can run on different machines. Especially for
large scale OBS installations this is the recommended setup.
A setup with partitioning is very similar to the steps of the simple setup. Here we are only
mention the differences to the simple setup.
Note
You need to make sure that the different machines can communicate via the network, it
is very recommended to use a separate network for this to isolate it from the public part.
11
Worker Farm
On all back-end hosts you need to install the obs-server package. On the front-end host you need
to install the obs-api package.
Important
Only one source server instance can be exist on a single OBS installation.
The binary back-end can be split on project level, this is called partitioning.
On one partition following services needs to be configured and run:
1. repserver
2. schedulers
3. dispatcher
4. warden
5. publisher
You do not need to share any directories on File System level between the partitions.
Here some example for partitioning:
1. A main partition for everything not in the others (host mainbackend)
2. A home partition for all home projects of the users (host homebackend)
3. A release partition for released software projects (host releasebackend)
The configuration is done in the back-end config le /usr/lib/obs/server/BSConfig.pm. Most
parts of the le can be shared between the back-ends.
Here the important parts of the mainbackend of out testobs.org installation:
[...]
my $hostname = Net::Domain::hostfqdn() || 'localhost';
# IP corresponding to hostname (only used for $ipaccess); fallback to localhost since
inet_aton may fail to resolve at shutdown.
my $ip = quotemeta inet_ntoa(inet_aton($hostname) || inet_aton("localhost"));
my $frontend = 'api.testobs.org'; # FQDN of the Web UI/API server if it's not $hostname
# If defined, restrict access to the backend servers (bs_repserver, bs_srcserver,
bs_service)
our $ipaccess = {
12
Distributed Setup
'127\..*' => 'rw', # only the localhost can write to the backend
"^$ip" => 'rw',
# Permit IP of FQDN
"10.20.1.100" => 'rw',
# Permit IP of srcsrv.testobs.org
"10.20.1.101" => 'rw',
# Permit IP of mainbackend.testobs.org
"10.20.1.102" => 'rw',
# Permit IP of homebackend.testobs.org
"10.20.1.103" => 'rw',
# Permit IP of releasebackend.testobs.org
'10.20.2.*' => 'worker',
# build results can be delivered from any client in the
network
};
# IP of the Web UI/API Server (only used for $ipaccess)
if ($frontend) {
my $frontendip = quotemeta inet_ntoa(inet_aton($frontend) || inet_aton("localhost"));
$ipaccess->{$frontendip} = 'rw' ; # in dotted.quad format
}
# also change the SLP reg files in /etc/slp.reg.d/ when you touch hostname or port
our $srcserver = "http://srcsrv.testobs.org:5352";
our $reposerver = "http://mainbackend.testobs.org:5252";
our $serviceserver = "http://service.testobs.org:5152";
#
our @reposervers = ("
http://mainbackend.testobs.org:5252,
http://homebackend.testobs.org:5252,
http://releasebackend.testobs.org:5252
");
# you can use different ports for worker connections
our $workersrcserver = "http://w-srcsrv.testobs.org:5353";
our $workerreposerver = "http://w-mainbackend.testobs.org:5253";
[...]
our $partition = 'main';
#
# this defines how the projects are split. All home: projects are hosted
# on an own server in this example. Order is important.
our $partitioning = [
'home:' => 'home',
'release' => 'release'
'.*'
=> 'main',
];
our $partitionservers = {
'home' => 'http://homebackend.testobs.org:5252',
'release' => 'http://releasebackend.testobs.org:5252',
'main' => 'http://mainbackend.testobs.org:5252',
};
[...]
13
Distributed Setup
On the other partition server you need to change "our $reposerver", "our $workerreposerver"
and "our $partition".
On all partition servers you need to start:
systemctl start obsrepserver.service
systemctl start obsscheduler.service
systemctl start obsdispatcher.service
systemctl start obspublisher.service
systemctl start obswarden.service
On the worker machines you should set of repo servers in the OBS_REPO_SERVERS variable.
You can also define workers with a subset of the repo servers to prioritize partitions.
1.5 Monitoring
In this chapter you will nd some general monitoring instructions for the Open Build Service. All
examples are based on Nagios plugins, but the information provided should be easily adaptable
for other monitoring solutions.
1.5.1
1.5.1.1
Endpoint Checks
HTTP Checks: Checking Whether the HTTP Server Responds
This check will output a critical if the HTTP server with ip address 172.19.19.19 (-I
172.19.19.19) listening on port 80 (-p 80) does not answer and output a warning if the HTTP
return code is not 200. The server name that will be used is server (-H server) which is important
if different virtual hosts are listening on the same port.
check_http -H server -I 172.19.19.19 -p 80 -u http://server
The same check, but this time it will check a ssl enabled HTTP server.
check_http -S -H server -I 172.19.19.19 -p 443 -u https://server
It is also possible to check the presence of a certain string in the HTTP response. In this case it
will check for the string Source Service Server.
14
Monitoring
check_http -s "Source Service Server" -S -H server -I 172.19.19.19 -p 5152
Open Build Service HTTP endpoints that should be checked:
1. Web Interface / API: port 443
2. Repository Server: port 82
3. Package Repository Server: port 5252
4. Source Repository Server: port 5352
5. Source Service Server: port 5152
6. Cloud Upload Server: port 5452
1.5.2
Common Checks
This is a list of common checks that should be run on each individual server.
1.5.2.1
Disk Space: Checking Available Disk Space
This check will output a warning if less than 10 percent disk space is available (-w 10) and
output a critical if less than 5 percent disk space are available (-c 5). It will check all le systems
except le systems with type none (-x none).
check_disk -w 10 -c 5 -x none
1.5.2.2
Memory Usage: Checking Available Memory
This check will output a warning if less than 10 percent memory is available (-w 10) and output
a critical if less than 5 percent memory is available (-c 5). OS caches will be counted as free
memory (-C) and it will check the available memory (-f). check_mem.pl is not a standard Nagios
plugin and can be downloaded at https://exchange.nagios.org/ .
check_mem.pl -f -C -w 10 -c 5
15
Common Checks
1.5.2.3
NTP: Checking Date and Time
This check will compare the local time with the time provided by the NTP server pool.ntp.org
(-H pool.ntp.org). It will output a warning if the time differs by 0.5 seconds (-w 0.5) and output
a critical if the time differs by 1 seconds (-c 1).
check_ntp_time -H pool.ntp.org -w 0.5 -c 1
1.5.2.4
Ping: Checking That the Server Is Alive
This plugin checks if the server responds to a ping request and it will output a warning if the
respond time exceeds 200ms or 30 percent package loss (-w 200.0,30%) and output a critical if
the respond time exceeds 500ms or 60 percent package loss.
check_icmp -H server -w 200.0,30% -c 500.0,60%
1.5.2.5
Load: Checking the Load on the Server
This check will output a warning if the load value exceeded 7.0 in the last minute, 6.0 in the
last 5 minutes or 5.0 in the last 15 minutes (-w 7.0,6.0,5.0). It will output a critical if the load
value exceeded 12.0 in the last minute, 8.0 in the last 5 minutes or 6.0 in the last 15 minutes
(-c 12.0,8.0,6.0).
check_load -w 7.0,6.0,5.0 -c 12.0,8.0,6.0
1.5.2.6
Disk Health: Checking the Health of Local Hard Disks
This check is only relevant on physical systems with local storage attached to it. It will check the
disk status utilizing the S.M.A.R.T interface and it will output a critical if any of the S.M.A.R.T
values exceeds critical limits. check_smartmon is not a standard Nagios plugin and can be downloaded at https://exchange.nagios.org/ .
check_smartmon --drive /dev/sda --drive /dev/sdb
16
Common Checks
1.5.3
Other Checks
1.5.3.1
MySQL: Checking That the MySQL Database Is Responding
This check will check that the MySQL database server is running and that the database api_production is available.
check_mysql -H localhost -u nagios -p xxxxxx -d api_production
MySQL Databases to check:
1. api_production
2. mysql
1.5.3.2
Backup Status: Checking That a Valid Backup Is Available
It is always advisable to check that the last backup run was successful and a recent backup is
available. The check itself depends on the Backup solution that is used.
17
Other Checks
2 File System Overview
2.1 Configuration Files
2.1.1
Front-end Configuration
The front-end is configured with 4 les:
/srv/www/obs/api/config/database.yml
/srv/www/obs/api/config/options.yml
/srv/www/obs/api/config/feature.yml
/etc/apache2/vhosts.d/obs.conf
2.1.1.1
database.yml
This le has the information needed to access the database. It contain credentials for the database
access and should be only readable by root and the group running the Web server (www).
The le has settings for the production, development and test ruby environment, for production
systems only the production section is important.
Example production section
production:
adapter: mysql2
database: api_production
username: obsapiuser
password: topsecret
encoding: utf8
timeout: 15
pool: 30
TABLE 2.1: DATABASE CONFIGURATION KEYWORDS
keyword
Description
Remarks
adapter
Database driver
only mysql databases are supported
database
Database name
do not change !
18
Configuration Files
keyword
Description
Remarks
username
mysql user name
database user, not a system user
password
password for this user
clear text
encoding
codetable
timeout
wait time in milliseconds
pool
number of open connections
socket
path to the mysql socket
host
IP address or hostname of the for remote servers
port
port number of the mysql
per thread
same host only
mysql server
server
2.1.1.2
for remote servers
options.yml
The configuration le /srv/www/obs/api/config/options.yml is the default configuration le
for the Open Build Service Web UI and API. It contains configuration parameters for example
for back-end connections and connection to the API. Important are the configurations for source
and front-end hosts The configuration for LDAP authentication is also located in this le.
Note
More and more configurations will be moved to the database and do not longer exist in
this le. The database configuration can be accessed via the API /configuration path.
TABLE 2.2: options.yml CONFIGURATION ITEMS
Config item
Description
Values default
Remarks
use_xforward
Use mod_xforward
true false
Apache only, should
19
module
be true
Front-end Configuration
Config item
Description
Values default
Remarks
use_nginx_redirect
Use X-Accel-Redirect
/inter-
Nginx only
nal_redirect
min_votes_for_rating
Minimum votes for a
integer 3
response_schema_valida-
Set to true to verify
true false
tion
rating
XML responses com-
test/debug option
ply to the schema
source_host
back-end source serv-
localhost
source_port
back-end source serv-
integer 5352
source_protocol
back-end source serv-
http , https
front end_host
Front-end host
localhost
frontend_port
Front-end port
integer 443
frontend_protocol
Front-end protocol
http https
external_frontend_host
External Front-end
er host
er port
er protocol
if your users access
host
the hosts through a
proxy or different
name
external_frontend_port
External Front-end
integer 443
external_frontend_proto-
External Front-end
http https
extended_backend_log
Extended back-end
true false
col
20
port
protocol
log
test/debug option
Front-end Configuration
Config item
Description
Values default
Remarks
proxy_auth_mode:
turn proxy mode on/
:off :on
see LDAP section
proxy_auth_test_user
Test user
coolguy
test/debug option
proxy_auth_test_email
Email of Test user
coolguy@ exam- test/debug option
o
ple.com
global_write_through
if set to false, the API
will only fake writes
true false
test/debug option
30
moved to /configura-
to back-end
auto_cleanup_after_days
not longer used
errbit_api_key
API key of the appli-
test/debug option
errbit_host
installation of er-
test/debug option
cation
rbit.com a Ruby error
tion API
catcher
errbit_api_key
API key of the appli-
ldap_mode:
OBS LDAP mode on/
test/debug option
cation
o
:off :on
see LDAP section
Example options.yml
#
# This file contains the default configuration of the Open Build Service
# API.
#
# Make use of mod_xforward module in apache
use_xforward: true
# Make use of X-Accel-Redirect for Nginx.
21
Front-end Configuration
# http://kovyrin.net/2010/07/24/nginx-fu-x-accel-redirect-remote
#use_nginx_redirect: /internal_redirect
# Minimum count of rating votes a project/package needs to # be taken in
# account
# for global statistics:
min_votes_for_rating: 3
# Set to true to verify XML reponses comply to the schema
response_schema_validation: false
# backend source server
source_host: localhost
source_port: 5352
#source_protocol: https
# api access to this instance
frontend_host: localhost
frontend_port: 443
frontend_protocol: https
# if your users access the hosts through a proxy (or just a different name,
# use this to
# overwrite the settings for users)
#external_frontend_host: api.opensuse.org
#external_frontend_port: 443
#external_frontend_protocol: https
extended_backend_log: true
# proxy_auth_mode can be :off, :on or :simulate
proxy_auth_mode: :off
# ATTENTION: If proxy_auth_mode'is :on, the frontend takes the user
# name that is coming as headervalue X-username as a
# valid user does no further authentication. So take care...
proxy_auth_test_user: coolguy
proxy_auth_test_email: coolguy@example.com
# set this to enable auto cleanup requests after the given days
auto_cleanup_after_days: 30
#schema_location
#version
# if set to false, the API will only fake writes to backend (useful in
22
Front-end Configuration
# testing)
# global_write_through: true
# see
# http://colszowka.heroku.com/2011/02/22/setting-up-your-custom-hoptoad-notifierendpoint-for-free-using-errbit-on-heroku
#errbit_api_key: api_key_of_your_app
#errbit_host: installation.of.errbit.com
2.1.1.3
feature.yml
The configuration le /srv/www/obs/api/config/feature.yml contains the default configuration
about features that can be enabled or disabled in Open Build Service.
TABLE 2.3: feature.yml CONFIGURATION ITEMS
Config item
Description
Values default
Remarks
image_templates
enable/disable image
true false
see Reference Guide
kiwi_image_editor
enable/disable Kiwi
true false
cloud_upload
enable/disable Cloud
true false
template feature
Image Editor
Upload setup
for more information
Example feature.yml
production:
features: &default
image_templates: true
kiwi_image_editor: false
cloud_upload: false
development:
features:
<<: *default
kiwi_image_editor: true
cloud_upload: true
test:
features:
<<: *default
kiwi_image_editor: true
23
Front-end Configuration
cloud_upload: true
2.1.1.4
Apache Virtual Host obs.conf
The Apache configuration depends on the Apache version and which extra options are used, so
use the documentation of the Apache version you are using.
Here, as an example, the standard configuration used by the appliance: Apache vhost example
Listen 82
# May needed on old distributions or after an update from them.
#Listen 443
# Passenger defaults
PassengerSpawnMethod "smart"
PassengerMaxPoolSize 20
#RailsEnv "development"
# allow long request urls and being part of headers
LimitRequestLine 20000
LimitRequestFieldsize 20000
# Just the overview page
# just give an overview about this OBS instance via static web page
DocumentRoot
"/srv/www/obs/overview"
Options Indexes
Require all granted
# Build Results
# The resulting repositories
DocumentRoot
"/srv/obs/repos"
Options Indexes FollowSymLinks
Require all granted
24
Front-end Configuration
# OBS WEB UI & API
ServerName api
#
General setup for the virtual host
DocumentRoot
"/srv/www/obs/api/public"
ErrorLog /srv/www/obs/api/log/apache_error.log
TransferLog /srv/www/obs/api/log/apache_access.log
PassengerMinInstances 2
PassengerPreStart https://api
SSLEngine on
#
SSL protocols
#
Supporting TLS only is adequate nowadays
SSLProtocol all -SSLv2 -SSLv3
#
SSL Cipher Suite:
#
List the ciphers that the client is permitted to negotiate.
#
We disable weak ciphers by default.
#
See the mod_ssl documentation or "openssl ciphers -v" for a
#
complete list.
SSLCipherSuite ALL:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!MD5:@STRENGTH
SSLCertificateFile /srv/obs/certs/server.crt
SSLCertificateKeyFile /srv/obs/certs/server.key
AllowOverride all
Options -MultiViews
# This requires mod_xforward loaded in apache
# Enable the usage via options.yml
# This will decrease the load due to long running requests a lot (unloading
from rails stack)
XForward on
Require all granted
SetEnvIf User-Agent ".*MSIE [1-5].*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog /var/log/apache2/ssl_request_log
25
ssl_combined
Front-end Configuration
# from http://guides.rubyonrails.org/asset_pipeline.html
Header unset ETag
FileETag None
# RFC says only cache for 1 year
ExpiresActive On
ExpiresDefault "access plus 1 year"
SetEnvIf User-Agent ".*MSIE [1-5].*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
## Older firefox versions needs this, otherwise it wont cache anything over SSL.
Header append Cache-Control "public"
2.1.2
Back-end Configuration
The Back-end is configured with 2 les:
/etc/sysconfig/obs-server - a shell script used for workers and the OBS start scripts
/usr/lib/obs/server/BSConfig.pm - a perl script defining some global variables
2.1.2.1
/etc/sysconfig/obs-server
This script is used to set up the basic paths and the worker. the most important settings are the
OBS_SRC_SERVER and OBS_REPO_SERVERS and the OBS_WORKER_INSTANCES.
TABLE 2.4: obs-server VARIABLES
Variable
Description
Values default
OBS_BACKENDCODE_DIR
Path to the back-
/usr/lib/obs/serv-
OBS_RUN_DIR
communication di-
/srv/obs/run
OBS_LOG_DIR
logging directory
/srv/obs/log
26
end scripts
rectory base
Remarks
er/
Back-end Configuration
Variable
Description
Values default
OBS_BASE_DIR
base directory
/srv/obs
OBS_API_AUTOSETUP
Automatically set-
yes no
up API and Web UI
Remarks
appliance only,
will overwrite config les
OBS_SRC_SERVER
source server host
localhost:5352
only one
OBS_REPO_SERVERS
repository server
localhost:5252
maybe a list
OBS_WORKER_INSTANCES
number of build
integer 0
OBS_WORKER_INSTANCE
names of the work-
OBS_WORKER_DIRECTORY
worker base direc-
OBS_WORKER_PORTBASE
The base for port
_NAMES
host
instances
space-separated
ers
list
tory
numbers used by
integer 0
worker
OBS_WORKER_JOBS
Number of parallel
integer 1
OBS_WORKER_TEST_MODE
Run in test mode
yes no
OBS_WORKER_HOST LA-
one or more labels
OBS_USE_SLP
Register in SLP
OBS_CACHE_DIR
cache directory for
BELS
compile jobs
ber
may used by con-
for the build host
server
0 OS assign num-
straints
yes no
downloaded packages
27
Back-end Configuration
Variable
Description
OBS_CACHE_SIZE
package cache size
OBS_WORKER_NICE _LEVEL
nice level of run-
18
OBS_VM_TYPE
VM type
auto xen kvm
ning workers
Values default
Remarks
in MB
lxc zvm emulator:$arch none
OBS_VM_KERNEL
Set kernel used by
worker
none (/boot/vm-
linuz)
KVM option
OBS_VM_INITRD
initrd used by
worker
none (/boot/vm-
linuz)
KVM option
OBS_VM_DISK_AUTOSETUP
Autosetup disk size
4096
in MB
OBS_VM_DISK_AUTOSETUP
Autosetup swap
1024
on MB
OBS_VM_DISK_AUTOSETUP
File System used
ext3
OBS_VM_DISK_AUTOSETUP
Special mount op-
OBS_VM_USE_TMPFS
Enable build in
yes no
OBS_INSTANCE_MEMORY
Memory allocated
512
OBS_STORAGE_AUTOSETUP
storage auto con-
yes no
may destroy disk
OBS_SETUP_WORKER
LVM via obsstor-
take_all use_ob-
may destroy disk
_ROOT_FILESIZE
_SWAP_FILESIZE
_FILESYSTEM
_MOUNT_OPTIONS
_PARTITIONS
28
size
with autosetup
tions
memory
for a VM
figuration
agesetup
s_vg none
requires much
memory
content
content
Back-end Configuration
Variable
Description
OBS_WORKER_CACHE_SIZE
LVM partition for
OBS_WORKER_ROOT_SIZE
LVM partition for
OBS_WORKER_SWAP_SIZE
LVM partition for
OBS_WORKER_BINARIES
proxy service for
OBS_ROOT_SSHD_KEY_URL
ssh pub key to al-
OBS_WORKER_SCRIPT_URL
URL to the initial
_PROXY
Values default
Remarks
cache size
root size
swap size
caching binaries
low root user login
for mass deployment
script
For workers the settings could be declared in the /etc/buildhost.config le as well.
#
# NOTE: all these options can be also declared in /etc/buildhost.config on each worker
differently.
#
## Path:
Applications/OBS
## Description: The OBS backend code directory
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty dir will lead to the fall back directory, typically /usr/lib/obs/server/
#
OBS_BACKENDCODE_DIR=""
## Path:
Applications/OBS
## Description: The base for OBS communication directory
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty dir will lead to the fall back directory, typically /srv/obs/run
29
Back-end Configuration
#
OBS_RUN_DIR="/srv/obs/run"
## Path:
Applications/OBS
## Description: The base for OBS logging directory
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty dir will lead to the fall back directory, typically /srv/obs/log
#
OBS_LOG_DIR="/srv/obs/log"
## Path:
Applications/OBS
## Description: The base directory for OBS
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty dir will lead to the fall back directory, typically /srv/obs
#
OBS_BASE_DIR=""
## Path:
Applications/OBS
## Description: Automatically set up API and Web UI for OBS server, be warned, this will
replace config files!
## Type:
("yes" | "no")
## Default:
"no"
## Config:
OBS
#
# This is usally only enabled on the OBS Appliance
#
OBS_API_AUTOSETUP="yes"
#
# NOTE: all these options can be also declared in /etc/buildhost.config on each worker
differently.
#
## Path:
Applications/OBS
## Description: define source server host to be used
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty setting will point to localhost:5352 by default
#
OBS_SRC_SERVER=""
30
Back-end Configuration
## Path:
Applications/OBS
## Description: define repository server host to be used
## Type:
string
## Default:
""
## Config:
OBS
#
# An empty setting will point to localhost:5252 by default
#
OBS_REPO_SERVERS=""
## Path:
Applications/OBS
## Description: define number of build instances
## Type:
integer
## Default:
0
## Config:
OBS
#
# 0 instances will automatically use the number of CPU's
#
OBS_WORKER_INSTANCES="0"
## Path:
Applications/OBS
## Description: define names of build instances for z/VM
## Type:
string
## Default:
""
## Config:
OBS
#
# The names of the workers as defined in z/VM. These must have two minidisks
# assigned, and have a secondary console configured to the local machine:
# 0150 is the root device
# 0250 is the swap device
#
#OBS_WORKER_INSTANCE_NAMES="LINUX075 LINUX076 LINUX077"
OBS_WORKER_INSTANCE_NAMES=""
## Path:
Applications/OBS
## Description: The base directory, where sub directories for each worker will get
created
## Type:
string
## Default:
""
## Config:
OBS
#
#
OBS_WORKER_DIRECTORY=""
## Path:
Applications/OBS
## Description: The base for port numbers used by worker instances
31
Back-end Configuration
## Type:
integer
## Default:
"0"
## Config:
OBS
#
# 0 means let the operating system assign a port number
#
OBS_WORKER_PORTBASE="0"
## Path:
Applications/OBS
## Description: Number of parallel compile jobs per worker
## Type:
integer
## Default:
"1"
## Config:
OBS
#
# this maps usually to "make -j1" during build
#
OBS_WORKER_JOBS="1"
## Path:
Applications/OBS
## Description: Run in test mode (build results will be ignore, no job blocking)
## Type:
("yes" | "")
## Default:
""
## Config:
OBS
#
OBS_WORKER_TEST_MODE=""
## Path:
Applications/OBS
## Description: define one or more labels for the build host.
## Type:
string
## Default:
""
## Config:
OBS
#
# A label can be used to build specific packages only on dedicated hosts.
# For example for benchmarking.
#
OBS_WORKER_HOSTLABELS=""
## Path:
Applications/OBS
## Description: Register in SLP server
## Type:
("yes" | "no")
## Default:
"yes"
## Config:
OBS
#
#
OBS_USE_SLP="yes"
## Path:
32
Applications/OBS
Back-end Configuration
## Description: Use a common cache directory for downloaded packages
## Type:
string
## Default:
""
## Config:
OBS
#
# Enable caching requires a given directory here. Be warned, content will be
# removed there !
#
OBS_CACHE_DIR=""
## Path:
Applications/OBS
## Description: Defines the package cache size
## Type:
size in MB
## Default:
""
## Config:
OBS
#
# Set the size to 50% of the maximum usable size of this partition
#
OBS_CACHE_SIZE=""
## Path:
Applications/OBS
## Description: Defines the nice level of running workers
## Type:
integer
## Default:
18
## Config:
OBS
#
# Nicenesses range from -20 (most favorable
scheduling) to 19 (least
# favorable).
# Default to 18 as some testsuites depend on being able to switch to
# one priority below (19) _and_ having changed the numeric level
# (so going from 19->19 makes them fail).
#
OBS_WORKER_NICE_LEVEL=18
## Path:
Applications/OBS
## Description: Set used VM type by worker
## Type:
("auto" | "xen" | "kvm" | "lxc" | "zvm" | "emulator:$arch" | "emulator:
$arch:$script" | "none")
## Default:
"auto"
## Config:
OBS
#
#
OBS_VM_TYPE="auto"
## Path:
Applications/OBS
## Description: Set kernel used by worker (kvm)
## Type:
33
("none" | "/boot/vmlinuz" | "/foo/bar/vmlinuz)
Back-end Configuration
## Default:
"none"
## Config:
OBS
#
# For z/VM this is normally /boot/image
#
OBS_VM_KERNEL="none"
## Path:
Applications/OBS
## Description: Set initrd used by worker (kvm)
## Type:
("none" | "/boot/initrd" | "/foo/bar/initrd-foo)
## Default:
"none"
## Config:
OBS
#
# for KVM, you have to create with (example for openSUSE 11.2):
#
# export rootfstype="ext4"
# mkinitrd -d /dev/null -m "ext4 binfmt_misc virtio_pci virtio_blk" -k
vmlinuz-2.6.31.12-0.2-default -i initrd-2.6.31.12-0.2-default-obs_worker
#
# a working initrd file which includes virtio and binfmt_misc for OBS in order to work
fine
#
# for z/VM, the build script will create a initrd at the given location if
# it does not yet exist.
#
OBS_VM_INITRD="none"
## Path:
Applications/OBS
## Description: Autosetup for XEN/KVM/TMPFS disk (root) - Filesize in MB
## Type:
integer
## Default:
"4096"
## Config:
OBS
#
#
OBS_VM_DISK_AUTOSETUP_ROOT_FILESIZE="4096"
## Path:
Applications/OBS
## Description: Autosetup for XEN/KVM disk (swap) - Filesize in MB
## Type:
integer
## Default:
"1024"
## Config:
OBS
#
#
OBS_VM_DISK_AUTOSETUP_SWAP_FILESIZE="1024"
## Path:
Applications/OBS
## Description: Filesystem to use for autosetup {none,ext4}=ext4, ext3=ext3
34
Back-end Configuration
## Type:
string
## Default:
"ext3"
## Config:
OBS
#
#
OBS_VM_DISK_AUTOSETUP_FILESYSTEM="ext3"
## Path:
Applications/OBS
## Description: Filesystem mount options to use for autosetup
## Type:
string
## Default:
""
## Config:
OBS
#
#
OBS_VM_DISK_AUTOSETUP_MOUNT_OPTIONS=""
## Path:
Applications/OBS
## Description: Enable build in memory
## Type:
("yes" | "")
## Default:
""
## Config:
OBS
#
# WARNING: this requires much memory!
#
OBS_VM_USE_TMPFS=""
## Path:
Applications/OBS
## Description: Memory allocated for each VM (512) if not set
## Type:
integer
## Default:
""
## Config:
OBS
#
#
OBS_INSTANCE_MEMORY=""
## Path:
Applications/OBS
## Description: Enable storage auto configuration
## Type:
("yes" | "")
## Default:
""
## Config:
OBS
#
# WARNING: this may destroy data on your hard disk !
# This is usually only used on mass deployed worker instances
#
OBS_STORAGE_AUTOSETUP="yes"
## Path:
35
Applications/OBS
Back-end Configuration
## Description: Setup LVM via obsstoragesetup
## Type:
("take_all" | "use_obs_vg" | "none")
## Default:
"use_obs_vg"
## Config:
OBS
#
# take_all: WARNING: all LVM partitions will be used and all data erased !
# use_obs_vg:
A lvm volume group named "OBS" will be re-setup for the workers.
#
OBS_SETUP_WORKER_PARTITIONS="use_obs_vg"
## Path:
Applications/OBS
## Description: Size in MB when creating LVM partition for cache partition
## Type:
integer
## Default:
""
## Config:
OBS
#
#
OBS_WORKER_CACHE_SIZE=""
## Path:
Applications/OBS
## Description: Size in MB when creating LVM partition for each worker root partition
## Type:
integer
## Default:
""
## Config:
OBS
#
#
OBS_WORKER_ROOT_SIZE=""
## Path:
Applications/OBS
## Description: Size in MB when creating LVM partition for each worker swap partition
## Type:
integer
## Default:
""
## Config:
OBS
#
#
OBS_WORKER_SWAP_SIZE=""
## Path:
Applications/OBS
## Description: URL to a proxy service for caching binaries used by worker
## Type:
string
## Default:
""
## Config:
OBS
#
#
OBS_WORKER_BINARIES_PROXY=""
## Path:
36
Applications/OBS
Back-end Configuration
## Description: URL to a ssh pub key to allow root user login
## Type:
string
## Default:
""
## Config:
OBS
#
# This is usually used on mass (PXE) deployed workers)
#
OBS_ROOT_SSHD_KEY_URL=""
## Path:
Applications/OBS
## Description: URL to a script to be downloaded and executed
## Type:
string
## Default:
""
## Config:
OBS
#
# This is a hook for doing special things in your setup at boot time
#
OBS_WORKER_SCRIPT_URL=""
2.1.2.2
BSConfig.pm
This le is a perl module used by most back-end scripts, it mainly defines global variables. Since
it is a perl module, after changes the back-end servers need to be restarted to become aware
of the changes.
Warning
If there is a Perl syntax error in this le, the services will not start. Most likely you forgot
the semicolon on the end of a statement.
TABLE 2.5: BSConfig.pm VARIABLES
Variable
Description
$hostname
FQDN of the back-
leave as it is
$ip
IP address of the
leave as it is
37
end host
back-end host
Values default
Remarks
Back-end Configuration
Variable
Description
Values default
Remarks
$frontend
FQDN of the front-
undef
set only if the front-
end host
$ipaccess
Map of IP access
$srcserver
URL of the source
$reposerver
$serviceserver
host
Add all hosts if parti-
rules
tion are used
'http://$host-
server
name: 5352'
URL of the repo serv-
'http://$host-
er
name: 5252'
URL of the service
'http://$host-
server
end runs on another
partition specific
name: 5152'
$workersrcserver
URL of the source
optional for worker
$workerreposerver
URL of the repo serv-
optional for worker
$clouduploadserver
URL of the cloud up-
$servicedir
server
access
er
access
'http://$host-
load server
name: 5452'
Path to the service
/usr/lib/obs/ser-
scripts
vice/
$servicetempdir
Path to service temp
/var/tmp/
$serviceroot
Prefix to servicedir
$service_maxchild
Maximum number of
dir
concurrent jobs for
optional
optional
integer
unlimited if not set
source service
38
Back-end Configuration
Variable
Description
Values default
Remarks
$gpg_standard_key
Path to the standard
$hermesserver
URL of the notifica-
optional
$hermesnamespace
Namespace for the
optional
$notification _plugin
notification plugins
optional
@reposervers
List of reposervers
sign key
tion server
notifications
("http://$hostname: 5252")
$bsdir
Path to the back-end
/srv/obs
$bsuser
OS user running the
obsrun
$bsgroup
OS group running the
obsrun
$bsquotale
Package quota for
optional
$sched_asyncmode
Use asynchronous
Avoid issues with
directory
back-end
back-end
projects
scheduler
$sched_startupmode
Cold start mode
$disable_data_sync
fdatasync
$rundir
back-end communi-
39
cation
remote projects on
slow networks
0 12
may cause data corruption
$bsdir/run
Back-end Configuration
Variable
Description
Values default
$logdir
log directory
$bsdir/log
$nosharedtrees
Shared trees
01 2
0=shared 1=not
shared 2=not shared
enable binary release
$limit_projects
limit visibility of
tracking
optional for non-ACL
systems, should be
set for access control
with fallback
$packtrack
Remarks
[]
optional
projects for some architectures
$relsync_pool
allow separation of
releasenumber syncing per architecture
$stageserver
stage server
rsync URI
$stageserver_sync
Extra stage sync serv-
rsync URI
$sign
Path to sign script
$sign_project
call sign with --
$keyfile
Global sign key
$localarch
Local architecture for
$buildlog_maxsize
worker max buildlog
40
er
project
0 1
product building
size
'500 * 1000000'
in bytes
Back-end Configuration
Variable
Description
Values default
Remarks
$buildlog_maxidle
Time with no
'8 * 3600'
in sec
changes in the buildlog will kill the job
$xenstore_maxsize
xenstore size
'20 * 1000000'
current XEN has no
$gettimeout
Max timeout for get
'1 * 3600'
in sec
$workerhostcheck
check script for
$powerhosts
Worker with more re-
obsolete use con-
$powerpkgs
packages which need
obsolete use con-
xenstore anymore
worker
sources
straints
workers with more
straints
resources
$norootexceptions
List of packages need
$old_style_services
Use old style source
$partition
Current partition
to build as root
service handling
0 1
see Section 1.4, “Distributed Setup”
$partitioning
$partitionservers
$dispatch_adjust
Partition project
mapping
Partition server mapping
Adjust dispatch priority
see Section 1.4, “Distributed Setup”
see Section 1.4, “Distributed Setup”
see Section 3.4.2,
“dispatch_adjust
Array”
41
Back-end Configuration
Variable
Description
Values default
Remarks
$publishedhook_use
Use regular expres-
0 1
see Section 3.5, “Pub-
_regex
$publishedhook
sions in publish hook
lisher Hooks”
map
Publish hook map
see Section 3.5, “Publisher Hooks”
$unpublished-
hook_use _regex
$unpublishedhook
Use regular expressions in unpublish
0 1
see Section 3.6, “Unpublisher Hooks”
hook map
Unpublish hook map
see Section 3.6, “Unpublisher Hooks”
Example BSConfig.pm
#
# Copyright (c) 2006, 2007 Michael Schroeder, Novell Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see the file COPYING); if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#
################################################################
#
# Open Build Service Configuration
#
package BSConfig;
use Net::Domain;
use Socket;
42
Back-end Configuration
my $hostname = Net::Domain::hostfqdn() || 'localhost';
# IP corresponding to hostname (only used for $ipaccess); fallback to localhost since
inet_aton may fail to resolve at shutdown.
my $ip = quotemeta inet_ntoa(inet_aton($hostname) || inet_aton("localhost"));
my $frontend = undef; # FQDN of the Web UI/API server if it's not $hostname
# If defined, restrict access to the backend servers (bs_repserver, bs_srcserver,
bs_service)
our $ipaccess = {
'127\..*' => 'rw', # only the localhost can write to the backend
"^$ip" => 'rw',
# Permit IP of FQDN
'.*' => 'worker',
# build results can be delivered from any client in the network
};
# IP of the Web UI/API Server (only used for $ipaccess)
if ($frontend) {
my $frontendip = quotemeta inet_ntoa(inet_aton($frontend) || inet_aton("localhost"));
$ipaccess->{$frontendip} = 'rw' ; # in dotted.quad format
}
# Also change the SLP reg files in /etc/slp.reg.d/ when you touch hostname or port
our $srcserver = "http://$hostname:5352";
our $reposerver = "http://$hostname:5252";
our $serviceserver = "http://$hostname:5152";
# you can use different ports for worker connections
#our $workersrcserver = "http://$hostname:5353";
#our $workerreposerver = "http://$hostname:5253";
our $servicedir = "/usr/lib/obs/service/";
#our $servicetempdir = "/var/temp/";
#our $serviceroot = "/opt/obs/MyServiceSystem";
# Maximum number of concurrent jobs for source service
#our $service_maxchild = 20;
our $gpg_standard_key = "/srv/obs/obs-default-gpg.asc";
# optional notification service:
#our $hermesserver = "http://$hostname/hermes";
#our $hermesnamespace = "OBS";
#
# Notification Plugin, multiple plugins supported, separated by space
#our $notification_plugin = "notify_hermes notify_rabbitmq";
#
43
Back-end Configuration
# For the workers only, it is possible to define multiple repository servers here.
# But only one source server is possible yet.
our @reposervers = ("http://$hostname:5252");
# Package defaults
our $bsdir = '/srv/obs';
our $bsuser = 'obsrun';
our $bsgroup = 'obsrun';
#our $bsquotafile = '/srv/obs/quota.xml';
# Use asynchronus scheduler. This avoids hanging schedulers on remote projects,
# when the network is slow or broken. This will become the default in future
# our $sched_asyncmode = 1;
# Define how the scheduler does a cold start. The default (0) is to request the
# data for all packages, (1) means that only the non-remote packages are fetched,
# (2) means that all of the package data fetches get delayed.
# our $sched_startupmode = 0;
# Disable fdatasync calls, increases the speed, but may lead to data
# corruption on system crash when the filesystem does not guarantees
# data write before rename.
# It is esp. required on XFS filesystem.
# It is safe to be disabled on ext4 and btrfs filesystems.
#our $disable_data_sync = 1;
# Package rc script / backend communication + log files
our $rundir = "$bsdir/run";
our $logdir = "$bsdir/log";
# optional for non-acl systems, should be set for access control
# 0: trees are shared between projects (built-in default)
# 1: trees are not shared (only usable for new installations)
# 2: new trees are not shared, in case of a missing tree the shared
#
location is also tried (package default)
our $nosharedtrees = 2;
# enable binary release tracking by default for release projects
our $packtrack = [];
# optional: limit visibility of projects for some architectures
#our $limit_projects = {
# "ppc" => [ "openSUSE:Factory", "FATE" ],
# "ppc64" => [ "openSUSE:Factory", "FATE" ],
#};
# optional: allow seperation of releasnumber syncing per architecture
44
Back-end Configuration
# one counter pool for all ppc architectures, one for i586/x86_64,
# arm archs are separated and one for the rest in this example
our $relsync_pool = {
"local" => "local",
"i586" => "i586",
"x86_64" => "i586",
"ppc" => "ppc",
"ppc64" => "ppc",
"ppc64le" => "ppc",
"mips" => "mips",
"mips64" => "mips",
"mipsel" => "mipsel",
"mips64el" => "mipsel",
"aarch64"
=> "arm",
"aarch64_ilp32"
=> "arm",
"armv4l"
=> "arm",
"armv5l"
=> "arm",
"armv6l"
=> "arm",
"armv6hl" => "arm",
"armv7l"
=> "arm",
"armv7hl" => "arm",
"armv5el" => "armv5el", # they do not exist
"armv6el" => "armv6el",
"armv7el" => "armv7el",
"armv8el" => "armv8el",
"sparcv9" => "sparcv9",
"sparc64" => "sparcv9",
};
#No extra stage server sync
#our $stageserver = 'rsync://127.0.0.1/put-repos-main';
#our $stageserver_sync = 'rsync://127.0.0.1/trigger-repos-sync';
#No package signing server
our $sign = "/usr/bin/sign";
#Extend sign call with project name as argument "--project $NAME"
#our $sign_project = 1;
#Global sign key
our $keyfile = "/srv/obs/obs-default-gpg.asc";
# Use a special local arch for product building
# our $localarch = "x86_64";
# config options for the bs_worker
#
#our buildlog_maxsize = 500 * 1000000;
#our buildlog_maxidle =
45
8 * 3600;
Back-end Configuration
#our xenstore_maxsize =
20 * 1000000;
#our gettimeout =
1 * 3600;
#
# run a script to check if the worker is good enough for the job
#our workerhostcheck = 'my_check_script';
#
# Allow to build as root, exceptions per package
# the keys are actually anchored regexes
# our $norootexceptions = { "my_project/my_package" => 1, "openSUSE:Factory.*/
installation-images" => 1 };
# Use old style source service handling
# our $old_style_services = 1;
###
# Optional support to split the binary backend. This can be used on large servers
# to separate projects for better scalability.
# There is still just one source server, but there can be multiple servers which
# run each repserver, schedulers, dispatcher, warden and publisher
#
# This repo service is the 'home' server for all home:* projects. This and the
# $reposerver setting must be different on the binary backend servers.
# our $partition = 'home';
#
# this defines how the projects are split. All home: projects are hosted
# on an own server in this example. Order is important.
# our $partitioning = [ 'home:' => 'home',
#
'.*'
#
=> 'main',
];
#
# our $partitionservers = { 'home' => 'http://home-backend-server:5252',
#
'main' => 'http://main-backend-server:5252',
#
};
# Publish hooks
our $publishedhook_use_regex = 1;
our $publishedhook = {
"Product\/SLES12"
=> "/usr/local/bin/script2run_sles12",
"Product\/SLES11.*"
=> "/usr/local/bin/script2run_sles11",
};
# host specific configs
my $hostconfig = __FILE__;
$hostconfig =~ s/[^\/]*$/bsconfig.$hostname/;
if (-r $hostconfig) {
print STDERR "reading $hostconfig...\n";
46
Back-end Configuration
require $hostconfig;
}
1;
2.2 Log Files
2.2.1
Front-end
The front-end log les are found under /srv/www/obs/api/log.
The following front-end log les exist:
apache_access.log - apache requests
apache_error.log - errors from apache
backend_access.log - API → backend requests
clockworkd.clock.output → timer event log
delayed_job.log → delayed job log
production.log→ main ruby log
production.searchd.log - search daemon log
production.searchd.query.log - search request logs
2.2.2
Back-end
The back-end log les are found by default under /srv/obs/log/.
The following back-end log les exist:
dispatcher.log - dispatcher log
dodup.log - download on demand log (since 2.7)
publisher.log - publisher log
rep_server.log - repo server log
47
Log Files
scheduler_.log - scheduler log for each architecture
signer.log - sign service log
src_server.log - source server log
src_service.log - source service daemon log
warden.log - warden log
clouduploadserver.log - cloud upload server log
clouduploadworker.log - cloud upload worker log
The following log les for the upload jobs exist inside the /srv/obs/cloudupload directory (also
linked in /bs/cloudupload):
.log - log les for undone upload jobs
done/.log - log les for already finished upload jobs
2.3 /srv/obs Tree
The default back-end data directory is located under /srv/obs/. Here are a bunch of subdirec-
tories used for communication between the different server, to store data, status information
and logs. Here is one le configuration.xml in the top directory, which stores the global OBS
configuration for the back-end. You should not modify this le directly, but use the API /configuration interface instead, since this information needs to kept in sync with the front-end.
2.3.1
build Directory
In this subdirectory managed by the repo server daemon, all repository data, metadata and build
results are stored in a hierarchical tree.
Example build directory tree of a binary imported distribution (OpenSUSE:13.2) and a small
test project with 3 packages:
├── openSUSE:13.2
│
└── standard
│
├── i586
│
│
│
└── x86_64
48
└── :full
/srv/obs Tree
│
└── :full
├── Test1
│
└── os13.2
│
├── i586
│
│
├── :full
│
│
├── :logfiles.fail
│
│
├── :logfiles.success
│
│
├── :meta
│
│
├── :repo
│
│
├── rsync
│
│
├── srtp
│
│
└── wget
│
└── x86_64
│
├── :full
│
├── :logfiles.fail
│
├── :logfiles.success
│
├── :meta
│
├── :repo
│
├── rsync
│
├── srtp
│
└── wget
2.3.2
cloudupload Directory
Info for cloud upload jobs is stored here, it has a subdir named done for storing the already
finished jobs.
2.3.3
db Directory
Back-end database root directory use by the source server, repo server scheduler and publisher.
Nobody should touch this.
2.3.4
diffcache Directory
Cache for source server compare operations.
2.3.5
events Directory
Communication between services.
49
cloudupload Directory
2.3.6
info Directory
Scheduler information managed by the scheduler and used by the repo server.
2.3.7
jobs Directory
The build jobs are stored in the /srv/obs/jobs directory. They are organized bybuild architecture:
jobs
├── armv7l
├── i586
├── load
└── x86_64
└── Release:Stable::SLE-12_GA::CI-demo-36db80552b735e193dced13f058f866f
The jobs/load le contains statistical data about the build jobs.
2.3.8
log Directory
Contains the log les of the back-end daemons.
2.3.9
projects Directory
Contains the project hierarchy and metadata under revision control.
2.3.10
remotecache Directory
Cache for remote repository information.
2.3.11
repos Directory
Directory managed by the publisher to collect build results, also used by the repo server and
scheduler to nd build results.
2.3.12
repos_sync Directory
Directory with les pointing to the project root directories, helper for publisher rsync.
50
info Directory
2.3.13
run Directory
State and lock information for the back-end daemons
2.3.14
sources Directory
All package sources under revision control in one directory per package, managed by the source
server. Package sources are by default deduplicated across all projects, as long a source le has
the same MD5 sum, it is only stored once. A pseudo '_project' package exist in the directory
containing the project metadata revisions. ':service' and ':upload' are temporary directories
used by the source server.
Example sources directory structure:
sources/
├── CI-demo
[...]
├── srtp
├── test1
├── _project
├── :service
└── :upload
2.3.15
trees Directory
Revision control data for project and packages, managed by the source server.
2.3.16
upload Directory
Temporary directory for uploading les for other back-end components.
2.3.17
workers Directory
Worker information
51
run Directory
2.4 Metadata
2.4.1
OBS Revision Control
This section gives a short generic overview how the revision information are stored in the OBS
back-end for packages and projects. The OBS back-end stores all les in a light weight content
based hierarchical tree. Each le is hashed (with MD5) and stored with the hash as part of
the filename under the /srv/obs/tree or /srv/obs/sources directories. The revision information is
stored in separate les by the Source Server in the /srv/obs/projects directory.
2.4.1.1
OBS revision control files
The revision information is stored in simple CSV like le format with a bar (|) as delimiter
between the 8 columns. The les do have the extension .rev for package/project revision data
and .mref for meta revision data. The hash then points to a -MD5SUMS le in the /srv/
obs/tree/ directories which have the le list with MD5 hashes of this revision. The hashes in this
le list are pointing to the source les in the /srv/obs/sources tree.
An example revision le:
1|1|56cdd3adb778089d1fcc49b92bb93e5b|0.9|1464005086|user4|initial version|
2|2|fe7aa1ade5c9d005de738c234c90bc90|0.9|1464005304|user4|fix spec file|
3|1|72c7986e694f45ab1a62779e64e92a8f|1.0|1464005339|user4|new version|
4|2|699e9931e6f167d78e65bbe5853f592f|1.0|1464006221|user4|add patch file|
5|1|0cfc3a2297f38d2aa9d8d0e98fc22a38|1.1|1464007797|user4|new version|
TABLE 2.6: THE 8 COLUMNS
Column
1
2
Content
revision number
version revision
number
XML tag
may empty
ref
no
vref
yes
3
hash
srcmd5
no
4
version
version
yes
5
time stamp
time
no
52
Metadata
Column
Content
XML tag
may empty
6
user
user
no
7
commit message
comment
yes
8
request id
requestid
yes
Depending on the target (package, project or metadata) used, elds can be empty or have special
values, for example, unknown for the version.
Example MD5SUMS le
/srv/obs # cat trees/Test1/package1/56cdd3adb778089d1fcc49b92bb93e5b-MD5SUMS
0a17daaa913df9e50ee65e83a1898363
package1.spec
1f810b3521242a98333b7bbf6b2b7ef7
test1.sh
2.4.1.2
OBS Revision API
The revision info can be retrieved via API calls for the specific package, for example, using /
source///_history .
Specific revisions of les can be retrieved with the optional "rev=N" parameter, for example, /
source///<le>?rev=N.
On PUT and POST methods for les the optional "comment=some+comment" can be used to
set a commit message.
2.4.2
Project Metadata
Project metadata are XML les containing the meta project information, such as title, descrip-
tion, related user and groups with roles, build settings, repository settings, publish settings, debug settings and more.
TABLE 2.7: PROJECT META XML
XML tag
Attributes
Content
project
name
project name
title
53
Short description
Project Metadata
XML tag
Attributes
description
Content
Developer information
person
userid
login name
person
role
role (maintainer, bugowner, …)
group
groupid
group name
group
role
role (maintainer, bugowner, …)
devel
An optional devel project
build
optional build ags
publish
optional publish ags
useforbuild
optional useforbuild ags
debuginfo
optional debuginfo ags
binarydownload
optional binarydownload ags
repository
name
name of the repository for build results
repository path
project
name of the source project for remaining
repository path
repository
name of repository in the source project
build requires
repository arch
architecture name
remoteurl
path to a remote OBS API for interconnect
Example project metadata:
Test project 11
Project for demo
54
Project Metadata
x86_64
2.4.3
Package Metadata
XML le about package meta information, like Title, description, related user and groups with
roles, build settings, publish settings, debug settings and more. Most XML tags are the same as
for projects.
Example package metadata:
A test package for learning
An example test package for learning.
2.4.4
Attribute Metadata
Attributes can be used to add special information to packages. Attributes can be used to trigger
special actions.
Example attribute data:
2016-06-30 00:00:00
55
Package Metadata
2.4.5
Job Files
Jobs are stored by the scheduler in the /srv/obs/jobs directory and contain the build setup
information for the package, for example, a reference to the exact source version, build dependencies, build repository information, timestamps.
Sample job le:
Release:Stable::SLE-12_GA::
CI-demo-36db80552b735e193dced13f058f866f
x86_64
36db80552b735e193dced13f058f866f
36db80552b735e193dced13f058f866f
2
obs://b1-systems.de/Release:Stable/SLE-12_GA/
36db80552b735e193dced13f058f866f-CI-demo
new build
0
1461077600
1461077708
CI-demo.spec
0.1.9-2
1
2.1
1
linux:version:min 3.0.0
56
Job Files
[...]
57
Job Files
3 Administration
3.1 Tools
3.1.1
obs_admin
obs_admin is a command-line tool used on the back-end server(s) to manage running services,
submit maintenance tasks, and debug problems. It should be only used by experienced admins.
It has built-in help which you can display with obs_admin --help.
Options to control the running services:
Job Controlling
===============
--shutdown-scheduler
Stops the scheduler nicely with dumping out its current state
for fast startup.
--check-project
--check-project
--check-all-projects
Check status of a project and its repositories again
--deep-check-project
--deep-check-project
Check status of a project and its repositories again
This deep check also includes the sources, in case of lost events.
--check-package
Check status of a package in all repositories
--publish-repository
Creates an event for the publisher. The scheduler is NOT scanning for new packages.
The publisher may skip the event, if nothing has changed.
Use --republish-repository when you want to enforce a publish.
--unpublish-repository
Removes the prepared :repo collection and let the publisher remove the result. This
is also updating the search database.
WARNING: this works also for locked projects!
58
Tools
--prefer-publish-event
prefers a publish event to be next. is the file name inside of the publish
event directory.
--republish-repository
enforce to publish a repository
--rebuild-full-tree
rebuild the content of :full/ directory
--clone-repository
Source Exif Data:
File Type : PDF
File Type Extension : pdf
MIME Type : application/pdf
Linearized : No
Page Count : 117
Profile CMM Type : lcms
Profile Version : 2.1.0
Profile Class : Display Device Profile
Color Space Data : RGB
Profile Connection Space : XYZ
Profile Date Time : 1998:02:09 06:49:00
Profile File Signature : acsp
Primary Platform : Apple Computer Inc.
CMM Flags : Not Embedded, Independent
Device Manufacturer : IEC
Device Model : sRGB
Device Attributes : Reflective, Glossy, Positive, Color
Rendering Intent : Perceptual
Connection Space Illuminant : 0.9642 1 0.82491
Profile Creator : lcms
Profile ID : 0
Profile Copyright : Copyright (c) 1998 Hewlett-Packard Company
Profile Description : sRGB IEC61966-2.1
Media White Point : 0.95045 1 1.08905
Media Black Point : 0 0 0
Red Matrix Column : 0.43607 0.22249 0.01392
Green Matrix Column : 0.38515 0.71687 0.09708
Blue Matrix Column : 0.14307 0.06061 0.7141
Device Mfg Desc : IEC http://www.iec.ch
Device Model Desc : IEC 61966-2.1 Default RGB colour space - sRGB
Viewing Cond Desc : Reference Viewing Condition in IEC61966-2.1
Viewing Cond Illuminant : 19.6445 20.3718 16.8089
Viewing Cond Surround : 3.92889 4.07439 3.36179
Viewing Cond Illuminant Type : D50
Luminance : 76.03647 80 87.12462
Measurement Observer : CIE 1931
Measurement Backing : 0 0 0
Measurement Geometry : Unknown
Measurement Flare : 0.999%
Measurement Illuminant : D65
Technology : Cathode Ray Tube Display
Red Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
Green Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
Blue Tone Reproduction Curve : (Binary data 2060 bytes, use -b option to extract)
Creator : Karsten Keil
Format : application/pdf
Title : Administrator Guide
Language : en
Date : 2018:01:29 12:08:01+01:00
Producer : Apache FOP Version 2.1
PDF Version : 1.4
Creator Tool : DAPS 2.4.0 using SUSE XSL Stylesheets 2.0.8 (based on DocBook XSL Stylesheets 1.78.1)
Metadata Date : 2018:01:29 12:08:01+01:00
Create Date : 2018:01:29 12:08:01+01:00
Page Mode : UseOutlines
Author : Karsten Keil
EXIF Metadata provided by EXIF.tools