Make custom macros on your keyboard or gamepad, make on-screen buttons in any app, and unlock new functionality from your volume buttons!
Key Mapper supports a huge variety of buttons and keys:
ALL your phone buttons (volume AND side key)
Game controllers (D-pad, ABXY, and most others)
Keyboards
Headsets and headphones
Fingerprint sensor
Most devices are already supported, with new devices being added over time. Let us know if it’s not working for you and we can prioritize your device.
Not currently supported:
Mouse buttons
Joysticks and triggers (LT,RT) on gamepads
Not enough keys? Design your own on-screen button layouts and remap those just like real keys!
What shortcuts can I make?
With over 100 individual actions, the sky is the limit.
Build complex macros with screen taps and gestures, keyboard inputs, open apps, control media, and even send intents directly to other apps.
How much control do I have?
TRIGGERS: You decide how to trigger a key map. Long press, double press, press as many times as you like! Combine keys on different devices, and even include your on-screen buttons.
ACTIONS: Design specific macros for what you want to do. Combine over 100 actions, and choose the delay between each one. Set repeating actions to automate and speed up slow tasks.
CONSTRAINTS: You choose when key maps should run and when they shouldn’t. Only need it in one specific app? Or when media is playing? On your lockscreen? Constrain your key maps for maximum control.
Make custom macros on your keyboard or gamepad, make on-screen buttons in any app, and unlock new functionality from your volume buttons!
Key Mapper supports a huge variety of buttons and keys:
ALL your phone buttons (volume AND side key)
Game controllers (D-pad, ABXY, and most others)
Keyboards
Headsets and headphones
Fingerprint sensor
Most devices are already supported, with new devices being added over time. Let us know if it’s not working for you and we can prioritize your device.
Not currently supported:
Mouse buttons
Joysticks and triggers (LT,RT) on gamepads
Not enough keys? Design your own on-screen button layouts and remap those just like real keys!
What shortcuts can I make?
With over 100 individual actions, the sky is the limit.
Build complex macros with screen taps and gestures, keyboard inputs, open apps, control media, and even send intents directly to other apps.
How much control do I have?
TRIGGERS: You decide how to trigger a key map. Long press, double press, press as many times as you like! Combine keys on different devices, and even include your on-screen buttons.
ACTIONS: Design specific macros for what you want to do. Combine over 100 actions, and choose the delay between each one. Set repeating actions to automate and speed up slow tasks.
CONSTRAINTS: You choose when key maps should run and when they shouldn’t. Only need it in one specific app? Or when media is playing? On your lockscreen? Constrain your key maps for maximum control.
This module installs, configures and manages everything on NFS clients and servers.
This module is a complete refactor of the module haraldsk/nfs, because Harald Skoglund sadly is not
maintaining his module actively anymore. It is stripped down to use only the class ‘nfs’
and parametrized to act as a server, client or both with the parameters ‘server_enabled’
and ‘client_enabled’. It also has some dependencies on newer stdlib functions like ‘difference’.
It supports the OS Families Ubuntu, Debian, Redhat, SUSE, Gentoo and Archlinux. It supports also Strict Variables, so if you pass all
OS specific parameters correctly it should work on your preferred OS too. Feedback, bugreports,
and feature requests are always welcome, visit https://github.com/voxpupuli/puppet-nfs or send me an email.
When you are using a puppet version 3.x like it is shipped with Redhat Satellite 6, please use a version 1.x.x from puppet forge
or the branch puppet3 when cloning directly from Github. (Note: #49 (comment)).
I’ll recommend using puppet >= 4.6.1, puppet versions up until 4.6.0 had various issues.
If you want to contribute, please do a fork on github, create a branch “feature name” with your
features and do a pull request.
Warning: I’ve introduced new dependencies with version 2.1.0 which were needed to fix buggy rpcbind-socket restarting with systemd:
puppetlabs/transition
herculesteam/augeasproviders_core
herculesteam/augeasproviders_shellvar
Setup
What puppet-nfs affects
This module can be used to configure your nfs client and/or server, it could export
nfs mount resources via storeconfigs or simply mount nfs shares on a client. You can
also easily use the create_resources function when you store your exports i.e. via hiera.
Setup requirements
This Module depends on puppetlabs-stdlib >= 4.5.0 and puppetlabs-concat >= 1.1.2, you need to
have these modules installed to use puppet-nfs module.
Beginning with puppet-nfs
On a nfs server the following code is sufficient to get all packages installed and services
running to use nfs:
nodeserver {
class { '::nfs':
server_enabled => true,
}
}
On a client the following code is sufficient:
nodeserver {
class { '::nfs':
client_enabled => true,
}
}
Usage
Simple NFSv3 server and client example
This will export /data_folder on the server and automagically mount it on client.
nodeserver {
class { '::nfs':
server_enabled => true
}
nfs::server::export{ '/data_folder':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)'
}
}
# By default, mounts are mounted in the same folder on the clients as# they were exported from on the servernodeclient {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>>
}
NFSv3 multiple exports, servers and multiple node example
nodeserver1 {
class { '::nfs':
server_enabled => true,
}
nfs::server::export { '/data_folder':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)',
}
nfs::server::export { '/homeexport':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,root_squash)',
mount => '/srv/home',
}
}
nodeserver2 {
class { '::nfs':
server_enabled => true,
}
# ensure is passed to mount, which will make the client not mount it# the directory automatically, just add it to fstabnfs::server::export { '/media_library':
ensure => 'present',
nfstag => 'media',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)',
}
}
nodeclient {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>>
}
# Using a storeconfig override, to change ensure option, so we mount# all sharesnodegreedy_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>> {
ensure => 'mounted',
}
}
# only the mount tagged as media# also override mount pointnodemedia_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| nfstag == 'media' |>> {
ensure => 'mounted',
mount => '/import/media',
}
}
# All @@nfs::server::mount storeconfigs can be filtered by parameters# Also all parameters can be overridden (not that it's smart to do# so).# Check out the doc on exported resources for more info:# http://docs.puppetlabs.com/guides/exported_resources.htmlnodesingle_server_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| server == 'server1' |>> {
ensure => 'absent',
}
}
NFSv4 Simple example
# We use the $::domain fact for the Domain setting in# /etc/idmapd.conf.# For NFSv4 to work this has to be equal on servers and clients# set it manually if unsure.## All nfsv4 exports are bind mounted into /export/$mount_name# and mounted on /srv/$mount_name on the client.# Both values can be overridden through parameters both globally# and on individual nodes.nodeserver {
file { ['/data_folder', '/homeexport']:
ensure => 'directory',
}
class { '::nfs':
server_enabled => true,
nfs_v4 => true,
nfs_v4_idmap_domain => 'example.com',
nfs_v4_export_root => '/export',
nfs_v4_export_root_clients => '*(rw,fsid=0,insecure,no_subtree_check,async,no_root_squash)',
}
nfs::server::export { '/data_folder':
ensure => 'mounted',
clients => '*(rw,insecure,async,no_root_squash,no_subtree_check)',
}
nfs::server::export { '/homeexport':
ensure => 'mounted',
clients => '*(rw,insecure,async,root_squash,no_subtree_check)',
mount => '/srv/home',
}
}
# By default, mounts are mounted in the same folder on the clients as# they were exported from on the servernodeclient {
class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
}
Nfs::Client::Mount <<| |>>
}
# We can also mount the NFSv4 Root directly through nfs::client::mount::nfsv4::root.# By default /srv will be used for as mount point, but can be overriden through# the 'mounted' option.nodeclient2 {
$server = 'server'class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
}
Nfs::Client::Mount::Nfs_v4::Root <<| server == $server |>> {
mount => "/srv/${server}",
}
}
NFSv4 insanely overcomplicated reference example
# and on individual nodes.nodeserver {
class { '::nfs':
server_enabled => true,
nfs_v4 => true,
# Below are defaultsnfs_v4_idmap_domain => $::domain,
nfs_v4_export_root => '/export',
# Default access settings of /export rootnfs_v4_export_root_clients =>
"*.${::domain}(ro,fsid=root,insecure,no_subtree_check,async,root_squash)",
}
nfs::server::export { '/data_folder':
# These are the defaultsensure => 'mounted',
# rbind or bind mounting of folders bindmounted into /export# google itbind => 'rbind',
# everything below here is propogated by to storeconfigs# to clients## Directory where we want export mounted on clientmount => undef,
remounts => false,
atboot => false,
# Don't remove that option, but feel free to add more.options_nfs => '_netdev',
# If set will mount share inside /srv (or overridden mount_root)# and then bindmount to another directory elsewhere in the fs -# for fanatics.bindmount => undef,
# Used to identify a catalog item for filtering by by# storeconfigs, kick ass.nfstag => 'kick-ass',
# copied directly into /etc/exports as a string, for simplicityclients => '10.0.0.0/24(rw,insecure,no_subtree_check,async,no_root_squash)',
}
}
nodeclient {
class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
nfs_v4_idmap_domain => $::domain,
nfs_v4_mount_root => '/srv',
}
# We can as you by now know, override options set on the server# on the client node.# Be careful. Don't override mount points unless you are sure# that only one export will match your filter!
Nfs::Client::Mount <<| nfstag == 'kick-ass' |>> {
# Directory where we want export mounted on clientmount => undef,
remounts => false,
atboot => false,
# Don't remove that option, but feel free to add more.options_nfs => '_netdev',
# If set will mount share inside /srv (or overridden mount_root)# and then bindmount to another directory elsewhere in the fs -# for fanatics.bindmount => undef,
}
}
Simple create nfs export resources with hiera example
nfs::client: Includes all relevant classes for configuring as a client.
nfs::client::config: Handles the configuration files.
nfs::client::package: Handles the packages.
nfs::client::service: Handles the services.
nfs::server: Includes all relevant classes for configuring as a server.
nfs::server::config: Handles the configuration files.
nfs::server::package: Handles the packages.
nfs::server::service: Handles the services.
nfs::params: Includes all os specific parameters.
Private Defines
nfs::bindmount: Creates the bindmounts of nfs 3 exports.
nfs::nfsv4_bindmount: Creates the bindmounts of nfs 4 exports.
nfs::create_export: Creates the nfs exports.
nfs::mkdir: Creates directories recursive.
Parameters
Class: ::nfs
The following parameters are available in the ::nfs class:
ensure
String. Controls if the managed resources shall be present or
absent. If set to absent:
The managed software packages are being uninstalled.
Any traces of the packages will be purged as good as possible. This may
include existing configuration files. The exact behavior is provider
dependent. Q.v.:
System modifications (if any) will be reverted as good as possible
(e.g. removal of created users, services, changed log settings, …).
This is thus destructive and should be used with care.
Defaults to present.
server_enabled
Boolean. If set to true, this module will configure the node
to act as a nfs server.
client_enabled
Boolean. If set to true, this module will configure the node
to act as a nfs client, you can use the exported mount resources
from configured servers.
storeconfigs_enabled
Boolean. If set to false, this module will not export any
resources as storeconfigs. Defaults to true.
nfs_v4
Boolean. If set to true, this module will use nfs version 4
for exporting and mounting nfs resources. It defaults to true.
nfs_v4_client
Boolean. If set to true, this module will use nfs version 4
for mounting nfs resources. If set to false it will use nfs
version 3 to mount nfs resources. It defaults to true.
exports_file
String. It defines the location of the file with the nfs export resources used
by the nfs server.
idmapd_file
String. It defines the location of the file with the idmapd settings.
defaults_file
String. It defines the location of the file with the nfs settings.
manage_packages
Boolean. It defines if the packages should be managed through this module
server_packages
Array. It defines the packages needed to be installed for acting as
a nfs server
server_package_ensure
String. It defines the packages state – any of present, installed,
absent, purged, held, latest
client_packages
Array. It defines the packages needed to be installed for acting as
a nfs client
client_package_ensure
String. It defines the packages state – any of present, installed,
absent, purged, held, latest
manage_server_service
Boolean. Defines if module should manage server_service
manage_server_servicehelper
Boolean. Defines if module should manage server_servicehelper
manage_client_service
Boolean. Defines if module should manage client_service
server_service_name
String. It defines the servicename of the nfs server service
server_service_ensure
Boolean. It defines the service parameter ensure for nfs server services.
server_service_enable
Boolean. It defines the service parameter enable for nfs server service.
server_service_hasrestart
Boolean. It defines the service parameter hasrestart for nfs server service.
server_service_hasstatus
Boolean. It defines the service parameter hasstatus for nfs server service.
server_service_restart_cmd
String. It defines the service parameter restart for nfs server service.
server_nfsv4_servicehelper
Array. It defines the service helper like idmapd for servers configured with
nfs version 4.
client_services
Nested Hash. It defines the servicenames need to be started when acting as a nfs client
client_nfsv4_services
Nested Hash. It defines the servicenames need to be started when acting as a nfs client
version 4.
client_service_hasrestart
Boolean. It defines the service parameter hasrestart for nfs client services.
client_service_hasstatus
Boolean. It defines the service parameter hasstatus for nfs client services.
client_idmapd_setting
Array. It defines the Augeas parameter added in defaults_file when acting as a nfs
version 4 client.
client_nfs_fstype
String. It defines the name of the nfs filesystem, when adding entries to /etc/fstab
on a client node.
client_nfs_options
String. It defines the options for the nfs filesystem, when adding entries to /etc/fstab
on a client node.
client_nfsv4_fstype
String. It defines the name of the nfs version 4 filesystem, when adding entries
to /etc/fstab on a client node.
client_nfsv4_options
String. It defines the options for the nfs version 4filesystem, when adding entries
to /etc/fstab on a client node.
nfs_v4_export_root
String. It defines the location where nfs version 4 exports should be bindmounted to
on a server node. Defaults to /export.
nfs_v4_export_root_clients
String. It defines the clients that are allowed to mount nfs version 4 exports and
includes the option string. Defaults to
*.${::domain}(ro,fsid=root,insecure,no_subtree_check,async,root_squash).
nfs_v4_mount_root
String. It defines the location where nfs version 4 clients find the mount root
on a server node. Defaults to /srv.
nfs_v4_idmap_domain
String. It defines the name of the idmapd domain setting in idmapd_file needed
to be set to the same value on a server and client node to do correct uid and gid
mapping. Defaults to $::domain.
nfsv4_bindmount_enable
Boolean. It defines if the module should create a bindmount for the export.
Defaults to true.
client_need_gssd
Boolean. If true, sets NEED_GSSD=yes in /etc/defauls/nfs-common, usable on Debian/Ubuntu
client_gssd_service
Boolean. If true enable rpc-gssd service.
client_gssd_options
String. Options for rpc-gssd service. Defaults to ''
client_d9_gssdopt_workaround
Boolean. If enabled, workaround for passing gssd_options which is broken on Debian 9. Usable only on Debian 9
nfs_v4_idmap_localrealms
String or Array. ‘Local-Realms’ option for idmapd. Defaults to ''
nfs_v4_idmap_cache
Integer. ‘Cache-Expiration’ option for idmapd. Defaults to 0 – unused.
manage_nfs_v4_idmap_nobody_mapping
Boolean. Enable setting Nobody mapping in idmapd. Defaults to false.
nfs_v4_idmap_nobody_user
String. ‘Nobody-User’ option for idmapd. Defaults to nobody.
nfs_v4_idmap_nobody_group
String. ‘Nobody-Group’ option for idmapd. Defaults to nobody or nogroup.
client_rpcbind_config
String. It defines the location of the file with the rpcbind config.
client_rpcbind_optname
String. It defines the name of env variable that holds the rpcbind config. E.g. OPTIONS for Debian
client_rpcbind_opts
String. Options for rpcbind service.
Define: ::nfs::client::mount
The following parameters are available in the ::nfs::client::mount define:
server
String. Sets the ip address of the server with the nfs export
share
String. Sets the name of the nfs share on the server
ensure
String. Sets the ensure parameter of the mount.
remounts
String. Sets the remounts parameter of the mount.
atboot
String. Sets the atboot parameter of the mount.
options_nfsv4
String. Sets the mount options for a nfs version 4 mount.
options_nfs
String. Sets the mount options for a nfs mount.
bindmount
String. When not undef it will create a bindmount on the node
for the nfs mount.
nfstag
String. Sets the nfstag parameter of the mount.
nfs_v4
Boolean. When set to true, it uses nfs version 4 to mount a share.
owner
String. Set owner of mount dir
group
String. Set group of mount dir
mode
String. Set mode of mount dir
mount_root
String. Overwrite mount root if differs from server config
Define: ::nfs::server::export
The following parameters are available in the ::nfs::server::export define:
clients
String. Sets the allowed clients and options for the export in the exports file.
Defaults to localhost(ro)
bind
String. Sets the bind options setted in /etc/fstab for the bindmounts created.
Defaults to rbind. When you have any submounts in your exported folders,
the rbind option will submount them in the bindmount folder. You have to set the
crossmnt option in your nfs export to have the submounts from rbind available
on your client. Your export should look like this:
If you want to have specific package versions installed you may manage the needed packages outside of this
module (use manage_packages => false). It is only tested to use ‘present’, ‘installed’, ‘absent’,
‘purged’, ‘held’ and ‘latest’ as argument for the parameters server_package_ensure and client_package_ensure.
Development
Derdanne modules are open projects. So if you want to make this module even better,
you can contribute to this module on Github.
Before pushing PRs to Github i would recommend you to test your work locally. So you can ensure all test builds
on Travis CI were passing. I have prepared an easy way to test your code locally with the help of Docker.
For running the complete static code analysis, it is sufficient to run a make test-all.
Default settings
I have set some defaults which you can change by setting the following environment variables.
PUPPET_VERSION
Changes the puppet version which will be used for the tests. Defaults to 6.0.
STRICT_VARIABLES
Sets strict variables on or off. Defaults to yes.
RVM
Sets the ruby version which will be used for the tests. Defaults to 2.4.1.
BEAKER_set
Sets the beaker docker target host. Defaults to ubuntu-20.04.
PUPPET_collection
Sets the puppet version for acceptance tests. Defaults to puppet6.
Running tests
You can run the following commands to setup and run the testsuite on your local machine.
make build
Build a docker image with a Ruby version which is not available on Docker hub. Check out
https://hub.docker.com/r/derdanne/rvm/ to see if i have already prepared a rvm build for the ruby version
you want to test. Take a look at the Dockerfile located in spec/local-testing if you want to customize
your builds.
make pull
Pull a prebuild rvm docker image with the Ruby version defined in the variable RVM.
This plugin was originally authored by Daniel Klockenkaemper dk@marketing-factory.de.
The maintainer preferred that Vox Pupuli take ownership of the module for future improvement and maintenance.
Existing pull requests and issues were transferred over, please fork and continue to contribute here instead of Camptocamp.
This module installs, configures and manages everything on NFS clients and servers.
This module is a complete refactor of the module haraldsk/nfs, because Harald Skoglund sadly is not
maintaining his module actively anymore. It is stripped down to use only the class ‘nfs’
and parametrized to act as a server, client or both with the parameters ‘server_enabled’
and ‘client_enabled’. It also has some dependencies on newer stdlib functions like ‘difference’.
It supports the OS Families Ubuntu, Debian, Redhat, SUSE, Gentoo and Archlinux. It supports also Strict Variables, so if you pass all
OS specific parameters correctly it should work on your preferred OS too. Feedback, bugreports,
and feature requests are always welcome, visit https://github.com/voxpupuli/puppet-nfs or send me an email.
When you are using a puppet version 3.x like it is shipped with Redhat Satellite 6, please use a version 1.x.x from puppet forge
or the branch puppet3 when cloning directly from Github. (Note: #49 (comment)).
I’ll recommend using puppet >= 4.6.1, puppet versions up until 4.6.0 had various issues.
If you want to contribute, please do a fork on github, create a branch “feature name” with your
features and do a pull request.
Warning: I’ve introduced new dependencies with version 2.1.0 which were needed to fix buggy rpcbind-socket restarting with systemd:
puppetlabs/transition
herculesteam/augeasproviders_core
herculesteam/augeasproviders_shellvar
Setup
What puppet-nfs affects
This module can be used to configure your nfs client and/or server, it could export
nfs mount resources via storeconfigs or simply mount nfs shares on a client. You can
also easily use the create_resources function when you store your exports i.e. via hiera.
Setup requirements
This Module depends on puppetlabs-stdlib >= 4.5.0 and puppetlabs-concat >= 1.1.2, you need to
have these modules installed to use puppet-nfs module.
Beginning with puppet-nfs
On a nfs server the following code is sufficient to get all packages installed and services
running to use nfs:
nodeserver {
class { '::nfs':
server_enabled => true,
}
}
On a client the following code is sufficient:
nodeserver {
class { '::nfs':
client_enabled => true,
}
}
Usage
Simple NFSv3 server and client example
This will export /data_folder on the server and automagically mount it on client.
nodeserver {
class { '::nfs':
server_enabled => true
}
nfs::server::export{ '/data_folder':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)'
}
}
# By default, mounts are mounted in the same folder on the clients as# they were exported from on the servernodeclient {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>>
}
NFSv3 multiple exports, servers and multiple node example
nodeserver1 {
class { '::nfs':
server_enabled => true,
}
nfs::server::export { '/data_folder':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)',
}
nfs::server::export { '/homeexport':
ensure => 'mounted',
clients => '10.0.0.0/24(rw,insecure,async,root_squash)',
mount => '/srv/home',
}
}
nodeserver2 {
class { '::nfs':
server_enabled => true,
}
# ensure is passed to mount, which will make the client not mount it# the directory automatically, just add it to fstabnfs::server::export { '/media_library':
ensure => 'present',
nfstag => 'media',
clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)',
}
}
nodeclient {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>>
}
# Using a storeconfig override, to change ensure option, so we mount# all sharesnodegreedy_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| |>> {
ensure => 'mounted',
}
}
# only the mount tagged as media# also override mount pointnodemedia_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| nfstag == 'media' |>> {
ensure => 'mounted',
mount => '/import/media',
}
}
# All @@nfs::server::mount storeconfigs can be filtered by parameters# Also all parameters can be overridden (not that it's smart to do# so).# Check out the doc on exported resources for more info:# http://docs.puppetlabs.com/guides/exported_resources.htmlnodesingle_server_client {
class { '::nfs':
client_enabled => true,
}
Nfs::Client::Mount <<| server == 'server1' |>> {
ensure => 'absent',
}
}
NFSv4 Simple example
# We use the $::domain fact for the Domain setting in# /etc/idmapd.conf.# For NFSv4 to work this has to be equal on servers and clients# set it manually if unsure.## All nfsv4 exports are bind mounted into /export/$mount_name# and mounted on /srv/$mount_name on the client.# Both values can be overridden through parameters both globally# and on individual nodes.nodeserver {
file { ['/data_folder', '/homeexport']:
ensure => 'directory',
}
class { '::nfs':
server_enabled => true,
nfs_v4 => true,
nfs_v4_idmap_domain => 'example.com',
nfs_v4_export_root => '/export',
nfs_v4_export_root_clients => '*(rw,fsid=0,insecure,no_subtree_check,async,no_root_squash)',
}
nfs::server::export { '/data_folder':
ensure => 'mounted',
clients => '*(rw,insecure,async,no_root_squash,no_subtree_check)',
}
nfs::server::export { '/homeexport':
ensure => 'mounted',
clients => '*(rw,insecure,async,root_squash,no_subtree_check)',
mount => '/srv/home',
}
}
# By default, mounts are mounted in the same folder on the clients as# they were exported from on the servernodeclient {
class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
}
Nfs::Client::Mount <<| |>>
}
# We can also mount the NFSv4 Root directly through nfs::client::mount::nfsv4::root.# By default /srv will be used for as mount point, but can be overriden through# the 'mounted' option.nodeclient2 {
$server = 'server'class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
}
Nfs::Client::Mount::Nfs_v4::Root <<| server == $server |>> {
mount => "/srv/${server}",
}
}
NFSv4 insanely overcomplicated reference example
# and on individual nodes.nodeserver {
class { '::nfs':
server_enabled => true,
nfs_v4 => true,
# Below are defaultsnfs_v4_idmap_domain => $::domain,
nfs_v4_export_root => '/export',
# Default access settings of /export rootnfs_v4_export_root_clients =>
"*.${::domain}(ro,fsid=root,insecure,no_subtree_check,async,root_squash)",
}
nfs::server::export { '/data_folder':
# These are the defaultsensure => 'mounted',
# rbind or bind mounting of folders bindmounted into /export# google itbind => 'rbind',
# everything below here is propogated by to storeconfigs# to clients## Directory where we want export mounted on clientmount => undef,
remounts => false,
atboot => false,
# Don't remove that option, but feel free to add more.options_nfs => '_netdev',
# If set will mount share inside /srv (or overridden mount_root)# and then bindmount to another directory elsewhere in the fs -# for fanatics.bindmount => undef,
# Used to identify a catalog item for filtering by by# storeconfigs, kick ass.nfstag => 'kick-ass',
# copied directly into /etc/exports as a string, for simplicityclients => '10.0.0.0/24(rw,insecure,no_subtree_check,async,no_root_squash)',
}
}
nodeclient {
class { '::nfs':
client_enabled => true,
nfs_v4_client => true,
nfs_v4_idmap_domain => $::domain,
nfs_v4_mount_root => '/srv',
}
# We can as you by now know, override options set on the server# on the client node.# Be careful. Don't override mount points unless you are sure# that only one export will match your filter!
Nfs::Client::Mount <<| nfstag == 'kick-ass' |>> {
# Directory where we want export mounted on clientmount => undef,
remounts => false,
atboot => false,
# Don't remove that option, but feel free to add more.options_nfs => '_netdev',
# If set will mount share inside /srv (or overridden mount_root)# and then bindmount to another directory elsewhere in the fs -# for fanatics.bindmount => undef,
}
}
Simple create nfs export resources with hiera example
nfs::client: Includes all relevant classes for configuring as a client.
nfs::client::config: Handles the configuration files.
nfs::client::package: Handles the packages.
nfs::client::service: Handles the services.
nfs::server: Includes all relevant classes for configuring as a server.
nfs::server::config: Handles the configuration files.
nfs::server::package: Handles the packages.
nfs::server::service: Handles the services.
nfs::params: Includes all os specific parameters.
Private Defines
nfs::bindmount: Creates the bindmounts of nfs 3 exports.
nfs::nfsv4_bindmount: Creates the bindmounts of nfs 4 exports.
nfs::create_export: Creates the nfs exports.
nfs::mkdir: Creates directories recursive.
Parameters
Class: ::nfs
The following parameters are available in the ::nfs class:
ensure
String. Controls if the managed resources shall be present or
absent. If set to absent:
The managed software packages are being uninstalled.
Any traces of the packages will be purged as good as possible. This may
include existing configuration files. The exact behavior is provider
dependent. Q.v.:
System modifications (if any) will be reverted as good as possible
(e.g. removal of created users, services, changed log settings, …).
This is thus destructive and should be used with care.
Defaults to present.
server_enabled
Boolean. If set to true, this module will configure the node
to act as a nfs server.
client_enabled
Boolean. If set to true, this module will configure the node
to act as a nfs client, you can use the exported mount resources
from configured servers.
storeconfigs_enabled
Boolean. If set to false, this module will not export any
resources as storeconfigs. Defaults to true.
nfs_v4
Boolean. If set to true, this module will use nfs version 4
for exporting and mounting nfs resources. It defaults to true.
nfs_v4_client
Boolean. If set to true, this module will use nfs version 4
for mounting nfs resources. If set to false it will use nfs
version 3 to mount nfs resources. It defaults to true.
exports_file
String. It defines the location of the file with the nfs export resources used
by the nfs server.
idmapd_file
String. It defines the location of the file with the idmapd settings.
defaults_file
String. It defines the location of the file with the nfs settings.
manage_packages
Boolean. It defines if the packages should be managed through this module
server_packages
Array. It defines the packages needed to be installed for acting as
a nfs server
server_package_ensure
String. It defines the packages state – any of present, installed,
absent, purged, held, latest
client_packages
Array. It defines the packages needed to be installed for acting as
a nfs client
client_package_ensure
String. It defines the packages state – any of present, installed,
absent, purged, held, latest
manage_server_service
Boolean. Defines if module should manage server_service
manage_server_servicehelper
Boolean. Defines if module should manage server_servicehelper
manage_client_service
Boolean. Defines if module should manage client_service
server_service_name
String. It defines the servicename of the nfs server service
server_service_ensure
Boolean. It defines the service parameter ensure for nfs server services.
server_service_enable
Boolean. It defines the service parameter enable for nfs server service.
server_service_hasrestart
Boolean. It defines the service parameter hasrestart for nfs server service.
server_service_hasstatus
Boolean. It defines the service parameter hasstatus for nfs server service.
server_service_restart_cmd
String. It defines the service parameter restart for nfs server service.
server_nfsv4_servicehelper
Array. It defines the service helper like idmapd for servers configured with
nfs version 4.
client_services
Nested Hash. It defines the servicenames need to be started when acting as a nfs client
client_nfsv4_services
Nested Hash. It defines the servicenames need to be started when acting as a nfs client
version 4.
client_service_hasrestart
Boolean. It defines the service parameter hasrestart for nfs client services.
client_service_hasstatus
Boolean. It defines the service parameter hasstatus for nfs client services.
client_idmapd_setting
Array. It defines the Augeas parameter added in defaults_file when acting as a nfs
version 4 client.
client_nfs_fstype
String. It defines the name of the nfs filesystem, when adding entries to /etc/fstab
on a client node.
client_nfs_options
String. It defines the options for the nfs filesystem, when adding entries to /etc/fstab
on a client node.
client_nfsv4_fstype
String. It defines the name of the nfs version 4 filesystem, when adding entries
to /etc/fstab on a client node.
client_nfsv4_options
String. It defines the options for the nfs version 4filesystem, when adding entries
to /etc/fstab on a client node.
nfs_v4_export_root
String. It defines the location where nfs version 4 exports should be bindmounted to
on a server node. Defaults to /export.
nfs_v4_export_root_clients
String. It defines the clients that are allowed to mount nfs version 4 exports and
includes the option string. Defaults to
*.${::domain}(ro,fsid=root,insecure,no_subtree_check,async,root_squash).
nfs_v4_mount_root
String. It defines the location where nfs version 4 clients find the mount root
on a server node. Defaults to /srv.
nfs_v4_idmap_domain
String. It defines the name of the idmapd domain setting in idmapd_file needed
to be set to the same value on a server and client node to do correct uid and gid
mapping. Defaults to $::domain.
nfsv4_bindmount_enable
Boolean. It defines if the module should create a bindmount for the export.
Defaults to true.
client_need_gssd
Boolean. If true, sets NEED_GSSD=yes in /etc/defauls/nfs-common, usable on Debian/Ubuntu
client_gssd_service
Boolean. If true enable rpc-gssd service.
client_gssd_options
String. Options for rpc-gssd service. Defaults to ''
client_d9_gssdopt_workaround
Boolean. If enabled, workaround for passing gssd_options which is broken on Debian 9. Usable only on Debian 9
nfs_v4_idmap_localrealms
String or Array. ‘Local-Realms’ option for idmapd. Defaults to ''
nfs_v4_idmap_cache
Integer. ‘Cache-Expiration’ option for idmapd. Defaults to 0 – unused.
manage_nfs_v4_idmap_nobody_mapping
Boolean. Enable setting Nobody mapping in idmapd. Defaults to false.
nfs_v4_idmap_nobody_user
String. ‘Nobody-User’ option for idmapd. Defaults to nobody.
nfs_v4_idmap_nobody_group
String. ‘Nobody-Group’ option for idmapd. Defaults to nobody or nogroup.
client_rpcbind_config
String. It defines the location of the file with the rpcbind config.
client_rpcbind_optname
String. It defines the name of env variable that holds the rpcbind config. E.g. OPTIONS for Debian
client_rpcbind_opts
String. Options for rpcbind service.
Define: ::nfs::client::mount
The following parameters are available in the ::nfs::client::mount define:
server
String. Sets the ip address of the server with the nfs export
share
String. Sets the name of the nfs share on the server
ensure
String. Sets the ensure parameter of the mount.
remounts
String. Sets the remounts parameter of the mount.
atboot
String. Sets the atboot parameter of the mount.
options_nfsv4
String. Sets the mount options for a nfs version 4 mount.
options_nfs
String. Sets the mount options for a nfs mount.
bindmount
String. When not undef it will create a bindmount on the node
for the nfs mount.
nfstag
String. Sets the nfstag parameter of the mount.
nfs_v4
Boolean. When set to true, it uses nfs version 4 to mount a share.
owner
String. Set owner of mount dir
group
String. Set group of mount dir
mode
String. Set mode of mount dir
mount_root
String. Overwrite mount root if differs from server config
Define: ::nfs::server::export
The following parameters are available in the ::nfs::server::export define:
clients
String. Sets the allowed clients and options for the export in the exports file.
Defaults to localhost(ro)
bind
String. Sets the bind options setted in /etc/fstab for the bindmounts created.
Defaults to rbind. When you have any submounts in your exported folders,
the rbind option will submount them in the bindmount folder. You have to set the
crossmnt option in your nfs export to have the submounts from rbind available
on your client. Your export should look like this:
If you want to have specific package versions installed you may manage the needed packages outside of this
module (use manage_packages => false). It is only tested to use ‘present’, ‘installed’, ‘absent’,
‘purged’, ‘held’ and ‘latest’ as argument for the parameters server_package_ensure and client_package_ensure.
Development
Derdanne modules are open projects. So if you want to make this module even better,
you can contribute to this module on Github.
Before pushing PRs to Github i would recommend you to test your work locally. So you can ensure all test builds
on Travis CI were passing. I have prepared an easy way to test your code locally with the help of Docker.
For running the complete static code analysis, it is sufficient to run a make test-all.
Default settings
I have set some defaults which you can change by setting the following environment variables.
PUPPET_VERSION
Changes the puppet version which will be used for the tests. Defaults to 6.0.
STRICT_VARIABLES
Sets strict variables on or off. Defaults to yes.
RVM
Sets the ruby version which will be used for the tests. Defaults to 2.4.1.
BEAKER_set
Sets the beaker docker target host. Defaults to ubuntu-20.04.
PUPPET_collection
Sets the puppet version for acceptance tests. Defaults to puppet6.
Running tests
You can run the following commands to setup and run the testsuite on your local machine.
make build
Build a docker image with a Ruby version which is not available on Docker hub. Check out
https://hub.docker.com/r/derdanne/rvm/ to see if i have already prepared a rvm build for the ruby version
you want to test. Take a look at the Dockerfile located in spec/local-testing if you want to customize
your builds.
make pull
Pull a prebuild rvm docker image with the Ruby version defined in the variable RVM.
This plugin was originally authored by Daniel Klockenkaemper dk@marketing-factory.de.
The maintainer preferred that Vox Pupuli take ownership of the module for future improvement and maintenance.
Existing pull requests and issues were transferred over, please fork and continue to contribute here instead of Camptocamp.
This Go program demonstrates the use of interface-typed objects that are declared to link some functions to their specified struct. This technique, although using the property of interface-typed objects, is not the same as demonstrated here where interface-typed arguments are passed into functions. As for the code in this repository, we can use functions as methods for the created structs since we are not passing interface-typed objects as conventional argument, but we are using them as receiver arguments instead.
Program manual
Since this program is very similar to the one in the repository in this link, I’m just going to copy-paste the program manual from there as the following:
When run, the program asks the user to input the following information in the following order:
Note title
Note content
Todo
Then, the program will show messages containing the input information and, if there’s no error, will notify the user that the note and todo are successfully saved (in json file format).
There is no input validation for this program because every piece of information are in the form of free text. However, the program is designed to catch error when saving the files. The user will be notified if there’s any error while saving each file. In case of error, the program will stops after displaying the error message.
Code structure
Although, the program in this project works exactly the same as the one from this link, the code structure was designed differently in order to demonstrate another way of using interface to link common methods to different struct types from different packages.
The project comprises the main.go file which contains the code of the main program, and the codes which make up the note and todo packages. The main.go file contains the code declaring interface objects that link the save and display functions in the mentioned packages to their native structs. Those functions can, in turn, be used as the structs’ methods.
Program flow
Since this program works exactly as another one in a different repository as mentioned in several places above, I’m just going to copy an paste the same program flow from there as the following:
The user inputs the note title as a string
The user inputs the note content as a string
The program takes those inputs to create a struct which stores the note title, content, and the timestamp at its creation
The user inputs the todo text
The program takes the todo text input to create another struct which stores the todo text (without any title)
The program displays messages to confirm the note’s title and its content from the inputs
The program displays a message to confirm the todo
The program displays a message to notify the user that it’s saving the note
The program attempts to save the inputs as a json file with json field names according to the struct tags given in the code
The program displays the message that it saves the file successfully
The program repeat the same process from 8. for the todo (the todo’s file name is already hard-coded in the program and can’t be changed)
Set total data size, page size and add page update listener which will call after pager update.
mPaginationView.setPager(list.size());
mPaginationView.setOnPagerUpdate(new PaginationView.OnPagerUpdate() {
@Override
public void onUpdate(int pageNumber, int pageSize) {
// query your data from page number to page size according to your requirement
...
// notify your adapter
}
});
mAdapter = new MyAdapter(getDataset(0, pageSize));
mRecyclerView.setAdapter(mAdapter);
mPaginationView.setPager(size);
mPaginationView.setOnPagerUpdate(new PaginationView.OnPagerUpdate() {
@Override
public void onUpdate(int pageNumber, int pageSize) {
mAdapter.setDataset(getDataset(pageNumber, pageSize));
mAdapter.notifyDataSetChanged();
}
});
Licence
Copyright 2018 Pankaj Jangid
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Modsurfer by Dylibso is an application to help teams debug and observe their
WebAssembly modules and components. It scans WASM binaries and extracts critical information about
the code contained within, as well as makes WASM code searchable and visible to the teams creating
and executing it. See a demo of the Modsurfer application here: https://modsurfer.app
This GitHub Action runs Modsurfer’s CLI, found here, using
the validate command. This command expects two inputs:
path (-p from the CLI): pointing to the .wasm file to validate
check (-c from the CLI): pointing to the YAML file (default: mod.yaml) to validate against
Usage
To use this action, add the following step in your workflow:
# For more information about other checkfile options, see the documentation at https://dev.dylib.so/docs/modsurfer/cli#checkfilevalidate:
# mandate that WASI support is allowed or notallow_wasi: false# define requirements for existence (or non-existence) of a module's import functionsimports:
include:
# specify the function and its signature, optionally scoping it to a particular module name / namespace
- name: http_getnamespace: envparams:
- I32
- I32results:
- I32# or, simply use the function name
- log_message
- proc_exitexclude:
- fd_write# declare module-wide requirements for existence (or non-existence) of imports from modules / namespacesnamespace:
include:
- envexclude:
- some_future_deprecated_module_name
- wasi_snapshot_preview1# define requirements for existence (or non-existence) of a module's export functionsexports:
# set a threshold for maximum number of exportsmax: 2include:
- name: _startparams: []results: []
- name: barparams:
- I32
- I32results:
- I32exclude:
- main
- foo# restrict binary size of a module (supports suffixes listed here: https://docs.rs/parse-size/1.0.0/parse_size/index.html)size:
max: 4MB# restrict WASM code complexity to a risk profile (low, medium, high) based on Cyclomatic Complexity analysiscomplexity:
max_risk: low
When a module fails to validate against the provided check file, a report is printed (seen below),
and will issue a non-zero exit code, failing the CI workflow.
I realized that there was no easy way to extract the RSS feeds from your podcast app. I use iTunes on my desktop for downloading my podcasts. So I created this repo that extracts the podcasts from your iTunes folder and provides you with the RSS feeds.
Instructions:
Download this repo to your disk.
Open your command prompt and navigate to this repo
Enter the repo: cd Podcast-Feed-Extractor
Install the requirements: pip install -r requirements.txt
Find the path to your iTunes folder. By default, on Windows, it is installed at “C:\Users<user>\Music\iTunes”
Run this code: python3 podcast.py <path of the iTunes folder as identified in step 5>
The output files are as follows:
A pickle file (podcast_feed.pkl) (if you want to load the dictionary { podcast_name : rss_feed} for further manipulation in python
A text file (error_podcasts): A text file that contains the names of podcasts whose RSS feeds could not be identified
A text file (rss_feeds): A text file that contains the name of podcasts and the RSS URL for each podcast