golden hour
/opt/saltstack/salt/lib/python3.10/site-packages/salt/states
⬆️ Go Up
Upload
File/Folder
Size
Actions
__init__.py
25 B
Del
OK
__pycache__
-
Del
OK
acme.py
5.08 KB
Del
OK
alias.py
2.49 KB
Del
OK
alternatives.py
6.75 KB
Del
OK
ansiblegate.py
7.93 KB
Del
OK
apache.py
3.95 KB
Del
OK
apache_conf.py
2.72 KB
Del
OK
apache_module.py
2.73 KB
Del
OK
apache_site.py
2.66 KB
Del
OK
aptpkg.py
1.42 KB
Del
OK
archive.py
68.24 KB
Del
OK
artifactory.py
6.84 KB
Del
OK
at.py
7.48 KB
Del
OK
augeas.py
10.57 KB
Del
OK
aws_sqs.py
2.59 KB
Del
OK
azurearm_compute.py
11.78 KB
Del
OK
azurearm_dns.py
26.05 KB
Del
OK
azurearm_network.py
89.12 KB
Del
OK
azurearm_resource.py
28.23 KB
Del
OK
beacon.py
7.58 KB
Del
OK
bigip.py
96.63 KB
Del
OK
blockdev.py
5.13 KB
Del
OK
boto3_elasticache.py
48.01 KB
Del
OK
boto3_elasticsearch.py
32.58 KB
Del
OK
boto3_route53.py
37.54 KB
Del
OK
boto3_sns.py
12.69 KB
Del
OK
boto_apigateway.py
82.83 KB
Del
OK
boto_asg.py
31.93 KB
Del
OK
boto_cfn.py
11.53 KB
Del
OK
boto_cloudfront.py
6.01 KB
Del
OK
boto_cloudtrail.py
13.18 KB
Del
OK
boto_cloudwatch_alarm.py
6.4 KB
Del
OK
boto_cloudwatch_event.py
12.33 KB
Del
OK
boto_cognitoidentity.py
13.69 KB
Del
OK
boto_datapipeline.py
18.5 KB
Del
OK
boto_dynamodb.py
29.32 KB
Del
OK
boto_ec2.py
71.98 KB
Del
OK
boto_elasticache.py
16.75 KB
Del
OK
boto_elasticsearch_domain.py
12.27 KB
Del
OK
boto_elb.py
55.1 KB
Del
OK
boto_elbv2.py
12.19 KB
Del
OK
boto_iam.py
69.16 KB
Del
OK
boto_iam_role.py
27.12 KB
Del
OK
boto_iot.py
25.33 KB
Del
OK
boto_kinesis.py
16.69 KB
Del
OK
boto_kms.py
12.11 KB
Del
OK
boto_lambda.py
35.52 KB
Del
OK
boto_lc.py
11.04 KB
Del
OK
boto_rds.py
26 KB
Del
OK
boto_route53.py
19.49 KB
Del
OK
boto_s3.py
9.32 KB
Del
OK
boto_s3_bucket.py
24.67 KB
Del
OK
boto_secgroup.py
32.62 KB
Del
OK
boto_sns.py
8.92 KB
Del
OK
boto_sqs.py
7.97 KB
Del
OK
boto_vpc.py
62.23 KB
Del
OK
bower.py
8.26 KB
Del
OK
btrfs.py
10.34 KB
Del
OK
cabal.py
5.73 KB
Del
OK
ceph.py
1.9 KB
Del
OK
chef.py
3.76 KB
Del
OK
chocolatey.py
16.15 KB
Del
OK
chronos_job.py
4.6 KB
Del
OK
cimc.py
14.32 KB
Del
OK
cisconso.py
3.14 KB
Del
OK
cloud.py
14.4 KB
Del
OK
cmd.py
40.92 KB
Del
OK
composer.py
8.38 KB
Del
OK
consul.py
5.4 KB
Del
OK
cron.py
23.39 KB
Del
OK
cryptdev.py
6.17 KB
Del
OK
csf.py
9.98 KB
Del
OK
cyg.py
7.05 KB
Del
OK
ddns.py
4.2 KB
Del
OK
debconfmod.py
6.33 KB
Del
OK
dellchassis.py
24.49 KB
Del
OK
disk.py
6.49 KB
Del
OK
docker_container.py
85.27 KB
Del
OK
docker_image.py
16.7 KB
Del
OK
docker_network.py
36.78 KB
Del
OK
docker_volume.py
6.72 KB
Del
OK
drac.py
4.17 KB
Del
OK
dvs.py
26.29 KB
Del
OK
elasticsearch.py
20.38 KB
Del
OK
elasticsearch_index.py
3.25 KB
Del
OK
elasticsearch_index_template.py
3.67 KB
Del
OK
environ.py
5.81 KB
Del
OK
eselect.py
2.27 KB
Del
OK
esxcluster.py
22.4 KB
Del
OK
esxdatacenter.py
4.44 KB
Del
OK
esxi.py
63.07 KB
Del
OK
esxvm.py
20.11 KB
Del
OK
etcd_mod.py
11 KB
Del
OK
ethtool.py
9.88 KB
Del
OK
event.py
2.48 KB
Del
OK
file.py
316.7 KB
Del
OK
firewall.py
1.33 KB
Del
OK
firewalld.py
26.08 KB
Del
OK
gem.py
7.13 KB
Del
OK
git.py
123.85 KB
Del
OK
github.py
27.25 KB
Del
OK
glance_image.py
2.26 KB
Del
OK
glassfish.py
21.47 KB
Del
OK
glusterfs.py
12.21 KB
Del
OK
gnomedesktop.py
7.47 KB
Del
OK
gpg.py
5.28 KB
Del
OK
grafana.py
12.11 KB
Del
OK
grafana4_dashboard.py
17.31 KB
Del
OK
grafana4_datasource.py
6.15 KB
Del
OK
grafana4_org.py
7.73 KB
Del
OK
grafana4_user.py
5.52 KB
Del
OK
grafana_dashboard.py
17.74 KB
Del
OK
grafana_datasource.py
5.31 KB
Del
OK
grains.py
15.57 KB
Del
OK
group.py
9.84 KB
Del
OK
heat.py
9.69 KB
Del
OK
helm.py
10.39 KB
Del
OK
hg.py
6.33 KB
Del
OK
highstate_doc.py
1.41 KB
Del
OK
host.py
8.64 KB
Del
OK
http.py
7.46 KB
Del
OK
icinga2.py
9.07 KB
Del
OK
idem.py
3.91 KB
Del
OK
ifttt.py
2.12 KB
Del
OK
incron.py
5.71 KB
Del
OK
influxdb08_database.py
2.85 KB
Del
OK
influxdb08_user.py
3.39 KB
Del
OK
influxdb_continuous_query.py
2.83 KB
Del
OK
influxdb_database.py
2.11 KB
Del
OK
influxdb_retention_policy.py
4.82 KB
Del
OK
influxdb_user.py
4.84 KB
Del
OK
infoblox_a.py
4.24 KB
Del
OK
infoblox_cname.py
4.19 KB
Del
OK
infoblox_host_record.py
6.59 KB
Del
OK
infoblox_range.py
6.85 KB
Del
OK
ini_manage.py
12.67 KB
Del
OK
ipmi.py
8.42 KB
Del
OK
ipset.py
9.66 KB
Del
OK
iptables.py
27.65 KB
Del
OK
jboss7.py
23.95 KB
Del
OK
jenkins.py
3.36 KB
Del
OK
junos.py
17.78 KB
Del
OK
kapacitor.py
6.46 KB
Del
OK
kernelpkg.py
6.42 KB
Del
OK
keyboard.py
2.01 KB
Del
OK
keystone.py
27.12 KB
Del
OK
keystone_domain.py
2.81 KB
Del
OK
keystone_endpoint.py
4.69 KB
Del
OK
keystone_group.py
3.25 KB
Del
OK
keystone_project.py
3.36 KB
Del
OK
keystone_role.py
2.33 KB
Del
OK
keystone_role_grant.py
4.08 KB
Del
OK
keystone_service.py
2.89 KB
Del
OK
keystone_user.py
3.47 KB
Del
OK
keystore.py
5.67 KB
Del
OK
kmod.py
8.59 KB
Del
OK
kubernetes.py
24.87 KB
Del
OK
layman.py
2.44 KB
Del
OK
ldap.py
19.78 KB
Del
OK
libcloud_dns.py
5.7 KB
Del
OK
libcloud_loadbalancer.py
5.66 KB
Del
OK
libcloud_storage.py
5.13 KB
Del
OK
linux_acl.py
24.42 KB
Del
OK
locale.py
2.52 KB
Del
OK
logadm.py
4.67 KB
Del
OK
logrotate.py
3.86 KB
Del
OK
loop.py
7.74 KB
Del
OK
lvm.py
13.33 KB
Del
OK
lvs_server.py
6.28 KB
Del
OK
lvs_service.py
4.38 KB
Del
OK
lxc.py
22.17 KB
Del
OK
lxd.py
7.88 KB
Del
OK
lxd_container.py
22.25 KB
Del
OK
lxd_image.py
10.59 KB
Del
OK
lxd_profile.py
7.11 KB
Del
OK
mac_assistive.py
1.55 KB
Del
OK
mac_keychain.py
5.59 KB
Del
OK
mac_xattr.py
3.15 KB
Del
OK
macdefaults.py
2.65 KB
Del
OK
macpackage.py
6.76 KB
Del
OK
makeconf.py
6.87 KB
Del
OK
marathon_app.py
4.45 KB
Del
OK
mdadm_raid.py
6.41 KB
Del
OK
memcached.py
3.95 KB
Del
OK
modjk.py
2.84 KB
Del
OK
modjk_worker.py
6.49 KB
Del
OK
module.py
18.64 KB
Del
OK
mongodb_database.py
1.65 KB
Del
OK
mongodb_user.py
6.26 KB
Del
OK
monit.py
2.68 KB
Del
OK
mount.py
50.32 KB
Del
OK
mssql_database.py
3 KB
Del
OK
mssql_login.py
3.64 KB
Del
OK
mssql_role.py
2.37 KB
Del
OK
mssql_user.py
3.51 KB
Del
OK
msteams.py
2.53 KB
Del
OK
mysql_database.py
6.05 KB
Del
OK
mysql_grants.py
8.49 KB
Del
OK
mysql_query.py
13.07 KB
Del
OK
mysql_user.py
9.51 KB
Del
OK
net_napalm_yang.py
9.15 KB
Del
OK
netacl.py
31.92 KB
Del
OK
netconfig.py
33.42 KB
Del
OK
netntp.py
12.51 KB
Del
OK
netsnmp.py
11.33 KB
Del
OK
netusers.py
16.1 KB
Del
OK
network.py
23.97 KB
Del
OK
neutron_network.py
3.96 KB
Del
OK
neutron_secgroup.py
4 KB
Del
OK
neutron_secgroup_rule.py
4.75 KB
Del
OK
neutron_subnet.py
4.29 KB
Del
OK
nexus.py
4.97 KB
Del
OK
nfs_export.py
4.92 KB
Del
OK
nftables.py
19.5 KB
Del
OK
npm.py
11.21 KB
Del
OK
ntp.py
2.12 KB
Del
OK
nxos.py
10.37 KB
Del
OK
nxos_upgrade.py
3.5 KB
Del
OK
openstack_config.py
3.26 KB
Del
OK
openvswitch_bridge.py
4.36 KB
Del
OK
openvswitch_db.py
2.24 KB
Del
OK
openvswitch_port.py
17.24 KB
Del
OK
opsgenie.py
4.07 KB
Del
OK
pagerduty.py
1.89 KB
Del
OK
pagerduty_escalation_policy.py
5.42 KB
Del
OK
pagerduty_schedule.py
6.09 KB
Del
OK
pagerduty_service.py
3.93 KB
Del
OK
pagerduty_user.py
1.18 KB
Del
OK
panos.py
48.13 KB
Del
OK
pbm.py
20.46 KB
Del
OK
pcs.py
36.46 KB
Del
OK
pdbedit.py
3.43 KB
Del
OK
pecl.py
3.65 KB
Del
OK
pip_state.py
38.55 KB
Del
OK
pkg.py
138.08 KB
Del
OK
pkgbuild.py
11.37 KB
Del
OK
pkgng.py
685 B
Del
OK
pkgrepo.py
27.53 KB
Del
OK
portage_config.py
5.01 KB
Del
OK
ports.py
5.65 KB
Del
OK
postgres_cluster.py
4.19 KB
Del
OK
postgres_database.py
6.08 KB
Del
OK
postgres_extension.py
5.68 KB
Del
OK
postgres_group.py
8.52 KB
Del
OK
postgres_initdb.py
2.84 KB
Del
OK
postgres_language.py
3.94 KB
Del
OK
postgres_privileges.py
7.86 KB
Del
OK
postgres_schema.py
4.34 KB
Del
OK
postgres_tablespace.py
6.62 KB
Del
OK
postgres_user.py
9.49 KB
Del
OK
powerpath.py
2.34 KB
Del
OK
probes.py
15.06 KB
Del
OK
process.py
1.32 KB
Del
OK
proxy.py
4.94 KB
Del
OK
pushover.py
3.13 KB
Del
OK
pyenv.py
6.07 KB
Del
OK
pyrax_queues.py
2.97 KB
Del
OK
quota.py
1.4 KB
Del
OK
rabbitmq_cluster.py
1.84 KB
Del
OK
rabbitmq_plugin.py
2.77 KB
Del
OK
rabbitmq_policy.py
4.59 KB
Del
OK
rabbitmq_upstream.py
7.9 KB
Del
OK
rabbitmq_user.py
8.89 KB
Del
OK
rabbitmq_vhost.py
3.04 KB
Del
OK
rbac_solaris.py
6.67 KB
Del
OK
rbenv.py
7.36 KB
Del
OK
rdp.py
1.28 KB
Del
OK
redismod.py
4.76 KB
Del
OK
reg.py
19.22 KB
Del
OK
restconf.py
6.41 KB
Del
OK
rsync.py
4.45 KB
Del
OK
rvm.py
6.56 KB
Del
OK
salt_proxy.py
1.34 KB
Del
OK
saltmod.py
33.12 KB
Del
OK
saltutil.py
8.91 KB
Del
OK
schedule.py
12.47 KB
Del
OK
selinux.py
18.61 KB
Del
OK
serverdensity_device.py
6.41 KB
Del
OK
service.py
37.89 KB
Del
OK
slack.py
4.98 KB
Del
OK
smartos.py
44.83 KB
Del
OK
smtp.py
2.3 KB
Del
OK
snapper.py
7.24 KB
Del
OK
solrcloud.py
4.48 KB
Del
OK
splunk.py
4.32 KB
Del
OK
splunk_search.py
3.17 KB
Del
OK
sqlite3.py
14.7 KB
Del
OK
ssh_auth.py
19.57 KB
Del
OK
ssh_known_hosts.py
7.92 KB
Del
OK
stateconf.py
494 B
Del
OK
status.py
2.21 KB
Del
OK
statuspage.py
17.29 KB
Del
OK
supervisord.py
10.48 KB
Del
OK
svn.py
8.14 KB
Del
OK
sysctl.py
4.11 KB
Del
OK
sysfs.py
2.13 KB
Del
OK
syslog_ng.py
2.97 KB
Del
OK
sysrc.py
2.82 KB
Del
OK
telemetry_alert.py
7.04 KB
Del
OK
test.py
13.09 KB
Del
OK
testinframod.py
1.35 KB
Del
OK
timezone.py
3.42 KB
Del
OK
tls.py
1.81 KB
Del
OK
tomcat.py
9.72 KB
Del
OK
trafficserver.py
8.82 KB
Del
OK
tuned.py
3.32 KB
Del
OK
uptime.py
1.87 KB
Del
OK
user.py
38.63 KB
Del
OK
vagrant.py
11.4 KB
Del
OK
vault.py
3.28 KB
Del
OK
vbox_guest.py
4.05 KB
Del
OK
victorops.py
3.32 KB
Del
OK
virt.py
80.41 KB
Del
OK
virtualenv_mod.py
11.21 KB
Del
OK
webutil.py
3.89 KB
Del
OK
win_certutil.py
4.8 KB
Del
OK
win_dacl.py
7.96 KB
Del
OK
win_dism.py
14.97 KB
Del
OK
win_dns_client.py
8.32 KB
Del
OK
win_firewall.py
6.87 KB
Del
OK
win_iis.py
31.56 KB
Del
OK
win_lgpo.py
24.99 KB
Del
OK
win_lgpo_reg.py
10.96 KB
Del
OK
win_license.py
1.6 KB
Del
OK
win_network.py
14.18 KB
Del
OK
win_path.py
6.39 KB
Del
OK
win_pki.py
5.56 KB
Del
OK
win_powercfg.py
3.79 KB
Del
OK
win_servermanager.py
10.4 KB
Del
OK
win_shortcut.py
7.81 KB
Del
OK
win_smtp_server.py
10.01 KB
Del
OK
win_snmp.py
6.64 KB
Del
OK
win_system.py
13.78 KB
Del
OK
win_wua.py
16.27 KB
Del
OK
win_wusa.py
3.53 KB
Del
OK
winrepo.py
2.74 KB
Del
OK
wordpress.py
4.82 KB
Del
OK
x509.py
27.86 KB
Del
OK
x509_v2.py
64.78 KB
Del
OK
xml.py
1.75 KB
Del
OK
xmpp.py
2.61 KB
Del
OK
zabbix_action.py
9.35 KB
Del
OK
zabbix_host.py
27.25 KB
Del
OK
zabbix_hostgroup.py
5.64 KB
Del
OK
zabbix_mediatype.py
16.89 KB
Del
OK
zabbix_template.py
35.14 KB
Del
OK
zabbix_user.py
17.6 KB
Del
OK
zabbix_usergroup.py
9.64 KB
Del
OK
zabbix_usermacro.py
9.69 KB
Del
OK
zabbix_valuemap.py
8.11 KB
Del
OK
zcbuildout.py
5.16 KB
Del
OK
zenoss.py
2.89 KB
Del
OK
zfs.py
34.48 KB
Del
OK
zk_concurrency.py
5.81 KB
Del
OK
zone.py
46.48 KB
Del
OK
zookeeper.py
11.55 KB
Del
OK
zpool.py
13.4 KB
Del
OK
Edit: pkgrepo.py
""" Management of APT/DNF/YUM/Zypper package repos ============================================== States for managing software package repositories on Linux distros. Supported package managers are APT, DNF, YUM and Zypper. Here is some example SLS: .. code-block:: yaml base: pkgrepo.managed: - humanname: CentOS-$releasever - Base - mirrorlist: http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os - comments: - 'http://mirror.centos.org/centos/$releasever/os/$basearch/' - gpgcheck: 1 - gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 .. code-block:: yaml base: pkgrepo.managed: - humanname: Logstash PPA - name: deb http://ppa.launchpad.net/wolfnet/logstash/ubuntu precise main - dist: precise - file: /etc/apt/sources.list.d/logstash.list - keyid: 28B04E4A - keyserver: keyserver.ubuntu.com - require_in: - pkg: logstash pkg.latest: - name: logstash - refresh: True .. code-block:: yaml base: pkgrepo.managed: - humanname: deb-multimedia - name: deb http://www.deb-multimedia.org stable main - file: /etc/apt/sources.list.d/deb-multimedia.list - key_url: salt://deb-multimedia/files/marillat.pub .. code-block:: yaml base: pkgrepo.managed: - humanname: Google Chrome - name: deb http://dl.google.com/linux/chrome/deb/ stable main - dist: stable - file: /etc/apt/sources.list.d/chrome-browser.list - require_in: - pkg: google-chrome-stable - gpgcheck: 1 - key_url: https://dl-ssl.google.com/linux/linux_signing_key.pub .. code-block:: yaml base: pkgrepo.managed: - ppa: wolfnet/logstash pkg.latest: - name: logstash - refresh: True .. note:: On Ubuntu systems, the ``python-software-properties`` package should be installed for better support of PPA repositories. To check if this package is installed, run ``dpkg -l python-software-properties``. On Ubuntu & Debian systems, the ``python-apt`` package is required to be installed. To check if this package is installed, run ``dpkg -l python-apt``. ``python-apt`` will need to be manually installed if it is not present. .. code-block:: yaml hello-copr: pkgrepo.managed: - copr: mymindstorm/hello pkg.installed: - name: hello apt-key deprecated ------------------ ``apt-key`` is deprecated and will be last available in Debian 11 and Ubuntu 22.04. The recommended way to manage repo keys going forward is to download the keys into /etc/apt/keyrings and use ``signed-by`` in your repo file pointing to the key. This module was updated in version 3005 to implement the recommended approach. You need to add ``- aptkey: False`` to your state and set ``signed-by`` in your repo name, to use this recommended approach. If the cli command ``apt-key`` is not available it will automatically set ``aptkey`` to False. Using ``aptkey: False`` with ``key_url`` example: .. code-block:: yaml deb [signed-by=/etc/apt/keyrings/salt-archive-keyring.gpg arch=amd64] https://repo.saltproject.io/py3/ubuntu/18.04/amd64/latest bionic main: pkgrepo.managed: - file: /etc/apt/sources.list.d/salt.list - key_url: https://repo.saltproject.io/py3/ubuntu/18.04/amd64/latest/salt-archive-keyring.gpg - aptkey: False Using ``aptkey: False`` with ``keyserver`` and ``keyid``: .. code-block:: yaml deb [signed-by=/etc/apt/keyrings/salt-archive-keyring.gpg arch=amd64] https://repo.saltproject.io/py3/ubuntu/18.04/amd64/latest bionic main: pkgrepo.managed: - file: /etc/apt/sources.list.d/salt.list - keyserver: keyserver.ubuntu.com - keyid: 0E08A149DE57BFBE - aptkey: False """ import sys import salt.utils.data import salt.utils.files import salt.utils.pkg.deb import salt.utils.pkg.rpm import salt.utils.versions from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.state import STATE_INTERNAL_KEYWORDS as _STATE_INTERNAL_KEYWORDS def __virtual__(): """ Only load if modifying repos is available for this package type """ return "pkg.mod_repo" in __salt__ def managed(name, ppa=None, copr=None, aptkey=True, **kwargs): """ This state manages software package repositories. Currently, :mod:`yum <salt.modules.yumpkg>`, :mod:`apt <salt.modules.aptpkg>`, and :mod:`zypper <salt.modules.zypperpkg>` repositories are supported. **YUM/DNF/ZYPPER-BASED SYSTEMS** .. note:: One of ``baseurl`` or ``mirrorlist`` below is required. Additionally, note that this state is not presently capable of managing more than one repo in a single repo file, so each instance of this state will manage a single repo file containing the configuration for a single repo. name This value will be used in two ways: Firstly, it will be the repo ID, as seen in the entry in square brackets (e.g. ``[foo]``) for a given repo. Secondly, it will be the name of the file as stored in /etc/yum.repos.d (e.g. ``/etc/yum.repos.d/foo.conf``). enabled : True Whether the repo is enabled or not. Can be specified as ``True``/``False`` or ``1``/``0``. disabled : False Included to reduce confusion due to APT's use of the ``disabled`` argument. If this is passed for a YUM/DNF/Zypper-based distro, then the reverse will be passed as ``enabled``. For example passing ``disabled=True`` will assume ``enabled=False``. copr Fedora and RedHat based distributions only. Use community packages outside of the main package repository. .. versionadded:: 3002 humanname This is used as the ``name`` value in the repo file in ``/etc/yum.repos.d/`` (or ``/etc/zypp/repos.d`` for SUSE distros). baseurl The URL to a yum repository mirrorlist A URL which points to a file containing a collection of baseurls comments Sometimes you want to supply additional information, but not as enabled configuration. Anything supplied for this list will be saved in the repo configuration with a comment marker (#) in front. gpgautoimport Only valid for Zypper package manager. If set to ``True``, automatically trust and import the new repository signing key. The key should be specified with ``gpgkey`` parameter. See details below. Additional configuration values seen in YUM/DNF/Zypper repo files, such as ``gpgkey`` or ``gpgcheck``, will be used directly as key-value pairs. For example: .. code-block:: yaml foo: pkgrepo.managed: - humanname: Personal repo for foo - baseurl: https://mydomain.tld/repo/foo/$releasever/$basearch - gpgkey: file:///etc/pki/rpm-gpg/foo-signing-key - gpgcheck: 1 **APT-BASED SYSTEMS** ppa On Ubuntu, you can take advantage of Personal Package Archives on Launchpad simply by specifying the user and archive name. The keyid will be queried from launchpad and everything else is set automatically. You can override any of the below settings by simply setting them as you would normally. For example: .. code-block:: yaml logstash-ppa: pkgrepo.managed: - ppa: wolfnet/logstash ppa_auth For Ubuntu PPAs there can be private PPAs that require authentication to access. For these PPAs the username/password can be passed as an HTTP Basic style username/password combination. .. code-block:: yaml logstash-ppa: pkgrepo.managed: - ppa: wolfnet/logstash - ppa_auth: username:password name On apt-based systems this must be the complete entry as it would be seen in the ``sources.list`` file. This can have a limited subset of components (e.g. ``main``) which can be added/modified with the ``comps`` option. .. code-block:: yaml precise-repo: pkgrepo.managed: - name: deb http://us.archive.ubuntu.com/ubuntu precise main .. note:: The above example is intended as a more readable way of configuring the SLS, it is equivalent to the following: .. code-block:: yaml 'deb http://us.archive.ubuntu.com/ubuntu precise main': pkgrepo.managed disabled : False Toggles whether or not the repo is used for resolving dependencies and/or installing packages. enabled : True Included to reduce confusion due to YUM/DNF/Zypper's use of the ``enabled`` argument. If this is passed for an APT-based distro, then the reverse will be passed as ``disabled``. For example, passing ``enabled=False`` will assume ``disabled=False``. architectures On apt-based systems, ``architectures`` can restrict the available architectures that the repository provides (e.g. only ``amd64``). ``architectures`` should be a comma-separated list. comps On apt-based systems, comps dictate the types of packages to be installed from the repository (e.g. ``main``, ``nonfree``, ...). For purposes of this, ``comps`` should be a comma-separated list. file The filename for the ``*.list`` that the repository is configured in. It is important to include the full-path AND make sure it is in a directory that APT will look in when handling packages dist This dictates the release of the distro the packages should be built for. (e.g. ``unstable``). This option is rarely needed. keyid The KeyID or a list of KeyIDs of the GPG key to install. This option also requires the ``keyserver`` option to be set. keyserver This is the name of the keyserver to retrieve GPG keys from. The ``keyid`` option must also be set for this option to work. key_url URL to retrieve a GPG key from. Allows the usage of ``https://`` as well as ``salt://``. If ``allow_insecure_key`` is True, this also allows ``http://``. .. note:: Use either ``keyid``/``keyserver`` or ``key_url``, but not both. key_text The string representation of the GPG key to install. .. versionadded:: 2018.3.0 .. note:: Use either ``keyid``/``keyserver``, ``key_url``, or ``key_text`` but not more than one method. consolidate : False If set to ``True``, this will consolidate all sources definitions to the ``sources.list`` file, cleanup the now unused files, consolidate components (e.g. ``main``) for the same URI, type, and architecture to a single line, and finally remove comments from the ``sources.list`` file. The consolidation will run every time the state is processed. The option only needs to be set on one repo managed by Salt to take effect. clean_file : False If set to ``True``, empty the file before configuring the defined repository .. note:: Use with care. This can be dangerous if multiple sources are configured in the same file. .. versionadded:: 2015.8.0 refresh : True If set to ``False`` this will skip refreshing the apt package database on Debian based systems. refresh_db : True .. deprecated:: 2018.3.0 Use ``refresh`` instead. require_in Set this to a list of :mod:`pkg.installed <salt.states.pkg.installed>` or :mod:`pkg.latest <salt.states.pkg.latest>` to trigger the running of ``apt-get update`` prior to attempting to install these packages. Setting a require in the pkg state will not work for this. aptkey: Use the binary apt-key. If the command ``apt-key`` is not found in the path, aptkey will be False, regardless of what is passed into this argument. allow_insecure_key : True Whether to allow an insecure (e.g. http vs. https) key_url. .. versionadded:: 3006.0 """ if not salt.utils.path.which("apt-key"): aptkey = False ret = {"name": name, "changes": {}, "result": None, "comment": ""} if "pkg.get_repo" not in __salt__: ret["result"] = False ret["comment"] = "Repo management not implemented on this platform" return ret if "key_url" in kwargs and ("keyid" in kwargs or "keyserver" in kwargs): ret["result"] = False ret[ "comment" ] = 'You may not use both "keyid"/"keyserver" and "key_url" argument.' if "key_text" in kwargs and ("keyid" in kwargs or "keyserver" in kwargs): ret["result"] = False ret[ "comment" ] = 'You may not use both "keyid"/"keyserver" and "key_text" argument.' if "key_text" in kwargs and ("key_url" in kwargs): ret["result"] = False ret["comment"] = 'You may not use both "key_url" and "key_text" argument.' if "repo" in kwargs: ret["result"] = False ret["comment"] = ( "'repo' is not a supported argument for this " "state. The 'name' argument is probably what was " "intended." ) return ret enabled = kwargs.pop("enabled", None) disabled = kwargs.pop("disabled", None) if enabled is not None and disabled is not None: ret["result"] = False ret["comment"] = "Only one of enabled/disabled is allowed" return ret elif enabled is None and disabled is None: # If neither argument was passed we assume the repo will be enabled enabled = True # To be changed in version 3008: default to False and still log a warning allow_insecure_key = kwargs.pop("allow_insecure_key", True) key_is_insecure = kwargs.get("key_url", "").strip().startswith("http:") if key_is_insecure: if allow_insecure_key: salt.utils.versions.warn_until( 3008, "allow_insecure_key will default to False starting in salt 3008.", ) else: ret["result"] = False ret[ "comment" ] = "Cannot have 'key_url' using http with 'allow_insecure_key' set to True" return ret repo = name if __grains__["os"] in ("Ubuntu", "Mint"): if ppa is not None: # overload the name/repo value for PPAs cleanly # this allows us to have one code-path for PPAs try: repo = ":".join(("ppa", ppa)) except TypeError: repo = ":".join(("ppa", str(ppa))) kwargs["disabled"] = ( not salt.utils.data.is_true(enabled) if enabled is not None else salt.utils.data.is_true(disabled) ) elif __grains__["os_family"] in ("RedHat", "Suse"): if __grains__["os_family"] in "RedHat": if copr is not None: repo = ":".join(("copr", copr)) kwargs["name"] = name if "humanname" in kwargs: kwargs["name"] = kwargs.pop("humanname") if "name" not in kwargs: # Fall back to the repo name if humanname not provided kwargs["name"] = repo kwargs["enabled"] = ( not salt.utils.data.is_true(disabled) if disabled is not None else salt.utils.data.is_true(enabled) ) elif __grains__["os_family"] in ("NILinuxRT", "Poky"): # opkg is the pkg virtual kwargs["enabled"] = ( not salt.utils.data.is_true(disabled) if disabled is not None else salt.utils.data.is_true(enabled) ) for kwarg in _STATE_INTERNAL_KEYWORDS: kwargs.pop(kwarg, None) try: pre = __salt__["pkg.get_repo"](repo=repo, **kwargs) except CommandExecutionError as exc: ret["result"] = False ret["comment"] = "Failed to examine repo '{}': {}".format(name, exc) return ret # This is because of how apt-sources works. This pushes distro logic # out of the state itself and into a module that it makes more sense # to use. Most package providers will simply return the data provided # it doesn't require any "specialized" data massaging. if __grains__.get("os_family") == "Debian": from salt.modules.aptpkg import _expand_repo_def os_name = __grains__["os"] os_codename = __grains__["oscodename"] sanitizedkwargs = _expand_repo_def( os_name=os_name, os_codename=os_codename, repo=repo, **kwargs ) else: sanitizedkwargs = kwargs if pre: # 22412: Remove file attribute in case same repo is set up multiple times but with different files pre.pop("file", None) sanitizedkwargs.pop("file", None) for kwarg in sanitizedkwargs: if kwarg not in pre: if kwarg == "enabled": # On a RedHat-based OS, 'enabled' is assumed to be true if # not explicitly set, so we don't need to update the repo # if it's desired to be enabled and the 'enabled' key is # missing from the repo definition if __grains__["os_family"] == "RedHat": if not salt.utils.data.is_true(sanitizedkwargs[kwarg]): break else: break else: break elif kwarg in ("comps", "key_url"): if sorted(sanitizedkwargs[kwarg]) != sorted(pre[kwarg]): break elif kwarg == "line" and __grains__["os_family"] == "Debian": if not sanitizedkwargs["disabled"]: # split the line and sort everything after the URL sanitizedsplit = sanitizedkwargs[kwarg].split() sanitizedsplit[3:] = sorted(sanitizedsplit[3:]) reposplit, _, pre_comments = ( x.strip() for x in pre[kwarg].partition("#") ) reposplit = reposplit.split() reposplit[3:] = sorted(reposplit[3:]) if sanitizedsplit != reposplit: break if "comments" in kwargs: post_comments = salt.utils.pkg.deb.combine_comments( kwargs["comments"] ) if pre_comments != post_comments: break elif kwarg == "comments" and __grains__["os_family"] == "RedHat": precomments = salt.utils.pkg.rpm.combine_comments(pre[kwarg]) kwargcomments = salt.utils.pkg.rpm.combine_comments( sanitizedkwargs[kwarg] ) if precomments != kwargcomments: break elif kwarg == "architectures" and sanitizedkwargs[kwarg]: if set(sanitizedkwargs[kwarg]) != set(pre[kwarg]): break else: if __grains__["os_family"] in ("RedHat", "Suse") and any( isinstance(x, bool) for x in (sanitizedkwargs[kwarg], pre[kwarg]) ): # This check disambiguates 1/0 from True/False if salt.utils.data.is_true( sanitizedkwargs[kwarg] ) != salt.utils.data.is_true(pre[kwarg]): break else: if str(sanitizedkwargs[kwarg]) != str(pre[kwarg]): break else: ret["result"] = True ret["comment"] = "Package repo '{}' already configured".format(name) return ret if __opts__["test"]: ret["comment"] = ( "Package repo '{}' would be configured. This may cause pkg " "states to behave differently than stated if this action is " "repeated without test=True, due to the differences in the " "configured repositories.".format(name) ) if pre: for kwarg in sanitizedkwargs: if sanitizedkwargs.get(kwarg) != pre.get(kwarg): ret["changes"][kwarg] = { "new": sanitizedkwargs.get(kwarg), "old": pre.get(kwarg), } else: ret["changes"]["repo"] = name return ret # empty file before configure if kwargs.get("clean_file", False): with salt.utils.files.fopen(kwargs["file"], "w"): pass try: if __grains__["os_family"] == "Debian": __salt__["pkg.mod_repo"](repo, saltenv=__env__, aptkey=aptkey, **kwargs) else: __salt__["pkg.mod_repo"](repo, **kwargs) except Exception as exc: # pylint: disable=broad-except # This is another way to pass information back from the mod_repo # function. ret["result"] = False ret["comment"] = "Failed to configure repo '{}': {}".format(name, exc) return ret try: post = __salt__["pkg.get_repo"](repo=repo, **kwargs) if pre: for kwarg in sanitizedkwargs: if post.get(kwarg) != pre.get(kwarg): ret["changes"][kwarg] = { "new": post.get(kwarg), "old": pre.get(kwarg), } else: ret["changes"] = {"repo": repo} ret["result"] = True ret["comment"] = "Configured package repo '{}'".format(name) except Exception as exc: # pylint: disable=broad-except ret["result"] = False ret["comment"] = "Failed to confirm config of repo '{}': {}".format(name, exc) # Clear cache of available packages, if present, since changes to the # repositories may change the packages that are available. if ret["changes"]: sys.modules[__salt__["test.ping"].__module__].__context__.pop( "pkg._avail", None ) return ret def absent(name, **kwargs): """ This function deletes the specified repo on the system, if it exists. It is essentially a wrapper around :mod:`pkg.del_repo <salt.modules.pkg.del_repo>`. name The name of the package repo, as it would be referred to when running the regular package manager commands. .. note:: On apt-based systems this must be the complete source entry. For example, if you include ``[arch=amd64]``, and a repo matching the specified URI, dist, etc. exists _without_ an architecture, then no changes will be made and the state will report a ``True`` result. **FEDORA/REDHAT-SPECIFIC OPTIONS** copr Use community packages outside of the main package repository. .. versionadded:: 3002 .. code-block:: yaml hello-copr: pkgrepo.absent: - copr: mymindstorm/hello **UBUNTU-SPECIFIC OPTIONS** ppa On Ubuntu, you can take advantage of Personal Package Archives on Launchpad simply by specifying the user and archive name. .. code-block:: yaml logstash-ppa: pkgrepo.absent: - ppa: wolfnet/logstash ppa_auth For Ubuntu PPAs there can be private PPAs that require authentication to access. For these PPAs the username/password can be specified. This is required for matching if the name format uses the ``ppa:`` specifier and is private (requires username/password to access, which is encoded in the URI). .. code-block:: yaml logstash-ppa: pkgrepo.absent: - ppa: wolfnet/logstash - ppa_auth: username:password keyid If passed, then the GPG key corresponding to the passed KeyID will also be removed. keyid_ppa : False If set to ``True``, the GPG key's ID will be looked up from ppa.launchpad.net and removed, and the ``keyid`` argument will be ignored. .. note:: This option will be disregarded unless the ``ppa`` argument is present. """ ret = {"name": name, "changes": {}, "result": None, "comment": ""} if "ppa" in kwargs and __grains__["os"] in ("Ubuntu", "Mint"): name = kwargs.pop("ppa") if not name.startswith("ppa:"): name = "ppa:" + name if "copr" in kwargs and __grains__["os_family"] in "RedHat": name = kwargs.pop("copr") if not name.startswith("copr:"): name = "copr:" + name remove_key = any(kwargs.get(x) is not None for x in ("keyid", "keyid_ppa")) if remove_key and "pkg.del_repo_key" not in __salt__: ret["result"] = False ret["comment"] = "Repo key management is not implemented for this platform" return ret if __grains__["os_family"] == "Debian": stripname = salt.utils.pkg.deb.strip_uri(name) else: stripname = name try: repo = __salt__["pkg.get_repo"](stripname, **kwargs) except CommandExecutionError as exc: ret["result"] = False ret["comment"] = "Failed to configure repo '{}': {}".format(name, exc) return ret if repo and ( __grains__["os_family"].lower() == "debian" or __opts__.get("providers", {}).get("pkg") == "aptpkg" ): # On Debian/Ubuntu, pkg.get_repo will return a match for the repo # even if the architectures do not match. However, changing get_repo # breaks idempotency for pkgrepo.managed states. So, compare the # architectures of the matched repo to the architectures specified in # the repo string passed to this state. If the architectures do not # match, then invalidate the match by setting repo to an empty dict. from salt.modules.aptpkg import _split_repo_str if set(_split_repo_str(stripname)["architectures"]) != set( repo["architectures"] ): repo = {} if not repo: ret["comment"] = "Package repo {} is absent".format(name) ret["result"] = True return ret if __opts__["test"]: ret["comment"] = ( "Package repo '{}' will be removed. This may " "cause pkg states to behave differently than stated " "if this action is repeated without test=True, due " "to the differences in the configured repositories.".format(name) ) return ret try: __salt__["pkg.del_repo"](repo=stripname, **kwargs) except (CommandExecutionError, SaltInvocationError) as exc: ret["result"] = False ret["comment"] = exc.strerror return ret repos = __salt__["pkg.list_repos"]() if stripname not in repos: ret["changes"]["repo"] = name ret["comment"] = "Removed repo {}".format(name) if not remove_key: ret["result"] = True else: try: removed_keyid = __salt__["pkg.del_repo_key"](stripname, **kwargs) except (CommandExecutionError, SaltInvocationError) as exc: ret["result"] = False ret["comment"] += ", but failed to remove key: {}".format(exc) else: ret["result"] = True ret["changes"]["keyid"] = removed_keyid ret["comment"] += ", and keyid {}".format(removed_keyid) else: ret["result"] = False ret["comment"] = "Failed to remove repo {}".format(name) return ret
Save