|
- {%- from "linux/map.jinja" import system with context %}
- {%- if system.enabled %}
-
- {% if system.pkgs %}
- linux_repo_prereq_pkgs:
- pkg.installed:
- - pkgs: {{ system.pkgs | json }}
- {%- endif %}
-
- # global proxy setup
- {%- if grains.os_family == 'Debian' %}
- {%- if system.proxy.get('pkg', {}).get('enabled', False) %}
- /etc/apt/apt.conf.d/99proxies-salt:
- file.managed:
- - template: jinja
- - source: salt://linux/files/apt.conf.d_proxies
- - defaults:
- external_host: False
- https: {{ system.proxy.get('pkg', {}).get('https', None) | default(system.proxy.get('https', None), true) }}
- http: {{ system.proxy.get('pkg', {}).get('http', None) | default(system.proxy.get('http', None), true) }}
- ftp: {{ system.proxy.get('pkg', {}).get('ftp', None) | default(system.proxy.get('ftp', None), true) }}
- {%- else %}
- /etc/apt/apt.conf.d/99proxies-salt:
- file.absent
- {%- endif %}
- {%- else %}
- # Implement grobal proxy configiration for non-debian OS.
- {%- endif %}
-
- {% set default_repos = {} %}
-
- {%- if system.purge_repos|default(False) %}
- purge_sources_list_d_repos:
- file.directory:
- - name: /etc/apt/sources.list.d/
- - clean: True
- {%- endif %}
-
- {%- for name, repo in system.repo.items() | sort %}
- {%- set name=repo.get('name', name) %}
- {%- if grains.os_family == 'Debian' %}
-
- # per repository proxy setup
- {%- if repo.get('proxy', {}).get('enabled', False) %}
- {%- set external_host = repo.proxy.get('host', None) or repo.source.split('/')[2] %}
- /etc/apt/apt.conf.d/99proxies-salt-{{ name }}:
- file.managed:
- - template: jinja
- - source: salt://linux/files/apt.conf.d_proxies
- - defaults:
- external_host: {{ external_host }}
- https: {{ repo.proxy.get('https', None) or system.proxy.get('pkg', {}).get('https', None) | default(system.proxy.get('https', None), True) }}
- http: {{ repo.proxy.get('http', None) or system.proxy.get('pkg', {}).get('http', None) | default(system.proxy.get('http', None), True) }}
- ftp: {{ repo.proxy.get('ftp', None) or system.proxy.get('pkg', {}).get('ftp', None) | default(system.proxy.get('ftp', None), True) }}
- {%- else %}
- /etc/apt/apt.conf.d/99proxies-salt-{{ name }}:
- file.absent
- {%- endif %}
-
- {%- if repo.pin is defined or repo.pinning is defined %}
- linux_repo_{{ name }}_pin:
- file.managed:
- - name: /etc/apt/preferences.d/{{ name }}
- - source: salt://linux/files/preferences_repo
- - template: jinja
- - defaults:
- repo_name: {{ name }}
- {%- else %}
- linux_repo_{{ name }}_pin:
- file.absent:
- - name: /etc/apt/preferences.d/{{ name }}
- {%- endif %}
-
- {%- if repo.get('key') %}
- linux_repo_{{ name }}_key:
- {% set repo_key = salt['hashutil.base64_b64encode'](repo.key) %}
- cmd.run:
- - name: "echo '{{ repo_key }}' | base64 -d | apt-key add -"
- - require_in:
- {%- if repo.get('default', False) %}
- - file: default_repo_list
- {% else %}
- - pkgrepo: linux_repo_{{ name }}
- {% endif %}
-
- {# key_url fetch by curl when salt <2017.7, higher version of salt has
- fixed bug for using a proxy_host/port specified at minion.conf
-
- NOTE: curl/cmd.run usage to fetch gpg key has limited functionality behind proxy.
- Environments with salt >= 2017.7 should use key_url specified at
- pkgrepo.manage state (which uses properly configured http_host at
- minion.conf). Older versions of salt require to have proxy set at
- ENV and curl way to fetch gpg key here can have a sense for backward
- compatibility. Be aware that as of salt 2018.3 no_proxy option is
- not implemented at all.
- #}
- {%- elif repo.key_url|default(False) and grains['saltversioninfo'] < [2017, 7] and not repo.key_url.startswith('salt://') %}
- linux_repo_{{ name }}_key:
- cmd.run:
- - name: "curl -sL {{ repo.key_url }} | apt-key add -"
- - require_in:
- {%- if repo.get('default', False) %}
- - file: default_repo_list
- {% else %}
- - pkgrepo: linux_repo_{{ name }}
- {% endif %}
- {%- endif %}
-
- {%- if repo.get('default', False) %}
- {%- do default_repos.update({name: repo}) %}
- {%- else %}
-
- {%- if repo.get('enabled', True) %}
- linux_repo_{{ name }}:
- pkgrepo.managed:
- - refresh_db: False
- - require_in:
- - refresh_db
- {%- if repo.ppa is defined %}
- - ppa: {{ repo.ppa }}
- {%- else %}
- - humanname: {{ name }}
- - name: {{ repo.source }}
- {%- if repo.architectures is defined %}
- - architectures: {{ repo.architectures }}
- {%- endif %}
- - file: /etc/apt/sources.list.d/{{ name }}.list
- - clean_file: {{ repo.get('clean_file', True) }}
- {%- if repo.key_id is defined %}
- - keyid: {{ repo.key_id }}
- {%- endif %}
- {%- if repo.key_server is defined %}
- - keyserver: {{ repo.key_server }}
- {%- endif %}
- {%- if repo.key_url is defined and (grains['saltversioninfo'] >= [2017, 7] or repo.key_url.startswith('salt://')) %}
- - key_url: {{ repo.key_url }}
- {%- endif %}
- {#
- Disable apt-key usage when salt version is at least 3005, and the user provides
- 'signed-by=' in their source, and we're on a newer version of Debian or Ubuntu.
- apt-key is deprecated, see the following for more context:
- https://docs.saltproject.io/en/latest/ref/states/all/salt.states.pkgrepo.html#apt-key-deprecated
- #}
- {%- if grains['saltversioninfo'] >= [3005, 0] and
- 'signed-by=' in repo.source and
- (
- (grains['os'] == 'Debian' and grains['osrelease_info'] >= (11,)) or
- (grains['os'] == 'Ubuntu' and grains['osrelease_info'] >= (22, 4))
- )
- %}
- - aptkey: False
- {%- endif %}
- - consolidate: {{ repo.get('consolidate', False) }}
- - require:
- - file: /etc/apt/apt.conf.d/99proxies-salt-{{ name }}
- - file: /etc/apt/apt.conf.d/99proxies-salt
- {%- if system.purge_repos|default(False) %}
- - file: purge_sources_list_d_repos
- {%- endif %}
- {%- endif %}
- {%- else %}
- linux_repo_{{ name }}:
- pkgrepo.absent:
- - refresh_db: False
- - require:
- - file: /etc/apt/apt.conf.d/99proxies-salt-{{ name }}
- - require_in:
- - refresh_db
- {%- if repo.ppa is defined %}
- - ppa: {{ repo.ppa }}
- {%- if repo.key_id is defined %}
- - keyid_ppa: {{ repo.keyid_ppa }}
- {%- endif %}
- {%- else %}
- - file: /etc/apt/sources.list.d/{{ name }}.list
- {%- if repo.key_id is defined %}
- - keyid: {{ repo.key_id }}
- {%- endif %}
- {%- endif %}
- {%- endif %}
- {%- endif %}
- {%- endif %}
-
- {%- if grains.os_family == "RedHat" %}
-
- {%- if repo.get('enabled', True) %}
- {%- if repo.get('proxy', {}).get('enabled', False) %}
- # PLACEHOLDER
- # TODO, implement per proxy configuration for Yum
- {%- endif %}
-
- {%- if not repo.get('default', False) %}
- linux_repo_{{ name }}:
- pkgrepo.managed:
- - refresh_db: False
- - require_in:
- - refresh_db
- - name: {{ name }}
- - humanname: {{ repo.get('humanname', name) }}
- {%- if repo.mirrorlist is defined %}
- - mirrorlist: {{ repo.mirrorlist }}
- {%- else %}
- - baseurl: {{ repo.source }}
- {%- endif %}
- - gpgcheck: {% if repo.get('gpgcheck', False) %}1{% else %}0{% endif %}
- {%- if repo.gpgkey is defined %}
- - gpgkey: {{ repo.gpgkey }}
- {%- endif %}
- {%- endif %}
- {%- else %}
- pkgrepo.absent:
- - refresh_db: False
- - require_in:
- - refresh_db
- - name: {{ repo.source }}
- {%- endif %}
- {%- endif %}
- {%- endfor %}
-
- {%- if default_repos|length > 0 and grains.os_family == 'Debian' %}
-
- default_repo_list:
- file.managed:
- - name: /etc/apt/sources.list
- - source: salt://linux/files/sources.list
- - template: jinja
- - user: root
- - group: root
- - mode: 0644
- {%- if system.purge_repos|default(False) %}
- - replace: True
- {%- endif %}
- - defaults:
- default_repos: {{ default_repos }}
-
- {%- endif %}
-
- refresh_db:
- {%- if system.get('refresh_repos_meta', True) %}
- module.run:
- {%- if 'module.run' in salt['config.get']('use_superseded', default=[]) %}
- - pkg.refresh_db: []
- {%- else %}
- - name: pkg.refresh_db
- {% endif %}
- {%- else %}
- test.succeed_without_changes
- {%- endif %}
-
- {%- endif %}
|