diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7580987..27afb15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,14 +17,13 @@ on: jobs: unit: runs-on: ubuntu-latest - needs: rubocop strategy: matrix: ruby: - - "2.6" - - "2.7" - "3.0" - "3.1" + - "3.2" + - "3.3" name: Ruby ${{ matrix.ruby }} steps: - uses: actions/checkout@v3 diff --git a/.plugin.yaml b/.plugin.yaml deleted file mode 100644 index 4e6262a..0000000 --- a/.plugin.yaml +++ /dev/null @@ -1,6 +0,0 @@ -mcollective_agent_service::policies: - - action: "allow" - callers: "*" - actions: "status" - facts: "*" - classes: "*" diff --git a/Gemfile b/Gemfile index 9f95c64..3bec66c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,11 +1,17 @@ -#!ruby +# Managed by modulesync - DO NOT EDIT +# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/ + source "https://rubygems.org" group :test do - gem "rake" - gem "rspec" - gem "mocha" - gem "mcollective-test" + gem "mcollective-test", :require => false + gem "mocha", :require => false + gem "rake", :require => false + gem "rspec", :require => false +end + +group :release do + gem "voxpupuli-release", "~> 3.0", :require => false end mcollective_version = ENV["MCOLLECTIVE_GEM_VERSION"] diff --git a/README.md b/README.md index 49387f9..4f6b45d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,14 @@ The service agent that lets you stop, start, restart and query the statuses of s This agent can be extended to support different Service managers, by default it uses Puppet. See the section later in this document about extendibility. - +## Actions + +This agent provides the following actions, for details about each please run `mco plugin doc agent/service` + + * **restart** - Restart a service + * **start** - Start a service + * **status** - Gets the status of a service + * **stop** - Stop a service ## Installation diff --git a/Rakefile b/Rakefile index a14537f..5df9f5c 100644 --- a/Rakefile +++ b/Rakefile @@ -81,3 +81,11 @@ desc "Builds the module found in the current directory, run build_prep first" task :build do sh "/opt/puppetlabs/puppet/bin/mco plugin package --format aiomodulepackage --vendor choria" end + +# load optional tasks for releases +# only available if gem group releases is installed +begin + require "voxpupuli/release/rake_tasks" +rescue LoadError + # voxpupuli-release not present +end diff --git a/data/defaults.yaml b/data/defaults.yaml new file mode 100644 index 0000000..b43e021 --- /dev/null +++ b/data/defaults.yaml @@ -0,0 +1,16 @@ +lookup_options: + mcollective_agent_service::gem_dependencies: + merge: + strategy: deep + mcollective_agent_service::package_dependencies: + merge: + strategy: deep + mcollective_agent_service::config: + merge: + strategy: deep + mcollective_agent_service::client_config: + merge: + strategy: deep + mcollective_agent_service::server_config: + merge: + strategy: deep diff --git a/data/plugin.yaml b/data/plugin.yaml new file mode 100644 index 0000000..eceb25f --- /dev/null +++ b/data/plugin.yaml @@ -0,0 +1,27 @@ +--- +mcollective_agent_service::config_name: service +mcollective_agent_service::common_files: +- data/service_data.rb +- data/service_data.ddl +- util/service/base.rb +- util/service/puppetservice.rb +- util/service/serviceservice.rb +- validator/service_name.rb +- validator/service_name.ddl +- agent/service.ddl +- agent/service.json +mcollective_agent_service::executable_files: [] +mcollective_agent_service::common_directories: +- util/service +mcollective_agent_service::server_files: +- agent/service.rb +mcollective_agent_service::server_directories: [] +mcollective_agent_service::client_files: +- application/service.rb +mcollective_agent_service::client_directories: [] +mcollective_agent_service::policies: +- action: allow + callers: "*" + actions: status + facts: "*" + classes: "*" diff --git a/agent/service.ddl b/files/mcollective/agent/service.ddl similarity index 100% rename from agent/service.ddl rename to files/mcollective/agent/service.ddl diff --git a/files/mcollective/agent/service.json b/files/mcollective/agent/service.json new file mode 100644 index 0000000..4303078 --- /dev/null +++ b/files/mcollective/agent/service.json @@ -0,0 +1,138 @@ +{ + "$schema": "https://choria.io/schemas/mcorpc/ddl/v1/agent.json", + "metadata": { + "name": "service", + "description": "Manages Operating System Services", + "author": "R.I.Pienaar ", + "license": "Apache-2.0", + "version": "4.0.1", + "url": "https://github.com/choria-plugins/service-agent", + "timeout": 60 + }, + "actions": [ + { + "action": "restart", + "input": { + "service": { + "prompt": "Service Name", + "description": "The service to restart", + "type": "string", + "default": null, + "optional": false, + "validation": "service_name", + "maxlength": 90 + } + }, + "output": { + "status": { + "description": "The status of the service after restarting", + "display_as": "Service Status", + "default": "unknown" + } + }, + "display": "failed", + "description": "Restart a service", + "aggregate": [ + { + "function": "summary", + "args": [ + "status" + ] + } + ] + }, + { + "action": "start", + "input": { + "service": { + "prompt": "Service Name", + "description": "The service to start", + "type": "string", + "default": null, + "optional": false, + "validation": "service_name", + "maxlength": 90 + } + }, + "output": { + "status": { + "description": "The status of the service after starting", + "display_as": "Service Status", + "default": "unknown" + } + }, + "display": "failed", + "description": "Start a service", + "aggregate": [ + { + "function": "summary", + "args": [ + "status" + ] + } + ] + }, + { + "action": "status", + "input": { + "service": { + "prompt": "Service Name", + "description": "The service to get the status for", + "type": "string", + "default": null, + "optional": false, + "validation": "service_name", + "maxlength": 90 + } + }, + "output": { + "status": { + "description": "The status of the service", + "display_as": "Service Status", + "default": "unknown" + } + }, + "display": "always", + "description": "Gets the status of a service", + "aggregate": [ + { + "function": "summary", + "args": [ + "status" + ] + } + ] + }, + { + "action": "stop", + "input": { + "service": { + "prompt": "Service Name", + "description": "The service to stop", + "type": "string", + "default": null, + "optional": false, + "validation": "service_name", + "maxlength": 90 + } + }, + "output": { + "status": { + "description": "The status of the service after stopping", + "display_as": "Service Status", + "default": "unknown" + } + }, + "display": "failed", + "description": "Stop a service", + "aggregate": [ + { + "function": "summary", + "args": [ + "status" + ] + } + ] + } + ] +} diff --git a/agent/service.rb b/files/mcollective/agent/service.rb similarity index 100% rename from agent/service.rb rename to files/mcollective/agent/service.rb diff --git a/application/service.rb b/files/mcollective/application/service.rb similarity index 100% rename from application/service.rb rename to files/mcollective/application/service.rb diff --git a/data/service_data.ddl b/files/mcollective/data/service_data.ddl similarity index 100% rename from data/service_data.ddl rename to files/mcollective/data/service_data.ddl diff --git a/data/service_data.rb b/files/mcollective/data/service_data.rb similarity index 100% rename from data/service_data.rb rename to files/mcollective/data/service_data.rb diff --git a/util/service/base.rb b/files/mcollective/util/service/base.rb similarity index 100% rename from util/service/base.rb rename to files/mcollective/util/service/base.rb diff --git a/util/service/puppetservice.rb b/files/mcollective/util/service/puppetservice.rb similarity index 100% rename from util/service/puppetservice.rb rename to files/mcollective/util/service/puppetservice.rb diff --git a/util/service/serviceservice.rb b/files/mcollective/util/service/serviceservice.rb similarity index 100% rename from util/service/serviceservice.rb rename to files/mcollective/util/service/serviceservice.rb diff --git a/validator/service_name.ddl b/files/mcollective/validator/service_name.ddl similarity index 100% rename from validator/service_name.ddl rename to files/mcollective/validator/service_name.ddl diff --git a/validator/service_name.rb b/files/mcollective/validator/service_name.rb similarity index 100% rename from validator/service_name.rb rename to files/mcollective/validator/service_name.rb diff --git a/hiera.yaml b/hiera.yaml new file mode 100644 index 0000000..0619108 --- /dev/null +++ b/hiera.yaml @@ -0,0 +1,12 @@ +--- +version: 5 + +defaults: + datadir: "data" + data_hash: yaml_data + +hierarchy: + - name: "plugin" + path: "plugin.yaml" + - name: "defaults" + path: "defaults.yaml" diff --git a/manifests/init.pp b/manifests/init.pp new file mode 100644 index 0000000..667ced7 --- /dev/null +++ b/manifests/init.pp @@ -0,0 +1,48 @@ +class mcollective_agent_service ( + String $config_name, + Array[String] $client_files = [], + Array[String] $client_directories = [], + Array[String] $server_files = [], + Array[String] $server_directories = [], + Array[String] $common_files = [], + Array[String] $common_directories = [], + Array[String] $executable_files = [], + Boolean $manage_gem_dependencies = true, + Hash $gem_dependencies = {}, + Boolean $manage_package_dependencies = true, + Hash $package_dependencies = {}, + Boolean $manage_class_dependencies = true, + Array[String] $class_dependencies = [], + Mcollective::Policy_action $policy_default = $mcollective::policy_default, + Array[Mcollective::Policy] $policies = [], + Hash $config = {}, + Hash $client_config = {}, + Hash $server_config = {}, + Boolean $client = $mcollective::client, + Boolean $server = $mcollective::server, + Enum["present", "absent"] $ensure = "present" +) { + mcollective::module_plugin{$name: + config_name => $config_name, + client_files => $client_files, + server_files => $server_files, + common_files => $common_files, + executable_files => $executable_files, + client_directories => $client_directories, + server_directories => $server_directories, + common_directories => $common_directories, + gem_dependencies => $gem_dependencies, + manage_gem_dependencies => $manage_gem_dependencies, + package_dependencies => $package_dependencies, + manage_package_dependencies => $manage_package_dependencies, + class_dependencies => $class_dependencies, + policy_default => $policy_default, + policies => $policies, + config => $config, + client_config => $client_config, + server_config => $server_config, + client => $client, + server => $server, + ensure => $ensure + } +} diff --git a/metadata.json b/metadata.json new file mode 100644 index 0000000..b40b946 --- /dev/null +++ b/metadata.json @@ -0,0 +1,22 @@ +{ + "name": "choria-mcollective_agent_service", + "version": "4.0.1", + "author": "R.I.Pienaar ", + "license": "Apache-2.0", + "summary": "Manages Operating System Services", + "source": "https://github.com/choria-plugins/service-agent", + "project_page": "https://github.com/choria-plugins/service-agent", + "issues_url": "https://github.com/choria-plugins/service-agent/issues", + "dependencies": [ + { + "name": "choria/mcollective", + "version_requirement": ">= 0.14.5 < 2.0.0" + } + ], + "requirements": [ + { + "name": "puppet", + "version_requirement": ">= 8.0.0 < 9.0.0" + } + ] +} diff --git a/spec/agent/service_agent_spec.rb b/spec/agent/service_agent_spec.rb index 4d65f11..8ab9faa 100755 --- a/spec/agent/service_agent_spec.rb +++ b/spec/agent/service_agent_spec.rb @@ -1,15 +1,15 @@ #!/usr/bin/env rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../', 'agent', 'service.rb') -require File.join(File.dirname(__FILE__), '../../', 'util', 'service', 'base.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'agent', 'service.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'util', 'service', 'base.rb') module MCollective module Agent describe Service do before do - agent_file = File.join(File.dirname(__FILE__), '../../', 'agent', 'service.rb') + agent_file = File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'agent', 'service.rb') @agent = MCollective::Test::LocalAgentTest.new('service', :agent_file => agent_file).plugin end diff --git a/spec/application/service_spec.rb b/spec/application/service_spec.rb index 7be6f02..cfdee08 100644 --- a/spec/application/service_spec.rb +++ b/spec/application/service_spec.rb @@ -1,13 +1,13 @@ #!/usr/bin/env rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../', 'application', 'service.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'application', 'service.rb') module MCollective class Application describe Service do before do - application_file = File.join(File.dirname(__FILE__), '../../', 'application', 'service.rb') + application_file = File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'application', 'service.rb') @app = MCollective::Test::ApplicationTest.new('service', :application_file => application_file).plugin end diff --git a/spec/data/service_data_spec.rb b/spec/data/service_data_spec.rb index 52cd091..2425c97 100644 --- a/spec/data/service_data_spec.rb +++ b/spec/data/service_data_spec.rb @@ -1,8 +1,8 @@ #!/usr/bin/env rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../', 'data', 'service_data.rb') -require File.join(File.dirname(__FILE__), '../../', 'agent', 'service.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'data', 'service_data.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'agent', 'service.rb') module MCollective module Data diff --git a/spec/util/service/base_spec.rb b/spec/util/service/base_spec.rb index ec10cf4..e7748fa 100644 --- a/spec/util/service/base_spec.rb +++ b/spec/util/service/base_spec.rb @@ -1,7 +1,7 @@ #!/usr/bin/evn rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../../', 'util', 'service', 'base.rb') +require File.join(File.dirname(__FILE__), '../../../', 'files', 'mcollective', 'util', 'service', 'base.rb') module MCollective module Util diff --git a/spec/util/service/puppetservice_spec.rb b/spec/util/service/puppetservice_spec.rb index e4dcd76..c7d22b0 100644 --- a/spec/util/service/puppetservice_spec.rb +++ b/spec/util/service/puppetservice_spec.rb @@ -1,9 +1,9 @@ #!/usr/bin/env rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../../', 'agent', 'service.rb') -require File.join(File.dirname(__FILE__), '../../../', 'util', 'service', 'base.rb') -require File.join(File.dirname(__FILE__), '../../../', 'util', 'service', 'puppetservice.rb') +require File.join(File.dirname(__FILE__), '../../../', 'files', 'mcollective', 'agent', 'service.rb') +require File.join(File.dirname(__FILE__), '../../../', 'files', 'mcollective', 'util', 'service', 'base.rb') +require File.join(File.dirname(__FILE__), '../../../', 'files', 'mcollective', 'util', 'service', 'puppetservice.rb') module MCollective module Util diff --git a/spec/validator/service_name_validator_spec.rb b/spec/validator/service_name_validator_spec.rb index 2d9d301..781bece 100644 --- a/spec/validator/service_name_validator_spec.rb +++ b/spec/validator/service_name_validator_spec.rb @@ -1,7 +1,7 @@ #!/usr/bin/env rspec require 'spec_helper' -require File.join(File.dirname(__FILE__), '../../', 'validator', 'service_name.rb') +require File.join(File.dirname(__FILE__), '../../', 'files', 'mcollective', 'validator', 'service_name.rb') module MCollective module Validator