- name: Include distribution specific variables
  include_vars: "{{ lookup('first_found', search) }}"
  vars:
    search:
      files:
        - '{{ ansible_distribution | lower }}.yml'
        - '{{ ansible_os_family | lower }}.yml'
        - '{{ ansible_system | lower }}.yml'
        - default.yml
      paths:
        - vars

- name: install cron package
  package:
    name: '{{ cron_pkg }}'
  when: cron_pkg | default(false, true)
  register: cron_package_installed
  until: cron_package_installed is success

- when: faketime_pkg | default(false, true)
  block:
    - name: install faketime packages
      package:
        name: '{{ faketime_pkg }}'
      register: faketime_package_installed
      until: faketime_package_installed is success
      when: ansible_distribution != 'Alpine'

    - name: install faketime packages - Alpine
      # NOTE: The `faketime` package is currently only available in the
      # NOTE: `edge` branch.
      # FIXME: If it ever becomes available in the `main` repository for
      # FIXME: currently tested Alpine versions, the `--repository=...`
      # FIXME: option can be dropped.
      command: apk add -U {{ faketime_pkg }} --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing
      when: ansible_distribution == 'Alpine'

    - name: Find libfaketime path
      shell: '{{ list_pkg_files }} {{ faketime_pkg }} | grep -F libfaketime.so.1'
      register: libfaketime_path
      when: list_pkg_files is defined

    - when: ansible_service_mgr == 'systemd'
      block:
        - name: create directory for cron drop-in file
          file:
            path: '/etc/systemd/system/{{ cron_service }}.service.d'
            state: directory
            owner: root
            group: root
            mode: 0755

        - name: Use faketime with cron service
          copy:
            content: |-
              [Service]
              Environment=LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }}
              Environment="FAKETIME=+0y x10"
              Environment=RANDOM_DELAY=0
            dest: '/etc/systemd/system/{{ cron_service }}.service.d/faketime.conf'
            owner: root
            group: root
            mode: 0644

    - when: ansible_system == 'FreeBSD'
      name: Use faketime with cron service
      copy:
        content: |-
          cron_env='LD_PRELOAD={{ libfaketime_path.stdout_lines[0].strip() }} FAKETIME="+0y x10"'
        dest: '/etc/rc.conf.d/cron'
        owner: root
        group: wheel
        mode: 0644

- name: enable cron service
  service:
    daemon-reload: "{{ (ansible_service_mgr == 'systemd') | ternary(true, omit) }}"
    name: '{{ cron_service }}'
    state: restarted
  when: ansible_distribution != 'Alpine'

- name: enable cron service - Alpine
  command: nohup crond
  environment:
    FAKETIME: "+0y x10"
    LD_PRELOAD: "/usr/lib/faketime/libfaketime.so.1"
  when: ansible_distribution == 'Alpine'

- name: See if /etc/pam.d/crond exists
  stat:
    path: /etc/pam.d/crond
  register: pamd

# https://github.com/lxc/lxc/issues/661#issuecomment-222444916
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726661
- name: Work around containers not being able to write to /proc/self/loginuid
  command: sed -i '/pam_loginuid\.so$/ s/required/optional/' /etc/pam.d/crond
  when:
    - pamd.stat.exists
