inspec 2.0.32 → 2.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +101 -101
- data/CHANGELOG.md +2991 -2970
- data/Gemfile +55 -55
- data/LICENSE +14 -14
- data/MAINTAINERS.md +33 -33
- data/MAINTAINERS.toml +52 -52
- data/README.md +446 -437
- data/Rakefile +322 -322
- data/bin/inspec +12 -12
- data/docs/.gitignore +2 -2
- data/docs/README.md +40 -40
- data/docs/dsl_inspec.md +258 -258
- data/docs/dsl_resource.md +93 -93
- data/docs/glossary.md +99 -99
- data/docs/habitat.md +191 -191
- data/docs/inspec_and_friends.md +107 -107
- data/docs/matchers.md +169 -168
- data/docs/migration.md +293 -293
- data/docs/platforms.md +118 -118
- data/docs/plugin_kitchen_inspec.md +49 -49
- data/docs/profiles.md +370 -370
- data/docs/reporters.md +105 -105
- data/docs/resources/aide_conf.md.erb +75 -75
- data/docs/resources/apache.md.erb +67 -67
- data/docs/resources/apache_conf.md.erb +68 -68
- data/docs/resources/apt.md.erb +71 -71
- data/docs/resources/audit_policy.md.erb +47 -47
- data/docs/resources/auditd.md.erb +79 -79
- data/docs/resources/auditd_conf.md.erb +68 -68
- data/docs/resources/aws_cloudtrail_trail.md.erb +140 -140
- data/docs/resources/aws_cloudtrail_trails.md.erb +81 -81
- data/docs/resources/aws_cloudwatch_alarm.md.erb +86 -86
- data/docs/resources/aws_cloudwatch_log_metric_filter.md.erb +151 -151
- data/docs/resources/aws_config_recorder.md.erb +71 -71
- data/docs/resources/aws_ec2_instance.md.erb +106 -106
- data/docs/resources/aws_iam_access_key.md.erb +123 -123
- data/docs/resources/aws_iam_access_keys.md.erb +198 -198
- data/docs/resources/aws_iam_group.md.erb +46 -46
- data/docs/resources/aws_iam_groups.md.erb +43 -43
- data/docs/resources/aws_iam_password_policy.md.erb +76 -76
- data/docs/resources/aws_iam_policies.md.erb +82 -82
- data/docs/resources/aws_iam_policy.md.erb +144 -144
- data/docs/resources/aws_iam_role.md.erb +63 -63
- data/docs/resources/aws_iam_root_user.md.erb +58 -58
- data/docs/resources/aws_iam_user.md.erb +64 -64
- data/docs/resources/aws_iam_users.md.erb +89 -89
- data/docs/resources/aws_kms_keys.md.erb +84 -84
- data/docs/resources/aws_route_table.md.erb +47 -47
- data/docs/resources/aws_s3_bucket.md.erb +134 -134
- data/docs/resources/aws_security_group.md.erb +151 -151
- data/docs/resources/aws_security_groups.md.erb +91 -91
- data/docs/resources/aws_sns_topic.md.erb +63 -63
- data/docs/resources/aws_subnet.md.erb +133 -133
- data/docs/resources/aws_subnets.md.erb +126 -126
- data/docs/resources/aws_vpc.md.erb +120 -120
- data/docs/resources/aws_vpcs.md.erb +48 -48
- data/docs/resources/azure_generic_resource.md.erb +170 -170
- data/docs/resources/azure_resource_group.md.erb +284 -284
- data/docs/resources/azure_virtual_machine.md.erb +347 -347
- data/docs/resources/azure_virtual_machine_data_disk.md.erb +224 -224
- data/docs/resources/bash.md.erb +75 -75
- data/docs/resources/bond.md.erb +90 -90
- data/docs/resources/bridge.md.erb +57 -57
- data/docs/resources/bsd_service.md.erb +67 -67
- data/docs/resources/command.md.erb +138 -138
- data/docs/resources/cpan.md.erb +79 -79
- data/docs/resources/cran.md.erb +64 -64
- data/docs/resources/crontab.md.erb +89 -89
- data/docs/resources/csv.md.erb +54 -54
- data/docs/resources/dh_params.md.erb +205 -205
- data/docs/resources/directory.md.erb +30 -30
- data/docs/resources/docker.md.erb +219 -219
- data/docs/resources/docker_container.md.erb +104 -104
- data/docs/resources/docker_image.md.erb +94 -94
- data/docs/resources/docker_service.md.erb +114 -114
- data/docs/resources/elasticsearch.md.erb +242 -242
- data/docs/resources/etc_fstab.md.erb +125 -125
- data/docs/resources/etc_group.md.erb +75 -75
- data/docs/resources/etc_hosts.md.erb +78 -78
- data/docs/resources/etc_hosts_allow.md.erb +74 -74
- data/docs/resources/etc_hosts_deny.md.erb +74 -74
- data/docs/resources/file.md.erb +526 -515
- data/docs/resources/filesystem.md.erb +41 -41
- data/docs/resources/firewalld.md.erb +107 -107
- data/docs/resources/gem.md.erb +79 -79
- data/docs/resources/group.md.erb +61 -61
- data/docs/resources/grub_conf.md.erb +101 -101
- data/docs/resources/host.md.erb +86 -86
- data/docs/resources/http.md.erb +196 -196
- data/docs/resources/iis_app.md.erb +122 -122
- data/docs/resources/iis_site.md.erb +135 -135
- data/docs/resources/inetd_conf.md.erb +94 -94
- data/docs/resources/ini.md.erb +76 -76
- data/docs/resources/interface.md.erb +58 -58
- data/docs/resources/iptables.md.erb +64 -64
- data/docs/resources/json.md.erb +63 -63
- data/docs/resources/kernel_module.md.erb +120 -120
- data/docs/resources/kernel_parameter.md.erb +53 -53
- data/docs/resources/key_rsa.md.erb +85 -85
- data/docs/resources/launchd_service.md.erb +57 -57
- data/docs/resources/limits_conf.md.erb +75 -75
- data/docs/resources/login_def.md.erb +71 -71
- data/docs/resources/mount.md.erb +69 -69
- data/docs/resources/mssql_session.md.erb +60 -60
- data/docs/resources/mysql_conf.md.erb +99 -99
- data/docs/resources/mysql_session.md.erb +74 -74
- data/docs/resources/nginx.md.erb +79 -79
- data/docs/resources/nginx_conf.md.erb +128 -128
- data/docs/resources/npm.md.erb +60 -60
- data/docs/resources/ntp_conf.md.erb +60 -60
- data/docs/resources/oneget.md.erb +53 -53
- data/docs/resources/oracledb_session.md.erb +52 -52
- data/docs/resources/os.md.erb +141 -141
- data/docs/resources/os_env.md.erb +78 -78
- data/docs/resources/package.md.erb +120 -120
- data/docs/resources/packages.md.erb +67 -67
- data/docs/resources/parse_config.md.erb +103 -103
- data/docs/resources/parse_config_file.md.erb +138 -138
- data/docs/resources/passwd.md.erb +141 -141
- data/docs/resources/pip.md.erb +67 -67
- data/docs/resources/port.md.erb +137 -137
- data/docs/resources/postgres_conf.md.erb +79 -79
- data/docs/resources/postgres_hba_conf.md.erb +93 -93
- data/docs/resources/postgres_ident_conf.md.erb +76 -76
- data/docs/resources/postgres_session.md.erb +69 -69
- data/docs/resources/powershell.md.erb +102 -102
- data/docs/resources/processes.md.erb +109 -109
- data/docs/resources/rabbitmq_config.md.erb +41 -41
- data/docs/resources/registry_key.md.erb +158 -158
- data/docs/resources/runit_service.md.erb +57 -57
- data/docs/resources/security_policy.md.erb +47 -47
- data/docs/resources/service.md.erb +121 -121
- data/docs/resources/shadow.md.erb +146 -144
- data/docs/resources/ssh_config.md.erb +80 -80
- data/docs/resources/sshd_config.md.erb +83 -83
- data/docs/resources/ssl.md.erb +119 -119
- data/docs/resources/sys_info.md.erb +42 -42
- data/docs/resources/systemd_service.md.erb +57 -57
- data/docs/resources/sysv_service.md.erb +57 -57
- data/docs/resources/upstart_service.md.erb +57 -57
- data/docs/resources/user.md.erb +140 -140
- data/docs/resources/users.md.erb +127 -127
- data/docs/resources/vbscript.md.erb +55 -55
- data/docs/resources/virtualization.md.erb +57 -57
- data/docs/resources/windows_feature.md.erb +47 -47
- data/docs/resources/windows_hotfix.md.erb +53 -53
- data/docs/resources/windows_task.md.erb +95 -95
- data/docs/resources/wmi.md.erb +81 -81
- data/docs/resources/x509_certificate.md.erb +151 -151
- data/docs/resources/xinetd_conf.md.erb +156 -156
- data/docs/resources/xml.md.erb +85 -85
- data/docs/resources/yaml.md.erb +69 -69
- data/docs/resources/yum.md.erb +98 -98
- data/docs/resources/zfs_dataset.md.erb +53 -53
- data/docs/resources/zfs_pool.md.erb +47 -47
- data/docs/ruby_usage.md +203 -203
- data/docs/shared/matcher_be.md.erb +1 -1
- data/docs/shared/matcher_cmp.md.erb +43 -43
- data/docs/shared/matcher_eq.md.erb +3 -3
- data/docs/shared/matcher_include.md.erb +1 -1
- data/docs/shared/matcher_match.md.erb +1 -1
- data/docs/shell.md +215 -215
- data/examples/README.md +8 -8
- data/examples/inheritance/README.md +65 -65
- data/examples/inheritance/controls/example.rb +14 -14
- data/examples/inheritance/inspec.yml +15 -15
- data/examples/kitchen-ansible/.kitchen.yml +25 -25
- data/examples/kitchen-ansible/Gemfile +19 -19
- data/examples/kitchen-ansible/README.md +53 -53
- data/examples/kitchen-ansible/files/nginx.repo +6 -6
- data/examples/kitchen-ansible/tasks/main.yml +16 -16
- data/examples/kitchen-ansible/test/integration/default/default.yml +5 -5
- data/examples/kitchen-ansible/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-chef/.kitchen.yml +20 -20
- data/examples/kitchen-chef/Berksfile +3 -3
- data/examples/kitchen-chef/Gemfile +19 -19
- data/examples/kitchen-chef/README.md +27 -27
- data/examples/kitchen-chef/metadata.rb +7 -7
- data/examples/kitchen-chef/recipes/default.rb +6 -6
- data/examples/kitchen-chef/recipes/nginx.rb +30 -30
- data/examples/kitchen-chef/test/integration/default/web_spec.rb +28 -28
- data/examples/kitchen-puppet/.kitchen.yml +22 -22
- data/examples/kitchen-puppet/Gemfile +20 -20
- data/examples/kitchen-puppet/Puppetfile +25 -25
- data/examples/kitchen-puppet/README.md +53 -53
- data/examples/kitchen-puppet/manifests/site.pp +33 -33
- data/examples/kitchen-puppet/metadata.json +11 -11
- data/examples/kitchen-puppet/test/integration/default/web_spec.rb +28 -28
- data/examples/meta-profile/README.md +37 -37
- data/examples/meta-profile/controls/example.rb +13 -13
- data/examples/meta-profile/inspec.yml +13 -13
- data/examples/profile-attribute.yml +2 -2
- data/examples/profile-attribute/README.md +14 -14
- data/examples/profile-attribute/controls/example.rb +11 -11
- data/examples/profile-attribute/inspec.yml +8 -8
- data/examples/profile-aws/controls/iam_password_policy_expiration.rb +8 -8
- data/examples/profile-aws/controls/iam_password_policy_max_age.rb +8 -8
- data/examples/profile-aws/controls/iam_root_user_mfa.rb +8 -8
- data/examples/profile-aws/controls/iam_users_access_key_age.rb +8 -8
- data/examples/profile-aws/controls/iam_users_console_users_mfa.rb +8 -8
- data/examples/profile-aws/inspec.yml +11 -11
- data/examples/profile-azure/controls/azure_resource_group_example.rb +24 -24
- data/examples/profile-azure/controls/azure_vm_example.rb +29 -29
- data/examples/profile-azure/inspec.yml +11 -11
- data/examples/profile-sensitive/README.md +29 -29
- data/examples/profile-sensitive/controls/sensitive-failures.rb +9 -9
- data/examples/profile-sensitive/controls/sensitive.rb +9 -9
- data/examples/profile-sensitive/inspec.yml +8 -8
- data/examples/profile/README.md +48 -48
- data/examples/profile/controls/example.rb +23 -23
- data/examples/profile/controls/gordon.rb +36 -36
- data/examples/profile/controls/meta.rb +34 -34
- data/examples/profile/inspec.yml +10 -10
- data/examples/profile/libraries/gordon_config.rb +53 -53
- data/inspec.gemspec +47 -47
- data/lib/bundles/README.md +3 -3
- data/lib/bundles/inspec-artifact.rb +7 -7
- data/lib/bundles/inspec-artifact/README.md +1 -1
- data/lib/bundles/inspec-artifact/cli.rb +277 -277
- data/lib/bundles/inspec-compliance.rb +16 -16
- data/lib/bundles/inspec-compliance/.kitchen.yml +20 -20
- data/lib/bundles/inspec-compliance/README.md +185 -185
- data/lib/bundles/inspec-compliance/api.rb +316 -316
- data/lib/bundles/inspec-compliance/api/login.rb +152 -152
- data/lib/bundles/inspec-compliance/bootstrap.sh +41 -41
- data/lib/bundles/inspec-compliance/cli.rb +254 -254
- data/lib/bundles/inspec-compliance/configuration.rb +103 -103
- data/lib/bundles/inspec-compliance/http.rb +86 -86
- data/lib/bundles/inspec-compliance/support.rb +36 -36
- data/lib/bundles/inspec-compliance/target.rb +98 -98
- data/lib/bundles/inspec-compliance/test/integration/default/cli.rb +93 -93
- data/lib/bundles/inspec-habitat.rb +12 -12
- data/lib/bundles/inspec-habitat/cli.rb +36 -36
- data/lib/bundles/inspec-habitat/log.rb +10 -10
- data/lib/bundles/inspec-habitat/profile.rb +390 -390
- data/lib/bundles/inspec-init.rb +8 -8
- data/lib/bundles/inspec-init/README.md +31 -31
- data/lib/bundles/inspec-init/cli.rb +97 -97
- data/lib/bundles/inspec-init/templates/profile/README.md +3 -3
- data/lib/bundles/inspec-init/templates/profile/controls/example.rb +19 -19
- data/lib/bundles/inspec-init/templates/profile/inspec.yml +8 -8
- data/lib/bundles/inspec-supermarket.rb +13 -13
- data/lib/bundles/inspec-supermarket/README.md +45 -45
- data/lib/bundles/inspec-supermarket/api.rb +84 -84
- data/lib/bundles/inspec-supermarket/cli.rb +73 -73
- data/lib/bundles/inspec-supermarket/target.rb +34 -34
- data/lib/fetchers/git.rb +163 -163
- data/lib/fetchers/local.rb +74 -74
- data/lib/fetchers/mock.rb +35 -35
- data/lib/fetchers/url.rb +204 -204
- data/lib/inspec.rb +24 -24
- data/lib/inspec/archive/tar.rb +29 -29
- data/lib/inspec/archive/zip.rb +19 -19
- data/lib/inspec/backend.rb +92 -92
- data/lib/inspec/base_cli.rb +355 -350
- data/lib/inspec/cached_fetcher.rb +66 -66
- data/lib/inspec/cli.rb +292 -292
- data/lib/inspec/completions/bash.sh.erb +45 -45
- data/lib/inspec/completions/fish.sh.erb +34 -34
- data/lib/inspec/completions/zsh.sh.erb +61 -61
- data/lib/inspec/control_eval_context.rb +179 -179
- data/lib/inspec/dependencies/cache.rb +72 -72
- data/lib/inspec/dependencies/dependency_set.rb +92 -92
- data/lib/inspec/dependencies/lockfile.rb +115 -115
- data/lib/inspec/dependencies/requirement.rb +123 -123
- data/lib/inspec/dependencies/resolver.rb +86 -86
- data/lib/inspec/describe.rb +27 -27
- data/lib/inspec/dsl.rb +66 -66
- data/lib/inspec/dsl_shared.rb +33 -33
- data/lib/inspec/env_printer.rb +157 -157
- data/lib/inspec/errors.rb +13 -13
- data/lib/inspec/exceptions.rb +12 -12
- data/lib/inspec/expect.rb +45 -45
- data/lib/inspec/fetcher.rb +45 -45
- data/lib/inspec/file_provider.rb +275 -275
- data/lib/inspec/formatters.rb +3 -3
- data/lib/inspec/formatters/base.rb +250 -250
- data/lib/inspec/formatters/json_rspec.rb +20 -20
- data/lib/inspec/formatters/show_progress.rb +12 -12
- data/lib/inspec/library_eval_context.rb +58 -58
- data/lib/inspec/log.rb +11 -11
- data/lib/inspec/metadata.rb +247 -247
- data/lib/inspec/method_source.rb +24 -24
- data/lib/inspec/objects.rb +14 -14
- data/lib/inspec/objects/attribute.rb +65 -65
- data/lib/inspec/objects/control.rb +61 -61
- data/lib/inspec/objects/describe.rb +92 -92
- data/lib/inspec/objects/each_loop.rb +36 -36
- data/lib/inspec/objects/list.rb +15 -15
- data/lib/inspec/objects/or_test.rb +40 -40
- data/lib/inspec/objects/ruby_helper.rb +15 -15
- data/lib/inspec/objects/tag.rb +27 -27
- data/lib/inspec/objects/test.rb +87 -87
- data/lib/inspec/objects/value.rb +27 -27
- data/lib/inspec/plugins.rb +60 -60
- data/lib/inspec/plugins/cli.rb +24 -24
- data/lib/inspec/plugins/fetcher.rb +86 -86
- data/lib/inspec/plugins/resource.rb +135 -135
- data/lib/inspec/plugins/secret.rb +15 -15
- data/lib/inspec/plugins/source_reader.rb +40 -40
- data/lib/inspec/polyfill.rb +12 -12
- data/lib/inspec/profile.rb +510 -510
- data/lib/inspec/profile_context.rb +207 -207
- data/lib/inspec/profile_vendor.rb +66 -66
- data/lib/inspec/reporters.rb +54 -50
- data/lib/inspec/reporters/base.rb +24 -24
- data/lib/inspec/reporters/cli.rb +356 -356
- data/lib/inspec/reporters/json.rb +116 -116
- data/lib/inspec/reporters/json_min.rb +48 -48
- data/lib/inspec/reporters/junit.rb +77 -77
- data/lib/inspec/require_loader.rb +33 -33
- data/lib/inspec/resource.rb +186 -186
- data/lib/inspec/rule.rb +266 -266
- data/lib/inspec/runner.rb +345 -345
- data/lib/inspec/runner_mock.rb +41 -41
- data/lib/inspec/runner_rspec.rb +175 -175
- data/lib/inspec/runtime_profile.rb +26 -26
- data/lib/inspec/schema.rb +213 -213
- data/lib/inspec/secrets.rb +19 -19
- data/lib/inspec/secrets/yaml.rb +30 -30
- data/lib/inspec/shell.rb +220 -220
- data/lib/inspec/shell_detector.rb +90 -90
- data/lib/inspec/source_reader.rb +29 -29
- data/lib/inspec/version.rb +8 -8
- data/lib/matchers/matchers.rb +339 -339
- data/lib/resource_support/aws.rb +41 -41
- data/lib/resource_support/aws/aws_backend_base.rb +12 -12
- data/lib/resource_support/aws/aws_backend_factory_mixin.rb +12 -12
- data/lib/resource_support/aws/aws_plural_resource_mixin.rb +21 -21
- data/lib/resource_support/aws/aws_resource_mixin.rb +66 -66
- data/lib/resource_support/aws/aws_singular_resource_mixin.rb +24 -24
- data/lib/resources/aide_conf.rb +159 -160
- data/lib/resources/apache.rb +48 -48
- data/lib/resources/apache_conf.rb +156 -156
- data/lib/resources/apt.rb +149 -149
- data/lib/resources/audit_policy.rb +63 -63
- data/lib/resources/auditd.rb +231 -231
- data/lib/resources/auditd_conf.rb +55 -55
- data/lib/resources/aws/aws_cloudtrail_trail.rb +77 -77
- data/lib/resources/aws/aws_cloudtrail_trails.rb +47 -47
- data/lib/resources/aws/aws_cloudwatch_alarm.rb +62 -62
- data/lib/resources/aws/aws_cloudwatch_log_metric_filter.rb +100 -100
- data/lib/resources/aws/aws_config_recorder.rb +98 -98
- data/lib/resources/aws/aws_ec2_instance.rb +157 -157
- data/lib/resources/aws/aws_iam_access_key.rb +106 -106
- data/lib/resources/aws/aws_iam_access_keys.rb +149 -144
- data/lib/resources/aws/aws_iam_group.rb +56 -56
- data/lib/resources/aws/aws_iam_groups.rb +52 -45
- data/lib/resources/aws/aws_iam_password_policy.rb +116 -116
- data/lib/resources/aws/aws_iam_policies.rb +53 -46
- data/lib/resources/aws/aws_iam_policy.rb +125 -119
- data/lib/resources/aws/aws_iam_role.rb +51 -51
- data/lib/resources/aws/aws_iam_root_user.rb +60 -60
- data/lib/resources/aws/aws_iam_user.rb +111 -111
- data/lib/resources/aws/aws_iam_users.rb +108 -96
- data/lib/resources/aws/aws_kms_keys.rb +53 -46
- data/lib/resources/aws/aws_route_table.rb +61 -61
- data/lib/resources/aws/aws_s3_bucket.rb +115 -115
- data/lib/resources/aws/aws_security_group.rb +93 -93
- data/lib/resources/aws/aws_security_groups.rb +68 -68
- data/lib/resources/aws/aws_sns_topic.rb +53 -53
- data/lib/resources/aws/aws_subnet.rb +88 -88
- data/lib/resources/aws/aws_subnets.rb +53 -53
- data/lib/resources/aws/aws_vpc.rb +69 -69
- data/lib/resources/aws/aws_vpcs.rb +45 -45
- data/lib/resources/azure/azure_backend.rb +377 -377
- data/lib/resources/azure/azure_generic_resource.rb +59 -59
- data/lib/resources/azure/azure_resource_group.rb +152 -152
- data/lib/resources/azure/azure_virtual_machine.rb +264 -264
- data/lib/resources/azure/azure_virtual_machine_data_disk.rb +136 -136
- data/lib/resources/bash.rb +35 -35
- data/lib/resources/bond.rb +68 -68
- data/lib/resources/bridge.rb +122 -122
- data/lib/resources/command.rb +73 -69
- data/lib/resources/cpan.rb +58 -58
- data/lib/resources/cran.rb +64 -64
- data/lib/resources/crontab.rb +169 -170
- data/lib/resources/csv.rb +60 -60
- data/lib/resources/dh_params.rb +82 -82
- data/lib/resources/directory.rb +25 -25
- data/lib/resources/docker.rb +236 -236
- data/lib/resources/docker_container.rb +89 -89
- data/lib/resources/docker_image.rb +83 -83
- data/lib/resources/docker_object.rb +57 -57
- data/lib/resources/docker_service.rb +90 -90
- data/lib/resources/elasticsearch.rb +169 -169
- data/lib/resources/etc_fstab.rb +101 -102
- data/lib/resources/etc_group.rb +152 -156
- data/lib/resources/etc_hosts.rb +82 -81
- data/lib/resources/etc_hosts_allow_deny.rb +122 -123
- data/lib/resources/file.rb +298 -298
- data/lib/resources/filesystem.rb +31 -31
- data/lib/resources/firewalld.rb +143 -144
- data/lib/resources/gem.rb +70 -70
- data/lib/resources/groups.rb +215 -215
- data/lib/resources/grub_conf.rb +237 -237
- data/lib/resources/host.rb +306 -300
- data/lib/resources/http.rb +251 -250
- data/lib/resources/iis_app.rb +101 -104
- data/lib/resources/iis_site.rb +148 -148
- data/lib/resources/inetd_conf.rb +62 -62
- data/lib/resources/ini.rb +29 -29
- data/lib/resources/interface.rb +129 -129
- data/lib/resources/iptables.rb +80 -69
- data/lib/resources/json.rb +117 -117
- data/lib/resources/kernel_module.rb +107 -107
- data/lib/resources/kernel_parameter.rb +58 -58
- data/lib/resources/key_rsa.rb +67 -67
- data/lib/resources/limits_conf.rb +55 -55
- data/lib/resources/login_def.rb +66 -66
- data/lib/resources/mount.rb +88 -88
- data/lib/resources/mssql_session.rb +101 -101
- data/lib/resources/mysql.rb +81 -81
- data/lib/resources/mysql_conf.rb +134 -134
- data/lib/resources/mysql_session.rb +71 -71
- data/lib/resources/nginx.rb +96 -96
- data/lib/resources/nginx_conf.rb +227 -227
- data/lib/resources/npm.rb +48 -48
- data/lib/resources/ntp_conf.rb +58 -58
- data/lib/resources/oneget.rb +71 -71
- data/lib/resources/oracledb_session.rb +139 -139
- data/lib/resources/os.rb +36 -36
- data/lib/resources/os_env.rb +76 -76
- data/lib/resources/package.rb +370 -370
- data/lib/resources/packages.rb +111 -111
- data/lib/resources/parse_config.rb +116 -116
- data/lib/resources/passwd.rb +74 -74
- data/lib/resources/pip.rb +89 -89
- data/lib/resources/platform.rb +109 -109
- data/lib/resources/port.rb +771 -771
- data/lib/resources/postgres.rb +130 -130
- data/lib/resources/postgres_conf.rb +121 -121
- data/lib/resources/postgres_hba_conf.rb +99 -100
- data/lib/resources/postgres_ident_conf.rb +76 -78
- data/lib/resources/postgres_session.rb +71 -71
- data/lib/resources/powershell.rb +53 -57
- data/lib/resources/processes.rb +204 -204
- data/lib/resources/rabbitmq_conf.rb +52 -52
- data/lib/resources/registry_key.rb +296 -296
- data/lib/resources/security_policy.rb +180 -180
- data/lib/resources/service.rb +789 -789
- data/lib/resources/shadow.rb +146 -140
- data/lib/resources/ssh_conf.rb +102 -102
- data/lib/resources/ssl.rb +99 -99
- data/lib/resources/sys_info.rb +28 -28
- data/lib/resources/toml.rb +32 -32
- data/lib/resources/users.rb +654 -654
- data/lib/resources/vbscript.rb +68 -69
- data/lib/resources/virtualization.rb +247 -247
- data/lib/resources/windows_feature.rb +84 -84
- data/lib/resources/windows_hotfix.rb +35 -35
- data/lib/resources/windows_task.rb +102 -105
- data/lib/resources/wmi.rb +110 -113
- data/lib/resources/x509_certificate.rb +143 -143
- data/lib/resources/xinetd.rb +111 -111
- data/lib/resources/xml.rb +46 -46
- data/lib/resources/yaml.rb +47 -47
- data/lib/resources/yum.rb +180 -180
- data/lib/resources/zfs_dataset.rb +60 -60
- data/lib/resources/zfs_pool.rb +49 -49
- data/lib/source_readers/flat.rb +39 -39
- data/lib/source_readers/inspec.rb +75 -75
- data/lib/utils/command_wrapper.rb +27 -27
- data/lib/utils/convert.rb +12 -12
- data/lib/utils/database_helpers.rb +77 -77
- data/lib/utils/erlang_parser.rb +192 -192
- data/lib/utils/filter.rb +272 -272
- data/lib/utils/filter_array.rb +27 -27
- data/lib/utils/find_files.rb +44 -44
- data/lib/utils/hash.rb +41 -41
- data/lib/utils/json_log.rb +18 -18
- data/lib/utils/latest_version.rb +22 -22
- data/lib/utils/modulator.rb +12 -12
- data/lib/utils/nginx_parser.rb +85 -85
- data/lib/utils/object_traversal.rb +49 -49
- data/lib/utils/parser.rb +274 -274
- data/lib/utils/plugin_registry.rb +93 -93
- data/lib/utils/simpleconfig.rb +120 -120
- data/lib/utils/spdx.rb +13 -13
- data/lib/utils/spdx.txt +343 -343
- metadata +2 -2
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'resources/azure/azure_backend'
|
|
4
|
-
require 'utils/filter'
|
|
5
|
-
|
|
6
|
-
module Inspec::Resources
|
|
7
|
-
class AzureGenericResource < AzureResourceBase
|
|
8
|
-
name 'azure_generic_resource'
|
|
9
|
-
|
|
10
|
-
desc '
|
|
11
|
-
Inspec Resource to interrogate any Resource type in Azure
|
|
12
|
-
'
|
|
13
|
-
|
|
14
|
-
supports platform: 'azure'
|
|
15
|
-
|
|
16
|
-
attr_accessor :filter, :total, :counts, :name, :type, :location, :probes
|
|
17
|
-
|
|
18
|
-
def initialize(opts = {})
|
|
19
|
-
# Call the parent class constructor
|
|
20
|
-
super(opts)
|
|
21
|
-
|
|
22
|
-
# Get the resource group
|
|
23
|
-
resource_group
|
|
24
|
-
|
|
25
|
-
# Get the resources
|
|
26
|
-
resources
|
|
27
|
-
|
|
28
|
-
# Create the tag methods
|
|
29
|
-
create_tag_methods
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Define the filter table so that it can be interrogated
|
|
33
|
-
@filter = FilterTable.create
|
|
34
|
-
@filter.add_accessor(:count)
|
|
35
|
-
.add_accessor(:entries)
|
|
36
|
-
.add_accessor(:where)
|
|
37
|
-
.add_accessor(:contains)
|
|
38
|
-
.add(:exist?, field: 'exist?')
|
|
39
|
-
.add(:type, field: 'type')
|
|
40
|
-
.add(:name, field: 'name')
|
|
41
|
-
.add(:location, field: 'location')
|
|
42
|
-
.add(:properties, field: 'properties')
|
|
43
|
-
|
|
44
|
-
@filter.connect(self, :probes)
|
|
45
|
-
|
|
46
|
-
def parse_resource(resource)
|
|
47
|
-
# return a hash of information
|
|
48
|
-
parsed = {
|
|
49
|
-
'location' => resource.location,
|
|
50
|
-
'name' => resource.name,
|
|
51
|
-
'type' => resource.type,
|
|
52
|
-
'exist?' => true,
|
|
53
|
-
'properties' => AzureResourceProbe.new(resource.properties),
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
parsed
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'resources/azure/azure_backend'
|
|
4
|
+
require 'utils/filter'
|
|
5
|
+
|
|
6
|
+
module Inspec::Resources
|
|
7
|
+
class AzureGenericResource < AzureResourceBase
|
|
8
|
+
name 'azure_generic_resource'
|
|
9
|
+
|
|
10
|
+
desc '
|
|
11
|
+
Inspec Resource to interrogate any Resource type in Azure
|
|
12
|
+
'
|
|
13
|
+
|
|
14
|
+
supports platform: 'azure'
|
|
15
|
+
|
|
16
|
+
attr_accessor :filter, :total, :counts, :name, :type, :location, :probes
|
|
17
|
+
|
|
18
|
+
def initialize(opts = {})
|
|
19
|
+
# Call the parent class constructor
|
|
20
|
+
super(opts)
|
|
21
|
+
|
|
22
|
+
# Get the resource group
|
|
23
|
+
resource_group
|
|
24
|
+
|
|
25
|
+
# Get the resources
|
|
26
|
+
resources
|
|
27
|
+
|
|
28
|
+
# Create the tag methods
|
|
29
|
+
create_tag_methods
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Define the filter table so that it can be interrogated
|
|
33
|
+
@filter = FilterTable.create
|
|
34
|
+
@filter.add_accessor(:count)
|
|
35
|
+
.add_accessor(:entries)
|
|
36
|
+
.add_accessor(:where)
|
|
37
|
+
.add_accessor(:contains)
|
|
38
|
+
.add(:exist?, field: 'exist?')
|
|
39
|
+
.add(:type, field: 'type')
|
|
40
|
+
.add(:name, field: 'name')
|
|
41
|
+
.add(:location, field: 'location')
|
|
42
|
+
.add(:properties, field: 'properties')
|
|
43
|
+
|
|
44
|
+
@filter.connect(self, :probes)
|
|
45
|
+
|
|
46
|
+
def parse_resource(resource)
|
|
47
|
+
# return a hash of information
|
|
48
|
+
parsed = {
|
|
49
|
+
'location' => resource.location,
|
|
50
|
+
'name' => resource.name,
|
|
51
|
+
'type' => resource.type,
|
|
52
|
+
'exist?' => true,
|
|
53
|
+
'properties' => AzureResourceProbe.new(resource.properties),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
parsed
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'resources/azure/azure_backend'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
class AzureResourceGroup < AzureResourceBase
|
|
7
|
-
name 'azure_resource_group'
|
|
8
|
-
|
|
9
|
-
desc '
|
|
10
|
-
Inspec Resource to get metadata about a specific Resource Group
|
|
11
|
-
'
|
|
12
|
-
|
|
13
|
-
supports platform: 'azure'
|
|
14
|
-
|
|
15
|
-
attr_reader :name, :location, :id, :total, :counts, :mapping
|
|
16
|
-
|
|
17
|
-
# Constructor to get the resource group itself and perform some analysis on the
|
|
18
|
-
# resources that in the resource group.
|
|
19
|
-
#
|
|
20
|
-
# This analysis is defined by the the mapping hashtable which is used to define
|
|
21
|
-
# the 'has_xxx?' methods (see AzureResourceGroup#create_has_methods) and return
|
|
22
|
-
# the counts for each type
|
|
23
|
-
#
|
|
24
|
-
# @author Russell Seymour
|
|
25
|
-
def initialize(opts)
|
|
26
|
-
opts.key?(:name) ? opts[:group_name] = opts[:name] : false
|
|
27
|
-
# Ensure that the opts only have the name of the resource group set
|
|
28
|
-
opts.select! { |k, _v| k == :group_name }
|
|
29
|
-
super(opts)
|
|
30
|
-
|
|
31
|
-
# set the mapping for the Azure Resources
|
|
32
|
-
@mapping = {
|
|
33
|
-
nic: 'Microsoft.Network/networkInterfaces',
|
|
34
|
-
vm: 'Microsoft.Compute/virtualMachines',
|
|
35
|
-
extension: 'Microsoft.Compute/virtualMachines/extensions',
|
|
36
|
-
nsg: 'Microsoft.Network/networkSecurityGroups',
|
|
37
|
-
vnet: 'Microsoft.Network/virtualNetworks',
|
|
38
|
-
managed_disk: 'Microsoft.Compute/disks',
|
|
39
|
-
managed_disk_image: 'Microsoft.Compute/images',
|
|
40
|
-
sa: 'Microsoft.Storage/storageAccounts',
|
|
41
|
-
public_ip: 'Microsoft.Network/publicIPAddresses',
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
# Get information about the resource group itself
|
|
45
|
-
resource_group
|
|
46
|
-
|
|
47
|
-
# Get information about the resources in the resource group
|
|
48
|
-
resources
|
|
49
|
-
|
|
50
|
-
# Call method to create the has_xxxx? methods
|
|
51
|
-
create_has_methods
|
|
52
|
-
|
|
53
|
-
# Call method to allow access to the tag values
|
|
54
|
-
create_tag_methods
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Return the provisioning state of the resource group
|
|
58
|
-
#
|
|
59
|
-
# @author Russell Seymour
|
|
60
|
-
def provisioning_state
|
|
61
|
-
properties.provisioningState
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Analyze the fully qualified id of the resource group to return the subscription id
|
|
65
|
-
# that this resource group is part of
|
|
66
|
-
#
|
|
67
|
-
# The format of the id is
|
|
68
|
-
# /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
|
|
69
|
-
#
|
|
70
|
-
# @author Russell Seymour
|
|
71
|
-
def subscription_id
|
|
72
|
-
id.split(%r{\/}).reject(&:empty?)[1]
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# Method to parse the resources that have been returned
|
|
76
|
-
# This allows the calculations of the amount of resources to be determined
|
|
77
|
-
#
|
|
78
|
-
# @author Russell Seymour
|
|
79
|
-
#
|
|
80
|
-
# @param [Hash] resource A hashtable representing the resource group
|
|
81
|
-
def parse_resource(resource)
|
|
82
|
-
# return a hash of information
|
|
83
|
-
parsed = {
|
|
84
|
-
'name' => resource.name,
|
|
85
|
-
'type' => resource.type,
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
parsed
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# This method catches the xxx_count calls that are made on the resource.
|
|
92
|
-
#
|
|
93
|
-
# The method that is called is stripped of '_count' and then compared with the
|
|
94
|
-
# mappings table. If that type exists then the number of those items is returned.
|
|
95
|
-
# However if that type is not in the Resource Group then the method will return
|
|
96
|
-
# a NoMethodError exception
|
|
97
|
-
#
|
|
98
|
-
# @author Russell Seymour
|
|
99
|
-
#
|
|
100
|
-
# @param [Symbol] method_id The name of the method that was called
|
|
101
|
-
def method_missing(method_id)
|
|
102
|
-
# Determine the mapping_key based on the method_id
|
|
103
|
-
mapping_key = method_id.to_s.chomp('_count').to_sym
|
|
104
|
-
|
|
105
|
-
if mapping.key?(mapping_key)
|
|
106
|
-
# based on the method id get the
|
|
107
|
-
namespace, type_name = mapping[mapping_key].split(/\./)
|
|
108
|
-
|
|
109
|
-
# check that the type_name is defined, if not return 0
|
|
110
|
-
if send(namespace).methods.include?(type_name.to_sym)
|
|
111
|
-
# return the count for the method id
|
|
112
|
-
send(namespace).send(type_name)
|
|
113
|
-
else
|
|
114
|
-
0
|
|
115
|
-
end
|
|
116
|
-
else
|
|
117
|
-
msg = format('undefined method `%s` for %s', method_id, self.class)
|
|
118
|
-
raise NoMethodError, msg
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
private
|
|
123
|
-
|
|
124
|
-
# For each of the mappings this method creates the has_xxx? method. This allows the use
|
|
125
|
-
# of the following type of test
|
|
126
|
-
#
|
|
127
|
-
# it { should have_nics }
|
|
128
|
-
#
|
|
129
|
-
# For example, it will create a has_nics? method that returns a boolean to state of the
|
|
130
|
-
# resource group has any nics at all.
|
|
131
|
-
#
|
|
132
|
-
# @author Russell Seymour
|
|
133
|
-
# @private
|
|
134
|
-
def create_has_methods
|
|
135
|
-
return if failed_resource?
|
|
136
|
-
# Create the has methods for each of the mappings
|
|
137
|
-
# This is a quick test to show that the resource group has at least one of these things
|
|
138
|
-
mapping.each do |name, type|
|
|
139
|
-
# Determine the name of the method name
|
|
140
|
-
method_name = format('has_%ss?', name)
|
|
141
|
-
namespace, type_name = type.split(/\./)
|
|
142
|
-
|
|
143
|
-
# use the namespace and the type_name to determine if the resource group has this type or not
|
|
144
|
-
result = send(namespace).methods.include?(type_name.to_sym) ? true : false
|
|
145
|
-
|
|
146
|
-
define_singleton_method method_name do
|
|
147
|
-
result
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'resources/azure/azure_backend'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
class AzureResourceGroup < AzureResourceBase
|
|
7
|
+
name 'azure_resource_group'
|
|
8
|
+
|
|
9
|
+
desc '
|
|
10
|
+
Inspec Resource to get metadata about a specific Resource Group
|
|
11
|
+
'
|
|
12
|
+
|
|
13
|
+
supports platform: 'azure'
|
|
14
|
+
|
|
15
|
+
attr_reader :name, :location, :id, :total, :counts, :mapping
|
|
16
|
+
|
|
17
|
+
# Constructor to get the resource group itself and perform some analysis on the
|
|
18
|
+
# resources that in the resource group.
|
|
19
|
+
#
|
|
20
|
+
# This analysis is defined by the the mapping hashtable which is used to define
|
|
21
|
+
# the 'has_xxx?' methods (see AzureResourceGroup#create_has_methods) and return
|
|
22
|
+
# the counts for each type
|
|
23
|
+
#
|
|
24
|
+
# @author Russell Seymour
|
|
25
|
+
def initialize(opts)
|
|
26
|
+
opts.key?(:name) ? opts[:group_name] = opts[:name] : false
|
|
27
|
+
# Ensure that the opts only have the name of the resource group set
|
|
28
|
+
opts.select! { |k, _v| k == :group_name }
|
|
29
|
+
super(opts)
|
|
30
|
+
|
|
31
|
+
# set the mapping for the Azure Resources
|
|
32
|
+
@mapping = {
|
|
33
|
+
nic: 'Microsoft.Network/networkInterfaces',
|
|
34
|
+
vm: 'Microsoft.Compute/virtualMachines',
|
|
35
|
+
extension: 'Microsoft.Compute/virtualMachines/extensions',
|
|
36
|
+
nsg: 'Microsoft.Network/networkSecurityGroups',
|
|
37
|
+
vnet: 'Microsoft.Network/virtualNetworks',
|
|
38
|
+
managed_disk: 'Microsoft.Compute/disks',
|
|
39
|
+
managed_disk_image: 'Microsoft.Compute/images',
|
|
40
|
+
sa: 'Microsoft.Storage/storageAccounts',
|
|
41
|
+
public_ip: 'Microsoft.Network/publicIPAddresses',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Get information about the resource group itself
|
|
45
|
+
resource_group
|
|
46
|
+
|
|
47
|
+
# Get information about the resources in the resource group
|
|
48
|
+
resources
|
|
49
|
+
|
|
50
|
+
# Call method to create the has_xxxx? methods
|
|
51
|
+
create_has_methods
|
|
52
|
+
|
|
53
|
+
# Call method to allow access to the tag values
|
|
54
|
+
create_tag_methods
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Return the provisioning state of the resource group
|
|
58
|
+
#
|
|
59
|
+
# @author Russell Seymour
|
|
60
|
+
def provisioning_state
|
|
61
|
+
properties.provisioningState
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Analyze the fully qualified id of the resource group to return the subscription id
|
|
65
|
+
# that this resource group is part of
|
|
66
|
+
#
|
|
67
|
+
# The format of the id is
|
|
68
|
+
# /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
|
|
69
|
+
#
|
|
70
|
+
# @author Russell Seymour
|
|
71
|
+
def subscription_id
|
|
72
|
+
id.split(%r{\/}).reject(&:empty?)[1]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Method to parse the resources that have been returned
|
|
76
|
+
# This allows the calculations of the amount of resources to be determined
|
|
77
|
+
#
|
|
78
|
+
# @author Russell Seymour
|
|
79
|
+
#
|
|
80
|
+
# @param [Hash] resource A hashtable representing the resource group
|
|
81
|
+
def parse_resource(resource)
|
|
82
|
+
# return a hash of information
|
|
83
|
+
parsed = {
|
|
84
|
+
'name' => resource.name,
|
|
85
|
+
'type' => resource.type,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
parsed
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# This method catches the xxx_count calls that are made on the resource.
|
|
92
|
+
#
|
|
93
|
+
# The method that is called is stripped of '_count' and then compared with the
|
|
94
|
+
# mappings table. If that type exists then the number of those items is returned.
|
|
95
|
+
# However if that type is not in the Resource Group then the method will return
|
|
96
|
+
# a NoMethodError exception
|
|
97
|
+
#
|
|
98
|
+
# @author Russell Seymour
|
|
99
|
+
#
|
|
100
|
+
# @param [Symbol] method_id The name of the method that was called
|
|
101
|
+
def method_missing(method_id)
|
|
102
|
+
# Determine the mapping_key based on the method_id
|
|
103
|
+
mapping_key = method_id.to_s.chomp('_count').to_sym
|
|
104
|
+
|
|
105
|
+
if mapping.key?(mapping_key)
|
|
106
|
+
# based on the method id get the
|
|
107
|
+
namespace, type_name = mapping[mapping_key].split(/\./)
|
|
108
|
+
|
|
109
|
+
# check that the type_name is defined, if not return 0
|
|
110
|
+
if send(namespace).methods.include?(type_name.to_sym)
|
|
111
|
+
# return the count for the method id
|
|
112
|
+
send(namespace).send(type_name)
|
|
113
|
+
else
|
|
114
|
+
0
|
|
115
|
+
end
|
|
116
|
+
else
|
|
117
|
+
msg = format('undefined method `%s` for %s', method_id, self.class)
|
|
118
|
+
raise NoMethodError, msg
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
private
|
|
123
|
+
|
|
124
|
+
# For each of the mappings this method creates the has_xxx? method. This allows the use
|
|
125
|
+
# of the following type of test
|
|
126
|
+
#
|
|
127
|
+
# it { should have_nics }
|
|
128
|
+
#
|
|
129
|
+
# For example, it will create a has_nics? method that returns a boolean to state of the
|
|
130
|
+
# resource group has any nics at all.
|
|
131
|
+
#
|
|
132
|
+
# @author Russell Seymour
|
|
133
|
+
# @private
|
|
134
|
+
def create_has_methods
|
|
135
|
+
return if failed_resource?
|
|
136
|
+
# Create the has methods for each of the mappings
|
|
137
|
+
# This is a quick test to show that the resource group has at least one of these things
|
|
138
|
+
mapping.each do |name, type|
|
|
139
|
+
# Determine the name of the method name
|
|
140
|
+
method_name = format('has_%ss?', name)
|
|
141
|
+
namespace, type_name = type.split(/\./)
|
|
142
|
+
|
|
143
|
+
# use the namespace and the type_name to determine if the resource group has this type or not
|
|
144
|
+
result = send(namespace).methods.include?(type_name.to_sym) ? true : false
|
|
145
|
+
|
|
146
|
+
define_singleton_method method_name do
|
|
147
|
+
result
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -1,264 +1,264 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
require 'resources/azure/azure_backend'
|
|
4
|
-
|
|
5
|
-
module Inspec::Resources
|
|
6
|
-
class AzureVirtualMachine < AzureResourceBase
|
|
7
|
-
name 'azure_virtual_machine'
|
|
8
|
-
|
|
9
|
-
desc '
|
|
10
|
-
Inspec Resource to test Azure Virtual Machines
|
|
11
|
-
'
|
|
12
|
-
|
|
13
|
-
supports platform: 'azure'
|
|
14
|
-
|
|
15
|
-
# Constructor for the resource. This calls the parent constructor to
|
|
16
|
-
# get the generic resource for the specified machine. This will provide
|
|
17
|
-
# static methods that are documented
|
|
18
|
-
#
|
|
19
|
-
# @author Russell Seymour
|
|
20
|
-
def initialize(opts = {})
|
|
21
|
-
# The generic resource needs to pass back a Microsoft.Compute/virtualMachines object so force it
|
|
22
|
-
opts[:type] = 'Microsoft.Compute/virtualMachines'
|
|
23
|
-
super(opts)
|
|
24
|
-
|
|
25
|
-
# Find the virtual machines
|
|
26
|
-
resources
|
|
27
|
-
|
|
28
|
-
create_tag_methods
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Method to catch calls that are not explicitly defined.
|
|
32
|
-
# This allows the simple attributes of the virtual machine to be read without having
|
|
33
|
-
# to define each one in turn.
|
|
34
|
-
#
|
|
35
|
-
# rubocop:disable Metrics/AbcSize
|
|
36
|
-
#
|
|
37
|
-
# @param symobl method_id The symbol of the method that has been called
|
|
38
|
-
#
|
|
39
|
-
# @return Value of attribute that has been called
|
|
40
|
-
def method_missing(method_id)
|
|
41
|
-
# Depending on the method that has been called, determine what value should be returned
|
|
42
|
-
# These are set as camel case methods to comply with rubocop
|
|
43
|
-
image_reference_attrs = %w{sku publisher offer}
|
|
44
|
-
osdisk_attrs = %w{os_type caching create_option disk_size_gb}
|
|
45
|
-
hardware_profile_attrs = %w{vm_size}
|
|
46
|
-
os_profile_attrs = %w{computer_name admin_username}
|
|
47
|
-
osdisk_managed_disk_attrs = %w{storage_account_type}
|
|
48
|
-
|
|
49
|
-
# determine the method name to call by converting the snake_case to camelCase
|
|
50
|
-
# method_name = self.camel_case(method_id.to_s)
|
|
51
|
-
method_name = method_id.to_s.split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
|
|
52
|
-
method_name.end_with?('Gb') ? method_name.gsub!(/Gb/, &:upcase) : false
|
|
53
|
-
|
|
54
|
-
if image_reference_attrs.include?(method_id.to_s)
|
|
55
|
-
properties.storageProfile.imageReference.send(method_name)
|
|
56
|
-
elsif osdisk_attrs.include?(method_id.to_s)
|
|
57
|
-
properties.storageProfile.osDisk.send(method_name)
|
|
58
|
-
elsif hardware_profile_attrs.include?(method_id.to_s)
|
|
59
|
-
properties.hardwareProfile.send(method_name)
|
|
60
|
-
elsif os_profile_attrs.include?(method_id.to_s)
|
|
61
|
-
properties.osProfile.send(method_name)
|
|
62
|
-
elsif osdisk_managed_disk_attrs.include?(method_id.to_s)
|
|
63
|
-
properties.storageProfile.osDisk.managedDisk.send(method_name)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Return the name of the os disk
|
|
68
|
-
#
|
|
69
|
-
# @return string Name of the OS disk
|
|
70
|
-
def os_disk_name
|
|
71
|
-
properties.storageProfile.osDisk.name
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Determine if the OS disk is a managed disk
|
|
75
|
-
#
|
|
76
|
-
# @return boolean
|
|
77
|
-
def has_managed_osdisk?
|
|
78
|
-
defined?(properties.storageProfile.osDisk.managedDisk)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Does the machine have any NICs connected
|
|
82
|
-
#
|
|
83
|
-
# @return boolean
|
|
84
|
-
def has_nics?
|
|
85
|
-
properties.networkProfile.networkInterfaces.count != 0
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# How many NICs are connected to the machine
|
|
89
|
-
#
|
|
90
|
-
# @return integer
|
|
91
|
-
def nic_count
|
|
92
|
-
properties.networkProfile.networkInterfaces.count
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Return an array of the connected NICs so that it can be tested to ensure
|
|
96
|
-
# the machine is connected properly
|
|
97
|
-
#
|
|
98
|
-
# @return array Array of NIC names connected to the machine
|
|
99
|
-
def connected_nics
|
|
100
|
-
nic_names = []
|
|
101
|
-
properties.networkProfile.networkInterfaces.each do |nic|
|
|
102
|
-
nic_names << nic.id.split(%r{/}).last
|
|
103
|
-
end
|
|
104
|
-
nic_names
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# Whether the machine has data disks or not
|
|
108
|
-
#
|
|
109
|
-
# @return boolean
|
|
110
|
-
def has_data_disks?
|
|
111
|
-
properties.storageProfile.dataDisks.count != 0
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# How many data disks are connected
|
|
115
|
-
#
|
|
116
|
-
# @return integer
|
|
117
|
-
def data_disk_count
|
|
118
|
-
properties.storageProfile.dataDisks.count
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# Does the machine allow password authentication
|
|
122
|
-
#
|
|
123
|
-
# This allows the use of
|
|
124
|
-
# it { should have_password_authentication }
|
|
125
|
-
# within the Inspec profile
|
|
126
|
-
#
|
|
127
|
-
# @return boolean
|
|
128
|
-
def has_password_authentication?
|
|
129
|
-
password_authentication?
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Deteremine if the machine allows password authentication
|
|
133
|
-
#
|
|
134
|
-
# @return boolean
|
|
135
|
-
def password_authentication?
|
|
136
|
-
# if the osProfile property has a linuxConfiguration section then interrogate that
|
|
137
|
-
# otherwise it is a Windows machine and that always has password auth
|
|
138
|
-
if defined?(properties.osProfile.linuxConfiguration)
|
|
139
|
-
!properties.osProfile.linuxConfiguration.disablePasswordAuthentication
|
|
140
|
-
else
|
|
141
|
-
true
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# Has the machine been given Custom Data at creation
|
|
146
|
-
#
|
|
147
|
-
# This allows the use of
|
|
148
|
-
# it { should have_custom_data }
|
|
149
|
-
# within the Inspec Profile
|
|
150
|
-
#
|
|
151
|
-
# @return boolean
|
|
152
|
-
def has_custom_data?
|
|
153
|
-
custom_data?
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# Determine if custom data has been set
|
|
157
|
-
#
|
|
158
|
-
# @return boolean
|
|
159
|
-
def custom_data?
|
|
160
|
-
if defined?(properties.osProfile.CustomData)
|
|
161
|
-
true
|
|
162
|
-
else
|
|
163
|
-
false
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Are any SSH Keys assigned to the machine
|
|
168
|
-
#
|
|
169
|
-
# This allows the use of
|
|
170
|
-
# it { should have_ssh_keys }
|
|
171
|
-
# within the Inspec Profile
|
|
172
|
-
#
|
|
173
|
-
# @return boolean
|
|
174
|
-
def has_ssh_keys?
|
|
175
|
-
ssh_keys?
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
# Determine if any ssh keys have been asigned to the machine
|
|
179
|
-
#
|
|
180
|
-
# @return boolean
|
|
181
|
-
def ssh_keys?
|
|
182
|
-
if defined?(properties.osProfile.linuxConfiguration.ssh)
|
|
183
|
-
properties.osProfile.linuxConfiguration.ssh.publicKeys != 0
|
|
184
|
-
else
|
|
185
|
-
false
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
# Return the number of ssh keys that have been assigned to the machine
|
|
190
|
-
#
|
|
191
|
-
# @return integer
|
|
192
|
-
def ssh_key_count
|
|
193
|
-
if defined?(properties.osProfile.linuxConfiguration.ssh)
|
|
194
|
-
properties.osProfile.linuxConfiguration.ssh.publicKeys.count
|
|
195
|
-
else
|
|
196
|
-
0
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
# Determine is the specified key is in the ssh_keys list
|
|
201
|
-
#
|
|
202
|
-
# @return array Array of the public keys that are assigned to allow for testing of that key
|
|
203
|
-
def ssh_keys
|
|
204
|
-
# iterate around the keys
|
|
205
|
-
keys = []
|
|
206
|
-
properties.osProfile.linuxConfiguration.ssh.publicKeys.each do |key|
|
|
207
|
-
keys << key.keyData
|
|
208
|
-
end
|
|
209
|
-
keys
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
# Does the machine have boot diagnostics enabled
|
|
213
|
-
#
|
|
214
|
-
# @return boolean
|
|
215
|
-
def has_boot_diagnostics?
|
|
216
|
-
if defined?(properties.diagnosticsProfile)
|
|
217
|
-
properties.diagnosticsProfile.bootDiagnostics.enabled
|
|
218
|
-
else
|
|
219
|
-
false
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
# Return the URI that has been set for the boot diagnostics storage
|
|
224
|
-
#
|
|
225
|
-
# @return string
|
|
226
|
-
def boot_diagnostics_storage_uri
|
|
227
|
-
properties.diagnosticsProfile.bootDiagnostics.storageUri
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
# If this is a windows machine, returns whether the agent was provisioned or not
|
|
231
|
-
#
|
|
232
|
-
# @return boolean
|
|
233
|
-
def has_provision_vmagent?
|
|
234
|
-
if defined?(properties.osProfile.windowsConfiguration)
|
|
235
|
-
properties.osProfile.windowsConfiguration.provisionVMAgent
|
|
236
|
-
else
|
|
237
|
-
false
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
# If a windows machine see if automatic updates for the agent are enabled
|
|
242
|
-
#
|
|
243
|
-
# @return boolean
|
|
244
|
-
def has_automatic_agent_update?
|
|
245
|
-
if defined?(properties.osProfile.windowsConfiguration)
|
|
246
|
-
properties.osProfile.windowsConfiguration.enableAutomaticUpdates
|
|
247
|
-
else
|
|
248
|
-
false
|
|
249
|
-
end
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
# If this is a windows machine return a boolean to state of the WinRM options
|
|
253
|
-
# have been set
|
|
254
|
-
#
|
|
255
|
-
# @return boolean
|
|
256
|
-
def has_winrm_options?
|
|
257
|
-
if defined?(properties.osProfile.windowsConfiguration) && defined?(properties.osProfile.windowsConfiguration.winrm)
|
|
258
|
-
properties.osProfile.windowsConfiguration.winrm.protocol
|
|
259
|
-
else
|
|
260
|
-
false
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
end
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'resources/azure/azure_backend'
|
|
4
|
+
|
|
5
|
+
module Inspec::Resources
|
|
6
|
+
class AzureVirtualMachine < AzureResourceBase
|
|
7
|
+
name 'azure_virtual_machine'
|
|
8
|
+
|
|
9
|
+
desc '
|
|
10
|
+
Inspec Resource to test Azure Virtual Machines
|
|
11
|
+
'
|
|
12
|
+
|
|
13
|
+
supports platform: 'azure'
|
|
14
|
+
|
|
15
|
+
# Constructor for the resource. This calls the parent constructor to
|
|
16
|
+
# get the generic resource for the specified machine. This will provide
|
|
17
|
+
# static methods that are documented
|
|
18
|
+
#
|
|
19
|
+
# @author Russell Seymour
|
|
20
|
+
def initialize(opts = {})
|
|
21
|
+
# The generic resource needs to pass back a Microsoft.Compute/virtualMachines object so force it
|
|
22
|
+
opts[:type] = 'Microsoft.Compute/virtualMachines'
|
|
23
|
+
super(opts)
|
|
24
|
+
|
|
25
|
+
# Find the virtual machines
|
|
26
|
+
resources
|
|
27
|
+
|
|
28
|
+
create_tag_methods
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Method to catch calls that are not explicitly defined.
|
|
32
|
+
# This allows the simple attributes of the virtual machine to be read without having
|
|
33
|
+
# to define each one in turn.
|
|
34
|
+
#
|
|
35
|
+
# rubocop:disable Metrics/AbcSize
|
|
36
|
+
#
|
|
37
|
+
# @param symobl method_id The symbol of the method that has been called
|
|
38
|
+
#
|
|
39
|
+
# @return Value of attribute that has been called
|
|
40
|
+
def method_missing(method_id)
|
|
41
|
+
# Depending on the method that has been called, determine what value should be returned
|
|
42
|
+
# These are set as camel case methods to comply with rubocop
|
|
43
|
+
image_reference_attrs = %w{sku publisher offer}
|
|
44
|
+
osdisk_attrs = %w{os_type caching create_option disk_size_gb}
|
|
45
|
+
hardware_profile_attrs = %w{vm_size}
|
|
46
|
+
os_profile_attrs = %w{computer_name admin_username}
|
|
47
|
+
osdisk_managed_disk_attrs = %w{storage_account_type}
|
|
48
|
+
|
|
49
|
+
# determine the method name to call by converting the snake_case to camelCase
|
|
50
|
+
# method_name = self.camel_case(method_id.to_s)
|
|
51
|
+
method_name = method_id.to_s.split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
|
|
52
|
+
method_name.end_with?('Gb') ? method_name.gsub!(/Gb/, &:upcase) : false
|
|
53
|
+
|
|
54
|
+
if image_reference_attrs.include?(method_id.to_s)
|
|
55
|
+
properties.storageProfile.imageReference.send(method_name)
|
|
56
|
+
elsif osdisk_attrs.include?(method_id.to_s)
|
|
57
|
+
properties.storageProfile.osDisk.send(method_name)
|
|
58
|
+
elsif hardware_profile_attrs.include?(method_id.to_s)
|
|
59
|
+
properties.hardwareProfile.send(method_name)
|
|
60
|
+
elsif os_profile_attrs.include?(method_id.to_s)
|
|
61
|
+
properties.osProfile.send(method_name)
|
|
62
|
+
elsif osdisk_managed_disk_attrs.include?(method_id.to_s)
|
|
63
|
+
properties.storageProfile.osDisk.managedDisk.send(method_name)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Return the name of the os disk
|
|
68
|
+
#
|
|
69
|
+
# @return string Name of the OS disk
|
|
70
|
+
def os_disk_name
|
|
71
|
+
properties.storageProfile.osDisk.name
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Determine if the OS disk is a managed disk
|
|
75
|
+
#
|
|
76
|
+
# @return boolean
|
|
77
|
+
def has_managed_osdisk?
|
|
78
|
+
defined?(properties.storageProfile.osDisk.managedDisk)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Does the machine have any NICs connected
|
|
82
|
+
#
|
|
83
|
+
# @return boolean
|
|
84
|
+
def has_nics?
|
|
85
|
+
properties.networkProfile.networkInterfaces.count != 0
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# How many NICs are connected to the machine
|
|
89
|
+
#
|
|
90
|
+
# @return integer
|
|
91
|
+
def nic_count
|
|
92
|
+
properties.networkProfile.networkInterfaces.count
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Return an array of the connected NICs so that it can be tested to ensure
|
|
96
|
+
# the machine is connected properly
|
|
97
|
+
#
|
|
98
|
+
# @return array Array of NIC names connected to the machine
|
|
99
|
+
def connected_nics
|
|
100
|
+
nic_names = []
|
|
101
|
+
properties.networkProfile.networkInterfaces.each do |nic|
|
|
102
|
+
nic_names << nic.id.split(%r{/}).last
|
|
103
|
+
end
|
|
104
|
+
nic_names
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Whether the machine has data disks or not
|
|
108
|
+
#
|
|
109
|
+
# @return boolean
|
|
110
|
+
def has_data_disks?
|
|
111
|
+
properties.storageProfile.dataDisks.count != 0
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# How many data disks are connected
|
|
115
|
+
#
|
|
116
|
+
# @return integer
|
|
117
|
+
def data_disk_count
|
|
118
|
+
properties.storageProfile.dataDisks.count
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Does the machine allow password authentication
|
|
122
|
+
#
|
|
123
|
+
# This allows the use of
|
|
124
|
+
# it { should have_password_authentication }
|
|
125
|
+
# within the Inspec profile
|
|
126
|
+
#
|
|
127
|
+
# @return boolean
|
|
128
|
+
def has_password_authentication?
|
|
129
|
+
password_authentication?
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Deteremine if the machine allows password authentication
|
|
133
|
+
#
|
|
134
|
+
# @return boolean
|
|
135
|
+
def password_authentication?
|
|
136
|
+
# if the osProfile property has a linuxConfiguration section then interrogate that
|
|
137
|
+
# otherwise it is a Windows machine and that always has password auth
|
|
138
|
+
if defined?(properties.osProfile.linuxConfiguration)
|
|
139
|
+
!properties.osProfile.linuxConfiguration.disablePasswordAuthentication
|
|
140
|
+
else
|
|
141
|
+
true
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Has the machine been given Custom Data at creation
|
|
146
|
+
#
|
|
147
|
+
# This allows the use of
|
|
148
|
+
# it { should have_custom_data }
|
|
149
|
+
# within the Inspec Profile
|
|
150
|
+
#
|
|
151
|
+
# @return boolean
|
|
152
|
+
def has_custom_data?
|
|
153
|
+
custom_data?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Determine if custom data has been set
|
|
157
|
+
#
|
|
158
|
+
# @return boolean
|
|
159
|
+
def custom_data?
|
|
160
|
+
if defined?(properties.osProfile.CustomData)
|
|
161
|
+
true
|
|
162
|
+
else
|
|
163
|
+
false
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Are any SSH Keys assigned to the machine
|
|
168
|
+
#
|
|
169
|
+
# This allows the use of
|
|
170
|
+
# it { should have_ssh_keys }
|
|
171
|
+
# within the Inspec Profile
|
|
172
|
+
#
|
|
173
|
+
# @return boolean
|
|
174
|
+
def has_ssh_keys?
|
|
175
|
+
ssh_keys?
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Determine if any ssh keys have been asigned to the machine
|
|
179
|
+
#
|
|
180
|
+
# @return boolean
|
|
181
|
+
def ssh_keys?
|
|
182
|
+
if defined?(properties.osProfile.linuxConfiguration.ssh)
|
|
183
|
+
properties.osProfile.linuxConfiguration.ssh.publicKeys != 0
|
|
184
|
+
else
|
|
185
|
+
false
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Return the number of ssh keys that have been assigned to the machine
|
|
190
|
+
#
|
|
191
|
+
# @return integer
|
|
192
|
+
def ssh_key_count
|
|
193
|
+
if defined?(properties.osProfile.linuxConfiguration.ssh)
|
|
194
|
+
properties.osProfile.linuxConfiguration.ssh.publicKeys.count
|
|
195
|
+
else
|
|
196
|
+
0
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Determine is the specified key is in the ssh_keys list
|
|
201
|
+
#
|
|
202
|
+
# @return array Array of the public keys that are assigned to allow for testing of that key
|
|
203
|
+
def ssh_keys
|
|
204
|
+
# iterate around the keys
|
|
205
|
+
keys = []
|
|
206
|
+
properties.osProfile.linuxConfiguration.ssh.publicKeys.each do |key|
|
|
207
|
+
keys << key.keyData
|
|
208
|
+
end
|
|
209
|
+
keys
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Does the machine have boot diagnostics enabled
|
|
213
|
+
#
|
|
214
|
+
# @return boolean
|
|
215
|
+
def has_boot_diagnostics?
|
|
216
|
+
if defined?(properties.diagnosticsProfile)
|
|
217
|
+
properties.diagnosticsProfile.bootDiagnostics.enabled
|
|
218
|
+
else
|
|
219
|
+
false
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# Return the URI that has been set for the boot diagnostics storage
|
|
224
|
+
#
|
|
225
|
+
# @return string
|
|
226
|
+
def boot_diagnostics_storage_uri
|
|
227
|
+
properties.diagnosticsProfile.bootDiagnostics.storageUri
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# If this is a windows machine, returns whether the agent was provisioned or not
|
|
231
|
+
#
|
|
232
|
+
# @return boolean
|
|
233
|
+
def has_provision_vmagent?
|
|
234
|
+
if defined?(properties.osProfile.windowsConfiguration)
|
|
235
|
+
properties.osProfile.windowsConfiguration.provisionVMAgent
|
|
236
|
+
else
|
|
237
|
+
false
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
# If a windows machine see if automatic updates for the agent are enabled
|
|
242
|
+
#
|
|
243
|
+
# @return boolean
|
|
244
|
+
def has_automatic_agent_update?
|
|
245
|
+
if defined?(properties.osProfile.windowsConfiguration)
|
|
246
|
+
properties.osProfile.windowsConfiguration.enableAutomaticUpdates
|
|
247
|
+
else
|
|
248
|
+
false
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# If this is a windows machine return a boolean to state of the WinRM options
|
|
253
|
+
# have been set
|
|
254
|
+
#
|
|
255
|
+
# @return boolean
|
|
256
|
+
def has_winrm_options?
|
|
257
|
+
if defined?(properties.osProfile.windowsConfiguration) && defined?(properties.osProfile.windowsConfiguration.winrm)
|
|
258
|
+
properties.osProfile.windowsConfiguration.winrm.protocol
|
|
259
|
+
else
|
|
260
|
+
false
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|