From 6e8db283dfbef51659fda252738e184e45709542 Mon Sep 17 00:00:00 2001 From: Eric Hanko Date: Mon, 12 Feb 2018 12:23:41 -0800 Subject: [PATCH] Release 1.5 (#43) * Feature/useraddtogroup: macos_user new property "groups" (#41) * Add smoke test for new property "groups" for macos_user resource * Add new macos_user that utilizes the new "groups" property * Add new property for macos_user called "groups" groups property will take a String or an Array * Idempotent "machine_name" resource + docs - This commit includes a revamped machine_name resource along with some other magical additions. The additions include a software_updates helper, abd a re-working of the `binary?` plist action_class method - More realistic version bump - Documentation for machine_name resource - Better test for machine_name resource (fix macOS version test bug) * update relative paths for documentation for Supermarket shoppers * add backticks * remove delivery; fix keep_awake idempotence bug --- .delivery/build_cookbook/.kitchen.yml | 21 --- .delivery/build_cookbook/Berksfile | 7 - .delivery/build_cookbook/LICENSE | 21 --- .delivery/build_cookbook/README.md | 146 ------------------ .delivery/build_cookbook/chefignore | 107 ------------- .../data_bags/keys/delivery_builder_keys.json | 1 - .delivery/build_cookbook/metadata.rb | 8 - .delivery/build_cookbook/recipes/default.rb | 27 ---- .delivery/build_cookbook/recipes/deploy.rb | 27 ---- .../build_cookbook/recipes/functional.rb | 27 ---- .delivery/build_cookbook/recipes/lint.rb | 27 ---- .delivery/build_cookbook/recipes/provision.rb | 27 ---- .delivery/build_cookbook/recipes/publish.rb | 27 ---- .delivery/build_cookbook/recipes/quality.rb | 27 ---- .delivery/build_cookbook/recipes/security.rb | 27 ---- .delivery/build_cookbook/recipes/smoke.rb | 27 ---- .delivery/build_cookbook/recipes/syntax.rb | 27 ---- .delivery/build_cookbook/recipes/unit.rb | 27 ---- .../build_cookbook/secrets/fakey-mcfakerton | 0 .../test/fixtures/cookbooks/test/metadata.rb | 2 - .../cookbooks/test/recipes/default.rb | 8 - .delivery/config.json | 12 -- .delivery/project.toml | 36 ----- .mailmap | 7 + README.md | 88 ++++++----- attributes/default.rb | 2 +- documentation/resource_ard.md | 49 +++--- documentation/resource_machine_name.md | 88 +++++++++++ documentation/resource_plist.md | 20 +-- documentation/resource_spotlight.md | 55 ++++--- documentation/resource_xcode.md | 20 ++- documentation/sharing_preferences.png | Bin 0 -> 99310 bytes libraries/machine_name.rb | 28 ++++ libraries/software_updates.rb | 12 ++ metadata.rb | 4 +- recipes/keep_awake.rb | 2 +- resources/machine_name.rb | 61 ++++++-- resources/macos_user.rb | 19 +++ resources/plist.rb | 16 +- .../macos_test/recipes/machine_name.rb | 8 +- .../cookbooks/macos_test/recipes/new_users.rb | 7 + .../test/smoke/default/machine_name_test.rb | 21 +-- .../test/smoke/default/new_users_test.rb | 10 ++ 43 files changed, 375 insertions(+), 808 deletions(-) delete mode 100644 .delivery/build_cookbook/.kitchen.yml delete mode 100644 .delivery/build_cookbook/Berksfile delete mode 100644 .delivery/build_cookbook/LICENSE delete mode 100644 .delivery/build_cookbook/README.md delete mode 100644 .delivery/build_cookbook/chefignore delete mode 100644 .delivery/build_cookbook/data_bags/keys/delivery_builder_keys.json delete mode 100644 .delivery/build_cookbook/metadata.rb delete mode 100644 .delivery/build_cookbook/recipes/default.rb delete mode 100644 .delivery/build_cookbook/recipes/deploy.rb delete mode 100644 .delivery/build_cookbook/recipes/functional.rb delete mode 100644 .delivery/build_cookbook/recipes/lint.rb delete mode 100644 .delivery/build_cookbook/recipes/provision.rb delete mode 100644 .delivery/build_cookbook/recipes/publish.rb delete mode 100644 .delivery/build_cookbook/recipes/quality.rb delete mode 100644 .delivery/build_cookbook/recipes/security.rb delete mode 100644 .delivery/build_cookbook/recipes/smoke.rb delete mode 100644 .delivery/build_cookbook/recipes/syntax.rb delete mode 100644 .delivery/build_cookbook/recipes/unit.rb delete mode 100644 .delivery/build_cookbook/secrets/fakey-mcfakerton delete mode 100644 .delivery/build_cookbook/test/fixtures/cookbooks/test/metadata.rb delete mode 100644 .delivery/build_cookbook/test/fixtures/cookbooks/test/recipes/default.rb delete mode 100644 .delivery/config.json delete mode 100644 .delivery/project.toml create mode 100644 .mailmap create mode 100644 documentation/resource_machine_name.md create mode 100644 documentation/sharing_preferences.png create mode 100644 libraries/machine_name.rb create mode 100644 libraries/software_updates.rb diff --git a/.delivery/build_cookbook/.kitchen.yml b/.delivery/build_cookbook/.kitchen.yml deleted file mode 100644 index 775a7d6..0000000 --- a/.delivery/build_cookbook/.kitchen.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -driver: - name: vagrant - synced_folders: - - [<%= File.join(ENV['PWD'], '..', '..')%>, '/tmp/repo-data'] - -provisioner: - name: chef_zero - encrypted_data_bag_secret_key_path: 'secrets/fakey-mcfakerton' - data_bags_path: './data_bags' - product_name: chefdk - -platforms: - - name: ubuntu-16.04 - - name: centos-7.3 - -suites: - - name: default - run_list: - - recipe[test] - attributes: diff --git a/.delivery/build_cookbook/Berksfile b/.delivery/build_cookbook/Berksfile deleted file mode 100644 index 61dab72..0000000 --- a/.delivery/build_cookbook/Berksfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://supermarket.chef.io' - -metadata - -group :delivery do - cookbook 'test', path: './test/fixtures/cookbooks/test' -end diff --git a/.delivery/build_cookbook/LICENSE b/.delivery/build_cookbook/LICENSE deleted file mode 100644 index 84548df..0000000 --- a/.delivery/build_cookbook/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Copyright © 2017 Microsoft. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.delivery/build_cookbook/README.md b/.delivery/build_cookbook/README.md deleted file mode 100644 index 297af5a..0000000 --- a/.delivery/build_cookbook/README.md +++ /dev/null @@ -1,146 +0,0 @@ -# build_cookbook - -A build cookbook for running the parent project through Chef Delivery - -This build cookbook should be customized to suit the needs of the parent project. Using this cookbook can be done outside of Chef Delivery, too. If the parent project is a Chef cookbook, we've detected that and "wrapped" [delivery-truck](https://github.com/chef-cookbooks/delivery-truck). That means it is a dependency, and each of its pipeline phase recipes is included in the appropriate phase recipes in this cookbook. If the parent project is not a cookbook, it's left as an exercise to the reader to customize the recipes as needed for each phase in the pipeline. - -## .delivery/config.json - -In the parent directory to this build_cookbook, the `config.json` can be modified as necessary. For example, phases can be skipped, publishing information can be added, and so on. Refer to customer support or the Chef Delivery documentation for assistance on what options are available for this configuration. - -## Test Kitchen - Local Verify Testing - -This cookbook also has a `.kitchen.yml` which can be used to create local build nodes with Test Kitchen to perform the verification phases, `unit`, `syntax`, and `lint`. When running `kitchen converge`, the instances will be set up like Chef Delivery "build nodes" with the [delivery_build cookbook](https://github.com/chef-cookbooks/delivery_build). The reason for this is to make sure that the same exact kind of nodes are used by this build cookbook are run on the local workstation as would run Delivery. It will run `delivery job verify PHASE` for the parent project. - -Modify the `.kitchen.yml` if necessary to change the platforms or other configuration to run the verify phases. After making changes in the parent project, `cd` into this directory (`.delivery/build_cookbook`), and run: - -``` -kitchen test -``` - -## Recipes - -Each of the recipes in this build_cookbook are run in the named phase during the Chef Delivery pipeline. The `unit`, `syntax`, and `lint` recipes are additionally run when using Test Kitchen for local testing as noted in the above section. - -## Making Changes - Cookbook Example - -When making changes in the parent project (that which lives in `../..` from this directory), or in the recipes in this build cookbook, there is a bespoke workflow for Chef Delivery. As an example, we'll discuss a Chef Cookbook as the parent. - -First, create a new branch for the changes. - -``` -git checkout -b testing-build-cookbook -``` - -Next, increment the version in the metadata.rb. This should be in the _parent_, not in this, the build_cookbook. If this is not done, the verify phase will fail. - -``` -% git diff - --version '0.1.0' -+version '0.1.1' -``` - -The change we'll use for an example is to install the `zsh` package. Write a failing ChefSpec in the cookbook project's `spec/unit/recipes/default_spec.rb`. - -```ruby -require 'spec_helper' - -describe 'godzilla::default' do - context 'When all attributes are default, on Ubuntu 16.04' do - let(:chef_run) do - runner = ChefSpec::ServerRunner.new(platform: 'ubuntu', version: '16.04') - runner.converge(described_recipe) - end - - it 'installs zsh' do - expect(chef_run).to install_package('zsh') - end - end -end -``` - -Commit the local changes as work in progress. The `delivery job` expects to use a clean git repository. - -``` -git add ../.. -git commit -m 'WIP: Testing changes' -``` - -From _this_ directory (`.delivery/build_cookbook`, relative to the parent cookbook project), run - -``` -cd .delivery/build_cookbook -kitchen converge -``` - -This will take some time at first, because the VMs need to be created, Chef installed, the Delivery CLI installed, etc. Later runs will be faster until they are destroyed. It will also fail on the first VM, as expected, because we wrote the test first. Now edit the parent cookbook project's default recipe to install `zsh`. - -``` -cd ../../ -$EDITOR/recipes/default.rb -``` - -It should look like this: - -``` -package 'zsh' -``` - -Create another commit. - -``` -git add . -git commit -m 'WIP: Install zsh in default recipe' -``` - -Now rerun kitchen from the build_cookbook. - -``` -cd .delivery/build_cookbook -kitchen converge -``` - -This will take awhile because it will now pass on the first VM, and then create the second VM. We should have warned you this was a good time for a coffee break. - -``` -Recipe: test::default - -- execute HOME=/home/vagrant delivery job verify unit --server localhost --ent test --org kitchen - * execute[HOME=/home/vagrant delivery job verify lint --server localhost --ent test --org kitchen] action run - - execute HOME=/home/vagrant delivery job verify lint --server localhost --ent test --org kitchen - - - execute HOME=/home/vagrant delivery job verify syntax --server localhost --ent test --org kitchen - -Running handlers: -Running handlers complete -Chef Client finished, 3/32 resources updated in 54.665445968 seconds -Finished converging (1m26.83s). -``` - -Victory is ours! Our verify phase passed on the build nodes. - -We are ready to run this through our Delivery pipeline. Simply run `delivery review` on the local system from the parent project, and it will open a browser window up to the change we just added. - -``` -cd ../.. -delivery review -``` - -## FAQ - -### Why don't I just run rspec and foodcritic/rubocop on my local system? - -An objection to the Test Kitchen approach is that it is much faster to run the unit, lint, and syntax commands for the project on the local system. That is totally true, and also totally valid. Do that for the really fast feedback loop. However, the dance we do with Test Kitchen brings a much higher degree of confidence in the changes we're making, that everything will run on the build nodes in Chef Delivery. We strongly encourage this approach before actually pushing the changes to Delivery. - -### Why do I have to make a commit every time? - -When running `delivery job`, it expects to merge the commit for the changeset against the clean master branch. If we don't save our progress by making a commit, our local changes aren't run through `delivery job` in the Test Kitchen build instances. We can always perform an interactive rebase, and modify the original changeset message in Delivery with `delivery review --edit`. The latter won't modify the git commits, only the changeset in Delivery. - -### What do I do next? - -Make changes in the cookbook project as required for organizational goals and needs. Modify the `build_cookbook` as necessary for the pipeline phases that the cookbook should go through. - -### What if I get stuck? - -Contact Chef Support, or your Chef Customer Success team and they will help you get unstuck. diff --git a/.delivery/build_cookbook/chefignore b/.delivery/build_cookbook/chefignore deleted file mode 100644 index 38e7379..0000000 --- a/.delivery/build_cookbook/chefignore +++ /dev/null @@ -1,107 +0,0 @@ -# Put files/directories that should be ignored in this file when uploading -# to a chef-server or supermarket. -# Lines that start with '# ' are comments. - -# OS generated files # -###################### -.DS_Store -Icon? -nohup.out -ehthumbs.db -Thumbs.db - -# SASS # -######## -.sass-cache - -# EDITORS # -########### -\#* -.#* -*~ -*.sw[a-z] -*.bak -REVISION -TAGS* -tmtags -*_flymake.* -*_flymake -*.tmproj -.project -.settings -mkmf.log - -## COMPILED ## -############## -a.out -*.o -*.pyc -*.so -*.com -*.class -*.dll -*.exe -*/rdoc/ - -# Testing # -########### -.watchr -.rspec -spec/* -spec/fixtures/* -test/* -features/* -examples/* -Guardfile -Procfile -.kitchen* -.rubocop.yml -spec/* -Rakefile -.travis.yml -.foodcritic -.codeclimate.yml - -# SCM # -####### -.git -*/.git -.gitignore -.gitmodules -.gitconfig -.gitattributes -.svn -*/.bzr/* -*/.hg/* -*/.svn/* - -# Berkshelf # -############# -Berksfile -Berksfile.lock -cookbooks/* -tmp - -# Policyfile # -############## -Policyfile.rb -Policyfile.lock.json - -# Cookbooks # -############# -CONTRIBUTING* -CHANGELOG* -TESTING* -MAINTAINERS.toml - -# Strainer # -############ -Colanderfile -Strainerfile -.colander -.strainer - -# Vagrant # -########### -.vagrant -Vagrantfile diff --git a/.delivery/build_cookbook/data_bags/keys/delivery_builder_keys.json b/.delivery/build_cookbook/data_bags/keys/delivery_builder_keys.json deleted file mode 100644 index af375ea..0000000 --- a/.delivery/build_cookbook/data_bags/keys/delivery_builder_keys.json +++ /dev/null @@ -1 +0,0 @@ -{"id": "delivery_builder_keys"} \ No newline at end of file diff --git a/.delivery/build_cookbook/metadata.rb b/.delivery/build_cookbook/metadata.rb deleted file mode 100644 index 64875b5..0000000 --- a/.delivery/build_cookbook/metadata.rb +++ /dev/null @@ -1,8 +0,0 @@ -name 'build_cookbook' -maintainer 'Copyright © 2017 Microsoft. All rights reserved.' -maintainer_email 'apxlab@microsoft.com' -license 'mit' -version '0.1.0' -chef_version '>= 12.1' if respond_to?(:chef_version) - -depends 'delivery-truck' diff --git a/.delivery/build_cookbook/recipes/default.rb b/.delivery/build_cookbook/recipes/default.rb deleted file mode 100644 index a2596ec..0000000 --- a/.delivery/build_cookbook/recipes/default.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: default -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::default' diff --git a/.delivery/build_cookbook/recipes/deploy.rb b/.delivery/build_cookbook/recipes/deploy.rb deleted file mode 100644 index d94a942..0000000 --- a/.delivery/build_cookbook/recipes/deploy.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: deploy -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::deploy' diff --git a/.delivery/build_cookbook/recipes/functional.rb b/.delivery/build_cookbook/recipes/functional.rb deleted file mode 100644 index c2d071c..0000000 --- a/.delivery/build_cookbook/recipes/functional.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: functional -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::functional' diff --git a/.delivery/build_cookbook/recipes/lint.rb b/.delivery/build_cookbook/recipes/lint.rb deleted file mode 100644 index 842e99e..0000000 --- a/.delivery/build_cookbook/recipes/lint.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: lint -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::lint' diff --git a/.delivery/build_cookbook/recipes/provision.rb b/.delivery/build_cookbook/recipes/provision.rb deleted file mode 100644 index ac8b5c5..0000000 --- a/.delivery/build_cookbook/recipes/provision.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: provision -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::provision' diff --git a/.delivery/build_cookbook/recipes/publish.rb b/.delivery/build_cookbook/recipes/publish.rb deleted file mode 100644 index bd2cdcd..0000000 --- a/.delivery/build_cookbook/recipes/publish.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: publish -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::publish' diff --git a/.delivery/build_cookbook/recipes/quality.rb b/.delivery/build_cookbook/recipes/quality.rb deleted file mode 100644 index 16d77b0..0000000 --- a/.delivery/build_cookbook/recipes/quality.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: quality -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::quality' diff --git a/.delivery/build_cookbook/recipes/security.rb b/.delivery/build_cookbook/recipes/security.rb deleted file mode 100644 index c84a619..0000000 --- a/.delivery/build_cookbook/recipes/security.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: security -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::security' diff --git a/.delivery/build_cookbook/recipes/smoke.rb b/.delivery/build_cookbook/recipes/smoke.rb deleted file mode 100644 index 47dfa39..0000000 --- a/.delivery/build_cookbook/recipes/smoke.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: smoke -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::smoke' diff --git a/.delivery/build_cookbook/recipes/syntax.rb b/.delivery/build_cookbook/recipes/syntax.rb deleted file mode 100644 index 8748453..0000000 --- a/.delivery/build_cookbook/recipes/syntax.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: syntax -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::syntax' diff --git a/.delivery/build_cookbook/recipes/unit.rb b/.delivery/build_cookbook/recipes/unit.rb deleted file mode 100644 index d700d42..0000000 --- a/.delivery/build_cookbook/recipes/unit.rb +++ /dev/null @@ -1,27 +0,0 @@ -# -# Cookbook:: build_cookbook -# Recipe:: unit -# -# The MIT License (MIT) -# -# Copyright:: 2017, Copyright © 2017 Microsoft. All rights reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -include_recipe 'delivery-truck::unit' diff --git a/.delivery/build_cookbook/secrets/fakey-mcfakerton b/.delivery/build_cookbook/secrets/fakey-mcfakerton deleted file mode 100644 index e69de29..0000000 diff --git a/.delivery/build_cookbook/test/fixtures/cookbooks/test/metadata.rb b/.delivery/build_cookbook/test/fixtures/cookbooks/test/metadata.rb deleted file mode 100644 index 1725039..0000000 --- a/.delivery/build_cookbook/test/fixtures/cookbooks/test/metadata.rb +++ /dev/null @@ -1,2 +0,0 @@ -name 'test' -version '0.1.0' \ No newline at end of file diff --git a/.delivery/build_cookbook/test/fixtures/cookbooks/test/recipes/default.rb b/.delivery/build_cookbook/test/fixtures/cookbooks/test/recipes/default.rb deleted file mode 100644 index 5675ce6..0000000 --- a/.delivery/build_cookbook/test/fixtures/cookbooks/test/recipes/default.rb +++ /dev/null @@ -1,8 +0,0 @@ -%w(unit lint syntax).each do |phase| - # TODO: This works on Linux/Unix. Not Windows. - execute "HOME=/home/vagrant delivery job verify #{phase} --server localhost --ent test --org kitchen" do - cwd '/tmp/repo-data' - user 'vagrant' - environment('GIT_DISCOVERY_ACROSS_FILESYSTEM' => '1') - end -end diff --git a/.delivery/config.json b/.delivery/config.json deleted file mode 100644 index 6c0e69f..0000000 --- a/.delivery/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "2", - "build_cookbook": { - "name": "build_cookbook", - "path": ".delivery/build_cookbook" - }, - "skip_phases": [], - "job_dispatch": { - "version": "v2" - }, - "dependencies": [] -} diff --git a/.delivery/project.toml b/.delivery/project.toml deleted file mode 100644 index 772e765..0000000 --- a/.delivery/project.toml +++ /dev/null @@ -1,36 +0,0 @@ -# Delivery Prototype for Local Phases Execution -# -# The purpose of this file is to prototype a new way to execute -# phases locally on your workstation. The delivery-cli will read -# this file and execute the command(s) that are configured for -# each phase. You can customize them by just modifying the phase -# key on this file. -# -# By default these phases are configured for Cookbook Workflow only -# -# As this is still a prototype we are not modifying the current -# config.json file and it will continue working as usual. - -[local_phases] -unit = "chef exec rspec spec/" -lint = "chef exec cookstyle" -# Foodcritic includes rules only appropriate for community cookbooks -# uploaded to Supermarket. We turn off any rules tagged "supermarket" -# by default. If you plan to share this cookbook you should remove -# '-t ~supermarket' below to enable supermarket rules. -syntax = "chef exec foodcritic . --exclude spec -f any -t ~supermarket" -provision = "chef exec kitchen create" -deploy = "chef exec kitchen converge" -smoke = "chef exec kitchen verify" -# The functional phase is optional, you can define it by uncommenting -# the line below and running the command: `delivery local functional` -functional = "echo No functional tests found." -cleanup = "chef exec kitchen destroy" - -# Remote project.toml file -# -# Specify a remote URI location for the `project.toml` file. -# This is useful for teams that wish to centrally manage the behavior -# of the `delivery local` command across many different projects. -# -# remote_file = "https://url/project.toml" diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..9d96633 --- /dev/null +++ b/.mailmap @@ -0,0 +1,7 @@ +Jacob Zaval +Eric Hanko Unknown +Mark John Merin <33106688+mjmerin@users.noreply.github.com> +Ryan Dominguez +Eammon Hanlon Unknown +Andre Shelds v-anshie +Darío Hereñú diff --git a/README.md b/README.md index 3c54f3a..a4ed0fe 100644 --- a/README.md +++ b/README.md @@ -5,24 +5,26 @@ The macOS cookbook is a Chef library cookbook that provides resources for config and provisioning macOS. Additionally, it provides recipes that implement common use-cases of the macOS cookbook's resources. -||| -|-|-| -| macOS High Sierra 10.13 | ![build-status-1013](https://office.visualstudio.com/_apis/public/build/definitions/59d72877-1cea-4eb6-9d06-66716573631a/2143/badge) | -| macOS Sierra 10.12 | ![build-status-1012](https://office.visualstudio.com/_apis/public/build/definitions/59d72877-1cea-4eb6-9d06-66716573631a/2140/badge) | -||| +- [Chef Requirements](#chef-requirements) +- [Supported OS Versions](#supported-os-versions) +- [Attributes](#attributes) +- [Recipes](#recipes) +- [Data Bags](#data-bags) +- [Resources](#resources) -Requirements ------------- +Chef Requirements +----------------- -- Only tested on Chef 13 -- Surprisingly, this cookbook is only compatible with macOS +Currently, we've only tested the macOS cookbook using **Chef 13**. We do intend to implement +better test coverage in order to support more versions of Chef. Let us know +if you find issues with previous versions and we will do our best to resolve them. Supported OS Versions --------------------- -- OS X El Capitan 10.11 -- macOS Sierra 10.12 -- macOS High Sierra 10.13 +| OS X El Capitan 10.11 | macOS Sierra 10.12 | macOS High Sierra 10.13 | +|:---------------------:|:------------------:|:-----------------------:| +| ![build-status-1011](https://office.visualstudio.com/_apis/public/build/definitions/59d72877-1cea-4eb6-9d06-66716573631a/2140/badge) | ![build-status-1012](https://office.visualstudio.com/_apis/public/build/definitions/59d72877-1cea-4eb6-9d06-66716573631a/2140/badge) | ![build-status-1013](https://office.visualstudio.com/_apis/public/build/definitions/59d72877-1cea-4eb6-9d06-66716573631a/2143/badge) | Attributes ---------- @@ -51,59 +53,64 @@ No attributes used in this recipe. ### Keep Awake -Prevent macOS from falling asleep, disable the screensaver, and -several other settings to always keep macOS on. Uses the `plistbuddy` and `pmset` -resources. +Prevent macOS from falling asleep, disable the screensaver, reboot upon power failure, +enable wake on LAN, enable remote login (SSH) and adjust several other settings +to always keep macOS on and available. **Usage:** `include_recipe macos::keep_awake` -| Attribute used | Default value | -|---------------------------------------|-------------------------| -| `node['macos']['network_time_server']`| `'time.windows.com'` | -| `node['macos']['time_zone']` | `'America/Los_Angeles'` | +| Attributes used | Default value | +|-----------------------------------------|-------------------------| +| `node['macos']['remote_login_enabled']` | `true` | +| `node['macos']['disk_sleep_disabled']` | `false` | +| `node['macos']['network_time_server']` | `'time.windows.com'` | +| `node['macos']['time_zone']` | `'America/Los_Angeles'` | ### Mono -Installs [Mono](http://www.mono-project.com/docs/about-mono/). Requires package -name, version number, and checksum in order to override. +Installs [Mono](http://www.mono-project.com/docs/about-mono/). Requires setting +the `package`, `version` and `checksum` attributes in order to override. **Usage:** `include_recipe macos::mono` -| Attribute used | Default value | -|-------------------------------------|----------------------------------------| -| `node['macos']['mono']['package']` | `'MonoFramework-MDK-4.4.2.11.macos10.xamarin.universal.pkg'` | -| `node['macos']['mono']['version']` | `'4.4.2'` | +| Attributes used | Default value | +|-------------------------------------|----------------------------------------------------------------------| +| `node['macos']['mono']['package']` | `'MonoFramework-MDK-4.4.2.11.macos10.xamarin.universal.pkg'` | +| `node['macos']['mono']['version']` | `'4.4.2'` | | `node['macos']['mono']['checksum']` | `'d8bfbee7ae4d0d1facaf0ddfb70c0de4b1a3d94bb1b4c38e8fa4884539f54e23'` | ### Xcode -Installs Xcode 9.1 and simulators for iOS 10 and iOS 11. Check out -the documentation for the Xcode resource if you need more flexibility. +Installs Xcode 9.1 and simulators for iOS 10 and iOS 11. See the +[Xcode resource documentation](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_xcode.md) if you need +more flexibility. -:large_orange_diamond: Requires an `apple_id` data bag item. +:warning: Requires a `credentials` data bag containing an `apple_id` data bag item. **Usage:** `include_recipe macos::xcode` -| Attribute Used | Default value | -|---------------------------------------------------------------|---------------| -| `node['macos']['xcode']['version']` | `'9.1'` | -| `node['macos']['xcode']['simulator']['major_version']` | `%w(11 10)` | +| Attributes used | Default value | +|--------------------------------------------------------|---------------| +| `node['macos']['xcode']['version']` | `'9.2'` | +| `node['macos']['xcode']['simulator']['major_version']` | `[11, 10]` | ### Apple Configurator 2 Installs Apple Configurator 2 using `mas` and links `cfgutil` to `/usr/local/bin`. -:large_orange_diamond: Requires an `apple_id` data bag item. +:warning: Requires a `credentials` data bag containing an `apple_id.json` data bag item. **Usage:** `include_recipe macos::configurator` **Attributes**: No attributes used in this recipe. -#### Data Bags +Data Bags +--------- -Both the `macos::xcode` and `macos::configurator` recipes require a data bag -item named `apple_id` containing valid Apple ID credentials. For example: +Both the `macos::xcode` and `macos::configurator` recipes require a `credentials` +data bag with an `apple_id` data bag item. The item should contain valid Apple ID +credentials. For example: **Example:** @@ -118,7 +125,8 @@ item named `apple_id` containing valid Apple ID credentials. For example: Resources --------- -- [ARD (Apple Remote Desktop)](./documentation/resource_ard.md) -- [Plist](./documentation/resource_plist.md) -- [Xcode](./documentation/resource_xcode.md) -- [Spotlight (mdutil)](./documentation/resource_spotlight.md) +- [ARD (Apple Remote Desktop)](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_ard.md) +- [Machine Name](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_machine_name.md) +- [Plist](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_plist.md) +- [Spotlight (mdutil)](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_spotlight.md) +- [Xcode](https://github.com/Microsoft/macos-cookbook/blob/master/documentation/resource_xcode.md) diff --git a/attributes/default.rb b/attributes/default.rb index e13c80f..801225b 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -5,7 +5,7 @@ default['macos']['mono']['package'] = 'MonoFramework-MDK-4.4.2.11.macos10.xamari default['macos']['mono']['version'] = '4.4.2' default['macos']['mono']['checksum'] = 'd8bfbee7ae4d0d1facaf0ddfb70c0de4b1a3d94bb1b4c38e8fa4884539f54e23' -default['macos']['xcode']['version'] = '9.1' +default['macos']['xcode']['version'] = '9.2' default['macos']['xcode']['simulator']['major_version'] = %w(11 10) default['macos']['remote_login_enabled'] = true diff --git a/documentation/resource_ard.md b/documentation/resource_ard.md index 0f92074..b3e77e1 100644 --- a/documentation/resource_ard.md +++ b/documentation/resource_ard.md @@ -1,19 +1,17 @@ ard === -Use the **ard** resource to manage Remote Desktop settings and preferences. -Under the hood, an **ard** resource executes the `kickstart` command, located -in ARDAgent.app (one of the CoreServices of macOS). It has some basic actions, -which pertain to the simple `kickstart` subcommands. It also has the more -complicated `:configure` action, which requires some familiarity with -`kickstart`. - -[Learn more about the `kickstart` command](https://support.apple.com/en-us/HT201710). +Use the **ard** resource to manage the "Remote Management" settings, found in System +Preferences > Sharing > Remote Management. Under the hood, an **ard** resource +executes the `kickstart` command, located in ARDAgent.app (one of macOS' "core services"). +It has some basic actions, which pertain to the simple `kickstart` subcommands. +It also has the more complicated `:configure` action, which requires some familiarity +with [`kickstart`](https://support.apple.com/en-us/HT201710). Syntax ------ -A **ard** resource block declares a basic description of the command configuration +An **ard** resource block declares a basic description of the command configuration and a set of properties depending on the actions executed. For example: ```ruby @@ -27,25 +25,31 @@ where - `:activate` activates the ARD agent - `:configure` configures the agent using the `kickstart` defaut commandline arguments. +The default `:configure` action is equivalent to the following +**System Preferences > Sharing** settings: + +![Sharing Preferences](sharing_preferences.png) + The full syntax for all of the properties that are available to the **ard** resource is: ```ruby ard 'description' do - install_package String - uninstall_options Array, # defaults to ['-files', '-settings', '-prefs'] if not specified - restart_options Array, # defaults to ['-agent', '-console', '-menu'] if not specified - users Array - privs Array, # defaults to ['-all'] if not specified - access String, # defaults to '-on' if not specified - allow_access_for String, # defaults to '-allUsers' if not specified - computerinfo Array - clientopts Array - action Symbol # defaults to [:activate, :configure] if not specified + install_package String + uninstall_options Array # defaults to ['-files', '-settings', '-prefs'] if not specified + restart_options Array # defaults to ['-agent', '-console', '-menu'] if not specified + users Array + privs Array # defaults to ['-all'] if not specified + access String # defaults to '-on' if not specified + allow_access_for String # defaults to '-allUsers' if not specified + computerinfo Array + clientopts Array + action Symbol # defaults to [:activate, :configure] if not specified end ``` -**Note:** Not all properties are compatible with each action. +:warning: Not all properties are compatible with each action. For example, the +`uninstall_options` property is only applicable when the `:uninstall` action is used. Actions ------- @@ -63,7 +67,7 @@ This resource has the following actions: `:uninstall`       Uninstall a package from another remotely -managed mac. +managed Mac. `:stop` @@ -76,8 +80,7 @@ managed mac. `:configure`       Configure the setup of the remote desktop -agent using the default options. If you were to configure the default options, -your settings would look like this in the GUI: +agent using the default options. Properties ---------- diff --git a/documentation/resource_machine_name.md b/documentation/resource_machine_name.md new file mode 100644 index 0000000..3113bde --- /dev/null +++ b/documentation/resource_machine_name.md @@ -0,0 +1,88 @@ +machine_name +============ + +Use the **machine_name** resource to manage a machine's name. + +As defined by the `scutil` manual, an individual macOS system has three different +types of names managed by `scutil`: `ComputerName`, `LocalHostName`, and `HostName`. + +The fourth and lesser-known name, the **NetBIOS** name, will be set to an appropriately +formatted version of `HostName` by default unless otherwise set explicitly. + +When the state of a `machine_name` resource changes, an `ohai` resource is notified +to reload; this is so that all name changes are reflected and immediately available +via the node's normal attributes. Additionally, regardless of the chosen `ComputerName`, +both `HostName` and `LocalHostName` will be formatted to adhere to [RFC 1034](https://tools.ietf.org/html/rfc1034). + +Syntax +------ + +A **machine_name** resource block manages a machine's name. The simplest use of +the **machine_name** resource is: + +```ruby +machine_name "Johnny's MacBookPro" +``` + +which would set: + +- `ComputerName` to **Johnny's MacBookPro** +- `HostName` and `LocalHostName` to **Johnnys-MacBookPro** +- `NetBIOS` name to **JOHNNYS-MACBOOK**. + +The full syntax for all of the properties that are available to the **machine_name** +resource is: + +```ruby +machine_name 'description' do + computer_name String # defaults to 'hostname' if not specified + local_hostname String # defaults to 'hostname' if not specified + hostname Array # defaults to 'name' if not specified + netbios_name Symbol # defaults to 'hostname' if not specified +end +``` + +Properties +---------- + +`hostname` + +      **Ruby Type:** `String` + +      The name associated with `hostname(1)` and `gethostname(3)`. + +`computer_name` + +      **Ruby type:** `String` + +      The user-friendly name for the system. + +`hostname` + +      **Ruby type:** `String` + +      The local (Bonjour) host name. + +`netbios_name` + +      **Ruby type:** `String` + +      The 16-byte address used to identify a NetBIOS +resource on the network. In the context of macOS, setting this can be helpful when +you need to identify a machine with certain network scanning tools such as `nmap` +or Angry IP Scanner. + +Examples +-------- + +**Set `HostName`, `LocalHostName`, and `ComputerName` to different values** + +```ruby +machine_name 'set computer/hostname' do + hostname 'johnnys-macpro.vagrantup.com' + computer_name "Johnny's MacPro" + local_hostname "Johnnys-MacPro.local" +end +``` + +**Note:** This would automatically set the NetBIOS name to JOHNNYS-MACPRO. diff --git a/documentation/resource_plist.md b/documentation/resource_plist.md index cdceb3f..62b0be8 100644 --- a/documentation/resource_plist.md +++ b/documentation/resource_plist.md @@ -12,11 +12,13 @@ During the `chef-client` run, the client knows to check the state of the plist before changing any values. It also makes sure that the plist is in binary format so that the settings can be interpreted correctly by the operating system. -Prior knowledge of using commandline utilities such as `/usr/bin/defaults` -and `/usr/libexec/PlistBuddy` will be useful when implementing the -**plist** resource. +Prior knowledge of using commandline utilities such as +[defaults](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/defaults.1.html), +[plutil](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/plutil.1.html), +and [PlistBuddy](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) +will be useful when implementing the **plist** resource. -[Learn more about property lists.](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html#//apple_ref/doc/uid/10000048i-CH4-SW5) +Want to learn more? See the [Property List Programming Guide](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html#//apple_ref/doc/uid/10000048i-CH4-SW5). Syntax ------ @@ -26,10 +28,10 @@ resource is: ```ruby plist 'description' do - path String # defaults to 'description' if not specified - entry String - value TrueClass, FalseClass, String, Integer, Float - action Symbol # defaults to :set if not specified + path String # defaults to 'description' if not specified + entry String + value TrueClass, FalseClass, String, Integer, Float + action Symbol # defaults to :set if not specified end ``` @@ -45,7 +47,7 @@ This resource has the following actions: Examples -------- -Enabling the setting to show both visible and invisible files. +**Show invisible files** ```ruby plist 'show hidden files' do diff --git a/documentation/resource_spotlight.md b/documentation/resource_spotlight.md index 786147d..89f6d91 100644 --- a/documentation/resource_spotlight.md +++ b/documentation/resource_spotlight.md @@ -1,32 +1,33 @@ spotlight -=== +========= -Use the **spotlight** resource to manage the metadata indexing state for disk volumes. This -will primarily affect the ability to search volume contents with the macOS Spotlight feature. -Under the hood, a **spotlight** resource executes the `mdutil` command in the `metadata_util` -library. +Use the **spotlight** resource to manage the metadata indexing state for disk volumes. +This will primarily affect the ability to search volume contents with the macOS +Spotlight feature. Under the hood, a **spotlight** resource executes the `mdutil` +command in the `metadata_util` library. [Learn more about Spotlight](https://support.apple.com/en-us/HT204014). -[Learn more about the `mdutil` command](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/mdutil.1.html). +[Learn more about `mdutil`](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/mdutil.1.html). Syntax ------ -The most basic usage of a **spotlight** resource block declares a disk volume as the name property -to **enable** metadata indexing: +The most basic usage of a **spotlight** resource block declares a disk volume as +the name property to **enable** metadata indexing: ```ruby spotlight '/' ``` -The full syntax for all of the properties available to the **spotlight** resource is: +The full syntax for all of the properties available to the **spotlight** resource +is: ```ruby spotlight 'volume name' do volume String # defaults to 'volume name' if not specified indexed TrueClass, FalseClass # defaults to TrueClass if not specified - searchable TrueClass, FalseClass # defaults to TrueClass if not specified + searchable TrueClass, FalseClass # defaults to TrueClass if not specified end ``` @@ -37,9 +38,8 @@ This resource has the following actions: `:set` -      Set the metadata indexing state declared by the `indexed` -property. This is the only, and default, action. - +      Set the metadata indexing state declared by +the `indexed` property. This is the only, and default, action. Properties ---------- @@ -54,31 +54,46 @@ Properties       **Ruby type:** `TrueClass, FalseClass` -      Whether or not the desired state of the named disk volume is to -be indexed. +      Whether or not the desired state of the named +disk volume is to be indexed. `searchable`       **Ruby type:** `TrueClass, FalseClass` -      Disables Spotlight searching if the index has already been -created for the volume. Only applicable if the `indexed` property is set to `false`. +      Disables Spotlight searching if the index has +already been created for the volume. Only applicable if the `indexed` property is +set to `false`. Examples ---------- -```ruby -spotlight '/' # enables indexing on the boot volume +**Enable indexing on the boot volume** -spotlight 'test_disk1' do # disables indexing on 'test_disk1' +```ruby +spotlight '/' +``` + +**Disable indexing on 'test_disk1'** + +```ruby +spotlight 'test_disk1' do # indexed false end +``` +**Enable indexing on a different volume** + +```ruby spotlight 'enable indexing on TDD2' do volume 'TDD2' indexed true end +``` +**Disable indexing and prevent searching** + +```ruby spotlight 'disable indexing and prevent searching index on TDD-ROM' do volume 'TDD-ROM' indexed false diff --git a/documentation/resource_xcode.md b/documentation/resource_xcode.md index 3d267b4..276a6af 100644 --- a/documentation/resource_xcode.md +++ b/documentation/resource_xcode.md @@ -9,6 +9,14 @@ version of iOS simulators are always installed with Xcode. Syntax ------ +The simplest use of an **xcode** resource is: + +```ruby +xcode '9.2' +``` + +which would install Xcode 9.2 with the default simulators. + The full syntax for all of the properties that are available to the **xcode** resource is: @@ -38,17 +46,7 @@ install the declared array of the major versions of `ios_simulators`. Examples -------- -### Basic usage - -The **xcode** resource in its simplest form: - -```ruby -xcode '9.2' -``` - -### Using with node attributes - -Install different versions of Xcode based on the macOS version: +**Install different versions of Xcode based on platform version node attributes** ```ruby if node['platform_version'].match?(/10\.13/) || node['platform_version'].match?(/10\.12/) diff --git a/documentation/sharing_preferences.png b/documentation/sharing_preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..fe780733aaaa54f463367da33a83452b126a68f6 GIT binary patch literal 99310 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 13.0' if respond_to?(:chef_version) -version '1.3.1' +version '1.5.0' source_url 'https://github.com/Microsoft/macos-cookbook' issues_url 'https://github.com/Microsoft/macos-cookbook/issues' diff --git a/recipes/keep_awake.rb b/recipes/keep_awake.rb index 38e0263..abc6d66 100644 --- a/recipes/keep_awake.rb +++ b/recipes/keep_awake.rb @@ -36,7 +36,7 @@ end system_preference 'pressing power button does not sleep computer' do preference :allowpowerbuttontosleepcomputer - setting 'Never' + setting 'Off' only_if { power_button_model? } end diff --git a/resources/machine_name.rb b/resources/machine_name.rb index 1b52d47..a2614bd 100644 --- a/resources/machine_name.rb +++ b/resources/machine_name.rb @@ -1,24 +1,57 @@ resource_name :machine_name -default_action :run -BASE_COMMAND = '/usr/sbin/scutil'.freeze -SMB_SERVER_PLIST = '/Library/Preferences/SystemConfiguration/com.apple.smb.server'.freeze +property :hostname, String, desired_state: true, coerce: proc { |name| conform_to_rfc1034(name) }, required: true, name_property: true +property :computer_name, String, desired_state: true +property :local_hostname, String, desired_state: true, coerce: proc { |name| conform_to_rfc1034(name) } +property :netbios_name, String, desired_state: false, coerce: proc { |name| conform_to_rfc1034(name)[0, 15].upcase } -property :machine_name, String, name_property: true +load_current_value do + hostname get_name('HostName') + computer_name get_name('ComputerName') + local_hostname get_name('LocalHostName') +end -# We cannot set the LocalHostName here because it does not conform to -# the DNS standards outlined in RFC 1034 (section 3.5) - -action :run do - execute BASE_COMMAND do - command "#{BASE_COMMAND} --set HostName '#{new_resource.machine_name}'" +action :set do + converge_if_changed :hostname do + converge_by "set Hostname to #{new_resource.hostname}" do + execute [scutil, '--set', 'HostName', new_resource.hostname] do + notifies :reload, 'ohai[reload ohai]' + end + end end - execute BASE_COMMAND do - command "#{BASE_COMMAND} --set ComputerName '#{new_resource.machine_name}'" + converge_if_changed :computer_name do + property_is_set?(:computer_name) ? new_resource.computer_name : new_resource.computer_name = new_resource.hostname.split('.').first + converge_by "set ComputerName to #{new_resource.computer_name}" do + execute [scutil, '--set', 'ComputerName', new_resource.computer_name] do + notifies :reload, 'ohai[reload ohai]' + end + end end - defaults SMB_SERVER_PLIST do - settings 'NetBIOSName' => new_resource.machine_name + converge_if_changed :local_hostname do + property_is_set?(:local_hostname) ? new_resource.local_hostname : new_resource.local_hostname = new_resource.hostname.split('.').first + converge_by "set LocalHostName to #{new_resource.local_hostname}" do + execute [scutil, '--set', 'LocalHostName', new_resource.local_hostname] do + notifies :reload, 'ohai[reload ohai]' + end + end + end + + property_is_set?(:netbios_name) ? new_resource.netbios_name : new_resource.netbios_name = new_resource.hostname.split('.').first + plist 'netbios name' do # converge_if_changed is not needed since `plist` is already idempotent + path '/Library/Preferences/SystemConfiguration/com.apple.smb.server.plist' + entry 'NetBIOSName' + value new_resource.netbios_name + notifies :restart, 'service[com.apple.smbd]' + notifies :reload, 'ohai[reload ohai]' + end + + service 'com.apple.smbd' do + action :nothing + end + + ohai 'reload ohai' do + action :nothing end end diff --git a/resources/macos_user.rb b/resources/macos_user.rb index 60c5fa0..2760367 100644 --- a/resources/macos_user.rb +++ b/resources/macos_user.rb @@ -6,6 +6,7 @@ property :password, String, default: 'password' property :autologin, [TrueClass] property :admin, [TrueClass] property :fullname, String +property :groups, [Array, String] action_class do def user_home @@ -76,6 +77,24 @@ action :create do mode '0600' end end + + if property_is_set?(:groups) + if groups.is_a? String + group groups do + action :create + members username + append true + end + else + groups.each do |g| + group g do + action :create + members username + append true + end + end + end + end end action :delete do diff --git a/resources/plist.rb b/resources/plist.rb index 1622cd9..268c9e8 100644 --- a/resources/plist.rb +++ b/resources/plist.rb @@ -4,13 +4,6 @@ property :path, String, name_property: true property :entry, String, desired_state: true property :value, [TrueClass, FalseClass, String, Integer, Float], desired_state: true -action_class do - def binary? - file_type_output = shell_out('/usr/bin/file', '--brief', '--mime-encoding', new_resource.path).stdout - file_type_output.strip == 'binary' - end -end - load_current_value do |desired| setting = setting_from_plist(desired.path, desired.entry) current_value_does_not_exist! if setting[:key_type].nil? @@ -33,7 +26,14 @@ action :set do unless binary? converge_by "convert \"#{new_resource.path.split('/').last}\" to binary" do - execute "/usr/bin/plutil -convert binary1 #{new_resource.path}" + execute ['/usr/bin/plutil', '-convert', 'binary1', new_resource.path] end end end + +action_class do + def binary? + file_type_output = shell_out('/usr/bin/file', '--brief', '--mime-encoding', new_resource.path).stdout + file_type_output.chomp == 'binary' + end +end diff --git a/test/cookbooks/macos_test/recipes/machine_name.rb b/test/cookbooks/macos_test/recipes/machine_name.rb index de5fdbd..8b04f78 100644 --- a/test/cookbooks/macos_test/recipes/machine_name.rb +++ b/test/cookbooks/macos_test/recipes/machine_name.rb @@ -1,5 +1,7 @@ -name = "New#{node['platform_version']}_Washing_Machine" +washing_machine = "New#{node['platform_version']}_Washing_Machine" -machine_name name do - not_if { shell_out('scutil', '--get', 'HostName').stdout.match? Regexp.union name } +machine_name 'set computer/hostname' do + hostname washing_machine + computer_name washing_machine + local_hostname washing_machine end diff --git a/test/cookbooks/macos_test/recipes/new_users.rb b/test/cookbooks/macos_test/recipes/new_users.rb index 24ddb38..3c898eb 100644 --- a/test/cookbooks/macos_test/recipes/new_users.rb +++ b/test/cookbooks/macos_test/recipes/new_users.rb @@ -3,10 +3,17 @@ macos_user 'create admin user randall and enable automatic login' do password 'correct-horse-battery-staple' autologin true admin true + groups 'alpha' end macos_user 'create non-admin user johnny' do username 'johnny' fullname 'Johnny Appleseed' password 'yang-yolked-cordon-karate' + groups %w(alpha beta) +end + +macos_user 'create non-admin user paul' do + username 'paul' + password 'yang-yolked-cordon-karate' end diff --git a/test/cookbooks/macos_test/test/smoke/default/machine_name_test.rb b/test/cookbooks/macos_test/test/smoke/default/machine_name_test.rb index f215c29..7f72e58 100644 --- a/test/cookbooks/macos_test/test/smoke/default/machine_name_test.rb +++ b/test/cookbooks/macos_test/test/smoke/default/machine_name_test.rb @@ -1,16 +1,17 @@ -control 'machine name' do - desc 'machine name is set to the format "New#{macos_semantic_version}_Washing_Machine"' +macos_semantic_version = command('sw_vers -productVersion').stdout.strip +friendly_pattern = Regexp.union("New#{macos_semantic_version}_Washing_Machine") +hostname_pattern = Regexp.union("New#{os[:release].tr('.', '')}WashingMachine") - macos_semantic_version = command('sw_vers -productVersion').stdout.strip - hostname_pattern = /New#{macos_semantic_version}_Washing_Machine/ +control 'machine-name' do + desc "machine name is set to the format \"New#{macos_semantic_version}_Washing_Machine\"" - hostname_commands = ['hostname', - 'scutil --get ComputerName', - 'scutil --get HostName'] - - hostname_commands.each do |hostname_command| - describe command(hostname_command) do + %w(HostName LocalHostName).each do |hostname_command| + describe command("scutil --get #{hostname_command}") do its('stdout') { should match hostname_pattern } end + + describe command('scutil --get ComputerName') do + its('stdout') { should match friendly_pattern } + end end end diff --git a/test/cookbooks/macos_test/test/smoke/default/new_users_test.rb b/test/cookbooks/macos_test/test/smoke/default/new_users_test.rb index 2f786fa..ee06cd8 100644 --- a/test/cookbooks/macos_test/test/smoke/default/new_users_test.rb +++ b/test/cookbooks/macos_test/test/smoke/default/new_users_test.rb @@ -6,6 +6,7 @@ control 'new macOS users' do its('uid') { should eq 503 } its('gid') { should eq 20 } its('home') { should eq '/Users/randall' } + its('groups') { should include 'alpha' } end describe user('johnny') do @@ -13,6 +14,8 @@ control 'new macOS users' do its('uid') { should eq 504 } its('gid') { should eq 20 } its('home') { should eq '/Users/johnny' } + its('groups') { should include 'alpha' } + its('groups') { should include 'beta' } end realname_cmd = 'dscl . read /Users/johnny RealName | grep -v RealName | cut -c 2-' @@ -20,4 +23,11 @@ control 'new macOS users' do describe command(realname_cmd) do its('stdout.strip') { should eq 'Johnny Appleseed' } end + + describe user('paul') do + it { should exist } + its('uid') { should eq 505 } + its('gid') { should eq 20 } + its('home') { should eq '/Users/paul' } + end end