Commit Graph

131 Commits

Author SHA1 Message Date
Daniel 537b9cab03
Rework network config (#1001)
* Update network configuration

* Rework network configuration

* Update documentation

* Fix flake8

* Update

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
2022-02-28 15:57:57 +01:00
Werner Llácer f06aabb4d4
enhacements to the menu infraestructure (#978)
* Correct definition of btrfs standard layout

* Solve issue #936

* make ask_for_a_timezone as synonym to ask_timezone

* Some refining in GeneralMenu
secret is now a general function

* Revert "Some refining in GeneralMenu"

This reverts commit e6e131cb19.

* Activate load of preset values in GeneralMenu
Changed all select_functions definitions to the need of passing the preset value
Corrected problems at ask_to_configure_network, and management of preset values added

* minor glitches in menu processing, plus flake8 complains

* Changes to ask_to_configure_network following  @svartkanin code

* select_language adapted to preset value.
changes to the infraestructure to solve bugs

* functions adapted for preset values
* select_mirror_regions
* select_locale_lang
* select_locale_enc
* ask_for_swap

* Updated to preset values
* ask_for_bootloader
Won't use it
* set_root_password()

* Updated to preset values
* ask_for_audio_selection
* select_kernel
* ask_for_a_timezone

* Updated to use preset values
* select_ntp
* ask_ntp
* ask_for_swap
flake8 complains

* Adapted to preset values
* ask_additional_packages_to_install (from svartkanin)
* ask_to_configure_network (adapted from svartkanin version)

* Updated to preset values
* ask_hostname
* select_additional_repositories

* bug in nic conversion
_select_harddrives adapted to preset_menu
2022-02-28 15:02:39 +01:00
Daniel 6489a417aa
Fix #966 - DeferredTranslation errors (#976)
* Fix #966

* Add types to parameters

* Update network configuration

* Backwards compability for nic config

* Update

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
2022-02-15 08:44:58 +01:00
Daniel 003a35be3d
Fix errors on selection of additional packages (#959)
* Fix errors on selection of additional packages

* Fix flake8

* Added the new /groups/search/json/?name=x endpoint merged today

* Fixed flake8 complaint

* Forgot to do json.loads() on the HTTP request result

* Update package selection

* Fix flake8

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton@hvornum.se>
2022-02-12 11:47:51 +01:00
Werner Llácer 1ea6fea1d8
Flexible menu 2 (#916)
* Correct definition of btrfs standard layout

* New version of the FlexibleMenu
* Added new functionality to Selector
* Created a GeneralMenu class
* GlobalMenu is made a child of GeneralMenu

* Some refining in GeneralMenu
secret is now a general function

* log is invoked in GeneralMenu directly

* Correction at GeneralMenu

* Materialize again _setup_selection_menu_options. Gives more room to play

* Callbacks converted as methods
Synch() (data area and menu) decoupled from enable()
and made general before any run

* script swiss added to the patch set

* Only_hd gets a new implementation of the menu
flake8 corrections

* swiss.py description added

* New version of the FlexibleMenu
* Added new functionality to Selector
* Created a GeneralMenu class
* GlobalMenu is made a child of GeneralMenu

* changes from the rebase left dangling

* Modify order of execution between exec_menu and post_processing.
Added selector_name as parameter for exec_menu

* minor corrections to the scripts

* Adapt to PR #874

* Solve issue #936

* make ask_for_a_timezone as synonym to ask_timezone

* Adapted to nationalization framework (PR 893).
String still NOT adapted

* flake8 complains

* Use of archinstall.output_config instead of local copy at swiss.py

* Problems with the last merge

* more flake8 complains. caused by reverted changes re. ask*timezone

* git complains

Co-authored-by: Anton Hvornum <anton@hvornum.se>
2022-02-06 11:54:13 +01:00
Daniel 9fb8d3164c
Update nationalization (#944)
* Update nationalization

* Update translations

* Finish german translation

* Fix errors #943

* Add remaining translations

* Fix alignment in menu

* Update README

* Update translations:

* Fix flake8

* Update tz function

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
2022-02-06 11:30:26 +01:00
Werner Llácer ec73bdab4c
Routine to properly print and save config data (#888)
* Created a standard function to show/save the config parameters

* flake8 complains

* Correct definition of btrfs standard layout

* Solve issue #936

* Moved output_configs to lib/configuration.py
2022-02-05 13:52:14 +01:00
Daniel f6d133804b
Provide nationalization (#893)
* Nationalization

* Add _ as builtins to flake8

* Removing conflict hash tag

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton@hvornum.se>
2022-02-05 00:27:29 +01:00
Werner Llácer 85f2938df9
Moving load_config from guided to \__init__.py (#887)
* The initializations done at the start of guided.py are now at archinstall/__init__.py
The scripts have been changed accordingly

* Correct definition of btrfs standard layout

Co-authored-by: Anton Hvornum <anton@hvornum.se>
2022-02-04 23:48:41 +01:00
Werner Llácer 3cd7dc24c7
Command locales (second batch) (#886)
* flexibilize the definition of execution locale for OS commands executed via the SysCommand* interface.
Defined a storage argument which holds the default
Added functions to
unset the program own locales
reset to the program default locales
set a specific locale
A decorator to execute functions in the host locale environment

* rename decorator local_environ to host_locale_environ
created a simmetric decorator c_locale_environ, to make a routine work with the C locale whatever is set

* Correct definition of btrfs standard layout

* Added error handling

* Fixed issue where archinstall.Boot() would raise an exception in vain

* Added debugging for SysCommandWorker()

* Added some debugging

* Tweaking debug a bit

* Tweaking debug

* Adding more debug

* Adding more debug

* Removed some debugging

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Adding more debug

* Removed soem debugging

* Removed soem debugging

* Testing a revert

* Adding back the reverted change, adding lofile

* Redirecting stdout to /dev/null for testing (to avoid interrupting the fork)

* Reverted debug changes

* Testing os.system()

Co-authored-by: Anton Hvornum <anton@hvornum.se>
2022-02-03 00:02:30 +01:00
Anton Hvornum 389feef035
Torxed pydantic to dataclass (#935)
* Converted pydantic things to @dataclass definitions.

* Added import for the dataclasses

* flake8 fixes
2022-02-02 15:01:17 +01:00
Anton Hvornum d3cf8a3655 Removed dead import 2022-02-02 14:24:20 +01:00
Anton Hvornum c08520f990
SysCommand() to remove ANSII VT100 Esc codes & archlinux-keyring fix (#933)
* Fixed SysCommandWorker() so that it removes ANSII VT100 escape codes. I also moved package.py into it's own folder, as that's something I want to expand on a lot, so package related stuff should go in there. I created a installed_package() function which gets information about the locally installed package. I changed so that find_packages() and find_package() returns a data-model instead for the package information. This should unify and make sure we detect issues down the line.

* Working on structuring .version constructor that works with BaseModel

* Added version contructors to VersionDef(). Also added __eq__ and __lt__ to LocalPackage() and PackageSearchResult().

* removed debug and added a TODO

* Removed whitespace

* Removed mirror-database function from myrepo
2022-02-02 14:22:52 +01:00
Anton Hvornum 08ffffe5b3 Changed working version in master to v2.4.0-dev0 2022-02-02 08:30:26 +01:00
Werner Llácer e3adab13e8
Issue923 (#927)
* Correct definition of btrfs standard layout

* Solving issue 923.
Standarize keyword "wipe" to signal the need of formatting a FS

* flake8 complains
2022-02-01 16:44:39 +01:00
Werner Llácer c776e30191
Some issues at Guided.py (#878)
* Solves issue #873 (error by key sys-language
Now disk_layouts file contents are loaded before calling the menu

* Solves issue #873 (error by key sys-language. Solution in previous commit was still too restrictive
2022-01-18 20:57:30 +01:00
Anton Hvornum b533bd0553 Moved lib.plugin import to the top 2022-01-14 13:23:30 +01:00
Daniel 1234261a7a
Global menu (#806)
* Global menu

* Fix flake8

* Refactor code

* Add documentation

* Fix flake8

* Add support for user flow mentioned in #799

* Move import

* Fix flake8 (again)

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
2022-01-07 10:48:23 +00:00
Anton Hvornum 240f688cce Adding a Pipewire application profile (#821)
* Adding a Pipewire application profile

This to better manage the pipewire setup process and minimize guided a bit. This also adds the concept of @archinstall.plugin decorators to add a plugin in run-time. Which pipewire uses to detect user creation and enable the pipewire-pulse service for new users.

* Forgot to run .install() on pipewire Application()
* Backwards compatible variable insertion for installation session
2022-01-02 16:38:02 +01:00
Werner Llácer b89408ab7b
Improved command line argument parsing (#725)
* An update to PR 715, making the handling of the *--mount-point* parameter less error prone.
I added a synomym (accepting the name both with underscore and dash) and ignoring when no value specified
I added it explicitly to the list to accept both the --parm value and --parm=value syntax
DOES NOT check the contents of the parameter
* Explicitly set all the know parameters
* Define explictly all parameters.
Make all non explicitly defined parameters behave as standard parameters, with on exception, names are not changed
Some cleanup of the code
In guided.py the reference to the dry_run parameter is updated to the standard naming convention for parameters
* Linter with flake8. corrections
* Linter with flake8. corrections (II)
* Linter with flake8. corrections (and III)
* Added --disk_layout argument. Was missing
I moved its loading from guided.py to __init__.py as it happens to the other json related arguments
* Better handling of errors during processing of the --disk_layouts parameter.
I define a routine to read an store a JSON file or stream. Tested on disk_layout
* Expand the former commit to all JSON file arguments
* Moved the function we created to read json files/streams to general.py. Add some comments
* flake8. A reference now unneded
* The merge process for the dry-run argument was causing the issue, not solving it
The del is just a cleanup for version upgrade without consequence (I hope)
* flake8 warning
* Correcting the last correction . Worked for old config files, but only for them
* New parameter parsing algorithm. More flexible and accepts multiple arguments (optionallY)
plus some documentation effort
* flake8 warning. For once is significant ( != None to not None)
2022-01-02 12:28:49 +01:00
Daniel 908c7b8cc0
Add simple menu for better UX (#660)
* Add simple menu for better UX
* Add remove external dependency
* Fix harddisk return value on skip
* Table output for partitioning process
* Switch partitioning to simple menu
* fixup! Switch partitioning to simple menu
* Ignoring complexity and binary operator issues
Only in simple_menu.py
* Added license text to the MIT licensed file
* Added in versioning information
* Fixed some imports and removed the last generic_select() from user_interaction. Also fixed a revert/merged fork of ask_for_main_filesystem_format()
* Update color scheme to match Arch style better
* Use cyan as default cursor color
* Leave simple menu the same

Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton.feeds+github@gmail.com>
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2021-12-02 21:17:51 +01:00
Dylan M. Taylor 93714133f4
Set the version for master to 2.3.1 development 2021-11-24 16:37:29 -05:00
Anton Hvornum c4ba14e62a
Bumped the version to v2.3.0 2021-11-24 22:27:38 +01:00
Dylan Taylor 04c2b19dbe Fix error at end of installation from missing method import 2021-11-23 15:27:02 -05:00
Anton Hvornum caa83221a7 Added an exception if configuration cannot be loaded, to avoid confusion 2021-11-18 15:56:38 +00:00
Anton Hvornum 1bc4e114fe Adding in --mount-point argument, which overrides storage['MOUNT_POINT'] 2021-11-13 10:46:11 +01:00
Yash Tripathi b60e8dfd10 changed dry_run to dry-run 2021-07-18 21:45:24 +05:30
Yash Tripathi fcd0acfef2
added --dry-run flag (#570)
* added --dry-run flag
2021-06-10 15:06:15 +02:00
Yash Tripathi 9bec42ad08
updated creds help 2021-06-06 08:41:37 +05:30
Yash Tripathi 158dbbf8f1
changed block location 2021-06-06 08:35:26 +05:30
Yash Tripathi 419b058b6f
added support for seperating credentials from config 2021-06-06 08:18:34 +05:30
Anton Hvornum 6a0f6b161c Adding more granular debugging 2021-06-02 21:31:28 +02:00
Anton Hvornum e993590f5f
Pulled in latest master changes 2021-05-28 09:30:35 +02:00
Anton Hvornum a89f87c145
Update __version__ to become a dev-version again
To avoid accidental pypi snafu's
2021-05-28 09:03:10 +02:00
Dylan M. Taylor 5b1f30383b
Update version for 2.2.0 final 2021-05-27 14:42:24 -04:00
Anton Hvornum 94bceb2199 Adding support for --plugin=<plugin path> 2021-05-24 15:29:59 +02:00
Anton Hvornum 1773efbe45 Pleasing the linter gods 2021-05-24 14:37:31 +02:00
Anton Hvornum e604f2c676 Added optional version handling. And improved error handling a bit. 2021-05-24 14:36:24 +02:00
Anton Hvornum 250eb93f10 Added better error handling. 2021-05-24 14:12:23 +02:00
Anton Hvornum 6f3a358422 Added a comment 2021-05-24 13:38:54 +02:00
Anton Hvornum 29dcd5f2d0 Pleasing the linter gods 2021-05-24 13:38:17 +02:00
Anton Hvornum fcbb5490c0 Removed empty whitespace 2021-05-24 13:38:01 +02:00
Anton Hvornum bad4d8a38b Added redundant argument creation. 2021-05-24 13:37:33 +02:00
Anton Hvornum 9b0de26c67 Syncing in latest changes from master 2021-05-24 12:34:32 +02:00
Anton Hvornum 0b3e822795 Merge branch 'master' of github.com:archlinux/archinstall 2021-05-23 10:32:43 +02:00
Anton Hvornum 9fa9520ac9 Version bump for tagging. 2021-05-23 10:32:40 +02:00
Yash Tripathi 194d45ad2d
removed debug code 2021-05-23 11:52:52 +05:30
Yash Tripathi 48f1e62427 bringing back the old method for parsing extra args as config values 2021-05-23 11:38:53 +05:30
Dylan M. Taylor 5b0f918d1b
Have the configuration file request identify itself as coming from ArchInstall
This is necessary to allow proper filtering of these requests server-side, and some services block urllib requests (known issue with Cloudflare).
2021-05-19 18:16:28 -04:00
Dylan Taylor c1cd845d07 Added support for getting configuration from a URL 2021-05-19 17:06:42 -04:00
Yash Tripathi bbb4599165
Added support for getting configuration from a config file (#364)
* added support for ingesting config

* fixed condition to check key in dictionary

* Removed redundant code, profile and desktop keys are now optional

* Added base-config.json and support for pulling credentials from .env

* added base config file and env file for users credentials

* added silent install switch

* added python-dotenv as a dependency

* Updated Readme to include argparse changes as well as config ingestion

* Updated Readme to include argparse changes as well as config ingestion

* fixed typo in pyproject.toml

* Replaced the magic __builtin__ global variable. This should fix mypy complaints while still retaining the same functionality, kinda. It's less automatic but it's also less of dark magic, which makes sense for anyone but me.

* Fixes string index error.

* Quotation error.

* fixed initializing --script argument

* added python-dotenv as a dependency

* Installation can't be silent if config is not passed

* fixed silent install help

* fixed condition for ask_user_questions

* reverted to creating profile object properly

* Cleaned up and incorporated suggestions

* added Profile import

* added condition if Profile is null

* fixed condition

* updated parsing vars from argparse

* removed loading users from .env

* Reworking SysCommand & Moving to localectl for locale related activities (#4)

* Moving to `localectl` rather than local file manipulation *(both for listing locales and setting them)*.
* Swapped `loadkeys` for localectl.
* Renamed `main` to `maim` in awesome profile.
* Created `archinstall.Boot(<installation>)` which spawns a `systemd-nspawn` container against the installation target.
* Exposing systemd.py's internals to archinstall global scope.
* Re-worked `SysCommand` completely, it's now a wrapper for `SysCommandWorker` which supports interacting with the process in a different way. `SysCommand` should behave just like the old one, for backwards compatibility reasons. This fixes #68 and #69.
* `SysCommand()` now has a `.decode()` function that defaults to `UTF-8`.
* Adding back peak_output=True to pacstrap.

Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
Co-authored-by: Dylan Taylor <dylan@dylanmtaylor.com>

Co-authored-by: Anton Hvornum <anton@hvornum.se>
Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>

* fixed indent

* removed redundant import

* removed duplicate import

* removed duplicate import

Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
Co-authored-by: Anton Hvornum <anton@hvornum.se>
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2021-05-19 21:31:58 +02:00
Anton Hvornum 49e6cbdc54
Reworking SysCommand & Moving to localectl for locale related activities
* Moving to `localectl` rather than local file manipulation *(both for listing locales and setting them)*.
* Swapped `loadkeys` for localectl.
* Renamed `main` to `maim` in awesome profile.
* Created `archinstall.Boot(<installation>)` which spawns a `systemd-nspawn` container against the installation target.
* Exposing systemd.py's internals to archinstall global scope.
* Re-worked `SysCommand` completely, it's now a wrapper for `SysCommandWorker` which supports interacting with the process in a different way. `SysCommand` should behave just like the old one, for backwards compatibility reasons. This fixes #68 and #69.
* `SysCommand()` now has a `.decode()` function that defaults to `UTF-8`.
* Adding back peak_output=True to pacstrap.

Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
Co-authored-by: Dylan Taylor <dylan@dylanmtaylor.com>
2021-05-19 16:45:13 +02:00
Dylan M. Taylor 0e5b0edd6c
reintroduce this line, seems to be needed for install to work despite being detected as unused 2021-05-15 16:23:11 -04:00
Dylan Taylor 8e86a955ec archinstall/__init__.py changes 2021-05-15 15:43:02 -04:00
Dylan Taylor 126c7ebfca More formatting fixes to satisfy PEP 8 2021-05-15 15:04:39 -04:00
Dylan Taylor 658e5c0411 Cleanup imports and disk.py a bit more 2021-05-15 12:50:01 -04:00
Anton Hvornum e4e5e3db2d
Updating __version__ to dev1 for dev release. 2021-05-15 16:14:34 +02:00
Anton Hvornum 404197dc93 Enabling --plugins filtering 2021-04-30 16:45:42 +02:00
Anton Hvornum b59a406069 Adding on_pacstrap hook for installation. As well as a plugins listing that plugins can hook in to in order to be called during specific on_<event> calls. 2021-04-29 14:22:38 +02:00
Anton Hvornum 2d02e806f2
Cleaning up packages. (#374)
* Cleaning up packages. installer now relies on __packages__ definition. Which will work with external libs to more easily gather packages used by installer and profiles.

* Added back the logic for the log message, where we inform if we're adding the boot loader to root or boot.

* Added __package__ definition to profiles and the installer. These packages can be used as an indication from outside libraries of what could *possibly* be installed. For instance an offline-tool could source these, it would source more than it needed to, but it would give a quick rundown of what might be needed.

* Removed import of __base__packages__ as it's now just __packages__ after a lot of stream-lining.

* Explosion misspelling.

Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
2021-04-29 10:18:43 +02:00
Dylan M. Taylor 7f3e12b50f
Change version to 2.2.0 in 2.2.0 branch 2021-04-15 10:03:04 -04:00
advaithm 413565dbd0 moved to flit build system 2021-04-12 19:39:23 +05:30
Anton Hvornum 42470dcc9a Merging changes from master into feature branch to avoid future conflics. 2021-04-07 11:15:42 +02:00
Pyfisch ecf7a2a237 Add console_scripts archinstall entry point
archinstall should be callable from the command-line.
Previously this was achieved with a shell script,
however Python packages contain a built in way to to
this via the entry points mechanism.
2021-04-05 16:21:12 +02:00
Pyfisch 7f691ce1c9 Switch to setup.cfg
Configure setup.cfg to find all Python packages.
Add more metadata to package.
2021-04-05 15:59:10 +02:00
Anton Hvornum 99dd9b1fb7 New feature: Profile() now supports .packages which returns any defined packages for that specific profile, as well as archinstall.__packages__ contain any packages that Installer() is responsible for. This can be used to quickly gather any required packages and dependencies by archinstall. Not all profiles have it yet, so .packages might return None. 2021-03-25 15:07:49 +01:00
Anton Hvornum c983976394 Added in argument support to archinstall for easier testing and debugging 2021-02-07 17:57:16 +01:00
Anton Hvornum 68adb3108f Created an embryo for hardware detection. Supports detecting WiFi and UEFI. This fixes #44 and is a start for #82. 2021-01-25 10:31:02 +01:00
Varun Madiath 5ded22a5d0 Fix some PEP-8 errors. 2020-10-19 23:07:35 -04:00
Anton Hvornum a73f0b0135 Added a session-storag. This is in an attempt to build away some magic functionality that might otherwise be hard to understand/maintain over a long period of time. Using this in profiles/desktop.py as a test. 2020-10-18 12:28:12 +02:00
Anton Hvornum 90eff26657 Reverted TTS implementation from 35913c4. Since blind people use screen readers for this functionality. Will have a look at http://www.linux-sppeakup.org/. 2020-10-18 11:58:29 +02:00
Anton Hvornum 35913c4ebe Added imports for `archinstall.TTS()` as well as added optinal depends for `PKGBUILD` files. 2020-10-11 14:04:41 +02:00
Anton Hvornum a91aea3154 First complete draft of the documentation. Some autodocs are still unpopulated but will be done via code and not reST chapters. 2020-09-30 22:24:57 +02:00
Anton Hvornum 8daae75a78 Adding service logic. Checking if reflector has finished before we select custom mirrors (if any) 2020-09-01 14:33:55 +02:00
Anton Hvornum 8f35f44939 Added locale helpers in terms of keyboard language/layout. archinstall.list_keyboard_languages(), archinstall.search_keyboard_layout() and archinstall.set_keyboard_language() work together to help listing, finding and setting a keyboard layout in terminals. Won't work for X-frontends, but will do for CLI installation methods. Added a language selector-helper-function with a crude search functionality. Added all this to the guided template. 2020-09-01 09:01:14 +02:00
Anton Hvornum 056b800c8e Starting to add networking helpers in archinstall. First up is archinstall.getHwAddr(ifname) which returns the mac of a interface name. second is archinstall.list_interfaces() which lists all the local MAC addresses and which interface it is bound to. Also starting to add the unattended installer back step by step. Currently with one MAC profile. The MAC profile filtering/detection has also been added in archinstall.list_profiles() - it will filter out all MAC address-specific profiles when called, unless a MAC matches a profile or filter_irrelevant_macs=False is given. 2020-08-20 17:08:13 +00:00
Anton Hvornum c884a25237 Added a set_timezone() and fixed set_locale() in the Installer() class. Also added a mirrors.py helper to rudimentary set mirror data on the installer host 2020-07-21 19:03:24 +00:00
Anton Hvornum 60f581319f Added pythons -m module support. __main__.py is the main module entry path, and setup.py now includes the examples (which as been renamed for more convenient module importing) which - enables __main__.py to locate the examples and import them via importlib and execute them. 2020-07-07 23:56:17 +00:00
Anton Hvornum 0bc24699c1 Added colored output. Also tested non-encrypted installations and added ext4 support. 2020-07-07 21:59:09 +00:00
Anton Hvornum f7d3022cc8 Reworked final preparations for working with profiles and installing them. 2020-07-06 22:20:34 +02:00
Anton Hvornum b4a6f03b96 Converted the lib to a pip supported structure to make packaging easier. Also tweaked some minor issues and added the AUR function 2020-07-06 18:44:42 +02:00