---
# Nanominer from nanopool.org
# Good documentation that might help with how to do variables.
# https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html

## Installation ##

- name: Miner | Software | Nanominer | Installation | Create Home
  shell: "mkdir -p {{ nanominer_home }}"
  become_user: mfn

- name: Miner | Software | Nanominer | Installation | Download Tarball
  shell: "scp {{ file_server }}:{{ nanominer_tar_remote }} {{ nanominer_tar_local }}; chown mfn {{ nanominer_tar_local }}"

- name: Miner | Software | Nanominer | Installation | Extract Tarball
  shell: "tar -xvf {{ nanominer_tar_local }}"
  args:
    chdir: "{{ nanominer_home }}"
  become_user: mfn



## Configuration ##

# Delete Old Config #

- name: Miner | Software | Nanominer | Configuration | Reset
  shell: "mv {{ nanominer_config }} ~/TRASH/"
  ignore_errors: yes

# CPU #

- name: Miner | Software | Nanominer | Configuration | CPU | Header Info
  blockinfile:
    path: "{{ nanominer_config }}"
    block: |
      [{{ item.algorithm }}]
      wallet = {{ item.wallet }}
      watchdog = true
      rigName = {{ ansible_hostname }}
      logpath = {{ nanominer_logs }}
      ;webPassword = {{ ansible_hostname }}
      webPort = 8080
      useSSL = true
      email = me@hyperling.com
      sortPools = true
    marker: ';{mark} MANAGED BY ANSIBLE - CPU Headers'
    marker_begin: ';;;;;;;;;;;; BEGIN'
    marker_end: ' END'
    state: "{{ item.state }}"
    create: yes
  loop:
    - { "algorithm": "RandomX", "wallet": '{{ wallet_xmr }}', "state": "{{ (nanominer_cpu == 'xmr') | ternary('present', 'absent') }}"}
  become_user: mfn
  when: nanominer_cpu != false

- name: Miner | Software | Nanominer | Configuration | CPU | Add Pools
  lineinfile:
    path: "{{ nanominer_config }}"
    line: "pool{{item.priority}} = {{ item.name }}"
    state: present
    create: no
  loop: "{{ cpu_pool }}"
  become_user: mfn
  when: nanominer_cpu != false

- name: Miner | Software | Nanominer | Configuration | CPU | End Section
  lineinfile:
    path: "{{ nanominer_config }}"
    line: ";;;;;;;;;;;;; END CPU"
    state: present
    create: no
  become_user: mfn
  when: nanominer_cpu != false

# Add Spacing #

- name: Miner | Software | Nanominer | Configuration | Spacing
  blockinfile:
    path: "{{ nanominer_config }}"
    block: |
      ;
      ;
      ;
    marker: ';'
    state: present
    create: no
  become_user: mfn
  when: nanominer_config is file

# GPU #

- name: Miner | Software | Nanominer | Configuration | GPU | Header Info
  blockinfile:
    path: "{{ nanominer_config }}"
    block: |
      [{{ item.algorithm }}]
      wallet = {{ item.wallet }}
      watchdog = true
      rigName = {{ ansible_hostname }}
      logpath = {{ nanominer_logs }}
      ;webPassword = {{ ansible_hostname }}
      webPort = 8080
      devices = {{ nanominer_gpus }}
      useSSL = true
      email = me@hyperling.com
      sortPools = true
      memTweak = 0
      minHashrate = {{ eth_minhashrate }}
      restarts = 0
      maxRejectedShares = 1
    marker: ';{mark} MANAGED BY ANSIBLE - GPU Headers'
    marker_begin: ';;;;;;;;;;;; BEGIN'
    marker_end: ' END'
    state: "{{ item.state }}"
    create: yes
  loop:
    - { "algorithm": "Ethash", "wallet": '{{ wallet_eth }}', "state": "{{ (nanominer_gpu == 'eth') | ternary('present', 'absent') }}"}
  become_user: mfn
  when: nanominer_gpu != false

- name: Miner | Software | Nanominer | Configuration | GPU | Add Pools
  lineinfile:
    path: "{{ nanominer_config }}"
    line: "pool{{item.priority}} = {{ item.name }}"
    state: present
    create: no
  loop: "{{ gpu_pool }}"
  become_user: mfn
  when: nanominer_gpu != false

- name: Miner | Software | Nanominer | Configuration | GPU | End Section
  lineinfile:
    path: "{{ nanominer_config }}"
    line: ";;;;;;;;;;;;; END GPU"
    state: present
    create: no
  become_user: mfn
  when: nanominer_gpu != false



## Executable ##

- name: Miner | Software | Nanominer | Executable | Reset
  shell: "mv {{ nanominer_script }} ~/TRASH/"
  ignore_errors: yes

- name: Miner | Software | Nanominer | Executable | Create
  blockinfile:
    path: "{{ nanominer_script }}"
    block: |
      # 2021-02-15 - Automate nanominer script creation.
      
      date
      whoami
      pwd

      {{ check_alive_start }}{{ nanominer_script }}{{ check_alive_end }} {
        time {{ nanominer_exec }} {{ nanominer_config }}
      }

    marker: '{mark}'
    marker_begin: "#!{{ bash_exec.stdout }} -x"
    marker_end: "exit 0"
    state: present
    create: yes
  become_user: mfn



## Permissions ##

- name: Miner | Software | Nanominer | Permissions
  shell: "chown -R mfn {{ user_mfn.home }}/nanominer*; chmod -R 755 {{ user_mfn.home }}/nanominer*"



## Reload ##

# TODO: Make this a script that always gets called by cron.
# It should kill the miner if a user logs into an X session, such as if I'm gaming.
# Then once I log out the job should come back within the minute.
- name: Miner | Software | Nanominer | Reload
  shell: "killall {{ nanominer_script }}; killall {{ nanominer_exec }}; killall nanominer.sh; killall nanominer"
  become_user: mfn
  ignore_errors: yes