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|[@noelmcloughlin](https://github.com/noelmcloughlin)|2 +@alxwr|[@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