summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2023-04-24 17:05:29 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2023-04-24 17:05:29 +0200
commit538b7ff0c8125a3f412154807e3425127968448f (patch)
treed998b3c00dc019a6ed16625b72a682c10708a5b0
parentInitial commit. (diff)
downloadgunicorn-538b7ff0c8125a3f412154807e3425127968448f.tar.gz
gunicorn-538b7ff0c8125a3f412154807e3425127968448f.tar.xz
Add everything.
-rw-r--r--.puppet-lint.rc1
-rw-r--r--.rubocop.yml519
-rw-r--r--Gemfile63
-rw-r--r--Gemfile.lock511
-rw-r--r--LICENSE202
-rw-r--r--files/gunicorn@.service15
-rw-r--r--manifests/instance.pp38
-rw-r--r--manifests/setup.pp34
-rw-r--r--metadata.json22
-rw-r--r--pdk.yaml2
-rw-r--r--templates/gunicorn.conf.py.epp18
11 files changed, 1425 insertions, 0 deletions
diff --git a/.puppet-lint.rc b/.puppet-lint.rc
new file mode 100644
index 0000000..cc96ece
--- /dev/null
+++ b/.puppet-lint.rc
@@ -0,0 +1 @@
+--relative
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..31e8248
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,519 @@
+---
+require:
+- rubocop-performance
+- rubocop-rspec
+AllCops:
+ DisplayCopNames: true
+ TargetRubyVersion: '2.5'
+ Include:
+ - "**/*.rb"
+ Exclude:
+ - bin/*
+ - ".vendor/**/*"
+ - "**/Gemfile"
+ - "**/Rakefile"
+ - pkg/**/*
+ - spec/fixtures/**/*
+ - vendor/**/*
+ - "**/Puppetfile"
+ - "**/Vagrantfile"
+ - "**/Guardfile"
+Layout/LineLength:
+ Description: People have wide screens, use them.
+ Max: 200
+RSpec/BeforeAfterAll:
+ Description: Beware of using after(:all) as it may cause state to leak between tests.
+ A necessary evil in acceptance testing.
+ Exclude:
+ - spec/acceptance/**/*.rb
+RSpec/HookArgument:
+ Description: Prefer explicit :each argument, matching existing module's style
+ EnforcedStyle: each
+RSpec/DescribeSymbol:
+ Exclude:
+ - spec/unit/facter/**/*.rb
+Style/BlockDelimiters:
+ Description: Prefer braces for chaining. Mostly an aesthetical choice. Better to
+ be consistent then.
+ EnforcedStyle: braces_for_chaining
+Style/ClassAndModuleChildren:
+ Description: Compact style reduces the required amount of indentation.
+ EnforcedStyle: compact
+Style/EmptyElse:
+ Description: Enforce against empty else clauses, but allow `nil` for clarity.
+ EnforcedStyle: empty
+Style/FormatString:
+ Description: Following the main puppet project's style, prefer the % format format.
+ EnforcedStyle: percent
+Style/FormatStringToken:
+ Description: Following the main puppet project's style, prefer the simpler template
+ tokens over annotated ones.
+ EnforcedStyle: template
+Style/Lambda:
+ Description: Prefer the keyword for easier discoverability.
+ EnforcedStyle: literal
+Style/RegexpLiteral:
+ Description: Community preference. See https://github.com/voxpupuli/modulesync_config/issues/168
+ EnforcedStyle: percent_r
+Style/TernaryParentheses:
+ Description: Checks for use of parentheses around ternary conditions. Enforce parentheses
+ on complex expressions for better readability, but seriously consider breaking
+ it up.
+ EnforcedStyle: require_parentheses_when_complex
+Style/TrailingCommaInArguments:
+ Description: Prefer always trailing comma on multiline argument lists. This makes
+ diffs, and re-ordering nicer.
+ EnforcedStyleForMultiline: comma
+Style/TrailingCommaInArrayLiteral:
+ Description: Prefer always trailing comma on multiline literals. This makes diffs,
+ and re-ordering nicer.
+ EnforcedStyleForMultiline: comma
+Style/SymbolArray:
+ Description: Using percent style obscures symbolic intent of array's contents.
+ EnforcedStyle: brackets
+RSpec/MessageSpies:
+ EnforcedStyle: receive
+Style/Documentation:
+ Exclude:
+ - lib/puppet/parser/functions/**/*
+ - spec/**/*
+Style/WordArray:
+ EnforcedStyle: brackets
+Performance/AncestorsInclude:
+ Enabled: true
+Performance/BigDecimalWithNumericArgument:
+ Enabled: true
+Performance/BlockGivenWithExplicitBlock:
+ Enabled: true
+Performance/CaseWhenSplat:
+ Enabled: true
+Performance/ConstantRegexp:
+ Enabled: true
+Performance/MethodObjectAsBlock:
+ Enabled: true
+Performance/RedundantSortBlock:
+ Enabled: true
+Performance/RedundantStringChars:
+ Enabled: true
+Performance/ReverseFirst:
+ Enabled: true
+Performance/SortReverse:
+ Enabled: true
+Performance/Squeeze:
+ Enabled: true
+Performance/StringInclude:
+ Enabled: true
+Performance/Sum:
+ Enabled: true
+Style/CollectionMethods:
+ Enabled: true
+Style/MethodCalledOnDoEndBlock:
+ Enabled: true
+Style/StringMethods:
+ Enabled: true
+Bundler/InsecureProtocolSource:
+ Enabled: false
+Gemspec/DuplicatedAssignment:
+ Enabled: false
+Gemspec/OrderedDependencies:
+ Enabled: false
+Gemspec/RequiredRubyVersion:
+ Enabled: false
+Gemspec/RubyVersionGlobalsUsage:
+ Enabled: false
+Layout/ArgumentAlignment:
+ Enabled: false
+Layout/BeginEndAlignment:
+ Enabled: false
+Layout/ClosingHeredocIndentation:
+ Enabled: false
+Layout/EmptyComment:
+ Enabled: false
+Layout/EmptyLineAfterGuardClause:
+ Enabled: false
+Layout/EmptyLinesAroundArguments:
+ Enabled: false
+Layout/EmptyLinesAroundAttributeAccessor:
+ Enabled: false
+Layout/EndOfLine:
+ Enabled: false
+Layout/FirstArgumentIndentation:
+ Enabled: false
+Layout/HashAlignment:
+ Enabled: false
+Layout/HeredocIndentation:
+ Enabled: false
+Layout/LeadingEmptyLines:
+ Enabled: false
+Layout/SpaceAroundMethodCallOperator:
+ Enabled: false
+Layout/SpaceInsideArrayLiteralBrackets:
+ Enabled: false
+Layout/SpaceInsideReferenceBrackets:
+ Enabled: false
+Lint/BigDecimalNew:
+ Enabled: false
+Lint/BooleanSymbol:
+ Enabled: false
+Lint/ConstantDefinitionInBlock:
+ Enabled: false
+Lint/DeprecatedOpenSSLConstant:
+ Enabled: false
+Lint/DisjunctiveAssignmentInConstructor:
+ Enabled: false
+Lint/DuplicateElsifCondition:
+ Enabled: false
+Lint/DuplicateRequire:
+ Enabled: false
+Lint/DuplicateRescueException:
+ Enabled: false
+Lint/EmptyConditionalBody:
+ Enabled: false
+Lint/EmptyFile:
+ Enabled: false
+Lint/ErbNewArguments:
+ Enabled: false
+Lint/FloatComparison:
+ Enabled: false
+Lint/HashCompareByIdentity:
+ Enabled: false
+Lint/IdentityComparison:
+ Enabled: false
+Lint/InterpolationCheck:
+ Enabled: false
+Lint/MissingCopEnableDirective:
+ Enabled: false
+Lint/MixedRegexpCaptureTypes:
+ Enabled: false
+Lint/NestedPercentLiteral:
+ Enabled: false
+Lint/NonDeterministicRequireOrder:
+ Enabled: false
+Lint/OrderedMagicComments:
+ Enabled: false
+Lint/OutOfRangeRegexpRef:
+ Enabled: false
+Lint/RaiseException:
+ Enabled: false
+Lint/RedundantCopEnableDirective:
+ Enabled: false
+Lint/RedundantRequireStatement:
+ Enabled: false
+Lint/RedundantSafeNavigation:
+ Enabled: false
+Lint/RedundantWithIndex:
+ Enabled: false
+Lint/RedundantWithObject:
+ Enabled: false
+Lint/RegexpAsCondition:
+ Enabled: false
+Lint/ReturnInVoidContext:
+ Enabled: false
+Lint/SafeNavigationConsistency:
+ Enabled: false
+Lint/SafeNavigationWithEmpty:
+ Enabled: false
+Lint/SelfAssignment:
+ Enabled: false
+Lint/SendWithMixinArgument:
+ Enabled: false
+Lint/ShadowedArgument:
+ Enabled: false
+Lint/StructNewOverride:
+ Enabled: false
+Lint/ToJSON:
+ Enabled: false
+Lint/TopLevelReturnWithArgument:
+ Enabled: false
+Lint/TrailingCommaInAttributeDeclaration:
+ Enabled: false
+Lint/UnreachableLoop:
+ Enabled: false
+Lint/UriEscapeUnescape:
+ Enabled: false
+Lint/UriRegexp:
+ Enabled: false
+Lint/UselessMethodDefinition:
+ Enabled: false
+Lint/UselessTimes:
+ Enabled: false
+Metrics/AbcSize:
+ Enabled: false
+Metrics/BlockLength:
+ Enabled: false
+Metrics/BlockNesting:
+ Enabled: false
+Metrics/ClassLength:
+ Enabled: false
+Metrics/CyclomaticComplexity:
+ Enabled: false
+Metrics/MethodLength:
+ Enabled: false
+Metrics/ModuleLength:
+ Enabled: false
+Metrics/ParameterLists:
+ Enabled: false
+Metrics/PerceivedComplexity:
+ Enabled: false
+Migration/DepartmentName:
+ Enabled: false
+Naming/AccessorMethodName:
+ Enabled: false
+Naming/BlockParameterName:
+ Enabled: false
+Naming/HeredocDelimiterCase:
+ Enabled: false
+Naming/HeredocDelimiterNaming:
+ Enabled: false
+Naming/MemoizedInstanceVariableName:
+ Enabled: false
+Naming/MethodParameterName:
+ Enabled: false
+Naming/RescuedExceptionsVariableName:
+ Enabled: false
+Naming/VariableNumber:
+ Enabled: false
+Performance/BindCall:
+ Enabled: false
+Performance/DeletePrefix:
+ Enabled: false
+Performance/DeleteSuffix:
+ Enabled: false
+Performance/InefficientHashSearch:
+ Enabled: false
+Performance/UnfreezeString:
+ Enabled: false
+Performance/UriDefaultParser:
+ Enabled: false
+RSpec/Be:
+ Enabled: false
+RSpec/Capybara/CurrentPathExpectation:
+ Enabled: false
+RSpec/Capybara/FeatureMethods:
+ Enabled: false
+RSpec/Capybara/VisibilityMatcher:
+ Enabled: false
+RSpec/ContextMethod:
+ Enabled: false
+RSpec/ContextWording:
+ Enabled: false
+RSpec/DescribeClass:
+ Enabled: false
+RSpec/EmptyHook:
+ Enabled: false
+RSpec/EmptyLineAfterExample:
+ Enabled: false
+RSpec/EmptyLineAfterExampleGroup:
+ Enabled: false
+RSpec/EmptyLineAfterHook:
+ Enabled: false
+RSpec/ExampleLength:
+ Enabled: false
+RSpec/ExampleWithoutDescription:
+ Enabled: false
+RSpec/ExpectChange:
+ Enabled: false
+RSpec/ExpectInHook:
+ Enabled: false
+RSpec/FactoryBot/AttributeDefinedStatically:
+ Enabled: false
+RSpec/FactoryBot/CreateList:
+ Enabled: false
+RSpec/FactoryBot/FactoryClassName:
+ Enabled: false
+RSpec/HooksBeforeExamples:
+ Enabled: false
+RSpec/ImplicitBlockExpectation:
+ Enabled: false
+RSpec/ImplicitSubject:
+ Enabled: false
+RSpec/LeakyConstantDeclaration:
+ Enabled: false
+RSpec/LetBeforeExamples:
+ Enabled: false
+RSpec/MissingExampleGroupArgument:
+ Enabled: false
+RSpec/MultipleExpectations:
+ Enabled: false
+RSpec/MultipleMemoizedHelpers:
+ Enabled: false
+RSpec/MultipleSubjects:
+ Enabled: false
+RSpec/NestedGroups:
+ Enabled: false
+RSpec/PredicateMatcher:
+ Enabled: false
+RSpec/ReceiveCounts:
+ Enabled: false
+RSpec/ReceiveNever:
+ Enabled: false
+RSpec/RepeatedExampleGroupBody:
+ Enabled: false
+RSpec/RepeatedExampleGroupDescription:
+ Enabled: false
+RSpec/RepeatedIncludeExample:
+ Enabled: false
+RSpec/ReturnFromStub:
+ Enabled: false
+RSpec/SharedExamples:
+ Enabled: false
+RSpec/StubbedMock:
+ Enabled: false
+RSpec/UnspecifiedException:
+ Enabled: false
+RSpec/VariableDefinition:
+ Enabled: false
+RSpec/VoidExpect:
+ Enabled: false
+RSpec/Yield:
+ Enabled: false
+Security/Open:
+ Enabled: false
+Style/AccessModifierDeclarations:
+ Enabled: false
+Style/AccessorGrouping:
+ Enabled: false
+Style/AsciiComments:
+ Enabled: false
+Style/BisectedAttrAccessor:
+ Enabled: false
+Style/CaseLikeIf:
+ Enabled: false
+Style/ClassEqualityComparison:
+ Enabled: false
+Style/ColonMethodDefinition:
+ Enabled: false
+Style/CombinableLoops:
+ Enabled: false
+Style/CommentedKeyword:
+ Enabled: false
+Style/Dir:
+ Enabled: false
+Style/DoubleCopDisableDirective:
+ Enabled: false
+Style/EmptyBlockParameter:
+ Enabled: false
+Style/EmptyLambdaParameter:
+ Enabled: false
+Style/Encoding:
+ Enabled: false
+Style/EvalWithLocation:
+ Enabled: false
+Style/ExpandPathArguments:
+ Enabled: false
+Style/ExplicitBlockArgument:
+ Enabled: false
+Style/ExponentialNotation:
+ Enabled: false
+Style/FloatDivision:
+ Enabled: false
+Style/FrozenStringLiteralComment:
+ Enabled: false
+Style/GlobalStdStream:
+ Enabled: false
+Style/HashAsLastArrayItem:
+ Enabled: false
+Style/HashLikeCase:
+ Enabled: false
+Style/HashTransformKeys:
+ Enabled: false
+Style/HashTransformValues:
+ Enabled: false
+Style/IfUnlessModifier:
+ Enabled: false
+Style/KeywordParametersOrder:
+ Enabled: false
+Style/MinMax:
+ Enabled: false
+Style/MixinUsage:
+ Enabled: false
+Style/MultilineWhenThen:
+ Enabled: false
+Style/NegatedUnless:
+ Enabled: false
+Style/NumericPredicate:
+ Enabled: false
+Style/OptionalBooleanParameter:
+ Enabled: false
+Style/OrAssignment:
+ Enabled: false
+Style/RandomWithOffset:
+ Enabled: false
+Style/RedundantAssignment:
+ Enabled: false
+Style/RedundantCondition:
+ Enabled: false
+Style/RedundantConditional:
+ Enabled: false
+Style/RedundantFetchBlock:
+ Enabled: false
+Style/RedundantFileExtensionInRequire:
+ Enabled: false
+Style/RedundantRegexpCharacterClass:
+ Enabled: false
+Style/RedundantRegexpEscape:
+ Enabled: false
+Style/RedundantSelfAssignment:
+ Enabled: false
+Style/RedundantSort:
+ Enabled: false
+Style/RescueStandardError:
+ Enabled: false
+Style/SingleArgumentDig:
+ Enabled: false
+Style/SlicingWithRange:
+ Enabled: false
+Style/SoleNestedConditional:
+ Enabled: false
+Style/StderrPuts:
+ Enabled: false
+Style/StringConcatenation:
+ Enabled: false
+Style/Strip:
+ Enabled: false
+Style/SymbolProc:
+ Enabled: false
+Style/TrailingBodyOnClass:
+ Enabled: false
+Style/TrailingBodyOnMethodDefinition:
+ Enabled: false
+Style/TrailingBodyOnModule:
+ Enabled: false
+Style/TrailingCommaInHashLiteral:
+ Enabled: false
+Style/TrailingMethodEndStatement:
+ Enabled: false
+Style/UnpackFirst:
+ Enabled: false
+Lint/DuplicateBranch:
+ Enabled: false
+Lint/DuplicateRegexpCharacterClassElement:
+ Enabled: false
+Lint/EmptyBlock:
+ Enabled: false
+Lint/EmptyClass:
+ Enabled: false
+Lint/NoReturnInBeginEndBlocks:
+ Enabled: false
+Lint/ToEnumArguments:
+ Enabled: false
+Lint/UnexpectedBlockArity:
+ Enabled: false
+Lint/UnmodifiedReduceAccumulator:
+ Enabled: false
+Performance/CollectionLiteralInLoop:
+ Enabled: false
+Style/ArgumentsForwarding:
+ Enabled: false
+Style/CollectionCompact:
+ Enabled: false
+Style/DocumentDynamicEvalDefinition:
+ Enabled: false
+Style/NegatedIfElseCondition:
+ Enabled: false
+Style/NilLambda:
+ Enabled: false
+Style/RedundantArgument:
+ Enabled: false
+Style/SwapValues:
+ Enabled: false
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..fc28658
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,63 @@
+source ENV['GEM_SOURCE'] || 'https://rubygems.org'
+
+def location_for(place_or_version, fake_version = nil)
+ git_url_regex = %r{\A(?<url>(https?|git)[:@][^#]*)(#(?<branch>.*))?}
+ file_url_regex = %r{\Afile:\/\/(?<path>.*)}
+
+ if place_or_version && (git_url = place_or_version.match(git_url_regex))
+ [fake_version, { git: git_url[:url], branch: git_url[:branch], require: false }].compact
+ elsif place_or_version && (file_url = place_or_version.match(file_url_regex))
+ ['>= 0', { path: File.expand_path(file_url[:path]), require: false }]
+ else
+ [place_or_version, { require: false }]
+ end
+end
+
+ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments
+minor_version = ruby_version_segments[0..1].join('.')
+
+group :development do
+ gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "json", '= 2.3.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 2.8.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
+ gem "puppet-module-posix-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-posix-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-win-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
+ gem "puppet-module-win-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
+ gem "voxpupuli-puppet-lint-plugins", '>= 3.0', require: false
+end
+group :system_tests do
+ gem "puppet-module-posix-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
+ gem "puppet-module-win-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw]
+end
+
+puppet_version = ENV['PUPPET_GEM_VERSION']
+facter_version = ENV['FACTER_GEM_VERSION']
+hiera_version = ENV['HIERA_GEM_VERSION']
+
+gems = {}
+
+gems['puppet'] = location_for(puppet_version)
+
+# If facter or hiera versions have been specified via the environment
+# variables
+
+gems['facter'] = location_for(facter_version) if facter_version
+gems['hiera'] = location_for(hiera_version) if hiera_version
+
+gems.each do |gem_name, gem_params|
+ gem gem_name, *gem_params
+end
+
+# Evaluate Gemfile.local and ~/.gemfile if they exist
+extra_gemfiles = [
+ "#{__FILE__}.local",
+ File.join(Dir.home, '.gemfile'),
+]
+
+extra_gemfiles.each do |gemfile|
+ if File.file?(gemfile) && File.readable?(gemfile)
+ eval(File.read(gemfile), binding)
+ end
+end
+# vim: syntax=ruby
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..e9e1ffd
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,511 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (2.3.6)
+ addressable (2.8.0)
+ public_suffix (>= 2.0.2, < 5.0)
+ ansi (1.5.0)
+ ast (2.4.2)
+ awesome_print (1.9.2)
+ aws-eventstream (1.2.0)
+ aws-partitions (1.591.0)
+ aws-sdk-core (3.131.1)
+ aws-eventstream (~> 1, >= 1.0.2)
+ aws-partitions (~> 1, >= 1.525.0)
+ aws-sigv4 (~> 1.1)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-ec2 (1.316.0)
+ aws-sdk-core (~> 3, >= 3.127.0)
+ aws-sigv4 (~> 1.1)
+ aws-sigv4 (1.5.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ bcrypt_pbkdf (1.1.0)
+ bindata (2.4.10)
+ bolt (3.22.1)
+ CFPropertyList (~> 2.2)
+ addressable (~> 2.5)
+ aws-sdk-ec2 (~> 1)
+ concurrent-ruby (~> 1.0)
+ ffi (>= 1.9.25, < 2.0.0)
+ hiera-eyaml (~> 3)
+ jwt (~> 2.2)
+ logging (~> 2.2)
+ minitar (~> 0.6)
+ net-scp (~> 1.2)
+ net-ssh (>= 4.0)
+ net-ssh-krb (~> 0.5)
+ orchestrator_client (~> 0.5)
+ puppet (>= 6.18.0)
+ puppet-resource_api (>= 1.8.1)
+ puppet-strings (~> 2.3)
+ puppetfile-resolver (~> 0.5)
+ r10k (~> 3.10)
+ ruby_smb (~> 1.0)
+ terminal-table (~> 3.0)
+ winrm (~> 2.0)
+ winrm-fs (~> 1.3)
+ builder (3.2.4)
+ codecov (0.6.0)
+ simplecov (>= 0.15, < 0.22)
+ coderay (1.1.3)
+ colored2 (3.1.2)
+ concurrent-ruby (1.1.10)
+ connection_pool (2.2.5)
+ cri (2.15.11)
+ deep_merge (1.2.2)
+ dependency_checker (0.3.0)
+ parallel
+ puppet_forge (>= 2.2, < 4.0)
+ rake (~> 13.0)
+ semantic_puppet (~> 1.0)
+ diff-lcs (1.5.0)
+ docile (1.4.0)
+ docker-api (2.2.0)
+ excon (>= 0.47.0)
+ multi_json
+ domain_name (0.5.20190701)
+ unf (>= 0.0.5, < 1.0.0)
+ ed25519 (1.3.0)
+ erubi (1.10.0)
+ excon (0.92.3)
+ facter (4.2.9)
+ hocon (~> 1.3)
+ thor (>= 1.0.1, < 2.0)
+ facterdb (1.16.1)
+ facter (< 5.0.0)
+ jgrep
+ faraday (1.10.0)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.3)
+ multipart-post (>= 1.2, < 3)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fast_gettext (1.1.2)
+ ffi (1.15.5)
+ ffi-compiler (1.0.1)
+ ffi (>= 1.0.0)
+ rake
+ forwardable (1.3.2)
+ gettext (3.4.3)
+ erubi
+ locale (>= 2.0.5)
+ prime
+ text (>= 1.3.0)
+ gettext-setup (0.31)
+ fast_gettext (~> 1.1.0)
+ gettext (>= 3.0.2)
+ locale
+ gssapi (1.3.1)
+ ffi (>= 1.0.1)
+ gyoku (1.4.0)
+ builder (>= 2.1.2)
+ rexml (~> 3.0)
+ hiera (3.9.0)
+ hiera-eyaml (3.3.0)
+ highline
+ optimist
+ highline (2.0.3)
+ hirb (0.7.3)
+ hocon (1.3.1)
+ honeycomb-beeline (2.10.0)
+ libhoney (>= 1.14.2)
+ http (5.0.4)
+ addressable (~> 2.8)
+ http-cookie (~> 1.0)
+ http-form_data (~> 2.2)
+ llhttp-ffi (~> 0.4.0)
+ http-accept (1.7.0)
+ http-cookie (1.0.4)
+ domain_name (~> 0.5)
+ http-form_data (2.3.0)
+ httpclient (2.8.3)
+ jgrep (1.5.4)
+ jmespath (1.6.1)
+ json (2.3.0)
+ json-schema (3.0.0)
+ addressable (>= 2.8)
+ jwt (2.2.3)
+ libhoney (2.2.0)
+ addressable (~> 2.0)
+ excon
+ http (>= 2.0, < 6.0)
+ little-plugger (1.1.4)
+ llhttp-ffi (0.4.0)
+ ffi-compiler (~> 1.0)
+ rake (~> 13.0)
+ locale (2.1.3)
+ log4r (1.1.10)
+ logging (2.3.1)
+ little-plugger (~> 1.1)
+ multi_json (~> 1.14)
+ metaclass (0.0.4)
+ metadata-json-lint (3.0.2)
+ json-schema (>= 2.8, < 4.0)
+ spdx-licenses (~> 1.0)
+ method_source (1.0.0)
+ mime-types (3.4.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2022.0105)
+ minitar (0.9)
+ mocha (1.1.0)
+ metaclass (~> 0.0.1)
+ molinillo (0.8.0)
+ multi_json (1.15.0)
+ multipart-post (2.1.1)
+ net-http-persistent (4.0.1)
+ connection_pool (~> 2.2)
+ net-scp (1.2.1)
+ net-ssh (>= 2.6.5)
+ net-ssh (6.1.0)
+ net-ssh-krb (0.5.1)
+ gssapi (~> 1.3.0)
+ net-ssh (>= 2.0)
+ net-telnet (0.1.1)
+ netrc (0.11.0)
+ nori (2.6.0)
+ optimist (3.0.1)
+ orchestrator_client (0.5.3)
+ faraday
+ net-http-persistent
+ parallel (1.22.1)
+ parallel_tests (3.10.1)
+ parallel
+ parser (3.1.2.0)
+ ast (~> 2.4.1)
+ pathspec (1.0.0)
+ pluginator (1.5.0)
+ prime (0.1.2)
+ forwardable
+ singleton
+ pry (0.14.1)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ public_suffix (4.0.7)
+ puppet (7.16.0)
+ concurrent-ruby (~> 1.0)
+ deep_merge (~> 1.0)
+ facter (> 2.0.1, < 5)
+ fast_gettext (>= 1.1, < 3)
+ hiera (>= 3.2.1, < 4)
+ locale (~> 2.1)
+ multi_json (~> 1.10)
+ puppet-resource_api (~> 1.5)
+ scanf (~> 1.0)
+ semantic_puppet (~> 1.0)
+ puppet-blacksmith (6.1.1)
+ puppet-modulebuilder (~> 0.2)
+ rest-client (~> 2.0)
+ puppet-debugger (1.2.0)
+ awesome_print (~> 1.7)
+ bundler
+ facterdb (>= 0.4.0)
+ pluginator (~> 1.5.0)
+ puppet (>= 5.5)
+ rb-readline (>= 0.5.5)
+ table_print (>= 1.0.0)
+ tty-pager (~> 0.13.0)
+ puppet-lint (2.5.2)
+ puppet-lint-absolute_classname-check (3.0.1)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-anchor-check (1.0.1)
+ puppet-lint (>= 1.1, < 3.0)
+ puppet-lint-classes_and_types_beginning_with_digits-check (1.0.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-file_ensure-check (1.0.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-leading_zero-check (1.0.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-legacy_facts-check (1.0.4)
+ puppet-lint (~> 2.4)
+ puppet-lint-lookup_in_parameter-check (1.0.0)
+ puppet-lint (~> 2.0)
+ puppet-lint-manifest_whitespace-check (0.1.17)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-optional_default-check (1.0.0)
+ puppet-lint (>= 2.1, < 3.0)
+ puppet-lint-param-docs (1.7.5)
+ puppet-lint (>= 1.1, < 3.0)
+ puppet-lint-param-types (0.0.1)
+ puppet-lint (>= 1.1, < 3.0)
+ puppet-lint-params_empty_string-check (1.0.0)
+ puppet-lint (~> 2.5)
+ puppet-lint-resource_reference_syntax (1.1.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-strict_indent-check (2.0.8)
+ puppet-lint (> 1.0)
+ puppet-lint-top_scope_facts-check (1.0.1)
+ puppet-lint (~> 2.0)
+ puppet-lint-topscope-variable-check (1.0.1)
+ puppet-lint (~> 2.0)
+ puppet-lint-trailing_comma-check (0.4.2)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-unquoted_string-check (2.1.0)
+ puppet-lint (>= 2.1, < 3.0)
+ puppet-lint-variable_contains_upcase (1.2.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-lint-version_comparison-check (1.0.0)
+ puppet-lint (>= 1.0, < 3.0)
+ puppet-module-posix-default-r2.7 (1.1.1)
+ puppet-module-posix-dev-r2.7 (1.1.1)
+ bcrypt_pbkdf (~> 1.0)
+ codecov (~> 0.2)
+ concurrent-ruby (!= 1.1.6)
+ dependency_checker (~> 0.2)
+ ed25519 (~> 1.2)
+ facterdb (>= 0.8.1, < 2.0.0)
+ metadata-json-lint (>= 2.0.2, < 4.0.0)
+ mocha (>= 1.0.0, < 1.2.0)
+ parallel_tests (~> 3.4)
+ pry (~> 0.10)
+ puppet-blacksmith (~> 6.0)
+ puppet-debugger (~> 1.0)
+ puppet-lint (>= 2.3.0, < 3.0.0)
+ puppet-resource_api (~> 1.8)
+ puppet-strings (~> 2.0)
+ puppet-syntax (~> 3.0)
+ puppetlabs_spec_helper (>= 2.9.0, < 4.0.0)
+ rainbow (~> 2.0)
+ rspec-puppet (>= 2.3.2, < 3.0.0)
+ rspec-puppet-facts (>= 1.10.0, < 3)
+ rspec_junit_formatter (~> 0.2)
+ rubocop (= 1.6.1)
+ rubocop-performance (= 1.9.1)
+ rubocop-rspec (= 2.0.1)
+ serverspec (~> 2.41)
+ simplecov (< 0.19.0)
+ simplecov-console (~> 0.4.2)
+ specinfra (= 2.82.2)
+ puppet-module-posix-system-r2.7 (1.1.1)
+ puppet_litmus (~> 0.20)
+ puppet-modulebuilder (0.3.0)
+ minitar (~> 0.9)
+ pathspec (>= 0.2.1, < 2.0.0)
+ puppet-resource_api (1.8.14)
+ hocon (>= 1.0)
+ puppet-strings (2.9.0)
+ rgen
+ yard (~> 0.9.5)
+ puppet-syntax (3.2.1)
+ puppet (>= 5)
+ rake
+ puppet_forge (3.2.0)
+ faraday (~> 1.3)
+ faraday_middleware (~> 1.0)
+ minitar
+ semantic_puppet (~> 1.0)
+ puppet_litmus (0.33.2)
+ bolt (>= 2.0.1, < 4.0.0)
+ docker-api (>= 1.34, < 3.0.0)
+ honeycomb-beeline
+ parallel
+ puppet-modulebuilder (>= 0.2.1, < 1.0.0)
+ retryable (~> 3.0)
+ rspec
+ rspec_honeycomb_formatter
+ tty-spinner (>= 0.5.0, < 1.0.0)
+ puppetfile-resolver (0.5.0)
+ molinillo (~> 0.6)
+ semantic_puppet (~> 1.0)
+ puppetlabs_spec_helper (3.0.0)
+ mocha (~> 1.0)
+ pathspec (>= 0.2.1, < 1.1.0)
+ puppet-lint (~> 2.0)
+ puppet-syntax (>= 2.0, < 4)
+ rspec-puppet (~> 2.0)
+ r10k (3.15.0)
+ colored2 (= 3.1.2)
+ cri (>= 2.15.10)
+ fast_gettext (>= 1.1.0, < 3.0.0)
+ gettext (>= 3.0.2, < 4.0.0)
+ gettext-setup (~> 0.24)
+ jwt (~> 2.2.3)
+ log4r (= 1.1.10)
+ minitar (~> 0.9)
+ multi_json (~> 1.10)
+ puppet_forge (>= 2.3.0)
+ rainbow (2.2.2)
+ rake
+ rake (13.0.6)
+ rb-readline (0.5.5)
+ regexp_parser (2.4.0)
+ rest-client (2.1.0)
+ http-accept (>= 1.7.0, < 2.0)
+ http-cookie (>= 1.0.2, < 2.0)
+ mime-types (>= 1.16, < 4.0)
+ netrc (~> 0.8)
+ retryable (3.0.5)
+ rexml (3.2.5)
+ rgen (0.9.0)
+ rspec (3.11.0)
+ rspec-core (~> 3.11.0)
+ rspec-expectations (~> 3.11.0)
+ rspec-mocks (~> 3.11.0)
+ rspec-core (3.11.0)
+ rspec-support (~> 3.11.0)
+ rspec-expectations (3.11.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-its (1.3.0)
+ rspec-core (>= 3.0.0)
+ rspec-expectations (>= 3.0.0)
+ rspec-mocks (3.11.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.11.0)
+ rspec-puppet (2.11.1)
+ rspec
+ rspec-puppet-facts (2.0.5)
+ facter
+ facterdb (>= 0.5.0)
+ puppet
+ rspec-support (3.11.0)
+ rspec_honeycomb_formatter (0.2.1)
+ honeycomb-beeline
+ rspec-core (~> 3.0)
+ rspec_junit_formatter (0.5.1)
+ rspec-core (>= 2, < 4, != 2.12.0)
+ rubocop (1.6.1)
+ parallel (~> 1.10)
+ parser (>= 2.7.1.5)
+ rainbow (>= 2.2.2, < 4.0)
+ regexp_parser (>= 1.8, < 3.0)
+ rexml
+ rubocop-ast (>= 1.2.0, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 1.4.0, < 2.0)
+ rubocop-ast (1.18.0)
+ parser (>= 3.1.1.0)
+ rubocop-performance (1.9.1)
+ rubocop (>= 0.90.0, < 2.0)
+ rubocop-ast (>= 0.4.0)
+ rubocop-rspec (2.0.1)
+ rubocop (~> 1.0)
+ rubocop-ast (>= 1.1.0)
+ ruby-progressbar (1.11.0)
+ ruby2_keywords (0.0.5)
+ ruby_smb (1.1.0)
+ bindata
+ rubyntlm
+ windows_error
+ rubyntlm (0.6.3)
+ rubyzip (2.3.2)
+ scanf (1.0.0)
+ semantic_puppet (1.0.4)
+ serverspec (2.42.0)
+ multi_json
+ rspec (~> 3.0)
+ rspec-its
+ specinfra (~> 2.72)
+ sfl (2.3)
+ simplecov (0.18.5)
+ docile (~> 1.1)
+ simplecov-html (~> 0.11)
+ simplecov-console (0.4.2)
+ ansi
+ hirb
+ simplecov
+ simplecov-html (0.12.3)
+ singleton (0.1.1)
+ spdx-licenses (1.3.0)
+ specinfra (2.82.2)
+ net-scp
+ net-ssh (>= 2.7)
+ net-telnet (= 0.1.1)
+ sfl
+ strings (0.1.8)
+ strings-ansi (~> 0.1)
+ unicode-display_width (~> 1.5)
+ unicode_utils (~> 1.4)
+ strings-ansi (0.2.0)
+ table_print (1.5.7)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ text (1.3.1)
+ thor (1.2.1)
+ tty-cursor (0.7.1)
+ tty-pager (0.13.0)
+ strings (~> 0.1.8)
+ tty-screen (~> 0.8)
+ tty-screen (0.8.1)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.8.1)
+ unicode-display_width (1.8.0)
+ unicode_utils (1.4.0)
+ voxpupuli-puppet-lint-plugins (3.0.0)
+ puppet-lint (>= 2.5.0)
+ puppet-lint-absolute_classname-check (>= 2.0.0)
+ puppet-lint-anchor-check
+ puppet-lint-classes_and_types_beginning_with_digits-check
+ puppet-lint-file_ensure-check
+ puppet-lint-leading_zero-check
+ puppet-lint-legacy_facts-check
+ puppet-lint-lookup_in_parameter-check
+ puppet-lint-manifest_whitespace-check
+ puppet-lint-optional_default-check
+ puppet-lint-param-docs
+ puppet-lint-param-types
+ puppet-lint-params_empty_string-check
+ puppet-lint-resource_reference_syntax
+ puppet-lint-strict_indent-check
+ puppet-lint-top_scope_facts-check
+ puppet-lint-topscope-variable-check
+ puppet-lint-trailing_comma-check
+ puppet-lint-unquoted_string-check
+ puppet-lint-variable_contains_upcase
+ puppet-lint-version_comparison-check
+ webrick (1.7.0)
+ windows_error (0.1.4)
+ winrm (2.3.6)
+ builder (>= 2.1.2)
+ erubi (~> 1.8)
+ gssapi (~> 1.2)
+ gyoku (~> 1.0)
+ httpclient (~> 2.2, >= 2.2.0.2)
+ logging (>= 1.6.1, < 3.0)
+ nori (~> 2.0)
+ rubyntlm (~> 0.6.0, >= 0.6.3)
+ winrm-fs (1.3.5)
+ erubi (~> 1.8)
+ logging (>= 1.6.1, < 3.0)
+ rubyzip (~> 2.0)
+ winrm (~> 2.0)
+ yard (0.9.27)
+ webrick (~> 1.7.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ json (= 2.3.0)
+ puppet (= 7.16.0)
+ puppet-module-posix-default-r2.7 (~> 1.0)
+ puppet-module-posix-dev-r2.7 (~> 1.0)
+ puppet-module-posix-system-r2.7 (~> 1.0)
+ puppet-module-win-default-r2.7 (~> 1.0)
+ puppet-module-win-dev-r2.7 (~> 1.0)
+ puppet-module-win-system-r2.7 (~> 1.0)
+ voxpupuli-puppet-lint-plugins (>= 3.0)
+
+BUNDLED WITH
+ 2.1.4
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5952332
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2023 Hugo Hörnquist
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/files/gunicorn@.service b/files/gunicorn@.service
new file mode 100644
index 0000000..5d85bb4
--- /dev/null
+++ b/files/gunicorn@.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=%s through the Gunicorn WSGI server
+After=network.target
+
+[Service]
+# User and group not set since they are simpler to configure in the
+# config file
+Type=simple
+PrivateDevices=yes
+PrivateTmp=true
+ExecStart=gunicorn --config /var/lib/gunicorn/%s.conf.py
+ExecReload=/bin/kill -s HUP $MAINPID
+
+[Install]
+WantedBy=multi-user.target
diff --git a/manifests/instance.pp b/manifests/instance.pp
new file mode 100644
index 0000000..0cd72bc
--- /dev/null
+++ b/manifests/instance.pp
@@ -0,0 +1,38 @@
+# @summary Sets up a single gunicorn instance
+#
+# @param app
+# Name of the app, probably something like "wsgi_module:app"
+# @param address
+# Address to bind Gunicorn to
+# @param instance_name
+# Name for this instance
+# @param workers
+# Workers used by this gunicorn instance. `$cpu_count * 2 + 1` is
+# copied from the Gunicorn manual.
+# @param user
+# User to run this instance as.
+# @param group
+# Group to run this instance as.
+define gunicorn::instance (
+ String $app,
+ String $address,
+ String $instance_name = $name,
+ Integer $workers = $facts['processor']['count'] * 2 + 1,
+ Variant[String, Integer] $user = $gunicorn::setup::user,
+ Variant[String, Integer] $group = $gunicorn::setup::group,
+) {
+ $options = {
+ 'proc_name' => $instance_name,
+ 'wsgi_app' => $app,
+ }
+
+ file { "${gunicorn::setup::instance_dir}/${instance_name}.conf.pp":
+ content => epp("${module_name}/gunicorn.conf.py.epp", $options),
+ validate_cmd => 'gunicorn --check-config',
+ }
+
+ service { "gunicorn@${instance_name}":
+ ensure => running,
+ enable => true,
+ }
+}
diff --git a/manifests/setup.pp b/manifests/setup.pp
new file mode 100644
index 0000000..aebfe46
--- /dev/null
+++ b/manifests/setup.pp
@@ -0,0 +1,34 @@
+# @summary General configuration of gunicorn
+#
+# @param package_name
+# Name of system package
+# @param instance_dir
+# Where instance configuration files should be plced
+# Should currently not be changed, since it's hard-coded in the
+# service file.
+# @param user
+# Default user to use for each instance.
+# @param group
+# Default group to use for each instance.
+class gunicorn::setup (
+ String $package_name = 'gunicorn',
+ String $instance_dir = '/var/lib/gunicorn',
+ Variant[String, Integer] $user = 'gunicorn',
+ Variant[String, Integer] $group = 'gunicorn',
+) {
+ ensure_packages([
+ $package_name,
+ ])
+
+ # python-setproctitle
+
+ file { $instance_dir:
+ ensure => directory,
+ }
+
+ systemd::unit_file { 'gunicorn@.service':
+ source => "puppet:///modules/${module_name}/gunicorn@.service",
+ enable => false,
+ active => false,
+ }
+}
diff --git a/metadata.json b/metadata.json
new file mode 100644
index 0000000..f7a0453
--- /dev/null
+++ b/metadata.json
@@ -0,0 +1,22 @@
+{
+ "name": "HugoNikanor-gunicorn",
+ "version": "0.1.0",
+ "author": "Hugo Hörnquist",
+ "license": "Apache-2.0",
+ "summary": "Configures Gunicorn instances",
+ "source": "https://git.hornquist.se/puppet/gunicorn",
+ "dependencies": [
+ {
+ "name": "puppetlabs/stdlib",
+ "version_requirement": ">= 8.1.0 < 9.0.0"
+ }
+ ],
+ "operatingsystem_support": [
+ {
+ "operatingsystem": "Archlinux"
+ }
+ ],
+ "pdk-version": "2.5.0",
+ "template-url": "pdk-default#2.5.0",
+ "template-ref": "tags/2.5.0-0-g369d483"
+}
diff --git a/pdk.yaml b/pdk.yaml
new file mode 100644
index 0000000..4bef4bd
--- /dev/null
+++ b/pdk.yaml
@@ -0,0 +1,2 @@
+---
+ignore: []
diff --git a/templates/gunicorn.conf.py.epp b/templates/gunicorn.conf.py.epp
new file mode 100644
index 0000000..f9b443d
--- /dev/null
+++ b/templates/gunicorn.conf.py.epp
@@ -0,0 +1,18 @@
+<%- | String $address,
+ String $proc_name,
+ Integer $workers,
+ String $wsgi_app,
+ Variant[String, Integer] $user,
+ Variant[String, Integer] $group,
+| -%>
+
+bind = "<%= $address %>"
+proc_name = "<%= $proc_name %>"
+workers = "<%= $workers %>"
+
+wsgi_app = "<%= $wsgi_app %>"
+
+user = <% if $user =~ String { -%>"<%= $user %>"
+<%- } else { -%><%= $user %><%- } %>
+group = <% if $group =~ String { -%>"<%= $group %>"
+<%- } else { -%><%= $group %><%- } -%>