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: saltutil.py
""" The Saltutil module is used to manage the state of the salt minion itself. It is used to manage minion modules as well as automate updates to the salt minion. :depends: - esky Python module for update functionality """ import copy import fnmatch import logging import os import shutil import signal import sys import time import urllib.error import salt import salt.channel.client import salt.client import salt.client.ssh.client import salt.config import salt.defaults.events import salt.payload import salt.runner import salt.state import salt.utils.args import salt.utils.event import salt.utils.extmods import salt.utils.files import salt.utils.functools import salt.utils.minion import salt.utils.path import salt.utils.process import salt.utils.url import salt.wheel from salt.exceptions import ( CommandExecutionError, SaltInvocationError, SaltRenderError, SaltReqTimeoutError, ) try: import esky from esky import EskyVersionError HAS_ESKY = True except ImportError: HAS_ESKY = False # pylint: enable=import-error,no-name-in-module # Fix a nasty bug with Win32 Python not supporting all of the standard signals try: salt_SIGKILL = signal.SIGKILL except AttributeError: salt_SIGKILL = signal.SIGTERM HAS_PSUTIL = True try: import salt.utils.psutil_compat except ImportError: HAS_PSUTIL = False __proxyenabled__ = ["*"] log = logging.getLogger(__name__) def _get_top_file_envs(): """ Get all environments from the top file """ try: return __context__["saltutil._top_file_envs"] except KeyError: with salt.state.HighState(__opts__, initial_pillar=__pillar__.value()) as st_: try: top = st_.get_top() if top: envs = list(st_.top_matches(top).keys()) or "base" else: envs = "base" except SaltRenderError as exc: raise CommandExecutionError( "Unable to render top file(s): {}".format(exc) ) __context__["saltutil._top_file_envs"] = envs return envs def _sync(form, saltenv=None, extmod_whitelist=None, extmod_blacklist=None): """ Sync the given directory in the given environment """ if saltenv is None: saltenv = _get_top_file_envs() if isinstance(saltenv, str): saltenv = saltenv.split(",") ret, touched = salt.utils.extmods.sync( __opts__, form, saltenv=saltenv, extmod_whitelist=extmod_whitelist, extmod_blacklist=extmod_blacklist, ) # Dest mod_dir is touched? trigger reload if requested if touched: mod_file = os.path.join(__opts__["cachedir"], "module_refresh") with salt.utils.files.fopen(mod_file, "a"): pass if ( form == "grains" and __opts__.get("grains_cache") and os.path.isfile(os.path.join(__opts__["cachedir"], "grains.cache.p")) ): try: os.remove(os.path.join(__opts__["cachedir"], "grains.cache.p")) except OSError: log.error("Could not remove grains cache!") return ret def update(version=None): """ Update the salt minion from the URL defined in opts['update_url'] VMware, Inc provides the latest builds here: update_url: https://repo.saltproject.io/windows/ Be aware that as of 2014-8-11 there's a bug in esky such that only the latest version available in the update_url can be downloaded and installed. This feature requires the minion to be running a bdist_esky build. The version number is optional and will default to the most recent version available at opts['update_url']. Returns details about the transaction upon completion. CLI Examples: .. code-block:: bash salt '*' saltutil.update salt '*' saltutil.update 0.10.3 """ ret = {} if not HAS_ESKY: ret["_error"] = "Esky not available as import" return ret if not getattr(sys, "frozen", False): ret["_error"] = "Minion is not running an Esky build" return ret if not __salt__["config.option"]("update_url"): ret["_error"] = '"update_url" not configured on this minion' return ret app = esky.Esky(sys.executable, __opts__["update_url"]) oldversion = __grains__["saltversion"] if not version: try: version = app.find_update() except urllib.error.URLError as exc: ret["_error"] = "Could not connect to update_url. Error: {}".format(exc) return ret if not version: ret["_error"] = "No updates available" return ret try: app.fetch_version(version) except EskyVersionError as exc: ret["_error"] = "Unable to fetch version {}. Error: {}".format(version, exc) return ret try: app.install_version(version) except EskyVersionError as exc: ret["_error"] = "Unable to install version {}. Error: {}".format(version, exc) return ret try: app.cleanup() except Exception as exc: # pylint: disable=broad-except ret["_error"] = "Unable to cleanup. Error: {}".format(exc) restarted = {} for service in __opts__["update_restart_services"]: restarted[service] = __salt__["service.restart"](service) ret["comment"] = "Updated from {} to {}".format(oldversion, version) ret["restarted"] = restarted return ret def sync_beacons( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2015.5.1 Sync beacons from ``salt://_beacons`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for beacons to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available beacons on the minion. This refresh will be performed even if no new beacons are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Example: .. code-block:: bash salt '*' saltutil.sync_beacons salt '*' saltutil.sync_beacons saltenv=dev salt '*' saltutil.sync_beacons saltenv=base,dev """ ret = _sync("beacons", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_beacons() return ret def sync_sdb(saltenv=None, extmod_whitelist=None, extmod_blacklist=None): """ .. versionadded:: 2015.5.8,2015.8.3 Sync sdb modules from ``salt://_sdb`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for sdb modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : False This argument has no affect and is included for consistency with the other sync functions. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Example: .. code-block:: bash salt '*' saltutil.sync_sdb salt '*' saltutil.sync_sdb saltenv=dev salt '*' saltutil.sync_sdb saltenv=base,dev """ ret = _sync("sdb", saltenv, extmod_whitelist, extmod_blacklist) return ret def sync_modules( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 0.10.0 Sync execution modules from ``salt://_modules`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for execution modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new execution modules are synced. Set to ``False`` to prevent this refresh. .. important:: If this function is executed using a :py:func:`module.run <salt.states.module.run>` state, the SLS file will not have access to newly synced execution modules unless a ``refresh`` argument is added to the state, like so: .. code-block:: yaml load_my_custom_module: module.run: - name: saltutil.sync_modules - refresh: True See :ref:`here <reloading-modules>` for a more detailed explanation of why this is necessary. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Example: .. code-block:: bash salt '*' saltutil.sync_modules salt '*' saltutil.sync_modules saltenv=dev salt '*' saltutil.sync_modules saltenv=base,dev """ ret = _sync("modules", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_states( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 0.10.0 Sync state modules from ``salt://_states`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for state modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available states on the minion. This refresh will be performed even if no new state modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_states salt '*' saltutil.sync_states saltenv=dev salt '*' saltutil.sync_states saltenv=base,dev """ ret = _sync("states", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def refresh_grains(**kwargs): """ .. versionadded:: 2016.3.6,2016.11.4,2017.7.0 Refresh the minion's grains without syncing custom grains modules from ``salt://_grains``. .. note:: The available execution modules will be reloaded as part of this proceess, as grains can affect which modules are available. refresh_pillar : True Set to ``False`` to keep pillar data from being refreshed. clean_pillar_cache : False Set to ``True`` to refresh pillar cache. CLI Examples: .. code-block:: bash salt '*' saltutil.refresh_grains """ kwargs = salt.utils.args.clean_kwargs(**kwargs) _refresh_pillar = kwargs.pop("refresh_pillar", True) clean_pillar_cache = kwargs.pop("clean_pillar_cache", False) if kwargs: salt.utils.args.invalid_kwargs(kwargs) # Modules and pillar need to be refreshed in case grains changes affected # them, and the module refresh process reloads the grains and assigns the # newly-reloaded grains to each execution module's __grains__ dunder. if _refresh_pillar: # we don't need to call refresh_modules here because it's done by refresh_pillar refresh_pillar(clean_cache=clean_pillar_cache) else: refresh_modules() return True def sync_grains( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None, clean_pillar_cache=False, ): """ .. versionadded:: 0.10.0 Sync grains modules from ``salt://_grains`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for grains modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules and recompile pillar data for the minion. This refresh will be performed even if no new grains modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type clean_pillar_cache : False Set to ``True`` to refresh pillar cache. CLI Examples: .. code-block:: bash salt '*' saltutil.sync_grains salt '*' saltutil.sync_grains saltenv=dev salt '*' saltutil.sync_grains saltenv=base,dev """ ret = _sync("grains", saltenv, extmod_whitelist, extmod_blacklist) if refresh: # we don't need to call refresh_modules here because it's done by refresh_pillar refresh_pillar(clean_cache=clean_pillar_cache) return ret def sync_renderers( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 0.10.0 Sync renderers from ``salt://_renderers`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for renderers to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new renderers are synced. Set to ``False`` to prevent this refresh. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_renderers salt '*' saltutil.sync_renderers saltenv=dev salt '*' saltutil.sync_renderers saltenv=base,dev """ ret = _sync("renderers", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_returners( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 0.10.0 Sync returners from ``salt://_returners`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for returners to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new returners are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_returners salt '*' saltutil.sync_returners saltenv=dev """ ret = _sync("returners", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_proxymodules( saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2015.8.2 Sync proxy modules from ``salt://_proxy`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for proxy modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new proxy modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_proxymodules salt '*' saltutil.sync_proxymodules saltenv=dev salt '*' saltutil.sync_proxymodules saltenv=base,dev """ ret = _sync("proxy", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_matchers( saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2019.2.0 Sync engine modules from ``salt://_matchers`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for engines to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new matcher modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_matchers salt '*' saltutil.sync_matchers saltenv=base,dev """ ret = _sync("matchers", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_engines( saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2016.3.0 Sync engine modules from ``salt://_engines`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for engines to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new engine modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_engines salt '*' saltutil.sync_engines saltenv=base,dev """ ret = _sync("engines", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_thorium( saltenv=None, refresh=False, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2018.3.0 Sync Thorium modules from ``salt://_thorium`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for engines to sync. If no top files are found, then the ``base`` environment will be synced. refresh: ``True`` If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new Thorium modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist comma-separated list of modules to sync extmod_blacklist comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_thorium salt '*' saltutil.sync_thorium saltenv=base,dev """ ret = _sync("thorium", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_output( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ Sync outputters from ``salt://_output`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for outputters to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new outputters are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_output salt '*' saltutil.sync_output saltenv=dev salt '*' saltutil.sync_output saltenv=base,dev """ ret = _sync("output", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret sync_outputters = salt.utils.functools.alias_function(sync_output, "sync_outputters") def sync_clouds( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2017.7.0 Sync cloud modules from ``salt://_cloud`` to the minion saltenv : base The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new utility modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_clouds salt '*' saltutil.sync_clouds saltenv=dev salt '*' saltutil.sync_clouds saltenv=base,dev """ ret = _sync("clouds", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_utils( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2014.7.0 Sync utility modules from ``salt://_utils`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for utility modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new utility modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_utils salt '*' saltutil.sync_utils saltenv=dev salt '*' saltutil.sync_utils saltenv=base,dev """ ret = _sync("utils", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_serializers( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2019.2.0 Sync serializers from ``salt://_serializers`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for serializer modules to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new serializer modules are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-seperated list of modules to sync extmod_blacklist : None comma-seperated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_serializers salt '*' saltutil.sync_serializers saltenv=dev salt '*' saltutil.sync_serializers saltenv=base,dev """ ret = _sync("serializers", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def list_extmods(): """ .. versionadded:: 2017.7.0 List Salt modules which have been synced externally CLI Examples: .. code-block:: bash salt '*' saltutil.list_extmods """ ret = {} ext_dir = os.path.join(__opts__["cachedir"], "extmods") mod_types = os.listdir(ext_dir) for mod_type in mod_types: ret[mod_type] = set() for _, _, files in salt.utils.path.os_walk(os.path.join(ext_dir, mod_type)): for fh_ in files: ret[mod_type].add(fh_.split(".")[0]) ret[mod_type] = list(ret[mod_type]) return ret def sync_log_handlers( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 2015.8.0 Sync log handlers from ``salt://_log_handlers`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for log handlers to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new log handlers are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_log_handlers salt '*' saltutil.sync_log_handlers saltenv=dev salt '*' saltutil.sync_log_handlers saltenv=base,dev """ ret = _sync("log_handlers", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_pillar( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None, clean_pillar_cache=False, ): """ .. versionadded:: 2015.8.11,2016.3.2 Sync pillar modules from the ``salt://_pillar`` directory on the Salt fileserver. This function is environment-aware, pass the desired environment to grab the contents of the ``_pillar`` directory from that environment. The default environment, if none is specified, is ``base``. refresh : True Also refresh the execution modules available to the minion, and refresh pillar data. extmod_whitelist : None comma-separated list of modules to sync extmod_blacklist : None comma-separated list of modules to blacklist based on type clean_pillar_cache : False Set to ``True`` to refresh pillar cache. .. note:: This function will raise an error if executed on a traditional (i.e. not masterless) minion CLI Examples: .. code-block:: bash salt '*' saltutil.sync_pillar salt '*' saltutil.sync_pillar saltenv=dev """ if __opts__["file_client"] != "local": raise CommandExecutionError( "Pillar modules can only be synced to masterless minions" ) ret = _sync("pillar", saltenv, extmod_whitelist, extmod_blacklist) if refresh: # we don't need to call refresh_modules here because it's done by refresh_pillar refresh_pillar(clean_cache=clean_pillar_cache) return ret def sync_executors( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None ): """ .. versionadded:: 3000 Sync executors from ``salt://_executors`` to the minion saltenv The fileserver environment from which to sync. To sync from more than one environment, pass a comma-separated list. If not passed, then all environments configured in the :ref:`top files <states-top>` will be checked for log handlers to sync. If no top files are found, then the ``base`` environment will be synced. refresh : True If ``True``, refresh the available execution modules on the minion. This refresh will be performed even if no new log handlers are synced. Set to ``False`` to prevent this refresh. extmod_whitelist : None comma-seperated list of modules to sync extmod_blacklist : None comma-seperated list of modules to blacklist based on type CLI Examples: .. code-block:: bash salt '*' saltutil.sync_executors salt '*' saltutil.sync_executors saltenv=dev salt '*' saltutil.sync_executors saltenv=base,dev """ ret = _sync("executors", saltenv, extmod_whitelist, extmod_blacklist) if refresh: refresh_modules() return ret def sync_all( saltenv=None, refresh=True, extmod_whitelist=None, extmod_blacklist=None, clean_pillar_cache=False, ): """ .. versionchanged:: 2015.8.11,2016.3.2 On masterless minions, pillar modules are now synced, and refreshed when ``refresh`` is set to ``True``. Sync down all of the dynamic modules from the file server for a specific environment. This function synchronizes custom modules, states, beacons, grains, returners, output modules, renderers, and utils. refresh : True Also refresh the execution modules and recompile pillar data available to the minion. This refresh will be performed even if no new dynamic modules are synced. Set to ``False`` to prevent this refresh. .. important:: If this function is executed using a :py:func:`module.run <salt.states.module.run>` state, the SLS file will not have access to newly synced execution modules unless a ``refresh`` argument is added to the state, like so: .. code-block:: yaml load_my_custom_module: module.run: - name: saltutil.sync_all - refresh: True See :ref:`here <reloading-modules>` for a more detailed explanation of why this is necessary. extmod_whitelist : None dictionary of modules to sync based on type extmod_blacklist : None dictionary of modules to blacklist based on type clean_pillar_cache : False Set to ``True`` to refresh pillar cache. CLI Examples: .. code-block:: bash salt '*' saltutil.sync_all salt '*' saltutil.sync_all saltenv=dev salt '*' saltutil.sync_all saltenv=base,dev salt '*' saltutil.sync_all extmod_whitelist={'modules': ['custom_module']} """ log.debug("Syncing all") ret = {} ret["clouds"] = sync_clouds(saltenv, False, extmod_whitelist, extmod_blacklist) ret["beacons"] = sync_beacons(saltenv, False, extmod_whitelist, extmod_blacklist) ret["modules"] = sync_modules(saltenv, False, extmod_whitelist, extmod_blacklist) ret["states"] = sync_states(saltenv, False, extmod_whitelist, extmod_blacklist) ret["sdb"] = sync_sdb(saltenv, extmod_whitelist, extmod_blacklist) ret["grains"] = sync_grains(saltenv, False, extmod_whitelist, extmod_blacklist) ret["renderers"] = sync_renderers( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["returners"] = sync_returners( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["output"] = sync_output(saltenv, False, extmod_whitelist, extmod_blacklist) ret["utils"] = sync_utils(saltenv, False, extmod_whitelist, extmod_blacklist) ret["log_handlers"] = sync_log_handlers( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["executors"] = sync_executors( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["proxymodules"] = sync_proxymodules( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["engines"] = sync_engines(saltenv, False, extmod_whitelist, extmod_blacklist) ret["thorium"] = sync_thorium(saltenv, False, extmod_whitelist, extmod_blacklist) ret["serializers"] = sync_serializers( saltenv, False, extmod_whitelist, extmod_blacklist ) ret["matchers"] = sync_matchers(saltenv, False, extmod_whitelist, extmod_blacklist) if __opts__["file_client"] == "local": ret["pillar"] = sync_pillar(saltenv, False, extmod_whitelist, extmod_blacklist) if refresh: # we don't need to call refresh_modules here because it's done by refresh_pillar refresh_pillar(clean_cache=clean_pillar_cache) return ret def refresh_beacons(): """ Signal the minion to refresh the beacons. CLI Example: .. code-block:: bash salt '*' saltutil.refresh_beacons """ try: ret = __salt__["event.fire"]({}, "beacons_refresh") except KeyError: log.error("Event module not available. Module refresh failed.") ret = False # Effectively a no-op, since we can't really return without an event system return ret def refresh_matchers(): """ Signal the minion to refresh its matchers. CLI Example: .. code-block:: bash salt '*' saltutil.refresh_matchers """ try: ret = __salt__["event.fire"]({}, "matchers_refresh") except KeyError: log.error("Event module not available. Matcher refresh failed.") ret = False # Effectively a no-op, since we can't really return without an event system return ret def refresh_pillar(wait=False, timeout=30, clean_cache=True): """ Signal the minion to refresh the in-memory pillar data. See :ref:`pillar-in-memory`. :param wait: Wait for pillar refresh to complete, defaults to False. :type wait: bool, optional :param timeout: How long to wait in seconds, only used when wait is True, defaults to 30. :type timeout: int, optional :param clean_cache: Clean the pillar cache, only used when `pillar_cache` is True. Defaults to True :type clean_cache: bool, optional .. versionadded:: 3005 :return: Boolean status, True when the pillar_refresh event was fired successfully. CLI Example: .. code-block:: bash salt '*' saltutil.refresh_pillar salt '*' saltutil.refresh_pillar wait=True timeout=60 """ data = {"clean_cache": clean_cache} try: if wait: # If we're going to block, first setup a listener with salt.utils.event.get_event( "minion", opts=__opts__, listen=True ) as eventer: ret = __salt__["event.fire"](data, "pillar_refresh") # Wait for the finish event to fire log.trace("refresh_pillar waiting for pillar refresh to complete") # Blocks until we hear this event or until the timeout expires event_ret = eventer.get_event( tag=salt.defaults.events.MINION_PILLAR_REFRESH_COMPLETE, wait=timeout, ) if not event_ret or event_ret["complete"] is False: log.warning( "Pillar refresh did not complete within timeout %s", timeout ) else: ret = __salt__["event.fire"](data, "pillar_refresh") except KeyError: log.error("Event module not available. Pillar refresh failed.") ret = False # Effectively a no-op, since we can't really return without an event system return ret pillar_refresh = salt.utils.functools.alias_function(refresh_pillar, "pillar_refresh") def refresh_modules(**kwargs): """ Signal the minion to refresh the module and grain data The default is to refresh module asynchronously. To block until the module refresh is complete, set the 'async' flag to False. CLI Example: .. code-block:: bash salt '*' saltutil.refresh_modules """ asynchronous = bool(kwargs.get("async", True)) try: if asynchronous: ret = __salt__["event.fire"]({}, "module_refresh") else: # If we're going to block, first setup a listener with salt.utils.event.get_event( "minion", opts=__opts__, listen=True ) as eventer: ret = __salt__["event.fire"]({"notify": True}, "module_refresh") # Wait for the finish event to fire log.trace("refresh_modules waiting for module refresh to complete") # Blocks until we hear this event or until the timeout expires eventer.get_event( tag=salt.defaults.events.MINION_MOD_REFRESH_COMPLETE, wait=30 ) except KeyError: log.error("Event module not available. Module refresh failed.") ret = False # Effectively a no-op, since we can't really return without an event system return ret def is_running(fun): """ If the named function is running return the data associated with it/them. The argument can be a glob CLI Example: .. code-block:: bash salt '*' saltutil.is_running state.highstate """ run = running() ret = [] for data in run: if fnmatch.fnmatch(data.get("fun", ""), fun): ret.append(data) return ret def running(): """ Return the data on all running salt processes on the minion CLI Example: .. code-block:: bash salt '*' saltutil.running """ return salt.utils.minion.running(__opts__) def clear_cache(): """ Forcibly removes all caches on a minion. .. versionadded:: 2014.7.0 WARNING: The safest way to clear a minion cache is by first stopping the minion and then deleting the cache files before restarting it. CLI Example: .. code-block:: bash salt '*' saltutil.clear_cache """ for root, dirs, files in salt.utils.files.safe_walk( __opts__["cachedir"], followlinks=False ): for name in files: try: os.remove(os.path.join(root, name)) except OSError as exc: log.error( "Attempt to clear cache with saltutil.clear_cache FAILED with: %s", exc, ) return False return True def clear_job_cache(hours=24): """ Forcibly removes job cache folders and files on a minion. .. versionadded:: 2018.3.0 WARNING: The safest way to clear a minion cache is by first stopping the minion and then deleting the cache files before restarting it. CLI Example: .. code-block:: bash salt '*' saltutil.clear_job_cache hours=12 """ threshold = time.time() - hours * 3600 for root, dirs, files in salt.utils.files.safe_walk( os.path.join(__opts__["cachedir"], "minion_jobs"), followlinks=False ): for name in dirs: try: directory = os.path.join(root, name) mtime = os.path.getmtime(directory) if mtime < threshold: shutil.rmtree(directory) except OSError as exc: log.error( "Attempt to clear cache with saltutil.clear_job_cache FAILED" " with: %s", exc, ) return False return True def find_job(jid): """ Return the data for a specific job id that is currently running. jid The job id to search for and return data. CLI Example: .. code-block:: bash salt '*' saltutil.find_job <job id> Note that the find_job function only returns job information when the job is still running. If the job is currently running, the output looks something like this: .. code-block:: bash # salt my-minion saltutil.find_job 20160503150049487736 my-minion: ---------- arg: - 30 fun: test.sleep jid: 20160503150049487736 pid: 9601 ret: tgt: my-minion tgt_type: glob user: root If the job has already completed, the job cannot be found and therefore the function returns an empty dictionary, which looks like this on the CLI: .. code-block:: bash # salt my-minion saltutil.find_job 20160503150049487736 my-minion: ---------- """ for data in running(): if data["jid"] == jid: return data return {} def find_cached_job(jid): """ Return the data for a specific cached job id. Note this only works if cache_jobs has previously been set to True on the minion. CLI Example: .. code-block:: bash salt '*' saltutil.find_cached_job <job id> """ proc_dir = os.path.join(__opts__["cachedir"], "minion_jobs") job_dir = os.path.join(proc_dir, str(jid)) if not os.path.isdir(job_dir): if not __opts__.get("cache_jobs"): return ( "Local jobs cache directory not found; you may need to" " enable cache_jobs on this minion" ) else: return "Local jobs cache directory {} not found".format(job_dir) path = os.path.join(job_dir, "return.p") with salt.utils.files.fopen(path, "rb") as fp_: buf = fp_.read() if buf: try: data = salt.payload.loads(buf) except NameError: # msgpack error in salt-ssh pass else: if isinstance(data, dict): # if not a dict, this was an invalid serialized object return data return None def signal_job(jid, sig): """ Sends a signal to the named salt job's process CLI Example: .. code-block:: bash salt '*' saltutil.signal_job <job id> 15 """ if HAS_PSUTIL is False: log.warning( "saltutil.signal job called, but psutil is not installed. " "Install psutil to ensure more reliable and accurate PID " "management." ) for data in running(): if data["jid"] == jid: try: if HAS_PSUTIL: for proc in salt.utils.psutil_compat.Process( pid=data["pid"] ).children(recursive=True): proc.send_signal(sig) os.kill(int(data["pid"]), sig) if HAS_PSUTIL is False and "child_pids" in data: for pid in data["child_pids"]: os.kill(int(pid), sig) return "Signal {} sent to job {} at pid {}".format( int(sig), jid, data["pid"] ) except OSError: path = os.path.join(__opts__["cachedir"], "proc", str(jid)) if os.path.isfile(path): os.remove(path) return "Job {} was not running and job data has been cleaned up".format( jid ) return "" def term_job(jid): """ Sends a termination signal (SIGTERM 15) to the named salt job's process CLI Example: .. code-block:: bash salt '*' saltutil.term_job <job id> """ return signal_job(jid, signal.SIGTERM) def term_all_jobs(): """ Sends a termination signal (SIGTERM 15) to all currently running jobs CLI Example: .. code-block:: bash salt '*' saltutil.term_all_jobs """ ret = [] for data in running(): ret.append(signal_job(data["jid"], signal.SIGTERM)) return ret def kill_job(jid): """ Sends a kill signal (SIGKILL 9) to the named salt job's process CLI Example: .. code-block:: bash salt '*' saltutil.kill_job <job id> """ # Some OS's (Win32) don't have SIGKILL, so use salt_SIGKILL which is set to # an appropriate value for the operating system this is running on. return signal_job(jid, salt_SIGKILL) def kill_all_jobs(): """ Sends a kill signal (SIGKILL 9) to all currently running jobs CLI Example: .. code-block:: bash salt '*' saltutil.kill_all_jobs """ # Some OS's (Win32) don't have SIGKILL, so use salt_SIGKILL which is set to # an appropriate value for the operating system this is running on. ret = [] for data in running(): ret.append(signal_job(data["jid"], salt_SIGKILL)) return ret def regen_keys(): """ Used to regenerate the minion keys. CLI Example: .. code-block:: bash salt '*' saltutil.regen_keys """ for fn_ in os.listdir(__opts__["pki_dir"]): path = os.path.join(__opts__["pki_dir"], fn_) try: os.remove(path) except os.error: pass # TODO: move this into a channel function? Or auth? # create a channel again, this will force the key regen with salt.channel.client.ReqChannel.factory(__opts__) as channel: log.debug("Recreating channel to force key regen") def revoke_auth(preserve_minion_cache=False): """ The minion sends a request to the master to revoke its own key. Note that the minion session will be revoked and the minion may not be able to return the result of this command back to the master. If the 'preserve_minion_cache' flag is set to True, the master cache for this minion will not be removed. CLI Example: .. code-block:: bash salt '*' saltutil.revoke_auth """ masters = list() ret = True if "master_uri_list" in __opts__: for master_uri in __opts__["master_uri_list"]: masters.append(master_uri) else: masters.append(__opts__["master_uri"]) for master in masters: with salt.channel.client.ReqChannel.factory( __opts__, master_uri=master ) as channel: tok = channel.auth.gen_token(b"salt") load = { "cmd": "revoke_auth", "id": __opts__["id"], "tok": tok, "preserve_minion_cache": preserve_minion_cache, } try: channel.send(load) except SaltReqTimeoutError: ret = False return ret def _get_ssh_or_api_client(cfgfile, ssh=False): if ssh: client = salt.client.ssh.client.SSHClient(cfgfile) else: client = salt.client.get_local_client(cfgfile) return client def _exec( client, tgt, fun, arg, timeout, tgt_type, ret, kwarg, batch=False, subset=False, **kwargs ): fcn_ret = {} seen = 0 cmd_kwargs = { "tgt": tgt, "fun": fun, "arg": arg, "timeout": timeout, "tgt_type": tgt_type, "ret": ret, "kwarg": kwarg, } if batch: _cmd = client.cmd_batch cmd_kwargs.update({"batch": batch}) elif subset: _cmd = client.cmd_subset cmd_kwargs.update({"subset": subset, "cli": True}) else: _cmd = client.cmd_iter cmd_kwargs.update(kwargs) for ret_comp in _cmd(**cmd_kwargs): fcn_ret.update(ret_comp) seen += 1 # fcn_ret can be empty, so we cannot len the whole return dict if tgt_type == "list" and len(tgt) == seen: # do not wait for timeout when explicit list matching # and all results are there break if batch: old_ret, fcn_ret = fcn_ret, {} for key, value in old_ret.items(): fcn_ret[key] = { "out": value.get("out", "highstate") if isinstance(value, dict) else "highstate", "ret": value, } return fcn_ret def cmd( tgt, fun, arg=(), timeout=None, tgt_type="glob", ret="", kwarg=None, ssh=False, **kwargs ): """ .. versionchanged:: 2017.7.0 The ``expr_form`` argument has been renamed to ``tgt_type``, earlier releases must use ``expr_form``. Assuming this minion is a master, execute a salt command CLI Example: .. code-block:: bash salt '*' saltutil.cmd """ cfgfile = __opts__["conf_file"] with _get_ssh_or_api_client(cfgfile, ssh) as client: fcn_ret = _exec(client, tgt, fun, arg, timeout, tgt_type, ret, kwarg, **kwargs) # if return is empty, we may have not used the right conf, # try with the 'minion relative master configuration counter part # if available master_cfgfile = "{}master".format(cfgfile[:-6]) # remove 'minion' if ( not fcn_ret and cfgfile.endswith("{}{}".format(os.path.sep, "minion")) and os.path.exists(master_cfgfile) ): with _get_ssh_or_api_client(master_cfgfile, ssh) as client: fcn_ret = _exec( client, tgt, fun, arg, timeout, tgt_type, ret, kwarg, **kwargs ) return fcn_ret def cmd_iter( tgt, fun, arg=(), timeout=None, tgt_type="glob", ret="", kwarg=None, ssh=False, **kwargs ): """ .. versionchanged:: 2017.7.0 The ``expr_form`` argument has been renamed to ``tgt_type``, earlier releases must use ``expr_form``. Assuming this minion is a master, execute a salt command CLI Example: .. code-block:: bash salt '*' saltutil.cmd_iter """ if ssh: client = salt.client.ssh.client.SSHClient(__opts__["conf_file"]) else: client = salt.client.get_local_client(__opts__["conf_file"]) for ret in client.cmd_iter(tgt, fun, arg, timeout, tgt_type, ret, kwarg, **kwargs): yield ret def runner( name, arg=None, kwarg=None, full_return=False, saltenv="base", jid=None, **kwargs ): """ Execute a runner function. This function must be run on the master, either by targeting a minion running on a master or by using salt-call on a master. .. versionadded:: 2014.7.0 name The name of the function to run kwargs Any keyword arguments to pass to the runner function CLI Example: In this example, assume that `master_minion` is a minion running on a master. .. code-block:: bash salt master_minion saltutil.runner jobs.list_jobs salt master_minion saltutil.runner test.arg arg="['baz']" kwarg="{'foo': 'bar'}" """ if arg is None: arg = [] if kwarg is None: kwarg = {} pub_data = {} jid = kwargs.pop("__orchestration_jid__", jid) saltenv = kwargs.pop("__env__", saltenv) pub_data["user"] = kwargs.pop("__pub_user", "UNKNOWN") kwargs = salt.utils.args.clean_kwargs(**kwargs) if kwargs: kwarg.update(kwargs) if "master_job_cache" not in __opts__: master_config = os.path.join(os.path.dirname(__opts__["conf_file"]), "master") master_opts = salt.config.master_config(master_config) rclient = salt.runner.RunnerClient(master_opts) else: rclient = salt.runner.RunnerClient(__opts__) if name in rclient.functions: aspec = salt.utils.args.get_function_argspec(rclient.functions[name]) if "saltenv" in aspec.args: kwarg["saltenv"] = saltenv if name in ["state.orchestrate", "state.orch", "state.sls"]: kwarg["orchestration_jid"] = jid if jid: salt.utils.event.fire_args( __opts__, jid, {"type": "runner", "name": name, "args": arg, "kwargs": kwarg}, prefix="run", ) return rclient.cmd( name, arg=arg, pub_data=pub_data, kwarg=kwarg, print_event=False, full_return=full_return, ) def wheel(name, *args, **kwargs): """ Execute a wheel module and function. This function must be run against a minion that is local to the master. .. versionadded:: 2014.7.0 name The name of the function to run args Any positional arguments to pass to the wheel function. A common example of this would be the ``match`` arg needed for key functions. .. versionadded:: 2015.8.11 kwargs Any keyword arguments to pass to the wheel function CLI Example: .. code-block:: bash salt my-local-minion saltutil.wheel key.accept jerry salt my-local-minion saltutil.wheel minions.connected .. note:: Since this function must be run against a minion that is running locally on the master in order to get accurate returns, if this function is run against minions that are not local to the master, "empty" returns are expected. The remote minion does not have access to wheel functions and their return data. """ jid = kwargs.pop("__orchestration_jid__", None) saltenv = kwargs.pop("__env__", "base") if __opts__["__role"] == "minion": master_config = os.path.join(os.path.dirname(__opts__["conf_file"]), "master") master_opts = salt.config.client_config(master_config) wheel_client = salt.wheel.WheelClient(master_opts) else: wheel_client = salt.wheel.WheelClient(__opts__) # The WheelClient cmd needs args, kwargs, and pub_data separated out from # the "normal" kwargs structure, which at this point contains __pub_x keys. pub_data = {} valid_kwargs = {} for key, val in kwargs.items(): if key.startswith("__"): pub_data[key] = val else: valid_kwargs[key] = val try: if name in wheel_client.functions: aspec = salt.utils.args.get_function_argspec(wheel_client.functions[name]) if "saltenv" in aspec.args: valid_kwargs["saltenv"] = saltenv if jid: salt.utils.event.fire_args( __opts__, jid, {"type": "wheel", "name": name, "args": valid_kwargs}, prefix="run", ) ret = wheel_client.cmd( name, arg=args, pub_data=pub_data, kwarg=valid_kwargs, print_event=False, full_return=True, ) except SaltInvocationError: raise CommandExecutionError( "This command can only be executed on a minion that is located on " "the master." ) return ret # this is the only way I could figure out how to get the REAL file_roots # __opt__['file_roots'] is set to __opt__['pillar_root'] class _MMinion: def __new__(cls, saltenv, reload_env=False): # this is to break out of salt.loaded.int and make this a true singleton # hack until https://github.com/saltstack/salt/pull/10273 is resolved # this is starting to look like PHP global _mminions # pylint: disable=W0601 if "_mminions" not in globals(): _mminions = {} if saltenv not in _mminions or reload_env: opts = copy.deepcopy(__opts__) del opts["file_roots"] # grains at this point are in the context of the minion global __grains__ # pylint: disable=W0601 grains = copy.deepcopy(__grains__) m = salt.minion.MasterMinion(opts) # this assignment is so that the rest of fxns called by salt still # have minion context __grains__ = grains # this assignment is so that fxns called by mminion have minion # context m.opts["grains"] = grains env_roots = m.opts["file_roots"][saltenv] m.opts["module_dirs"] = [fp + "/_modules" for fp in env_roots] m.gen_modules() _mminions[saltenv] = m return _mminions[saltenv] def mmodule(saltenv, fun, *args, **kwargs): """ Loads minion modules from an environment so that they can be used in pillars for that environment CLI Example: .. code-block:: bash salt '*' saltutil.mmodule base test.ping """ mminion = _MMinion(saltenv) return mminion.functions[fun](*args, **kwargs)
Save