golden hour
/opt/saltstack/salt/lib/python3.10/site-packages/salt/modules
⬆️ Go Up
Upload
File/Folder
Size
Actions
__init__.py
35 B
Del
OK
__pycache__
-
Del
OK
acme.py
12.74 KB
Del
OK
aix_group.py
4.12 KB
Del
OK
aix_shadow.py
1.93 KB
Del
OK
aixpkg.py
24.15 KB
Del
OK
aliases.py
5.07 KB
Del
OK
alternatives.py
5.71 KB
Del
OK
ansiblegate.py
19.51 KB
Del
OK
apache.py
12.47 KB
Del
OK
apcups.py
2.15 KB
Del
OK
apf.py
3.09 KB
Del
OK
apkpkg.py
16 KB
Del
OK
aptly.py
15.28 KB
Del
OK
aptpkg.py
116.64 KB
Del
OK
archive.py
48.63 KB
Del
OK
arista_pyeapi.py
22.06 KB
Del
OK
artifactory.py
24.78 KB
Del
OK
at.py
10.72 KB
Del
OK
at_solaris.py
8.51 KB
Del
OK
augeas_cfg.py
13.93 KB
Del
OK
aws_sqs.py
6.55 KB
Del
OK
azurearm_compute.py
20.8 KB
Del
OK
azurearm_dns.py
15.8 KB
Del
OK
azurearm_network.py
82.99 KB
Del
OK
azurearm_resource.py
35.75 KB
Del
OK
bamboohr.py
7.36 KB
Del
OK
baredoc.py
11.13 KB
Del
OK
bcache.py
28.97 KB
Del
OK
beacons.py
27.82 KB
Del
OK
bigip.py
69.11 KB
Del
OK
bluez_bluetooth.py
6.76 KB
Del
OK
boto3_elasticache.py
37.34 KB
Del
OK
boto3_elasticsearch.py
53.17 KB
Del
OK
boto3_route53.py
39.82 KB
Del
OK
boto3_sns.py
12.93 KB
Del
OK
boto_apigateway.py
61.86 KB
Del
OK
boto_asg.py
35.69 KB
Del
OK
boto_cfn.py
7.95 KB
Del
OK
boto_cloudfront.py
12.75 KB
Del
OK
boto_cloudtrail.py
14.45 KB
Del
OK
boto_cloudwatch.py
10.99 KB
Del
OK
boto_cloudwatch_event.py
9.48 KB
Del
OK
boto_cognitoidentity.py
14.63 KB
Del
OK
boto_datapipeline.py
6.94 KB
Del
OK
boto_dynamodb.py
14.98 KB
Del
OK
boto_ec2.py
79.27 KB
Del
OK
boto_efs.py
14.05 KB
Del
OK
boto_elasticache.py
23.69 KB
Del
OK
boto_elasticsearch_domain.py
15.85 KB
Del
OK
boto_elb.py
35.53 KB
Del
OK
boto_elbv2.py
10.78 KB
Del
OK
boto_iam.py
75.62 KB
Del
OK
boto_iot.py
26.2 KB
Del
OK
boto_kinesis.py
19.62 KB
Del
OK
boto_kms.py
17.29 KB
Del
OK
boto_lambda.py
35.05 KB
Del
OK
boto_rds.py
34.92 KB
Del
OK
boto_route53.py
32.55 KB
Del
OK
boto_s3.py
4.24 KB
Del
OK
boto_s3_bucket.py
31.8 KB
Del
OK
boto_secgroup.py
25.22 KB
Del
OK
boto_sns.py
7.22 KB
Del
OK
boto_sqs.py
6.43 KB
Del
OK
boto_ssm.py
3.63 KB
Del
OK
boto_vpc.py
113.08 KB
Del
OK
bower.py
5.85 KB
Del
OK
bridge.py
10.81 KB
Del
OK
bsd_shadow.py
6.25 KB
Del
OK
btrfs.py
33.66 KB
Del
OK
cabal.py
3.79 KB
Del
OK
capirca_acl.py
40.04 KB
Del
OK
cassandra_cql.py
54.16 KB
Del
OK
cassandra_mod.py
4.3 KB
Del
OK
celery.py
3.33 KB
Del
OK
ceph.py
15.82 KB
Del
OK
chassis.py
1.52 KB
Del
OK
chef.py
4.66 KB
Del
OK
chocolatey.py
41.55 KB
Del
OK
chronos.py
2.89 KB
Del
OK
chroot.py
11.73 KB
Del
OK
cimc.py
23.02 KB
Del
OK
ciscoconfparse_mod.py
14.79 KB
Del
OK
cisconso.py
3.83 KB
Del
OK
cloud.py
9.39 KB
Del
OK
cmdmod.py
163.73 KB
Del
OK
composer.py
10.31 KB
Del
OK
config.py
16.98 KB
Del
OK
consul.py
69.3 KB
Del
OK
container_resource.py
12.94 KB
Del
OK
cp.py
31.98 KB
Del
OK
cpan.py
5.54 KB
Del
OK
cron.py
28.09 KB
Del
OK
cryptdev.py
10.08 KB
Del
OK
csf.py
16.04 KB
Del
OK
cyg.py
8.32 KB
Del
OK
daemontools.py
5.41 KB
Del
OK
data.py
3.85 KB
Del
OK
datadog_api.py
7.76 KB
Del
OK
ddns.py
7.12 KB
Del
OK
deb_apache.py
7.41 KB
Del
OK
deb_postgres.py
4.18 KB
Del
OK
debconfmod.py
4.06 KB
Del
OK
debian_ip.py
64.91 KB
Del
OK
debian_service.py
6.55 KB
Del
OK
debuild_pkgbuild.py
34.68 KB
Del
OK
defaults.py
6.55 KB
Del
OK
devinfo.py
9.07 KB
Del
OK
devmap.py
627 B
Del
OK
dig.py
8.75 KB
Del
OK
disk.py
30.82 KB
Del
OK
djangomod.py
7.53 KB
Del
OK
dnsmasq.py
5.71 KB
Del
OK
dnsutil.py
11.51 KB
Del
OK
dockercompose.py
32.62 KB
Del
OK
dockermod.py
224.85 KB
Del
OK
dpkg_lowpkg.py
12.94 KB
Del
OK
drac.py
10.97 KB
Del
OK
dracr.py
38.53 KB
Del
OK
drbd.py
7.19 KB
Del
OK
dummyproxy_pkg.py
2.46 KB
Del
OK
dummyproxy_service.py
2.91 KB
Del
OK
ebuildpkg.py
38.74 KB
Del
OK
eix.py
1.58 KB
Del
OK
elasticsearch.py
51.44 KB
Del
OK
environ.py
8.96 KB
Del
OK
eselect.py
4.99 KB
Del
OK
esxcluster.py
1.66 KB
Del
OK
esxdatacenter.py
1.68 KB
Del
OK
esxi.py
2.79 KB
Del
OK
esxvm.py
1.63 KB
Del
OK
etcd_mod.py
8.56 KB
Del
OK
ethtool.py
11.12 KB
Del
OK
event.py
7.67 KB
Del
OK
extfs.py
8.78 KB
Del
OK
file.py
232.18 KB
Del
OK
firewalld.py
20.51 KB
Del
OK
freebsd_sysctl.py
4.99 KB
Del
OK
freebsd_update.py
6.19 KB
Del
OK
freebsdjail.py
7.16 KB
Del
OK
freebsdkmod.py
6.17 KB
Del
OK
freebsdpkg.py
17.04 KB
Del
OK
freebsdports.py
13.13 KB
Del
OK
freebsdservice.py
12.53 KB
Del
OK
freezer.py
10.2 KB
Del
OK
gcp_addon.py
4.07 KB
Del
OK
gem.py
10.6 KB
Del
OK
genesis.py
21.75 KB
Del
OK
gentoo_service.py
9.18 KB
Del
OK
gentoolkitmod.py
8.39 KB
Del
OK
git.py
172.01 KB
Del
OK
github.py
53.19 KB
Del
OK
glanceng.py
4.69 KB
Del
OK
glassfish.py
19.49 KB
Del
OK
glusterfs.py
19.55 KB
Del
OK
gnomedesktop.py
6.85 KB
Del
OK
google_chat.py
1.52 KB
Del
OK
gpg.py
39.09 KB
Del
OK
grafana4.py
30.27 KB
Del
OK
grains.py
21.81 KB
Del
OK
groupadd.py
11.87 KB
Del
OK
grub_legacy.py
3.08 KB
Del
OK
guestfs.py
2.37 KB
Del
OK
hadoop.py
3.76 KB
Del
OK
haproxyconn.py
10.17 KB
Del
OK
hashutil.py
6.77 KB
Del
OK
heat.py
25.25 KB
Del
OK
helm.py
39.27 KB
Del
OK
hg.py
7.16 KB
Del
OK
highstate_doc.py
22.76 KB
Del
OK
hosts.py
10.47 KB
Del
OK
http.py
3.76 KB
Del
OK
icinga2.py
4.46 KB
Del
OK
idem.py
1.75 KB
Del
OK
ifttt.py
2.28 KB
Del
OK
ilo.py
15.98 KB
Del
OK
incron.py
7.68 KB
Del
OK
influxdb08mod.py
15.07 KB
Del
OK
influxdbmod.py
16.13 KB
Del
OK
infoblox.py
17.53 KB
Del
OK
ini_manage.py
14.63 KB
Del
OK
inspectlib
-
Del
OK
inspector.py
8.19 KB
Del
OK
introspect.py
4.02 KB
Del
OK
iosconfig.py
14.78 KB
Del
OK
ipmi.py
25.47 KB
Del
OK
ipset.py
17.97 KB
Del
OK
iptables.py
57.44 KB
Del
OK
iwtools.py
3.99 KB
Del
OK
jboss7.py
20.51 KB
Del
OK
jboss7_cli.py
15.23 KB
Del
OK
jenkinsmod.py
11.9 KB
Del
OK
jinja.py
2.66 KB
Del
OK
jira_mod.py
7.07 KB
Del
OK
junos.py
73.96 KB
Del
OK
k8s.py
24.87 KB
Del
OK
kapacitor.py
5.37 KB
Del
OK
kerberos.py
5.42 KB
Del
OK
kernelpkg_linux_apt.py
6.71 KB
Del
OK
kernelpkg_linux_yum.py
7.26 KB
Del
OK
key.py
1007 B
Del
OK
keyboard.py
2.64 KB
Del
OK
keystone.py
43.14 KB
Del
OK
keystoneng.py
21.82 KB
Del
OK
keystore.py
7.18 KB
Del
OK
kmod.py
7.65 KB
Del
OK
kubeadm.py
34.64 KB
Del
OK
kubernetesmod.py
46.77 KB
Del
OK
launchctl_service.py
9.69 KB
Del
OK
layman.py
4.22 KB
Del
OK
ldap3.py
18.81 KB
Del
OK
ldapmod.py
5.9 KB
Del
OK
libcloud_compute.py
23.48 KB
Del
OK
libcloud_dns.py
9.73 KB
Del
OK
libcloud_loadbalancer.py
13.14 KB
Del
OK
libcloud_storage.py
12.16 KB
Del
OK
linux_acl.py
7.7 KB
Del
OK
linux_ip.py
5.55 KB
Del
OK
linux_lvm.py
17.86 KB
Del
OK
linux_service.py
4.64 KB
Del
OK
linux_shadow.py
12.96 KB
Del
OK
linux_sysctl.py
7.5 KB
Del
OK
localemod.py
11.84 KB
Del
OK
locate.py
2.58 KB
Del
OK
logadm.py
9.44 KB
Del
OK
logmod.py
1.25 KB
Del
OK
logrotate.py
7.72 KB
Del
OK
lvs.py
11.54 KB
Del
OK
lxc.py
147.27 KB
Del
OK
lxd.py
90.07 KB
Del
OK
mac_assistive.py
11.37 KB
Del
OK
mac_brew_pkg.py
19.91 KB
Del
OK
mac_desktop.py
2.77 KB
Del
OK
mac_group.py
6.62 KB
Del
OK
mac_keychain.py
6.39 KB
Del
OK
mac_pkgutil.py
2.84 KB
Del
OK
mac_portspkg.py
11.36 KB
Del
OK
mac_power.py
13.29 KB
Del
OK
mac_service.py
19.64 KB
Del
OK
mac_shadow.py
14.23 KB
Del
OK
mac_softwareupdate.py
14.52 KB
Del
OK
mac_sysctl.py
5.13 KB
Del
OK
mac_system.py
15.07 KB
Del
OK
mac_timezone.py
8.34 KB
Del
OK
mac_user.py
16.41 KB
Del
OK
mac_xattr.py
6.27 KB
Del
OK
macdefaults.py
2.33 KB
Del
OK
macpackage.py
6.66 KB
Del
OK
makeconf.py
17.31 KB
Del
OK
mandrill.py
6.31 KB
Del
OK
marathon.py
5.36 KB
Del
OK
match.py
13 KB
Del
OK
mattermost.py
3.4 KB
Del
OK
mdadm_raid.py
9.86 KB
Del
OK
mdata.py
3.38 KB
Del
OK
memcached.py
6.13 KB
Del
OK
mine.py
18.84 KB
Del
OK
minion.py
7.68 KB
Del
OK
mod_random.py
7.18 KB
Del
OK
modjk.py
12.48 KB
Del
OK
mongodb.py
29.75 KB
Del
OK
monit.py
5.51 KB
Del
OK
moosefs.py
3.87 KB
Del
OK
mount.py
58.44 KB
Del
OK
mssql.py
14.64 KB
Del
OK
msteams.py
2.11 KB
Del
OK
munin.py
2.4 KB
Del
OK
mysql.py
90.66 KB
Del
OK
nacl.py
9.72 KB
Del
OK
nagios.py
6.53 KB
Del
OK
nagios_rpc.py
5.09 KB
Del
OK
namecheap_domains.py
12.84 KB
Del
OK
namecheap_domains_dns.py
5.93 KB
Del
OK
namecheap_domains_ns.py
4.51 KB
Del
OK
namecheap_ssl.py
25.69 KB
Del
OK
namecheap_users.py
2.4 KB
Del
OK
napalm_bgp.py
9.72 KB
Del
OK
napalm_formula.py
11.33 KB
Del
OK
napalm_mod.py
61.37 KB
Del
OK
napalm_netacl.py
28.59 KB
Del
OK
napalm_network.py
93.22 KB
Del
OK
napalm_ntp.py
10.22 KB
Del
OK
napalm_probes.py
13.25 KB
Del
OK
napalm_route.py
5.09 KB
Del
OK
napalm_snmp.py
7.05 KB
Del
OK
napalm_users.py
6.49 KB
Del
OK
napalm_yang_mod.py
20.28 KB
Del
OK
netaddress.py
1.6 KB
Del
OK
netbox.py
32.22 KB
Del
OK
netbsd_sysctl.py
3.92 KB
Del
OK
netbsdservice.py
6.43 KB
Del
OK
netmiko_mod.py
19.61 KB
Del
OK
netscaler.py
27.02 KB
Del
OK
network.py
63.42 KB
Del
OK
neutron.py
44.92 KB
Del
OK
neutronng.py
15.02 KB
Del
OK
nexus.py
22.95 KB
Del
OK
nfs3.py
3.9 KB
Del
OK
nftables.py
33.58 KB
Del
OK
nginx.py
3.83 KB
Del
OK
nilrt_ip.py
36.18 KB
Del
OK
nix.py
8.03 KB
Del
OK
nova.py
19.6 KB
Del
OK
npm.py
10.4 KB
Del
OK
nspawn.py
41.35 KB
Del
OK
nxos.py
24.65 KB
Del
OK
nxos_api.py
14.72 KB
Del
OK
nxos_upgrade.py
14.74 KB
Del
OK
omapi.py
3.6 KB
Del
OK
openbsd_sysctl.py
3.74 KB
Del
OK
openbsdpkg.py
10.97 KB
Del
OK
openbsdrcctl_service.py
6.33 KB
Del
OK
openbsdservice.py
8.31 KB
Del
OK
openscap.py
2.81 KB
Del
OK
openstack_config.py
3.21 KB
Del
OK
openstack_mng.py
2.71 KB
Del
OK
openvswitch.py
17.19 KB
Del
OK
opkg.py
49.67 KB
Del
OK
opsgenie.py
3.29 KB
Del
OK
oracle.py
5.82 KB
Del
OK
osquery.py
24.93 KB
Del
OK
out.py
2.53 KB
Del
OK
pacmanpkg.py
31.92 KB
Del
OK
pagerduty.py
4.7 KB
Del
OK
pagerduty_util.py
13.48 KB
Del
OK
pam.py
2.01 KB
Del
OK
panos.py
61.05 KB
Del
OK
parallels.py
19.85 KB
Del
OK
parted_partition.py
21.53 KB
Del
OK
pcs.py
14.11 KB
Del
OK
pdbedit.py
10.79 KB
Del
OK
pecl.py
3.79 KB
Del
OK
peeringdb.py
8.39 KB
Del
OK
pf.py
9.51 KB
Del
OK
philips_hue.py
1.55 KB
Del
OK
pillar.py
21.37 KB
Del
OK
pip.py
53.42 KB
Del
OK
pkg_resource.py
12.3 KB
Del
OK
pkgin.py
17.29 KB
Del
OK
pkgng.py
61.07 KB
Del
OK
pkgutil.py
9.85 KB
Del
OK
portage_config.py
22.73 KB
Del
OK
postfix.py
16.24 KB
Del
OK
postgres.py
88.24 KB
Del
OK
poudriere.py
7.85 KB
Del
OK
powerpath.py
2.57 KB
Del
OK
proxy.py
11.49 KB
Del
OK
ps.py
20.89 KB
Del
OK
publish.py
10.25 KB
Del
OK
puppet.py
10.9 KB
Del
OK
purefa.py
33.59 KB
Del
OK
purefb.py
13.69 KB
Del
OK
pushbullet.py
1.88 KB
Del
OK
pushover_notify.py
3.48 KB
Del
OK
pw_group.py
4.62 KB
Del
OK
pw_user.py
12.47 KB
Del
OK
pyenv.py
6.93 KB
Del
OK
qemu_img.py
1.53 KB
Del
OK
qemu_nbd.py
3.28 KB
Del
OK
quota.py
6.43 KB
Del
OK
rabbitmq.py
38.4 KB
Del
OK
rallydev.py
6.09 KB
Del
OK
random_org.py
23.76 KB
Del
OK
rbac_solaris.py
16.05 KB
Del
OK
rbenv.py
10.75 KB
Del
OK
rdp.py
6.08 KB
Del
OK
rebootmgr.py
7.68 KB
Del
OK
redismod.py
16.36 KB
Del
OK
reg.py
16.36 KB
Del
OK
rest_pkg.py
2.26 KB
Del
OK
rest_sample_utils.py
558 B
Del
OK
rest_service.py
3.63 KB
Del
OK
restartcheck.py
24.1 KB
Del
OK
restconf.py
3.15 KB
Del
OK
ret.py
1.27 KB
Del
OK
rh_ip.py
38.55 KB
Del
OK
rh_service.py
16.61 KB
Del
OK
riak.py
5.19 KB
Del
OK
rpm_lowpkg.py
27.67 KB
Del
OK
rpmbuild_pkgbuild.py
24.53 KB
Del
OK
rsync.py
8.04 KB
Del
OK
runit.py
17.17 KB
Del
OK
rvm.py
11.1 KB
Del
OK
s3.py
9.93 KB
Del
OK
s6.py
3.62 KB
Del
OK
salt_proxy.py
4.48 KB
Del
OK
salt_version.py
4.58 KB
Del
OK
saltcheck.py
46.66 KB
Del
OK
saltcloudmod.py
954 B
Del
OK
saltutil.py
57.49 KB
Del
OK
schedule.py
50.81 KB
Del
OK
scp_mod.py
6.22 KB
Del
OK
scsi.py
2.66 KB
Del
OK
sdb.py
2.48 KB
Del
OK
seed.py
8.87 KB
Del
OK
selinux.py
24.2 KB
Del
OK
sensehat.py
7.79 KB
Del
OK
sensors.py
1.3 KB
Del
OK
serverdensity_device.py
8.1 KB
Del
OK
servicenow.py
4.36 KB
Del
OK
slack_notify.py
7.83 KB
Del
OK
slackware_service.py
6.84 KB
Del
OK
slsutil.py
19.04 KB
Del
OK
smartos_imgadm.py
12.04 KB
Del
OK
smartos_nictagadm.py
6.46 KB
Del
OK
smartos_virt.py
5.21 KB
Del
OK
smartos_vmadm.py
26.2 KB
Del
OK
smbios.py
10.05 KB
Del
OK
smf_service.py
8.52 KB
Del
OK
smtp.py
5.41 KB
Del
OK
snapper.py
27.14 KB
Del
OK
solaris_fmadm.py
11.2 KB
Del
OK
solaris_group.py
2.8 KB
Del
OK
solaris_shadow.py
7.98 KB
Del
OK
solaris_system.py
3.72 KB
Del
OK
solaris_user.py
11.06 KB
Del
OK
solarisipspkg.py
18.68 KB
Del
OK
solarispkg.py
15.4 KB
Del
OK
solr.py
45.54 KB
Del
OK
solrcloud.py
14.63 KB
Del
OK
splunk.py
8.14 KB
Del
OK
splunk_search.py
8.76 KB
Del
OK
sqlite3.py
2.54 KB
Del
OK
ssh.py
43.89 KB
Del
OK
ssh_pkg.py
1.08 KB
Del
OK
ssh_service.py
3.39 KB
Del
OK
state.py
82.34 KB
Del
OK
status.py
57.79 KB
Del
OK
statuspage.py
14.67 KB
Del
OK
supervisord.py
11.15 KB
Del
OK
suse_apache.py
2.45 KB
Del
OK
suse_ip.py
35.72 KB
Del
OK
svn.py
10.75 KB
Del
OK
swarm.py
13.5 KB
Del
OK
swift.py
5.53 KB
Del
OK
sysbench.py
6.62 KB
Del
OK
sysfs.py
6.61 KB
Del
OK
syslog_ng.py
31.52 KB
Del
OK
sysmod.py
22.59 KB
Del
OK
sysrc.py
3.38 KB
Del
OK
system.py
19.28 KB
Del
OK
system_profiler.py
3.54 KB
Del
OK
systemd_service.py
46.29 KB
Del
OK
telegram.py
3.28 KB
Del
OK
telemetry.py
12.87 KB
Del
OK
temp.py
831 B
Del
OK
test.py
15.4 KB
Del
OK
test_virtual.py
237 B
Del
OK
testinframod.py
9.92 KB
Del
OK
textfsm_mod.py
16.22 KB
Del
OK
timezone.py
19.98 KB
Del
OK
tls.py
58.63 KB
Del
OK
tomcat.py
18.59 KB
Del
OK
trafficserver.py
10.44 KB
Del
OK
transactional_update.py
35.83 KB
Del
OK
travisci.py
2.05 KB
Del
OK
tuned.py
2.34 KB
Del
OK
twilio_notify.py
2.95 KB
Del
OK
udev.py
3.72 KB
Del
OK
upstart_service.py
16.92 KB
Del
OK
uptime.py
3.23 KB
Del
OK
useradd.py
22.63 KB
Del
OK
uwsgi.py
996 B
Del
OK
vagrant.py
20.4 KB
Del
OK
varnish.py
3.08 KB
Del
OK
vault.py
15.61 KB
Del
OK
vbox_guest.py
10.55 KB
Del
OK
vboxmanage.py
14.71 KB
Del
OK
vcenter.py
1.61 KB
Del
OK
victorops.py
6.54 KB
Del
OK
virt.py
287.71 KB
Del
OK
virtualenv_mod.py
15.09 KB
Del
OK
vmctl.py
9.56 KB
Del
OK
vsphere.py
380.41 KB
Del
OK
webutil.py
3.66 KB
Del
OK
win_auditpol.py
4.74 KB
Del
OK
win_autoruns.py
2.29 KB
Del
OK
win_certutil.py
4.55 KB
Del
OK
win_dacl.py
32.27 KB
Del
OK
win_disk.py
1.8 KB
Del
OK
win_dism.py
20.7 KB
Del
OK
win_dns_client.py
4.19 KB
Del
OK
win_dsc.py
27.54 KB
Del
OK
win_event.py
22.32 KB
Del
OK
win_file.py
64.39 KB
Del
OK
win_firewall.py
20.15 KB
Del
OK
win_groupadd.py
11.27 KB
Del
OK
win_iis.py
68.78 KB
Del
OK
win_ip.py
11.43 KB
Del
OK
win_lgpo.py
491.76 KB
Del
OK
win_lgpo_reg.py
17.9 KB
Del
OK
win_license.py
2.72 KB
Del
OK
win_network.py
13.9 KB
Del
OK
win_ntp.py
1.8 KB
Del
OK
win_path.py
11.12 KB
Del
OK
win_pkg.py
86.43 KB
Del
OK
win_pki.py
15.8 KB
Del
OK
win_powercfg.py
9.85 KB
Del
OK
win_psget.py
8.97 KB
Del
OK
win_servermanager.py
14.21 KB
Del
OK
win_service.py
32.96 KB
Del
OK
win_shadow.py
3.03 KB
Del
OK
win_shortcut.py
16.49 KB
Del
OK
win_smtp_server.py
17.67 KB
Del
OK
win_snmp.py
13.38 KB
Del
OK
win_status.py
16.94 KB
Del
OK
win_system.py
40.61 KB
Del
OK
win_task.py
79.17 KB
Del
OK
win_timezone.py
13.3 KB
Del
OK
win_useradd.py
27.39 KB
Del
OK
win_wua.py
38.29 KB
Del
OK
win_wusa.py
5.88 KB
Del
OK
winrepo.py
6.09 KB
Del
OK
wordpress.py
4.71 KB
Del
OK
x509.py
63.1 KB
Del
OK
x509_v2.py
74.15 KB
Del
OK
xapi_virt.py
24.07 KB
Del
OK
xbpspkg.py
15.84 KB
Del
OK
xfs.py
15.35 KB
Del
OK
xml.py
2.14 KB
Del
OK
xmpp.py
5.28 KB
Del
OK
yaml.py
1.94 KB
Del
OK
yumpkg.py
116.5 KB
Del
OK
zabbix.py
97.55 KB
Del
OK
zcbuildout.py
28.16 KB
Del
OK
zenoss.py
5.64 KB
Del
OK
zfs.py
34.44 KB
Del
OK
zk_concurrency.py
11.16 KB
Del
OK
znc.py
2.26 KB
Del
OK
zoneadm.py
15.05 KB
Del
OK
zonecfg.py
21.85 KB
Del
OK
zookeeper.py
14.72 KB
Del
OK
zpool.py
44.02 KB
Del
OK
zypperpkg.py
94.87 KB
Del
OK
Edit: state.py
""" Control the state system on the minion. State Caching ------------- When a highstate is called, the minion automatically caches a copy of the last high data. If you then run a highstate with cache=True it will use that cached highdata and won't hit the fileserver except for ``salt://`` links in the states themselves. """ import logging import os import shutil import sys import tarfile import tempfile import time import salt.config import salt.defaults.exitcodes import salt.payload import salt.state import salt.utils.args import salt.utils.data import salt.utils.event import salt.utils.files import salt.utils.functools import salt.utils.hashutils import salt.utils.jid import salt.utils.json import salt.utils.msgpack import salt.utils.platform import salt.utils.state import salt.utils.stringutils import salt.utils.url import salt.utils.versions from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.loader import _format_cached_grains from salt.runners.state import orchestrate as _orchestrate from salt.utils.odict import OrderedDict __proxyenabled__ = ["*"] __outputter__ = { "sls": "highstate", "sls_id": "highstate", "pkg": "highstate", "top": "highstate", "single": "highstate", "highstate": "highstate", "template": "highstate", "template_str": "highstate", "apply_": "highstate", "test": "highstate", "request": "highstate", "check_request": "highstate", "run_request": "highstate", } __func_alias__ = {"apply_": "apply"} log = logging.getLogger(__name__) # Define the module's virtual name __virtualname__ = "state" def __virtual__(): """ Set the virtualname """ # Update global namespace with functions that are cloned in this module global _orchestrate _orchestrate = salt.utils.functools.namespaced_function(_orchestrate, globals()) return __virtualname__ def _filter_running(runnings): """ Filter out the result: True + no changes data """ ret = { tag: value for tag, value in runnings.items() if not value["result"] or value["changes"] } return ret def _set_retcode(ret, highstate=None): """ Set the return code based on the data back from the state system """ # Set default retcode to 0 __context__["retcode"] = salt.defaults.exitcodes.EX_OK if isinstance(ret, list): __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return if not __utils__["state.check_result"](ret, highstate=highstate): __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_FAILURE def _get_pillar_errors(kwargs, pillar=None): """ Check pillar for errors. If a pillar is passed, it will be checked. Otherwise, the in-memory pillar will checked instead. Passing kwargs['force'] = True short cuts the check and always returns None, indicating no errors. :param kwargs: dictionary of options :param pillar: pillar :return: None or a list of error messages """ return None if kwargs.get("force") else (pillar or __pillar__).get("_errors") def _wait(jid, max_queue=0): """ Wait for all previously started state jobs to finish running """ if jid is None: jid = salt.utils.jid.gen_jid(__opts__) states = _prior_running_states(jid) if not max_queue or len(states) < max_queue: while states: time.sleep(1) states = _prior_running_states(jid) return True return False def _snapper_pre(opts, jid): """ Create a snapper pre snapshot """ snapper_pre = None try: if not opts["test"] and __opts__.get("snapper_states"): # Run the snapper pre snapshot snapper_pre = __salt__["snapper.create_snapshot"]( config=__opts__.get("snapper_states_config", "root"), snapshot_type="pre", description="Salt State run for jid {}".format(jid), __pub_jid=jid, ) except Exception: # pylint: disable=broad-except log.error("Failed to create snapper pre snapshot for jid: %s", jid) return snapper_pre def _snapper_post(opts, jid, pre_num): """ Create the post states snapshot """ try: if not opts["test"] and __opts__.get("snapper_states") and pre_num: # Run the snapper pre snapshot __salt__["snapper.create_snapshot"]( config=__opts__.get("snapper_states_config", "root"), snapshot_type="post", pre_number=pre_num, description="Salt State run for jid {}".format(jid), __pub_jid=jid, ) except Exception: # pylint: disable=broad-except log.error("Failed to create snapper pre snapshot for jid: %s", jid) def _get_pause(jid, state_id=None): """ Return the pause information for a given jid """ pause_dir = os.path.join(__opts__["cachedir"], "state_pause") pause_path = os.path.join(pause_dir, jid) if not os.path.exists(pause_dir): try: os.makedirs(pause_dir) except OSError: # File created in the gap pass data = {} if state_id is not None: if state_id not in data: data[state_id] = {} if os.path.exists(pause_path): with salt.utils.files.fopen(pause_path, "rb") as fp_: data = salt.utils.msgpack.loads(fp_.read()) return data, pause_path def get_pauses(jid=None): """ Get a report on all of the currently paused state runs and pause run settings. Optionally send in a jid if you only desire to see a single pause data set. """ ret = {} active = __salt__["saltutil.is_running"]("state.*") pause_dir = os.path.join(__opts__["cachedir"], "state_pause") if not os.path.exists(pause_dir): return ret if jid is None: jids = os.listdir(pause_dir) elif isinstance(jid, list): jids = salt.utils.data.stringify(jid) else: jids = [str(jid)] for scan_jid in jids: is_active = False for active_data in active: if active_data["jid"] == scan_jid: is_active = True if not is_active: try: pause_path = os.path.join(pause_dir, scan_jid) os.remove(pause_path) except OSError: # Already gone pass continue data, pause_path = _get_pause(scan_jid) ret[scan_jid] = data return ret def soft_kill(jid, state_id=None): """ Set up a state run to die before executing the given state id, this instructs a running state to safely exit at a given state id. This needs to pass in the jid of the running state. If a state_id is not passed then the jid referenced will be safely exited at the beginning of the next state run. The given state id is the id got a given state execution, so given a state that looks like this: .. code-block:: yaml vim: pkg.installed: [] The state_id to pass to `soft_kill` is `vim` CLI Examples: .. code-block:: bash salt '*' state.soft_kill 20171130110407769519 salt '*' state.soft_kill 20171130110407769519 vim """ jid = str(jid) if state_id is None: state_id = "__all__" data, pause_path = _get_pause(jid, state_id) data[state_id]["kill"] = True with salt.utils.files.fopen(pause_path, "wb") as fp_: fp_.write(salt.utils.msgpack.dumps(data)) def pause(jid, state_id=None, duration=None): """ Set up a state id pause, this instructs a running state to pause at a given state id. This needs to pass in the jid of the running state and can optionally pass in a duration in seconds. If a state_id is not passed then the jid referenced will be paused at the beginning of the next state run. The given state id is the id got a given state execution, so given a state that looks like this: .. code-block:: yaml vim: pkg.installed: [] The state_id to pass to `pause` is `vim` CLI Examples: .. code-block:: bash salt '*' state.pause 20171130110407769519 salt '*' state.pause 20171130110407769519 vim salt '*' state.pause 20171130110407769519 vim 20 """ jid = str(jid) if state_id is None: state_id = "__all__" data, pause_path = _get_pause(jid, state_id) if duration: data[state_id]["duration"] = int(duration) with salt.utils.files.fopen(pause_path, "wb") as fp_: fp_.write(salt.utils.msgpack.dumps(data)) def resume(jid, state_id=None): """ Remove a pause from a jid, allowing it to continue. If the state_id is not specified then the a general pause will be resumed. The given state_id is the id got a given state execution, so given a state that looks like this: .. code-block:: yaml vim: pkg.installed: [] The state_id to pass to `rm_pause` is `vim` CLI Examples: .. code-block:: bash salt '*' state.resume 20171130110407769519 salt '*' state.resume 20171130110407769519 vim """ jid = str(jid) if state_id is None: state_id = "__all__" data, pause_path = _get_pause(jid, state_id) if state_id in data: data.pop(state_id) if state_id == "__all__": data = {} with salt.utils.files.fopen(pause_path, "wb") as fp_: fp_.write(salt.utils.msgpack.dumps(data)) def orchestrate( mods, saltenv="base", test=None, exclude=None, pillar=None, pillarenv=None ): """ .. versionadded:: 2016.11.0 Execute the orchestrate runner from a masterless minion. .. seealso:: More Orchestrate documentation * :ref:`Full Orchestrate Tutorial <orchestrate-runner>` * Docs for the salt state module :py:mod:`salt.states.saltmod` CLI Examples: .. code-block:: bash salt-call --local state.orchestrate webserver salt-call --local state.orchestrate webserver saltenv=dev test=True salt-call --local state.orchestrate webserver saltenv=dev pillarenv=aws """ return _orchestrate( mods=mods, saltenv=saltenv, test=test, exclude=exclude, pillar=pillar, pillarenv=pillarenv, ) def running(concurrent=False): """ Return a list of strings that contain state return data if a state function is already running. This function is used to prevent multiple state calls from being run at the same time. CLI Example: .. code-block:: bash salt '*' state.running """ ret = [] if concurrent: return ret active = __salt__["saltutil.is_running"]("state.*") for data in active: err = ( 'The function "{}" is running as PID {} and was started at {} ' "with jid {}".format( data["fun"], data["pid"], salt.utils.jid.jid_to_time(data["jid"]), data["jid"], ) ) ret.append(err) return ret def _prior_running_states(jid): """ Return a list of dicts of prior calls to state functions. This function is used to queue state calls so only one is run at a time. """ ret = [] active = __salt__["saltutil.is_running"]("state.*") for data in active: try: data_jid = int(data["jid"]) except ValueError: continue if data_jid < int(jid): ret.append(data) return ret def _check_queue(queue, kwargs): """ Utility function to queue the state run if requested and to check for conflicts in currently running states """ if queue is None: queue = __salt__["config.option"]("state_queue", False) if queue is True: _wait(kwargs.get("__pub_jid")) else: queue_ret = False if not isinstance(queue, bool) and isinstance(queue, int): queue_ret = _wait(kwargs.get("__pub_jid"), max_queue=queue) if not queue_ret: conflict = running(concurrent=kwargs.get("concurrent", False)) if conflict: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return conflict return def _get_initial_pillar(opts): return ( __pillar__.value() if __opts__.get("__cli", None) == "salt-call" and opts["pillarenv"] == __opts__["pillarenv"] else None ) def low(data, queue=None, **kwargs): """ Execute a single low data call This function is mostly intended for testing the state system and is not likely to be needed in everyday usage. CLI Example: .. code-block:: bash salt '*' state.low '{"state": "pkg", "fun": "installed", "name": "vi"}' """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict try: st_ = salt.state.State(__opts__, proxy=__proxy__) except NameError: st_ = salt.state.State(__opts__) err = st_.verify_data(data) if err: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return err ret = st_.call(data) if isinstance(ret, list): __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR if __utils__["state.check_result"](ret): __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_FAILURE return ret def _get_test_value(test=None, **kwargs): """ Determine the correct value for the test flag. """ ret = True if test is None: if salt.utils.args.test_mode(test=test, **kwargs): ret = True elif __salt__["config.get"]("test", omit_opts=True) is True: ret = True else: ret = __opts__.get("test", None) else: ret = test return ret def high(data, test=None, queue=None, **kwargs): """ Execute the compound calls stored in a single set of high data This function is mostly intended for testing the state system and is not likely to be needed in everyday usage. CLI Example: .. code-block:: bash salt '*' state.high '{"vim": {"pkg": ["installed"]}}' """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) try: st_ = salt.state.State( opts, pillar_override, pillar_enc=pillar_enc, proxy=dict(__proxy__), context=dict(__context__), initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.State( opts, pillar_override, pillar_enc=pillar_enc, initial_pillar=_get_initial_pillar(opts), ) ret = st_.call_high(data) _set_retcode(ret, highstate=data) return ret def template(tem, queue=None, **kwargs): """ Execute the information stored in a template file on the minion. This function does not ask a master for a SLS file to render but instead directly processes the file at the provided path on the minion. CLI Example: .. code-block:: bash salt '*' state.template '<Path to template on the minion>' """ if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.HighState( opts, context=dict(__context__), proxy=dict(__proxy__), initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, context=dict(__context__), initial_pillar=_get_initial_pillar(opts) ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) if not tem.endswith(".sls"): tem = "{sls}.sls".format(sls=tem) high_state, errors = st_.render_state( tem, kwargs.get("saltenv", ""), "", None, local=True ) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors ret = st_.state.call_high(high_state) _set_retcode(ret, highstate=high_state) return ret def template_str(tem, queue=None, **kwargs): """ Execute the information stored in a string from an sls template CLI Example: .. code-block:: bash salt '*' state.template_str '<Template String>' """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.State( opts, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts) ) except NameError: st_ = salt.state.State(opts, initial_pillar=_get_initial_pillar(opts)) ret = st_.call_template_str(tem) _set_retcode(ret) return ret def apply_(mods=None, **kwargs): """ .. versionadded:: 2015.5.0 This function will call :mod:`state.highstate <salt.modules.state.highstate>` or :mod:`state.sls <salt.modules.state.sls>` based on the arguments passed to this function. It exists as a more intuitive way of applying states. .. rubric:: APPLYING ALL STATES CONFIGURED IN TOP.SLS (A.K.A. :ref:`HIGHSTATE <running-highstate>`) To apply all configured states, simply run ``state.apply``: .. code-block:: bash salt '*' state.apply The following additional arguments are also accepted when applying all states configured in top.sls: test Run states in test-only (dry-run) mode mock The mock option allows for the state run to execute without actually calling any states. This then returns a mocked return which will show the requisite ordering as well as fully validate the state run. .. versionadded:: 2015.8.4 pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.apply stuff pillar='{"foo": "bar"}' .. note:: Values passed this way will override Pillar values set via ``pillar_roots`` or an external Pillar source. exclude Exclude specific states from execution. Accepts a list of sls names, a comma-separated string of sls names, or a list of dictionaries containing ``sls`` or ``id`` keys. Glob-patterns may be used to match multiple states. .. code-block:: bash salt '*' state.apply exclude=bar,baz salt '*' state.apply exclude=foo* salt '*' state.apply exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" queue : False Instead of failing immediately when another state run is in progress, a value of ``True`` will queue the new state run to begin running once the other has finished. This option starts a new thread for each queued state run, so use this option sparingly. .. versionchanged:: 3006.0 This parameter can also be set via the ``state_queue`` configuration option. Additionally, it can now be set to an integer representing the maximum queue size which can be attained before the state runs will fail to be queued. This can prevent runaway conditions where new threads are started until system performance is hampered. localconfig Optionally, instead of using the minion config, load minion opts from the file specified by this argument, and then merge them with the options from the minion config. This functionality allows for specific states to be run with their own custom minion configuration, including different pillars, file_roots, etc. .. code-block:: bash salt '*' state.apply localconfig=/path/to/minion.yml state_events The state_events option sends progress events as each function in a state run completes execution. .. versionadded:: 3006.0 .. rubric:: APPLYING INDIVIDUAL SLS FILES (A.K.A. :py:func:`STATE.SLS <salt.modules.state.sls>`) To apply individual SLS files, pass them as a comma-separated list: .. code-block:: bash # Run the states configured in salt://stuff.sls (or salt://stuff/init.sls) salt '*' state.apply stuff # Run the states configured in salt://stuff.sls (or salt://stuff/init.sls) # and salt://pkgs.sls (or salt://pkgs/init.sls). salt '*' state.apply stuff,pkgs # Run the states configured in a more deeply nested directory such as salt://my/organized/stuff.sls (or salt://my/organized/stuff/init.sls) salt '*' state.apply my.organized.stuff The following additional arguments are also accepted when applying individual SLS files: test Run states in test-only (dry-run) mode mock The mock option allows for the state run to execute without actually calling any states. This then returns a mocked return which will show the requisite ordering as well as fully validate the state run. .. versionadded:: 2015.8.4 pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.apply stuff pillar='{"foo": "bar"}' .. note:: Values passed this way will override Pillar values set via ``pillar_roots`` or an external Pillar source. queue : False Instead of failing immediately when another state run is in progress, a value of ``True`` will queue the new state run to begin running once the other has finished. This option starts a new thread for each queued state run, so use this option sparingly. .. versionchanged:: 3006.0 This parameter can also be set via the ``state_queue`` configuration option. Additionally, it can now be set to an integer representing the maximum queue size which can be attained before the state runs will fail to be queued. This can prevent runaway conditions where new threads are started until system performance is hampered. concurrent : False Execute state runs concurrently instead of serially .. warning:: This flag is potentially dangerous. It is designed for use when multiple state runs can safely be run at the same time. Do *not* use this flag for performance optimization. saltenv Specify a salt fileserver environment to be used when applying states .. versionchanged:: 0.17.0 Argument name changed from ``env`` to ``saltenv`` .. versionchanged:: 2014.7.0 If no saltenv is specified, the minion config will be checked for an ``environment`` parameter and if found, it will be used. If none is found, ``base`` will be used. In prior releases, the minion config was not checked and ``base`` would always be assumed when the saltenv was not explicitly set. pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. localconfig Optionally, instead of using the minion config, load minion opts from the file specified by this argument, and then merge them with the options from the minion config. This functionality allows for specific states to be run with their own custom minion configuration, including different pillars, file_roots, etc. .. code-block:: bash salt '*' state.apply stuff localconfig=/path/to/minion.yml sync_mods If specified, the desired custom module types will be synced prior to running the SLS files: .. code-block:: bash salt '*' state.apply stuff sync_mods=states,modules salt '*' state.apply stuff sync_mods=all .. note:: This option is ignored when no SLS files are specified, as a :ref:`highstate <running-highstate>` automatically syncs all custom module types. .. versionadded:: 2017.7.8,2018.3.3,2019.2.0 state_events The state_events option sends progress events as each function in a state run completes execution. .. versionadded:: 3006.0 """ if mods: return sls(mods, **kwargs) return highstate(**kwargs) def test(*args, **kwargs): """ .. versionadded:: 3001 Alias for `state.apply` with the kwarg `test` forced to `True`. This is a nicety to avoid the need to type out `test=True` and the possibility of a typo causing changes you do not intend. """ kwargs["test"] = True ret = apply_(*args, **kwargs) return ret def request(mods=None, **kwargs): """ .. versionadded:: 2015.5.0 Request that the local admin execute a state run via `salt-call state.run_request`. All arguments match those of state.apply. CLI Example: .. code-block:: bash salt '*' state.request salt '*' state.request stuff salt '*' state.request stuff,pkgs """ kwargs["test"] = True ret = apply_(mods, **kwargs) notify_path = os.path.join(__opts__["cachedir"], "req_state.p") req = check_request() req.update( { kwargs.get("name", "default"): { "test_run": ret, "mods": mods, "kwargs": kwargs, } } ) with salt.utils.files.set_umask(0o077): try: if salt.utils.platform.is_windows(): # Make sure cache file isn't read-only __salt__["cmd.run"]('attrib -R "{}"'.format(notify_path)) with salt.utils.files.fopen(notify_path, "w+b") as fp_: salt.payload.dump(req, fp_) except OSError: log.error( "Unable to write state request file %s. Check permission.", notify_path ) return ret def check_request(name=None): """ .. versionadded:: 2015.5.0 Return the state request information, if any CLI Example: .. code-block:: bash salt '*' state.check_request """ notify_path = os.path.join(__opts__["cachedir"], "req_state.p") if os.path.isfile(notify_path): with salt.utils.files.fopen(notify_path, "rb") as fp_: req = salt.payload.load(fp_) if name: return req[name] return req return {} def clear_request(name=None): """ .. versionadded:: 2015.5.0 Clear out the state execution request without executing it CLI Example: .. code-block:: bash salt '*' state.clear_request """ notify_path = os.path.join(__opts__["cachedir"], "req_state.p") if not os.path.isfile(notify_path): return True if not name: try: os.remove(notify_path) except OSError: pass else: req = check_request() if name in req: req.pop(name) else: return False with salt.utils.files.set_umask(0o077): try: if salt.utils.platform.is_windows(): # Make sure cache file isn't read-only __salt__["cmd.run"]('attrib -R "{}"'.format(notify_path)) with salt.utils.files.fopen(notify_path, "w+b") as fp_: salt.payload.dump(req, fp_) except OSError: log.error( "Unable to write state request file %s. Check permission.", notify_path, ) return True def run_request(name="default", **kwargs): """ .. versionadded:: 2015.5.0 Execute the pending state request CLI Example: .. code-block:: bash salt '*' state.run_request """ req = check_request() if name not in req: return {} n_req = req[name] if "mods" not in n_req or "kwargs" not in n_req: return {} req[name]["kwargs"].update(kwargs) if "test" in n_req["kwargs"]: n_req["kwargs"].pop("test") if req: ret = apply_(n_req["mods"], **n_req["kwargs"]) try: os.remove(os.path.join(__opts__["cachedir"], "req_state.p")) except OSError: pass return ret return {} def highstate(test=None, queue=None, state_events=None, **kwargs): """ Retrieve the state data from the salt master for this minion and execute it test Run states in test-only (dry-run) mode pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.highstate stuff pillar='{"foo": "bar"}' .. note:: Values passed this way will override Pillar values set via ``pillar_roots`` or an external Pillar source. .. versionchanged:: 2016.3.0 GPG-encrypted CLI Pillar data is now supported via the GPG renderer. See :ref:`here <encrypted-cli-pillar-data>` for details. pillar_enc Specify which renderer to use to decrypt encrypted data located within the ``pillar`` value. Currently, only ``gpg`` is supported. .. versionadded:: 2016.3.0 exclude Exclude specific states from execution. Accepts a list of sls names, a comma-separated string of sls names, or a list of dictionaries containing ``sls`` or ``id`` keys. Glob-patterns may be used to match multiple states. .. code-block:: bash salt '*' state.highstate exclude=bar,baz salt '*' state.highstate exclude=foo* salt '*' state.highstate exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" saltenv Specify a salt fileserver environment to be used when applying states .. versionchanged:: 0.17.0 Argument name changed from ``env`` to ``saltenv``. .. versionchanged:: 2014.7.0 If no saltenv is specified, the minion config will be checked for a ``saltenv`` parameter and if found, it will be used. If none is found, ``base`` will be used. In prior releases, the minion config was not checked and ``base`` would always be assumed when the saltenv was not explicitly set. pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. queue : False Instead of failing immediately when another state run is in progress, a value of ``True`` will queue the new state run to begin running once the other has finished. This option starts a new thread for each queued state run, so use this option sparingly. .. versionchanged:: 3006.0 This parameter can also be set via the ``state_queue`` configuration option. Additionally, it can now be set to an integer representing the maximum queue size which can be attained before the state runs will fail to be queued. This can prevent runaway conditions where new threads are started until system performance is hampered. concurrent : False Execute state runs concurrently instead of serially .. warning:: This flag is potentially dangerous. It is designed for use when multiple state runs can safely be run at the same time. Do *not* use this flag for performance optimization. localconfig Optionally, instead of using the minion config, load minion opts from the file specified by this argument, and then merge them with the options from the minion config. This functionality allows for specific states to be run with their own custom minion configuration, including different pillars, file_roots, etc. mock The mock option allows for the state run to execute without actually calling any states. This then returns a mocked return which will show the requisite ordering as well as fully validate the state run. .. versionadded:: 2015.8.4 state_events The state_events option sends progress events as each function in a state run completes execution. .. versionadded:: 3006.0 CLI Examples: .. code-block:: bash salt '*' state.highstate salt '*' state.highstate whitelist=sls1_to_run,sls2_to_run salt '*' state.highstate exclude=sls_to_exclude salt '*' state.highstate exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" salt '*' state.highstate pillar="{foo: 'Foo!', bar: 'Bar!'}" """ if _disabled(["highstate"]): log.debug( "Salt highstate run is disabled. To re-enable, run state.enable highstate" ) ret = { "name": ( "Salt highstate run is disabled. To re-enable, run state.enable" " highstate" ), "result": "False", "comment": "Disabled", } return ret conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") if "saltenv" in kwargs: opts["saltenv"] = kwargs["saltenv"] if "pillarenv" in kwargs: opts["pillarenv"] = kwargs["pillarenv"] pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) if state_events is not None: opts["state_events"] = state_events try: st_ = salt.state.HighState( opts, pillar_override, kwargs.get("__pub_jid"), pillar_enc=pillar_enc, proxy=dict(__proxy__), context=dict(__context__), mocked=kwargs.get("mock", False), initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, kwargs.get("__pub_jid"), pillar_enc=pillar_enc, mocked=kwargs.get("mock", False), initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE return ["Pillar failed to render with the following messages:"] + errors st_.push_active() orchestration_jid = kwargs.get("orchestration_jid") snapper_pre = _snapper_pre(opts, kwargs.get("__pub_jid", "called localy")) try: ret = st_.call_highstate( exclude=kwargs.get("exclude", []), cache=kwargs.get("cache", None), cache_name=kwargs.get("cache_name", "highstate"), force=kwargs.get("force", False), whitelist=kwargs.get("whitelist"), orchestration_jid=orchestration_jid, ) finally: st_.pop_active() if isinstance(ret, dict) and ( __salt__["config.option"]("state_data", "") == "terse" or kwargs.get("terse") ): ret = _filter_running(ret) _set_retcode(ret, highstate=st_.building_highstate) _snapper_post(opts, kwargs.get("__pub_jid", "called localy"), snapper_pre) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. __opts__["test"] = orig_test return ret def sls( mods, test=None, exclude=None, queue=None, sync_mods=None, state_events=None, **kwargs ): """ Execute the states in one or more SLS files test Run states in test-only (dry-run) mode pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.sls stuff pillar='{"foo": "bar"}' .. note:: Values passed this way will override existing Pillar values set via ``pillar_roots`` or an external Pillar source. Pillar values that are not included in the kwarg will not be overwritten. .. versionchanged:: 2016.3.0 GPG-encrypted CLI Pillar data is now supported via the GPG renderer. See :ref:`here <encrypted-cli-pillar-data>` for details. pillar_enc Specify which renderer to use to decrypt encrypted data located within the ``pillar`` value. Currently, only ``gpg`` is supported. .. versionadded:: 2016.3.0 exclude Exclude specific states from execution. Accepts a list of sls names, a comma-separated string of sls names, or a list of dictionaries containing ``sls`` or ``id`` keys. Glob-patterns may be used to match multiple states. .. code-block:: bash salt '*' state.sls foo,bar,baz exclude=bar,baz salt '*' state.sls foo,bar,baz exclude=ba* salt '*' state.sls foo,bar,baz exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" queue : False Instead of failing immediately when another state run is in progress, a value of ``True`` will queue the new state run to begin running once the other has finished. This option starts a new thread for each queued state run, so use this option sparingly. .. versionchanged:: 3006.0 This parameter can also be set via the ``state_queue`` configuration option. Additionally, it can now be set to an integer representing the maximum queue size which can be attained before the state runs will fail to be queued. This can prevent runaway conditions where new threads are started until system performance is hampered. concurrent : False Execute state runs concurrently instead of serially .. warning:: This flag is potentially dangerous. It is designed for use when multiple state runs can safely be run at the same time. Do *not* use this flag for performance optimization. saltenv Specify a salt fileserver environment to be used when applying states .. versionchanged:: 0.17.0 Argument name changed from ``env`` to ``saltenv``. .. versionchanged:: 2014.7.0 If no saltenv is specified, the minion config will be checked for an ``environment`` parameter and if found, it will be used. If none is found, ``base`` will be used. In prior releases, the minion config was not checked and ``base`` would always be assumed when the saltenv was not explicitly set. pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. localconfig Optionally, instead of using the minion config, load minion opts from the file specified by this argument, and then merge them with the options from the minion config. This functionality allows for specific states to be run with their own custom minion configuration, including different pillars, file_roots, etc. mock The mock option allows for the state run to execute without actually calling any states. This then returns a mocked return which will show the requisite ordering as well as fully validate the state run. .. versionadded:: 2015.8.4 sync_mods If specified, the desired custom module types will be synced prior to running the SLS files: .. code-block:: bash salt '*' state.sls stuff sync_mods=states,modules salt '*' state.sls stuff sync_mods=all .. versionadded:: 2017.7.8,2018.3.3,2019.2.0 state_events The state_events option sends progress events as each function in a state run completes execution. .. versionadded:: 3006.0 CLI Example: .. code-block:: bash # Run the states configured in salt://example.sls (or salt://example/init.sls) salt '*' state.apply example # Run the states configured in salt://core.sls (or salt://core/init.sls) # and salt://edit/vim.sls (or salt://edit/vim/init.sls) salt '*' state.sls core,edit.vim # Run the states configured in a more deeply nested directory such as salt://my/nested/state.sls (or salt://my/nested/state/init.sls) salt '*' state.sls my.nested.state salt '*' state.sls core exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" salt '*' state.sls myslsfile pillar="{foo: 'Foo!', bar: 'Bar!'}" """ concurrent = kwargs.get("concurrent", False) if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") # Modification to __opts__ lost after this conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict if isinstance(mods, list): disabled = _disabled(mods) else: disabled = _disabled([mods]) if disabled: for state in disabled: log.debug( "Salt state %s is disabled. To re-enable, run state.enable %s", state, state, ) __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return disabled orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) # Since this is running a specific SLS file (or files), fall back to the # 'base' saltenv if none is configured and none was passed. if opts["saltenv"] is None: opts["saltenv"] = "base" pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) cfn = os.path.join( __opts__["cachedir"], "{}.cache.p".format(kwargs.get("cache_name", "highstate")), ) if sync_mods is True: sync_mods = ["all"] if sync_mods is not None: sync_mods = salt.utils.args.split_input(sync_mods) else: sync_mods = [] if "all" in sync_mods and sync_mods != ["all"]: # Prevent unnecessary extra syncing sync_mods = ["all"] for module_type in sync_mods: try: __salt__["saltutil.sync_{}".format(module_type)](saltenv=opts["saltenv"]) except KeyError: log.warning("Invalid custom module type '%s', ignoring", module_type) if state_events is not None: opts["state_events"] = state_events try: st_ = salt.state.HighState( opts, pillar_override, kwargs.get("__pub_jid"), pillar_enc=pillar_enc, proxy=dict(__proxy__), context=dict(__context__), mocked=kwargs.get("mock", False), initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, kwargs.get("__pub_jid"), pillar_enc=pillar_enc, mocked=kwargs.get("mock", False), initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE return ["Pillar failed to render with the following messages:"] + errors orchestration_jid = kwargs.get("orchestration_jid") with salt.utils.files.set_umask(0o077): if kwargs.get("cache"): if os.path.isfile(cfn): with salt.utils.files.fopen(cfn, "rb") as fp_: high_ = salt.payload.load(fp_) return st_.state.call_high(high_, orchestration_jid) # If the state file is an integer, convert to a string then to unicode if isinstance(mods, int): mods = salt.utils.stringutils.to_unicode(str(mods)) mods = salt.utils.args.split_input(mods) st_.push_active() try: high_, errors = st_.render_highstate({opts["saltenv"]: mods}) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors if exclude: exclude = salt.utils.args.split_input(exclude) if "__exclude__" in high_: high_["__exclude__"].extend(exclude) else: high_["__exclude__"] = exclude snapper_pre = _snapper_pre(opts, kwargs.get("__pub_jid", "called localy")) ret = st_.state.call_high(high_, orchestration_jid) finally: st_.pop_active() if __salt__["config.option"]("state_data", "") == "terse" or kwargs.get("terse"): ret = _filter_running(ret) cache_file = os.path.join(__opts__["cachedir"], "sls.p") with salt.utils.files.set_umask(0o077): try: if salt.utils.platform.is_windows(): # Make sure cache file isn't read-only __salt__["cmd.run"](["attrib", "-R", cache_file], python_shell=False) with salt.utils.files.fopen(cache_file, "w+b") as fp_: salt.payload.dump(ret, fp_) except OSError: log.error( "Unable to write to SLS cache file %s. Check permission.", cache_file ) _set_retcode(ret, high_) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. __opts__["test"] = orig_test try: with salt.utils.files.fopen(cfn, "w+b") as fp_: try: salt.payload.dump(high_, fp_) except TypeError: # Can't serialize pydsl pass except OSError: log.error( "Unable to write to highstate cache file %s. Do you have permissions?", cfn, ) _snapper_post(opts, kwargs.get("__pub_jid", "called localy"), snapper_pre) return ret def top(topfn, test=None, queue=None, **kwargs): """ Execute a specific top file instead of the default. This is useful to apply configurations from a different environment (for example, dev or prod), without modifying the default top file. queue : False Instead of failing immediately when another state run is in progress, a value of ``True`` will queue the new state run to begin running once the other has finished. This option starts a new thread for each queued state run, so use this option sparingly. .. versionchanged:: 3006.0 This parameter can also be set via the ``state_queue`` configuration option. Additionally, it can now be set to an integer representing the maximum queue size which can be attained before the state runs will fail to be queued. This can prevent runaway conditions where new threads are started until system performance is hampered. saltenv Specify a salt fileserver environment to be used when applying states pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. .. versionadded:: 2017.7.0 CLI Example: .. code-block:: bash salt '*' state.top reverse_top.sls salt '*' state.top prod_top.sls exclude=sls_to_exclude salt '*' state.top dev_top.sls exclude="[{'id': 'id_to_exclude'}, {'sls': 'sls_to_exclude'}]" """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) try: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, context=dict(__context__), proxy=dict(__proxy__), initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, context=dict(__context__), initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE return ["Pillar failed to render with the following messages:"] + errors st_.push_active() st_.opts["state_top"] = salt.utils.url.create(topfn) ret = {} orchestration_jid = kwargs.get("orchestration_jid") if "saltenv" in kwargs: st_.opts["state_top_saltenv"] = kwargs["saltenv"] try: snapper_pre = _snapper_pre(opts, kwargs.get("__pub_jid", "called localy")) ret = st_.call_highstate( exclude=kwargs.get("exclude", []), cache=kwargs.get("cache", None), cache_name=kwargs.get("cache_name", "highstate"), orchestration_jid=orchestration_jid, ) finally: st_.pop_active() _set_retcode(ret, highstate=st_.building_highstate) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. _snapper_post(opts, kwargs.get("__pub_jid", "called localy"), snapper_pre) __opts__["test"] = orig_test return ret def show_highstate(queue=None, **kwargs): """ Retrieve the highstate data from the salt master and display it Custom Pillar data can be passed with the ``pillar`` kwarg. CLI Example: .. code-block:: bash salt '*' state.show_highstate """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) st_.push_active() try: ret = st_.compile_highstate() finally: st_.pop_active() _set_retcode(ret) return ret def show_lowstate(queue=None, **kwargs): """ List out the low data that will be applied to this minion CLI Example: .. code-block:: bash salt '*' state.show_lowstate """ conflict = _check_queue(queue, kwargs) if conflict is not None: assert False return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.HighState( opts, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts) ) except NameError: st_ = salt.state.HighState(opts, initial_pillar=_get_initial_pillar(opts)) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) st_.push_active() try: ret = st_.compile_low_chunks() finally: st_.pop_active() return ret def show_state_usage(queue=None, **kwargs): """ Retrieve the highstate data from the salt master to analyse used and unused states Custom Pillar data can be passed with the ``pillar`` kwarg. CLI Example: .. code-block:: bash salt '*' state.show_state_usage """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict pillar = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if pillar_enc is None and pillar is not None and not isinstance(pillar, dict): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) with salt.state.HighState(__opts__, pillar, pillar_enc=pillar_enc) as st_: st_.push_active() try: ret = st_.compile_state_usage() finally: st_.pop_active() _set_retcode(ret) return ret def show_states(queue=None, **kwargs): """ Returns the list of states that will be applied on highstate. CLI Example: .. code-block:: bash salt '*' state.show_states .. versionadded:: 2019.2.0 """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.HighState( opts, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts) ) except NameError: st_ = salt.state.HighState(opts, initial_pillar=_get_initial_pillar(opts)) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) st_.push_active() states = OrderedDict() try: result = st_.compile_low_chunks() if not isinstance(result, list): raise Exception(result) for s in result: if not isinstance(s, dict): _set_retcode(result) return result states[s["__sls__"]] = True finally: st_.pop_active() return list(states.keys()) def sls_id(id_, mods, test=None, queue=None, state_events=None, **kwargs): """ Call a single ID from the named module(s) and handle all requisites The state ID comes *before* the module ID(s) on the command line. id ID to call mods Comma-delimited list of modules to search for given id and its requisites .. versionadded:: 2014.7.0 saltenv : base Specify a salt fileserver environment to be used when applying states pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.sls_id my_state my_module pillar='{"foo": "bar"}' .. note:: Values passed this way will override existing Pillar values set via ``pillar_roots`` or an external Pillar source. Pillar values that are not included in the kwarg will not be overwritten. .. versionadded:: 2018.3.0 CLI Example: .. code-block:: bash salt '*' state.sls_id my_state my_module salt '*' state.sls_id my_state my_module,a_common_module """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) # Since this is running a specific ID within a specific SLS file, fall back # to the 'base' saltenv if none is configured and none was passed. if opts["saltenv"] is None: opts["saltenv"] = "base" pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) if state_events is not None: opts["state_events"] = state_events try: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE return ["Pillar failed to render with the following messages:"] + errors split_mods = salt.utils.args.split_input(mods) st_.push_active() try: high_, errors = st_.render_highstate({opts["saltenv"]: split_mods}) finally: st_.pop_active() errors += st_.state.verify_high(high_) # Apply requisites to high data high_, req_in_errors = st_.state.requisite_in(high_) if req_in_errors: # This if statement should not be necessary if there were no errors, # but it is required to get the unit tests to pass. errors.extend(req_in_errors) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors chunks = st_.state.compile_high_data(high_) ret = {} for chunk in chunks: if chunk.get("__id__", "") == id_: ret.update(st_.state.call_chunk(chunk, {}, chunks)) _set_retcode(ret, highstate=highstate) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. __opts__["test"] = orig_test if not ret: raise SaltInvocationError( "No matches for ID '{}' found in SLS '{}' within saltenv '{}'".format( id_, mods, opts["saltenv"] ) ) return ret def show_low_sls(mods, test=None, queue=None, **kwargs): """ Display the low data from a specific sls. The default environment is ``base``, use ``saltenv`` to specify a different environment. saltenv Specify a salt fileserver environment to be used when applying states pillar Custom Pillar values, passed as a dictionary of key-value pairs .. code-block:: bash salt '*' state.show_low_sls stuff pillar='{"foo": "bar"}' .. note:: Values passed this way will override Pillar values set via ``pillar_roots`` or an external Pillar source. pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. CLI Example: .. code-block:: bash salt '*' state.show_low_sls foo salt '*' state.show_low_sls foo saltenv=dev """ if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) # Since this is dealing with a specific SLS file (or files), fall back to # the 'base' saltenv if none is configured and none was passed. if opts["saltenv"] is None: opts["saltenv"] = "base" pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) try: st_ = salt.state.HighState( opts, pillar_override, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, initial_pillar=_get_initial_pillar(opts) ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) mods = salt.utils.args.split_input(mods) st_.push_active() try: high_, errors = st_.render_highstate({opts["saltenv"]: mods}) finally: st_.pop_active() errors += st_.state.verify_high(high_) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors ret = st_.state.compile_high_data(high_) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. __opts__["test"] = orig_test return ret def show_sls(mods, test=None, queue=None, **kwargs): """ Display the state data from a specific sls or list of sls files on the master. The default environment is ``base``, use ``saltenv`` to specify a different environment. This function does not support topfiles. For ``top.sls`` please use ``show_top`` instead. Custom Pillar data can be passed with the ``pillar`` kwarg. saltenv Specify a salt fileserver environment to be used when applying states pillarenv Specify a Pillar environment to be used when applying states. This can also be set in the minion config file using the :conf_minion:`pillarenv` option. When neither the :conf_minion:`pillarenv` minion config option nor this CLI argument is used, all Pillar environments will be merged together. CLI Example: .. code-block:: bash salt '*' state.show_sls core,edit.vim saltenv=dev """ if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) # Since this is dealing with a specific SLS file (or files), fall back to # the 'base' saltenv if none is configured and none was passed. if opts["saltenv"] is None: opts["saltenv"] = "base" pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) try: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.HighState( opts, pillar_override, pillar_enc=pillar_enc, initial_pillar=_get_initial_pillar(opts), ) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) mods = salt.utils.args.split_input(mods) st_.push_active() try: high_, errors = st_.render_highstate({opts["saltenv"]: mods}) finally: st_.pop_active() errors += st_.state.verify_high(high_) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. __opts__["test"] = orig_test if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors return high_ def sls_exists(mods, test=None, queue=None, **kwargs): """ Tests for the existence the of a specific SLS or list of SLS files on the master. Similar to :py:func:`state.show_sls <salt.modules.state.show_sls>`, rather than returning state details, returns True or False. The default environment is ``base``, use ``saltenv`` to specify a different environment. .. versionadded:: 2019.2.0 saltenv Specify a salt fileserver environment from which to look for the SLS files specified in the ``mods`` argument CLI Example: .. code-block:: bash salt '*' state.sls_exists core,edit.vim saltenv=dev """ return isinstance(show_sls(mods, test=test, queue=queue, **kwargs), dict) def id_exists(ids, mods, test=None, queue=None, **kwargs): """ Tests for the existence of a specific ID or list of IDs within the specified SLS file(s). Similar to :py:func:`state.sls_exists <salt.modules.state.sls_exists>`, returns True or False. The default environment is base``, use ``saltenv`` to specify a different environment. .. versionadded:: 2019.2.0 saltenv Specify a salt fileserver environment from which to look for the SLS files specified in the ``mods`` argument CLI Example: .. code-block:: bash salt '*' state.id_exists create_myfile,update_template filestate saltenv=dev """ ids = salt.utils.args.split_input(ids) ids = set(ids) sls_ids = { x["__id__"] for x in show_low_sls(mods, test=test, queue=queue, **kwargs) } return ids.issubset(sls_ids) def show_top(queue=None, **kwargs): """ Return the top data that the minion will use for a highstate CLI Example: .. code-block:: bash salt '*' state.show_top """ if "env" in kwargs: # "env" is not supported; Use "saltenv". kwargs.pop("env") conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) try: st_ = salt.state.HighState( opts, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts) ) except NameError: st_ = salt.state.HighState(opts, initial_pillar=_get_initial_pillar(opts)) with st_: errors = _get_pillar_errors(kwargs, pillar=st_.opts["pillar"]) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_PILLAR_FAILURE raise CommandExecutionError("Pillar failed to render", info=errors) errors = [] top_ = st_.get_top() errors += st_.verify_tops(top_) if errors: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return errors matches = st_.top_matches(top_) return matches def single(fun, name, test=None, queue=None, **kwargs): """ Execute a single state function with the named kwargs, returns False if insufficient data is sent to the command By default, the values of the kwargs will be parsed as YAML. So, you can specify lists values, or lists of single entry key-value maps, as you would in a YAML salt file. Alternatively, JSON format of keyword values is also supported. CLI Example: .. code-block:: bash salt '*' state.single pkg.installed name=vim """ conflict = _check_queue(queue, kwargs) if conflict is not None: return conflict comps = fun.split(".") if len(comps) < 2: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return "Invalid function passed" kwargs.update({"state": comps[0], "fun": comps[1], "__id__": name, "name": name}) orig_test = __opts__.get("test", None) opts = salt.utils.state.get_sls_opts(__opts__, **kwargs) opts["test"] = _get_test_value(test, **kwargs) pillar_override = kwargs.get("pillar") pillar_enc = kwargs.get("pillar_enc") if ( pillar_enc is None and pillar_override is not None and not isinstance(pillar_override, dict) ): raise SaltInvocationError( "Pillar data must be formatted as a dictionary, unless pillar_enc " "is specified." ) try: st_ = salt.state.State( opts, pillar_override, pillar_enc=pillar_enc, proxy=__proxy__, initial_pillar=_get_initial_pillar(opts), ) except NameError: st_ = salt.state.State( opts, pillar_override, pillar_enc=pillar_enc, initial_pillar=_get_initial_pillar(opts), ) err = st_.verify_data(kwargs) if err: __context__["retcode"] = salt.defaults.exitcodes.EX_STATE_COMPILER_ERROR return err st_._mod_init(kwargs) snapper_pre = _snapper_pre(opts, kwargs.get("__pub_jid", "called localy")) ret = { "{0[state]}_|-{0[__id__]}_|-{0[name]}_|-{0[fun]}".format(kwargs): st_.call( kwargs ) } _set_retcode(ret) # Work around Windows multiprocessing bug, set __opts__['test'] back to # value from before this function was run. _snapper_post(opts, kwargs.get("__pub_jid", "called localy"), snapper_pre) __opts__["test"] = orig_test return ret def clear_cache(): """ Clear out cached state files, forcing even cache runs to refresh the cache on the next state execution. Remember that the state cache is completely disabled by default, this execution only applies if cache=True is used in states CLI Example: .. code-block:: bash salt '*' state.clear_cache """ ret = [] for fn_ in os.listdir(__opts__["cachedir"]): if fn_.endswith(".cache.p"): path = os.path.join(__opts__["cachedir"], fn_) if not os.path.isfile(path): continue os.remove(path) ret.append(fn_) return ret def pkg(pkg_path, pkg_sum, hash_type, test=None, **kwargs): """ Execute a packaged state run, the packaged state run will exist in a tarball available locally. This packaged state can be generated using salt-ssh. CLI Example: .. code-block:: bash salt '*' state.pkg /tmp/salt_state.tgz 760a9353810e36f6d81416366fc426dc md5 """ # TODO - Add ability to download from salt master or other source popts = salt.utils.state.get_sls_opts(__opts__, **kwargs) if not os.path.isfile(pkg_path): return {} if not salt.utils.hashutils.get_hash(pkg_path, hash_type) == pkg_sum: return {} root = tempfile.mkdtemp() s_pkg = tarfile.open(pkg_path, "r:gz") # Verify that the tarball does not extract outside of the intended root members = s_pkg.getmembers() for member in members: if salt.utils.stringutils.to_unicode(member.path).startswith( (os.sep, "..{}".format(os.sep)) ): return {} elif "..{}".format(os.sep) in salt.utils.stringutils.to_unicode(member.path): return {} s_pkg.extractall(root) s_pkg.close() lowstate_json = os.path.join(root, "lowstate.json") with salt.utils.files.fopen(lowstate_json, "r") as fp_: lowstate = salt.utils.json.load(fp_) # Check for errors in the lowstate for chunk in lowstate: if not isinstance(chunk, dict): return lowstate pillar_json = os.path.join(root, "pillar.json") if os.path.isfile(pillar_json): with salt.utils.files.fopen(pillar_json, "r") as fp_: pillar_override = salt.utils.json.load(fp_) else: pillar_override = None roster_grains_json = os.path.join(root, "roster_grains.json") if os.path.isfile(roster_grains_json): with salt.utils.files.fopen(roster_grains_json, "r") as fp_: roster_grains = _format_cached_grains(salt.utils.json.load(fp_)) if os.path.isfile(roster_grains_json): popts["grains"] = roster_grains popts["fileclient"] = "local" popts["file_roots"] = {} popts["test"] = _get_test_value(test, **kwargs) envs = os.listdir(root) for fn_ in envs: full = os.path.join(root, fn_) if not os.path.isdir(full): continue popts["file_roots"][fn_] = [full] st_ = salt.state.State(popts, pillar_override=pillar_override) snapper_pre = _snapper_pre(popts, kwargs.get("__pub_jid", "called localy")) ret = st_.call_chunks(lowstate) ret = st_.call_listen(lowstate, ret) try: shutil.rmtree(root) except OSError: pass _set_retcode(ret) _snapper_post(popts, kwargs.get("__pub_jid", "called localy"), snapper_pre) return ret def disable(states): """ Disable state runs. CLI Example: .. code-block:: bash salt '*' state.disable highstate salt '*' state.disable highstate,test.succeed_without_changes .. note:: To disable a state file from running provide the same name that would be passed in a state.sls call. salt '*' state.disable bind.config """ ret = {"res": True, "msg": ""} states = salt.utils.args.split_input(states) msg = [] _disabled_state_runs = __salt__["grains.get"]("state_runs_disabled") if not isinstance(_disabled_state_runs, list): _disabled_state_runs = [] _changed = False for _state in states: if _state in _disabled_state_runs: msg.append("Info: {} state already disabled.".format(_state)) else: msg.append("Info: {} state disabled.".format(_state)) _disabled_state_runs.append(_state) _changed = True if _changed: __salt__["grains.setval"]("state_runs_disabled", _disabled_state_runs) ret["msg"] = "\n".join(msg) # refresh the grains __salt__["saltutil.refresh_modules"]() return ret def enable(states): """ Enable state function or sls run CLI Example: .. code-block:: bash salt '*' state.enable highstate salt '*' state.enable test.succeed_without_changes .. note:: To enable a state file from running provide the same name that would be passed in a state.sls call. salt '*' state.disable bind.config """ ret = {"res": True, "msg": ""} states = salt.utils.args.split_input(states) log.debug("states %s", states) msg = [] _disabled_state_runs = __salt__["grains.get"]("state_runs_disabled") if not isinstance(_disabled_state_runs, list): _disabled_state_runs = [] _changed = False for _state in states: log.debug("_state %s", _state) if _state not in _disabled_state_runs: msg.append("Info: {} state already enabled.".format(_state)) else: msg.append("Info: {} state enabled.".format(_state)) _disabled_state_runs.remove(_state) _changed = True if _changed: __salt__["grains.setval"]("state_runs_disabled", _disabled_state_runs) ret["msg"] = "\n".join(msg) # refresh the grains __salt__["saltutil.refresh_modules"]() return ret def list_disabled(): """ List the states which are currently disabled CLI Example: .. code-block:: bash salt '*' state.list_disabled """ return __salt__["grains.get"]("state_runs_disabled") def _disabled(funs): """ Return messages for disabled states that match state functions in funs. """ ret = [] _disabled_state_runs = __salt__["grains.get"]("state_runs_disabled") if not isinstance(_disabled_state_runs, list): _disabled_state_runs = [] for state in funs: for _state in _disabled_state_runs: if ".*" in _state: target_state = _state.split(".")[0] target_state = ( target_state + "." if not target_state.endswith(".") else target_state ) if state.startswith(target_state): err = ( 'The state file "{0}" is currently disabled by "{1}", ' "to re-enable, run state.enable {1}.".format( state, _state, ) ) ret.append(err) continue else: if _state == state: err = ( 'The state file "{0}" is currently disabled, ' "to re-enable, run state.enable {0}.".format( _state, ) ) ret.append(err) continue return ret def event( tagmatch="*", count=-1, quiet=False, sock_dir=None, pretty=False, node="minion" ): r""" Watch Salt's event bus and block until the given tag is matched .. versionadded:: 2016.3.0 .. versionchanged:: 2019.2.0 ``tagmatch`` can now be either a glob or regular expression. This is useful for utilizing Salt's event bus from shell scripts or for taking simple actions directly from the CLI. Enable debug logging to see ignored events. :param tagmatch: the event is written to stdout for each tag that matches this glob or regular expression. :param count: this number is decremented for each event that matches the ``tagmatch`` parameter; pass ``-1`` to listen forever. :param quiet: do not print to stdout; just block :param sock_dir: path to the Salt master's event socket file. :param pretty: Output the JSON all on a single line if ``False`` (useful for shell tools); pretty-print the JSON output if ``True``. :param node: Watch the minion-side or master-side event bus. CLI Example: .. code-block:: bash salt-call --local state.event pretty=True """ with salt.utils.event.get_event( node, sock_dir or __opts__["sock_dir"], opts=__opts__, listen=True, ) as sevent: while True: ret = sevent.get_event(full=True, auto_reconnect=True) if ret is None: continue if salt.utils.stringutils.expr_match(ret["tag"], tagmatch): if not quiet: salt.utils.stringutils.print_cli( "{}\t{}".format( salt.utils.stringutils.to_str(ret["tag"]), salt.utils.json.dumps( salt.utils.data.decode(ret["data"]), sort_keys=pretty, indent=None if not pretty else 4, ), ) ) sys.stdout.flush() if count > 0: count -= 1 log.debug("Remaining event matches: %s", count) if count == 0: break else: log.debug("Skipping event tag: %s", ret["tag"]) continue
Save