diff --git a/.gitignore b/.gitignore
index c6ef218..839f200 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,106 @@
-.idea
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a packager
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.kitchen
+.kitchen.local.yml
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# dotenv
+.env
+
+# virtualenv
+.venv
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+# copied `.md` files used for conversion to `.rst` using `m2r`
+docs/*.md
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..6bf9cf2
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,61 @@
+stages:
+ - test
+ - commitlint
+ - name: release
+ if: branch = master AND type != pull_request
+
+sudo: required
+cache: bundler
+language: ruby
+
+services:
+ - docker
+
+before_install:
+ - bundle install
+
+# Make sure the instances listed below match up with
+# the `platforms` defined in `kitchen.yml`
+env:
+ matrix:
+ - INSTANCE: default-debian-9-2019-2-py3
+ - INSTANCE: default-ubuntu-1804-2019-2-py3
+ - INSTANCE: default-ubuntu-1604-2018-3-py2
+ - INSTANCE: default-ubuntu-1604-2017-7-py2
+
+script:
+ - bundle exec kitchen verify ${INSTANCE}
+
+jobs:
+ include:
+ # Define the commitlint stage
+ - stage: commitlint
+ language: node_js
+ node_js: lts/*
+ before_install: skip
+ script:
+ - npm install @commitlint/config-conventional -D
+ - npm install @commitlint/travis-cli -D
+ - commitlint-travis
+ # Define the release stage that runs semantic-release
+ - stage: release
+ language: node_js
+ node_js: lts/*
+ before_install: skip
+ script:
+ # Update `AUTHORS.md`
+ - export MAINTAINER_TOKEN=${GH_TOKEN}
+ - go get github.com/alxwr/maintainer
+ - maintainer contributor
+
+ # Install all dependencies required for `semantic-release`
+ - npm install @semantic-release/changelog@3 -D
+ - npm install @semantic-release/exec@3 -D
+ - npm install @semantic-release/git@7 -D
+ deploy:
+ provider: script
+ skip_cleanup: true
+ script:
+ # Run `semantic-release`
+ - npx semantic-release@15
+
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
index 0000000..7526d62
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,12 @@
+# Authors
+
+This list is sorted by the number of commits per contributor in _descending_ order.
+
+Avatar|Contributor|Contributions
+:-:|---|:-:
+|[@noelmcloughlin](https://github.com/noelmcloughlin)|2
+|[@alxwr](https://github.com/alxwr)|1
+
+---
+
+Auto-generated by a [forked version](https://github.com/myii/maintainer) of [gaocegege/maintainer](https://github.com/gaocegege/maintainer) on 2019-06-05.
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e69de29
diff --git a/FORMULA b/FORMULA
new file mode 100644
index 0000000..67aeabd
--- /dev/null
+++ b/FORMULA
@@ -0,0 +1,9 @@
+name: sysstat
+os: FreeBSD
+os_family: FreeBSD
+version: 1.1.0
+release: 1
+minimum_version: 2016.11
+summary: sysstat formula
+description: Formula to set up sysstat
+top_level_dir: sysstat
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..7b544d6
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,6 @@
+source "https://rubygems.org"
+
+gem 'kitchen-docker', '>= 2.9'
+gem 'kitchen-salt', '>= 0.5.0'
+gem 'kitchen-inspec', '>= 1.1'
+
diff --git a/LICENSE b/LICENSE
index 8a9dff9..57caf8d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
- Copyright (c) 2014-2015 Salt Stack Formulas
+ Copyright (c) 2019 Salt Stack Formulas
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.rst b/README.rst
deleted file mode 100644
index 2d593ab..0000000
--- a/README.rst
+++ /dev/null
@@ -1,94 +0,0 @@
-=======
-sysstat
-=======
-
-Formula to install sysstat/sar and configure it.
-
-Status
-======
-
-* This formula has been tested on Ubuntu 12.04.4 LTS and CentOS 6.5.
-* Supports configuration through pillar data for all
-
-Usage
-================
-Install the formula files as required by your salt master configuration.
-
-To use the formula in a state setup the following code block:
-.. code-block:: Saltstack
- include:
- - sysstat
-
-To override defaults for the formula setup and include pillar as recommended in
-``pillar.example`` file.
-
-.. code-block:: Saltstack
- # -*- coding: utf-8 -*-
- # vim: ft=yaml
- sysstat:
- lookup:
- service:
- enabled: False
-
-Available states
-================
-
-.. contents::
- :local:
-
-``sysstat``
------------
-Include the following states in order of package, config, service. Each state
-is fully configurable by the pillar. There shouldnt be a need to include the
-rest of the states as this state sets up sysstat fully based on the pillar.
-
-Included states
-================
-
-``sysstat.package``
--------------
-Installs package specified in pillar['sysstat:lookup:pkg'], defaults to value
-specified in ``sysstat/defaults.yml``
-
-``sysstat.config``
--------------
-Sets up the config in pillar['sysstat:lookup:config:path'] with values setup
-under pillar['sysstat:lookup:config'].
-
-``sysstat.service``
--------------
-Toggled by sysstat:service:running config, will enable service or not. Defaults
-off for RedHat setup in ``sysstat/map.jinja`` and on for rest as setup in
-``sysstat/defaults.yml``
-
-Disclaimer
-================
-Parts of the formula may or may not work in versions earlier than 2014.7
-
-.. note::
- Some of the Changes are backwards incompatible, please review the following
- diff for clarification of the same:
-
-
-New Pillar Style:
-
-.. code-block:: Saltstack
- sysstat:
- lookup:
- service:
- enabled: True
- config:
- enabled: "true"
- sa1_options: "-S DISK"
- sa2_options: ""
-
-Old Pillar Style
-
-.. code-blockk:: Saltstack
- sysstat:
- lookup:
- pkg: sysstat
- sysstat_config:
- enabled: "true"
- sa1_options: "-S DISK"
- sa2_options: ""
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000..2f9d1aa
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: ['@commitlint/config-conventional'],
+};
diff --git a/docs/AUTHORS.rst b/docs/AUTHORS.rst
new file mode 100644
index 0000000..e69de29
diff --git a/docs/CHANGELOG.rst b/docs/CHANGELOG.rst
new file mode 100644
index 0000000..e69de29
diff --git a/docs/README.rst b/docs/README.rst
new file mode 100644
index 0000000..018d7fe
--- /dev/null
+++ b/docs/README.rst
@@ -0,0 +1,104 @@
+.. _readme:
+
+sysstat-formula
+================
+
+|img_travis| |img_sr|
+
+.. |img_travis| image:: https://travis-ci.com/saltstack-formulas/sysstat-formula.svg?branch=master
+ :alt: Travis CI Build Status
+ :scale: 100%
+ :target: https://travis-ci.com/saltstack-formulas/sysstat-formula
+.. |img_sr| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
+ :alt: Semantic Release
+ :scale: 100%
+ :target: https://github.com/semantic-release/semantic-release
+Manage sysstat.
+
+.. contents:: **Table of Contents**
+
+General notes
+-------------
+
+See the full `SaltStack Formulas installation and usage instructions
+`_.
+
+If you want to use this formula, please pay attention to the ``FORMULA`` file and/or ``git tag``,
+which contains the currently released version. This formula is versioned according to `Semantic Versioning `_.
+
+See `Formula Versioning Section `_ for more details.
+
+Contributing to this repo
+-------------------------
+
+Please see https://github.com/saltstack-formulas/sysstat-formula/blob/master/docs/CONTRIBUTING.rst
+
+Available states
+----------------
+
+.. contents::
+ :local:
+
+``sysstat``
+^^^^^^^^^^^^
+
+*Meta-state (This is a state that includes other states)*.
+
+This installs the sysstat package,
+manages the sysstat configuration file and then
+starts the associated sysstat service.
+
+``sysstat.package``
+^^^^^^^^^^^^^^^^^^^^
+
+This state will install the sysstat package only.
+
+``sysstat.archive``
+^^^^^^^^^^^^^^^^^^^
+
+This state will install the sysstat software from archive file only.
+
+``sysstat.config``
+^^^^^^^^^^^^^^^^^^^
+
+This state will configure the sysstat service and has a dependency on ``sysstat.install``
+via include list.
+
+``sysstat.service``
+^^^^^^^^^^^^^^^^^^^^
+
+This state will start the sysstat service and has a dependency on ``sysstat.config``
+via include list.
+
+``sysstat.clean``
+^^^^^^^^^^^^^^^^^^
+
+*Meta-state (This is a state that includes other states)*.
+
+this state will undo everything performed in the ``sysstat`` meta-state in reverse order, i.e.
+stops the service,
+removes the configuration file and
+then uninstalls the package.
+
+``sysstat.service.clean``
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This state will stop the sysstat service and disable it at boot time.
+
+``sysstat.config.clean``
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This state will remove the configuration of the sysstat service and has a
+dependency on ``sysstat.service.clean`` via include list.
+
+``sysstat.package.clean``
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This state will remove the sysstat package and has a depency on
+``sysstat.config.clean`` via include list.
+
+``sysstat.archive.clean``
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This state will uninstall sysstat software from archive extracted directory.
+
diff --git a/kitchen.yml b/kitchen.yml
new file mode 100644
index 0000000..e859198
--- /dev/null
+++ b/kitchen.yml
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+# For help on this file's format, see https://kitchen.ci/
+driver:
+ name: docker
+ use_sudo: false
+ privileged: true
+ run_command: /lib/systemd/systemd
+
+# Make sure the platforms listed below match up with
+# the `env.matrix` instances defined in `.travis.yml`
+platforms:
+ ## SALT 2019.2
+ - name: debian-9-2019-2-py3
+ driver:
+ image: netmanagers/salt-2019.2-py3:debian-9
+ - name: ubuntu-1804-2019-2-py3
+ driver:
+ image: netmanagers/salt-2019.2-py3:ubuntu-1804
+
+ ## SALT 2018.3
+ - name: ubuntu-1604-2018-3-py2
+ driver:
+ image: netmanagers/salt-2018.3-py2:ubuntu-1604
+
+ ## SALT 2017.7
+ - name: ubuntu-1604-2017-7-py2
+ driver:
+ image: netmanagers/salt-2017.7-py2:ubuntu-1604
+
+provisioner:
+ name: salt_solo
+ log_level: info
+ salt_install: none
+ require_chef: false
+ formula: sysstat
+ salt_copy_filter:
+ - .kitchen
+ - .git
+ state_top:
+ base:
+ '*':
+ - sysstat
+ pillars:
+ top.sls:
+ base:
+ '*':
+ - sysstat
+ pillars_from_files:
+ sysstat.sls: pillar.example
+
+verifier:
+ # https://www.inspec.io/
+ name: inspec
+ sudo: true
+ # cli, documentation, html, progress, json, json-min, json-rspec, junit
+ reporter:
+ - cli
+ inspec_tests:
+ - path: test/integration/default
+
+suites:
+ - name: default
diff --git a/pillar.example b/pillar.example
index 97c5129..215c6d8 100644
--- a/pillar.example
+++ b/pillar.example
@@ -1,10 +1,58 @@
# -*- coding: utf-8 -*-
# vim: ft=yaml
+---
sysstat:
- lookup:
- service:
- enabled: True
- config:
- enabled: "true"
- sa1_options: "-S DISK"
- sa2_options: ""
+ pkg:
+ name: sysstat
+ use_upstream_archive: False
+ archive:
+ uri: https://dl.sysstat.com/oss/release
+
+ pkgrepo:
+ humanname: sysstat_official
+ name: deb https://packages.sysstat.com/oss/deb stable main
+ file: /etc/apt/sources.list.d/sysstat.list
+ key_url: https://packages.sysstat.com/gpg.key
+ config_file: /etc/sysstat/sysstat.ini
+ environ_file: /etc/default.sysstat.sh
+ service:
+ name: sysstat-server
+
+ linux:
+ #'Alternatives system' priority: zero disables (default)
+ altpriority: 1000
+
+ tofs:
+ # The files_switch key serves as a selector for alternative
+ # directories under the formula files directory. See TOFS pattern
+ # doc for more info.
+ # Note: Any value not evaluated by `config.get` will be used literally.
+ # This can be used to set custom paths, as many levels deep as required.
+ files_switch:
+ - any/path/can/be/used/here
+ - id
+ - osfinger
+ - os
+ - os_family
+ # All aspects of path/file resolution are customisable using the options below.
+ # This is unnecessary in most cases; there are sensible defaults.
+ # path_prefix: sysstat_alt
+ # dirs:
+ # files: files_alt
+ # default: default_alt
+ # source_files:
+ # sysstat-config-file-file-managed:
+ # - 'example_alt.tmpl'
+ # - 'example_alt.tmpl.jinja'
+
+ # Pillar-based config
+ # See also https://sysstat.com/docs/installation/configuration/
+ environ:
+ - 'export PATH=${PATH}:/opt/sysstat-6.2.2.darwin-amd64'
+ config:
+ default:
+ instance_name: ${HOSTNAME}
+ security:
+ admin_user: admin
+ auth.google:
+ client_secret: 0ldS3cretKey
diff --git a/pre-commit_semantic-release.sh b/pre-commit_semantic-release.sh
new file mode 100755
index 0000000..9d34d74
--- /dev/null
+++ b/pre-commit_semantic-release.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+###############################################################################
+# (A) Update `FORMULA` with `${nextRelease.version}`
+###############################################################################
+sed -i -e "s_^\(version:\).*_\1 ${1}_" FORMULA
+
+
+###############################################################################
+# (B) Use `m2r` to convert automatically produced `.md` docs to `.rst`
+###############################################################################
+
+# Install `m2r`
+sudo -H pip install m2r
+
+# Copy and then convert the `.md` docs
+cp *.md docs/
+cd docs/
+m2r --overwrite *.md
+
+# Change excess `H1` headings to `H2` in converted `CHANGELOG.rst`
+sed -i -e '/^=.*$/s/=/-/g' CHANGELOG.rst
+sed -i -e '1,4s/-/=/g' CHANGELOG.rst
+
+# Use for debugging output, when required
+# cat AUTHORS.rst
+# cat CHANGELOG.rst
+
+# Return back to the main directory
+cd ..
diff --git a/release-rules.js b/release-rules.js
new file mode 100644
index 0000000..c63c850
--- /dev/null
+++ b/release-rules.js
@@ -0,0 +1,18 @@
+// No release is triggered for the types commented out below.
+// Commits using these types will be incorporated into the next release.
+//
+// NOTE: Any changes here must be reflected in `CONTRIBUTING.md`.
+module.exports = [
+ {breaking: true, release: 'major'},
+ // {type: 'build', release: 'patch'},
+ // {type: 'chore', release: 'patch'},
+ // {type: 'ci', release: 'patch'},
+ {type: 'docs', release: 'patch'},
+ {type: 'feat', release: 'minor'},
+ {type: 'fix', release: 'patch'},
+ {type: 'perf', release: 'patch'},
+ {type: 'refactor', release: 'patch'},
+ {type: 'revert', release: 'patch'},
+ {type: 'style', release: 'patch'},
+ {type: 'test', release: 'patch'},
+];
diff --git a/release.config.js b/release.config.js
new file mode 100644
index 0000000..afa0cb1
--- /dev/null
+++ b/release.config.js
@@ -0,0 +1,106 @@
+module.exports = {
+ branch: 'master',
+ plugins: [
+ ['@semantic-release/commit-analyzer', {
+ preset: 'angular',
+ releaseRules: './release-rules.js',
+ }],
+ '@semantic-release/release-notes-generator',
+ ['@semantic-release/changelog', {
+ changelogFile: 'CHANGELOG.md',
+ changelogTitle: '# Changelog',
+ }],
+ ['@semantic-release/exec', {
+ prepareCmd: 'sh ./pre-commit_semantic-release.sh ${nextRelease.version}',
+ }],
+ ['@semantic-release/git', {
+ assets: ['*.md', 'docs/*.rst', 'FORMULA'],
+ }],
+ '@semantic-release/github',
+ ],
+ generateNotes: {
+ preset: 'angular',
+ writerOpts: {
+ // Required due to upstream bug preventing all types being displayed.
+ // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317
+ // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410
+ transform: (commit, context) => {
+ const issues = []
+
+ commit.notes.forEach(note => {
+ note.title = `BREAKING CHANGES`
+ })
+
+ // NOTE: Any changes here must be reflected in `CONTRIBUTING.md`.
+ if (commit.type === `feat`) {
+ commit.type = `Features`
+ } else if (commit.type === `fix`) {
+ commit.type = `Bug Fixes`
+ } else if (commit.type === `perf`) {
+ commit.type = `Performance Improvements`
+ } else if (commit.type === `revert`) {
+ commit.type = `Reverts`
+ } else if (commit.type === `docs`) {
+ commit.type = `Documentation`
+ } else if (commit.type === `style`) {
+ commit.type = `Styles`
+ } else if (commit.type === `refactor`) {
+ commit.type = `Code Refactoring`
+ } else if (commit.type === `test`) {
+ commit.type = `Tests`
+ } else if (commit.type === `build`) {
+ commit.type = `Build System`
+ // } else if (commit.type === `chore`) {
+ // commit.type = `Maintenance`
+ } else if (commit.type === `ci`) {
+ commit.type = `Continuous Integration`
+ } else {
+ return
+ }
+
+ if (commit.scope === `*`) {
+ commit.scope = ``
+ }
+
+ if (typeof commit.hash === `string`) {
+ commit.hash = commit.hash.substring(0, 7)
+ }
+
+ if (typeof commit.subject === `string`) {
+ let url = context.repository
+ ? `${context.host}/${context.owner}/${context.repository}`
+ : context.repoUrl
+ if (url) {
+ url = `${url}/issues/`
+ // Issue URLs.
+ commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => {
+ issues.push(issue)
+ return `[#${issue}](${url}${issue})`
+ })
+ }
+ if (context.host) {
+ // User URLs.
+ commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => {
+ if (username.includes('/')) {
+ return `@${username}`
+ }
+
+ return `[@${username}](${context.host}/${username})`
+ })
+ }
+ }
+
+ // remove references that already appear in the subject
+ commit.references = commit.references.filter(reference => {
+ if (issues.indexOf(reference.issue) === -1) {
+ return true
+ }
+
+ return false
+ })
+
+ return commit
+ },
+ },
+ },
+};
diff --git a/sysstat/clean.sls b/sysstat/clean.sls
new file mode 100644
index 0000000..21ba697
--- /dev/null
+++ b/sysstat/clean.sls
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+include:
+ - .service.clean
+ - .config.clean
+ - .package.clean
+ - .source.clean
diff --git a/sysstat/config.sls b/sysstat/config.sls
deleted file mode 100644
index 675c536..0000000
--- a/sysstat/config.sls
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: ft=sls
-
-{## import settings from map.jinja ##}
-{% from "sysstat/map.jinja" import sysstat_settings with context %}
-{% set config_settings = sysstat_settings.config %}
-
-sysstat-config:
- file.managed:
- - name: {{ config_settings.path }}
- - source: salt://sysstat/files/sysstat.default
- - mode: 644
- - user: root
- - group: root
- - template: jinja
- - defaults:
- enabled: "{{ config_settings.enabled }}"
- sa1_options: {{ config_settings.sa1_options }}
- sa2_options: {{ config_settings.sa2_options }}
- {% if sysstat_settings.service.enabled %}
- - listen_in:
- - service: sysstat-service
- {% endif %}
diff --git a/sysstat/config/clean.sls b/sysstat/config/clean.sls
new file mode 100644
index 0000000..cacf95b
--- /dev/null
+++ b/sysstat/config/clean.sls
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+{%- set sls_source_clean = tplroot ~ '.source.clean' %}
+{%- set sls_package_clean = tplroot ~ '.package.clean' %}
+{%- set sls_service_clean = tplroot ~ '.service.clean' %}
+
+ {%- if grains.kernel|lower == 'linux' and sysstat.linux.altpriority|int > 0 %}
+
+include:
+ - {{ sls_service_clean }}
+ - {{ sls_source_clean if sysstat.pkg.use_upstream_source else sls_package_clean }}
+
+sysstat-config-clean-file-absent:
+ file.absent:
+ - names:
+ - {{ sysstat.config_file }}
+ - {{ sysstat.environ_file }}
+ - require:
+ - sls: {{ sls_service_clean }}
+ - sls: {{ sls_source_clean if sysstat.pkg.use_upstream_source else sls_package_clean }}
+
+ {%- endif %}
diff --git a/sysstat/config/environ.sls b/sysstat/config/environ.sls
new file mode 100644
index 0000000..6a58c76
--- /dev/null
+++ b/sysstat/config/environ.sls
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- set sls_source_install = tplroot ~ '.source.install' %}
+{%- set sls_package_install = tplroot ~ '.package.install' %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+{%- from tplroot ~ "/libtofs.jinja" import files_switch with context %}
+
+include:
+ - {{ sls_source_install if sysstat.pkg.use_upstream_source else sls_package_install }}
+
+sysstat-config-file-file-managed-environ_file:
+ file.managed:
+ - name: {{ sysstat.environ_file }}
+ - source: {{ files_switch(['sysstat.sh.jinja'],
+ lookup='sysstat-config-file-file-managed-environ_file'
+ )
+ }}
+ - mode: 640
+ - user: root
+ - group: {{ sysstat.rootgroup }}
+ - makedirs: True
+ - template: jinja
+ - context:
+ config: {{ sysstat.environ|json }}
+ - require:
+ - sls: {{ sls_source_install if sysstat.pkg.use_upstream_source else sls_package_install }}
diff --git a/sysstat/config/file.sls b/sysstat/config/file.sls
new file mode 100644
index 0000000..caeb7f2
--- /dev/null
+++ b/sysstat/config/file.sls
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+{%- from tplroot ~ "/libtofs.jinja" import files_switch with context %}
+
+{%- if 'config' in sysstat and sysstat.config %}
+ {%- if sysstat.pkg.use_upstream_source %}
+ {%- set sls_package_install = tplroot ~ '.source.install' %}
+ {%- else %}
+ {%- set sls_package_install = tplroot ~ '.package.install' %}
+ {%- endif %}
+
+include:
+ - {{ sls_package_install }}
+
+sysstat-config-file-file-managed-config_file:
+ file.managed:
+ - name: {{ sysstat.config_file }}
+ - source: {{ files_switch(['sysstat.default.jinja'],
+ lookup='sysstat-config-file-file-managed-config_file'
+ )
+ }}
+ - mode: 640
+ - user: root
+ - group: {{ sysstat.rootgroup }}
+ - makedirs: True
+ - template: jinja
+ - context:
+ enabled: "{{ sysstat.config.enabled }}"
+ sa1_options: {{ sysstat.config.sa1_options }}
+ sa2_options: {{ sysstat.config.sa2_options }}
+ - require:
+ - sls: {{ sls_package_install }}
+
+{%- endif %}
diff --git a/sysstat/config/init.sls b/sysstat/config/init.sls
new file mode 100644
index 0000000..71fe77c
--- /dev/null
+++ b/sysstat/config/init.sls
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+include:
+ - .file
+ - .environ
diff --git a/sysstat/defaults.yaml b/sysstat/defaults.yaml
new file mode 100644
index 0000000..a0d136d
--- /dev/null
+++ b/sysstat/defaults.yaml
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+---
+sysstat:
+ dir: /usr/local
+ version: '12.1.5'
+ pkg:
+ name: sysstat
+ use_upstream_source: False
+ source:
+ name: /tmp/sysstat
+ uri: http://pagesperso-orange.fr/sebastien.godard
+ source: None
+ source_hash: d3bbc90194326e93fbc7f63cff20894ea20cd05caee1bc6ada3bf602e06970e4 #linux amd64 tarball
+ trim_output: True {# works in 2018.3.2. onwards #}
+ archive_suffix: tar.gz
+ archive_format: tar
+ enforce_toplevel: False
+ options: '--strip-components=1'
+
+ kernel: ''
+ arch: ''
+ rootgroup: root
+ config_file: /etc/default/sysstat
+ config:
+ path: /etc/default/sysstat
+ enabled: "true"
+ sa1_options: "-S DISK"
+ sa2_options: ""
+ history: 60
+ compressafter: 10
+
+ environ_file: /etc/default/sysstat.sh
+ environ: []
+ service:
+ name: sysstat
+
+ linux:
+ #'Alternatives system' priority: zero disables (default)
+ altpriority: 0
diff --git a/sysstat/defaults.yml b/sysstat/defaults.yml
deleted file mode 100644
index 3a590ff..0000000
--- a/sysstat/defaults.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: ft=yaml
-sysstat:
- pkg: sysstat
- service:
- name: sysstat
- enabled: True
- config:
- path: '/etc/default/sysstat'
- enabled: "true"
- sa1_options: "-S DISK"
- sa2_options: ""
- history: 60
- compressafter: 10
diff --git a/sysstat/files/default/sysstat b/sysstat/files/default/sysstat
new file mode 100644
index 0000000..db060f3
--- /dev/null
+++ b/sysstat/files/default/sysstat
@@ -0,0 +1,17 @@
+########################################################################
+# File managed by Salt at <{{ source }}>.
+# Your changes may be overwritten.
+########################################################################
+
+{%- macro render_key_value_pairs(cfg) %}
+{%- for k,v in cfg.items() -%}
+{{ k }} = {{ v }}
+{% endfor %}
+{%- endmacro %}
+
+{{ render_key_value_pairs(config.get("default", {})) }}
+{% for section, cfg in config.items() %}
+{%- if section == "default" %}{% continue %}{% endif %}
+[{{section}}]
+{{ render_key_value_pairs(cfg) }}
+{% endfor %}
diff --git a/sysstat/files/sysstat.default b/sysstat/files/default/sysstat.default.jinja
similarity index 100%
rename from sysstat/files/sysstat.default
rename to sysstat/files/default/sysstat.default.jinja
diff --git a/sysstat/files/default/sysstat.sh.jinja b/sysstat/files/default/sysstat.sh.jinja
new file mode 100644
index 0000000..de26ffb
--- /dev/null
+++ b/sysstat/files/default/sysstat.sh.jinja
@@ -0,0 +1,10 @@
+########################################################################
+# File managed by Salt at <{{ source }}>.
+# Your changes may be overwritten.
+########################################################################
+
+{%- if config %}
+ {%- for item in config %}
+{{ item }}
+ {%- endfor %}
+{%- endif %}
diff --git a/sysstat/files/sysstat.suse b/sysstat/files/default/sysstat.suse.jinja
similarity index 100%
rename from sysstat/files/sysstat.suse
rename to sysstat/files/default/sysstat.suse.jinja
diff --git a/sysstat/init.sls b/sysstat/init.sls
index 7fef389..798fb3a 100644
--- a/sysstat/init.sls
+++ b/sysstat/init.sls
@@ -1,7 +1,11 @@
# -*- coding: utf-8 -*-
# vim: ft=sls
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
include:
- - sysstat.package
- - sysstat.config
- - sysstat.service
+ - {{ '.source' if sysstat.pkg.use_upstream_source else '.package' }}
+ - .config
+ - .service
diff --git a/sysstat/jinja/macros.jinja b/sysstat/jinja/macros.jinja
new file mode 100644
index 0000000..aeeb852
--- /dev/null
+++ b/sysstat/jinja/macros.jinja
@@ -0,0 +1,12 @@
+# -*- coding: utf-8 -*-
+# vim: ft=jinja
+#
+# Collection of common macros
+
+{%- macro format_kwargs(kwarg) -%}
+ {%- filter indent(4) %}
+ {%- for k, v in kwarg|dictsort() %}
+- {{ k }}: {{ v }}
+ {%- endfor %}
+ {%- endfilter %}
+{%- endmacro %}
diff --git a/sysstat/libtofs.jinja b/sysstat/libtofs.jinja
new file mode 100644
index 0000000..ab0d0f6
--- /dev/null
+++ b/sysstat/libtofs.jinja
@@ -0,0 +1,100 @@
+{%- macro files_switch(source_files,
+ lookup=None,
+ default_files_switch=['id', 'os_family'],
+ indent_width=6,
+ v1_path_prefix='') %}
+ {#-
+ Returns a valid value for the "source" parameter of a "file.managed"
+ state function. This makes easier the usage of the Template Override and
+ Files Switch (TOFS) pattern.
+
+ Params:
+ * source_files: ordered list of files to look for
+ * lookup: key under ':tofs:source_files' to override
+ list of source files
+ * default_files_switch: if there's no config (e.g. pillar)
+ ':tofs:files_switch' this is the ordered list of grains to
+ use as selector switch of the directories under
+ "/files"
+ * indent_witdh: indentation of the result value to conform to YAML
+ * v1_path_prefix: (deprecated) only used for injecting a path prefix into
+ the source, to support older TOFS configs
+
+ Example (based on a `tplroot` of `xxx`):
+
+ If we have a state:
+
+ Deploy configuration:
+ file.managed:
+ - name: /etc/yyy/zzz.conf
+ - source: {{ files_switch(['/etc/yyy/zzz.conf', '/etc/yyy/zzz.conf.jinja'],
+ lookup='Deploy configuration'
+ ) }}
+ - template: jinja
+
+ In a minion with id=theminion and os_family=RedHat, it's going to be
+ rendered as:
+
+ Deploy configuration:
+ file.managed:
+ - name: /etc/yyy/zzz.conf
+ - source:
+ - salt://xxx/files/theminion/etc/yyy/zzz.conf
+ - salt://xxx/files/theminion/etc/yyy/zzz.conf.jinja
+ - salt://xxx/files/RedHat/etc/yyy/zzz.conf
+ - salt://xxx/files/RedHat/etc/yyy/zzz.conf.jinja
+ - salt://xxx/files/default/etc/yyy/zzz.conf
+ - salt://xxx/files/default/etc/yyy/zzz.conf.jinja
+ - template: jinja
+ #}
+ {#- Get the `tplroot` from `tpldir` #}
+ {%- set tplroot = tpldir.split('/')[0] %}
+ {%- set path_prefix = salt['config.get'](tplroot ~ ':tofs:path_prefix', tplroot) %}
+ {%- set files_dir = salt['config.get'](tplroot ~ ':tofs:dirs:files', 'files') %}
+ {%- set files_switch_list = salt['config.get'](
+ tplroot ~ ':tofs:files_switch',
+ default_files_switch
+ ) %}
+ {#- Lookup source_files (v2), files (v1), or fallback to source_files parameter #}
+ {%- set src_files = salt['config.get'](
+ tplroot ~ ':tofs:source_files:' ~ lookup,
+ salt['config.get'](
+ tplroot ~ ':tofs:files:' ~ lookup,
+ source_files
+ )
+ ) %}
+ {#- Only add to [''] when supporting older TOFS implementations #}
+ {%- set path_prefix_exts = [''] %}
+ {%- if v1_path_prefix != '' %}
+ {%- do path_prefix_exts.append(v1_path_prefix) %}
+ {%- endif %}
+ {%- for path_prefix_ext in path_prefix_exts %}
+ {%- set path_prefix_inc_ext = path_prefix ~ path_prefix_ext %}
+ {#- For older TOFS implementation, use `files_switch` from the config #}
+ {#- Use the default, new method otherwise #}
+ {%- set fsl = salt['config.get'](
+ tplroot ~ path_prefix_ext|replace('/', ':') ~ ':files_switch',
+ files_switch_list
+ ) %}
+ {#- Append an empty value to evaluate as `default` in the loop below #}
+ {%- if '' not in fsl %}
+ {%- do fsl.append('') %}
+ {%- endif %}
+ {%- for fs in fsl %}
+ {%- for src_file in src_files %}
+ {%- if fs %}
+ {%- set fs_dir = salt['config.get'](fs, fs) %}
+ {%- else %}
+ {%- set fs_dir = salt['config.get'](tplroot ~ ':tofs:dirs:default', 'default') %}
+ {%- endif %}
+ {%- set url = '- salt://' ~ '/'.join([
+ path_prefix_inc_ext,
+ files_dir,
+ fs_dir,
+ src_file.lstrip('/')
+ ]) %}
+{{ url | indent(indent_width, true) }}
+ {%- endfor %}
+ {%- endfor %}
+ {%- endfor %}
+{%- endmacro %}
diff --git a/sysstat/map.jinja b/sysstat/map.jinja
index 2f9fd04..a3a31df 100644
--- a/sysstat/map.jinja
+++ b/sysstat/map.jinja
@@ -1,30 +1,45 @@
# -*- coding: utf-8 -*-
# vim: ft=jinja
-{## Start with defaults from defaults.sls ##}
-{% import_yaml 'sysstat/defaults.yml' as default_settings %}
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{#- Start imports as #}
+{%- import_yaml tplroot ~ "/defaults.yaml" as default_settings %}
+{%- import_yaml tplroot ~ "/osfamilymap.yaml" as osfamilymap %}
+{%- import_yaml tplroot ~ "/osmap.yaml" as osmap %}
+{%- import_yaml tplroot ~ "/osfingermap.yaml" as osfingermap %}
-{## setup variable using grains['os_family'] based logic ##}
-{% set sysstat_settings = salt['grains.filter_by']({
- 'Debian': default_settings.sysstat,
- 'RedHat': default_settings.sysstat,
- 'Suse': default_settings.sysstat,
-}, merge=salt['grains.filter_by']({
- 'RedHat': {
- "service": {
- "name": "sysstat",
- "enabled": False,
- },
- },
- 'Suse': {
- "service": {
- "name": "boot.sysstat",
- },
- "config": {
- "path": "/etc/sysstat/sysstat"
- },
- },
- }, grain="os_family", default='Debian',
- merge=salt['pillar.get']('sysstat:lookup')
-))
-%}
+{%- set defaults = salt['grains.filter_by'](default_settings,
+ default='sysstat',
+ merge=salt['grains.filter_by'](osfamilymap, grain='os_family',
+ merge=salt['pillar.get']('sysstat:lookup', default={})
+ )
+) %}
+
+{#- Merge the sysstat pillar #}
+{%- set sysstat = salt['pillar.get']('sysstat', default=defaults, merge=True) %}
+
+{#- source jinja #}
+{%- if sysstat.pkg.use_upstream_source %}
+ {%- set name = 'sysstat-%s'|format(sysstat.version) %}
+ {%- set uri = sysstat.pkg.source.uri + '/' + name %}
+ {%- do sysstat.pkg.source.update({
+ 'name': sysstat.pkg.source.name + '/' + name,
+ 'source': uri + '.' + sysstat.pkg.source.archive_suffix,
+ 'archive_format': sysstat.pkg.source.archive_format
+ }) %}
+ {%- do sysstat.update({'base_dir': sysstat.pkg.source.name}) %}
+ {%- do sysstat.environ.append('export PATH=${PATH}:' + sysstat.dir + '/bin') %}
+{%- endif %}
+
+{#- Contactenate arguments #}
+{%- macro concat_args(args) %}
+{%- set args = args|dictsort %}
+{%- if args|length > 0 %}
+{%- for k,v in args -%}
+{%- if not k or not v %}{% continue %}{% endif -%}
+ --{{ k }}={{ v }}
+{%- if not loop.last %} {% endif -%}
+{%- endfor -%}
+{%- endif -%}
+{%- endmacro %}
diff --git a/sysstat/osfamilymap.yaml b/sysstat/osfamilymap.yaml
new file mode 100644
index 0000000..5b50060
--- /dev/null
+++ b/sysstat/osfamilymap.yaml
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# vim: ft=yaml
+#
+# Setup variables using grains['os_family'] based logic.
+# You just need to add the key:values for an `os_family` that differ
+# from `defaults.yaml`.
+# Only add an `os_family` which is/will be supported by the formula
+#
+# If you do not need to provide defaults via the `os_family` grain,
+# you will need to provide at least an empty dict in this file, e.g.
+# osfamilymap: {}
+---
+
+Debian: {}
+
+RedHat:
+ service:
+ name: sysstat
+ enabled: False
+
+Suse:
+ service:
+ name: 'boot.sysstat'
+
+Gentoo: {}
+
+Arch: {}
+
+Alpine: {}
+
+FreeBSD: {}
+
+OpenBSD: {}
+
+Solaris: {}
+
+Windows: {}
+
+MacOS: {}
diff --git a/sysstat/package.sls b/sysstat/package.sls
deleted file mode 100644
index e7b1f0c..0000000
--- a/sysstat/package.sls
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: ft=sls
-
-{## import settings from map.jinja ##}
-{% from "sysstat/map.jinja" import sysstat_settings with context %}
-
-sysstat-pkg:
- pkg.installed:
- - name: {{ sysstat_settings.pkg }}
- - failhard: True
diff --git a/sysstat/package/clean.sls b/sysstat/package/clean.sls
new file mode 100644
index 0000000..22c16a8
--- /dev/null
+++ b/sysstat/package/clean.sls
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- set sls_config_clean = tplroot ~ '.config.clean' %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
+include:
+ - {{ sls_config_clean }}
+
+sysstat-package-clean-pkg-removed:
+ pkg.removed:
+ - name: {{ sysstat.pkg.name }}
+ # require:
+ # sls: {{ sls_config_clean }}
diff --git a/sysstat/package/init.sls b/sysstat/package/init.sls
new file mode 100644
index 0000000..d3e5518
--- /dev/null
+++ b/sysstat/package/init.sls
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+include:
+ - .install
diff --git a/sysstat/package/install.sls b/sysstat/package/install.sls
new file mode 100644
index 0000000..ed2f9c7
--- /dev/null
+++ b/sysstat/package/install.sls
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
+sysstat-package-install-pkg-installed:
+ pkg.installed:
+ - name: {{ sysstat.pkg.name }}
diff --git a/sysstat/service.sls b/sysstat/service.sls
deleted file mode 100644
index ec9f4f6..0000000
--- a/sysstat/service.sls
+++ /dev/null
@@ -1,12 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: ft=sls
-
-{## import settings from map.jinja ##}
-{% from "sysstat/map.jinja" import sysstat_settings with context %}
-
-{% if sysstat_settings.service.enabled %}
-sysstat-service:
- service.running:
- - name: {{ sysstat_settings.service.name }}
- - enable: True
-{% endif %}
diff --git a/sysstat/service/clean.sls b/sysstat/service/clean.sls
new file mode 100644
index 0000000..87f2a31
--- /dev/null
+++ b/sysstat/service/clean.sls
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
+sysstat-service-clean-service-dead:
+ service.dead:
+ - name: {{ sysstat.service.name }}
+ - enable: False
diff --git a/sysstat/service/init.sls b/sysstat/service/init.sls
new file mode 100644
index 0000000..6fe4d1a
--- /dev/null
+++ b/sysstat/service/init.sls
@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+include:
+ - .running
diff --git a/sysstat/service/running.sls b/sysstat/service/running.sls
new file mode 100644
index 0000000..c69083c
--- /dev/null
+++ b/sysstat/service/running.sls
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- set sls_config_file = tplroot ~ '.config.file' %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
+include:
+ - {{ sls_config_file }}
+
+sysstat-service-running-service-unmasked:
+ service.unmasked:
+ - name: {{ sysstat.service.name }}
+ - onlyif: systemctl list-unit-files | grep {{ sysstat.service.name }} >/dev/null 2>&1
+
+sysstat-service-running-service-running:
+ service.running:
+ - name: {{ sysstat.service.name }}
+ - enable: True
+ {%- if 'config' in sysstat and sysstat.config %}
+ - watch:
+ - file: sysstat-config-file-file-managed-config_file
+ - require:
+ - sls: {{ sls_config_file }}
+ - onlyif: systemctl list-unit-files | grep {{ sysstat.service.name }} >/dev/null 2>&1
+ {%- endif %}
diff --git a/sysstat/source/clean.sls b/sysstat/source/clean.sls
new file mode 100644
index 0000000..517dac6
--- /dev/null
+++ b/sysstat/source/clean.sls
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+
+sysstat-package-source-clean-file-absent:
+ file.absent:
+ - names:
+ - {{ sysstat.pkg.source.name }}/sysstat*
+ - /usr/local/lib/sa
+ - /usr/local/bin/sar
+ - /usr/local/bin/sadf
+ - /usr/local/bin/iostat
+ - /usr/local/bin/tapestat
+ - /usr/local/bin/mpstat
+ - /usr/local/bin/pidstat
+ - /usr/local/bin/cifsiostat
+ - /etc/sysconfig/sysstat.ioconf
+ - /etc/sysconfig/sysstat/sysstat
+ - /usr/local/share/doc/sysstat-{{ sysstat.version }}
+ - /usr/local/share/man/man8/sa1.8*
+ - /usr/local/share/man/man8/sa2.8*
+ - /usr/local/share/man/man8/sadc.8*
+ - /usr/local/share/man/man1/sar.1
+ - /usr/local/share/man/man1/sadf.1
+ - /usr/local/share/man/man5/sysstat.5
+ - /usr/local/share/man/man1/iostat.1
+ - /usr/local/share/man/man1/tapestat.1
+ - /usr/local/share/man/man1/mpstat.1
+ - /usr/local/share/man/man1/pidstat.1
+ - /usr/local/share/man/man1/cifsiostat.1
+ - /var/log/sa
diff --git a/sysstat/source/init.sls b/sysstat/source/init.sls
new file mode 100644
index 0000000..051d698
--- /dev/null
+++ b/sysstat/source/init.sls
@@ -0,0 +1,5 @@
+#.-*- coding: utf-8 -*-
+# vim: ft=sls
+
+include:
+ - .install
diff --git a/sysstat/source/install.sls b/sysstat/source/install.sls
new file mode 100644
index 0000000..6b803df
--- /dev/null
+++ b/sysstat/source/install.sls
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+# vim: ft=sls
+
+{#- Get the `tplroot` from `tpldir` #}
+{%- set tplroot = tpldir.split('/')[0] %}
+{%- from tplroot ~ "/map.jinja" import sysstat with context %}
+{%- from tplroot ~ "/jinja/macros.jinja" import format_kwargs with context %}
+
+sysstat-package-source-install-file-directory:
+ file.directory:
+ - name: {{ sysstat.pkg.source.name }}
+ - user: root
+ - group: root
+ - mode: 755
+ - makedirs: True
+ - require_in:
+ - source: sysstat-package-source-install-source-extracted
+ - recurse:
+ - user
+ - group
+ - mode
+
+sysstat-package-source-install-source-extracted:
+ archive.extracted:
+ {{- format_kwargs(sysstat.pkg.source) }}
+ - retry:
+ attempts: 3
+ until: True
+ interval: 60
+ splay: 10
+ - user: root
+ - group: root
+ - recurse:
+ - user
+ - group
+
+sysstat-package-source-install-cmd-run-make-install:
+ cmd.run:
+ - cwd: {{ sysstat.pkg.source.name }}
+ - names:
+ - ./configure
+ - make
+ - make install
+ - unless:
+ - test -d /usr/local/lib/sa
+ - test -f /usr/local/bin/sar
+ - require:
+ - archive: sysstat-package-source-install-source-extracted
diff --git a/test/integration/default/README.md b/test/integration/default/README.md
new file mode 100644
index 0000000..8019607
--- /dev/null
+++ b/test/integration/default/README.md
@@ -0,0 +1,50 @@
+# Default InSpec Profile
+
+This shows the implementation of the Default InSpec [profile](https://github.com/inspec/inspec/blob/master/docs/profiles.md).
+
+## Verify a profile
+
+InSpec ships with built-in features to verify a profile structure.
+
+```bash
+$ inspec check default
+Summary
+-------
+Location: default
+Profile: profile
+Controls: 4
+Timestamp: 2019-06-24T23:09:01+00:00
+Valid: true
+
+Errors
+------
+
+Warnings
+--------
+```
+
+## Execute a profile
+
+To run all **supported** controls on a local machine use `inspec exec /path/to/profile`.
+
+```bash
+$ inspec exec default
+..
+
+Finished in 0.0025 seconds (files took 0.12449 seconds to load)
+8 examples, 0 failures
+```
+
+## Execute a specific control from a profile
+
+To run one control from the profile use `inspec exec /path/to/profile --controls name`.
+
+```bash
+$ inspec exec default --controls package
+.
+
+Finished in 0.0025 seconds (files took 0.12449 seconds to load)
+1 examples, 0 failures
+```
+
+See an [example control here](https://github.com/inspec/inspec/blob/master/examples/profile/controls/example.rb).
diff --git a/test/integration/default/controls/config_spec.rb b/test/integration/default/controls/config_spec.rb
new file mode 100644
index 0000000..d47ca2f
--- /dev/null
+++ b/test/integration/default/controls/config_spec.rb
@@ -0,0 +1,12 @@
+control 'sysstat configuration' do
+ title 'should match desired lines'
+
+ describe file('/etc/default/sysstat') do
+ it { should be_file }
+ it { should be_owned_by 'root' }
+ it { should be_grouped_into 'root' }
+ its('mode') { should cmp '0644' }
+ its('content') { should include 'Default settings for ' }
+ its('content') { should include 'ENABLED' }
+ end
+end
diff --git a/test/integration/default/controls/environ_spec.rb b/test/integration/default/controls/environ_spec.rb
new file mode 100644
index 0000000..d0d80b2
--- /dev/null
+++ b/test/integration/default/controls/environ_spec.rb
@@ -0,0 +1,12 @@
+control 'sysstat configuration environment' do
+ title 'should match desired lines'
+
+# describe file('/etc/default/sysstat.sh') do
+# it { should be_file }
+# it { should be_owned_by 'root' }
+# it { should be_grouped_into 'root' }
+# its('mode') { should cmp '0640' }
+# its('content') { should include 'Your changes may be overwritten' }
+# its('content') { should include 'export PATH=${PATH}:/usr/local/bin' }
+# end
+end
diff --git a/test/integration/default/controls/packages_spec.rb b/test/integration/default/controls/packages_spec.rb
new file mode 100644
index 0000000..501d4eb
--- /dev/null
+++ b/test/integration/default/controls/packages_spec.rb
@@ -0,0 +1,7 @@
+control 'sysstat package' do
+ title 'should be installed'
+
+ describe package('sysstat') do
+ it { should be_installed }
+ end
+end
diff --git a/test/integration/default/controls/services_spec.rb b/test/integration/default/controls/services_spec.rb
new file mode 100644
index 0000000..59ee783
--- /dev/null
+++ b/test/integration/default/controls/services_spec.rb
@@ -0,0 +1,14 @@
+control 'sysstat service' do
+ impact 0.5
+ title 'should be running and enabled'
+
+ describe service('sysstat') do
+ it { should be_enabled }
+ #it { should be_running }
+ end
+
+# describe command('service sysstat status') do
+# its('stdout') { should match 'running' }
+# its('exit_status') { should eq 0 }
+# end
+end
diff --git a/test/integration/default/inspec.yml b/test/integration/default/inspec.yml
new file mode 100644
index 0000000..b75147e
--- /dev/null
+++ b/test/integration/default/inspec.yml
@@ -0,0 +1,12 @@
+name: sysstat
+title: sysstat Formula
+maintainer: Alexander Weidinger
+license: Apache-2.0
+summary: Verify that the sysstat formula is setup and configured correctly
+supports:
+ - platform-name: debian
+ - platform-name: ubuntu
+ - platform-name: centos
+ - platform-name: fedora
+ - platform-name: opensuse
+ - platform-name: freebsd
diff --git a/test/integration/default/todo/source_spec.rb b/test/integration/default/todo/source_spec.rb
new file mode 100644
index 0000000..f8100b9
--- /dev/null
+++ b/test/integration/default/todo/source_spec.rb
@@ -0,0 +1,22 @@
+title 'sysstat archives profile'
+
+control 'sysstat source archive' do
+ impact 1.0
+ title 'should be installed'
+ desc "Ensure sysstat source archive was extracted correctly"
+ tag: package: "source archive"
+
+ describe file('/opt/local/bin/sar') do #base_dir
+ it { should be_file }
+ it { should be_owned_by 'root' }
+ it { should be_grouped_into 'root' }
+ its('mode') { should cmp '0644' }
+ end
+
+ require 'digest'
+ binary = file('/tmp/sysstat/sysstat-12.1.5.tar.gz').content
+ sha256sum = Digest::SHA256.hexdigest(binary)
+ describe file('/opt/sysstat/sysstat-12.1.5.tar.gz') do
+ its('sha256sum') { should eq 'd3bbc90194326e93fbc7f63cff20894ea20cd05caee1bc6ada3bf602e06970e4' }
+ end
+end