## Install and configure samba-ldap.
---
- name: check if samba is already there
  stat: path=/etc/ldap/schema/samba.ldif
  register: samba_ldap

- name: install samba and provide samba schema
  apt:
    name:
      - samba
      - sssd-ldap
    state: latest # noqa package-latest

- name: provide identities from LDAP
  template:
    src: sssd.conf.j2
    dest: /etc/sssd/sssd.conf
    mode: 0600
  notify: restart sssd

- name: prepare samba schema
  command: cp /usr/share/doc/samba/examples/LDAP/samba.ldif /etc/ldap/schema/
  args:
    creates: /etc/ldap/schema/samba.ldif

- name: activate samba.ldif schema
  command: ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/samba.ldif
  when: not samba_ldap.stat.exists

- name: add indexes to LDAP
  ldap_attrs:
    dn: "olcDatabase={1}mdb,cn=config"
    attributes:
      olcDbIndex:
        - sambaSID eq
        - sambaPrimaryGroupSID eq
        - sambaGroupType eq
        - sambaSIDList eq
        - sambaDomainName eq
    state: present

- name: modify ACLs to account for Samba
  ldap_attrs:
    dn: "olcDatabase={1}mdb,cn=config"
    attributes:
      olcAccess:
        - >-
          to attrs=userPassword
          by self write
          by anonymous auth
          by * none
        - >-
          to attrs=shadowLastChange
          by self write
          by * read
        - >-
          to attrs=sambaNTPassword
          by dn.exact=cn=admin,{{ basedn }} write
          by self write
          by * none
        - >-
          to * by * read
    ordered: true
    state: exact

- name: configure smb ldap backend
  blockinfile:
    dest: /etc/samba/smb.conf
    insertafter: '^\s*server role ='
    block: |
      ####### LDAP Settings #######
      passdb backend = ldapsam:ldapi:///
      ldap suffix = {{ basedn }}
      ldap user suffix = ou=people
      ldap group suffix = ou=groups
      ldap machine suffix = ou=computers
      ldap idmap suffix = ou=idmap
      ldap admin dn = cn=admin,{{ basedn }}
      ldap ssl = no
      ldap passwd sync = yes
  notify: restart smbd

- name: make smb homes writable
  replace:
    path: /etc/samba/smb.conf
    regexp: '^(\s*read only =) yes$'
    replace: '\1 no'
    after: '\[homes\]'
    before: '\[.+\]'
  notify: restart smbd

- name: modify samba default create mask
  replace:
    path: /etc/samba/smb.conf
    regexp: '^(\s*create mask =) 0700'
    replace: '\1 0600'
    after: '\[homes\]'
    before: '\[.+\]'
  notify: restart smbd

- name: slurp admin password for samba setup
  slurp:
    src: "{{ ldap_admin_pwd_file }}"
  register: ldap_admin_pwd
  no_log: true
  when: not samba_ldap.stat.exists

- name: make samba admin password available to smbd
  command: smbpasswd -w "{{ ldap_admin_pwd['content'] | b64decode | replace('\n', '') }}"
  no_log: true
  notify: restart smbd
  when: not samba_ldap.stat.exists

- name: flush all handlers
  meta: flush_handlers

- name: add samba attributes to dummy user foo
  command:
    cmd: smbpasswd -s -a foo
    stdin: "{{ foo_pwd }}\n{{ foo_pwd }}"
  when: foo_pwd is defined and foo_pwd | length > 0

########################

- name: allow services in firewalld
  firewalld:
    zone: internal
    service: "{{ item }}"
    permanent: true
    immediate: true
    state: enabled
  with_items:
    - samba
