From 246072c89647b0b1633073f996d0c521daa6ad47 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Thu, 18 Aug 2016 23:05:35 +0200 Subject: [PATCH 1/3] modulesync 0.12.1 --- .msync.yml | 2 +- .rubocop.yml | 315 ++++++++++++++++++++++---------------------- .travis.yml | 4 + Gemfile | 2 +- spec/spec_helper.rb | 4 +- 5 files changed, 167 insertions(+), 160 deletions(-) diff --git a/.msync.yml b/.msync.yml index 1e3829e86..3e71eb6a7 100644 --- a/.msync.yml +++ b/.msync.yml @@ -1 +1 @@ -modulesync_config_version: '0.11.1' +modulesync_config_version: '0.12.1' diff --git a/.rubocop.yml b/.rubocop.yml index c834cd201..97410eb36 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -9,476 +9,476 @@ AllCops: - pkg/**/* - spec/fixtures/**/* Lint/ConditionPosition: - Enabled: true + Enabled: True Lint/ElseLayout: - Enabled: true + Enabled: True Lint/UnreachableCode: - Enabled: true + Enabled: True Lint/UselessComparison: - Enabled: true + Enabled: True Lint/EnsureReturn: - Enabled: true + Enabled: True Lint/HandleExceptions: - Enabled: true + Enabled: True Lint/LiteralInCondition: - Enabled: true + Enabled: True Lint/ShadowingOuterLocalVariable: - Enabled: true + Enabled: True Lint/LiteralInInterpolation: - Enabled: true + Enabled: True Style/HashSyntax: - Enabled: true + Enabled: True Style/RedundantReturn: - Enabled: true + Enabled: True Lint/AmbiguousOperator: - Enabled: true + Enabled: True Lint/AssignmentInCondition: - Enabled: true + Enabled: True Style/SpaceBeforeComment: - Enabled: true + Enabled: True Style/AndOr: - Enabled: true + Enabled: True Style/RedundantSelf: - Enabled: true + Enabled: True # Method length is not necessarily an indicator of code quality Metrics/MethodLength: - Enabled: false + Enabled: False # Module length is not necessarily an indicator of code quality Metrics/ModuleLength: - Enabled: false + Enabled: False Style/WhileUntilModifier: - Enabled: true + Enabled: True Lint/AmbiguousRegexpLiteral: - Enabled: true + Enabled: True Lint/Eval: - Enabled: true + Enabled: True Lint/BlockAlignment: - Enabled: true + Enabled: True Lint/DefEndAlignment: - Enabled: true + Enabled: True Lint/EndAlignment: - Enabled: true + Enabled: True Lint/DeprecatedClassMethods: - Enabled: true + Enabled: True Lint/Loop: - Enabled: true + Enabled: True Lint/ParenthesesAsGroupedExpression: - Enabled: true + Enabled: True Lint/RescueException: - Enabled: true + Enabled: True Lint/StringConversionInInterpolation: - Enabled: true + Enabled: True Lint/UnusedBlockArgument: - Enabled: true + Enabled: True Lint/UnusedMethodArgument: - Enabled: true + Enabled: True Lint/UselessAccessModifier: - Enabled: true + Enabled: True Lint/UselessAssignment: - Enabled: true + Enabled: True Lint/Void: - Enabled: true + Enabled: True Style/AccessModifierIndentation: - Enabled: true + Enabled: True Style/AccessorMethodName: - Enabled: true + Enabled: True Style/Alias: - Enabled: true + Enabled: True Style/AlignArray: - Enabled: true + Enabled: True Style/AlignHash: - Enabled: true + Enabled: True Style/AlignParameters: - Enabled: true + Enabled: True Metrics/BlockNesting: - Enabled: true + Enabled: True Style/AsciiComments: - Enabled: true + Enabled: True Style/Attr: - Enabled: true + Enabled: True Style/BracesAroundHashParameters: - Enabled: true + Enabled: True Style/CaseEquality: - Enabled: true + Enabled: True Style/CaseIndentation: - Enabled: true + Enabled: True Style/CharacterLiteral: - Enabled: true + Enabled: True Style/ClassAndModuleCamelCase: - Enabled: true + Enabled: True Style/ClassAndModuleChildren: - Enabled: false + Enabled: False Style/ClassCheck: - Enabled: true + Enabled: True # Class length is not necessarily an indicator of code quality Metrics/ClassLength: - Enabled: false + Enabled: False Style/ClassMethods: - Enabled: true + Enabled: True Style/ClassVars: - Enabled: true + Enabled: True Style/WhenThen: - Enabled: true + Enabled: True Style/WordArray: - Enabled: true + Enabled: True Style/UnneededPercentQ: - Enabled: true + Enabled: True Style/Tab: - Enabled: true + Enabled: True Style/SpaceBeforeSemicolon: - Enabled: true + Enabled: True Style/TrailingBlankLines: - Enabled: true + Enabled: True Style/SpaceInsideBlockBraces: - Enabled: true + Enabled: True Style/SpaceInsideBrackets: - Enabled: true + Enabled: True Style/SpaceInsideHashLiteralBraces: - Enabled: true + Enabled: True Style/SpaceInsideParens: - Enabled: true + Enabled: True Style/LeadingCommentSpace: - Enabled: true + Enabled: True Style/SpaceBeforeFirstArg: - Enabled: true + Enabled: True Style/SpaceAfterColon: - Enabled: true + Enabled: True Style/SpaceAfterComma: - Enabled: true + Enabled: True Style/SpaceAfterMethodName: - Enabled: true + Enabled: True Style/SpaceAfterNot: - Enabled: true + Enabled: True Style/SpaceAfterSemicolon: - Enabled: true + Enabled: True Style/SpaceAroundEqualsInParameterDefault: - Enabled: true + Enabled: True Style/SpaceAroundOperators: - Enabled: true + Enabled: True Style/SpaceBeforeBlockBraces: - Enabled: true + Enabled: True Style/SpaceBeforeComma: - Enabled: true + Enabled: True Style/CollectionMethods: - Enabled: true + Enabled: True Style/CommentIndentation: - Enabled: true + Enabled: True Style/ColonMethodCall: - Enabled: true + Enabled: True Style/CommentAnnotation: - Enabled: true + Enabled: True # 'Complexity' is very relative Metrics/CyclomaticComplexity: - Enabled: false + Enabled: False Style/ConstantName: - Enabled: true + Enabled: True Style/Documentation: - Enabled: false + Enabled: False Style/DefWithParentheses: - Enabled: true + Enabled: True Style/PreferredHashMethods: - Enabled: true + Enabled: True Style/DotPosition: EnforcedStyle: trailing Style/DoubleNegation: - Enabled: true + Enabled: True Style/EachWithObject: - Enabled: true + Enabled: True Style/EmptyLineBetweenDefs: - Enabled: true + Enabled: True Style/IndentArray: - Enabled: true + Enabled: True Style/IndentHash: - Enabled: true + Enabled: True Style/IndentationConsistency: - Enabled: true + Enabled: True Style/IndentationWidth: - Enabled: true + Enabled: True Style/EmptyLines: - Enabled: true + Enabled: True Style/EmptyLinesAroundAccessModifier: - Enabled: true + Enabled: True Style/EmptyLiteral: - Enabled: true + Enabled: True # Configuration parameters: AllowURI, URISchemes. Metrics/LineLength: - Enabled: false + Enabled: False Style/MethodCallParentheses: - Enabled: true + Enabled: True Style/MethodDefParentheses: - Enabled: true + Enabled: True Style/LineEndConcatenation: - Enabled: true + Enabled: True Style/TrailingWhitespace: - Enabled: true + Enabled: True Style/StringLiterals: - Enabled: true + Enabled: True Style/TrailingCommaInArguments: - Enabled: true + Enabled: True Style/TrailingCommaInLiteral: - Enabled: true + Enabled: True Style/GlobalVars: - Enabled: true + Enabled: True Style/GuardClause: - Enabled: true + Enabled: True Style/IfUnlessModifier: - Enabled: true + Enabled: True Style/MultilineIfThen: - Enabled: true + Enabled: True Style/NegatedIf: - Enabled: true + Enabled: True Style/NegatedWhile: - Enabled: true + Enabled: True Style/Next: - Enabled: true + Enabled: True Style/SingleLineBlockParams: - Enabled: true + Enabled: True Style/SingleLineMethods: - Enabled: true + Enabled: True Style/SpecialGlobalVars: - Enabled: true + Enabled: True Style/TrivialAccessors: - Enabled: true + Enabled: True Style/UnlessElse: - Enabled: true + Enabled: True Style/VariableInterpolation: - Enabled: true + Enabled: True Style/VariableName: - Enabled: true + Enabled: True Style/WhileUntilDo: - Enabled: true + Enabled: True Style/EvenOdd: - Enabled: true + Enabled: True Style/FileName: - Enabled: true + Enabled: True Style/For: - Enabled: true + Enabled: True Style/Lambda: - Enabled: true + Enabled: True Style/MethodName: - Enabled: true + Enabled: True Style/MultilineTernaryOperator: - Enabled: true + Enabled: True Style/NestedTernaryOperator: - Enabled: true + Enabled: True Style/NilComparison: - Enabled: true + Enabled: True Style/FormatString: - Enabled: true + Enabled: True Style/MultilineBlockChain: - Enabled: true + Enabled: True Style/Semicolon: - Enabled: true + Enabled: True Style/SignalException: - Enabled: true + Enabled: True Style/NonNilCheck: - Enabled: true + Enabled: True Style/Not: - Enabled: true + Enabled: True Style/NumericLiterals: - Enabled: true + Enabled: True Style/OneLineConditional: - Enabled: true + Enabled: True Style/OpMethod: - Enabled: true + Enabled: True Style/ParenthesesAroundCondition: - Enabled: true + Enabled: True Style/PercentLiteralDelimiters: - Enabled: true + Enabled: True Style/PerlBackrefs: - Enabled: true + Enabled: True Style/PredicateName: - Enabled: true + Enabled: True Style/RedundantException: - Enabled: true + Enabled: True Style/SelfAssignment: - Enabled: true + Enabled: True Style/Proc: - Enabled: true + Enabled: True Style/RaiseArgs: - Enabled: true + Enabled: True Style/RedundantBegin: - Enabled: true + Enabled: True Style/RescueModifier: - Enabled: true + Enabled: True # based on https://github.com/voxpupuli/modulesync_config/issues/168 Style/RegexpLiteral: EnforcedStyle: percent_r - Enabled: true + Enabled: True Lint/UnderscorePrefixedVariableName: - Enabled: true + Enabled: True Metrics/ParameterLists: - Enabled: false + Enabled: False Lint/RequireParentheses: - Enabled: true + Enabled: True Style/SpaceBeforeFirstArg: - Enabled: true + Enabled: True Style/ModuleFunction: - Enabled: true + Enabled: True Lint/Debugger: - Enabled: true + Enabled: True Style/IfWithSemicolon: - Enabled: true + Enabled: True Style/Encoding: - Enabled: true + Enabled: True Style/BlockDelimiters: - Enabled: true + Enabled: True Style/MultilineBlockLayout: - Enabled: true + Enabled: True # 'Complexity' is very relative Metrics/AbcSize: @@ -489,10 +489,10 @@ Metrics/PerceivedComplexity: Enabled: False Lint/UselessAssignment: - Enabled: true + Enabled: True Style/ClosingParenthesisIndentation: - Enabled: false + Enabled: True # RSpec @@ -503,3 +503,6 @@ RSpec/DescribeClass: # Example length is not necessarily an indicator of code quality RSpec/ExampleLength: Enabled: False + +RSpec/NamedSubject: + Enabled: False diff --git a/.travis.yml b/.travis.yml index 1c78d831c..b4a44790e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,6 +31,10 @@ matrix: env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=rubocop - rvm: 2.3.1 env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=test + - rvm: 2.4.0-preview1 + env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=test + allow_failures: + - rvm: 2.4.0-preview1 notifications: email: false deploy: diff --git a/Gemfile b/Gemfile index 7421a1935..ddbd23d50 100644 --- a/Gemfile +++ b/Gemfile @@ -26,7 +26,7 @@ group :test do gem 'puppet-blacksmith', :require => false gem 'voxpupuli-release', :require => false, :git => 'https://github.com/voxpupuli/voxpupuli-release-gem.git' gem 'puppet-strings', :require => false, :git => 'https://github.com/puppetlabs/puppetlabs-strings.git' - gem 'rubocop-rspec', '~> 1.5', :require => false if RUBY_VERSION >= '2.3.0' + gem 'rubocop-rspec', '~> 1.6', :require => false if RUBY_VERSION >= '2.3.0' gem 'json_pure', '<= 2.0.1', :require => false if RUBY_VERSION < '2.0.0' end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 92c8cbed8..2d8b16588 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -7,8 +7,8 @@ puppetversion: Puppet.version, facterversion: Facter.version } - default_facts += YAML.read_file('default_facts.yml') if File.exist?('default_facts.yml') - default_facts += YAML.read_file('default_facts.yml') if File.exist?('default_module_facts.yml') + default_facts.merge!(YAML.load(File.read(File.expand_path('../default_facts.yml', __FILE__)))) if File.exist?(File.expand_path('../default_facts.yml', __FILE__)) + default_facts.merge!(YAML.load(File.read(File.expand_path('../default_module_facts.yml', __FILE__)))) if File.exist?(File.expand_path('../default_module_facts.yml', __FILE__)) c.default_facts = default_facts end From 21a362ea0e257d173a39d922f8429d18af7b0600 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Thu, 18 Aug 2016 23:08:56 +0200 Subject: [PATCH 2/3] enhance markdown --- README.md | 83 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index a2b121d05..8030f9e11 100644 --- a/README.md +++ b/README.md @@ -10,51 +10,58 @@ Installs and manages a DHCP server. ## Usage Define the server and the zones it will be responsible for. - class { 'dhcp': - service_ensure => running, - dnsdomain => [ - 'dc1.example.net', - '1.0.10.in-addr.arpa', - ], - nameservers => ['10.0.1.20'], - ntpservers => ['us.pool.ntp.org'], - interfaces => ['eth0'], - dnsupdatekey => '/etc/bind/keys.d/rndc.key', - dnskeyname => 'rndc-key', - require => Bind::Key['rndc-key'], - pxeserver => '10.0.1.50', - pxefilename => 'pxelinux.0', - omapi_port => 7911, - } +```puppet +class { 'dhcp': + service_ensure => running, + dnsdomain => [ + 'dc1.example.net', + '1.0.10.in-addr.arpa', + ], + nameservers => ['10.0.1.20'], + ntpservers => ['us.pool.ntp.org'], + interfaces => ['eth0'], + dnsupdatekey => '/etc/bind/keys.d/rndc.key', + dnskeyname => 'rndc-key', + require => Bind::Key['rndc-key'], + pxeserver => '10.0.1.50', + pxefilename => 'pxelinux.0', + omapi_port => 7911, +} +``` ### dhcp::pool Define the pool attributes - dhcp::pool{ 'ops.dc1.example.net': - network => '10.0.1.0', - mask => '255.255.255.0', - range => ['10.0.1.100', '10.0.1.200'], - gateway => '10.0.1.1', - } +```puppet +dhcp::pool{ 'ops.dc1.example.net': + network => '10.0.1.0', + mask => '255.255.255.0', + range => ['10.0.1.100', '10.0.1.200'], + gateway => '10.0.1.1', +} +``` ### dhcp::ignoredsubnet Define a subnet that will be ignored - useful for making the DHCP server only respond to requests forwarded by switches etc. - dhcp::ignoredsubnet{ 'eth0': - network => '10.0.0.0', - mask => '255.255.255.0', - } - +```puppet +dhcp::ignoredsubnet{ 'eth0': + network => '10.0.0.0', + mask => '255.255.255.0', +} +``` ### dhcp::host Create host reservations. - dhcp::host { 'server1': - comment => 'Optional descriptive comment', - mac => '00:50:56:00:00:01', - ip => '10.0.1.51', - } +```puppet +dhcp::host { 'server1': + comment => 'Optional descriptive comment', + mac => '00:50:56:00:00:01', + ip => '10.0.1.51', +} +``` ### parameters Parameters are available to configure pxe or ipxe @@ -62,11 +69,13 @@ Parameters are available to configure pxe or ipxe Boot ipxe from pxe. When configured this overrides pxefilename. For more information see [ipxe.org](http://ipxe.org/howto/chainloading). - class { 'dhcp': - ipxe_filename => 'undionly.kpxe', - ipxe_bootstrap => 'bootstrap.kpxe', - pxeserver => '10.0.1.50', - } +```puppet +class { 'dhcp': + ipxe_filename => 'undionly.kpxe', + ipxe_bootstrap => 'bootstrap.kpxe', + pxeserver => '10.0.1.50', +} +``` ## Contributors Zach Leslie From c938eac42632498ec1b98d6db7bbd70938da8b49 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Thu, 18 Aug 2016 23:25:10 +0200 Subject: [PATCH 3/3] release 1.0.0 --- .travis.yml | 2 ++ CHANGELOG.md | 89 +++++++++++++++++++++++++++++---------------------- Gemfile | 1 + metadata.json | 40 +++++++++++++++++++++-- 4 files changed, 90 insertions(+), 42 deletions(-) diff --git a/.travis.yml b/.travis.yml index b4a44790e..e478d9215 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,8 @@ notifications: email: false deploy: provider: puppetforge + edge: + branch: ha-bug-puppet-forge user: puppet password: secure: "xwp69Nk5akckY84I/UecQOJx1guhKFscwR16AURDw/A2oO6uY2T8iHqWN+i0jrQ4rB+EZK76dTvDZiNIOBByPc0GC4Hn53L2wy0uEz41Sd/Ys4gZviIFjY81y2jEeFa2MFPAI5KWCBFk4vPOoT8raYpkBA37ux6kvm2bemmqqSQ=" diff --git a/CHANGELOG.md b/CHANGELOG.md index 531b4fd5c..35636bdca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,67 +1,78 @@ -## 2016.05.22 Release 0.5.0 +## 2016-08-18 Release 1.0.0 -- First release in the voxpupuli namespace -- Drop Ruby1.8 support -- Add support for STRICT_VARIABLES -- modulesync with latest voxpupuli defaults -- do not sort pool dns servers list -- add generic support for custom config options -- Add support for iPXE chain loading -- Fix wrong fact values in case blocks (init.pp/params.pp) +* Modulesync with latest Vox Pupuli defaults +* Feature: Add optional "comment" field to host template +* Feature: Add Arch Linux support +* Feature: Add support for LDAP backend +* Feature: Use ISC default for default_lease_time +* Feature: Add option dns search domain +* Fix: Work around notification problem with concat resources + + +## 2016-05-22 Release 0.5.0 + +* First release in the voxpupuli namespace +* Drop Ruby1.8 support +* Add support for STRICT_VARIABLES +* modulesync with latest voxpupuli defaults +* do not sort pool dns servers list +* add generic support for custom config options +* Add support for iPXE chain loading +* Fix wrong fact values in case blocks (init.pp/params.pp) ## 2015-09-15 Release 0.4.0 Backwards incompatible changes: -- Updated to set `ddns-hostname` instead of `option host-name`. +* Updated to set `ddns-hostname` instead of `option host-name`. Features: -- Adds ability to ignore subnets. -- Adds service_ensure to manage state of dhcp service. -- Allows users to specify different nameservers and PXE-server. -- ALlows overriding of the domain name per pool. -- Modernizes module with lint, testing, metadata updates. -- Allows adding of abitrary global options to the main `dhcpd.conf`. -- Allows additional options to be specified for `dhcp::host`. -- Allows setting of the `dnskeyname` parameter in `dhcpd.conf`. -- Adds ability to define `omapi_port`. -- Adds ability to ignore unknown-clients. +* Adds ability to ignore subnets. +* Adds service_ensure to manage state of dhcp service. +* Allows users to specify different nameservers and PXE-server. +* ALlows overriding of the domain name per pool. +* Modernizes module with lint, testing, metadata updates. +* Allows adding of abitrary global options to the main `dhcpd.conf`. +* Allows additional options to be specified for `dhcp::host`. +* Allows setting of the `dnskeyname` parameter in `dhcpd.conf`. +* Adds ability to define `omapi_port`. +* Adds ability to ignore unknown-clients. Bugfixes: -- Normalizes MAC addresses to be printed in upper case. -- Fixes default ntpservers value to not fail validation. -- Fix in documentation for dhcp::pool. range should be array instead of string. -- Fixes dhcpd.conf file dependency error. -- Fix to properly wrap `domain-name` in quotes. +* Normalizes MAC addresses to be printed in upper case. +* Fixes default ntpservers value to not fail validation. +* Fix in documentation for dhcp::pool. range should be array instead of string. +* Fixes dhcpd.conf file dependency error. +* Fix to properly wrap `domain-name` in quotes. ## 2014-07-23 Release 0.3.0 Backwards incompatible changes: -- Now requires puppetlabs/concat >= 1.1.0 +* Now requires puppetlabs/concat >= 1.1.0 Features: -- Allow gateway to be unset for private networks -- Add sysconfig dhcpd file for RedHat based systems +* Allow gateway to be unset for private networks +* Add sysconfig dhcpd file for RedHat based systems Bugfixes: -- Remove deprecated concat::setup -- Update templates to remove deprecation warnings -- Ensure $dhcp_dir exists +* Remove deprecated concat::setup +* Update templates to remove deprecation warnings +* Ensure $dhcp_dir exists ## 2014-03-25 Release 0.2.0 Backwards incompatible changes: -- Update concat dependency to puppetlabs/concat -- Depend on puppetlabs/stdlib +* Update concat dependency to puppetlabs/concat +* Depend on puppetlabs/stdlib Features: -- Allow ntpservers in dhcp.conf to be optional -- Add redhat/fedora/centos package and service names -- Make dhcp::pool range parameter optional +* Allow ntpservers in dhcp.conf to be optional +* Add redhat/fedora/centos package and service names +* Make dhcp::pool range parameter optional Bugfixes: -- Add unit tests -- Add apache license file -- Remove erronious failover parameter from base class +* Add unit tests +* Add apache license file +* Remove erronious failover parameter from base class diff --git a/Gemfile b/Gemfile index ddbd23d50..72b8ee899 100644 --- a/Gemfile +++ b/Gemfile @@ -28,6 +28,7 @@ group :test do gem 'puppet-strings', :require => false, :git => 'https://github.com/puppetlabs/puppetlabs-strings.git' gem 'rubocop-rspec', '~> 1.6', :require => false if RUBY_VERSION >= '2.3.0' gem 'json_pure', '<= 2.0.1', :require => false if RUBY_VERSION < '2.0.0' + gem 'puppet-lint', '2.0.0' end group :development do diff --git a/metadata.json b/metadata.json index 5813de384..7aae2fd84 100644 --- a/metadata.json +++ b/metadata.json @@ -1,7 +1,7 @@ { - "name": "puppetlabs-dhcp", - "version": "0.5.1-rc0", - "author": "voxpupuli", + "name": "puppet-dhcp", + "version": "1.0.0", + "author": "Vox Pupuli", "summary": "Manage the ISC dhcp daemon", "license": "Apache-2.0", "source": "https://github.com/voxpupuli/puppetlabs-dhcp", @@ -16,5 +16,39 @@ "name": "puppetlabs/concat", "version_requirement": ">= 1.1.0 < 2.0.0" } + ], + "operatingsystem_support": [ + { + "operatingsystem": "RedHat", + "operatingsystemrelease": [ + "6.0", + "7.0" + ] + }, + { + "operatingsystem": "CentOS", + "operatingsystemrelease": [ + "6.0", + "7.0" + ] + }, + { + "operatingsystem": "Ubuntu", + "operatingsystemrelease": [ + "12.04", + "14.04", + "16.04" + ] + }, + { + "operatingsystem": "Debian", + "operatingsystemrelease": [ + "7.0", + "8.0" + ] + }, + { + "operatingsystem": "Archlinux" + } ] }