[elbe-devel] [PATCH 2/3] website: add new website

Thomas Weißschuh thomas.weissschuh at linutronix.de
Thu Jun 13 09:16:54 CEST 2024


Simplify the website build procedure and import it into the the source tree.
The website now has the exact same build procedure and dependencies as
the documentation has anyways.
Maintaining it as part of the repo aligns it with the general elbe development processes.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh at linutronix.de>
---
 website/.gitignore                 |   1 +
 website/Pres_ELBE_2019_v1.0.pdf    | Bin 0 -> 2005746 bytes
 website/_static/elbe-wallpaper.jpg | Bin 0 -> 240585 bytes
 website/_static/elbe-website.css   |  70 ++++++++++
 website/_templates/news.html       |   8 ++
 website/conf.py                    | 103 +++++++++++++++
 website/devel.rst                  |  17 +++
 website/docs.rst                   |  17 +++
 website/download.rst               |  38 ++++++
 website/elbe-logo-small.png        | Bin 0 -> 8718 bytes
 website/ext/elbedocoverview.py     | 116 +++++++++++++++++
 website/ext/elbefeed.py            |  25 ++++
 website/imprint.rst                | 260 +++++++++++++++++++++++++++++++++++++
 website/index.rst                  |  54 ++++++++
 website/internals.rst              |  50 +++++++
 website/news                       |   1 +
 website/support.rst                |  30 +++++
 website/whatiselbe.rst             |  87 +++++++++++++
 18 files changed, 877 insertions(+)

diff --git a/website/.gitignore b/website/.gitignore
new file mode 100644
index 000000000000..69fa449dd96e
--- /dev/null
+++ b/website/.gitignore
@@ -0,0 +1 @@
+_build/
diff --git a/website/Pres_ELBE_2019_v1.0.pdf b/website/Pres_ELBE_2019_v1.0.pdf
new file mode 100644
index 000000000000..00292cacbf77
Binary files /dev/null and b/website/Pres_ELBE_2019_v1.0.pdf differ
diff --git a/website/_static/elbe-wallpaper.jpg b/website/_static/elbe-wallpaper.jpg
new file mode 100644
index 000000000000..53483f8a9ee0
Binary files /dev/null and b/website/_static/elbe-wallpaper.jpg differ
diff --git a/website/_static/elbe-website.css b/website/_static/elbe-website.css
new file mode 100644
index 000000000000..f1cb3ce5e6ed
--- /dev/null
+++ b/website/_static/elbe-website.css
@@ -0,0 +1,70 @@
+h1, h2, h3, h4, h5, h6 {
+	color: #d70751;
+}
+
+ul.elbe-website-version-list {
+	column-width: 5em;
+}
+
+div.elbe-website-index-lead {
+	background-image: url(elbe-wallpaper.jpg);
+	background-color: #d70751; /* as fallback if the image does not work */
+	text-align: center;
+}
+
+div.elbe-website-index-lead {
+	padding-top: 20px;
+	padding-bottom: 20px;
+}
+
+div.elbe-website-index-lead h1 {
+	color: white;
+	font-size: 210%;
+	margin-bottom: 20px;
+}
+
+div.elbe-website-index-lead h1 > a.headerlink {
+	display: none;
+}
+
+div.elbe-website-index-lead ul {
+	list-style: none;
+	margin: 0;
+}
+
+div.elbe-website-index-lead ul > li {
+	display: inline-block;
+	min-width: 40%;
+}
+
+div.elbe-website-index-lead ul > li a {
+	color: black;
+	border-bottom: none;
+	background-color: white;
+	font-size: 0.87rem;
+	border-radius: 30px;
+	transition: background 0.2s,border 0.2s;
+	font-family: sans-serif;
+	padding: 8px 20px;
+	line-height: 5;
+}
+
+div.elbe-website-index-lead ul > li a:hover {
+	color: white;
+	background-color: black;
+}
+
+div.elbe-website-index-tiles {
+	display: flex;
+	flex-wrap: wrap;
+	column-gap: 1em;
+}
+
+div.elbe-website-index-tiles h2 {
+	font-size: 140%;
+}
+
+div.elbe-website-index-tiles > section {
+	min-width: 15em;
+	flex: 45%;
+}
diff --git a/website/_templates/news.html b/website/_templates/news.html
new file mode 100644
index 000000000000..fa92178e4d14
--- /dev/null
+++ b/website/_templates/news.html
@@ -0,0 +1,8 @@
+{%- extends "layout.html" %}
+{% block body %}
+  {{ body }}
+
+  <p>
+    <small>{{ meta.author }} on {{ meta.date }}</small>
+  </p>
+{% endblock %}
diff --git a/website/conf.py b/website/conf.py
new file mode 100644
index 000000000000..907408d27156
--- /dev/null
+++ b/website/conf.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+# SPDX-License-Identifier: 0BSD
+# SPDX-FileCopyrightText: Linutronix GmbH
+
+import os
+import sys
+sys.path.insert(0, os.path.abspath('ext'))
+sys.path.insert(0, os.path.abspath('..'))
+
+from elbepack.version import elbe_version  # noqa: E402
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+        'elbedocoverview',
+        'elbefeed',
+        'sphinx.ext.intersphinx',
+]
+
+intersphinx_disabled_reftypes = ['*']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'ELBE Website'
+copyright = (u'2024 ELBE by Linutronix GmbH - ELBE is not affiliated with Debian, '
+             u'Debian is a registered trademark owned by SPI')
+author = u'Thomas Weißschuh'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = elbe_version
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_baseurl = 'https://elbe-rfs.org/'
+html_theme = 'alabaster'
+
+html_sidebars = {
+        '**': ['globaltoc.html'],
+}
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#
+html_theme_options = {
+        'show_powered_by': False,
+        'head_font_family': 'sans-serif',
+        'font_family': 'sans-serif',
+        'footer_text': '#3E4349',
+}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+html_logo = 'elbe-logo-small.png'
diff --git a/website/devel.rst b/website/devel.rst
new file mode 100644
index 000000000000..db57d0b89545
--- /dev/null
+++ b/website/devel.rst
@@ -0,0 +1,17 @@
+Development
+###########
+
+Source
+------
+
+The latest source code is available on
+`GitHub <https://github.com/linutronix/elbe>`_.
+
+The project contains a native debianization, so Debian packages for the host PC
+can be built with ``dpkg-buildpackage`` or a similar tool.
+
+
+Bugreports
+----------
+
+Please use the `GitHub issue tracker <https://github.com/linutronix/elbe/issues>`_.
diff --git a/website/docs.rst b/website/docs.rst
new file mode 100644
index 000000000000..83cb4bb2ea38
--- /dev/null
+++ b/website/docs.rst
@@ -0,0 +1,17 @@
+Documentation
+#############
+
+The documentation for the **latest release** v\ |version| is available here: :doc:`elbe:index`.
+
+Media
+=====
+
+A `video recording <https://youtu.be/LLQz38tnElw?list=PLbzoR-pLrL6pRFP6SOywVJWdEHlmQE51q>`_
+explaining ELBE at Embedded Linux Conference Europe 2017 in Berlin.
+
+:download:`Slides <Pres_ELBE_2019_v1.0.pdf>` of the official ELBE presentation.
+
+Documentation for all released versions
+=======================================
+
+.. elbedocoverview::
diff --git a/website/download.rst b/website/download.rst
new file mode 100644
index 000000000000..dac90f6b366b
--- /dev/null
+++ b/website/download.rst
@@ -0,0 +1,38 @@
+Downloads
+#########
+
+The current elbe version is |version| .
+
+There are several ways to install a binary version of elbe.
+
+The easiest way is to install the Debian packages via apt.
+
+Debian Binary Packages
+======================
+
+The recommended way to use ELBE is running it on a Debian PC.
+Linutronix provides a signed repository that can be included in apt.
+
+Debian bookworm or later
+------------------------
+
+.. code-block:: bash
+
+    su -
+    apt install elbe-archive-keyring
+    echo "deb [signed-by=/usr/share/keyrings/elbe-archive-keyring.gpg] http://debian.linutronix.de/elbe bookworm main" >> /etc/apt/sources.list
+    apt update
+    apt install elbe
+
+Debian buster or bullseye
+-------------------------
+
+.. code-block:: bash
+
+    su -
+    source /etc/os-release
+    apt install wget
+    wget -O /usr/share/keyrings/elbe-archive-keyring.gpg http://debian.linutronix.de/elbe/elbe-repo.pub.gpg
+    echo "deb [signed-by=/usr/share/keyrings/elbe-archive-keyring.gpg] http://debian.linutronix.de/elbe $VERSION_CODENAME main" >> /etc/apt/sources.list
+    apt update
+    apt install elbe
diff --git a/website/elbe-logo-small.png b/website/elbe-logo-small.png
new file mode 100644
index 000000000000..5c46d00051bb
Binary files /dev/null and b/website/elbe-logo-small.png differ
diff --git a/website/ext/elbedocoverview.py b/website/ext/elbedocoverview.py
new file mode 100644
index 000000000000..031d9e38f066
--- /dev/null
+++ b/website/ext/elbedocoverview.py
@@ -0,0 +1,116 @@
+import os
+import pathlib
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+import packaging.version
+
+from sphinx.errors import ExtensionError
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import nested_parse_with_titles
+
+
+__here__ = pathlib.Path(__file__).parent
+
+
+def _versioned_doc_url(version):
+    return 'https://elbe-rfs.org/docs/sphinx/v{}/index.html'.format(version)
+
+
+def _docs_directory(config):
+    docs_directory = config.elbedocoverview_docs_directory
+    if docs_directory is None:
+        raise ExtensionError('Missing configuration "elbedocoverview_docs_directory"')
+
+    return docs_directory
+
+
+class _ElbeDocOverview(SphinxDirective):
+
+    def run(self):
+        self.env.note_dependency(__file__)
+
+        docs_directory = _docs_directory(self.config)
+
+        versions = os.listdir(docs_directory)
+        versions = filter(lambda v: v.startswith('v'), versions)
+        versions = map(lambda v: v.removeprefix('v'), versions)
+        versions = sorted(versions, reverse=True, key=lambda v: packaging.version.Version(v))
+
+        items = nodes.bullet_list(classes=['elbe-website-version-list'])
+
+        for version in versions:
+            list_item = nodes.list_item()
+            par = nodes.paragraph()
+            contents = f'v{version}'
+            ref = nodes.reference(contents, contents,
+                                  refuri=_versioned_doc_url(version))
+            par += ref
+            list_item += par
+            items += list_item
+
+        return [items]
+
+
+class section_level(nodes.Element):
+    def get_level(self):
+        return self['level']
+
+
+def visit_section_level_node(self, node):
+    self.section_level += node.get_level()
+
+
+def depart_section_level_node(self, node):
+    self.section_level -= node.get_level()
+
+
+class _ElbeContainerWithTitles(SphinxDirective):
+    optional_arguments = 1
+    final_argument_whitespace = True
+    has_content = True
+    option_spec = {
+        'section_level_adjust': int,
+    }
+
+    def run(self):
+        n = nodes.container(
+                classes=directives.class_option(self.arguments[0] or ''),
+        )
+        nested_parse_with_titles(state=self.state, content=self.content,
+                                 content_offset=self.content_offset, node=n)
+
+        section_level_adjust = self.options.get('section_level_adjust')
+        if not section_level_adjust:
+            return [n]
+
+        sl = section_level(level=section_level_adjust)
+        sl += n
+        return [sl]
+
+
+def _config_inited(app, config):
+    if 'intersphinx_mapping' not in config:
+        raise ExtensionError('missing intersphinx extension')
+
+    docs_directory = _docs_directory(config)
+
+    config.intersphinx_mapping['elbe'] = (
+            f'https://elbe-rfs.org/docs/sphinx/v{config.version}/',
+            f'{docs_directory}/v{config.version}/objects.inv',
+    )
+
+
+def setup(app):
+    app.add_config_value('elbedocoverview_docs_directory', None, 'env', str)
+    app.add_directive('elbedocoverview', _ElbeDocOverview)
+    app.add_directive('elbe-container-with-titles', _ElbeContainerWithTitles)
+    app.add_node(section_level, html=(visit_section_level_node, depart_section_level_node))
+    app.connect('config-inited', _config_inited)
+    app.add_css_file('elbe-website.css')
+
+    return {
+        'parallel_read_safe': True,
+        'parallel_write_safe': True,
+    }
diff --git a/website/ext/elbefeed.py b/website/ext/elbefeed.py
new file mode 100644
index 000000000000..4531a37884f6
--- /dev/null
+++ b/website/ext/elbefeed.py
@@ -0,0 +1,25 @@
+import datetime
+import os
+
+
+def _date_from_pagename(pagename):
+    b = os.path.basename(pagename)
+    return datetime.date.fromisoformat(b[:10])
+
+
+def _html_page_context(app, pagename, templatename, context, doctree):
+    if pagename.startswith('news/') and pagename != 'news/index':
+        context['meta']['date'] = _date_from_pagename(pagename)
+        # print(app, pagename, templatename, context, doctree)
+        assert context['meta'].get('author'), pagename
+        assert context['meta'].get('date'), pagename
+        return 'news.html'
+
+
+def setup(app):
+    app.connect('html-page-context', _html_page_context)
+
+    return {
+        'parallel_read_safe': True,
+        'parallel_write_safe': True,
+    }
diff --git a/website/imprint.rst b/website/imprint.rst
new file mode 100644
index 000000000000..70812344e2ae
--- /dev/null
+++ b/website/imprint.rst
@@ -0,0 +1,260 @@
+Imprint
+#######
+
+Legal Disclosure
+----------------
+
+Information in accordance with §5 TMG (German Telecommunications Service Law)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+| Linutronix GmbH
+| Bahnhofstrasse 3
+| 88690 Uhldingen-Muehlhofen, Germany
+
+Represented by Managing Directors
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+| Heinz Egger
+| Thomas Gleixner
+| Sean Fennelly
+| Jeffrey Schneiderman
+| Tiffany Silva
+
+Contact Information
+^^^^^^^^^^^^^^^^^^^
+
+| Telephone: +49 7556 25 999 0
+| Fax: +49 7556 25 999 99
+| E-Mail: info at linutronix.de
+
+Register Entry:
+^^^^^^^^^^^^^^^
+
+| Registration in the commercial register (Handelsregister).
+| Register court: District Court of Freiburg i.Br.
+| Register number: HRB 700 806
+
+VAT Identification No.
+^^^^^^^^^^^^^^^^^^^^^^
+
+VAT Identification No. in accordance with $27a of the German VAT Act (Umsatzsteuergesetz): DE252739476
+
+
+Privacy Policy
+--------------
+
+We are very delighted that you have shown interest in our enterprise. Data protection is of a particularly high priority for the management of the Linutronix GmbH. The use of the Internet pages of the Linutronix GmbH is possible without any indication of personal data; however, if a data subject wants to use special enterprise services via our website, processing of personal data could become necessary. If the processing of personal data is necessary and there is no statutory basis for such processing, we generally obtain consent from the data subject.
+
+The processing of personal data, such as the name, address, e-mail address, or telephone number of a data subject shall always be in line with the General Data Protection Regulation (GDPR), and in accordance with the country-specific data protection regulations applicable to the Linutronix GmbH. By means of this data protection declaration, our enterprise would like to inform the general public of the nature, scope, and purpose of the personal data we collect, use and process. Furthermore, data subjects are informed, by means of this data protection declaration, of the rights to which they are entitled.
+
+As the controller, the Linutronix GmbH has implemented numerous technical and organizational measures to ensure the most complete protection of personal data processed through this website. However, Internet-based data transmissions may in principle have security gaps, so absolute protection may not be guaranteed. For this reason, every data subject is free to transfer personal data to us via alternative means, e.g. by telephone.
+
+Definitions
+^^^^^^^^^^^
+
+The data protection declaration of the Linutronix GmbH is based on the terms used by the European legislator for the adoption of the General Data Protection Regulation (GDPR). Our data protection declaration should be legible and understandable for the general public, as well as our customers and business partners. To ensure this, we would like to first explain the terminology used.
+
+In this data protection declaration, we use, inter alia, the following terms:
+
+a) Personal data
+
+Personal data means any information relating to an identified or identifiable natural person (“data subject”). An identifiable natural person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, an online identifier or to one or more factors specific to the physical, physiological, genetic, mental, economic, cultural or social identity of that natural person.
+
+b) Data subject
+
+Data subject is any identified or identifiable natural person, whose personal data is processed by the controller responsible for the processing.
+
+c) Processing
+
+Processing is any operation or set of operations which is performed on personal data or on sets of personal data, whether or not by automated means, such as collection, recording, organisation, structuring, storage, adaptation or alteration, retrieval, consultation, use, disclosure by transmission, dissemination or otherwise making available, alignment or combination, restriction, erasure or destruction.
+
+d) Restriction of processing
+
+Restriction of processing is the marking of stored personal data with the aim of limiting their processing in the future.
+
+e) Profiling
+
+Profiling means any form of automated processing of personal data consisting of the use of personal data to evaluate certain personal aspects relating to a natural person, in particular to analyse or predict aspects concerning that natural person’s performance at work, economic situation, health, personal preferences, interests, reliability, behaviour, location or movements.
+
+f) Pseudonymisation
+
+Pseudonymisation is the processing of personal data in such a manner that the personal data can no longer be attributed to a specific data subject without the use of additional information, provided that such additional information is kept separately and is subject to technical and organisational measures to ensure that the personal data are not attributed to an identified or identifiable natural person.
+
+g) Controller or controller responsible for the processing
+
+Controller or controller responsible for the processing is the natural or legal person, public authority, agency or other body which, alone or jointly with others, determines the purposes and means of the processing of personal data; where the purposes and means of such processing are determined by Union or Member State law, the controller or the specific criteria for its nomination may be provided for by Union or Member State law.
+
+h) Processor
+
+Processor is a natural or legal person, public authority, agency or other body which processes personal data on behalf of the controller.
+
+i) Recipient
+
+Recipient is a natural or legal person, public authority, agency or another body, to which the personal data are disclosed, whether a third party or not. However, public authorities which may receive personal data in the framework of a particular inquiry in accordance with Union or Member State law shall not be regarded as recipients; the processing of those data by those public authorities shall be in compliance with the applicable data protection rules according to the purposes of the processing.
+
+j) Third party
+
+Third party is a natural or legal person, public authority, agency or body other than the data subject, controller, processor and persons who, under the direct authority of the controller or processor, are authorised to process personal data.
+
+k) Consent
+
+Consent of the data subject is any freely given, specific, informed and unambiguous indication of the data subject’s wishes by which he or she, by a statement or by a clear affirmative action, signifies agreement to the processing of personal data relating to him or her.
+
+2. Name and Address of the controller
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Controller for the purposes of the General Data Protection Regulation (GDPR), other data protection laws applicable in Member states of the European Union and other provisions related to data protection is:
+
+| Linutronix GmbH
+| Bahnhofstraße 3
+| 88690 Uhldingen-Mühlhofen
+| Deutschland
+| Phone: +49 7556 25 999 0
+| Email: info at linutronix.de
+| Website: https://elbe-rfs.org
+
+3. Collection of general data and information
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The website of the Linutronix GmbH collects a series of general data and information when a data subject or automated system calls up the website. This general data and information are stored in the server log files. Collected may be (1) the browser types and versions used, (2) the operating system used by the accessing system, (3) the website from which an accessing system reaches our website (so-called referrers), (4) the sub-websites, (5) the date and time of access to the Internet site, (6) an Internet protocol address (IP address), (7) the Internet service provider of the accessing system, and (8) any other similar data and information that may be used in the event of attacks on our information technology systems.
+
+When using these general data and information, the Linutronix GmbH does not draw any conclusions about the data subject. Rather, this information is needed to (1) deliver the content of our website correctly, (2) optimize the content of our website as well as its advertisement, (3) ensure the long-term viability of our information technology systems and website technology, and (4) provide law enforcement authorities with the information necessary for criminal prosecution in case of a cyber-attack. Therefore, the Linutronix GmbH analyzes anonymously collected data and information statistically, with the aim of increasing the data protection and data security of our enterprise, and to ensure an optimal level of protection for the personal data we process. The anonymous data of the server log files are stored separately from all personal data provided by a data subject.
+
+4. Routine erasure and blocking of personal data
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The data controller shall process and store the personal data of the data subject only for the period necessary to achieve the purpose of storage, or as far as this is granted by the European legislator or other legislators in laws or regulations to which the controller is subject to.
+
+If the storage purpose is not applicable, or if a storage period prescribed by the European legislator or another competent legislator expires, the personal data are routinely blocked or erased in accordance with legal requirements.
+
+5. Rights of the data subject
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+a) Right of confirmation
+
+Each data subject shall have the right granted by the European legislator to obtain from the controller the confirmation as to whether or not personal data concerning him or her are being processed. If a data subject wishes to avail himself of this right of confirmation, he or she may, at any time, contact any employee of the controller.
+
+b) Right of access
+
+Each data subject shall have the right granted by the European legislator to obtain from the controller free information about his or her personal data stored at any time and a copy of this information. Furthermore, the European directives and regulations grant the data subject access to the following information:
+
+the purposes of the processing;
+
+the categories of personal data concerned;
+
+the recipients or categories of recipients to whom the personal data have been or will be disclosed, in particular recipients in third countries or international organisations;
+
+where possible, the envisaged period for which the personal data will be stored, or, if not possible, the criteria used to determine that period;
+
+the existence of the right to request from the controller rectification or erasure of personal data, or restriction of processing of personal data concerning the data subject, or to object to such processing;
+
+the existence of the right to lodge a complaint with a supervisory authority;
+
+where the personal data are not collected from the data subject, any available information as to their source;
+
+the existence of automated decision-making, including profiling, referred to in Article 22(1) and (4) of the GDPR and, at least in those cases, meaningful information about the logic involved, as well as the significance and envisaged consequences of such processing for the data subject.
+
+Furthermore, the data subject shall have a right to obtain information as to whether personal data are transferred to a third country or to an international organisation. Where this is the case, the data subject shall have the right to be informed of the appropriate safeguards relating to the transfer.
+
+If a data subject wishes to avail himself of this right of access, he or she may, at any time, contact any employee of the controller.
+
+c) Right to rectification
+
+Each data subject shall have the right granted by the European legislator to obtain from the controller without undue delay the rectification of inaccurate personal data concerning him or her. Taking into account the purposes of the processing, the data subject shall have the right to have incomplete personal data completed, including by means of providing a supplementary statement.
+
+If a data subject wishes to exercise this right to rectification, he or she may, at any time, contact any employee of the controller.
+
+d) Right to erasure (Right to be forgotten)
+
+Each data subject shall have the right granted by the European legislator to obtain from the controller the erasure of personal data concerning him or her without undue delay, and the controller shall have the obligation to erase personal data without undue delay where one of the following grounds applies, as long as the processing is not necessary:
+
+The personal data are no longer necessary in relation to the purposes for which they were collected or otherwise processed.
+
+The data subject withdraws consent to which the processing is based according to point (a) of Article 6(1) of the GDPR, or point (a) of Article 9(2) of the GDPR, and where there is no other legal ground for the processing.
+
+The data subject objects to the processing pursuant to Article 21(1) of the GDPR and there are no overriding legitimate grounds for the processing, or the data subject objects to the processing pursuant to Article 21(2) of the GDPR.
+
+The personal data have been unlawfully processed.
+
+The personal data must be erased for compliance with a legal obligation in Union or Member State law to which the controller is subject.
+
+The personal data have been collected in relation to the offer of information society services referred to in Article 8(1) of the GDPR.
+
+If one of the aforementioned reasons applies, and a data subject wishes to request the erasure of personal data stored by the Linutronix GmbH, he or she may, at any time, contact any employee of the controller. An employee of Linutronix GmbH shall promptly ensure that the erasure request is complied with immediately.
+
+Where the controller has made personal data public and is obliged pursuant to Article 17(1) to erase the personal data, the controller, taking account of available technology and the cost of implementation, shall take reasonable steps, including technical measures, to inform other controllers processing the personal data that the data subject has requested erasure by such controllers of any links to, or copy or replication of, those personal data, as far as processing is not required. An employees of the Linutronix GmbH will arrange the necessary measures in individual cases.
+
+e) Right of restriction of processing
+
+Each data subject shall have the right granted by the European legislator to obtain from the controller restriction of processing where one of the following applies:
+
+The accuracy of the personal data is contested by the data subject, for a period enabling the controller to verify the accuracy of the personal data.
+
+The processing is unlawful and the data subject opposes the erasure of the personal data and requests instead the restriction of their use instead.
+
+The controller no longer needs the personal data for the purposes of the processing, but they are required by the data subject for the establishment, exercise or defence of legal claims.
+
+The data subject has objected to processing pursuant to Article 21(1) of the GDPR pending the verification whether the legitimate grounds of the controller override those of the data subject.
+
+If one of the aforementioned conditions is met, and a data subject wishes to request the restriction of the processing of personal data stored by the Linutronix GmbH, he or she may at any time contact any employee of the controller. The employee of the Linutronix GmbH will arrange the restriction of the processing.
+
+f) Right to data portability
+
+Each data subject shall have the right granted by the European legislator, to receive the personal data concerning him or her, which was provided to a controller, in a structured, commonly used and machine-readable format. He or she shall have the right to transmit those data to another controller without hindrance from the controller to which the personal data have been provided, as long as the processing is based on consent pursuant to point (a) of Article 6(1) of the GDPR or point (a) of Article 9(2) of the GDPR, or on a contract pursuant to point (b) of Article 6(1) of the GDPR, and the processing is carried out by automated means, as long as the processing is not necessary for the performance of a task carried out in the public interest or in the exercise of official authority vested in the controller.
+
+Furthermore, in exercising his or her right to data portability pursuant to Article 20(1) of the GDPR, the data subject shall have the right to have personal data transmitted directly from one controller to another, where technically feasible and when doing so does not adversely affect the rights and freedoms of others.
+
+In order to assert the right to data portability, the data subject may at any time contact any employee of the Linutronix GmbH.
+
+g) Right to object
+
+Each data subject shall have the right granted by the European legislator to object, on grounds relating to his or her particular situation, at any time, to processing of personal data concerning him or her, which is based on point (e) or (f) of Article 6(1) of the GDPR. This also applies to profiling based on these provisions.
+
+The Linutronix GmbH shall no longer process the personal data in the event of the objection, unless we can demonstrate compelling legitimate grounds for the processing which override the interests, rights and freedoms of the data subject, or for the establishment, exercise or defence of legal claims.
+
+If the Linutronix GmbH processes personal data for direct marketing purposes, the data subject shall have the right to object at any time to processing of personal data concerning him or her for such marketing. This applies to profiling to the extent that it is related to such direct marketing. If the data subject objects to the Linutronix GmbH to the processing for direct marketing purposes, the Linutronix GmbH will no longer process the personal data for these purposes.
+
+In addition, the data subject has the right, on grounds relating to his or her particular situation, to object to processing of personal data concerning him or her by the Linutronix GmbH for scientific or historical research purposes, or for statistical purposes pursuant to Article 89(1) of the GDPR, unless the processing is necessary for the performance of a task carried out for reasons of public interest.
+
+In order to exercise the right to object, the data subject may contact any employee of the Linutronix GmbH. In addition, the data subject is free in the context of the use of information society services, and notwithstanding Directive 2002/58/EC, to use his or her right to object by automated means using technical specifications.
+
+h) Automated individual decision-making, including profiling
+
+Each data subject shall have the right granted by the European legislator not to be subject to a decision based solely on automated processing, including profiling, which produces legal effects concerning him or her, or similarly significantly affects him or her, as long as the decision (1) is not is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) is not authorised by Union or Member State law to which the controller is subject and which also lays down suitable measures to safeguard the data subject’s rights and freedoms and legitimate interests, or (3) is not based on the data subject’s explicit consent.
+
+If the decision (1) is necessary for entering into, or the performance of, a contract between the data subject and a data controller, or (2) it is based on the data subject’s explicit consent, the Linutronix GmbH shall implement suitable measures to safeguard the data subject’s rights and freedoms and legitimate interests, at least the right to obtain human intervention on the part of the controller, to express his or her point of view and contest the decision.
+
+If the data subject wishes to exercise the rights concerning automated individual decision-making, he or she may, at any time, contact any employee of the Linutronix GmbH.
+
+i) Right to withdraw data protection consent
+
+Each data subject shall have the right granted by the European legislator to withdraw his or her consent to processing of his or her personal data at any time.
+
+If the data subject wishes to exercise the right to withdraw the consent, he or she may, at any time, contact any employee of the Linutronix GmbH.
+
+6. Legal basis for the processing
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Art. 6(1) lit. a GDPR serves as the legal basis for processing operations for which we obtain consent for a specific processing purpose. If the processing of personal data is necessary for the performance of a contract to which the data subject is party, as is the case, for example, when processing operations are necessary for the supply of goods or to provide any other service, the processing is based on Article 6(1) lit. b GDPR. The same applies to such processing operations which are necessary for carrying out pre-contractual measures, for example in the case of inquiries concerning our products or services. Is our company subject to a legal obligation by which processing of personal data is required, such as for the fulfillment of tax obligations, the processing is based on Art. 6(1) lit. c GDPR. In rare cases, the processing of personal data may be necessary to protect the vital interests of the data subject or of another natural person. This would be the case, for example, if a visitor were injured in our company and his name, age, health insurance data or other vital information would have to be passed on to a doctor, hospital or other third party. Then the processing would be based on Art. 6(1) lit. d GDPR. Finally, processing operations could be based on Article 6(1) lit. f GDPR. This legal basis is used for processing operations which are not covered by any of the abovementioned legal grounds, if processing is necessary for the purposes of the legitimate interests pursued by our company or by a third party, except where such interests are overridden by the interests or fundamental rights and freedoms of the data subject which require protection of personal data. Such processing operations are particularly permissible because they have been specifically mentioned by the European legislator. He considered that a legitimate interest could be assumed if the data subject is a client of the controller (Recital 47 Sentence 2 GDPR).
+
+7. The legitimate interests pursued by the controller or by a third party
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Where the processing of personal data is based on Article 6(1) lit. f GDPR our legitimate interest is to carry out our business in favor of the well-being of all our employees and the shareholders.
+
+8. Period for which the personal data will be stored
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The criteria used to determine the period of storage of personal data is the respective statutory retention period. After expiration of that period, the corresponding data is routinely deleted, as long as it is no longer necessary for the fulfillment of the contract or the initiation of a contract.
+
+9. Provision of personal data as statutory or contractual requirement; Requirement necessary to enter into a contract; Obligation of the data subject to provide the personal data; possible consequences of failure to provide such data
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We clarify that the provision of personal data is partly required by law (e.g. tax regulations) or can also result from contractual provisions (e.g. information on the contractual partner). Sometimes it may be necessary to conclude a contract that the data subject provides us with personal data, which must subsequently be processed by us. The data subject is, for example, obliged to provide us with personal data when our company signs a contract with him or her. The non-provision of the personal data would have the consequence that the contract with the data subject could not be concluded. Before personal data is provided by the data subject, the data subject must contact any employee. The employee clarifies to the data subject whether the provision of the personal data is required by law or contract or is necessary for the conclusion of the contract, whether there is an obligation to provide the personal data and the consequences of non-provision of the personal data.
+
+10. Existence of automated decision-making
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As a responsible company, we do not use automatic decision-making or profiling.
+
+This Privacy Policy has been generated by the Privacy Policy Generator of the External Data Protection Officers that was developed in cooperation with the Media Law Lawyers from WBS-LAW.
diff --git a/website/index.rst b/website/index.rst
new file mode 100644
index 000000000000..6fab3d3d37da
--- /dev/null
+++ b/website/index.rst
@@ -0,0 +1,54 @@
+.. title:: Overview
+
+.. elbe-container-with-titles:: elbe-website-index-lead
+
+   ########################################################
+   **E**\ mbedded **L**\ inux **B**\ uild **E**\ nvironment
+   ########################################################
+
+   * :doc:`Why ELBE was born <whatiselbe>`
+   * :doc:`ELBE principles <elbe:article-elbeoverview-en>`
+   * :doc:`Start Using ELBE <elbe:article-quickstart>`
+   * :doc:`ELBEs usage of QEMU <internals>`
+
+.. elbe-container-with-titles:: elbe-website-index-tiles
+   :section_level_adjust: 1
+
+   Secure
+   ------
+   
+   ELBE reuses the security of Debian. An update-checker informs if security updates are available.
+   
+   Reproducible Images
+   -------------------
+   
+   The Rootfilesystem is described in a single XML file.
+   
+   Based on Debian
+   ---------------
+   
+   No need to build all binaries. ELBE reuses Debian packages!
+   
+   ELBE ADK
+   --------
+
+   A native Application Development Kit is included
+
+
+.. toctree::
+   :hidden:
+   :maxdepth: 1
+
+   whatiselbe
+   internals
+   download
+   docs
+   support
+   devel
+   imprint
+
+.. toctree::
+   :hidden:
+   :maxdepth: 1
+
+   news/index
diff --git a/website/internals.rst b/website/internals.rst
new file mode 100644
index 000000000000..92953b518a87
--- /dev/null
+++ b/website/internals.rst
@@ -0,0 +1,50 @@
+======================
+ELBE technical Details
+======================
+
+This article describes the qemu features ELBE is using.
+
+One essential point to understand is that qemu combines two
+fundamentally different functionalities, which can also be used
+independently and that ELBE uses both of them separately:
+
+-  Virtualization (running a machine-in-a-machine)
+-  Emulation (running foreign machine-code)
+
+Both are traditionally used in combination (to run, for example, a full
+ARM-based Android mobile device on an x86-based development machine).
+ELBE, however, uses both functionalities separately, each one without
+the other:
+
+At the outside, ‘elbe initvm’ runs a full virtual machine with the host
+system’s architecture, using the kvm technology. On a typical x86-based
+host, this VM still runs x86 code at full efficiency, but does so in a
+fully encapsulated environment, running its own kernel with virtualized
+devices in it own root-file resides in a single file (buildenv.img) on
+the hosts file system. This virtual machine must be booted before it can
+be used and communication happens through its virtual console or through
+virtual network connections.
+
+At the inside, ‘elbe chroot’ runs a CPU emulation environment without
+machine virtualization. This command actually does two separate things
+at once:
+
+-  chroot - i.e. divert all child processes to view a certain directory
+   as their root. Within this directory, there is a full set of
+   subdirectories (/etc, /usr, /var, …) and the child processes cannot
+   see or access anything outside this directory.
+
+-  qemu-user-binfmt - i.e. register qemu in such a way that binaries of
+   the target architecture (e.g. ARM) are transparently called via qemu
+   (this fairly complex technique is documented e.g. on
+   https://wiki.debian.org/QemuUserEmulation)
+
+The effect is that inside this ‘elbe chroot’ environment target .deb
+packages can be deployed and target binaries executed. However, there is
+not kernel running in the target architecture and the devices are still
+those provided by the encapsulating initvm virtual machine.
+
+While at the ‘elbe initvm’ boundary, the outside can only see a single
+‘qemu’ process and a single ‘buildenv.img’ file, the ‘elbe chroot’
+boundary is much more transparent, allowing the outside to observe
+individual processes and files of the inner environment.
diff --git a/website/news b/website/news
new file mode 120000
index 000000000000..9a8f36aa1722
--- /dev/null
+++ b/website/news
@@ -0,0 +1 @@
+../docs/news
\ No newline at end of file
diff --git a/website/support.rst b/website/support.rst
new file mode 100644
index 000000000000..153a5ea52ec1
--- /dev/null
+++ b/website/support.rst
@@ -0,0 +1,30 @@
+ELBE Support
+############
+
+There is community and commercial support available.
+
+Community support
+=================
+
+mail: `elbe-devel Mailinglist <https://lists.linutronix.de/mailman/listinfo/elbe-devel>`_
+
+Commercial support
+==================
+
+ELBE is maintained, and supported by Linutronix GmbH
+
+Linutronix GmbH is pleased to help you:
+
+    * ELBE trainings in south-germany or at request in your company
+    * ELBE setup and configuration help at your company
+    * ELBE extensions and improvements based on your ideas and needs
+
+For commercial support please contact
+
+| Linutronix GmbH
+| Bahnhofstr. 3
+| D-88690 Uhldingen
+
+fon: `+49 7556 25 999 0 <tel:00497556259990>`_
+
+web: https://linutronix.de
diff --git a/website/whatiselbe.rst b/website/whatiselbe.rst
new file mode 100644
index 000000000000..4c11ad8b55b2
--- /dev/null
+++ b/website/whatiselbe.rst
@@ -0,0 +1,87 @@
+==================
+ELBE in a nutshell
+==================
+
+This article describes why the ELBE project was born.
+
+early embedded Linux devices
+============================
+
+Well, first we should look at embedded devices to see what they used to
+look like and how some of them look like today.
+
+The first devices, that were initially called embedded Linux, had about
+4MiB flash and around 16MiB of RAM. With these constrains in mind people
+started to hack a root file system for their devices. If they had bad
+luck you had to start with building a cross toolchain first.
+
+Once that part was over you could focus on the user land. Busybox is a
+good tool to start with since it contains most of the required programs
+in a small single binary. Those programs and a few configurations files
+on top and you were done. Maybe you had to compile your “added value”
+binary or something else that was not part of busybox but that was it.
+
+Cross-build Toolkits
+====================
+
+Now sum up the single steps which were required to create a root file
+from scratch and create a tool to ease your life. This is when tools
+like OpenEmbedded, EDLK were born. Those tools are still good as long as
+they are well maintained. They aren’t just projects that are that small
+these days. A lot of them are getting very complex. This includes
+hardware that has much more RAM and a GiBs of NAND flash if not replaced
+by a disk or mmc card and the software, that is used, is more extensive.
+
+Rootfilesystems are getting bigger and bigger
+=============================================
+
+A lot of libraries are used to ease the development of a system. A
+toolkit for GUI development, several libraries for multimedia support
+just to name a few.
+
+Depending on the build environment that is used, it is more or less
+difficult to add a package that is not yet included. It depends on the
+scripting language that is used, the format keeping the build
+instructions and the user’s ability to understand it and make changes.
+
+Adding Debuging Tools is not that easy
+======================================
+
+Adding a debug version of a package to the root file system means a
+rebuild or restart of the build process to create this piece of the
+rootfile system assuming that a debug version can be selected (and not
+added to the build process). Even then the debug version isn’t installed
+in a jiffy.
+
+There is usually one person in charge of the root file system and a few
+others that are developing the application or a component of the
+application. One of the application developers has a problem and wants
+just to install a debug version of the library in question or replace it
+with a later version of it or a substitute library just to see if his
+problem goes away or not. He doesn’t necessarily know how to handle the
+build environment to make such changes. So he has to ask the person in
+charge of the root filesystem to make this change and send him the new
+filesystem.
+
+The application developer never did this kind of work because the Linux
+distribution on his desktop computer takes care of these things for him.
+The same distribution runs a test suite (if available) of the package
+after it has been built to spot problems in the compiled binaries which
+can’t be run if the package is cross compiled.
+
+No Bugtracking Informations available
+=====================================
+
+Another missing feature is the bug tracking against all packages in the
+root file system including security updates. This can be a full time job
+for one person even just by looking after 10 packages with a reasonable
+size. So why try to do a lot of work alone while this work is already
+done by large communities around Linux distribution like Debian?
+
+Debian for embedded?
+====================
+
+Instead of doing the work again we tried to figure out how Debian could
+be reused in a way that will fulfill our needs.
+
+Continue reading :doc:`elbe:article-elbeoverview-en`.

-- 
2.45.2



More information about the elbe-devel mailing list