From d6d518113fdf5271f583884bf6b82cdf7a12bd06 Mon Sep 17 00:00:00 2001 From: David Cachau Date: Thu, 20 Apr 2023 12:17:26 +0200 Subject: [PATCH 1/5] Migrate documentation to puppet-string And also add missing documentation --- REFERENCE.md | 285 +++++++++++++++++++++++++++++++++++++++ manifests/fetch/theme.pp | 16 +++ manifests/init.pp | 25 +++- manifests/install.pp | 31 ++--- manifests/plugins.pp | 22 +-- manifests/profile.pp | 14 +- manifests/theme.pp | 21 +-- 7 files changed, 342 insertions(+), 72 deletions(-) create mode 100644 REFERENCE.md diff --git a/REFERENCE.md b/REFERENCE.md new file mode 100644 index 0000000..494996a --- /dev/null +++ b/REFERENCE.md @@ -0,0 +1,285 @@ +# Reference + + + +## Table of Contents + +### Classes + +* [`ohmyzsh`](#ohmyzsh): Install and configure Oh-My-ZSH + +### Defined types + +* [`ohmyzsh::fetch::theme`](#ohmyzshfetchtheme): Install a theme from a defined source +* [`ohmyzsh::install`](#ohmyzshinstall): Install and configure Oh-My-ZSH for an user +* [`ohmyzsh::plugins`](#ohmyzshplugins): Install and configure Oh-My-ZSH plugins for an user +* [`ohmyzsh::profile`](#ohmyzshprofile): Configure the ZSH profile for an user +* [`ohmyzsh::theme`](#ohmyzshtheme): Configure the ZSH theme for an user + +## Classes + +### `ohmyzsh` + +This is the ohmyzsh module. It creates a profile directory under user home and allows +custom scripts to setup and made avalible on the path. + +This module is called ohmyzsh as Puppet does not support hyphens in module +names. + +View README.md for full documentation. + +#### Parameters + +The following parameters are available in the `ohmyzsh` class: + +* [`source`](#source) +* [`home`](#home) +* [`zsh_shell_path`](#zsh_shell_path) +* [`installs`](#installs) +* [`themes`](#themes) +* [`plugins`](#plugins) +* [`profiles`](#profiles) + +##### `source` + +Data type: `Stdlib::Httpsurl` + +Oh-My-ZSH repository. See data/ for the default value. + +##### `home` + +Data type: `Stdlib::Absolutepath` + +Default home base directory. See data/ for the default value. + +##### `zsh_shell_path` + +Data type: `Stdlib::Absolutepath` + +Path of the zsh executable. See data/ for the default value. + +##### `installs` + +Data type: `Hash` + +Install and configure Oh-My-ZSH for users defined in this hash. See data/ for the default value. + +##### `themes` + +Data type: `Hash` + +Configure the themes for users defined in this hash. See data/ for the default value. + +##### `plugins` + +Data type: `Hash` + +Configure the plugins for users defined in this hash. See data/ for the default value. + +##### `profiles` + +Data type: `Hash` + +Configure the profile for users defined in this hash. See data/ for the default value. + +## Defined types + +### `ohmyzsh::fetch::theme` + +Install a theme from a defined source + +#### Parameters + +The following parameters are available in the `ohmyzsh::fetch::theme` defined type: + +* [`url`](#url) +* [`source`](#source) +* [`content`](#content) +* [`filename`](#filename) +* [`revision`](#revision) +* [`depth`](#depth) + +##### `url` + +Data type: `Optional[Stdlib::Httpurl]` + +The URL of the git repository (if `source` is `git`) or to the file + +Default value: ``undef`` + +##### `source` + +Data type: `Optional[String]` + +`git` for a repository, `undef` for a file to download or the source to pass to Puppet `file` + +Default value: ``undef`` + +##### `content` + +Data type: `Optional[String]` + +The content to pass to Puppet `file`, only if `source` and `url` is unset. + +Default value: ``undef`` + +##### `filename` + +Data type: `Optional[String]` + +The file name to use while saving the theme + +Default value: ``undef`` + +##### `revision` + +Data type: `Optional[String]` + +Revision to checkout while using Git + +Default value: ``undef`` + +##### `depth` + +Data type: `Optional[Integer]` + +Controls the shallow clone for Git + +Default value: ``undef`` + +### `ohmyzsh::install` + +Install and configure Oh-My-ZSH for an user + +#### Parameters + +The following parameters are available in the `ohmyzsh::install` defined type: + +* [`ensure`](#ensure) +* [`set_sh`](#set_sh) +* [`update_zshrc`](#update_zshrc) +* [`backup_zshrc`](#backup_zshrc) +* [`auto_update_mode`](#auto_update_mode) +* [`auto_update_frequency`](#auto_update_frequency) + +##### `ensure` + +Data type: `Enum[present, latest]` + +Controls the way the Oh-My-ZSH repository is managed by Puppet. + +Default value: `latest` + +##### `set_sh` + +Data type: `Boolean` + +Controls whether to change the user shell to zsh. + +Default value: ``false`` + +##### `update_zshrc` + +Data type: `Enum[always, disabled, sync]` + +Controls the update of .zshrc from the upstream template. + +Default value: `disabled` + +##### `backup_zshrc` + +Data type: `Boolean` + +Controls if a backup of .zshrc need to be sone before changes. + +Default value: ``true`` + +##### `auto_update_mode` + +Data type: `Enum[auto, disabled, reminder]` + +Controls the update check for oh-my-zsh. + +Default value: `disabled` + +##### `auto_update_frequency` + +Data type: `Integer[0]` + +Controls the update check frequency. + +Default value: `14` + +### `ohmyzsh::plugins` + +Install and configure Oh-My-ZSH plugins for an user + +#### Parameters + +The following parameters are available in the `ohmyzsh::plugins` defined type: + +* [`plugins`](#plugins) +* [`custom_plugins`](#custom_plugins) + +##### `plugins` + +Data type: `Array[String]` + +List of built-in plugins. + +Default value: `['git']` + +##### `custom_plugins` + +Data type: `Hash[String, + Struct[ + { + source => Enum[git], + url => Stdlib::Httpsurl, + ensure => Enum[present, latest], + revision => Optional[String], + depth => Optional[Integer] + } + ] + ]` + +List of plugins to install and use. + +Default value: `{}` + +### `ohmyzsh::profile` + +Configure the ZSH profile for an user + +#### Parameters + +The following parameters are available in the `ohmyzsh::profile` defined type: + +* [`scripts`](#scripts) + +##### `scripts` + +Data type: `Hash[String[1], Stdlib::Filesource]` + +A hash of name => paths to all the scripts. + +Default value: `{}` + +### `ohmyzsh::theme` + +Configure the ZSH theme for an user + +#### Parameters + +The following parameters are available in the `ohmyzsh::theme` defined type: + +* [`theme`](#theme) + +##### `theme` + +Data type: `String` + +The name of the theme to use. + +Default value: `'clean'` + diff --git a/manifests/fetch/theme.pp b/manifests/fetch/theme.pp index a525e53..e6f4b18 100644 --- a/manifests/fetch/theme.pp +++ b/manifests/fetch/theme.pp @@ -1,3 +1,19 @@ +# +# @summary Install a theme from a defined source +# +# +# @param url The URL of the git repository (if `source` is `git`) or to the file +# @param source `git` for a repository, `undef` for a file to download or the source to pass to Puppet `file` +# @param content The content to pass to Puppet `file`, only if `source` and `url` is unset. +# @param filename The file name to use while saving the theme +# @param revision Revision to checkout while using Git +# @param depth Controls the shallow clone for Git +# +# +# @author Leon Brocard +# @author Zan Loy +# @author Rehan Mahmood +# define ohmyzsh::fetch::theme ( Optional[Stdlib::Httpurl] $url = undef, Optional[String] $source = undef, diff --git a/manifests/init.pp b/manifests/init.pp index a305ad9..7ce1e7f 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -1,14 +1,27 @@ +# +# @summary Install and configure Oh-My-ZSH +# +# This is the ohmyzsh module. It creates a profile directory under user home and allows +# custom scripts to setup and made avalible on the path. +# +# This module is called ohmyzsh as Puppet does not support hyphens in module +# names. +# # View README.md for full documentation. # -# === Authors # -# Leon Brocard -# Zan Loy -# Rehan Mahmood +# @param source Oh-My-ZSH repository. See data/ for the default value. +# @param home Default home base directory. See data/ for the default value. +# @param zsh_shell_path Path of the zsh executable. See data/ for the default value. +# @param installs Install and configure Oh-My-ZSH for users defined in this hash. See data/ for the default value. +# @param themes Configure the themes for users defined in this hash. See data/ for the default value. +# @param plugins Configure the plugins for users defined in this hash. See data/ for the default value. +# @param profiles Configure the profile for users defined in this hash. See data/ for the default value. # -# === Copyright # -# Copyright 2019 +# @author Leon Brocard +# @author Zan Loy +# @author Rehan Mahmood # class ohmyzsh ( Stdlib::Httpsurl $source, diff --git a/manifests/install.pp b/manifests/install.pp index 18ec4cc..52c1f8f 100644 --- a/manifests/install.pp +++ b/manifests/install.pp @@ -1,29 +1,18 @@ -# == Define: ohmyzsh::install # -# This is the ohmyzsh module. It installs oh-my-zsh for a user and changes -# their shell to zsh. It has been tested under Ubuntu. +# @summary Install and configure Oh-My-ZSH for an user # -# This module is called ohmyzsh as Puppet does not support hyphens in module -# names. # -# oh-my-zsh is a community-driven framework for managing your zsh configuration. +# @param ensure Controls the way the Oh-My-ZSH repository is managed by Puppet. +# @param set_sh Controls whether to change the user shell to zsh. +# @param update_zshrc Controls the update of .zshrc from the upstream template. +# @param backup_zshrc Controls if a backup of .zshrc need to be sone before changes. +# @param auto_update_mode Controls the update check for oh-my-zsh. +# @param auto_update_frequency Controls the update check frequency. # -# === Parameters # -# set_sh: (boolean) controls whether to change the user shell to zsh -# update_zshrc: (enum) controls the update of .zshrc from the upstream template. Default value is `disabled` -# auto_update_mode: (enum) controls the update check for oh-my-zsh. Default value is `disabled`. -# auto_update_frequency: (integer) controls the update check frequency. Default value is `14`. -# -# === Authors -# -# Leon Brocard -# Zan Loy -# Rehan Mahmood -# -# === Copyright -# -# Copyright 2022 +# @author Leon Brocard +# @author Zan Loy +# @author Rehan Mahmood # define ohmyzsh::install ( Enum[present, latest] $ensure = latest, diff --git a/manifests/plugins.pp b/manifests/plugins.pp index 20d9d8a..7fa8453 100644 --- a/manifests/plugins.pp +++ b/manifests/plugins.pp @@ -1,25 +1,13 @@ -# == Define: ohmyzsh::plugins # -# This is the ohmyzsh module. It installs oh-my-zsh for a user and changes -# their shell to zsh. It has been tested under Ubuntu. +# @summary Install and configure Oh-My-ZSH plugins for an user # -# This module is called ohmyzsh as Puppet does not support hyphens in module -# names. # -# oh-my-zsh is a community-driven framework for managing your zsh configuration. +# @param plugins List of built-in plugins. +# @param custom_plugins List of plugins to install and use. # -# === Parameters # -# plugins: (string) space separated list of tmux plugins -# -# === Authors -# -# Leon Brocard -# Zan Loy -# -# === Copyright -# -# Copyright 2014 +# @author Leon Brocard +# @author Zan Loy # define ohmyzsh::plugins ( Array[String] $plugins = ['git'], diff --git a/manifests/profile.pp b/manifests/profile.pp index 7d973a0..ae798b2 100644 --- a/manifests/profile.pp +++ b/manifests/profile.pp @@ -1,19 +1,11 @@ -# == Define: ohmyzsh::profile # -# This is the ohmyzsh module. It creates a profile directory under user home and allows -# custom scripts to setup and made avalible on the path. +# @summary Configure the ZSH profile for an user # -# This module is called ohmyzsh as Puppet does not support hyphens in module -# names. # -# oh-my-zsh is a community-driven framework for managing your zsh configuration. -# -# === Parameters -# -# scripts: (array) An array of paths to all the scripts +# @param scripts A hash of name => paths to all the scripts. # define ohmyzsh::profile ( - Hash $scripts = {}, + Hash[String[1], Stdlib::Filesource] $scripts = {}, ) { include ohmyzsh diff --git a/manifests/theme.pp b/manifests/theme.pp index 77c7979..17a7d85 100644 --- a/manifests/theme.pp +++ b/manifests/theme.pp @@ -1,25 +1,12 @@ -# == Define: ohmyzsh::theme # -# This is the ohmyzsh module. It installs oh-my-zsh for a user and changes -# their shell to zsh. It has been tested under Ubuntu. +# @summary Configure the ZSH theme for an user # -# This module is called ohmyzsh as Puppet does not support hyphens in module -# names. # -# oh-my-zsh is a community-driven framework for managing your zsh configuration. +# @param theme The name of the theme to use. # -# === Parameters # -# set_sh: (boolean) whether to change the user shell to zsh -# -# === Authors -# -# Leon Brocard -# Zan Loy -# -# === Copyright -# -# Copyright 2014 +# @author Leon Brocard +# @author Zan Loy # define ohmyzsh::theme ( String $theme = 'clean', From 706a6f960bf1464a3d3e1209fae73fe824ac6c98 Mon Sep 17 00:00:00 2001 From: David Cachau Date: Thu, 20 Apr 2023 13:02:25 +0200 Subject: [PATCH 2/5] Change version of vcsrepo in fixture to respect metadata.json --- .fixtures.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.fixtures.yml b/.fixtures.yml index e6e58f6..3e752a2 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -4,6 +4,7 @@ fixtures: repo: "puppetlabs/stdlib" vcsrepo: repo: "puppetlabs/vcsrepo" + ref: "5.5.0" repositories: wget: "https://github.com/rehanone/puppet-wget.git" symlinks: From 35e71f01fd5a7cd9899231aee1ef1df307c3462e Mon Sep 17 00:00:00 2001 From: David Cachau Date: Mon, 24 Oct 2022 14:19:05 +0200 Subject: [PATCH 3/5] Add the ability to use concat for zshrc This will add the ability to give a preconfigured ZSH for the user and allow the configuration of Powerline instant prompt as it need to be on top of the zshrc file This commit also include an example code for this case --- REFERENCE.md | 14 ++ data/common.yaml | 1 + examples/concat-with-local-overrides.pp | 38 +++++ examples/concat-with-powerlevel10k.pp | 43 ++++++ files/concat/zshrc-000-header.zsh-template | 1 + files/concat/zshrc-010-export.zsh-template | 3 + files/concat/zshrc-070-source.zsh-template | 2 + manifests/init.pp | 2 + manifests/install.pp | 113 ++------------- manifests/install/classic.pp | 131 ++++++++++++++++++ manifests/install/concat.pp | 58 ++++++++ manifests/plugins.pp | 19 ++- manifests/profile.pp | 28 ++-- manifests/theme.pp | 19 ++- metadata.json | 4 + .../concat/zshrc-050-update.zsh-template.epp | 7 + 16 files changed, 365 insertions(+), 118 deletions(-) create mode 100644 examples/concat-with-local-overrides.pp create mode 100644 examples/concat-with-powerlevel10k.pp create mode 100644 files/concat/zshrc-000-header.zsh-template create mode 100644 files/concat/zshrc-010-export.zsh-template create mode 100644 files/concat/zshrc-070-source.zsh-template create mode 100644 manifests/install/classic.pp create mode 100644 manifests/install/concat.pp create mode 100644 templates/concat/zshrc-050-update.zsh-template.epp diff --git a/REFERENCE.md b/REFERENCE.md index 494996a..a3c27ac 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -10,12 +10,19 @@ ### Defined types +#### Public Defined types + * [`ohmyzsh::fetch::theme`](#ohmyzshfetchtheme): Install a theme from a defined source * [`ohmyzsh::install`](#ohmyzshinstall): Install and configure Oh-My-ZSH for an user * [`ohmyzsh::plugins`](#ohmyzshplugins): Install and configure Oh-My-ZSH plugins for an user * [`ohmyzsh::profile`](#ohmyzshprofile): Configure the ZSH profile for an user * [`ohmyzsh::theme`](#ohmyzshtheme): Configure the ZSH theme for an user +#### Private Defined types + +* `ohmyzsh::install::classic`: Manage the zsh file with the original mode (file copy from the repository) +* `ohmyzsh::install::concat`: Manage the zsh file with concat + ## Classes ### `ohmyzsh` @@ -39,6 +46,7 @@ The following parameters are available in the `ohmyzsh` class: * [`themes`](#themes) * [`plugins`](#plugins) * [`profiles`](#profiles) +* [`concat`](#concat) ##### `source` @@ -82,6 +90,12 @@ Data type: `Hash` Configure the profile for users defined in this hash. See data/ for the default value. +##### `concat` + +Data type: `Boolean` + +Use the concat module to manage .zshrc files. + ## Defined types ### `ohmyzsh::fetch::theme` diff --git a/data/common.yaml b/data/common.yaml index 3e89eb6..a7bf402 100644 --- a/data/common.yaml +++ b/data/common.yaml @@ -7,3 +7,4 @@ ohmyzsh::installs: {} ohmyzsh::themes: {} ohmyzsh::plugins: {} ohmyzsh::profiles: {} +ohmyzsh::concat: false diff --git a/examples/concat-with-local-overrides.pp b/examples/concat-with-local-overrides.pp new file mode 100644 index 0000000..0a73057 --- /dev/null +++ b/examples/concat-with-local-overrides.pp @@ -0,0 +1,38 @@ +class { 'ohmyzsh': + concat => true, +} + +# for a single user +ohmyzsh::install { 'root': + set_sh => true, + auto_update_mode => reminder, + auto_update_frequency => 7, +} + +file { '/root/.zshrc.local': + ensure => file, + replace => 'no', + owner => 'root', + group => 'root', + mode => '0644', + content => "# Use this file to customize ZSH, it's not managed by Puppet", +} + +concat::fragment { '/root/.zshrc:puppet': + target => '/root/.zshrc', + content => "### Use the file ~/.zshrc.local for your changes\n", + order => '000', +} + +concat::fragment { '/root/.zshrc:load-local': + target => '/root/.zshrc', + content => @("EOF"/L) + # Load local zshrc if exist + if [ -f ~/.zshrc.local ] + then + source ~/.zshrc.local + fi + | EOF + , + order => '099', +} diff --git a/examples/concat-with-powerlevel10k.pp b/examples/concat-with-powerlevel10k.pp new file mode 100644 index 0000000..1c0abb4 --- /dev/null +++ b/examples/concat-with-powerlevel10k.pp @@ -0,0 +1,43 @@ +class { 'ohmyzsh': + concat => true, +} + +# for a single user +ohmyzsh::install { 'root': + set_sh => true, + auto_update_mode => reminder, + auto_update_frequency => 7, +} + +ohmyzsh::fetch::theme { 'root': + filename => 'powerlevel10k', + source => 'git', + depth => 1, + url => 'https://github.com/romkatv/powerlevel10k.git', +} + +ohmyzsh::theme { 'root': + theme => 'powerlevel10k/powerlevel10k', +} + +ohmyzsh::plugins { 'root': + plugins => ['git', 'github'], +} + +file { '/root/.p10k.zsh': + owner => 'root', + group => 'root', + content => 'YOUR P10K CONFIGURATION FILE', +} + +concat::fragment { '/root/.zshrc:p10k-instant-prompt': + target => '/root/.zshrc', + content => 'YOUR P10K INSTANT PROMPT SNIPPET', + order => '005', +} + +concat::fragment { '/root/.zshrc:p10k-load': + target => '/root/.zshrc', + content => "[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh\n", + order => '095', +} diff --git a/files/concat/zshrc-000-header.zsh-template b/files/concat/zshrc-000-header.zsh-template new file mode 100644 index 0000000..c5d132c --- /dev/null +++ b/files/concat/zshrc-000-header.zsh-template @@ -0,0 +1 @@ +### This file is managed by Puppet, any changes will be lost diff --git a/files/concat/zshrc-010-export.zsh-template b/files/concat/zshrc-010-export.zsh-template new file mode 100644 index 0000000..1bfd879 --- /dev/null +++ b/files/concat/zshrc-010-export.zsh-template @@ -0,0 +1,3 @@ +### Puppet Concat: zshrc-010-export.zsh-template +# Path to your oh-my-zsh installation. +export ZSH=$HOME/.oh-my-zsh diff --git a/files/concat/zshrc-070-source.zsh-template b/files/concat/zshrc-070-source.zsh-template new file mode 100644 index 0000000..fce6641 --- /dev/null +++ b/files/concat/zshrc-070-source.zsh-template @@ -0,0 +1,2 @@ +### Puppet Concat: zshrc-070-source.zsh-template +source $ZSH/oh-my-zsh.sh diff --git a/manifests/init.pp b/manifests/init.pp index 7ce1e7f..f49d543 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -17,6 +17,7 @@ # @param themes Configure the themes for users defined in this hash. See data/ for the default value. # @param plugins Configure the plugins for users defined in this hash. See data/ for the default value. # @param profiles Configure the profile for users defined in this hash. See data/ for the default value. +# @param concat Use the concat module to manage .zshrc files. # # # @author Leon Brocard @@ -31,6 +32,7 @@ Hash $themes, Hash $plugins, Hash $profiles, + Boolean $concat, ) { create_resources('ohmyzsh::install', $ohmyzsh::installs) create_resources('ohmyzsh::theme', $ohmyzsh::themes) diff --git a/manifests/install.pp b/manifests/install.pp index 52c1f8f..83a2d8c 100644 --- a/manifests/install.pp +++ b/manifests/install.pp @@ -25,7 +25,6 @@ Integer[0] $auto_update_frequency = 14, ) { include ohmyzsh - $date_command = '$(date +\'%Y-%m-%dT%H:%M:%S%:z\')' if !defined(Package['git']) { package { 'git': @@ -76,105 +75,21 @@ user => $name, require => Package['git'], } - -> if $update_zshrc == sync { - if $backup_zshrc { - exec { "backup .zshrc ${name}": - command => "cp ${home}/.zshrc ${home}/.zshrc.bak.${date_command}", - path => ['/bin', '/usr/bin'], - onlyif => "test -f ${home}/.zshrc", - user => $name, - before => [ - File_Line["ohmyzsh::auto_update_frequency - ${name}"], - ], - subscribe => Vcsrepo["${home}/.oh-my-zsh"], - refreshonly => true, - } - } - -> exec { "ohmyzsh::cp .zshrc ${name}": - command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", - path => ['/bin', '/usr/bin'], - user => $name, - before => [ - File_Line["ohmyzsh::auto_update_frequency - ${name}"], - ], - subscribe => Vcsrepo["${home}/.oh-my-zsh"], - refreshonly => true, - } - } elsif $update_zshrc == disabled { - exec { "ohmyzsh::cp .zshrc ${name}": - creates => "${home}/.zshrc", - command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", - path => ['/bin', '/usr/bin'], - onlyif => "getent passwd ${name} | cut -d : -f 6 | xargs test -e", - user => $name, - } - } elsif $update_zshrc == always { - if $backup_zshrc { - exec { "backup .zshrc ${name}": - command => "cp ${home}/.zshrc ${home}/.zshrc.bak.${date_command}", - path => ['/bin', '/usr/bin'], - onlyif => "test -f ${home}/.zshrc", - user => $name, - } - } - -> exec { "ohmyzsh::cp .zshrc ${name}": - command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", - path => ['/bin', '/usr/bin'], - user => $name, - } - } - -> file_line { "ohmyzsh::auto_update_frequency - ${name}": - path => "${home}/.zshrc", - line => "zstyle ':omz:update' frequency ${auto_update_frequency}", - match => '.*zstyle\ \':omz:update\'\ frequency .*', - } - -> if $auto_update_mode == disabled { - file_line { "enable ohmyzsh::auto_update_mode disabled - ${name}": - path => "${home}/.zshrc", - line => "zstyle ':omz:update' mode disabled", - match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', + -> unless $ohmyzsh::concat { + ohmyzsh::install::classic { $name: + update_zshrc => $update_zshrc, + backup_zshrc => $backup_zshrc, + auto_update_mode => $auto_update_mode, + auto_update_frequency => $auto_update_frequency, + home => $home, + group => $group, } - file_line { "disable ohmyzsh::auto_update_mode auto - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode auto", - match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', - } - file_line { "disable ohmyzsh::auto_update_mode reminder - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode reminder", - match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', - } - } elsif $auto_update_mode == auto { - file_line { "enable ohmyzsh::auto_update_mode auto - ${name}": - path => "${home}/.zshrc", - line => "zstyle ':omz:update' mode auto", - match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', - } - file_line { "disable ohmyzsh::auto_update_mode disabled - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode disabled", - match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', - } - file_line { "disable ohmyzsh::auto_update_mode reminder - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode reminder", - match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', - } - } elsif $auto_update_mode == reminder { - file_line { "enable ohmyzsh::auto_update_mode reminder - ${name}": - path => "${home}/.zshrc", - line => "zstyle ':omz:update' mode reminder", - match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', - } - file_line { "disable ohmyzsh::auto_update_mode auto - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode auto", - match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', - } - file_line { "disable ohmyzsh::auto_update_mode disabled - ${name}": - path => "${home}/.zshrc", - line => "# zstyle ':omz:update' mode disabled", - match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', + } else { + ohmyzsh::install::concat { $name: + auto_update_mode => $auto_update_mode, + auto_update_frequency => $auto_update_frequency, + home => $home, + group => $group, } } # Fix permissions on '~/.oh-my-zsh/cache/completions' diff --git a/manifests/install/classic.pp b/manifests/install/classic.pp new file mode 100644 index 0000000..ed251e2 --- /dev/null +++ b/manifests/install/classic.pp @@ -0,0 +1,131 @@ +# +# @api private +# +# +# @summary Manage the zsh file with the original mode (file copy from the repository) +# +# +# @param update_zshrc Controls the update of .zshrc from the upstream template. +# @param auto_update_mode Controls the update check for oh-my-zsh. +# @param auto_update_frequency Controls the update check frequency. +# @param home Controls the home directory of the install +# @param group Controls the group of the files +# +# +# @author Leon Brocard +# @author Zan Loy +# @author Rehan Mahmood +# +define ohmyzsh::install::classic ( + Enum[always, disabled, sync] $update_zshrc, + Boolean $backup_zshrc, + Enum[auto, disabled, reminder] $auto_update_mode, + Integer[0] $auto_update_frequency, + String $home, + String $group, +) { + assert_private() + $date_command = '$(date +\'%Y-%m-%dT%H:%M:%S%:z\')' + + if $update_zshrc == sync { + if $backup_zshrc { + exec { "backup .zshrc ${name}": + command => "cp ${home}/.zshrc ${home}/.zshrc.bak.${date_command}", + path => ['/bin', '/usr/bin'], + onlyif => "test -f ${home}/.zshrc", + user => $name, + before => [ + File_Line["ohmyzsh::auto_update_frequency - ${name}"], + ], + subscribe => Vcsrepo["${home}/.oh-my-zsh"], + refreshonly => true, + } + } + -> exec { "ohmyzsh::cp .zshrc ${name}": + command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", + path => ['/bin', '/usr/bin'], + user => $name, + before => [ + File_Line["ohmyzsh::auto_update_frequency - ${name}"], + ], + subscribe => Vcsrepo["${home}/.oh-my-zsh"], + refreshonly => true, + } + } elsif $update_zshrc == disabled { + exec { "ohmyzsh::cp .zshrc ${name}": + creates => "${home}/.zshrc", + command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", + path => ['/bin', '/usr/bin'], + onlyif => "getent passwd ${name} | cut -d : -f 6 | xargs test -e", + user => $name, + } + } elsif $update_zshrc == always { + if $backup_zshrc { + exec { "backup .zshrc ${name}": + command => "cp ${home}/.zshrc ${home}/.zshrc.bak.${date_command}", + path => ['/bin', '/usr/bin'], + onlyif => "test -f ${home}/.zshrc", + user => $name, + } + } + -> exec { "ohmyzsh::cp .zshrc ${name}": + command => "cp ${home}/.oh-my-zsh/templates/zshrc.zsh-template ${home}/.zshrc", + path => ['/bin', '/usr/bin'], + user => $name, + } + } + -> file_line { "ohmyzsh::auto_update_frequency - ${name}": + path => "${home}/.zshrc", + line => "zstyle ':omz:update' frequency ${auto_update_frequency}", + match => '.*zstyle\ \':omz:update\'\ frequency .*', + } + -> if $auto_update_mode == disabled { + file_line { "enable ohmyzsh::auto_update_mode disabled - ${name}": + path => "${home}/.zshrc", + line => "zstyle ':omz:update' mode disabled", + match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', + } + file_line { "disable ohmyzsh::auto_update_mode auto - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode auto", + match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', + } + file_line { "disable ohmyzsh::auto_update_mode reminder - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode reminder", + match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', + } + } elsif $auto_update_mode == auto { + file_line { "enable ohmyzsh::auto_update_mode auto - ${name}": + path => "${home}/.zshrc", + line => "zstyle ':omz:update' mode auto", + match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', + } + file_line { "disable ohmyzsh::auto_update_mode disabled - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode disabled", + match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', + } + file_line { "disable ohmyzsh::auto_update_mode reminder - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode reminder", + match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', + } + } elsif $auto_update_mode == reminder { + file_line { "enable ohmyzsh::auto_update_mode reminder - ${name}": + path => "${home}/.zshrc", + line => "zstyle ':omz:update' mode reminder", + match => '.*zstyle\ \':omz:update\'\ mode\ reminder.*', + } + file_line { "disable ohmyzsh::auto_update_mode auto - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode auto", + match => '.*zstyle\ \':omz:update\'\ mode\ auto.*', + } + file_line { "disable ohmyzsh::auto_update_mode disabled - ${name}": + path => "${home}/.zshrc", + line => "# zstyle ':omz:update' mode disabled", + match => '.*zstyle\ \':omz:update\'\ mode\ disabled.*', + } + } +} diff --git a/manifests/install/concat.pp b/manifests/install/concat.pp new file mode 100644 index 0000000..8b91d89 --- /dev/null +++ b/manifests/install/concat.pp @@ -0,0 +1,58 @@ +# +# @api private +# +# +# @summary Manage the zsh file with concat +# +# +# @param auto_update_mode Controls the update check for oh-my-zsh. +# @param auto_update_frequency Controls the update check frequency. +# @param home Controls the home directory of the install +# @param group Controls the group of the files +# +# +# @author David Cachau +# +define ohmyzsh::install::concat ( + Enum[auto, disabled, reminder] $auto_update_mode, + Integer[0] $auto_update_frequency, + String $home, + String $group, +) { + assert_private() + + concat { "${home}/.zshrc": + ensure => present, + owner => $name, + group => $group, + mode => '0644', + require => Vcsrepo["${home}/.oh-my-zsh"], + } + + concat::fragment { "${home}/.zshrc:000-header": + target => "${home}/.zshrc", + content => "puppet:///modules/${module_name}/concat/zshrc-000-header.zsh-template", + order => '000', + } + + concat::fragment { "${home}/.zshrc:010-export": + target => "${home}/.zshrc", + source => "puppet:///modules/${module_name}/concat/zshrc-010-export.zsh-template", + order => '010', + } + + concat::fragment { "${home}/.zshrc:050-update": + target => "${home}/.zshrc", + content => epp("${module_name}/concat/zshrc-050-update.zsh-template.epp", { + auto_update_mode => $auto_update_mode, + auto_update_frequency => $auto_update_frequency, + }), + order => '050', + } + + concat::fragment { "${home}/.zshrc:070-source": + target => "${home}/.zshrc", + source => "puppet:///modules/${module_name}/concat/zshrc-070-source.zsh-template", + order => '070', + } +} diff --git a/manifests/plugins.pp b/manifests/plugins.pp index 7fa8453..8cb3b4b 100644 --- a/manifests/plugins.pp +++ b/manifests/plugins.pp @@ -53,10 +53,19 @@ $plugins_real = join($all_plugins, ' ') - file_line { "${name}-${plugins_real}-install": - path => "${home}/.zshrc", - line => "plugins=(${plugins_real})", - match => '^plugins=', - require => Ohmyzsh::Install[$name], + unless $ohmyzsh::concat { + file_line { "${name}-${plugins_real}-install": + path => "${home}/.zshrc", + line => "plugins=(${plugins_real})", + match => '^plugins=', + require => Ohmyzsh::Install[$name], + } + } else { + concat::fragment { "${home}/.zshrc:plugins": + target => "${home}/.zshrc", + content => "plugins=(${plugins_real})\n", + order => '060', + require => Ohmyzsh::Install[$name], + } } } diff --git a/manifests/profile.pp b/manifests/profile.pp index ae798b2..4ca1902 100644 --- a/manifests/profile.pp +++ b/manifests/profile.pp @@ -28,15 +28,25 @@ owner => $name, require => User[$name], } - -> file_line { "${home}-profile": - ensure => present, - line => 'for f in ~/profile/*; do source "$f"; done', - match => 'for f in ~/profile/*; do source "$f"; done', - path => $shell_resource_path, - require => [ - User[$name], - Ohmyzsh::Install[$name], - ], + + unless $ohmyzsh::concat { + file_line { "${home}-profile": + ensure => present, + line => 'for f in ~/profile/*; do source "$f"; done', + match => 'for f in ~/profile/*; do source "$f"; done', + path => $shell_resource_path, + require => [ + User[$name], + Ohmyzsh::Install[$name], + ], + } + } else { + concat::fragment { "${home}/.zshrc:profile": + target => "${home}/.zshrc", + content => "for f in ~/profile/*; do source \"\$f\"; done\n", + order => '080', + require => Ohmyzsh::Install[$name], + } } $scripts.each |$script_name, $script_path| { diff --git a/manifests/theme.pp b/manifests/theme.pp index 17a7d85..152b16d 100644 --- a/manifests/theme.pp +++ b/manifests/theme.pp @@ -24,10 +24,19 @@ $group = $name } - file_line { "${name}-${theme}-install": - path => "${home}/.zshrc", - line => "ZSH_THEME=\"${theme}\"", - match => '^ZSH_THEME', - require => Ohmyzsh::Install[$name], + unless $ohmyzsh::concat { + file_line { "${name}-${theme}-install": + path => "${home}/.zshrc", + line => "ZSH_THEME=\"${theme}\"", + match => '^ZSH_THEME', + require => Ohmyzsh::Install[$name], + } + } else { + concat::fragment { "${home}/.zshrc:ZSH_THEME": + target => "${home}/.zshrc", + content => "ZSH_THEME=\"${theme}\"\n", + order => '020', + require => Ohmyzsh::Install[$name], + } } } diff --git a/metadata.json b/metadata.json index 5814f44..990726c 100644 --- a/metadata.json +++ b/metadata.json @@ -19,6 +19,10 @@ { "name": "rehan-wget", "version_requirement": ">= 1.0.0 < 3.0.0" + }, + { + "name": "puppetlabs-concat", + "version_requirement": ">= 4.1.0 < 8.0.0" } ], "operatingsystem_support": [ diff --git a/templates/concat/zshrc-050-update.zsh-template.epp b/templates/concat/zshrc-050-update.zsh-template.epp new file mode 100644 index 0000000..92b7b04 --- /dev/null +++ b/templates/concat/zshrc-050-update.zsh-template.epp @@ -0,0 +1,7 @@ +<%- | + Enum[auto, disabled, reminder] $auto_update_mode, + Integer[0] $auto_update_frequency, +| -%> +### Puppet Concat: zshrc-050-update.zsh-template.epp +zstyle ':omz:update' mode <%= $auto_update_mode %> +zstyle ':omz:update' frequency <%= $auto_update_frequency %> From 19b5a33ea28e1314b245ec2d7dee8eec35d3674b Mon Sep 17 00:00:00 2001 From: David Cachau Date: Thu, 20 Apr 2023 15:29:19 +0200 Subject: [PATCH 4/5] Add the ability to use concat for zshrc This will add the ability to give a preconfigured ZSH for the user and allow the configuration of Powerline instant prompt as it need to be on top of the zshrc file This commit also include an example code for this case --- manifests/install/concat.pp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/install/concat.pp b/manifests/install/concat.pp index 8b91d89..f3853ac 100644 --- a/manifests/install/concat.pp +++ b/manifests/install/concat.pp @@ -31,7 +31,7 @@ concat::fragment { "${home}/.zshrc:000-header": target => "${home}/.zshrc", - content => "puppet:///modules/${module_name}/concat/zshrc-000-header.zsh-template", + source => "puppet:///modules/${module_name}/concat/zshrc-000-header.zsh-template", order => '000', } From 2b2d5efed9904fa5886b51a17fe838bc5788da85 Mon Sep 17 00:00:00 2001 From: David Cachau Date: Mon, 3 Jun 2024 17:23:18 +0200 Subject: [PATCH 5/5] Update metadata Allow concat 8.x and 9.x --- metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metadata.json b/metadata.json index 990726c..d31c5d5 100644 --- a/metadata.json +++ b/metadata.json @@ -22,7 +22,7 @@ }, { "name": "puppetlabs-concat", - "version_requirement": ">= 4.1.0 < 8.0.0" + "version_requirement": ">= 4.1.0 < 10.0.0" } ], "operatingsystem_support": [