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: github.py
""" Module for interacting with the GitHub v3 API. .. versionadded:: 2016.3.0 :depends: PyGithub python module Configuration ------------- Configure this module by specifying the name of a configuration profile in the minion config, minion pillar, or master config. The module will use the 'github' key by default, if defined. For example: .. code-block:: yaml github: token: abc1234 org_name: my_organization # optional: some functions require a repo_name, which # can be set in the config file, or passed in at the CLI. repo_name: my_repo # optional: it can be dangerous to change the privacy of a repository # in an automated way. set this to True to allow privacy modifications allow_repo_privacy_changes: False """ import logging import salt.utils.http from salt.exceptions import CommandExecutionError HAS_LIBS = False try: # pylint: disable=no-name-in-module import github import github.NamedUser import github.PaginatedList from github.GithubException import UnknownObjectException # pylint: enable=no-name-in-module HAS_LIBS = True except ImportError: pass log = logging.getLogger(__name__) __virtualname__ = "github" def __virtual__(): """ Only load this module if PyGithub is installed on this minion. """ if HAS_LIBS: return __virtualname__ return ( False, "The github execution module cannot be loaded: " "PyGithub library is not installed.", ) def _get_config_value(profile, config_name): """ Helper function that returns a profile's configuration value based on the supplied configuration name. profile The profile name that contains configuration information. config_name The configuration item's name to use to return configuration values. """ config = __salt__["config.option"](profile) if not config: raise CommandExecutionError( "Authentication information could not be found for the " "'{}' profile.".format(profile) ) config_value = config.get(config_name) if config_value is None: raise CommandExecutionError( "The '{}' parameter was not found in the '{}' profile.".format( config_name, profile ) ) return config_value def _get_client(profile): """ Return the GitHub client, cached into __context__ for performance """ token = _get_config_value(profile, "token") key = "github.{}:{}".format(token, _get_config_value(profile, "org_name")) if key not in __context__: __context__[key] = github.Github(token, per_page=100) return __context__[key] def _get_members(organization, params=None): return github.PaginatedList.PaginatedList( github.NamedUser.NamedUser, organization._requester, organization.url + "/members", params, ) def _get_repos(profile, params=None, ignore_cache=False): # Use cache when no params are given org_name = _get_config_value(profile, "org_name") key = "github.{}:repos".format(org_name) if key not in __context__ or ignore_cache or params is not None: org_name = _get_config_value(profile, "org_name") client = _get_client(profile) organization = client.get_organization(org_name) result = github.PaginatedList.PaginatedList( github.Repository.Repository, organization._requester, organization.url + "/repos", params, ) # Only cache results if no params were given (full scan) if params is not None: return result next_result = [] for repo in result: next_result.append(repo) # Cache a copy of each repo for single lookups repo_key = "github.{}:{}:repo_info".format(org_name, repo.name.lower()) __context__[repo_key] = _repo_to_dict(repo) __context__[key] = next_result return __context__[key] def list_users(profile="github", ignore_cache=False): """ List all users within the organization. profile The name of the profile configuration to use. Defaults to ``github``. ignore_cache Bypasses the use of cached users. .. versionadded:: 2016.11.0 CLI Example: .. code-block:: bash salt myminion github.list_users salt myminion github.list_users profile='my-github-profile' """ org_name = _get_config_value(profile, "org_name") key = "github.{}:users".format(org_name) if key not in __context__ or ignore_cache: client = _get_client(profile) organization = client.get_organization(org_name) __context__[key] = [member.login for member in _get_members(organization, None)] return __context__[key] def get_user(name, profile="github", user_details=False): """ Get a GitHub user by name. name The user for which to obtain information. profile The name of the profile configuration to use. Defaults to ``github``. user_details Prints user information details. Defaults to ``False``. If the user is already in the organization and user_details is set to False, the get_user function returns ``True``. If the user is not already present in the organization, user details will be printed by default. CLI Example: .. code-block:: bash salt myminion github.get_user github-handle salt myminion github.get_user github-handle user_details=true """ if not user_details and name in list_users(profile): # User is in the org, no need for additional Data return True response = {} client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) try: user = client.get_user(name) except UnknownObjectException: log.exception("Resource not found") return False response["company"] = user.company response["created_at"] = user.created_at response["email"] = user.email response["html_url"] = user.html_url response["id"] = user.id response["login"] = user.login response["name"] = user.name response["type"] = user.type response["url"] = user.url try: headers, data = organization._requester.requestJsonAndCheck( "GET", organization.url + "/memberships/" + user._identity ) except UnknownObjectException: response["membership_state"] = "nonexistent" response["in_org"] = False return response response["in_org"] = organization.has_in_members(user) response["membership_state"] = data.get("state") return response def add_user(name, profile="github"): """ Add a GitHub user. name The user for which to obtain information. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.add_user github-handle """ client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) try: github_named_user = client.get_user(name) except UnknownObjectException: log.exception("Resource not found") return False headers, data = organization._requester.requestJsonAndCheck( "PUT", organization.url + "/memberships/" + github_named_user._identity ) return data.get("state") == "pending" def remove_user(name, profile="github"): """ Remove a Github user by name. name The user for which to obtain information. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.remove_user github-handle """ client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) try: git_user = client.get_user(name) except UnknownObjectException: log.exception("Resource not found") return False if organization.has_in_members(git_user): organization.remove_from_members(git_user) return not organization.has_in_members(git_user) def get_issue(issue_number, repo_name=None, profile="github", output="min"): """ Return information about a single issue in a named repository. .. versionadded:: 2016.11.0 issue_number The number of the issue to retrieve. repo_name The name of the repository from which to get the issue. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the repo_name defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. output The amount of data returned by each issue. Defaults to ``min``. Change to ``full`` to see all issue output. CLI Example: .. code-block:: bash salt myminion github.get_issue 514 salt myminion github.get_issue 514 repo_name=salt """ org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) command = "issues/" + str(issue_number) ret = {} issue_data = _query(profile, action=action, command=command) issue_id = issue_data.get("id") if output == "full": ret[issue_id] = issue_data else: ret[issue_id] = _format_issue(issue_data) return ret def get_issue_comments( issue_number, repo_name=None, profile="github", since=None, output="min" ): """ Return information about the comments for a given issue in a named repository. .. versionadded:: 2016.11.0 issue_number The number of the issue for which to retrieve comments. repo_name The name of the repository to which the issue belongs. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the repo_name defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. since Only comments updated at or after this time are returned. This is a timestamp in ISO 8601 format: ``YYYY-MM-DDTHH:MM:SSZ``. output The amount of data returned by each issue. Defaults to ``min``. Change to ``full`` to see all issue output. CLI Example: .. code-block:: bash salt myminion github.get_issue_comments 514 salt myminion github.get_issue 514 repo_name=salt """ org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) command = "/".join(["issues", str(issue_number), "comments"]) args = {} if since: args["since"] = since comments = _query(profile, action=action, command=command, args=args) ret = {} for comment in comments: comment_id = comment.get("id") if output == "full": ret[comment_id] = comment else: ret[comment_id] = { "id": comment.get("id"), "created_at": comment.get("created_at"), "updated_at": comment.get("updated_at"), "user_login": comment.get("user").get("login"), } return ret def get_issues( repo_name=None, profile="github", milestone=None, state="open", assignee=None, creator=None, mentioned=None, labels=None, sort="created", direction="desc", since=None, output="min", per_page=None, ): """ Returns information for all issues in a given repository, based on the search options. .. versionadded:: 2016.11.0 repo_name The name of the repository for which to list issues. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the repo_name defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. milestone The number of a GitHub milestone, or a string of either ``*`` or ``none``. If a number is passed, it should refer to a milestone by its number field. Use the ``github.get_milestone`` function to obtain a milestone's number. If the string ``*`` is passed, issues with any milestone are accepted. If the string ``none`` is passed, issues without milestones are returned. state Indicates the state of the issues to return. Can be either ``open``, ``closed``, or ``all``. Default is ``open``. assignee Can be the name of a user. Pass in ``none`` (as a string) for issues with no assigned user or ``*`` for issues assigned to any user. creator The user that created the issue. mentioned A user that's mentioned in the issue. labels A string of comma separated label names. For example, ``bug,ui,@high``. sort What to sort results by. Can be either ``created``, ``updated``, or ``comments``. Default is ``created``. direction The direction of the sort. Can be either ``asc`` or ``desc``. Default is ``desc``. since Only issues updated at or after this time are returned. This is a timestamp in ISO 8601 format: ``YYYY-MM-DDTHH:MM:SSZ``. output The amount of data returned by each issue. Defaults to ``min``. Change to ``full`` to see all issue output. per_page GitHub paginates data in their API calls. Use this value to increase or decrease the number of issues gathered from GitHub, per page. If not set, GitHub defaults are used. Maximum is 100. CLI Example: .. code-block:: bash salt myminion github.get_issues my-github-repo """ org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) args = {} # Build API arguments, as necessary. if milestone: args["milestone"] = milestone if assignee: args["assignee"] = assignee if creator: args["creator"] = creator if mentioned: args["mentioned"] = mentioned if labels: args["labels"] = labels if since: args["since"] = since if per_page: args["per_page"] = per_page # Only pass the following API args if they're not the defaults listed. if state and state != "open": args["state"] = state if sort and sort != "created": args["sort"] = sort if direction and direction != "desc": args["direction"] = direction ret = {} issues = _query(profile, action=action, command="issues", args=args) for issue in issues: # Pull requests are included in the issue list from GitHub # Let's not include those in the return. if issue.get("pull_request"): continue issue_id = issue.get("id") if output == "full": ret[issue_id] = issue else: ret[issue_id] = _format_issue(issue) return ret def get_milestones( repo_name=None, profile="github", state="open", sort="due_on", direction="asc", output="min", per_page=None, ): """ Return information about milestones for a given repository. .. versionadded:: 2016.11.0 repo_name The name of the repository for which to list issues. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the repo_name defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. state The state of the milestone. Either ``open``, ``closed``, or ``all``. Default is ``open``. sort What to sort results by. Either ``due_on`` or ``completeness``. Default is ``due_on``. direction The direction of the sort. Either ``asc`` or ``desc``. Default is ``asc``. output The amount of data returned by each issue. Defaults to ``min``. Change to ``full`` to see all issue output. per_page GitHub paginates data in their API calls. Use this value to increase or decrease the number of issues gathered from GitHub, per page. If not set, GitHub defaults are used. CLI Example: .. code-block:: bash salt myminion github.get_milestones """ org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) args = {} if per_page: args["per_page"] = per_page # Only pass the following API args if they're not the defaults listed. if state and state != "open": args["state"] = state if sort and sort != "due_on": args["sort"] = sort if direction and direction != "asc": args["direction"] = direction ret = {} milestones = _query(profile, action=action, command="milestones", args=args) for milestone in milestones: milestone_id = milestone.get("id") if output == "full": ret[milestone_id] = milestone else: milestone.pop("creator") milestone.pop("html_url") milestone.pop("labels_url") ret[milestone_id] = milestone return ret def get_milestone( number=None, name=None, repo_name=None, profile="github", output="min" ): """ Return information about a single milestone in a named repository. .. versionadded:: 2016.11.0 number The number of the milestone to retrieve. If provided, this option will be favored over ``name``. name The name of the milestone to retrieve. repo_name The name of the repository for which to list issues. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the repo_name defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. output The amount of data returned by each issue. Defaults to ``min``. Change to ``full`` to see all issue output. CLI Example: .. code-block:: bash salt myminion github.get_milestone 72 salt myminion github.get_milestone name=my_milestone """ ret = {} if not any([number, name]): raise CommandExecutionError( "Either a milestone 'name' or 'number' must be provided." ) org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) if number: command = "milestones/" + str(number) milestone_data = _query(profile, action=action, command=command) milestone_id = milestone_data.get("id") if output == "full": ret[milestone_id] = milestone_data else: milestone_data.pop("creator") milestone_data.pop("html_url") milestone_data.pop("labels_url") ret[milestone_id] = milestone_data return ret else: milestones = get_milestones(repo_name=repo_name, profile=profile, output=output) for key, val in milestones.items(): if val.get("title") == name: ret[key] = val return ret return ret def _repo_to_dict(repo): ret = {} ret["id"] = repo.id ret["name"] = repo.name ret["full_name"] = repo.full_name ret["owner"] = repo.owner.login ret["private"] = repo.private ret["html_url"] = repo.html_url ret["description"] = repo.description ret["fork"] = repo.fork ret["homepage"] = repo.homepage ret["size"] = repo.size ret["stargazers_count"] = repo.stargazers_count ret["watchers_count"] = repo.watchers_count ret["language"] = repo.language ret["open_issues_count"] = repo.open_issues_count ret["forks"] = repo.forks ret["open_issues"] = repo.open_issues ret["watchers"] = repo.watchers ret["default_branch"] = repo.default_branch ret["has_issues"] = repo.has_issues ret["has_wiki"] = repo.has_wiki ret["has_downloads"] = repo.has_downloads return ret def get_repo_info(repo_name, profile="github", ignore_cache=False): """ Return information for a given repo. .. versionadded:: 2016.11.0 repo_name The name of the repository. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.get_repo_info salt salt myminion github.get_repo_info salt profile='my-github-profile' """ org_name = _get_config_value(profile, "org_name") key = "github.{}:{}:repo_info".format( _get_config_value(profile, "org_name"), repo_name.lower() ) if key not in __context__ or ignore_cache: client = _get_client(profile) try: repo = client.get_repo("/".join([org_name, repo_name])) if not repo: return {} # client.get_repo can return a github.Repository.Repository object, # even if the repo is invalid. We need to catch the exception when # we try to perform actions on the repo object, rather than above # the if statement. ret = _repo_to_dict(repo) __context__[key] = ret except github.UnknownObjectException: raise CommandExecutionError( "The '{}' repository under the '{}' organization could not " "be found.".format(repo_name, org_name) ) return __context__[key] def get_repo_teams(repo_name, profile="github"): """ Return teams belonging to a repository. .. versionadded:: 2017.7.0 repo_name The name of the repository from which to retrieve teams. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.get_repo_teams salt salt myminion github.get_repo_teams salt profile='my-github-profile' """ ret = [] org_name = _get_config_value(profile, "org_name") client = _get_client(profile) try: repo = client.get_repo("/".join([org_name, repo_name])) except github.UnknownObjectException: raise CommandExecutionError( "The '{}' repository under the '{}' organization could not " "be found.".format(repo_name, org_name) ) try: teams = repo.get_teams() for team in teams: ret.append( {"id": team.id, "name": team.name, "permission": team.permission} ) except github.UnknownObjectException: raise CommandExecutionError( "Unable to retrieve teams for repository '{}' under the '{}' " "organization.".format(repo_name, org_name) ) return ret def list_repos(profile="github"): """ List all repositories within the organization. Includes public and private repositories within the organization Dependent upon the access rights of the profile token. .. versionadded:: 2016.11.0 profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.list_repos salt myminion github.list_repos profile='my-github-profile' """ return [repo.name for repo in _get_repos(profile)] def list_private_repos(profile="github"): """ List private repositories within the organization. Dependent upon the access rights of the profile token. .. versionadded:: 2016.11.0 profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.list_private_repos salt myminion github.list_private_repos profile='my-github-profile' """ repos = [] for repo in _get_repos(profile): if repo.private is True: repos.append(repo.name) return repos def list_public_repos(profile="github"): """ List public repositories within the organization. .. versionadded:: 2016.11.0 profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.list_public_repos salt myminion github.list_public_repos profile='my-github-profile' """ repos = [] for repo in _get_repos(profile): if repo.private is False: repos.append(repo.name) return repos def add_repo( name, description=None, homepage=None, private=None, has_issues=None, has_wiki=None, has_downloads=None, auto_init=None, gitignore_template=None, license_template=None, profile="github", ): """ Create a new github repository. name The name of the team to be created. description The description of the repository. homepage The URL with more information about the repository. private The visiblity of the repository. Note that private repositories require a paid GitHub account. has_issues Whether to enable issues for this repository. has_wiki Whether to enable the wiki for this repository. has_downloads Whether to enable downloads for this repository. auto_init Whether to create an initial commit with an empty README. gitignore_template The desired language or platform for a .gitignore, e.g "Haskell". license_template The desired LICENSE template to apply, e.g "mit" or "mozilla". profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.add_repo 'repo_name' .. versionadded:: 2016.11.0 """ try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) given_params = { "description": description, "homepage": homepage, "private": private, "has_issues": has_issues, "has_wiki": has_wiki, "has_downloads": has_downloads, "auto_init": auto_init, "gitignore_template": gitignore_template, "license_template": license_template, } parameters = {"name": name} for param_name, param_value in given_params.items(): if param_value is not None: parameters[param_name] = param_value organization._requester.requestJsonAndCheck( "POST", organization.url + "/repos", input=parameters ) return True except github.GithubException: log.exception("Error creating a repo") return False def edit_repo( name, description=None, homepage=None, private=None, has_issues=None, has_wiki=None, has_downloads=None, profile="github", ): """ Updates an existing Github repository. name The name of the team to be created. description The description of the repository. homepage The URL with more information about the repository. private The visiblity of the repository. Note that private repositories require a paid GitHub account. has_issues Whether to enable issues for this repository. has_wiki Whether to enable the wiki for this repository. has_downloads Whether to enable downloads for this repository. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.add_repo 'repo_name' .. versionadded:: 2016.11.0 """ try: allow_private_change = _get_config_value(profile, "allow_repo_privacy_changes") except CommandExecutionError: allow_private_change = False if private is not None and not allow_private_change: raise CommandExecutionError( "The private field is set to be changed for " "repo {} but allow_repo_privacy_changes " "disallows this.".format(name) ) try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) repo = organization.get_repo(name) given_params = { "description": description, "homepage": homepage, "private": private, "has_issues": has_issues, "has_wiki": has_wiki, "has_downloads": has_downloads, } parameters = {"name": name} for param_name, param_value in given_params.items(): if param_value is not None: parameters[param_name] = param_value organization._requester.requestJsonAndCheck("PATCH", repo.url, input=parameters) get_repo_info(name, profile=profile, ignore_cache=True) # Refresh cache return True except github.GithubException: log.exception("Error editing a repo") return False def remove_repo(name, profile="github"): """ Remove a Github repository. name The name of the repository to be removed. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.remove_repo 'my-repo' .. versionadded:: 2016.11.0 """ repo_info = get_repo_info(name, profile=profile) if not repo_info: log.error("Repo %s to be removed does not exist.", name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) repo = organization.get_repo(name) repo.delete() _get_repos(profile=profile, ignore_cache=True) # refresh cache return True except github.GithubException: log.exception("Error deleting a repo") return False def get_team(name, profile="github"): """ Returns the team details if a team with the given name exists, or None otherwise. name The team name for which to obtain information. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.get_team 'team_name' """ return list_teams(profile).get(name) def add_team( name, description=None, repo_names=None, privacy=None, permission=None, profile="github", ): """ Create a new Github team within an organization. name The name of the team to be created. description The description of the team. repo_names The names of repositories to add the team to. privacy The level of privacy for the team, can be 'secret' or 'closed'. permission The default permission for new repositories added to the team, can be 'pull', 'push' or 'admin'. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.add_team 'team_name' .. versionadded:: 2016.11.0 """ try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) parameters = {} parameters["name"] = name if description is not None: parameters["description"] = description if repo_names is not None: parameters["repo_names"] = repo_names if permission is not None: parameters["permission"] = permission if privacy is not None: parameters["privacy"] = privacy organization._requester.requestJsonAndCheck( "POST", organization.url + "/teams", input=parameters ) list_teams(ignore_cache=True) # Refresh cache return True except github.GithubException: log.exception("Error creating a team") return False def edit_team(name, description=None, privacy=None, permission=None, profile="github"): """ Updates an existing Github team. name The name of the team to be edited. description The description of the team. privacy The level of privacy for the team, can be 'secret' or 'closed'. permission The default permission for new repositories added to the team, can be 'pull', 'push' or 'admin'. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.edit_team 'team_name' description='Team description' .. versionadded:: 2016.11.0 """ team = get_team(name, profile=profile) if not team: log.error("Team %s does not exist", name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team["id"]) parameters = {} if name is not None: parameters["name"] = name if description is not None: parameters["description"] = description if privacy is not None: parameters["privacy"] = privacy if permission is not None: parameters["permission"] = permission team._requester.requestJsonAndCheck("PATCH", team.url, input=parameters) return True except UnknownObjectException: log.exception("Resource not found") return False def remove_team(name, profile="github"): """ Remove a github team. name The name of the team to be removed. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.remove_team 'team_name' .. versionadded:: 2016.11.0 """ team_info = get_team(name, profile=profile) if not team_info: log.error("Team %s to be removed does not exist.", name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team_info["id"]) team.delete() return list_teams(ignore_cache=True, profile=profile).get(name) is None except github.GithubException: log.exception("Error deleting a team") return False def list_team_repos(team_name, profile="github", ignore_cache=False): """ Gets the repo details for a given team as a dict from repo_name to repo details. Note that repo names are always in lower case. team_name The name of the team from which to list repos. profile The name of the profile configuration to use. Defaults to ``github``. ignore_cache Bypasses the use of cached team repos. CLI Example: .. code-block:: bash salt myminion github.list_team_repos 'team_name' .. versionadded:: 2016.11.0 """ cached_team = get_team(team_name, profile=profile) if not cached_team: log.error("Team %s does not exist.", team_name) return False # Return from cache if available if cached_team.get("repos") and not ignore_cache: return cached_team.get("repos") try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(cached_team["id"]) except UnknownObjectException: log.exception("Resource not found: %s", cached_team["id"]) try: repos = {} for repo in team.get_repos(): permission = "pull" if repo.permissions.admin: permission = "admin" elif repo.permissions.push: permission = "push" repos[repo.name.lower()] = {"permission": permission} cached_team["repos"] = repos return repos except UnknownObjectException: log.exception("Resource not found: %s", cached_team["id"]) return [] def add_team_repo(repo_name, team_name, profile="github", permission=None): """ Adds a repository to a team with team_name. repo_name The name of the repository to add. team_name The name of the team of which to add the repository. profile The name of the profile configuration to use. Defaults to ``github``. permission The permission for team members within the repository, can be 'pull', 'push' or 'admin'. If not specified, the default permission specified on the team will be used. .. versionadded:: 2017.7.0 CLI Example: .. code-block:: bash salt myminion github.add_team_repo 'my_repo' 'team_name' .. versionadded:: 2016.11.0 """ team = get_team(team_name, profile=profile) if not team: log.error("Team %s does not exist", team_name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team["id"]) repo = organization.get_repo(repo_name) except UnknownObjectException: log.exception("Resource not found: %s", team["id"]) return False params = None if permission is not None: params = {"permission": permission} headers, data = team._requester.requestJsonAndCheck( "PUT", team.url + "/repos/" + repo._identity, input=params ) # Try to refresh cache list_team_repos(team_name, profile=profile, ignore_cache=True) return True def remove_team_repo(repo_name, team_name, profile="github"): """ Removes a repository from a team with team_name. repo_name The name of the repository to remove. team_name The name of the team of which to remove the repository. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.remove_team_repo 'my_repo' 'team_name' .. versionadded:: 2016.11.0 """ team = get_team(team_name, profile=profile) if not team: log.error("Team %s does not exist", team_name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team["id"]) repo = organization.get_repo(repo_name) except UnknownObjectException: log.exception("Resource not found: %s", team["id"]) return False team.remove_from_repos(repo) return repo_name not in list_team_repos( team_name, profile=profile, ignore_cache=True ) def list_team_members(team_name, profile="github", ignore_cache=False): """ Gets the names of team members in lower case. team_name The name of the team from which to list members. profile The name of the profile configuration to use. Defaults to ``github``. ignore_cache Bypasses the use of cached team members. CLI Example: .. code-block:: bash salt myminion github.list_team_members 'team_name' .. versionadded:: 2016.11.0 """ cached_team = get_team(team_name, profile=profile) if not cached_team: log.error("Team %s does not exist.", team_name) return False # Return from cache if available if cached_team.get("members") and not ignore_cache: return cached_team.get("members") try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(cached_team["id"]) except UnknownObjectException: log.exception("Resource not found: %s", cached_team["id"]) try: cached_team["members"] = [member.login.lower() for member in team.get_members()] return cached_team["members"] except UnknownObjectException: log.exception("Resource not found: %s", cached_team["id"]) return [] def list_members_without_mfa(profile="github", ignore_cache=False): """ List all members (in lower case) without MFA turned on. profile The name of the profile configuration to use. Defaults to ``github``. ignore_cache Bypasses the use of cached team repos. CLI Example: .. code-block:: bash salt myminion github.list_members_without_mfa .. versionadded:: 2016.11.0 """ key = "github.{}:non_mfa_users".format(_get_config_value(profile, "org_name")) if key not in __context__ or ignore_cache: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) filter_key = "filter" # Silly hack to see if we're past PyGithub 1.26.0, where the name of # the filter kwarg changed if hasattr(github.Team.Team, "membership"): filter_key = "filter_" __context__[key] = [ m.login.lower() for m in _get_members(organization, {filter_key: "2fa_disabled"}) ] return __context__[key] def is_team_member(name, team_name, profile="github"): """ Returns True if the github user is in the team with team_name, or False otherwise. name The name of the user whose membership to check. team_name The name of the team to check membership in. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.is_team_member 'user_name' 'team_name' .. versionadded:: 2016.11.0 """ return name.lower() in list_team_members(team_name, profile=profile) def add_team_member(name, team_name, profile="github"): """ Adds a team member to a team with team_name. name The name of the team member to add. team_name The name of the team of which to add the user. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.add_team_member 'user_name' 'team_name' .. versionadded:: 2016.11.0 """ team = get_team(team_name, profile=profile) if not team: log.error("Team %s does not exist", team_name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team["id"]) member = client.get_user(name) except UnknownObjectException: log.exception("Resource not found: %s", team["id"]) return False try: # Can't use team.add_membership due to this bug that hasn't made it into # a PyGithub release yet https://github.com/PyGithub/PyGithub/issues/363 headers, data = team._requester.requestJsonAndCheck( "PUT", team.url + "/memberships/" + member._identity, input={"role": "member"}, parameters={"role": "member"}, ) except github.GithubException: log.exception("Error in adding a member to a team") return False return True def remove_team_member(name, team_name, profile="github"): """ Removes a team member from a team with team_name. name The name of the team member to remove. team_name The name of the team from which to remove the user. profile The name of the profile configuration to use. Defaults to ``github``. CLI Example: .. code-block:: bash salt myminion github.remove_team_member 'user_name' 'team_name' .. versionadded:: 2016.11.0 """ team = get_team(team_name, profile=profile) if not team: log.error("Team %s does not exist", team_name) return False try: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) team = organization.get_team(team["id"]) member = client.get_user(name) except UnknownObjectException: log.exception("Resource not found: %s", team["id"]) return False if not hasattr(team, "remove_from_members"): return ( False, "PyGithub 1.26.0 or greater is required for team " "management, please upgrade.", ) team.remove_from_members(member) return not team.has_in_members(member) def list_teams(profile="github", ignore_cache=False): """ Lists all teams with the organization. profile The name of the profile configuration to use. Defaults to ``github``. ignore_cache Bypasses the use of cached teams. CLI Example: .. code-block:: bash salt myminion github.list_teams .. versionadded:: 2016.11.0 """ key = "github.{}:teams".format(_get_config_value(profile, "org_name")) if key not in __context__ or ignore_cache: client = _get_client(profile) organization = client.get_organization(_get_config_value(profile, "org_name")) teams_data = organization.get_teams() teams = {} for team in teams_data: # Note that _rawData is used to access some properties here as they # are not exposed in older versions of PyGithub. It's VERY important # to use team._rawData instead of team.raw_data, as the latter forces # an API call to retrieve team details again. teams[team.name] = { "id": team.id, "slug": team.slug, "description": team._rawData["description"], "permission": team.permission, "privacy": team._rawData["privacy"], } __context__[key] = teams return __context__[key] def get_prs( repo_name=None, profile="github", state="open", head=None, base=None, sort="created", direction="desc", output="min", per_page=None, ): """ Returns information for all pull requests in a given repository, based on the search options provided. .. versionadded:: 2017.7.0 repo_name The name of the repository for which to list pull requests. This argument is required, either passed via the CLI, or defined in the configured profile. A ``repo_name`` passed as a CLI argument will override the ``repo_name`` defined in the configured profile, if provided. profile The name of the profile configuration to use. Defaults to ``github``. state Indicates the state of the pull requests to return. Can be either ``open``, ``closed``, or ``all``. Default is ``open``. head Filter pull requests by head user and branch name in the format of ``user:ref-name``. Example: ``'github:new-script-format'``. Default is ``None``. base Filter pulls by base branch name. Example: ``gh-pages``. Default is ``None``. sort What to sort results by. Can be either ``created``, ``updated``, ``popularity`` (comment count), or ``long-running`` (age, filtering by pull requests updated within the last month). Default is ``created``. direction The direction of the sort. Can be either ``asc`` or ``desc``. Default is ``desc``. output The amount of data returned by each pull request. Defaults to ``min``. Change to ``full`` to see all pull request output. per_page GitHub paginates data in their API calls. Use this value to increase or decrease the number of pull requests gathered from GitHub, per page. If not set, GitHub defaults are used. Maximum is 100. CLI Example: .. code-block:: bash salt myminion github.get_prs salt myminion github.get_prs base=2016.11 """ org_name = _get_config_value(profile, "org_name") if repo_name is None: repo_name = _get_config_value(profile, "repo_name") action = "/".join(["repos", org_name, repo_name]) args = {} # Build API arguments, as necessary. if head: args["head"] = head if base: args["base"] = base if per_page: args["per_page"] = per_page # Only pass the following API args if they're not the defaults listed. if state and state != "open": args["state"] = state if sort and sort != "created": args["sort"] = sort if direction and direction != "desc": args["direction"] = direction ret = {} prs = _query(profile, action=action, command="pulls", args=args) for pr_ in prs: pr_id = pr_.get("id") if output == "full": ret[pr_id] = pr_ else: ret[pr_id] = _format_pr(pr_) return ret def _format_pr(pr_): """ Helper function to format API return information into a more manageable and useful dictionary for pull request information. pr_ The pull request to format. """ ret = { "id": pr_.get("id"), "pr_number": pr_.get("number"), "state": pr_.get("state"), "title": pr_.get("title"), "user": pr_.get("user").get("login"), "html_url": pr_.get("html_url"), "base_branch": pr_.get("base").get("ref"), } return ret def _format_issue(issue): """ Helper function to format API return information into a more manageable and useful dictionary for issue information. issue The issue to format. """ ret = { "id": issue.get("id"), "issue_number": issue.get("number"), "state": issue.get("state"), "title": issue.get("title"), "user": issue.get("user").get("login"), "html_url": issue.get("html_url"), } assignee = issue.get("assignee") if assignee: assignee = assignee.get("login") labels = issue.get("labels") label_names = [] for label in labels: label_names.append(label.get("name")) milestone = issue.get("milestone") if milestone: milestone = milestone.get("title") ret["assignee"] = assignee ret["labels"] = label_names ret["milestone"] = milestone return ret def _query( profile, action=None, command=None, args=None, method="GET", header_dict=None, data=None, url="https://api.github.com/", per_page=None, ): """ Make a web call to the GitHub API and deal with paginated results. """ if not isinstance(args, dict): args = {} if action: url += action if command: url += "/{}".format(command) log.debug("GitHub URL: %s", url) if "access_token" not in args.keys(): args["access_token"] = _get_config_value(profile, "token") if per_page and "per_page" not in args.keys(): args["per_page"] = per_page if header_dict is None: header_dict = {} if method != "POST": header_dict["Accept"] = "application/json" decode = True if method == "DELETE": decode = False # GitHub paginates all queries when returning many items. # Gather all data using multiple queries and handle pagination. complete_result = [] next_page = True page_number = "" while next_page is True: if page_number: args["page"] = page_number result = salt.utils.http.query( url, method, params=args, data=data, header_dict=header_dict, decode=decode, decode_type="json", headers=True, status=True, text=True, hide_fields=["access_token"], opts=__opts__, ) log.debug("GitHub Response Status Code: %s", result["status"]) if result["status"] == 200: if isinstance(result["dict"], dict): # If only querying for one item, such as a single issue # The GitHub API returns a single dictionary, instead of # A list of dictionaries. In that case, we can return. return result["dict"] complete_result = complete_result + result["dict"] else: raise CommandExecutionError( "GitHub Response Error: {}".format(result.get("error")) ) try: link_info = result.get("headers").get("Link").split(",")[0] except AttributeError: # Only one page of data was returned; exit the loop. next_page = False continue if "next" in link_info: # Get the 'next' page number from the Link header. page_number = link_info.split(">")[0].split("&page=")[1] else: # Last page already processed; break the loop. next_page = False return complete_result
Save