Full Code of danmons/retronas for AI

main 45cdaaa9e802 cached
535 files
998.8 KB
295.9k tokens
11 symbols
1 requests
Download .txt
Showing preview only (1,133K chars total). Download the full file or copy to clipboard to get everything.
Repository: danmons/retronas
Branch: main
Commit: 45cdaaa9e802
Files: 535
Total size: 998.8 KB

Directory structure:
gitextract_oklxbxnr/

├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug-report.yml
│       └── config.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY
├── ansible/
│   ├── ansible.cfg
│   ├── hosts.yml
│   ├── install_3ds_qr_codes.yml
│   ├── install_adtpro.yml
│   ├── install_affstools.yml
│   ├── install_amitools.yml
│   ├── install_analoguepocket_cifs.yml
│   ├── install_apfs-fuse.yml
│   ├── install_aria2.yml
│   ├── install_assembly64.yml
│   ├── install_atarist-sidecart.yml
│   ├── install_batocera_cifs.yml
│   ├── install_cockpit-retronas.yml
│   ├── install_cockpit.yml
│   ├── install_cue2pops.yml
│   ├── install_curlftpfs.yml
│   ├── install_deluge.yml
│   ├── install_dhcpcd.yml
│   ├── install_disable-laptop-lid.yml
│   ├── install_disc-image-creator.yml
│   ├── install_dnsmasq-retro.yml
│   ├── install_dnsmasq.yml
│   ├── install_doc.yml
│   ├── install_dreampi.yml
│   ├── install_dvdauth.yml
│   ├── install_eccedc.yml
│   ├── install_emudeck_cifs.yml
│   ├── install_emuelec_cifs.yml
│   ├── install_etherdfs.yml
│   ├── install_ethflopd.yml
│   ├── install_extract-xiso.yml
│   ├── install_extradirs.yml
│   ├── install_far2l.yml
│   ├── install_fenrir-ode-webserver.yml
│   ├── install_filesystems.yml
│   ├── install_firewalld-zones.yml
│   ├── install_firewalld.yml
│   ├── install_flippydrive.yml
│   ├── install_freestation.yml
│   ├── install_fsp.yml
│   ├── install_gogrepo.yml
│   ├── install_hb-store-cdn.yml
│   ├── install_hdldump.yml
│   ├── install_hdparm.yml
│   ├── install_hfsutils.yml
│   ├── install_hostapd.yml
│   ├── install_kermit.yml
│   ├── install_lighttpd.yml
│   ├── install_linux-dexdrive.yml
│   ├── install_linux-gadgets.yml
│   ├── install_litch.yml
│   ├── install_lynx.yml
│   ├── install_macproxy_classic.yml
│   ├── install_mc.yml
│   ├── install_megatools.yml
│   ├── install_minicom.yml
│   ├── install_mister-organize.yml
│   ├── install_mister_cifs.yml
│   ├── install_mtcp-netdrive.yml
│   ├── install_mysticbbs.yml
│   ├── install_nabu.yml
│   ├── install_nbd-client.yml
│   ├── install_netatalk2.yml
│   ├── install_netatalk2x.yml
│   ├── install_netatalk3.yml
│   ├── install_netatalk3_source.yml
│   ├── install_netatalk4.yml
│   ├── install_netlink.yml
│   ├── install_netmount.yml
│   ├── install_network-presets-ethernet-dhcp.yml
│   ├── install_network-presets-standalone.yml
│   ├── install_network-presets-zoned.yml
│   ├── install_networkmanager.yml
│   ├── install_nfs.yml
│   ├── install_nginx.yml
│   ├── install_ntp.yml
│   ├── install_open-iscsi.yml
│   ├── install_openssh.yml
│   ├── install_pandoc.yml
│   ├── install_pfsshell.yml
│   ├── install_pi1541.yml
│   ├── install_piscsi.yml
│   ├── install_proftpd.yml
│   ├── install_ps2_openps2loader.yml
│   ├── install_ps2_udpbd.yml
│   ├── install_ps3netsrv.yml
│   ├── install_pygopherd.yml
│   ├── install_rclone.yml
│   ├── install_recalbox_cifs.yml
│   ├── install_redumper.yml
│   ├── install_retroaimserver.yml
│   ├── install_retroarch_cifs.yml
│   ├── install_retrodeck_cifs.yml
│   ├── install_romdir.yml
│   ├── install_romimport.yml
│   ├── install_romm_cifs.yml
│   ├── install_sabretools.yml
│   ├── install_samba.yml
│   ├── install_seaweedfs.yml
│   ├── install_sit.yml
│   ├── install_smbmounter.yml
│   ├── install_sslcert.yml
│   ├── install_syncthing.yml
│   ├── install_tcpser.yml
│   ├── install_telnet.yml
│   ├── install_tftpd-hpa.yml
│   ├── install_tnfs.yml
│   ├── install_troubleshooting.yml
│   ├── install_ucon64.yml
│   ├── install_waybackproxy.yml
│   ├── install_webone.yml
│   ├── install_wrp.yml
│   ├── install_xbox.yml
│   ├── install_xbox360.yml
│   ├── install_xbox360_netiso.yml
│   ├── install_xboxmanager.yml
│   ├── install_xlink-kai.yml
│   ├── install_ytree.yml
│   ├── install_zterm.yml
│   ├── migrate_mister_cifs_issue21.yml
│   ├── retronas_create_dirs.yml
│   ├── retronas_dependencies.yml
│   ├── retronas_system_config.yml
│   ├── retronas_systems.yml
│   ├── retronas_update_user.yml
│   ├── retronas_vars.yml.default
│   ├── roles/
│   │   ├── retronas.role.apt-backports/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cache/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cockpit/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cockpit-packages/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_cockpit-packages/
│   │   │   │       └── cockpit-packages.sh.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.createdirs/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.curlftpfs/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_curlftpfs.sh.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore3/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore6/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore8/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.extradirs/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.filesystems/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.firewalld.port/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.htpasswd/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yml
│   │   ├── retronas.role.nfs/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.nginx/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_nginx/
│   │   │   │       ├── conf/
│   │   │   │       │   ├── includes/
│   │   │   │       │   │   ├── autoindex.conf
│   │   │   │       │   │   ├── listen-80.conf
│   │   │   │       │   │   └── ssl.conf
│   │   │   │       │   └── sites-available/
│   │   │   │       │       ├── 10-retronas.conf
│   │   │   │       │       └── 99-retronas-files.conf
│   │   │   │       └── www/
│   │   │   │           └── index.html
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.package.latest/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.paths/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.romdir/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.samba/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── retronas.conf.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.samba.system/
│   │   │   ├── tasks/
│   │   │   │   ├── link.yml
│   │   │   │   ├── main.yaml
│   │   │   │   └── nolink.yml
│   │   │   └── templates/
│   │   │       └── retronas_system.conf.j2
│   │   ├── retronas.role.sslcert/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.system-config/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.templates/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.update-user/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   └── retronas.role.x11vnc/
│   │       ├── tasks/
│   │       │   └── main.yaml
│   │       ├── templates/
│   │       │   └── install_x11vnc/
│   │       │       └── x11vnc_wrapper.sh.j2
│   │       └── vars/
│   │           └── main.yaml
│   └── templates/
│       ├── install_3ds_qr_codes/
│       │   ├── 3ds_qr.sh.j2
│       │   └── retronas_3ds_qr.cron.j2
│       ├── install_adtpro/
│       │   ├── ADTPro.properties.j2
│       │   ├── adtpro.service.j2
│       │   ├── adtpro_retronas.sh.j2
│       │   └── install_adtpro.sh.j2
│       ├── install_affstools/
│       │   └── install_affstools.sh.j2
│       ├── install_amitools/
│       │   └── install_amitools.sh.j2
│       ├── install_apfs-fuse/
│       │   └── install_apfs-fuse.sh.j2
│       ├── install_assembly64/
│       │   ├── assembly64.service.j2
│       │   ├── assembly64_retronas.sh.j2
│       │   └── install_assembly64.sh.j2
│       ├── install_atarist-sidecart/
│       │   ├── 99-retronas-sidecart.conf.j2
│       │   ├── atarist-sidecart-generate-roms.sh.j2
│       │   ├── atarist-sidecart-mirrordb.sh.j2
│       │   ├── atarist-sidecart-updatedb.sh.j2
│       │   ├── index.html.j2
│       │   └── retronas_atarist.conf.j2
│       ├── install_cockpit-retronas/
│       │   └── install_cockpit-retronas.sh.j2
│       ├── install_cue2pops/
│       │   └── install_cue2pops.sh.j2
│       ├── install_deluge/
│       │   ├── auth.j2
│       │   ├── autoadd.conf.j2
│       │   ├── core.conf.j2
│       │   ├── deluge-web.service.j2
│       │   ├── deluged.j2
│       │   ├── deluged.service.j2
│       │   └── upgrade_deluge.sh.j2
│       ├── install_disable-laptop-lid/
│       │   └── retronas.conf.j2
│       ├── install_disc-image-creator/
│       │   └── install_disc-image-creator.sh.j2
│       ├── install_dnsmasq-retro/
│       │   ├── dnsmasq-retro.service.j2
│       │   └── retro/
│       │       ├── dhcp-retro-ethernet.conf.j2
│       │       ├── dhcp-retro-wifi.conf.j2
│       │       ├── dhcp.conf.j2
│       │       ├── dns.conf.j2
│       │       ├── dnsmasq.conf.j2
│       │       ├── interfaces.conf.j2
│       │       └── ipv6.conf.j2
│       ├── install_dreampi/
│       │   ├── dreampi.conf.j2
│       │   └── install_dreampi.sh.j2
│       ├── install_dvdauth/
│       │   └── install_dvdauth.sh.j2
│       ├── install_eccedc/
│       │   └── install_eccedc.sh.j2
│       ├── install_etherdfs/
│       │   ├── etherdfs.service.j2
│       │   ├── install_etherdfs.sh.j2
│       │   └── retronas_dos.conf.j2
│       ├── install_ethflopd/
│       │   ├── ethflopd.service.j2
│       │   └── install_ethflopd.sh.j2
│       ├── install_extract-xiso/
│       │   └── install_extract-xiso.sh.j2
│       ├── install_far2l/
│       │   └── install_far2l.sh.j2
│       ├── install_fenrir-ode-webserver/
│       │   ├── fenrir-ode-webserver.service.j2
│       │   └── install_fenrir-ode-webserver.sh.j2
│       ├── install_firewalld/
│       │   └── workarounds/
│       │       ├── clear-python-bytecode.j2
│       │       └── override.conf.j2
│       ├── install_firewalld-zones/
│       │   ├── policies/
│       │   │   └── retro_to_modern.xml.j2
│       │   ├── services/
│       │   │   ├── ps3netsrv.xml.j2
│       │   │   └── samba-modern.xml.j2
│       │   └── zones/
│       │       ├── modern.xml.j2
│       │       └── retro.xml.j2
│       ├── install_flippydrive/
│       │   ├── flippydrive.service.j2
│       │   ├── flippydrive.sh.j2
│       │   └── install_flippydrive.sh.j2
│       ├── install_freestation/
│       │   ├── retronas_freestation_cifs.conf.j2
│       │   └── retronas_freestation_nfs.conf.j2
│       ├── install_fsp/
│       │   ├── fspd.conf.j2
│       │   ├── fspd.service.j2
│       │   └── install_fsp.sh.j2
│       ├── install_gogrepo/
│       │   ├── gogrepo-wrapper.sh.j2
│       │   ├── gogrepo_download.sh.j2
│       │   ├── gogrepo_import-cookies.sh.j2
│       │   ├── gogrepo_login.sh.j2
│       │   └── gogrepo_update.sh.j2
│       ├── install_hb-store-cdn/
│       │   ├── config.ini.j2
│       │   ├── hb-store-cdn-check.sh.j2
│       │   ├── hb-store-cdn.cron.j2
│       │   ├── hb-store-cdn.service.j2
│       │   └── install_hb-store-cdn.sh.j2
│       ├── install_hdldump/
│       │   └── install_hdldump.sh.j2
│       ├── install_hdparm/
│       │   ├── hdparm-manager.sh.j2
│       │   ├── hdparm.service.j2
│       │   ├── hdparm.sh.j2
│       │   └── hdparm.timer.j2
│       ├── install_hfsutils/
│       │   └── install_hfsutils.sh.j2
│       ├── install_hostapd/
│       │   ├── hostapd-dnsmasq.conf.j2
│       │   ├── hostapd-retronas.conf.j2
│       │   └── hostapd-retronas.service.j2
│       ├── install_kermit/
│       │   ├── iksd.socket.j2
│       │   └── iksd@.service.j2
│       ├── install_lighttpd/
│       │   └── 99-retronas.conf.j2
│       ├── install_linux-dexdrive/
│       │   ├── dexdrive_dumper.sh.j2
│       │   ├── install_linux-dexdrive.sh.j2
│       │   ├── linux-dexdrive.service.j2
│       │   └── makefile.patch.j2
│       ├── install_linux-gadgets/
│       │   └── gadget-mass-storage-manage.sh.j2
│       ├── install_litch/
│       │   ├── litch_claim.sh.j2
│       │   ├── litch_download.sh.j2
│       │   ├── litch_download_clean.sh.j2
│       │   └── litch_login.sh.j2
│       ├── install_macproxy_classic/
│       │   └── macproxy.service.j2
│       ├── install_megatools/
│       │   └── install_megatools.sh.j2
│       ├── install_minicom/
│       │   ├── minicom.sh.j2
│       │   └── minirc.dfl.j2
│       ├── install_mister-organize/
│       │   ├── install_mister-organize.sh.j2
│       │   └── mister-organize.sh.j2
│       ├── install_mister_cifs/
│       │   ├── retronas-mister-dirs.service.j2
│       │   └── retronas-mister-dirs.timer.j2
│       ├── install_mtcp-netdrive/
│       │   ├── install_mtcp-netdrive.sh.j2
│       │   ├── mtcp-netdrive.service.j2
│       │   ├── mtcp-netdrive.sh.j2
│       │   └── mtcp-netdrive.xml.j2
│       ├── install_mysticbbs/
│       │   ├── create_filebone_na.py.j2
│       │   ├── install_mysticbbs.sh.j2
│       │   ├── mysticbbs-mis.service.j2
│       │   ├── mysticbbs.sh.j2
│       │   ├── mysticbbs.xml.j2
│       │   ├── retronas_create_fileareas.ini.j2
│       │   └── retronas_massupload.ini.j2
│       ├── install_nabu/
│       │   ├── install_nabu.sh.j2
│       │   └── nabu.sh.j2
│       ├── install_nbd-client/
│       │   └── nbd.conf.j2
│       ├── install_netatalk2/
│       │   ├── AppleVolumes.default.j2
│       │   ├── afpd.conf.j2
│       │   └── default.j2
│       ├── install_netatalk2x/
│       │   ├── AppleVolumes.default.j2
│       │   ├── afpd.conf.j2
│       │   ├── afpexpect.sh.j2
│       │   ├── atalkd.conf.j2
│       │   ├── default.j2
│       │   └── install_netatalk2x.sh.j2
│       ├── install_netatalk3/
│       │   ├── install_netatalk3.sh.j2
│       │   ├── netatalk.service.j2
│       │   └── retronas.conf.j2
│       ├── install_netatalk4/
│       │   ├── atalkd.service.j2
│       │   ├── install_netatalk4.sh.j2
│       │   ├── netatalk.service.j2
│       │   └── retronas.conf.j2
│       ├── install_netlink/
│       │   ├── install_netlink.sh.j2
│       │   ├── netlink.conf.j2
│       │   ├── netlink.patch.j2
│       │   └── netlink.service.j2
│       ├── install_netmount/
│       │   ├── install_netmount.sh.j2
│       │   ├── netmount-confman.py.j2
│       │   ├── netmount-confman.sh.j2
│       │   └── retronas.yaml.j2
│       ├── install_network-presets-standalone/
│       │   └── dhcpcd.conf.j2
│       ├── install_network-presets-zoned/
│       │   └── dhcpcd.conf.j2
│       ├── install_nfs/
│       │   ├── exports.j2
│       │   └── nfs-kernel-server.j2
│       ├── install_open-iscsi/
│       │   └── iscsi-manager-target-login.sh.j2
│       ├── install_pfsshell/
│       │   └── install_pfsshell.sh.j2
│       ├── install_pi1541/
│       │   └── pi1541.sh.j2
│       ├── install_piscsi/
│       │   ├── install_piscsi.sh.j2
│       │   ├── install_piscsi_standard.sh.j2
│       │   ├── piscsi.service.j2
│       │   └── piscsi_retronas_patch.diff.j2
│       ├── install_proftpd/
│       │   ├── ftp.service.j2
│       │   └── retronas.conf.j2
│       ├── install_ps2_openps2loader/
│       │   └── retronas_ps2.conf.j2
│       ├── install_ps2_udpbd/
│       │   ├── install_ps2_udpbd.sh.j2
│       │   ├── ps2_udpbd.service.j2
│       │   └── udpbd_manager.sh.j2
│       ├── install_ps3netsrv/
│       │   ├── install_ps3netsrv.sh.j2
│       │   ├── ps3netsrv-perms.service.j2
│       │   ├── ps3netsrv-perms.timer.j2
│       │   └── ps3netsrv.service.j2
│       ├── install_pygopherd/
│       │   ├── install_pygopherd.sh.j2
│       │   ├── pygopherd.conf.j2
│       │   └── pygopherd.service.j2
│       ├── install_rclone/
│       │   └── rclone-webui.service.j2
│       ├── install_redumper/
│       │   └── install_redumper.sh.j2
│       ├── install_retroaimserver/
│       │   ├── install_retroaimserver.sh.j2
│       │   ├── retro-aim-server.service.j2
│       │   ├── retroaimserver.xml.j2
│       │   └── retroainserver.xml.j2
│       ├── install_romimport/
│       │   └── romimport.sh.j2
│       ├── install_romm_cifs/
│       │   ├── retronas-romm-dirs.service.j2
│       │   ├── retronas-romm-dirs.sh.j2
│       │   └── retronas-romm-dirs.timer.j2
│       ├── install_sabretools/
│       │   └── install_sabretools.sh.j2
│       ├── install_seaweedfs/
│       │   ├── install_seaweedfs.sh.j2
│       │   ├── seaweedfs-credentials.sh.j2
│       │   ├── seaweedfs-retronas.service.j2
│       │   ├── seaweedfs.xml.j2
│       │   └── weed-retronas-s3.json.j2
│       ├── install_sit/
│       │   └── install_sit.sh.j2
│       ├── install_smbmounter/
│       │   └── retronas_smbmounter.conf.j2
│       ├── install_tcpser/
│       │   ├── install_tcpser.sh.j2
│       │   └── tcpser@.service.j2
│       ├── install_telnet/
│       │   └── telnet.j2
│       ├── install_tftpd-hpa/
│       │   └── tftpd-hpa.j2
│       ├── install_tnfs/
│       │   ├── install_tnfs.sh.j2
│       │   └── tnfsd.service.j2
│       ├── install_ucon64/
│       │   └── install_ucon64.sh.j2
│       ├── install_waybackproxy/
│       │   ├── config.json.j2
│       │   ├── install_waybackproxy.sh.j2
│       │   └── waybackproxy.service.j2
│       ├── install_webone/
│       │   ├── install_webone.sh.j2
│       │   └── webone.service.j2
│       ├── install_wrp/
│       │   ├── install_wrp.sh.j2
│       │   └── wrp.service.j2
│       ├── install_x11vnc/
│       │   └── x11vnc_wrapper.sh.j2
│       ├── install_xbox/
│       │   └── retronas_xbox.conf.j2
│       ├── install_xbox360/
│       │   └── retronas_xbox360.conf.j2
│       ├── install_xbox360_netiso/
│       │   ├── dummy.iso.j2
│       │   ├── install_xbox360_netiso.sh.j2
│       │   └── xbox360_netiso.service.j2
│       ├── install_xboxmanager/
│       │   └── xboxmanager.cfg.j2
│       ├── install_xlink-kai/
│       │   └── xlink-kai.service.j2
│       ├── install_ytree/
│       │   └── install_ytree.sh.j2
│       └── install_zterm/
│           ├── install_zterm.sh.j2
│           └── zterm.service.j2
├── config/
│   ├── menu/
│   │   ├── 3ds_qr.json
│   │   ├── _template.json
│   │   ├── adtpro.json
│   │   ├── assembly64.json
│   │   ├── atarist-sidecart.json
│   │   ├── cockpit.json
│   │   ├── config.json
│   │   ├── deluge.json
│   │   ├── dexdrive.json
│   │   ├── doc.json
│   │   ├── dreampi.json
│   │   ├── etherdfs.json
│   │   ├── ethflopd.json
│   │   ├── experimental.json
│   │   ├── fenrirodewebserver.json
│   │   ├── flippydrive.json
│   │   ├── fsp.json
│   │   ├── gogrepo.json
│   │   ├── hbstorecdn.json
│   │   ├── hdparm.json
│   │   ├── install.json
│   │   ├── lighttpd.json
│   │   ├── linux-gadgets.json
│   │   ├── litch.json
│   │   ├── lynx.json
│   │   ├── macproxy_classic.json
│   │   ├── main.json
│   │   ├── minicom.json
│   │   ├── mister-organize.json
│   │   ├── mister_cifs.json
│   │   ├── mtcp-netdrive.json
│   │   ├── mysticbbs.json
│   │   ├── nabu.json
│   │   ├── netatalk-legacy.json
│   │   ├── netatalk.json
│   │   ├── netlink.json
│   │   ├── netmount.json
│   │   ├── network-manual.json
│   │   ├── network-presets.json
│   │   ├── network-setup-modern.json
│   │   ├── network-setup-retro.json
│   │   ├── network-setup-wifiap.json
│   │   ├── network-setup.json
│   │   ├── network.json
│   │   ├── nginx.json
│   │   ├── ntp.json
│   │   ├── open-iscsi.json
│   │   ├── openssh.json
│   │   ├── pi1541.json
│   │   ├── piscsi.json
│   │   ├── profiles.json
│   │   ├── proftpd.json
│   │   ├── ps2_udpbd.json
│   │   ├── ps3netsrv.json
│   │   ├── rclone.json
│   │   ├── retroaimserver.json
│   │   ├── romimport.json
│   │   ├── romimportsystem.json
│   │   ├── romm_cifs.json
│   │   ├── samba.json
│   │   ├── seaweedfs.json
│   │   ├── services.json
│   │   ├── sslcert.json
│   │   ├── syncthing.json
│   │   ├── tcpser.json
│   │   ├── telnet.json
│   │   ├── tftpd-hpa.json
│   │   ├── tnfs.json
│   │   ├── tools.json
│   │   ├── update.json
│   │   ├── webone.json
│   │   ├── wrp.json
│   │   ├── xbox360_netiso.json
│   │   ├── xlinkkai.json
│   │   └── zterm.json
│   └── retronas.cfg
├── dialog/
│   ├── adtpro_ethernet_edit.sh
│   ├── adtpro_localhost_edit.sh
│   ├── adtpro_serial_edit.sh
│   ├── d_input.sh
│   ├── d_menu.sh
│   ├── d_yn.sh
│   ├── dexdrive_memcards.sh
│   ├── dexdrive_serial_edit.sh
│   ├── disclaimer.sh
│   ├── gogrepo.sh
│   ├── profiles.sh
│   ├── retronas_fixperms.sh
│   ├── retronas_password.sh
│   ├── romimportsystem.sh
│   ├── tcpser_edit.sh
│   ├── tcpser_status.sh
│   ├── wifi_password.sh
│   └── zterm_edit.sh
├── dist/
│   ├── install_preseed.sh
│   └── retronas
├── install_retronas.sh
├── lib/
│   ├── ansible_runner.sh
│   ├── common.sh
│   ├── markup_runner.sh
│   └── script_runner.sh
├── retronas.sh
└── scripts/
    ├── maint/
    │   ├── git-changes-summary.sh
    │   ├── install-profile.py
    │   ├── migrate_romdirs.py
    │   ├── retronas-systems-manager.py
    │   ├── sort_menu_json.py
    │   └── tests/
    │       ├── lint-yaml.sh
    │       └── test-retronas-json.py
    ├── patch/
    │   ├── cache-dir.sh
    │   ├── git-config.sh
    │   ├── install-jq.sh
    │   ├── new-startup-file.sh
    │   └── update-retronas_vars.sh
    └── static/
        ├── check-samba-user.sh
        ├── clean-broken-symlinks.sh
        ├── get-drives.sh
        ├── get-interfaces.sh
        ├── git-switch-branch.sh
        ├── network-example-presets-standalone.sh
        ├── network-example-presets-zoned.sh
        ├── permissions.sh
        ├── run-local-module.sh
        ├── service-samba.sh
        ├── set-etherdfs-nic.sh
        ├── set-top-level-dir.sh
        ├── update-group.sh
        ├── update-passwd.sh
        ├── update-retronas.sh
        ├── update-system-history.sh
        ├── update-system.sh
        ├── update-username.sh
        ├── wifi-show-passwd.sh
        └── wifi-update-passwd.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: "Bug report"
description: Report problematic behaviour.
body:
- type: markdown
  attributes:
    value: |
      If this is a new feature request please use the RetroNAS Discussion area. 
      
      Before raising an issue confirm you are using a supported distribution by checking the wiki and include as much detail as possible about your issue
- type: textarea
  attributes:
    label: Details
    description: |
      Any relevant details, e.g Error message text or screenshot, retronas branch, linux distribution information, ansible version etc.
    placeholder: |
      Installer <RETRONAS INSTALLER ended in with failure message <MESSAGE>, on retronas <BRANCH>. 
      
      I am using a supported distribution <DISTRO> <VERSION> with Ansible <VERSION> installed.

================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Discussions
    url: https://github.com/orgs/retronas/discussions
    about: For questions, feature requests etc.
  - name: "#retronas"
    url: https://libera.chat/guides/connect
    about: General chatter on Libera IRC
  - name: r/retroNAS
    url: https://www.reddit.com/r/retroNAS/
    about: Community support (not monitored)

================================================
FILE: .gitignore
================================================
bin
scripts/*.sh
!scripts/static/*.sh
src
log
doc
ansible/retronas_vars.yml
etc/*
config/installed.json
ansible/collections

.fuse*


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2021 Dan Mons

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
![logo](dist/retronas-logo.png)
# RetroNAS

## Project Information
* [Status](https://github.com/retronas/retronas/wiki/Status)
* [About](https://github.com/retronas/retronas/wiki/About)
* [HowTo](https://github.com/retronas/retronas/wiki)
* [Contributing](https://github.com/retronas/retronas/wiki/Contributing)
* [Thanks and Credits](https://github.com/retronas/retronas/wiki/Credits)

## WARNINGS
* [SECURITY](https://github.com/retronas/retronas/wiki/SECURITY-WARNING)
* [FILENAMES](https://github.com/retronas/retronas/wiki/Filenames)

## Community
* [Guides](https://github.com/retronas/retronas/wiki/Guides)
* [Coverage](https://github.com/retronas/retronas/wiki/Coverage)
* [Other Projects](https://github.com/retronas/retronas/wiki/Other-projects-and-sites)


================================================
FILE: SECURITY
================================================
=============================================================================
                    WARNING / TERMS OF USE / LICENSE
=============================================================================

          RetroNAS is a compilation of existing opensource products. 

              RetroNAS is made available under the MIT license
            https://github.com/retronas/retronas/blob/main/LICENSE

Due to the nature of retro computing, many of the tools and protocols used in 
this project are COMPLETELY INSECURE. It is at the users behest which tools
are installed and as such all liabilies are transfered to you as the user in 
the use of RetroNAS.

Most of these tools offer little to NO ENCRYPTION of neither data nor passwords, 
some tools offer access to your system WITHOUT any AUTHENTICATION, and some of 
the protocols have known EXPLOITS that cannot be fixed due to their legacy 
design. It is your responsiblity to secure your infrastructure.

  The RetroNAS team only support use of this software on a PRIVATE NETWORK

A private network is considered one where at the very least the RetroNAS is 
located behind a firewall that denies inbound traffic from the internet.

         DO NOT expose a configured RetroNAS to the public INTERNET

Doing so may result is unintentional DATA LOSS and or exposure of your network
and subsequent contents beit computer and/or data to BAD ACTORS. It is your 
responsiblity to secure your infrastructure.

The services RetroNAS installs will attempt to run as unprivileged user accounts 
where possible, but the RetroNAS installer scripts themselves all run as root
(the "Adminstrator" account in Linux). These have the power to dramatically 
change and break working systems, so please ensure you undeerstand the consequence
of the code you are about to run, i.e code review etc but the onus is on you.
RetroNAS provides automatic compilation, installation and configuration of many
third party tools these tools may be vulnerable to supply chain attacks of which 
we have no control over at installation time. If a project is shown to have been 
exploited we may remove or modify installation support at any time. It is your
responsibility to ensure the options you are selecting for installation are as 
per the third party project authors intent and the onus is on said authors to 
secure their products.

       If you are UNSURE if ANY of the ABOVE statements apply to you. 

                    DO NOT CONTINUE to use this project.
                    
      If you have questions in regards to RetroNAS use and/or risk you may 
       ask your question on the github discussion boards for the project.

       The RetroNAS team may in turn use this enquiry to revise support 
                 documentation for the benefit of the project

                     https://github.com/retronas/retronas

              The RetroNAS team are retro computing ENTHUSIASTS 

The RetroNAS team should not be considered computer, networking nor security 
experts and as such you are responsible to EDUCATE YOURSELF to the use of 
and/or risks associated with the tools in this project.

          This is NOT A NAS project for use with modern computing

If you understand the above fully and accept all subsequent liabilties as your
own in use of this project type AGREE at the prompt otherwise cease use of this
project immediately.

================================================
FILE: ansible/ansible.cfg
================================================
[defaults]
deprecation_warnings = False
command_warnings = False
inventory = /opt/retronas/ansible/hosts.yml
log_path = /opt/retronas/log/ansible.log
callbacks_enabled = ansible.posix.profile_tasks,ansible.posix.profile_roles
callbacks_whitelist = ansible.posix.profile_tasks,ansible.posix.profile_roles
cache = True
gathering = smart
fact_caching=jsonfile
fact_caching_connection=/opt/retronas/cache
fact_caching_timeout=86400
collections_paths = /opt/retronas/ansible/collections
roles_path = /opt/retronas/ansible/roles
private_role_vars = True


================================================
FILE: ansible/hosts.yml
================================================
---
all:
  hosts:
    localhost:
  vars:
    ansible_connection: local
    cache_plugin: jsonfile


================================================
FILE: ansible/install_3ds_qr_codes.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "3DS QR Codes"
    my_file: "install_3ds_qr_codes"
    rom_path: "{{ retronas_path }}/3ds"
    module_name: "3ds_qr_codes"

    dirs:
      - cia
      - qr

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.nginx

    - name: "{{ my_name }} - configure 3DS directory"
      ansible.builtin.file:
        path: "{{ rom_path }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory

    - name: "{{ my_name }} - create dirs"
      ansible.builtin.file:
        path: "{{ rom_path }}/{{ item }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory
      with_items: "{{ dirs }}"

    - name: "{{ my_name }} - link 3DS cia directory"
      ansible.builtin.file:
        src: "{{ rom_path }}/cia"
        dest: "{{ retronas_path }}/roms/nintendo/3ds/cia"
        state: link

    - name: "{{ my_name }} - install qrencode"
      ansible.builtin.apt:
        name: qrencode
        state: latest

    - name: "{{ my_name }} - configure QR generator script"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/3ds_qr.sh.j2"
        dest: "{{ retronas_root }}/scripts/3ds_qr.sh"
        owner: root
        group: root
        mode: '0755'

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_adtpro.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "adtpro"
    my_file: "install_{{ my_name }}"
    my_dir: /opt/adtpro
    module_name: "adtpro"

    systemd_units:
      - { name: "adtpro", type: 'service', state: "stopped", enabled: "no", restart: "no", instance: "no" }

    packages:
      - default-jre
      - xvfb
      - x11vnc

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "ADTPro.properties", dest: "{{ my_dir }}", force: no }
      - { name: "adtpro_retronas.sh", dest: "{{ my_dir }}",  mode: "0755" }

    paths:
      - { name: "{{ my_name }}", dest: "/opt",                state: "directory", mode: "0755"}
      # - { name: "{{ my_name }}", dest: "{{ retronas_path }}", state: "directory", mode: "0755"}

    firewalld_ports:
      - { port: 60000, protocol: tcp }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.x11vnc

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - disks symlink"
      ansible.builtin.file:
        src: "roms/apple/appleii"
        dest: "{{ retronas_path }}/{{ my_name }}"
        state: "link"

    - name: "{{ my_name }} - Install"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}} {{ my_dir }}/adtpro.sh"

    - name: "{{ my_name }} - create startup service(s) instance"
      ansible.builtin.template:
        src: templates/{{ my_file }}/{{ item.name }}.{{ item.type }}.j2
        dest: /usr/lib/systemd/system/{{ item.name }}@.{{ item.type }}
        owner: root
        group: root
        mode: 0644
      with_items: "{{ systemd_units }}"
      notify: "{{ my_name }} daemon-reload"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} daemon-reload"
      ansible.builtin.systemd:
        daemon_reload: true


================================================
FILE: ansible/install_affstools.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "affstools"
    my_file: "install_{{ my_name }}"
    module_name: "affstools"

    packages:
      - make
      - autoconf
      - gcc
      - curl
      - build-essential

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "/usr/local/sbin/mkaffs"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_amitools.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "amitools"
    my_file: "install_{{ my_name }}"
    module_name: "amitools"

    packages:
      - python3
      - python3-pip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_analoguepocket_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "analoguepocket CIFS"
    my_file: "install_analoguepocket_cifs"
    module_name: "analoguepocket_cifs"
    system_key: "analoguepocket"

    top_level_paths:
      - { name: "Assets",       enabled: yes,  generic: "roms",   systems: yes }
      - { name: "Cores",        enabled: yes,  generic: "",       systems: no }
      - { name: "Platforms",    enabled: yes,  generic: "",       systems: no }
      - { name: "Presets",      enabled: yes,  generic: "",       systems: no }
      - { name: "Saves",        enabled: yes,  generic: "",       systems: no }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_apfs-fuse.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "apfs-fuse"
    my_file: "install_apfs-fuse"
    module_name: "apfs-fuse"

    packages:
      - git
      - fuse
      - libfuse3-dev
      - bzip2
      - libbz2-dev
      - cmake
      - g++
      - libattr1-dev
      - zlib1g-dev

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "{{ retronas_root }}/bin/apfs-fuse"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_aria2.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "aria2"
    my_file: "install_aria2"
    module_name: "aria2"
    module_state: "present"

    packages:
      - aria2

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_assembly64.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "assembly64"
    my_file: "install_{{ my_name }}"
    my_dir: /opt/{{ my_name }}
    module_name: "assembly64"
    module_state: "present"

    packages:
      - xvfb
      - x11vnc

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}_retronas.sh", dest: "/opt/{{ my_name }}", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/etc/systemd/system", mode: "0644" }

    paths:
      - { name: "{{ my_name }}", dest: "/opt",                state: "directory", mode: "0755"}

    firewalld_ports:
      - { port: "66000", protocol: tcp}

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} daemon-reload"

    - name: "{{ my_name }} - disks symlink"
      ansible.builtin.file:
        src: "roms/apple/appleii"
        dest: "{{ retronas_path }}/{{ my_name }}"
        state: "link"

    - name: "{{ my_name }} - Install"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}} {{ my_dir }}/{{ my_file }}.sh"

    - ansible.builtin.import_role:
        name: retronas.role.x11vnc

    - name: "{{ my_name }} - firewalld"
      ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} daemon-reload"
      ansible.builtin.systemd:
        daemon_reload: true


================================================
FILE: ansible/install_atarist-sidecart.yml
================================================
---
- hosts: localhost
  gather_facts: false

  roles:
    - retronas.role.romdir
    - retronas.role.nginx
    - retronas.role.samba

  vars:
    my_name: "atarist-sidecart"
    my_file: "install_{{ my_name }}"
    base_path: "{{ retronas_path }}/atarist"
    script_url: "https://raw.githubusercontent.com/diegoparrilla/atarist-sidecart-raspberry-pico/main/roms/update_json"
    script_dest: "{{ retronas_root }}/bin/{{ my_name }}-generate-roms.sh"
    module_name: "atarist-sidecart"

    packages:
      - python3-boto3

    paths:
      - { name: "bin",      dest: "{{ retronas_root }}" }
      - { name: "atarist",  dest: "{{ retronas_path }}" }
      - { name: "sidecart", dest: "{{ base_path }}" }
      - { name: "db",       dest: "{{ base_path }}/sidecart" }

    links:
      - { src: "{{ retronas_path }}/roms/atari/st/cart", dest: "{{ base_path }}/roms" }
      - { src: "{{ retronas_path }}/roms/atari/st/flop", dest: "{{ base_path }}/floppies" }

    templates:
      - { name: "retronas_atarist.conf", dest: "/etc/samba" }
      - { name: "{{ my_name }}-updatedb.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}-mirrordb.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}-generate-roms.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "99-retronas-sidecart.conf", dest: "/etc/nginx/sites-available" }
      - { name: "index.html", dest: "{{ base_path }}/sidecart", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    firewalld_rules:
      - { zone: "retro", service: "http" }

  tasks:

    - name: "{{ my_name }} - Install packages"
      ansible.builtin.package:
        name: "{{ packages }}"
        state: latest

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - symlinks"
      ansible.builtin.file:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        state: "link"
      with_items: "{{ links }}"

    - name: "{{ my_name }} - get update script"
      ansible.builtin.shell: curl -kLso "{{ script_dest }}" {{ script_url }}

    - name: "{{ my_name }} - make script executable"
      file:
        path: "{{ script_dest }}"
        mode: '0755'

    - name: "{{ my_name }} - configure includes file"
      ansible.builtin.ini_file:
        path: /etc/samba/smb.conf
        section: atarist
        option: "include"
        value: "/etc/samba/retronas_atarist.conf"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_batocera_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Batocera CIFS"
    my_file: "install_batocera_cifs"
    module_name: "batocera_cifs"
    system_key: "batocera"

    top_level_paths:
      - { name: "ROMS",   enabled: yes,  generic: "roms",   systems: yes }
      - { name: "SAVES",  enabled: yes,  generic: "saves",  systems: yes }
      - { name: "BIOS",   enabled: yes,  generic: "bios",   systems: yes }

    internal_symlinks:
      - { src: 'sega/megadrive', dest: 'msu-md' }
      - { src: 'sharp/mz', dest: 'mz700' }
      - { src: 'sharp/mz', dest: 'mz800' }
      - { src: 'sharp/mzb', dest: 'mz2500' }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_cockpit-retronas.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "cockpit-retronas"
    my_file: "install_cockpit-retronas"
    package_dir: "/usr/share/cockpit"
    module_name: "cockpit-retronas"

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.include_role:
        name: retronas.role.filesystems

    - ansible.builtin.include_role:
        name: retronas.role.cockpit

    - name: "{{ my_name }} - create package directory"
      ansible.builtin.file:
        path: "{{ package_dir }}/{{ my_name }}"
        owner: root
        group: root
        mode: 0755
        state: directory

    - name: "{{ my_name }} - Generate scripts"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ my_file }}.sh.j2"
        dest: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        owner: root
        group: root
        mode: 0755

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"

    - ansible.builtin.include_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_cockpit.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    module_name: "cockpit"

  roles:
    - retronas.role.filesystems
    - retronas.role.apt-backports
    - retronas.role.cockpit
    - retronas.role.cockpit-packages
    - retronas.role.system-config


================================================
FILE: ansible/install_cue2pops.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "cue2pops"
    my_file: "install_cue2pops"
    module_name: "cue2pops"

    packages:
      - git
      - coreutils
      - make
      - gcc
      - g++
      - build-essential

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_curlftpfs.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    module_name: "curlftpfs"

  roles:
    - retronas.role.curlftpfs
    - retronas.role.system-config


================================================
FILE: ansible/install_deluge.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Deluge"
    my_file: "install_deluge"
    module_name: "bittorrent"

    packages:
      - geoip-bin
      - geoip-database
      - deluged
      - deluge-web
      - deluge-console

    systemd_units:
      - { name: "deluged",    type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }
      - { name: "deluge-web", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    paths:
      - { name: "deluged",      dest: "/var/lib",                       owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "config",       dest: "/var/lib/deluged",               owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "bittorrent",   dest: "{{ retronas_path }}",            owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "torrents",     dest: "{{ retronas_path }}/bittorrent", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "auto-add",     dest: "{{ retronas_path }}/bittorrent", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "downloading",  dest: "{{ retronas_path }}/bittorrent", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "complete",     dest: "{{ retronas_path }}/bittorrent", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "autoadd.conf",       dest: "/var/lib/deluged/config" }
      - { name: "deluged",            dest: "/etc/default" }
      - { name: "core.conf",          dest: "/var/lib/deluged/config" }
      - { name: "auth",               dest: "/var/lib/deluged/config" }
      - { name: "upgrade_deluge.sh",  dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "deluged.service",    dest: '/usr/lib/systemd/system' }
      - { name: "deluge-web.service", dest: '/usr/lib/systemd/system' }

    firewalld_ports:
      - { zone: retro, port: "8112", protocol: "tcp" }
      - { zone: modern, port: "8112", protocol: "tcp" }
      - { zone: retro, port: "58846", protocol: "tcp" }
      - { zone: modern, port: "58846", protocol: "tcp" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - firewalld"
      ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - name: "{{ my_name }} -remove legacy deluged startup file"
      file:
        path: "/etc/init.d/deluged"
        state: absent

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'


================================================
FILE: ansible/install_dhcpcd.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "dhcpcd"
    my_file: "install_{{ my_name }}"
    module_name: "dhcpcd"

    packages:
      - dhcpcd

    changed: false

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - restart if imported because handlers will not run"
      service:
        name: "{{ item }}"
        state: restarted
        enabled: true
      with_items: "{{ my_services }}"
      when: changed is true

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_disable-laptop-lid.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Disable Laptop Lid"
    my_file: "install_disable-laptop-lid"
    service: "systemd-logind.service"
    module_name: "disable-laptop-lid"

    paths:
      - { name: "logind.conf.d", dest: "/etc/systemd/",                state: "directory", mode: "0755"}

    templates:
      - { name: "retronas.conf", dest: "/etc/systemd/logind.conf.d", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ service }}"
        state: restarted


================================================
FILE: ansible/install_disc-image-creator.yml
================================================
# Dependencies
- ansible.builtin.import_playbook: install_dvdauth.yml
- ansible.builtin.import_playbook: install_eccedc.yml

- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Disc Image Creator"
    my_file: "install_disc-image-creator"
    module_name: "disc-image-creator"

    packages:
      - git
      - coreutils
      - make
      - gcc
      - g++
      - curl
      - build-essential
      - unzip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts/", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_dnsmasq-retro.yml
================================================
---
# Dependencies
- import_playbook: install_ntp.yml
- import_playbook: install_dnsmasq.yml

- hosts: localhost
  gather_facts: false

  vars:
    my_name: "dnsmasq-retro"
    my_service: "{{ my_name }}"
    my_file: "install_{{ my_name }}"
    module_name: "dnsmasq-retro"

    templates:
      - { name: "dhcp-retro-ethernet.conf", sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "dhcp-retro-wifi.conf",     sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "dhcp.conf",                sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "dns.conf",                 sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no } 
      - { name: "dnsmasq.conf",             sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "interfaces.conf",          sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "ipv6.conf",                sub: "retro", dest: "/etc/dnsmasq.d/retro", force: no }
      - { name: "dnsmasq-retro.service",    sub: "",      dest: "/etc/systemd/system"}

    paths:
      - { name: "dnsmasq.d",                dest: "/etc",                 state: "directory", mode: "0755" }
      - { name: "retro",                    dest: "/etc/dnsmasq.d",       state: "directory", mode: "0755" }


    net_settings:
      - { option: "interface",  value: "{{ retronas_net_retro_interface }}",  match_regex: "^interface {{ retronas_net_retro_interface }}$",    after_regex: "",                                               state: "present", dest: "/etc/dhcpcd.conf" }
      #- { option: "interface",  value: "{{ retronas_net_wifi_interface }}",  match_regex: "^interface {{ retronas_net_wifi_interface }}$",      after_regex: "",                                               state: "present", dest: "/etc/dhcpcd.conf" }
      - { option: "static",     value: 'ip_address\={{ retronas_net_retro_ip }}/{{ retronas_net_retro_subnet }}',                               after_regex: "^interface {{ retronas_net_retro_interface }}$", state: "present", dest: "/etc/dhcpcd.conf" }
      - { option: "static",     value: 'domain_name_servers\={{ retronas_net_retro_dns }}',                                                     after_regex: "^interface ip_address=.+$",                      state: "present", dest: "/etc/dhcpcd.conf" }

    my_services:
      - dhcpcd
      - "{{ my_name }}"


  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - mask default dnsmasq service"
      service:
        name: "dnsmasq"
        state: stopped
        daemon_reload: true
        enabled: false
        masked: true

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart services"

    - name: "{{ my_name }} - checking for dhcpcd"
      stat:
        path: "/etc/dhcpcd.conf"
      register: dhcpcd_check

    - name: "{{ my_name }} - setup dhcpcd"
      lineinfile:
        path: "{{ item.dest }}"
        search_string: "{{ item.match_regex | default('^$') }}"
        insertbefore: "{{ item.before_regex | default(omit) }}"
        insertafter: "{{ item.after_regex | default(omit) }}"
        line: "{{ item.option }} {{ item.value }}"
      with_items: "{{ net_settings }}"
      when: dhcpcd_check.stat.exists
      notify: "{{ my_name }} - Restart services"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart services"
      service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
        enabled: true
      with_items: "{{ my_service }}"


================================================
FILE: ansible/install_dnsmasq.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "dnsmasq"
    my_file: "install_{{ my_name }}"
    module_name: "dnsmasq"

    packages:
      - dnsmasq

    my_services:
      - dnsmasq

    changed: false

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - restart if imported because handlers will not run"
      service:
        name: "{{ item }}"
        state: restarted
        enabled: true
      with_items: "{{ my_services }}"
      when: changed is true

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_doc.yml
================================================
# Dependencies
- ansible.builtin.import_playbook: install_lynx.yml

- hosts: localhost
  gather_facts: false

  vars:
    my_name: "retronas_docs"
    my_file: "install_retronas_docs"
    module_name: "retronas_docs"

    packages:
      - git
      - pandoc

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Clone local copy of RetroNAS wiki"
      ansible.builtin.git:
        repo: https://github.com/retronas/retronas.wiki.git
        dest: "{{ retronas_root }}/doc"
        update: false

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_dreampi.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "dreampi"
    my_file: "install_dreampi"
    module_name: "dreampi"

    packages:
      - git
      - dnsmasq
      - dnsutils
      - libnetfilter-queue-dev
      - libnetfilter-queue1
      - ppp
      - arping
      - nftables
      - tcpd
      - wvdial
      - python3-pip

    groups:
      - dialout
      - dip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.conf", dest: "/etc/dnsmasq.d", force: no }

    paths:
      - { name: "dnsmasq.d", dest: "/etc" }

    systemd_patches:
      - { unit: "dreampi.service", line: "Restart=on-failure", regex: "^Restart=on-failure$", after: "^ExecStart=.*$" }
      - { unit: "dreampi.service", line: "RestartSec=30s", regex: "^RestartSec=.+", after: "^Restart=.*$" }

  tasks:

    - name: "{{ my_name }} - Checking hw platform compatiblity"
      ansible.builtin.debug:
        msg: "INCOMPATIBLE PLATFORM, only arm platforms are supported"
      when: ansible_architecture is not search('arm') and
            ansible_architecture != 'aarch64'

    - ansible.builtin.meta: end_play
      when: ansible_architecture is not search('arm') and
            ansible_architecture != 'aarch64'

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash
      notify: "{{ my_name }} Restart Services"

    - name: "{{ my_name }} - Patch systemd service"
      ansible.builtin.lineinfile:
        path: /etc/systemd/system/{{ item.unit }}
        regex: "{{ item.regex }}"
        insertafter: "{{ item.after }}"
        line: "{{ item.line }}"
        state: present
      with_items: "{{ systemd_patches }}"
      notify: "{{ my_name }} Restart Services"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} Restart Services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon_reload: true
      with_items:
        - "{{ my_name }}.service"


================================================
FILE: ansible/install_dvdauth.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "DVDAuth"
    my_file: "install_dvdauth"
    module_name: "dvdauth"

    packages:
      - git
      - coreutils
      - make
      - gcc
      - g++
      - curl
      - build-essential
      - unzip
      - util-linux

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_eccedc.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "EccEDC"
    my_file: "install_eccedc"
    module_name: "eccedc"

    packages:
      - coreutils
      - make
      - gcc
      - g++
      - curl
      - build-essential
      - unzip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_emudeck_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "EmuDeck CIFS"
    my_file: "install_emudeck_cifs"
    system_key: "emudeck"
    module_name: "emudeck_cifs"

    top_level_paths:
      - { name: "roms",   enabled: yes,  generic: "roms",   systems: yes }
    #  - { name: "saves",  enabled: yes,  generic: "saves",  systems: yes }
      - { name: "bios",   enabled: yes,  generic: "bios",   systems: yes }

    internal_symlinks:
      - { src: 'commodore/amiga', dest: 'ags' }
      - { src: 'commodore/amiga', dest: 'amiga600' }
      - { src: 'atari/jaguar', dest: 'atarijaguarcd' }
      - { src: 'capcom/cps1', dest: 'cps' }
      - { src: 'nintendo/gamecube', dest: 'gc' }
      - { src: 'mame/mame', dest: 'mame-advmame' }
      - { src: 'mame/mame', dest: 'mame-mame4all' }
      - { src: 'mame/mame', dest: 'mame-mame4all' }
      - { src: 'sega/megacd', dest: 'segacd' }
      - { src: 'sega/megacd', dest: 'megacdjp' }
      - { src: 'sega/megadrive', dest: 'genesis' }
      - { src: 'sega/megadrive', dest: 'megadrivejp' }
      - { src: 'nintendo/3ds', dest: 'n3ds' }
      - { src: 'snk/neogeocd', dest: 'neogeocdjp' }
      - { src: 'sony/playstation1', dest: 'psx' }
      - { src: 'sega/saturn', dest: 'saturnjp' }
      - { src: 'sega/32x', dest: 'sega32xjp' }
      - { src: 'sega/32x', dest: 'sega32xna' }
      - { src: 'nintendo/superfamicom', dest: 'sneshd' }
      - { src: 'nintendo/superfamicom', dest: 'snesna' }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_emuelec_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "EmuElec CIFS"
    my_file: "install_emuelec_cifs"
    module_name: "emuelec_cifs"
    system_key: "emuelec"

    internal_symlinks:
      - { src: 'nintendo/famicom', dest: 'nesh' }
      - { src: 'nintendo/gameboyadvance', dest: 'gbah' }
      - { src: 'nintendo/gameboy', dest: 'gbh' }
      - { src: 'nintendo/gameboycolor', dest: 'gbch' }      
      - { src: 'nintendo/superfamicom', dest: 'snesh' }
      - { src: 'sega/gamegear', dest: 'gamegearh' }
      - { src: 'sega/megadrive', dest: 'genh' }

  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_etherdfs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "EtherDFS"
    my_file: "install_etherdfs"
    module_name: "etherdfs"

    packages:
      - make
      - automake
      - autoconf
      - gcc
      - g++
      - git
      - build-essential
      - coreutils

    paths:
      - { name: "dos", dest: "{{ retronas_path }}", state: "directory", owner: "{{ retronas_user }}", group: "{{ retronas_group }}", mode: "0755" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "etherdfs.service", dest: "/usr/lib/systemd/system/" }
      - { name: "retronas_dos.conf", dest: "/etc/samba/" }


  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root }}/bin/ethersrv"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure includes file"
      ansible.builtin.ini_file:
        path: /etc/samba/smb.conf
        section: dos
        option: "include"
        value: "/etc/samba/retronas_dos.conf"
      notify: "{{ my_name }} - Install Samba"

    - name: "{{ my_name }} - enable startup service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon_reload: true
      with_items:
        - etherdfs

    - ansible.builtin.import_role:
        name: retronas.role.samba
      vars:
        changed: "{{ install_changed }}"
      when: install_changed is defined and
            install_changed is true

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
      with_items:
        - etherdfs

    - name: "{{ my_name }} - Install Samba"
      set_fact:
        install_changed: true


================================================
FILE: ansible/install_ethflopd.yml
================================================
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "ethflopd"
    my_file: "install_{{ my_name }}"
    module_name: "ethflopd"

    packages:
      - make
      - automake
      - autoconf
      - gcc
      - g++
      - git
      - build-essential
      - coreutils

    paths:
      - { name: "dos", dest: "{{ retronas_path }}", state: "directory", owner: "{{ retronas_user }}", group: "{{ retronas_group }}", mode: "0755" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "ethflopd.service", dest: "/usr/lib/systemd/system/" }


  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root }}/bin/{{ my_name }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup service"
      ansible.builtin.service:
        name: "{{ my_name }}.service"
        state: started
        enabled: true
        daemon_reload: true

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ my_name }}.service"
        state: restarted
        daemon_reload: true


================================================
FILE: ansible/install_extract-xiso.yml
================================================
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "extract-xiso"
    my_file: "install_extract-xiso"
    module_name: "extract-xiso"

    packages:
      - make
      - gcc
      - coreutils
      - cmake

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "/usr/local/bin/extract-xiso"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_extradirs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    module_name: "extradirs"

  tasks:
    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_far2l.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "far2l"
    my_file: "install_{{ my_name }}"
    module_name: "far2l"

    packages:
      - gawk
      - m4
      - libpcre2-dev
      - libxerces-c-dev
      - libspdlog-dev
      - libuchardet-dev
      - libssh-dev
      - libssl-dev
      - libsmbclient-dev
      - libnfs-dev
      - libneon27-dev
      - libarchive-dev
      - cmake
      - g++
      - gcc
      - git

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_fenrir-ode-webserver.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "fenrir-ode-webserver"
    my_file: "install_fenrir-ode-webserver"
    module_name: "fenrir-ode-webserver"

    packages:
      - make
      - gcc
      - g++
      - coreutils
      - cmake

    fenrir_ode_path: "{{ retronas_path }}/fenrir-ode-webserver"
    fenrir_ode_port: "31994"
    fenrir_ode_bin: "/usr/local/bin/FenrirServer"

    my_service: "{{ my_name }}.service"

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/usr/lib/systemd/system" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - run build tool"
      ansible.builtin.shell:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "{{ fenrir_ode_bin }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - create share link"
      ansible.builtin.file:
        src: "roms/sega/saturn"
        dest: "{{ fenrir_ode_path }}"
        state: link
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        enabled: true
        daemon_reload: true
      with_items: "{{ my_service }}"


================================================
FILE: ansible/install_filesystems.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    module_name: "filesystems"

  roles:
    - retronas.role.filesystems
    - retronas.role.system-config


================================================
FILE: ansible/install_firewalld-zones.yml
================================================
---
# Dependencies
- ansible.builtin.import_playbook: install_dnsmasq.yml
- ansible.builtin.import_playbook: install_firewalld.yml

- hosts: localhost
  gather_facts: false

  vars:
    my_name: "firewalld-zones"
    my_service: firewalld
    my_file: "install_{{ my_name }}"
    module_name: "firewalld-zones"

    templates:
      - { name: "retro_to_modern.xml",      sub: "policies",    dest: "/etc/{{ my_service }}/policies",                 force: no }
      - { name: "samba-modern.xml",         sub: "services",    dest: "/etc/{{ my_service }}/services",                 force: no }
      - { name: "ps3netsrv.xml",            sub: "services",    dest: "/etc/{{ my_service }}/services",                 force: no }
      - { name: "modern.xml",               sub: "zones",       dest: "/etc/{{ my_service }}/zones",                    force: no }
      - { name: "retro.xml",                sub: "zones",       dest: "/etc/{{ my_service }}/zones",                    force: no } 

    paths:
      - { name: "{{ my_service }}",               dest: "/etc",                  state: "directory", mode: "0750" }
      - { name: "{{ my_service }}/policies",      dest: "/etc",                  state: "directory", mode: "0750" }
      - { name: "{{ my_service }}/services",      dest: "/etc",                  state: "directory", mode: "0750" }
      - { name: "{{ my_service }}/zones",         dest: "/etc",                  state: "directory", mode: "0750" }

    firewalld_rules:
      - { zone: "retro", service: "ssh" }
      - { zone: "modern", service: "ssh" }
      - { zone: "retro", service: "cockpit" }
      - { zone: "modern", service: "cockpit" }

  tasks:

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Reload firewalld to pickup the new zones"
      ansible.builtin.service:
        name: "firewalld"
        state: restarted
        daemon_reload: true
        enabled: true
        force: true

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} - Reload firewalld"
      ansible.builtin.set_fact:
        install_changed: true

- ansible.builtin.import_playbook: install_firewalld.yml
  vars:
    changed: "{{ install_changed }}"
  when: install_changed is defined and
        install_changed is true


================================================
FILE: ansible/install_firewalld.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "firewalld"
    my_file: "install_{{ my_name }}"
    my_services: "firewalld.service"
    module_name: "firewalld"

    templates:
      - { name: "clear-python-bytecode",    sub: "workarounds", dest: "/usr/local/sbin",              mode: '0750' }
      - { name: "override.conf",            sub: "workarounds", dest: "/etc/systemd/system" }

    paths:
      - { name: "{{ my_name }}",               dest: "/etc",                  state: "directory", mode: "0750" }
      - { name: "{{ my_name }}.service.d",     dest: "/etc/systemd/system/",  state: "directory", mode: "0750" }

    packages:
      - firewalld
      - python3-firewall

    collections:
      - { collection: ansible.posix, creates: ansible/posix }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - install related ansible collections"
      ansible.builtin.command:
        cmd: /usr/bin/ansible-galaxy collection install {{ item.collection }}
        creates: /opt/retronas/ansible/collections/ansible_collections/{{ item.creates }}
      with_items: "{{ collections }}"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
        enabled: true
        force: true
      with_items: "{{ my_services }}"


================================================
FILE: ansible/install_flippydrive.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Flippydrive"
    my_file: "install_flippydrive"
    my_service: "flippydrive"
    module_name: "flippydrive"

    paths:
      - { name: "gamecube", dest: "{{ retronas_path }}" }
      - { name: "{{ my_service }}", dest: "/opt" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_service }}.sh", dest: "/opt/{{ my_service }}", mode: "0755" }
      - { name: "{{ my_service }}.service", dest: "/etc/systemd/system/" }

    firewalld_ports:
      - { port: 7031, protocol: tcp }

    packages:
      - unzip
      - curl

  tasks:

    - ansible.builtin.assert:
        that: ansible_architecture == "x86_64"
        fail_msg: "Unsupported architecture"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from repo"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup service"
      ansible.builtin.service:
        name: "{{ my_service }}"
        state: started
        enabled: true
        daemon_reload: true

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ my_service }}"
        state: restarted
        daemon_reload: false


================================================
FILE: ansible/install_freestation.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "freestation"
    my_file: "install_{{ my_name }}"
    module_name: "freestation"
    system_key: "freestation"

    top_level_paths:
      - { name: "games",      enabled: yes,  generic: "roms",        systems: yes }
      - { name: "bios",       enabled: yes,  generic: "bios",        systems: yes }

    templates:
      - { name: "retronas_freestation_cifs.conf", name_dest: "retronas_freestation.conf", dest: "/etc/samba"}
      - { name: "retronas_freestation_nfs.conf",  name_dest: "retronas_freestation.conf", dest: "/etc/exports.d"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.nfs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_fsp.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "FSP for Swiss"
    my_file: "install_fsp"
    my_service: "fspd"
    module_name: "fsp"

    packages:
      - python3
      - python-is-python3
      - build-essential
      - flex
      - gcc
      - scons

    swiss_rw:
      - .FSP_OK_ADD
      - .FSP_OK_DEL
      - .FSP_OK_MKDIR
      - .FSP_OK_RENAME

    paths:
      - { name: "fsp",      dest: "{{ retronas_root }}/bin/" }
      - { name: "etc",      dest: "{{ retronas_root }}/bin/fsp/" }
      - { name: "gamecube", dest: "{{ retronas_path }}" }
      - { name: "swiss",    dest: "{{ retronas_path }}/gamecube" }
      - { name: "swiss",    dest: "{{ retronas_path }}/gamecube/swiss" }   # ????
      - { name: "tmp",      dest: "{{ retronas_path }}/gamecube/swiss" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "{{ my_service }}.conf", dest: "{{ retronas_root }}/bin/fsp/etc" }
      - { name: "fspd.service", dest: "/usr/lib/systemd/system/" }

    firewalld_ports:
      - { port: 2121, protocol: udp }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - name: "{{ my_name }} - build layout"
      ansible.builtin.file:
        src: "../../roms/{{ item.src }}"
        dest: "{{ retronas_path }}/gamecube/swiss/{{ item.fspd }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: link
      loop: "{{ system_map }}"
      when:
        item.fspd | length > 0
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - Set write permissions top level"
      ansible.builtin.copy:
        content: ""
        dest: "{{ retronas_path }}/gamecube/{{ item.0 }}/{{ item.1 }}"
        force: false
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        mode: 0644
      with_nested:
        - ["swiss", "swiss/swiss"]
        - "{{ swiss_rw }}"

    - name: "{{ my_name }} - enable startup service"
      ansible.builtin.service:
        name: "{{ my_service }}"
        state: started
        enabled: true
        daemon_reload: true

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ my_service }}"
        state: restarted
        daemon_reload: false


================================================
FILE: ansible/install_gogrepo.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "gogrepo"
    my_file: "install_gogrepo"
    module_name: "gogrepo"

    packages:
      - python3
      - python-is-python3
      - python3-html5lib
      - git
      - sudo

    templates:
      - { name: "gogrepo_login.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "gogrepo_import-cookies.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "gogrepo_download.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "gogrepo_update.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "gogrepo-wrapper.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - create GOG dir"
      ansible.builtin.file:
        path: "{{ retronas_path }}/{{ item }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        mode: "0775"
        state: directory
      with_items:
        - gog

    - name: "{{ my_name }} - download gogrepo+patches (sairuk)"
      ansible.builtin.shell:
        chdir: "{{ retronas_root }}/bin"
        cmd: "git clone https://github.com/sairuk/gogrepo.git"
        creates: "{{ retronas_root }}/bin/gogrepo"

    - name: "{{ my_name }} - update gogrepo"
      ansible.builtin.shell:
        chdir: "{{ retronas_root }}/bin/gogrepo"
        cmd: "git pull"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_hb-store-cdn.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: hb-store-cdn
    my_file: "install_{{ my_name }}"
    module_name: "hb-store-cdn"

    systemd_units:
      - { name: "{{ my_name }}", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    packages:
      - git
      - npm
      - gcc
      - g++
      - build-essential

    packages_debian:
      debian12:
        - libnode108
      debian13:
        - libnode115

    paths:
      - { name: "{{ my_name }}",    dest: "{{ retronas_root }}/bin",                state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "bin",              dest: "{{ retronas_root }}/bin/{{ my_name }}",  state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "ps4",              dest: "{{ retronas_path }}",                    state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "{{ my_name }}-check.sh", dest: "{{ retronas_root }}/bin/{{ my_name }}", mode: "0755"}
      - { name: "{{ my_name }}.cron", dest: "/etc/cron.d" }
      - { name: "config.ini", dest: "{{ retronas_root }}/bin/{{ my_name }}" }
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/usr/lib/systemd/system" }

    firewalld_ports:
      - { port: 6449, protocol: "tcp" }

  tasks:
    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.package.latest
      vars:
        packages: "{{ packages_debian['debian' + ansible_distribution_major_version ] }}"
      when: ansible_distribution == 'Debian'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - name: "{{ my_name }} - build layout"
      ansible.builtin.file:
        src: "{{ retronas_path }}/roms/sony/playstation4/pkg"
        dest: "{{ retronas_path }}/ps4/{{ my_name }}"
        state: link
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root }}/bin/{{ my_name }}/hb-store-cdn-cli-server"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items:
        "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items:
        "{{ systemd_units }}"
      when:
        - item.instance == 'no'

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items:
        "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'

    - name: "{{ my_name }} - Restart instances"
      ansible.builtin.service:
        name: "{{ item.1.name }}{{ item.0.dest }}.{{ item.1.type }}"
        state: restarted
        daemon_reload: true
      with_items:
        - "{{ system_map }}"
        - "{{ systemd_units }}"
      when:
        - item.1.restart == 'yes'
        - item.1.instance == 'yes'


================================================
FILE: ansible/install_hdldump.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "hdldump"
    my_file: "install_{{ my_name }}"
    module_name: "hdldump"

    packages:
      - make
      - gcc
      - coreutils

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "/usr/local/bin/hdldump"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_hdparm.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "hdparm"
    my_file: "install_{{ my_name }}"
    module_name: "hdparm"

    packages:
      - hdparm
      - coreutils

    scripts:
      - "{{ my_name }}.sh"
      - "{{ my_name }}-manager.sh"

    symlinks:
      - hdparm-manager-disable-apm
      - hdparm-manager-disable-standby
      - hdparm-manager-start-service
      - hdparm-manager-query-service
      - hdparm-manager-stop-service
      - hdparm-manager-drive-selector

    systemd_units:
      - { name: "{{ my_name }}", type: "timer", state: "stopped", instance: "no", enabled: "no", restart: "no" }
      - { name: "{{ my_name }}", type: "service", state: "stopped", instance: "no", enabled: "no", restart: "no" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - check dir"
      ansible.builtin.file:
        path: /usr/lib/systemd/system
        owner: root
        group: root
        mode: 0755
        state: directory

    - name: "{{ my_name }} - install script"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ item }}.j2"
        dest: "{{ retronas_root }}/scripts/{{ item }}"
        owner: root
        group: root
        mode: '0755'
      with_items:
        - "{{ scripts }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - create startup service"
      ansible.builtin.template:
        src: templates/{{ my_file }}/{{ item.name }}.{{ item.type }}.j2
        dest: /usr/lib/systemd/system/{{ item.name }}.{{ item.type }}
        owner: root
        group: root
        mode: 0644
      with_items:
        - "{{ systemd_units }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - create symlinks for webui"
      ansible.builtin.file:
        src: "{{ retronas_root }}/scripts/{{ my_name }}-manager.sh"
        dest: "{{ retronas_root }}/scripts/{{ item }}.sh"
        owner: root
        group: root
        state: link
      with_items:
        - "{{ symlinks }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup service"
      ansible.builtin.service:
        name: "{{ item.name }}"
        state: started
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items:
        - "{{ systemd_units }}"
      when:
        - item.enabled == "yes"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
      with_items:
        - "{{ systemd_units }}"
      when:
        - item.restart == "yes"


================================================
FILE: ansible/install_hfsutils.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "hfsutils"
    my_file: "install_hfsutils"
    module_name: "hfsutils"

    packages:
      - git
      - autoconf
      - build-essential

    templates:
      - { name: "{{ my_file }}.sh",         dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_hostapd.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "hostapd"
    my_file: "install_{{ my_name }}"
    module_name: "hostapd"

    packages:
      - hostapd
      - pwgen

    my_services: "hostapd-retronas.service"

    templates:
      - { name: "hostapd-retronas.conf",    sub: "", dest: "/etc/{{ my_name }}", force: no, mode: "0640" }
      - { name: "hostapd-dnsmasq.conf",     sub: "", dest: "/etc/dnsmasq.d/retro/", force: no, mode: "0640" }
      - { name: "hostapd-retronas.service", sub: "", dest: "/etc/systemd/system" }

    paths:
      - { name: "dnsmasq.d",       dest: "/etc",              state: "directory", mode: "0755" }
      - { name: "retro",           dest: "/etc/dnsmasq.d",    state: "directory", mode: "0755" }


  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - generate password"
      shell:
        cmd: pwgen -s 12 1
      no_log: true
      register: retronas_wifi_password

    - name: "{{ my_name }} - generate unique ssid"
      shell:
        cmd: echo "retronas-$(pwgen 8 -A -0 -B 1)"
      no_log: true
      register: retronas_net_wifi_ssid
      when: retronas_net_wifi_ssid == ""

    - name: "{{ my_name }} - update wifi ssid config"
      lineinfile:
        path: /opt/retronas/ansible/retronas_vars.yml
        regexp: ^retronas_net_wifi_ssid.*
        line: 'retronas_net_wifi_ssid: "{{ retronas_net_wifi_ssid.stdout_lines[0] }}"'
      when: retronas_net_wifi_ssid is defined

    - name: "{{ my_name }}  - Re-read RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - enable"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon_reload: true
        force: true
      with_items: "{{ my_services }}"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
        force: true
      with_items: "{{ my_services }}"


================================================
FILE: ansible/install_kermit.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "kermit"
    my_file: "install_{{ my_name }}"
    module_name: "kermit"

    packages:
      - ckermit

    systemd_units:
      - { name: "iksd.socket", enabled: yes, state: 'restarted' }

    templates:
      - { name: "iksd@.service", dest: "/etc/systemd/system" }
      - { name: "iksd.socket", dest: "/etc/systemd/system" }

    firewalld_ports:
      - { port: 1649, protocol: tcp }

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - manage startup services"
      ansible.builtin.service:
        name: "{{ item.name }}"
        state: "{{ item.state|default('stopped') }}"
        enabled: "{{ item.enabled|default('no') }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_lighttpd.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "lighttpd"
    my_file: "install_{{ my_name }}"
    module_name: "lighttpd"

    packages:
      - { name: "nginx", state: "absent" }
      - { name: "{{ my_name }}", state: "latest" }

    config_settings_absent:
      - { section: null, option: "server.document-root"}
      - { section: null, option: "server.username"}
      - { section: null, option: "server.groupname"}

    templates:
      - { name: "99-retronas.conf", dest: "/etc/{{ my_name }}/conf-available", mode: "0640"}

    conf_enable:
      - "99-retronas.conf"

    systemd_units:
      - { name: "{{ my_name }}", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    firewalld_rules:
      - { service: "http" }
      - { service: "https" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - manage packages"
      ansible.builtin.package:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
      with_items: "{{ packages }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure main config"
      ansible.builtin.ini_file:
        path: /etc/{{ my_name }}/{{ my_name }}.conf
        section: "{{ item.section }}"
        option: "{{ item.option }}"
        state: absent
      with_items: "{{ config_settings_absent }}"
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - enable conf"
      ansible.builtin.file:
        src: /etc/{{ my_name }}/conf-available/{{ item }}
        dest: /etc/{{ my_name }}/conf-enabled/{{ item }}
        state: "link"
      with_items: "{{ conf_enable }}"

    - name: "{{ my_name }} - set logfile permissions"
      ansible.builtin.file:
        path: /var/log/{{ my_name }}
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory
        recurse: true

    - name: "{{ my_name }} - set run dir permissions"
      ansible.builtin.file:
        path: /var/run/{{ my_name }}
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory
        recurse: true

    - name: "{{ my_name }} - configure server.errorlog"
      ansible.builtin.ini_file:
        path: /etc/{{ my_name }}/{{ my_name }}.conf
        section: null
        option: server.errorlog
        state: absent
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item.name }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
      with_items: "{{ systemd_units }}"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}"
        state: restarted
      with_items: "{{ systemd_units }}"
      when: item.restart == "yes"


================================================
FILE: ansible/install_linux-dexdrive.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "linux-dexdrive"
    my_file: "install_{{ my_name }}"
    module_name: "linux-dexdrive"

    packages:
      - git
      - build-essential

    templates:
      - { name: "{{ my_file }}.sh",   dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "makefile.patch",     dest: "/tmp" }
      - { name: "dexdrive_dumper.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/etc/systemd/system" }

    systemd_units:
      - { name: "{{ my_name }}", type: 'service', state: "stopped", enabled: "no", restart: "no", instance: "no" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} daemon-reload"

    - name: "{{ my_name }} - build source"
      ansible.builtin.shell:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "/usr/local/bin/dexattach"

    - name: "{{ my_name }} - dexdrive module"
      ansible.builtin.lineinfile:
        path: /etc/modules-load.d/modules.conf
        regex: "^dexdrive$"
        line: "dexdrive"

    - name: "{{ my_name }} - {{ retronas_user }} groups"
      ansible.builtin.user:
        name: "{{ retronas_user }}"
        group: "disk"
        append: true

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} daemon-reload"
      ansible.builtin.systemd:
        daemon_reload: true


================================================
FILE: ansible/install_linux-gadgets.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "linux-gadgets"
    my_file: "install_{{ my_name }}"
    module_name: "linux-gadgets"

    templates:
      - { name: "gadget-mass-storage-manage.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

    paths:
      - { name: "images", dest: "{{ retronas_path }}", state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}"}

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_litch.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "litch"
    my_file: "install_litch"
    module_name: "litch"

    packages:
      - python3
      - python3-bs4
      - git

    templates:
      - { name: "litch_login.sh",          dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "litch_download.sh",       dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "litch_download_clean.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "litch_claim.sh",          dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - create GOG dir"
      ansible.builtin.file:
        path: "{{ retronas_path }}/itchio"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        mode: "0775"
        state: directory

    - name: "{{ my_name }} - download litch"
      ansible.builtin.shell:
        chdir: "{{ retronas_root }}/bin"
        cmd: "git clone https://github.com/sairuk/litch.git"
        creates: "{{ retronas_root }}/bin/litch"

    - name: "{{ my_name }} - update litch"
      ansible.builtin.shell:
        chdir: "{{ retronas_root }}/bin/litch"
        cmd: "git pull"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_lynx.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "lynx"
    my_file: "install_lynx"
    module_name: "lynx"

    packages:
      - lynx

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_macproxy_classic.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "macproxy_classic"
    my_file: "install_macproxy_classic"
    module_name: "macproxy_classic"

    packages:
      - python3
      - python3-venv
      - python3-pip

    service_name: "macproxy"

    templates:
      - { name: "{{ service_name }}.service", dest: "/etc/systemd/system" }

    repo: https://github.com/rdmark/macproxy_classic.git

    firewalld_ports:
      - { port: 5001, protocol: tcp }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - clone repo"
      ansible.builtin.git:
        repo: "{{ repo }}"
        dest: /opt/{{ my_name }}

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} Restart Services"
      ansible.builtin.service:
        name: "{{ service_name }}.service"
        state: started
        enabled: true
        daemon_reload: true


================================================
FILE: ansible/install_mc.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "mc"
    my_file: "install_mc"
    module_name: "mc"

    packages:
      - mc

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_megatools.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "megatools"
    my_file: "install_megatools"
    module_name: "megatools"

    packages_build:
      - build-essential
      - libglib2.0-dev
      - libssl-dev
      - libcurl4-openssl-dev
      - make
      - gcc
      - coreutils
      - meson
      - ninja-build

    packages:
      - megatools


    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - block:
      - name: "{{ my_name }} - Install distro package"
        ansible.builtin.import_role:
          name: retronas.role.package.latest
      rescue:
        - ansible.builtin.set_fact:
            package_distro: false
        - meta: clear_host_errors

    - block:
      - ansible.builtin.import_role:
          name: retronas.role.package.latest
        vars:
          packages: "{{ packages_build }}"

      - ansible.builtin.import_role:
          name: retronas.role.templates

      - name: "{{ my_name }} - build source"
        ansible.builtin.command:
          cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
          creates: "/usr/local/bin/megatools"
      when: not package_distro|default(true)

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_minicom.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "minicom"
    my_file: "install_{{ my_name }}"
    my_dir: ""
    module_name: "minicom"
    append_user_group: "dialout"

    packages:
      - minicom
      - lrzsz

    templates:
      - { name: "minirc.dfl", dest: "/etc/minicom", mode: "0644", owner: "{{ retronas_user }}", group: "{{ retronas_user }}", force: no }
      - { name: "minicom.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

    script_links:
      - { dest: "minicom-config.sh", src: "minicom.sh" }

    paths:
      - { name: "{{ my_name }}", dest: "/etc", state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_user }}" }
      - { name: "{{ my_name }}", dest: "{{ retronas_path }}", state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_user }}"}

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.update-user

    - name: "{{ my_name }} - script links"
      ansible.builtin.file:
        dest: "{{ retronas_root }}/scripts/{{ item.dest }}"
        src: "{{ retronas_root }}/scripts/{{ item.src }}"
        state: link
      with_items: "{{ script_links }}"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_mister-organize.yml
================================================
---
- hosts: localhost

  vars:
    my_name: "MiSTer Organize"
    my_file: "install_mister-organize"
    module_name: "mister-organize"

    packages:
      - git
      - curl
      - unzip

    paths:
      - { name: "mister-organize", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "romimport", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755", force: true}
      - { name: "mister-organize.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - ansible.builtin.assert:
        that: ansible_architecture == "x86_64"
        fail_msg: "Unsupported architecture"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS Systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from project repo"
      ansible.builtin.git:
        repo: "https://github.com/MiSTerOrganize/MiSTerOrganize.git"
        dest: "{{ retronas_path}}/{{ module_name }}"
        single_branch: true
        clone: true
        update: true
        force: true

    - name: "{{ my_name }} - setup local"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system
      vars:
        system_key: "{{ module_name }}"


================================================
FILE: ansible/install_mister_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "MiSTer CIFS"
    my_file: "install_mister_cifs"
    module_name: "mister_cifs"
    system_key: "mister"

    top_level_paths:
      - { name: "games",      enabled: yes,  generic: "roms",        systems: yes }
      - { name: "saves",      enabled: yes,  generic: "saves",       systems: yes }
      - { name: "savestates", enabled: yes,  generic: "savestates",  systems: yes }
      - { name: "BIOS",       enabled: yes,  generic: "bios",        systems: yes }
      - { name: "wallpapers", enabled: yes,  generic: "wallpapers",  systems: no  }

    save_overrides:
      - { name: "GAMEBOY2P", src: "nintendo/gameboy2p" }
      - { name: "GBA2P", src: "nintendo/gameboyadvance2p" }

    templates:
      #  - { name: "retronas_mister.conf", dest: "/etc/samba" }
      - { name: "retronas-mister-dirs.service", dest: "/etc/systemd/system" }
      - { name: "retronas-mister-dirs.timer", dest: "/etc/systemd/system" }

    systemd_units:
      - { name: "retronas-mister-dirs", type: 'service', state: "stopped", enabled: "no", restart: "no", instance: "no" }
      - { name: "retronas-mister-dirs", type: 'timer',   state: "stopped", enabled: "no", restart: "no", instance: "no" }

    dirs_only: false
    savedirs:
      - "saves"
      - "savestates"

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - name: "{{ my_name }} - create custom save directories"
      ansible.builtin.file:
        dest: "{{ retronas_path }}/{{ item.1 }}/{{ item.0.src|lower }}"
        state: directory
      loop: "{{ save_overrides|product(savedirs)|list }}"

    - name: "{{ my_name }} - create custom save links"
      ansible.builtin.file:
        src: "../../{{ item.1 }}/{{ item.0.src|lower }}"
        dest: "{{ retronas_path }}/{{ system_key }}/{{ item.1 }}/{{ item.0.name }}"
        state: link
      loop: "{{ save_overrides|product(savedirs)|list }}"

    - ansible.builtin.import_role:
        name: retronas.role.templates
      when: dirs_only is false

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} daemon-reload"
      ansible.builtin.systemd:
        daemon_reload: true


================================================
FILE: ansible/install_mtcp-netdrive.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "mtcp-netdrive"
    my_file: "install_mtcp-netdrive"
    module_name: "mtcp-netdrive"

    packages:
      - screen
      - curl
      - unzip

    paths:
      - { name: "{{ my_name }}", dest: "/opt", state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "install_mtcp-netdrive.sh", dest: "{{ retronas_root }}/scripts", mode: "0755", force: "yes" }
      - { name: "mtcp-netdrive.service", dest: "/etc/systemd/system", force: "yes" }
      - { name: "mtcp-netdrive.sh", dest: "{{ retronas_root }}/scripts", mode: "0755", force: "yes" }

    firewalld_rules:
      - { zones: retro, service: mtcp-netdrive }

    my_services:
      - mtcp-netdrive

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - install mtcp-netdrive"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon-reload: true
      with_items: "{{ my_services }}"

    #
    # FIREWALL
    #
    - name: "{{ my_name }} - checking firewall rule"
      ansible.builtin.stat:
        path: /etc/firewalld/services
      register: firewalld_services

    - name: "{{ my_name }} - Generate firewall service"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/mtcp-netdrive.xml.j2"
        dest: "/etc/firewalld/services/mtcp-netdrive.xml"
        owner: root
        group: root
        mode: 0644
      when: firewalld_services.stat.exists

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_mysticbbs.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "mysticbbs"
    my_file: "install_mysticbbs"
    module_name: "mysticbbs"

    packages:
      - p7zip-full
      - p7zip-rar
      - screen

    paths:
      - { name: "{{ my_name }}", dest: "/opt", state: "directory", mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "mysticbbs.sh", dest: "{{ retronas_root }}/scripts", mode: "0755", force: "yes" }
      - { name: "install_mysticbbs.sh", dest: "{{ retronas_root }}/scripts", mode: "0755", force: "yes" }
      - { name: "mysticbbs-mis.service", dest: "/etc/systemd/system", force: "yes" }
      - { name: "retronas_create_fileareas.ini", dest: "/opt/mysticbbs", force: "yes" }
      - { name: "retronas_massupload.ini", dest: "/opt/mysticbbs", force: "yes" }
      - { name: "create_filebone_na.py", dest: "/opt/mysticbbs", force: "yes" }

    firewalld_rules:
      - { zones: retro, service: mysticbbs }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Enable non-free repo for p7zip-rar"
      ansible.builtin.apt_repository:
        repo: deb http://deb.debian.org/debian/ {{ ansible_distribution_release }} main non-free-firmware non-free
        state: present

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - install mysticbbs"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"

    - name: "{{ my_name }} - daemon-reload"
      ansible.builtin.command:
        cmd: "systemctl daemon-reload"

    #
    # FIREWALL
    #
    - name: "{{ my_name }} - checking firewall rule"
      ansible.builtin.stat:
        path: /etc/firewalld/services
      register: firewalld_services

    - name: "{{ my_name }} - Generate firewall service"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/mysticbbs.xml.j2"
        dest: "/etc/firewalld/services/mysticbbs.xml"
        owner: root
        group: root
        mode: 0644
      when: firewalld_services.stat.exists

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_nabu.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "nabu"
    my_file: "install_{{ my_name }}"
    my_dir: /opt/nabu
    module_name: "nabu"

    systemd_units:
      - { name: "nabu", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    packages:
      - unzip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.sh", dest: "{{ retronas_root }}/scripts",  mode: "0755", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    links:
      - { dest: "/home/{{ retronas_user }}/NABU Internet Adapter", src: "{{ retronas_path }}/roms/nabu" }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - add {{ retronas_user }} to dialout group"
      ansible.builtin.user:
        name: "{{ retronas_user }}"
        group: "dialout"
        append: true

    - name: "{{ my_name }} - links"
      ansible.builtin.file:
        src: "{{ item.src }}"
        dest: "{{ item.dest }}"
        state: "{{ item.state|default('link') }}"
      with_items: "{{ links }}"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}} {{ my_dir }}/nabu.sh"


================================================
FILE: ansible/install_nbd-client.yml
================================================
---
- hosts: localhost

  vars:
    my_name: "nbd-client"
    my_file: "install_nbd-client"
    module_name: "nbd-client"

    packages:
      - nbd-client

    templates:
      - { name: "nbd.conf", dest: "/etc/modules-load.d/" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - enable ndb kernel module"
      ansible.builtin.shell:
        cmd: "modprobe nbd"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_netatalk2.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Netatalk2"
    my_file: "install_netatalk2"

    packages:
      - libacl1
      - libattr1
      - libavahi-client3
      - libavahi-common3
      - libc6
      - libcomerr2
      - libcrack2
      - libcups2
      - libdb5.3
      - libgcrypt20
      - libgssapi-krb5-2
      - libk5crypto3
      - libkrb5-3
      - libldap-2.4-2
      - libpam0g
      - libpam-modules
      - libwrap0
      - netbase
      - perl
      - aria2
      - avahi-daemon

  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.debug:
        msg: "No longer supported, use Netatalk 4"

    - ansible.builtin.assert:
        that: true == false

    - name: "{{ my_name }} - unhold netatalk package"
      ansible.builtin.shell: "/usr/bin/apt-mark unhold netatalk"

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - download package for arm64"
      ansible.builtin.shell:
        chdir: "/tmp"
        cmd: "aria2c --allow-overwrite=true http://mirror.aarnet.edu.au/pub/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_arm64.deb http://ftp.debian.org/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_arm64.deb"
      when: ansible_architecture == "aarch64"

    - name: "{{ my_name }} - download package for armhf"
      ansible.builtin.shell:
        chdir: "/tmp"
        cmd: "aria2c --allow-overwrite=true http://mirror.aarnet.edu.au/pub/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_armhf.deb http://ftp.debian.org/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_armhf.deb"
      when: ansible_architecture == "armhf"

    - name: "{{ my_name }} - download package for x86_64"
      ansible.builtin.shell:
        chdir: "/tmp"
        cmd: "aria2c --allow-overwrite=true http://mirror.aarnet.edu.au/pub/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_amd64.deb http://ftp.debian.org/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_amd64.deb"
      when: ansible_architecture == "x86_64"

    - name: "{{ my_name }} - download package for x86"
      ansible.builtin.shell:
        chdir: "/tmp"
        cmd: "aria2c --allow-overwrite=true http://mirror.aarnet.edu.au/pub/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_i386.deb http://ftp.debian.org/debian/pool/main/n/netatalk/netatalk_2.2.5-2+deb9u1_i386.deb"
      when: ansible_architecture == "i386"

    - name: "{{ my_name }} - install package"
      ansible.builtin.shell:
        chdir: "/tmp"
        cmd: "dpkg -i netatalk_2.2.5*.deb"

    - name: "{{ my_name }}  - hold netatalk package"
      ansible.builtin.shell: "/usr/bin/apt-mark hold netatalk"

    - name: "{{ my_name }} - configure /etc/default/netatalk"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/default.j2"
        dest: /etc/default/netatalk
        owner: root
        group: root
        mode: '0644'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure AppleVolumes.default"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/AppleVolumes.default.j2"
        dest: /etc/netatalk/AppleVolumes.default
        owner: root
        group: root
        mode: '0644'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure afpd.conf"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/afpd.conf.j2"
        dest: /etc/netatalk/afpd.conf
        owner: root
        group: root
        mode: '0644'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
      with_items:
        - avahi-daemon
        - netatalk

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
      with_items:
        - avahi-daemon
        - netatalk

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "netatalk2"
    module_state: "present"


================================================
FILE: ansible/install_netatalk2x.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Netatalk2.X"
    my_file: "install_netatalk2x"

    packages:
      - avahi-daemon
      - build-essential
      - make
      - automake
      - autoconf
      - libdb-dev
      - libdb++-dev
      - libavahi-common-dev
      - libavahi-client-dev
      - libavahi-core-dev
      - libdbus-1-dev
      - libssl-dev
      - autotools-dev
      - libtool
      - libcups2-dev
      - libavahi-client-dev
      - libgcrypt20-dev
      - expect
      - libltdl-dev
      - libtool-bin
      - libevent-dev

    services:
      - avahi-daemon
      - atalkd
      - afpd
      - papd
      - timelord
      - a2boot

    templates:
      - { name: "afpexpect.sh", dest: "{{ retronas_root }}/bin/netatalk2x/bin", mode: "0754" }
      - { name: "AppleVolumes.default", dest: "{{ retronas_root }}/bin/netatalk2x/etc/netatalk" }
      - { name: "afpd.conf", dest: "{{ retronas_root }}/bin/netatalk2x/etc/netatalk" }
      - { name: "atalkd.conf", dest: "{{ retronas_root }}/bin/netatalk2x/etc/netatalk" }

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }}  - check if  netatalk package is available"
      ansible.builtin.shell: "/usr/bin/apt-cache search netatalk | grep netatalk"
      register: result
      failed_when:
        - result.rc >= 2
      when:
        - ansible_distribution == "Debian"

    - block:
      - name: "{{ my_name }}  - unhold netatalk package"
        ansible.builtin.shell: "/usr/bin/apt-mark unhold netatalk"

      - name: "{{ my_name }}  - remove package-based Netatalk"
        ansible.builtin.package:
          name: netatalk
          state: absent

      - ansible.builtin.import_role:
          name: retronas.role.package.latest

      - name: "{{ my_name }} - create install script"
        ansible.builtin.template:
          src: "templates/{{ my_file }}/{{ my_file }}.sh.j2"
          dest: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
          owner: root
          group: root
          mode: '0755'

      - name: "{{ my_name }} - install from source"
        ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"

      - name: "{{ my_name }} - templates"
        ansible.builtin.template:
          src: "templates/{{ my_file }}/{{ item.name }}.j2"
          dest: "{{ item.dest }}/{{ item.name }}"
          owner: "{{ item.owner|default('root') }}"
          group: "{{ item.group|default('root') }}"
          mode: "{{ item.mode|default('0644') }}"
        with_items: "{{ templates }}"
        notify: "{{ my_name }} - Restart service"

      - name: "{{ my_name }} - enable startup services"
        ansible.builtin.service:
          name: "{{ item }}"
          state: started
          enabled: true
        with_items: "{{ services }}"
      when: 
        - result is defined
        - result.rc == 0

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
      with_items: "{{ services }}"

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "netatalk2x"
    module_state: "present"


================================================
FILE: ansible/install_netatalk3.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Netatalk3"
    my_file: "install_netatalk3"

    packages:
      - avahi-daemon
      - netatalk

    my_services:
      - avahi-daemon
      - netatalk

    config_settings:
      - { section: "Global", option: "uam list", value: "uams_guest.so uams_clrtxt.so uams_dhx.so uams_dhx2.so" }
      - { section: "Global", option: "hostname", value: "retroafp" }
      - { section: "Global", option: "mimic model", value: "PowerMac" }
      - { section: "Global", option: "zeroconf", value: "yes" }
      - { section: "Global", option: "log level", value: "info" }
      - { section: "Global", option: "log file", value: "/var/log/afp.log" }
      - { section: "Global", option: "afp listen", value: "0.0.0.0" }
      - { section: "Global", option: "include", value: "/etc/netatalk/retronas.conf" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - check if  netatalk package is available"
      ansible.builtin.shell: "/usr/bin/apt-cache search netatalk | grep netatalk"
      register: result
      failed_when:
        - result.rc >= 2

    - name: "{{ my_name }} - set fact if netatalk is not present"
      ansible.builtin.set_fact:
        no_netatalk: true
      when: result.rc == 1

    - name: "{{ my_name }} - end play if no netatalk package"
      ansible.builtin.meta: end_play
      when: no_netatalk is defined and no_netatalk is true

    - name: "{{ my_name }}  - unhold netatalk package"
      ansible.builtin.shell: "/usr/bin/apt-mark unhold netatalk"
      when: result.rc == 0

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }}  - configure"
      ansible.builtin.ini_file:
        dest: /etc/netatalk/afp.conf
        section: "{{ item.section }}"
        option: "{{ item.option }}"
        value: "{{ item.value }}"
      with_items: "{{ config_settings }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure retro shares"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/retronas.conf.j2"
        dest: /etc/netatalk/retronas.conf
        owner: root
        group: root
        mode: '0644'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
      with_items: "{{ my_services }}"

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
      with_items: "{{ my_services }}"

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "netatalk3"
    module_state: "present"
  when: no_netatalk is undefined


================================================
FILE: ansible/install_netatalk3_source.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Netatalk3"
    my_file: "install_netatalk3"

    packages:
      - avahi-daemon
      - build-essential
      - libevent-dev
      - libssl-dev
      - libgcrypt-dev
      - libkrb5-dev
      - libpam0g-dev
      - libwrap0-dev
      - libdb-dev
      - libtdb-dev
      - libavahi-client-dev
      - libacl1-dev
      - libldap2-dev
      - libcrack2-dev
      - systemtap-sdt-dev
      - libdbus-1-dev
      - libdbus-glib-1-dev
      - libglib2.0-dev
      - libio-socket-inet6-perl
      - tracker

    packages_debian:
      debian11:
        - libmysqlclient-dev
        - libtracker-sparql-2.0-dev
      debian12:
        - default-libmysqlclient-dev
        - libtracker-sparql-3.0-dev

    packages_ubuntu:
      - libmysqlclient-dev
      - libtracker-sparql-2.0-dev
      - libtracker-miner-2.0-dev


    my_services:
      - avahi-daemon
      - netatalk

    config_settings:
      - { section: "Global", option: "uam list", value: "uams_guest.so uams_clrtxt.so uams_dhx.so uams_dhx2.so" }
      - { section: "Global", option: "hostname", value: "retroafp" }
      - { section: "Global", option: "mimic model", value: "PowerMac" }
      - { section: "Global", option: "zeroconf", value: "yes" }
      - { section: "Global", option: "log level", value: "info" }
      - { section: "Global", option: "log file", value: "/var/log/afp.log" }
      - { section: "Global", option: "afp listen", value: "0.0.0.0" }
      - { section: "Global", option: "include", value: "/etc/netatalk/retronas.conf" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts/", mode: '0755'}
      - { name: "netatalk.service", dest: "/etc/systemd/system"}


  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }}  - check if  netatalk package is available"
      ansible.builtin.shell: "/usr/bin/apt-cache search netatalk | grep netatalk"
      register: result
      failed_when:
        - result.rc >= 2

    - name: "{{ my_name }} - unhold netatalk package"
      ansible.builtin.shell: "/usr/bin/apt-mark unhold netatalk"
      when: result.rc == 0

    - name: "{{ my_name }}  - remove package-based Netatalk"
      ansible.builtin.package:
        name: netatalk
        state: absent

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - Install build tools (debian)"
      ansible.builtin.package:
        name: "{{ packages_debian['debian' + ansible_distribution_major_version ] }}"
        state: latest
      when: ansible_distribution == 'Debian'

    - name: "{{ my_name }} - Install build tools (ubuntu)"
      ansible.builtin.package:  
        name: "{{ packages_ubuntu }}"
        state: latest
      when: ansible_distribution == 'Ubuntu'

    - name: "{{ my_name }} - templates"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ item.name }}.j2"
        dest: "{{ item.dest }}/{{ item.name }}"
        owner: "{{ item.owner|default('root') }}"
        group: "{{ item.group|default('root') }}"
        mode: "{{ item.mode|default('0644') }}"
      with_items: "{{ templates }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - install from source"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"

    - name: "{{ my_name }} - configure"
      ansible.builtin.ini_file:
        dest: /etc/netatalk/afp.conf
        section: "{{ item.section }}"
        option: "{{ item.option }}"
        value: "{{ item.value }}"
      with_items: "{{ config_settings }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure retro shares"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/retronas.conf.j2"
        dest: /etc/netatalk/retronas.conf
        owner: root
        group: root
        mode: '0644'
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
      with_items: "{{ my_services }}"

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon-reload: true
      with_items: "{{ my_services }}"

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "netatalk3"
    module_state: "present"


================================================
FILE: ansible/install_netatalk4.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Netatalk4"
    my_file: "install_netatalk4"
    module_name: "netatalk4"

    packages:
      - avahi-daemon
      - avahi-utils
      - bison
      - build-essential
      - cmark
      - flex
      - libacl1-dev
      - libavahi-client-dev
      - libcmark-dev
      - libcrack2-dev
      - libdb-dev
      - libdbus-1-dev
      - libdbus-glib-1-dev
      - libevent-dev
      - libgcrypt-dev
      - libglib2.0-dev
      - libiniparser-dev
      - libio-socket-inet6-perl
      - libkrb5-dev
      - libldap2-dev
      - libmptcpwrap0
      - libpam0g-dev
      - libssl-dev
      - libtdb-dev
      - libtirpc-dev
      - libtirpc3
      - libwrap0-dev
      - meson
      - ninja-build
      - po4a
      - systemtap-sdt-dev
      - tracker

    packages_debian:
      debian11:
        - libmysqlclient-dev
        - libtracker-sparql-2.0-dev
      debian12:
        - default-libmysqlclient-dev
        - libtracker-sparql-3.0-dev
      debian13:
        - default-libmysqlclient-dev
        - libtracker-sparql-3.0-dev


    packages_ubuntu:
      - libmysqlclient-dev
      - libtracker-sparql-2.0-dev
      - libtracker-miner-2.0-dev

    my_services:
      - avahi-daemon
      - atalkd
      - netatalk

    afp_settings:
      - { section: "Global", option: "uam list", value: "uams_guest.so uams_clrtxt.so uams_dhx.so uams_dhx2.so" }
      - { section: "Global", option: "hostname", value: "retroafp" }
      - { section: "Global", option: "mimic model", value: "PowerMac" }
      - { section: "Global", option: "zeroconf", value: "yes" }
      - { section: "Global", option: "log level", value: "info" }
      - { section: "Global", option: "log file", value: "/var/log/afp.log" }
      - { section: "Global", option: "afp listen", value: "0.0.0.0" }
      - { section: "Global", option: "appletalk", value: "yes" }
      - { section: "Global", option: "spotlight", value: "yes" }
      - { section: "Global", option: "legacy icon", value: "globe" }
    #  - { section: "Global", option: "include", value: "/opt/retronas/bin/netatalk4/etc/retronas.conf" }
      - { section: "retronas", option: "path", value: "{{ retronas_path }}" }
      - { section: "retronas", option: "rwlist", value: "{{ retronas_user }}" }
      - { section: "retronas", option: "rolist", value: "guest" }
      - { section: "retronas", option: "follow symlinks", value: "yes" }

    paths:
      - { name: "netatalk4", dest: "/opt/retronas/bin", mode: '0755'  }
      - { name: "etc", dest: "/opt/retronas/bin/netatalk4", mode: '0755'  }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts/", mode: '0755' }
    #  - { name: "retronas.conf", dest: "/opt/retronas/bin/netatalk4/etc" }

    old_services:
      - { name: "atalkd.service", dest: "/etc/systemd/system"}
      - { name: "netatalk.service", dest: "/etc/systemd/system"}

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }}  - check if netatalk package is available"
      ansible.builtin.shell: "/usr/bin/apt-cache search netatalk | grep netatalk"
      register: result
      failed_when:
        - result.rc >= 2

    - name: "{{ my_name }} - unhold netatalk package"
      ansible.builtin.shell: "/usr/bin/apt-mark unhold netatalk"
      when: result.rc == 0

    - name: "{{ my_name }} - remove package-based Netatalk"
      ansible.builtin.package:
        name: netatalk
        state: absent

    - name: "{{ my_name }} - remove old service files"
      ansible.builtin.stat:
        path: "{{ item.dest }}/{{ item.name }}"
      loop: "{{ old_services }}"
      register: old_services_check

    - name: "{{ my_name }} - Stopping existing netatalk service(s) during installation"
      ansible.builtin.service:
        name: "{{ item.stat.path }}"
        state: stopped
        daemon-reload: true
      loop: "{{ old_services_check.results }}"
      when: old_services_check is defined and
            item.stat.exists is true

    - name: "{{ my_name }} - Remove old service files"
      ansible.builtin.file:
        path: "{{ item.stat.path }}"
        state: absent
      loop: "{{ old_services_check.results }}"
      when: old_services_check is defined and
            item.stat.exists is true

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - Install build tools (debian)"
      ansible.builtin.package:
        name: "{{ packages_debian['debian' + ansible_distribution_major_version ] }}"
        state: latest
      when: ansible_distribution == 'Debian'

    - name: "{{ my_name }} - Install build tools (ubuntu)"
      ansible.builtin.package:
        name: "{{ packages_ubuntu }}"
        state: latest
      when: ansible_distribution == 'Ubuntu'

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - install from source"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"

    - name: "{{ my_name }} - configure"
      ansible.builtin.ini_file:
        dest: /opt/retronas/bin/netatalk4/etc/afp.conf
        section: "{{ item.section }}"
        option: "{{ item.option }}"
        value: "{{ item.value }}"
      with_items: "{{ afp_settings }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - atalkd"
      ansible.builtin.lineinfile:
        path: /opt/retronas/bin/netatalk4/etc/atalkd.conf
        regexp: "^{{ ansible_default_ipv4.interface }}.*"
        line: "{{ ansible_default_ipv4.interface }} -router -phase 2 -net 1 -zone \"retroafp\""

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
      with_items: "{{ my_services }}"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon-reload: true
      with_items: "{{ my_services }}"


================================================
FILE: ansible/install_netlink.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "netlink"
    my_file: "install_netlink"
    module_name: "netlink"

    packages:
      - curl
      - unzip
      - dnsmasq
      - dnsutils
      - libnetfilter-queue-dev
      - libnetfilter-queue1
      - ppp
      - arping
      - nftables
      - tcpd
      - wvdial
      - python3-pip

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/etc/systemd/system" }
      - { name: "{{ my_name }}.conf", dest: "/etc/dnsmasq.d" }
      - { name: "{{ my_name }}.patch", dest: "/tmp" }

    paths:
      - { name: "dnsmasq.d", dest: "/etc" }

    firewalld_ports:
      - { zone: modern, port: 65432, protocol: tcp }
      - { zone: modern, port: 20001, protocol: udp }
      - { zone: modern, port: 20002, protocol: udp }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash
      notify: "{{ my_name }} Restart Services"

    - name: "{{ my_name }} - Patch com port range detection"
      ansible.builtin.patch:
        src: /tmp/{{ my_name }}.patch
        dest: /opt/{{ my_name }}/tunnel.py

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:
    - name: "{{ my_name }} Restart Services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon_reload: true
      with_items:
        - "{{ my_name }}.service"


================================================
FILE: ansible/install_netmount.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "netmount"
    my_file: "install_netmount"
    module_name: "netmount"

    packages:
      - bzip2
      - python3
      - python3-yaml

    systemd_units:
      - { name: "netmount-drives-retronas", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    templates:
      - { name: "{{ my_file }}.sh",         dest: "{{ retronas_root }}/scripts",         mode: "0755" }
      - { name: "netmount-confman.py",      dest: "{{ retronas_root }}/scripts",         mode: "0755" }
      - { name: "netmount-confman.sh",      dest: "{{ retronas_root }}/scripts",         mode: "0755" }
      - { name: "retronas.yaml",            dest: "{{ retronas_path }}/config/netmount", mode: "0755" }

    firewalld_rules:
      - { zones: retro, service: netmount }

    paths:
        - dos
        - config/netmount

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - build top level"
      ansible.builtin.file:
        path: "{{ retronas_path }}/{{ item }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory
        mode: "0775"
      loop: "{{ paths }}"
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from git"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "/opt/netmount/netmount"

    - name: "{{ my_name }} - Build service files"
      ansible.builtin.shell: "python3 {{ retronas_root }}/scripts/netmount-confman.py"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'



================================================
FILE: ansible/install_network-presets-ethernet-dhcp.yml
================================================
---
# networkmanager
- ansible.builtin.import_playbook: install_networkmanager.yml

- hosts: localhost
  gather_facts: false

  vars:
    my_name: "network-presets-standalone-ethernet-dhcp"
    my_file: "install_{{ my_name }}"

    connections:
      - { name: "ethernet", state: "absent" }  # remove it first because modules are a pain some times
      - { name: "wifi-retronas", state: "absent" }
      - { name: "ethernet", ipv4method: "auto", ifname: "{{ retronas_net_retro_interface }}", type: "ethernet" }

    disable_services:
      - dhcpcd
      - dnsmasq-retro
      - firewalld
      - hostapd-retronas

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "config connections"
      community.general.nmcli:
        type: "{{ item.type | default('ethernet') }}"
        conn_name: "{{ item.name }}"
        ip4: "{{ item.ipv4addr | default(omit) }}"
        gw4: "{{ item.ipv4gw | default(omit) }}"
        dns4: "{{ item.ipv4dns | default(omit) }}"
        method4: "{{ item.ipv4method | default('manual') }}"
        ifname: "{{ item.ifname | default(omit) }}"
        route_metric4: "{{ item.metric | default(omit) }}"
        state: "{{ item.state| default('present') }}"
        autoconnect: true
      with_items:
        - '{{ connections }}'

    - name: "{{ my_name }} - check which services is installed"
      ansible.builtin.stat:
        path: /usr/lib/systemd/system/{{ item }}.service
      loop: "{{ disable_services }}"
      register: services_installed

    - name: "{{ my_name }} - back to dhcp, turn off our services"
      ansible.builtin.service:
        name: "{{ item.item }}"
        state: stopped
        enabled: false
        force: true
      loop: "{{ services_installed.results }}"
      when: item.stat.exists is true

# alt presets removed
- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-standalone"
    module_state: "absent"

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-zoned"
    module_state: "absent"


================================================
FILE: ansible/install_network-presets-standalone.yml
================================================
---
# networkmanager
- ansible.builtin.import_playbook: install_networkmanager.yml

# hostapd
# using NM api mode now
# - ansible.builtin.import_playbook: install_hostapd.yml

# dnsmassq
# IMPORTED IN DNSMASQ-RETRO - ansible.builtin.import_playbook: install_dnsmasq.yml
- ansible.builtin.import_playbook: install_dnsmasq-retro.yml

# ntp
- ansible.builtin.import_playbook: install_ntp.yml

# dhpcd
# - ansible.builtin.import_playbook: install_dhcpcd.yml


- hosts: localhost
  gather_facts: true

  vars:
    my_name: "network-presets-standalone"
    my_file: "install_{{ my_name }}"

    templates:
      - { name: "dhcpcd.conf",         dest: "/etc",  mode: "0640", force: "yes" }

    connections:
      - { name: "ethernet", state: "absent" }
      - { name: "wifi-retronas", state: "absent" }

    my_packages:
      - pwgen

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Install packages"
      ansible.builtin.package:
        name: "{{ my_packages }}"
        state: latest

    - name: "{{ my_name }} - generate password"
      shell:
        cmd: pwgen -s 12 1
      no_log: true
      changed_when: false
      register: retronas_wifi_password

    - name: "{{ my_name }} - generate unique ssid"
      shell:
        cmd: echo "retronas-$(pwgen 8 -A -0 -B 1)"
      register: retronas_net_wifi_ssid_generated
      changed_when: false
      when: retronas_net_wifi_ssid == ""

    - name: "{{ my_name }} - config connections"
      community.general.nmcli:
        type: "{{ item.type | default('ethernet') }}"
        conn_name: "{{ item.name }}"
        ip4: "{{ item.ipv4addr | default(omit) }}"
        gw4: "{{ item.ipv4gw | default(omit) }}"
        dns4: "{{ item.ipv4dns | default(omit) }}"
        method4: "{{ item.ipv4method | default('manual') }}"
        ifname: "{{ item.ifname | default(omit) }}"
        route_metric4: "{{ item.metric | default(omit) }}"
        state: "{{ item.state| default('present') }}"
        autoconnect: true
      with_items:
        - '{{ connections }}'

    - name: "{{ my_name }} - config ethernet"
      community.general.nmcli:
        type: "ethernet"
        conn_name: "ethernet"
        ifname: "{{ retronas_net_retro_interface }}"
        ip4: "{{ retronas_net_retro_ip }}/{{ retronas_net_retro_subnet }}"
        gw4: "{{ retronas_net_retro_router }}"
        dns4: "{{ retronas_net_retro_dns }}"
        method4: "manual"
        state: "present"
        autoconnect: true

    - name: "{{ my_name }} - configure wifi ap"
      community.general.nmcli:
        type: "wifi"
        conn_name: "wifi-retronas"
        ifname: "{{ retronas_net_wifi_interface }}"
        ssid: "{{ retronas_net_wifi_ssid if retronas_net_wifi_ssid_generated == '' else retronas_net_wifi_ssid_generated.stdout }}"
        ip4: "{{ retronas_net_wifi_ip }}/{{ retronas_net_wifi_subnet }}"
        # gw4: "{{ retronas_net_wifi_router }}"
        never_default4: true
        dns4: "{{ retronas_net_wifi_dns }}"
        method4: "manual"
        wifi_sec:
          key-mgmt: wpa-psk
          psk: "{{ retronas_wifi_password.stdout }}"
        wifi:
          mode: "ap"
          channel: "{{ retronas_net_wifi_channel }}"
          band: "{{ retronas_net_wifi_hwmode }}"
        state: present
        autoconnect: true

    - name: "{{ my_name }} - templates"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ item.name }}.j2"
        dest: "{{ item.dest }}/{{ item.name }}"
        owner: "{{ item.owner|default('root') }}"
        group: "{{ item.group|default('root') }}"
        mode: "{{ item.mode|default('0644') }}"
        force: "{{ item.force|default('yes') }}"
      loop: "{{ templates }}"

    - name: "{{ my_name }} - check firewalld is installed"
      ansible.builtin.stat:
        path: /usr/lib/systemd/system/firewalld.service
      register: firewalld_installed

    - name: "{{ my_name }}  - everything is retro here so disabling the firewalld zoned config"
      ansible.builtin.service:
        name: firewalld.service
        state: stopped
        enabled: false
        force: true
      when: firewalld_installed.stat.exists is true

    - name: "{{ my_name }} - check dhcpcd is installed"
      ansible.builtin.stat:
        path: /usr/lib/systemd/system/dhcpcd.service
      register: dhcpcd_installed

    - name: "{{ my_name }} - restart dhcpcd"
      ansible.builtin.service:
        name: dhcpcd.service
        state: stopped
        enabled: false
        force: true
      when: dhcpcd_installed.stat.exists is true

    - name: "{{ my_name }} - check hostapd is installed"
      ansible.builtin.stat:
        path: /usr/lib/systemd/system/hostapd.service
      register: hostapd_installed

    - name: "{{ my_name }} - remove hostapd dnsmasq configuration"
      ansible.builtin.file:
        path: /etc/dnsmasq.d/retro/hostapd-dnsmasq.conf
        state: absent
      when: hostapd_installed.stat.exists is true

    - name: "{{ my_name }} - stop hostapd"
      ansible.builtin.service:
        name: hostapd-retronas.service
        state: stopped
        enabled: false
        force: true
      when: hostapd_installed.stat.exists is true

    - name: "{{ my_name }} - restart dnsmasq"
      ansible.builtin.service:
        name: dnsmasq-retro.service
        state: restarted
        enabled: true
        force: true

# alt preset removed
- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-zoned"
    module_state: "absent"

# this preset added
- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-standalone"
    module_state: "present"


================================================
FILE: ansible/install_network-presets-zoned.yml
================================================
---
# networkmanager
- ansible.builtin.import_playbook: install_networkmanager.yml

# firewalld
- ansible.builtin.import_playbook: install_firewalld.yml
- ansible.builtin.import_playbook: install_firewalld-zones.yml

# dnsmasq
# IMPORTED IN DNSMASQ-RETRO - ansible.builtin.import_playbook: install_dnsmasq.yml
- ansible.builtin.import_playbook: install_dnsmasq-retro.yml

# ntp
- ansible.builtin.import_playbook: install_ntp.yml

# dhcpcd
- ansible.builtin.import_playbook: install_dhcpcd.yml


- hosts: localhost
  gather_facts: false

  vars:
    my_name: "network-presets-zoned"
    my_file: "install_{{ my_name }}"

    templates:
      - { name: "dhcpcd.conf", dest: "/etc", mode: "0640", force: "yes" }

    connections:
      - { name: "ethernet", state: "absent" }  # remove it first because modules are a pain some times
      - { name: "wifi-retronas", state: "absent" }
      - { name: "ethernet", ipv4addr: "{{ retronas_net_retro_ip }}/{{ retronas_net_retro_subnet }}", ipv4dns: "{{ retronas_net_retro_dns }}", ipv4method: "manual", ifname: "{{ retronas_net_retro_interface }}", type: "ethernet", ipv4never_default4: true }

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "config connections"
      community.general.nmcli:
        type: "{{ item.type | default('ethernet') }}"
        conn_name: "{{ item.name }}"
        ip4: "{{ item.ipv4addr | default(omit) }}"
        gw4: "{{ item.ipv4gw | default(omit) }}"
        never_default4: "{{ item.ipv4never_default4 | default(omit) }}"
        dns4: "{{ item.ipv4dns | default(omit) }}"
        method4: "{{ item.ipv4method | default('manual') }}"
        ifname: "{{ item.ifname | default(omit) }}"
        route_metric4: "{{ item.metric | default(omit) }}"
        state: "{{ item.state| default('present') }}"
        autoconnect: true
      with_items:
        - '{{ connections }}'

    - name: "{{ my_name }} - check hostapd is installed"
      ansible.builtin.stat:
        path: /usr/lib/systemd/system/hostapd.service
      register: hostapd_installed

    - name: "{{ my_name }} - remove hostapd dnsmasq configuration"
      ansible.builtin.file:
        path: /etc/dnsmasq.d/retro/hostapd-dnsmasq.conf
        state: absent
      when: hostapd_installed.stat.exists is true

    - name: "{{ my_name }} - stop hostapd"
      ansible.builtin.service:
        name: hostapd-retronas.service
        state: stopped
        enabled: false
        force: true
      when: hostapd_installed.stat.exists is true

    - name: "{{ my_name }} - templates"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ item.name }}.j2"
        dest: "{{ item.dest }}/{{ item.name }}"
        owner: "{{ item.owner|default('root') }}"
        group: "{{ item.group|default('root') }}"
        mode: "{{ item.mode|default('0644') }}"
        force: "{{ item.force|default('yes') }}"
      with_items: "{{ templates }}"

    - name: "{{ my_name }} - restart dhcpcd"
      ansible.builtin.service:
        name: dhcpcd.service
        state: restarted
        enabled: true
        force: true

    - name: "{{ my_name }} - restart dnsmasq"
      ansible.builtin.service:
        name: dnsmasq-retro.service
        state: restarted
        enabled: true
        force: true

    - name: "{{ my_name }} - start firewalld"
      ansible.builtin.service:
        name: firewalld.service
        state: restarted
        enabled: true
        force: true

# alt preset removed
- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-standalone"
    module_state: "absent"

# this preset added
- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "network-presets-zoned"
    module_state: "present"


================================================
FILE: ansible/install_networkmanager.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "network manager"
    my_file: "install_{{ my_name }}"
    my_services: "NetworkManager.service"

    collections:
      - { collection: community.general, creates: community/general/nmcli }

  tasks:

    - name: "{{ my_name }} - does nothing"
      debug:
        msg: "currently does nothing"


================================================
FILE: ansible/install_nfs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    module_name: "nfs"

  tasks:

    - ansible.builtin.import_role:
        name: retronas.role.nfs


================================================
FILE: ansible/install_nginx.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    module_name: "nginx"

  roles:
    - retronas.role.sslcert
    - retronas.role.nginx
    - retronas.role.system-config


================================================
FILE: ansible/install_ntp.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "ntp"
    my_service: "openntpd"
    my_file: "install_ntp"
    module_name: "ntp"

    packages:
      - openntpd

    remove_packages:
      - ntp

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - name: "{{ my_name }} - remove packages"
      ansible.builtin.package:
        name: "{{ remove_packages }}"
        state: absent

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - listen"
      ansible.builtin.lineinfile:
        path: "/etc/openntpd/ntpd.conf"
        search_string: "^listen on *$"
        insertafter: "^# Addresses to listen on (ntpd does not listen by default)$"
        line: "listen on *"
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "openntpd.service"
        state: restarted
        daemon_reload: true
        enabled: true


================================================
FILE: ansible/install_open-iscsi.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "open-iscsi"
    my_file: "install_{{ my_name }}"
    module_name: "open-iscsi"

    packages:
      - open-iscsi

    my_services:
      - open-iscsi

    templates:
      - { name: "iscsi-manager-target-login.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Enable startup services"
      ansible.builtin.service:
        name: ssh
        state: started
        enabled: true

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_openssh.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "OpenSSH"
    module_name: "openssh"

    packages:
      - openssh-client
      - openssh-server
      - openssh-sftp-server

    firewalld_rules:
      - { zone: retro, service: ssh }
      - { zone: modern, service: ssh }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest
      notify: "{{ my_name }} - Restart ssh"

    - name: "{{ my_name }} - Enable startup services"
      ansible.builtin.service:
        name: ssh
        state: started
        enabled: true

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart ssh"
      ansible.builtin.service:
        name: ssh
        state: restarted


================================================
FILE: ansible/install_pandoc.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    - my_name: "pandoc"
    - my_file: "install_pandoc"

    - packages:
        - pandoc

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Install packages"
      package:
        name: "{{ packages }}"
        state: latest

- ansible.builtin.import_playbook: retronas_system_config.yml
  vars:
    module_name: "pandoc"
    module_state: "present"


================================================
FILE: ansible/install_pfsshell.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "pfsshell"
    my_file: "install_pfsshell"
    module_name: "pfsshell"

    packages:
      - make
      - gcc
      - coreutils
      - meson
      - ninja-build
      - libfuse-dev

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - install script"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ my_file }}.sh.j2"
        dest: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        owner: root
        group: root
        mode: '0750'

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "/usr/local/bin/pfsfuse"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_pi1541.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "pi1541"
    my_file: "install_{{ my_name }}"
    module_name: "pi1541"

    paths:
      - { name: "{{ my_name }}", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "{{ my_name }}", dest: "/mnt" }

    templates:
      - { name: "{{ my_name }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_piscsi.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "piscsi"
    my_file: "install_piscsi"
    module_name: "piscsi"

    packages:
      - bridge-utils
      - build-essential
      - disktype
      - clang
      - genisoimage
      - git
      - libev-dev
      - libevdev2
      - libgmock-dev
      - libpcap-dev
      - libpcap0.8-dev
      - libprotobuf-dev
      - libspdlog-dev
      - man2html
      - nginx-light
      - protobuf-compiler
      - python3
      - python3-dev
      - python3-pip
      - python3-setuptools
      - python3-venv
      - python3-wheel
      - unar
      - unzip
      - ca-certificates
      - dosfstools
      - kpartx
      - unzip
      - unar
      - gettext
      - rsyslog

    paths:
      - { name: "{{ my_name }}", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: '{{ retronas_group }}' }
      - { name: "src", dest: "{{ retronas_root }}", owner: "{{ retronas_user }}", group: '{{ retronas_group }}' }
      - { name: "{{ my_name }}", src: "{{ retronas_path }}/{{ my_name }}", dest: "/home/{{ retronas_user }}", state: "link" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "{{ my_file }}_standard.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}
      - { name: "{{ my_name }}_retronas_patch.diff", dest: "{{ retronas_root }}/src"}
      - { name: "{{ my_name }}.service", dest: "/etc/systemd/system"}

    systemd_units:
      - { name: "rsyslog", type: 'service', state: "restarted", enabled: "yes", restart: "yes", instance: "no" }
      - { name: "piscsi", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      include_vars: retronas_vars.yml

    # libpcap can conflict with libpcap from backport (tcpdump etc)
    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/install_{{ my_name }}.sh"
        creates: "{{ retronas_root }}/bin/{{ my_name }}/{{ my_name }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - password file"
      ansible.builtin.copy:
        dest: /etc/{{ my_name }}_passwd
        content: retronas
        mode: 0600
        owner: root
        group: root

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'


================================================
FILE: ansible/install_proftpd.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "ProFTPd"
    my_file: "install_proftpd"
    module_name: "proftpd"

    packages:
      - avahi-daemon
      - proftpd-core

    templates:
      - { name: "retronas.conf", dest: "/etc/proftpd/conf.d" }
      - { name: "ftp.service", dest: "/etc/avahi/services" }

    firewalld_rules:
      - { name: ftp, zone: retro }
      - { name: ftp, zone: modern }

  tasks:

    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - remove  mod_unique_id.c"
      ansible.builtin.ini_file:
        path: /etc/proftpd/modules.conf
        section: null
        option: "LoadModule mod_unique_id.c"
        state: absent
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: proftpd
        state: started
        enabled: true

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
      with_items:
        - avahi-daemon
        - proftpd


================================================
FILE: ansible/install_ps2_openps2loader.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "PS2 OpenPS2Loader"
    my_file: "install_ps2_openps2loader"
    my_dir: "{{ retronas_path }}/ps2/OpenPS2Loader"
    module_name: "ps2_openps2loader"

    paths:
      - { name: "APPS",   dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "ART",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "CFG",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "CHT",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "LNG",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "THM",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }
      - { name: "VMC",    dest: "{{ my_dir }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "retronas_ps2.conf", dest: "/etc/samba" }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - name: "{{ my_name }} - check old pops dir"
      ansible.builtin.stat:
        path: "{{ my_dir }}/POPS"
      register: old_pops

    - debug:
        msg: "{{ old_pops }}"

    - name: "{{ my_name }} - rename old pops dir"
      ansible.builtin.shell:
        cmd: "mv {{ my_dir }}/POPS {{ my_dir }}/POPS-OLD"
      when: old_pops.stat.exists is true

    - name: "{{ my_name }} - build symlinks"
      ansible.builtin.file:
        src: "../../roms/{{ item.src }}"
        dest: "{{ my_dir }}/{{ item.ops2l }}"
        state: link
      loop: "{{ system_map }}"
      when:
        - item.ops2l | length > 0

    - name: "{{ my_name }} - configure includes file"
      ansible.builtin.ini_file:
        path: /etc/samba/smb.conf
        section: ps2
        option: "include"
        value: "/etc/samba/retronas_ps2.conf"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.system-config

    - ansible.builtin.import_role:
        name: retronas.role.samba


================================================
FILE: ansible/install_ps2_udpbd.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "ps2_udpbd"
    my_file: "install_ps2_udpbd"
    module_name: "ps2_udpbd"
    append_user_group: "disk"

    systemd_units:
      - { name: "ps2_udpbd", type: 'service', state: "stopped", enabled: "no", restart: "no", instance: "no" }

    packages:
      - make
      - gcc
      - g++
      - git
      - build-essential

    paths:
      - { name: "{{ my_name }}", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "udpbd_manager.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.service", dest: "/etc/systemd/system" }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}} /bin/ps2_udpbd"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.update-user

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'


================================================
FILE: ansible/install_ps3netsrv.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "ps3netsrv"
    my_file: "install_ps3netsrv"
    module_name: "ps3netsrv"
    system_key: "ps3netsrv"

    systemd_units:
      - { name: "ps3netsrv", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }
      - { name: "ps3netsrv-perms", type: 'service', state: "started", enabled: "no", restart: "yes", instance: "no" }
      - { name: "ps3netsrv-perms", type: 'timer', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    packages:
      - make
      - automake
      - autoconf
      - gcc
      - g++
      - meson
      - ninja-build
      - curl
      - wget
      - build-essential
      - unzip
      - libmbedtls-dev
      - coreutils
      - jq

    packages_debian:
      debian10:
        - libmbedtls12
      debian11:
        - libmbedtls12
      debian12:
        - libmbedtls14
      debian13:
        - libmbedtls21

    packages_ubuntu:
      - libmbedtls14

    templates:
      - { name: "{{ my_file }}.sh",         dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "ps3netsrv.service",        dest: "/usr/lib/systemd/system" }
      - { name: "ps3netsrv-perms.service",  dest: "/usr/lib/systemd/system" }
      - { name: "ps3netsrv-perms.timer",    dest: "/usr/lib/systemd/system" }

    firewalld_rules:
      - { zones: retro, service: ps3netsrv }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - Install build tools (debian)"
      ansible.builtin.package:
        name: "{{ packages_debian['debian' + ansible_distribution_major_version] }}"
        state: latest
      when: ansible_distribution == 'Debian'

    - name: "{{ my_name }} - Install build tools (ubuntu)"
      ansible.builtin.package:
        name: "{{ packages_ubuntu }}"
        state: latest
      when: ansible_distribution == 'Ubuntu'

    - name: "{{ my_name }} - build top level"
      ansible.builtin.file:
        path: "{{ retronas_path }}/ps3/ps3netsrv"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: directory
        mode: "0775"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - build layout"
      ansible.builtin.file:
        src: "../../roms/{{ item.src }}"
        dest: "{{ retronas_path }}/ps3/ps3netsrv/{{ item.ps3netsrv }}"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: link
      loop: "{{ system_map }}"
      when:
        - item.ps3netsrv | length > 0

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}}/bin/ps3netsrv"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.instance == 'no'
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      when:
        - item.restart == 'yes'
        - item.instance == 'no'

    - name: "{{ my_name }} - Restart instances"
      ansible.builtin.service:
        name: "{{ item.1.name }}{{ item.0.dest }}.{{ item.1.type }}"
        state: restarted
        daemon_reload: true
      with_items:
        - "{{ system_map }}"
        - "{{ systemd_units }}"
      when:
        - item.1.restart == 'yes'
        - item.1.instance == 'yes'


================================================
FILE: ansible/install_pygopherd.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "pygopherd"
    my_file: "install_pygopherd"
    module_name: "pygopherd"

    packages:
      - python3

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "{{ my_name }}.conf", dest: "{{ retronas_root }}/etc" }
      - { name: "{{ my_name }}.service", dest: "/usr/lib/systemd/system" }

    firewalld_ports:
      - { port: 70, protocol: tcp }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "opt/pygopherd/bin/pygopherd"
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
      with_items:
        - "{{ my_name }}"


================================================
FILE: ansible/install_rclone.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "rclone"
    my_file: "install_rclone"
    module_name: "rclone"

    packages:
      - rclone

    templates:
      - { name: "{{ my_name }}-webui.service", dest: "/etc/systemd/system", mode: "0644" }

    services:
      - "{{ my_name }}-webui.service"

    firewalld_ports:
      - { port: 5572, protocol: tcp, zone: retro }
      - { port: 5572, protocol: tcp, zone: modern }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.htpasswd
      notify: "{{ my_name }} - Restart service"

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        enabled: true
        state: restarted
        daemon_reload: true
      loop: "{{ services }}"


================================================
FILE: ansible/install_recalbox_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "Recalbox CIFS"
    my_file: "install_recalbox_cifs"
    module_name: "recalbox_cifs"
    system_key: "recalbox"

    top_level_paths:
      - { name: "ROMS",  enabled: yes,  generic: "roms",  systems: yes }
      - { name: "SAVES", enabled: yes,  generic: "saves", systems: yes  }
      - { name: "BIOS",  enabled: yes,  generic: "bios",  systems: yes  }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_redumper.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "redumper"
    my_file: "install_{{ my_name }}"
    module_name: "redumper"

    packages:
      - unzip
      - jq

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}}/bin/ps3netsrv"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_retroaimserver.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "retroaimserver"
    my_file: "install_retroaimserver"
    my_dir: "/opt/retro-aim-server"
    module_name: "retroaimserver"

    systemd_units:
      - { name: "retro-aim-server", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    packages:
      - curl

    templates:
      - { name: "{{ my_file }}.sh",         dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "retro-aim-server.service", dest: "/etc/systemd/system/" }

    firewalld_rules:
      - { zones: retro, service: retroaimserver }

    settings_env:
      - { regex: "^export OSCAR_HOST=.*", line: "export OSCAR_HOST={{ retronas_net_retro_ip }}" }
      - { regex: "^export DISABLE_AUTH=true", line: "export DISABLE_AUTH=false" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ my_dir }}/retro_aim_server"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - configure defaults"
      ansible.builtin.lineinfile:
        path: "{{ my_dir }}/settings.env"
        regexp: "{{ item.regex }}"
        line: "{{ item.line }}"
      with_items: "{{ settings_env }}"

    #
    # FIREWALL
    #
    - name: "{{ my_name }} - checking firewall rule"
      ansible.builtin.stat:
        path: /etc/firewalld/services
      register: firewalld_services

    - name: "{{ my_name }} - Generate firewall service"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/retroaimserver.xml.j2"
        dest: "/etc/firewalld/services/retroaimserver.xml"
        owner: root
        group: root
        mode: 0644
      when: firewalld_services.stat.exists

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"


================================================
FILE: ansible/install_retroarch_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "RetroArch Based Systems CIFS"
    my_file: "install_retroarch_cifs"
    module_name: "retroarch_cifs"
    system_key: "retroarch"

  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_retrodeck_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "retrodeck CIFS"
    my_file: "install_retrodeck_cifs"
    module_name: "retrodeck_cifs"
    system_key: "retrodeck"

    top_level_paths:
      - { name: "roms",   enabled: yes,  generic: "roms",   systems: yes }
    #  - { name: "saves",  enabled: yes,  generic: "saves",  systems: yes }
      - { name: "bios",   enabled: yes,  generic: "bios",   systems: yes }

    internal_symlinks:
      - { src: 'commodore/amiga', dest: 'ags' }
      - { src: 'commodore/amiga', dest: 'amiga600' }
      - { src: 'capcom/cps1', dest: 'cps' }
      - { src: 'mame/mame', dest: 'mame-advmame' }
      - { src: 'nec/pcenginecd', dest: 'tg-cd' }
      - { src: 'sega/megacd', dest: 'segacd' }
      - { src: 'sega/megacd', dest: 'megacdjp' }
      - { src: 'sega/megadrive', dest: 'genesis' }
      - { src: 'sega/megadrive', dest: 'megadrivejp' }
      - { src: 'snk/neogeocd', dest: 'neogeocdjp' }
      - { src: 'sega/saturn', dest: 'saturnjp' }
      - { src: 'sega/32x', dest: 'sega32xjp' }
      - { src: 'sega/32x', dest: 'sega32xna' }
      - { src: 'nintendo/superfamicom', dest: 'sneshd' }
      - { src: 'nintendo/superfamicom', dest: 'snesna' }

  tasks:
    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_romdir.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    module_name: "romdir"

  tasks:
    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_romimport.yml
================================================
---
- hosts: localhost

  vars:
    my_name: "ROM Import"
    my_file: "install_romimport"
    module_name: "romimport"

    packages:
      - python3
      - git

    paths:
      - { name: "romimport", dest: "{{ retronas_path }}", owner: "{{ retronas_user }}", group: "{{ retronas_group }}" }

    templates:
      - { name: "romimport.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Load RetroNAS Systems"
      ansible.builtin.include_vars: retronas_systems.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Install from source code"
      ansible.builtin.shell: "git clone https://github.com/frederic-mahe/Hardware-Target-Game-Database.git"
      args:
        chdir: "{{ retronas_root}}/bin"
        creates: "{{ retronas_root}}/bin/Hardware-Target-Game-Database"

    - name: "{{ my_name }} - set SMBD permissions"
      ansible.builtin.shell: "chown -R {{ retronas_user}}:{{ retronas_user }} Hardware-Target-Game-Database"
      args:
        chdir: "{{ retronas_root}}/bin"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_romm_cifs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "RomM CIFS"
    my_file: "install_romm_cifs"
    module_name: "romm_cifs"
    system_key: "romm"
    script_url: 'https://raw.githubusercontent.com/minorOffense/romdirflattener/refs/heads/main/flatten-romdir.sh'
    script_dest: "{{ retronas_root }}/bin/flatten-romdir.sh"
    fattenerscript: "retronas-romm-dirs"

    top_level_paths:
      - { name: "roms",   enabled: yes,  generic: "roms",   systems: yes }

    templates:
      - { name: "retronas-romm-dirs.service", dest: "/etc/systemd/system" }
      - { name: "retronas-romm-dirs.timer", dest: "/etc/systemd/system" }
      - { name: "retronas-romm-dirs.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

    systemd_units:
      - { name: "retronas-romm-dirs", type: 'service', state: "stopped", enabled: "no", restart: "no", instance: "no" }
      - { name: "retronas-romm-dirs", type: 'timer',   state: "started", enabled: "yes", restart: "no", instance: "no" }

    # needs review or be handled in the flatten script  
    #internal_symlinks:
    #  - { src: 'sega/advancedpicobeena', dest: 'beena' }
    #  - { src: 'panasonic/3do', dest: 'panasonic-m2' }
    #  - { src: 'apple/pippin', dest: 'pippin' }
    #  - { src: 'interton/vc4000', dest: 'vc-4000' }
    #  - { src: 'tandy/vis', dest: 'vis' }
    #  - { src: 'tapwave/zodiac', dest: 'zod' }
    #    # 'amiga-cd',         # ??

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - get update script"
      ansible.builtin.shell: curl -kLso "{{ script_dest }}" {{ script_url }}

    - name: "{{ my_name }} - make script executable"
      file:
        path: "{{ script_dest }}"
        mode: '0755'

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - ansible.builtin.import_role:
        name: retronas.role.samba.system
      vars:
        nolink: true
        writable: "no"

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - create startup service(s) instance"
      ansible.builtin.template:
        src: templates/{{ my_file }}/{{ item.name }}.{{ item.type }}.j2
        dest: /etc/systemd/system/{{ item.name }}.{{ item.type }}
        owner: root
        group: root
        mode: 0644
      with_items: "{{ systemd_units }}"
      notify: "{{ my_name }} daemon-reload"

    - name: "Import system-config role"
      ansible.builtin.import_role:
        name: retronas.role.system-config

    - name: Run flatten-romdir.sh for each src/dest (no top_level)
      ansible.builtin.shell: "{{ retronas_root }}/bin/flatten-romdir.sh {{ retronas_path }}/roms/{{ item.src }} {{ retronas_path }}/{{ system_key }}/roms/{{ item[system_key] }}"
      become: true
      loop: "{{ system_map }}"
      when: top_level_paths is defined and
            item[system_key] is defined and
            item[system_key] | length > 0

    - name: patch up perms
      ansible.builtin.shell: "chown -R {{ retronas_user }}:{{ retronas_group }} {{ retronas_path }}/{{ system_key }}"
      become: true

  handlers:

    - name: "{{ my_name }} daemon-reload"
      ansible.builtin.systemd:
        daemon_reload: true


================================================
FILE: ansible/install_sabretools.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "SabreTools"
    my_file: "install_sabretools"
    module_name: "sabretools"

    packages:
      - git
      - coreutils
      - unzip

    my_arch: "x86_64"

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755"}

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - Run installer"
      ansible.builtin.shell:
        cmd: "./{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
        chdir: "{{ retronas_root }}/scripts"
        executable: /bin/bash

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_samba.yml
================================================
---
- hosts: localhost
  gather_facts: false

  roles:
    - retronas.role.samba

  vars:
    module_name: "samba"

  tasks:
    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_seaweedfs.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "seaweedfs"
    my_file: "install_{{ my_name }}"
    module_name: "seaweedfs"

    systemd_units:
      - { name: "{{ my_name }}-retronas", type: 'service', state: "started", enabled: "yes", restart: "yes", instance: "no" }

    packages:
      - pwgen

    firewalld_rules:
      - { zones: retro, service: "{{ my_name }}" }
      - { zones: modern, service: "{{ my_name }}" }

    templates:
      - { name: "{{ my_name }}-retronas.service", dest: "/etc/systemd/system" }
      - { name: "install_{{ my_name }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "seaweedfs-credentials.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "weed-retronas-s3.json", dest: "{{ retronas_root }}/bin", mode: "0640", force: no }

    paths:
      - { name: "s3", dest: "{{ retronas_path }}", state: "directory", mode: "0755"}

  tasks:

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "generate access key"
      shell:
        cmd: pwgen -s 32 1
      no_log: true
      register: retronas_s3_access_key

    - name: "generate secret key"
      shell:
        cmd: pwgen -s 64 1
      no_log: true
      register: retronas_s3_secret_key

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - Install release"
      ansible.builtin.shell: "{{ retronas_root }}/scripts/{{ my_file }}.sh 2>&1 | tee {{ retronas_root }}/log/{{ my_file }}.log"
      args:
        creates: "{{ retronas_root}}/bin/weed"

    - name: "{{ my_name }} - enable service(s)"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: "{{ item.state }}"
        enabled: "{{ item.enabled }}"
        daemon_reload: true
      with_items: "{{ systemd_units }}"
      notify: "{{ my_name }} - Restart service"

    #
    # FIREWALL
    #
    - name: "{{ my_name }} - checking firewall rule"
      ansible.builtin.stat:
        path: /etc/firewalld/services
      register: firewalld_services

    - name: "{{ my_name }} - templates"
      ansible.builtin.template:
        src: "templates/{{ my_file }}/{{ my_name }}.xml.j2"
        dest: /etc/firewalld/services/{{ my_name }}.xml
        owner: root
        group: root
        mode: 0644
        force: true
      when: firewalld_services.stat.exists

    - ansible.builtin.shell:
        cmd: 'sleep 10'

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item.name }}.{{ item.type }}"
        state: restarted
        daemon_reload: true
      with_items: "{{ systemd_units }}"


================================================
FILE: ansible/install_sit.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "sit"
    my_file: "install_sit"
    module_name: "sit"

    packages:
      - make
      - gcc
      - git
      - coreutils

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "/usr/local/bin/sit"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_smbmounter.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "smbmounter"
    my_file: "install_{{ my_name }}"
    module_name: "smbmounter"
    system_key: "smbmounter"

    templates:
      - { name: "retronas_{{ my_name }}.conf", dest: "/etc/samba" }

  tasks:

    - name: "{{ my_name }} - Include systems map"
      ansible.builtin.include_vars: "retronas_systems.yml"

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.romdir

    - ansible.builtin.import_role:
        name: retronas.role.extradirs

    - ansible.builtin.import_role:
        name: retronas.role.samba

    - name: "{{ my_name }} - link romdir"
      ansible.builtin.file:
        src: "{{ retronas_path }}/roms/commodore/amiga"
        dest: "{{ retronas_path }}/amiga"
        owner: "{{ retronas_user }}"
        group: "{{ retronas_group }}"
        state: link
        mode: "0775"

    - name: "{{ my_name }} - configure includes file"
      ansible.builtin.ini_file:
        path: /etc/samba/smb.conf
        section: "amiga"
        option: "include"
        value: "/etc/samba/retronas_smbmounter.conf"
      notify: "restart samba"

    - ansible.builtin.import_role:
        name: retronas.role.templates
      notify: "restart samba"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_sslcert.yml
================================================
---
- hosts: localhost
  gather_facts: false

  roles:
    - retronas.role.sslcert

  vars:
    module_name: "sslcert"

  tasks:
    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_syncthing.yml
================================================
---
- hosts: localhost

  vars:
    my_name: "Syncthing"
    my_file: "install_syncthing"
    module_name: "syncthing"

    packages:
      - syncthing

    firewalld_rules:
      - { zone: modern, service: syncthing }
      - { zone: modern, service: syncthing-gui }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - name: "{{ my_name }} - Package signing key"
      ansible.builtin.get_url:
        url: https://syncthing.net/release-key.gpg
        dest: /etc/apt/trusted.gpg.d/syncthing-archive-keyring.gpg
        owner: root
        group: root
        mode: "0644"

    - name: "{{ my_name }} - Configure APT repo"
      ansible.builtin.apt_repository:
        repo: deb https://apt.syncthing.net/ syncthing stable
        state: present
        filename: syncthing
        update_cache: true

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - Web config http://{{ ansible_default_ipv4.address }}:8384"
      ansible.builtin.ini_file:
        path: /usr/lib/systemd/system/syncthing@.service
        section: Service
        option: ExecStart
        value: "/usr/bin/syncthing serve --no-browser --no-restart --logflags=0 --gui-address=0.0.0.0:8384"
      notify: "{{ my_name }} - Restart service"

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: "{{ item }}"
        state: started
        enabled: true
        daemon_reload: true
      with_items:
        - syncthing@{{ retronas_user }}

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart service"
      ansible.builtin.service:
        name: "{{ item }}"
        state: restarted
        daemon_reload: true
      with_items:
        - syncthing@{{ retronas_user }}


================================================
FILE: ansible/install_tcpser.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "tcpser"
    my_file: "install_tcpser"
    module_name: "tcpser"
    append_user_group: "dialout"

    packages:
      - make
      - gcc
      - coreutils
      - git

    paths:
      - { name: "{{ my_name }}", dest: "{{ retronas_root }}/etc" }

    templates:
      - { name: "{{ my_file }}.sh", dest: "{{ retronas_root }}/scripts", mode: "0755" }
      - { name: "tcpser@.service", dest: "/usr/lib/systemd/system" }

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.paths

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.update-user

    - name: "{{ my_name }} - build source"
      ansible.builtin.command:
        cmd: "{{ retronas_root }}/scripts/{{ my_file }}.sh"
        creates: "{{ retronas_root }}/bin/tcpser"

    - ansible.builtin.import_role:
        name: retronas.role.system-config


================================================
FILE: ansible/install_telnet.yml
================================================
---
- hosts: localhost
  gather_facts: true

  vars:
    my_name: "Telnet"
    my_file: "install_telnet"
    module_name: "telnet"

    templates:
      - { name: "telnet", dest: "/etc/xinetd.d", force: false }

    firewalld_rules:
      - { zone: "retro", service: "telnet" }

    packages:
      - telnet
      - telnetd
      - xinetd

  tasks:

    - name: "{{ my_name }} - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - name: "{{ my_name }} - Enable startup services"
      ansible.builtin.service:
        name: xinetd
        state: started
        enabled: true

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - ansible.builtin.import_role:
        name: retronas.role.firewalld.port

    - ansible.builtin.import_role:
        name: retronas.role.system-config

  handlers:

    - name: "{{ my_name }} - Restart services"
      ansible.builtin.service:
        name: xinetd
        state: restarted


================================================
FILE: ansible/install_tftpd-hpa.yml
================================================
---
- hosts: localhost
  gather_facts: false

  vars:
    my_name: "tftpd-hpa"
    my_file: "install_tftpd-hpa"
    module_name: "tftpd-hpa"

    firewalld_rules:
      - { zone: "retro", service: "tftp" }

    packages:
      tftpd-hpa

    templates:
      - { name: "tftpd-hpa", dest: "/etc/default" }

  tasks:
    - name: "{{ my_name }}  - Load RetroNAS config"
      ansible.builtin.include_vars: retronas_vars.yml

    - ansible.builtin.import_role:
        name: retronas.role.package.latest

    - ansible.builtin.import_role:
        name: retronas.role.templates

    - name: "{{ my_name }} - enable startup services"
      ansible.builtin.service:
        name: tftpd-hpa
        state: started
    
Download .txt
gitextract_oklxbxnr/

├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug-report.yml
│       └── config.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY
├── ansible/
│   ├── ansible.cfg
│   ├── hosts.yml
│   ├── install_3ds_qr_codes.yml
│   ├── install_adtpro.yml
│   ├── install_affstools.yml
│   ├── install_amitools.yml
│   ├── install_analoguepocket_cifs.yml
│   ├── install_apfs-fuse.yml
│   ├── install_aria2.yml
│   ├── install_assembly64.yml
│   ├── install_atarist-sidecart.yml
│   ├── install_batocera_cifs.yml
│   ├── install_cockpit-retronas.yml
│   ├── install_cockpit.yml
│   ├── install_cue2pops.yml
│   ├── install_curlftpfs.yml
│   ├── install_deluge.yml
│   ├── install_dhcpcd.yml
│   ├── install_disable-laptop-lid.yml
│   ├── install_disc-image-creator.yml
│   ├── install_dnsmasq-retro.yml
│   ├── install_dnsmasq.yml
│   ├── install_doc.yml
│   ├── install_dreampi.yml
│   ├── install_dvdauth.yml
│   ├── install_eccedc.yml
│   ├── install_emudeck_cifs.yml
│   ├── install_emuelec_cifs.yml
│   ├── install_etherdfs.yml
│   ├── install_ethflopd.yml
│   ├── install_extract-xiso.yml
│   ├── install_extradirs.yml
│   ├── install_far2l.yml
│   ├── install_fenrir-ode-webserver.yml
│   ├── install_filesystems.yml
│   ├── install_firewalld-zones.yml
│   ├── install_firewalld.yml
│   ├── install_flippydrive.yml
│   ├── install_freestation.yml
│   ├── install_fsp.yml
│   ├── install_gogrepo.yml
│   ├── install_hb-store-cdn.yml
│   ├── install_hdldump.yml
│   ├── install_hdparm.yml
│   ├── install_hfsutils.yml
│   ├── install_hostapd.yml
│   ├── install_kermit.yml
│   ├── install_lighttpd.yml
│   ├── install_linux-dexdrive.yml
│   ├── install_linux-gadgets.yml
│   ├── install_litch.yml
│   ├── install_lynx.yml
│   ├── install_macproxy_classic.yml
│   ├── install_mc.yml
│   ├── install_megatools.yml
│   ├── install_minicom.yml
│   ├── install_mister-organize.yml
│   ├── install_mister_cifs.yml
│   ├── install_mtcp-netdrive.yml
│   ├── install_mysticbbs.yml
│   ├── install_nabu.yml
│   ├── install_nbd-client.yml
│   ├── install_netatalk2.yml
│   ├── install_netatalk2x.yml
│   ├── install_netatalk3.yml
│   ├── install_netatalk3_source.yml
│   ├── install_netatalk4.yml
│   ├── install_netlink.yml
│   ├── install_netmount.yml
│   ├── install_network-presets-ethernet-dhcp.yml
│   ├── install_network-presets-standalone.yml
│   ├── install_network-presets-zoned.yml
│   ├── install_networkmanager.yml
│   ├── install_nfs.yml
│   ├── install_nginx.yml
│   ├── install_ntp.yml
│   ├── install_open-iscsi.yml
│   ├── install_openssh.yml
│   ├── install_pandoc.yml
│   ├── install_pfsshell.yml
│   ├── install_pi1541.yml
│   ├── install_piscsi.yml
│   ├── install_proftpd.yml
│   ├── install_ps2_openps2loader.yml
│   ├── install_ps2_udpbd.yml
│   ├── install_ps3netsrv.yml
│   ├── install_pygopherd.yml
│   ├── install_rclone.yml
│   ├── install_recalbox_cifs.yml
│   ├── install_redumper.yml
│   ├── install_retroaimserver.yml
│   ├── install_retroarch_cifs.yml
│   ├── install_retrodeck_cifs.yml
│   ├── install_romdir.yml
│   ├── install_romimport.yml
│   ├── install_romm_cifs.yml
│   ├── install_sabretools.yml
│   ├── install_samba.yml
│   ├── install_seaweedfs.yml
│   ├── install_sit.yml
│   ├── install_smbmounter.yml
│   ├── install_sslcert.yml
│   ├── install_syncthing.yml
│   ├── install_tcpser.yml
│   ├── install_telnet.yml
│   ├── install_tftpd-hpa.yml
│   ├── install_tnfs.yml
│   ├── install_troubleshooting.yml
│   ├── install_ucon64.yml
│   ├── install_waybackproxy.yml
│   ├── install_webone.yml
│   ├── install_wrp.yml
│   ├── install_xbox.yml
│   ├── install_xbox360.yml
│   ├── install_xbox360_netiso.yml
│   ├── install_xboxmanager.yml
│   ├── install_xlink-kai.yml
│   ├── install_ytree.yml
│   ├── install_zterm.yml
│   ├── migrate_mister_cifs_issue21.yml
│   ├── retronas_create_dirs.yml
│   ├── retronas_dependencies.yml
│   ├── retronas_system_config.yml
│   ├── retronas_systems.yml
│   ├── retronas_update_user.yml
│   ├── retronas_vars.yml.default
│   ├── roles/
│   │   ├── retronas.role.apt-backports/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cache/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cockpit/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.cockpit-packages/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_cockpit-packages/
│   │   │   │       └── cockpit-packages.sh.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.createdirs/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.curlftpfs/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_curlftpfs.sh.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore3/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore6/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.dotnetcore8/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.extradirs/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.filesystems/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.firewalld.port/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.htpasswd/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yml
│   │   ├── retronas.role.nfs/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.nginx/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── install_nginx/
│   │   │   │       ├── conf/
│   │   │   │       │   ├── includes/
│   │   │   │       │   │   ├── autoindex.conf
│   │   │   │       │   │   ├── listen-80.conf
│   │   │   │       │   │   └── ssl.conf
│   │   │   │       │   └── sites-available/
│   │   │   │       │       ├── 10-retronas.conf
│   │   │   │       │       └── 99-retronas-files.conf
│   │   │   │       └── www/
│   │   │   │           └── index.html
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.package.latest/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.paths/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.romdir/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.samba/
│   │   │   ├── handlers/
│   │   │   │   └── main.yaml
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   ├── templates/
│   │   │   │   └── retronas.conf.j2
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.samba.system/
│   │   │   ├── tasks/
│   │   │   │   ├── link.yml
│   │   │   │   ├── main.yaml
│   │   │   │   └── nolink.yml
│   │   │   └── templates/
│   │   │       └── retronas_system.conf.j2
│   │   ├── retronas.role.sslcert/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.system-config/
│   │   │   ├── tasks/
│   │   │   │   └── main.yaml
│   │   │   └── vars/
│   │   │       └── main.yaml
│   │   ├── retronas.role.templates/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   ├── retronas.role.update-user/
│   │   │   └── tasks/
│   │   │       └── main.yaml
│   │   └── retronas.role.x11vnc/
│   │       ├── tasks/
│   │       │   └── main.yaml
│   │       ├── templates/
│   │       │   └── install_x11vnc/
│   │       │       └── x11vnc_wrapper.sh.j2
│   │       └── vars/
│   │           └── main.yaml
│   └── templates/
│       ├── install_3ds_qr_codes/
│       │   ├── 3ds_qr.sh.j2
│       │   └── retronas_3ds_qr.cron.j2
│       ├── install_adtpro/
│       │   ├── ADTPro.properties.j2
│       │   ├── adtpro.service.j2
│       │   ├── adtpro_retronas.sh.j2
│       │   └── install_adtpro.sh.j2
│       ├── install_affstools/
│       │   └── install_affstools.sh.j2
│       ├── install_amitools/
│       │   └── install_amitools.sh.j2
│       ├── install_apfs-fuse/
│       │   └── install_apfs-fuse.sh.j2
│       ├── install_assembly64/
│       │   ├── assembly64.service.j2
│       │   ├── assembly64_retronas.sh.j2
│       │   └── install_assembly64.sh.j2
│       ├── install_atarist-sidecart/
│       │   ├── 99-retronas-sidecart.conf.j2
│       │   ├── atarist-sidecart-generate-roms.sh.j2
│       │   ├── atarist-sidecart-mirrordb.sh.j2
│       │   ├── atarist-sidecart-updatedb.sh.j2
│       │   ├── index.html.j2
│       │   └── retronas_atarist.conf.j2
│       ├── install_cockpit-retronas/
│       │   └── install_cockpit-retronas.sh.j2
│       ├── install_cue2pops/
│       │   └── install_cue2pops.sh.j2
│       ├── install_deluge/
│       │   ├── auth.j2
│       │   ├── autoadd.conf.j2
│       │   ├── core.conf.j2
│       │   ├── deluge-web.service.j2
│       │   ├── deluged.j2
│       │   ├── deluged.service.j2
│       │   └── upgrade_deluge.sh.j2
│       ├── install_disable-laptop-lid/
│       │   └── retronas.conf.j2
│       ├── install_disc-image-creator/
│       │   └── install_disc-image-creator.sh.j2
│       ├── install_dnsmasq-retro/
│       │   ├── dnsmasq-retro.service.j2
│       │   └── retro/
│       │       ├── dhcp-retro-ethernet.conf.j2
│       │       ├── dhcp-retro-wifi.conf.j2
│       │       ├── dhcp.conf.j2
│       │       ├── dns.conf.j2
│       │       ├── dnsmasq.conf.j2
│       │       ├── interfaces.conf.j2
│       │       └── ipv6.conf.j2
│       ├── install_dreampi/
│       │   ├── dreampi.conf.j2
│       │   └── install_dreampi.sh.j2
│       ├── install_dvdauth/
│       │   └── install_dvdauth.sh.j2
│       ├── install_eccedc/
│       │   └── install_eccedc.sh.j2
│       ├── install_etherdfs/
│       │   ├── etherdfs.service.j2
│       │   ├── install_etherdfs.sh.j2
│       │   └── retronas_dos.conf.j2
│       ├── install_ethflopd/
│       │   ├── ethflopd.service.j2
│       │   └── install_ethflopd.sh.j2
│       ├── install_extract-xiso/
│       │   └── install_extract-xiso.sh.j2
│       ├── install_far2l/
│       │   └── install_far2l.sh.j2
│       ├── install_fenrir-ode-webserver/
│       │   ├── fenrir-ode-webserver.service.j2
│       │   └── install_fenrir-ode-webserver.sh.j2
│       ├── install_firewalld/
│       │   └── workarounds/
│       │       ├── clear-python-bytecode.j2
│       │       └── override.conf.j2
│       ├── install_firewalld-zones/
│       │   ├── policies/
│       │   │   └── retro_to_modern.xml.j2
│       │   ├── services/
│       │   │   ├── ps3netsrv.xml.j2
│       │   │   └── samba-modern.xml.j2
│       │   └── zones/
│       │       ├── modern.xml.j2
│       │       └── retro.xml.j2
│       ├── install_flippydrive/
│       │   ├── flippydrive.service.j2
│       │   ├── flippydrive.sh.j2
│       │   └── install_flippydrive.sh.j2
│       ├── install_freestation/
│       │   ├── retronas_freestation_cifs.conf.j2
│       │   └── retronas_freestation_nfs.conf.j2
│       ├── install_fsp/
│       │   ├── fspd.conf.j2
│       │   ├── fspd.service.j2
│       │   └── install_fsp.sh.j2
│       ├── install_gogrepo/
│       │   ├── gogrepo-wrapper.sh.j2
│       │   ├── gogrepo_download.sh.j2
│       │   ├── gogrepo_import-cookies.sh.j2
│       │   ├── gogrepo_login.sh.j2
│       │   └── gogrepo_update.sh.j2
│       ├── install_hb-store-cdn/
│       │   ├── config.ini.j2
│       │   ├── hb-store-cdn-check.sh.j2
│       │   ├── hb-store-cdn.cron.j2
│       │   ├── hb-store-cdn.service.j2
│       │   └── install_hb-store-cdn.sh.j2
│       ├── install_hdldump/
│       │   └── install_hdldump.sh.j2
│       ├── install_hdparm/
│       │   ├── hdparm-manager.sh.j2
│       │   ├── hdparm.service.j2
│       │   ├── hdparm.sh.j2
│       │   └── hdparm.timer.j2
│       ├── install_hfsutils/
│       │   └── install_hfsutils.sh.j2
│       ├── install_hostapd/
│       │   ├── hostapd-dnsmasq.conf.j2
│       │   ├── hostapd-retronas.conf.j2
│       │   └── hostapd-retronas.service.j2
│       ├── install_kermit/
│       │   ├── iksd.socket.j2
│       │   └── iksd@.service.j2
│       ├── install_lighttpd/
│       │   └── 99-retronas.conf.j2
│       ├── install_linux-dexdrive/
│       │   ├── dexdrive_dumper.sh.j2
│       │   ├── install_linux-dexdrive.sh.j2
│       │   ├── linux-dexdrive.service.j2
│       │   └── makefile.patch.j2
│       ├── install_linux-gadgets/
│       │   └── gadget-mass-storage-manage.sh.j2
│       ├── install_litch/
│       │   ├── litch_claim.sh.j2
│       │   ├── litch_download.sh.j2
│       │   ├── litch_download_clean.sh.j2
│       │   └── litch_login.sh.j2
│       ├── install_macproxy_classic/
│       │   └── macproxy.service.j2
│       ├── install_megatools/
│       │   └── install_megatools.sh.j2
│       ├── install_minicom/
│       │   ├── minicom.sh.j2
│       │   └── minirc.dfl.j2
│       ├── install_mister-organize/
│       │   ├── install_mister-organize.sh.j2
│       │   └── mister-organize.sh.j2
│       ├── install_mister_cifs/
│       │   ├── retronas-mister-dirs.service.j2
│       │   └── retronas-mister-dirs.timer.j2
│       ├── install_mtcp-netdrive/
│       │   ├── install_mtcp-netdrive.sh.j2
│       │   ├── mtcp-netdrive.service.j2
│       │   ├── mtcp-netdrive.sh.j2
│       │   └── mtcp-netdrive.xml.j2
│       ├── install_mysticbbs/
│       │   ├── create_filebone_na.py.j2
│       │   ├── install_mysticbbs.sh.j2
│       │   ├── mysticbbs-mis.service.j2
│       │   ├── mysticbbs.sh.j2
│       │   ├── mysticbbs.xml.j2
│       │   ├── retronas_create_fileareas.ini.j2
│       │   └── retronas_massupload.ini.j2
│       ├── install_nabu/
│       │   ├── install_nabu.sh.j2
│       │   └── nabu.sh.j2
│       ├── install_nbd-client/
│       │   └── nbd.conf.j2
│       ├── install_netatalk2/
│       │   ├── AppleVolumes.default.j2
│       │   ├── afpd.conf.j2
│       │   └── default.j2
│       ├── install_netatalk2x/
│       │   ├── AppleVolumes.default.j2
│       │   ├── afpd.conf.j2
│       │   ├── afpexpect.sh.j2
│       │   ├── atalkd.conf.j2
│       │   ├── default.j2
│       │   └── install_netatalk2x.sh.j2
│       ├── install_netatalk3/
│       │   ├── install_netatalk3.sh.j2
│       │   ├── netatalk.service.j2
│       │   └── retronas.conf.j2
│       ├── install_netatalk4/
│       │   ├── atalkd.service.j2
│       │   ├── install_netatalk4.sh.j2
│       │   ├── netatalk.service.j2
│       │   └── retronas.conf.j2
│       ├── install_netlink/
│       │   ├── install_netlink.sh.j2
│       │   ├── netlink.conf.j2
│       │   ├── netlink.patch.j2
│       │   └── netlink.service.j2
│       ├── install_netmount/
│       │   ├── install_netmount.sh.j2
│       │   ├── netmount-confman.py.j2
│       │   ├── netmount-confman.sh.j2
│       │   └── retronas.yaml.j2
│       ├── install_network-presets-standalone/
│       │   └── dhcpcd.conf.j2
│       ├── install_network-presets-zoned/
│       │   └── dhcpcd.conf.j2
│       ├── install_nfs/
│       │   ├── exports.j2
│       │   └── nfs-kernel-server.j2
│       ├── install_open-iscsi/
│       │   └── iscsi-manager-target-login.sh.j2
│       ├── install_pfsshell/
│       │   └── install_pfsshell.sh.j2
│       ├── install_pi1541/
│       │   └── pi1541.sh.j2
│       ├── install_piscsi/
│       │   ├── install_piscsi.sh.j2
│       │   ├── install_piscsi_standard.sh.j2
│       │   ├── piscsi.service.j2
│       │   └── piscsi_retronas_patch.diff.j2
│       ├── install_proftpd/
│       │   ├── ftp.service.j2
│       │   └── retronas.conf.j2
│       ├── install_ps2_openps2loader/
│       │   └── retronas_ps2.conf.j2
│       ├── install_ps2_udpbd/
│       │   ├── install_ps2_udpbd.sh.j2
│       │   ├── ps2_udpbd.service.j2
│       │   └── udpbd_manager.sh.j2
│       ├── install_ps3netsrv/
│       │   ├── install_ps3netsrv.sh.j2
│       │   ├── ps3netsrv-perms.service.j2
│       │   ├── ps3netsrv-perms.timer.j2
│       │   └── ps3netsrv.service.j2
│       ├── install_pygopherd/
│       │   ├── install_pygopherd.sh.j2
│       │   ├── pygopherd.conf.j2
│       │   └── pygopherd.service.j2
│       ├── install_rclone/
│       │   └── rclone-webui.service.j2
│       ├── install_redumper/
│       │   └── install_redumper.sh.j2
│       ├── install_retroaimserver/
│       │   ├── install_retroaimserver.sh.j2
│       │   ├── retro-aim-server.service.j2
│       │   ├── retroaimserver.xml.j2
│       │   └── retroainserver.xml.j2
│       ├── install_romimport/
│       │   └── romimport.sh.j2
│       ├── install_romm_cifs/
│       │   ├── retronas-romm-dirs.service.j2
│       │   ├── retronas-romm-dirs.sh.j2
│       │   └── retronas-romm-dirs.timer.j2
│       ├── install_sabretools/
│       │   └── install_sabretools.sh.j2
│       ├── install_seaweedfs/
│       │   ├── install_seaweedfs.sh.j2
│       │   ├── seaweedfs-credentials.sh.j2
│       │   ├── seaweedfs-retronas.service.j2
│       │   ├── seaweedfs.xml.j2
│       │   └── weed-retronas-s3.json.j2
│       ├── install_sit/
│       │   └── install_sit.sh.j2
│       ├── install_smbmounter/
│       │   └── retronas_smbmounter.conf.j2
│       ├── install_tcpser/
│       │   ├── install_tcpser.sh.j2
│       │   └── tcpser@.service.j2
│       ├── install_telnet/
│       │   └── telnet.j2
│       ├── install_tftpd-hpa/
│       │   └── tftpd-hpa.j2
│       ├── install_tnfs/
│       │   ├── install_tnfs.sh.j2
│       │   └── tnfsd.service.j2
│       ├── install_ucon64/
│       │   └── install_ucon64.sh.j2
│       ├── install_waybackproxy/
│       │   ├── config.json.j2
│       │   ├── install_waybackproxy.sh.j2
│       │   └── waybackproxy.service.j2
│       ├── install_webone/
│       │   ├── install_webone.sh.j2
│       │   └── webone.service.j2
│       ├── install_wrp/
│       │   ├── install_wrp.sh.j2
│       │   └── wrp.service.j2
│       ├── install_x11vnc/
│       │   └── x11vnc_wrapper.sh.j2
│       ├── install_xbox/
│       │   └── retronas_xbox.conf.j2
│       ├── install_xbox360/
│       │   └── retronas_xbox360.conf.j2
│       ├── install_xbox360_netiso/
│       │   ├── dummy.iso.j2
│       │   ├── install_xbox360_netiso.sh.j2
│       │   └── xbox360_netiso.service.j2
│       ├── install_xboxmanager/
│       │   └── xboxmanager.cfg.j2
│       ├── install_xlink-kai/
│       │   └── xlink-kai.service.j2
│       ├── install_ytree/
│       │   └── install_ytree.sh.j2
│       └── install_zterm/
│           ├── install_zterm.sh.j2
│           └── zterm.service.j2
├── config/
│   ├── menu/
│   │   ├── 3ds_qr.json
│   │   ├── _template.json
│   │   ├── adtpro.json
│   │   ├── assembly64.json
│   │   ├── atarist-sidecart.json
│   │   ├── cockpit.json
│   │   ├── config.json
│   │   ├── deluge.json
│   │   ├── dexdrive.json
│   │   ├── doc.json
│   │   ├── dreampi.json
│   │   ├── etherdfs.json
│   │   ├── ethflopd.json
│   │   ├── experimental.json
│   │   ├── fenrirodewebserver.json
│   │   ├── flippydrive.json
│   │   ├── fsp.json
│   │   ├── gogrepo.json
│   │   ├── hbstorecdn.json
│   │   ├── hdparm.json
│   │   ├── install.json
│   │   ├── lighttpd.json
│   │   ├── linux-gadgets.json
│   │   ├── litch.json
│   │   ├── lynx.json
│   │   ├── macproxy_classic.json
│   │   ├── main.json
│   │   ├── minicom.json
│   │   ├── mister-organize.json
│   │   ├── mister_cifs.json
│   │   ├── mtcp-netdrive.json
│   │   ├── mysticbbs.json
│   │   ├── nabu.json
│   │   ├── netatalk-legacy.json
│   │   ├── netatalk.json
│   │   ├── netlink.json
│   │   ├── netmount.json
│   │   ├── network-manual.json
│   │   ├── network-presets.json
│   │   ├── network-setup-modern.json
│   │   ├── network-setup-retro.json
│   │   ├── network-setup-wifiap.json
│   │   ├── network-setup.json
│   │   ├── network.json
│   │   ├── nginx.json
│   │   ├── ntp.json
│   │   ├── open-iscsi.json
│   │   ├── openssh.json
│   │   ├── pi1541.json
│   │   ├── piscsi.json
│   │   ├── profiles.json
│   │   ├── proftpd.json
│   │   ├── ps2_udpbd.json
│   │   ├── ps3netsrv.json
│   │   ├── rclone.json
│   │   ├── retroaimserver.json
│   │   ├── romimport.json
│   │   ├── romimportsystem.json
│   │   ├── romm_cifs.json
│   │   ├── samba.json
│   │   ├── seaweedfs.json
│   │   ├── services.json
│   │   ├── sslcert.json
│   │   ├── syncthing.json
│   │   ├── tcpser.json
│   │   ├── telnet.json
│   │   ├── tftpd-hpa.json
│   │   ├── tnfs.json
│   │   ├── tools.json
│   │   ├── update.json
│   │   ├── webone.json
│   │   ├── wrp.json
│   │   ├── xbox360_netiso.json
│   │   ├── xlinkkai.json
│   │   └── zterm.json
│   └── retronas.cfg
├── dialog/
│   ├── adtpro_ethernet_edit.sh
│   ├── adtpro_localhost_edit.sh
│   ├── adtpro_serial_edit.sh
│   ├── d_input.sh
│   ├── d_menu.sh
│   ├── d_yn.sh
│   ├── dexdrive_memcards.sh
│   ├── dexdrive_serial_edit.sh
│   ├── disclaimer.sh
│   ├── gogrepo.sh
│   ├── profiles.sh
│   ├── retronas_fixperms.sh
│   ├── retronas_password.sh
│   ├── romimportsystem.sh
│   ├── tcpser_edit.sh
│   ├── tcpser_status.sh
│   ├── wifi_password.sh
│   └── zterm_edit.sh
├── dist/
│   ├── install_preseed.sh
│   └── retronas
├── install_retronas.sh
├── lib/
│   ├── ansible_runner.sh
│   ├── common.sh
│   ├── markup_runner.sh
│   └── script_runner.sh
├── retronas.sh
└── scripts/
    ├── maint/
    │   ├── git-changes-summary.sh
    │   ├── install-profile.py
    │   ├── migrate_romdirs.py
    │   ├── retronas-systems-manager.py
    │   ├── sort_menu_json.py
    │   └── tests/
    │       ├── lint-yaml.sh
    │       └── test-retronas-json.py
    ├── patch/
    │   ├── cache-dir.sh
    │   ├── git-config.sh
    │   ├── install-jq.sh
    │   ├── new-startup-file.sh
    │   └── update-retronas_vars.sh
    └── static/
        ├── check-samba-user.sh
        ├── clean-broken-symlinks.sh
        ├── get-drives.sh
        ├── get-interfaces.sh
        ├── git-switch-branch.sh
        ├── network-example-presets-standalone.sh
        ├── network-example-presets-zoned.sh
        ├── permissions.sh
        ├── run-local-module.sh
        ├── service-samba.sh
        ├── set-etherdfs-nic.sh
        ├── set-top-level-dir.sh
        ├── update-group.sh
        ├── update-passwd.sh
        ├── update-retronas.sh
        ├── update-system-history.sh
        ├── update-system.sh
        ├── update-username.sh
        ├── wifi-show-passwd.sh
        └── wifi-update-passwd.sh
Download .txt
SYMBOL INDEX (11 symbols across 5 files)

FILE: scripts/maint/install-profile.py
  function ini2dict (line 16) | def ini2dict(profile):
  function ansible_run (line 25) | def ansible_run(profile):
  function main (line 30) | def main(args):

FILE: scripts/maint/migrate_romdirs.py
  function _log (line 24) | def _log(s, level=0):
  function read_yaml (line 33) | def read_yaml(ydata):
  function process_dir (line 41) | def process_dir(dirname, tree=[]):
  function main (line 54) | def main(args):

FILE: scripts/maint/retronas-systems-manager.py
  function main (line 11) | def main(args):

FILE: scripts/maint/sort_menu_json.py
  function main (line 11) | def main(args):

FILE: scripts/maint/tests/test-retronas-json.py
  function _log (line 14) | def _log(s):
  function main (line 17) | def main():
Condensed preview — 535 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,139K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yml",
    "chars": 779,
    "preview": "name: \"Bug report\"\ndescription: Report problematic behaviour.\nbody:\n- type: markdown\n  attributes:\n    value: |\n      If"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 382,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Discussions\n    url: https://github.com/orgs/retronas/discussions\n  "
  },
  {
    "path": ".gitignore",
    "chars": 132,
    "preview": "bin\nscripts/*.sh\n!scripts/static/*.sh\nsrc\nlog\ndoc\nansible/retronas_vars.yml\netc/*\nconfig/installed.json\nansible/collecti"
  },
  {
    "path": "LICENSE",
    "chars": 1065,
    "preview": "MIT License\n\nCopyright (c) 2021 Dan Mons\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
  },
  {
    "path": "README.md",
    "chars": 767,
    "preview": "![logo](dist/retronas-logo.png)\n# RetroNAS\n\n## Project Information\n* [Status](https://github.com/retronas/retronas/wiki/"
  },
  {
    "path": "SECURITY",
    "chars": 3390,
    "preview": "=============================================================================\n                    WARNING / TERMS OF USE"
  },
  {
    "path": "ansible/ansible.cfg",
    "chars": 548,
    "preview": "[defaults]\ndeprecation_warnings = False\ncommand_warnings = False\ninventory = /opt/retronas/ansible/hosts.yml\nlog_path = "
  },
  {
    "path": "ansible/hosts.yml",
    "chars": 98,
    "preview": "---\nall:\n  hosts:\n    localhost:\n  vars:\n    ansible_connection: local\n    cache_plugin: jsonfile\n"
  },
  {
    "path": "ansible/install_3ds_qr_codes.yml",
    "chars": 1591,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"3DS QR Codes\"\n    my_file: \"install_3ds_qr_codes\"\n  "
  },
  {
    "path": "ansible/install_adtpro.yml",
    "chars": 2538,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"adtpro\"\n    my_file: \"install_{{ my_name }}\"\n    my_"
  },
  {
    "path": "ansible/install_affstools.yml",
    "chars": 928,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"affstools\"\n    my_file: \"install_{{ my_name }}\"\n    "
  },
  {
    "path": "ansible/install_amitools.yml",
    "chars": 829,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"amitools\"\n    my_file: \"install_{{ my_name }}\"\n    m"
  },
  {
    "path": "ansible/install_analoguepocket_cifs.yml",
    "chars": 1113,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"analoguepocket CIFS\"\n    my_file: \"install_analoguep"
  },
  {
    "path": "ansible/install_apfs-fuse.yml",
    "chars": 939,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"apfs-fuse\"\n    my_file: \"install_apfs-fuse\"\n    modu"
  },
  {
    "path": "ansible/install_aria2.yml",
    "chars": 443,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"aria2\"\n    my_file: \"install_aria2\"\n    module_name:"
  },
  {
    "path": "ansible/install_assembly64.yml",
    "chars": 2069,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"assembly64\"\n    my_file: \"install_{{ my_name }}\"\n   "
  },
  {
    "path": "ansible/install_atarist-sidecart.yml",
    "chars": 2880,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  roles:\n    - retronas.role.romdir\n    - retronas.role.nginx\n    - retron"
  },
  {
    "path": "ansible/install_batocera_cifs.yml",
    "chars": 1118,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"Batocera CIFS\"\n    my_file: \"install_batocera_cifs\"\n"
  },
  {
    "path": "ansible/install_cockpit-retronas.yml",
    "chars": 1154,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"cockpit-retronas\"\n    my_file: \"install_cockpit-retro"
  },
  {
    "path": "ansible/install_cockpit.yml",
    "chars": 255,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    module_name: \"cockpit\"\n\n  roles:\n    - retronas.role.filesystem"
  },
  {
    "path": "ansible/install_cue2pops.yml",
    "chars": 930,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"cue2pops\"\n    my_file: \"install_cue2pops\"\n    module"
  },
  {
    "path": "ansible/install_curlftpfs.yml",
    "chars": 156,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    module_name: \"curlftpfs\"\n\n  roles:\n    - retronas.role.curlftpf"
  },
  {
    "path": "ansible/install_deluge.yml",
    "chars": 3608,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"Deluge\"\n    my_file: \"install_deluge\"\n    module_nam"
  },
  {
    "path": "ansible/install_dhcpcd.yml",
    "chars": 698,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"dhcpcd\"\n    my_file: \"install_{{ my_name }}\"\n    mod"
  },
  {
    "path": "ansible/install_disable-laptop-lid.yml",
    "chars": 954,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"Disable Laptop Lid\"\n    my_file: \"install_disable-la"
  },
  {
    "path": "ansible/install_disc-image-creator.yml",
    "chars": 1109,
    "preview": "# Dependencies\n- ansible.builtin.import_playbook: install_dvdauth.yml\n- ansible.builtin.import_playbook: install_eccedc."
  },
  {
    "path": "ansible/install_dnsmasq-retro.yml",
    "chars": 3776,
    "preview": "---\n# Dependencies\n- import_playbook: install_ntp.yml\n- import_playbook: install_dnsmasq.yml\n\n- hosts: localhost\n  gathe"
  },
  {
    "path": "ansible/install_dnsmasq.yml",
    "chars": 735,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"dnsmasq\"\n    my_file: \"install_{{ my_name }}\"\n    mo"
  },
  {
    "path": "ansible/install_doc.yml",
    "chars": 667,
    "preview": "# Dependencies\n- ansible.builtin.import_playbook: install_lynx.yml\n\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n  "
  },
  {
    "path": "ansible/install_dreampi.yml",
    "chars": 2577,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"dreampi\"\n    my_file: \"install_dreampi\"\n    module_na"
  },
  {
    "path": "ansible/install_dvdauth.yml",
    "chars": 973,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"DVDAuth\"\n    my_file: \"install_dvdauth\"\n    module_n"
  },
  {
    "path": "ansible/install_eccedc.yml",
    "chars": 939,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"EccEDC\"\n    my_file: \"install_eccedc\"\n    module_nam"
  },
  {
    "path": "ansible/install_emudeck_cifs.yml",
    "chars": 1945,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"EmuDeck CIFS\"\n    my_file: \"install_emudeck_cifs\"\n  "
  },
  {
    "path": "ansible/install_emuelec_cifs.yml",
    "chars": 1058,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"EmuElec CIFS\"\n    my_file: \"install_emuelec_cifs\"\n  "
  },
  {
    "path": "ansible/install_etherdfs.yml",
    "chars": 2370,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"EtherDFS\"\n    my_file: \"install_etherdfs\"\n    module"
  },
  {
    "path": "ansible/install_ethflopd.yml",
    "chars": 1712,
    "preview": "- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"ethflopd\"\n    my_file: \"install_{{ my_name }}\"\n    modul"
  },
  {
    "path": "ansible/install_extract-xiso.yml",
    "chars": 851,
    "preview": "- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"extract-xiso\"\n    my_file: \"install_extract-xiso\"\n    mo"
  },
  {
    "path": "ansible/install_extradirs.yml",
    "chars": 244,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    module_name: \"extradirs\"\n\n  tasks:\n    - ansible.builtin.impor"
  },
  {
    "path": "ansible/install_far2l.yml",
    "chars": 1030,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"far2l\"\n    my_file: \"install_{{ my_name }}\"\n    modu"
  },
  {
    "path": "ansible/install_fenrir-ode-webserver.yml",
    "chars": 1732,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"fenrir-ode-webserver\"\n    my_file: \"install_fenrir-o"
  },
  {
    "path": "ansible/install_filesystems.yml",
    "chars": 161,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    module_name: \"filesystems\"\n\n  roles:\n    - retronas.role.files"
  },
  {
    "path": "ansible/install_firewalld-zones.yml",
    "chars": 2495,
    "preview": "---\n# Dependencies\n- ansible.builtin.import_playbook: install_dnsmasq.yml\n- ansible.builtin.import_playbook: install_fir"
  },
  {
    "path": "ansible/install_firewalld.yml",
    "chars": 1804,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"firewalld\"\n    my_file: \"install_{{ my_name }}\"\n    "
  },
  {
    "path": "ansible/install_flippydrive.yml",
    "chars": 2058,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Flippydrive\"\n    my_file: \"install_flippydrive\"\n    m"
  },
  {
    "path": "ansible/install_freestation.yml",
    "chars": 1162,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"freestation\"\n    my_file: \"install_{{ my_name }}\"\n   "
  },
  {
    "path": "ansible/install_fsp.yml",
    "chars": 3165,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"FSP for Swiss\"\n    my_file: \"install_fsp\"\n    my_ser"
  },
  {
    "path": "ansible/install_gogrepo.yml",
    "chars": 1726,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"gogrepo\"\n    my_file: \"install_gogrepo\"\n    module_n"
  },
  {
    "path": "ansible/install_hb-store-cdn.yml",
    "chars": 4400,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: hb-store-cdn\n    my_file: \"install_{{ my_name }}\"\n    "
  },
  {
    "path": "ansible/install_hdldump.yml",
    "chars": 826,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"hdldump\"\n    my_file: \"install_{{ my_name }}\"\n    mo"
  },
  {
    "path": "ansible/install_hdparm.yml",
    "chars": 2865,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"hdparm\"\n    my_file: \"install_{{ my_name }}\"\n    mod"
  },
  {
    "path": "ansible/install_hfsutils.yml",
    "chars": 959,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"hfsutils\"\n    my_file: \"install_hfsutils\"\n    module_"
  },
  {
    "path": "ansible/install_hostapd.yml",
    "chars": 2399,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"hostapd\"\n    my_file: \"install_{{ my_name }}\"\n    mo"
  },
  {
    "path": "ansible/install_kermit.yml",
    "chars": 1174,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"kermit\"\n    my_file: \"install_{{ my_name }}\"\n    mod"
  },
  {
    "path": "ansible/install_lighttpd.yml",
    "chars": 3164,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"lighttpd\"\n    my_file: \"install_{{ my_name }}\"\n    m"
  },
  {
    "path": "ansible/install_linux-dexdrive.yml",
    "chars": 1870,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"linux-dexdrive\"\n    my_file: \"install_{{ my_name }}\""
  },
  {
    "path": "ansible/install_linux-gadgets.yml",
    "chars": 879,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"linux-gadgets\"\n    my_file: \"install_{{ my_name }}\"\n"
  },
  {
    "path": "ansible/install_litch.yml",
    "chars": 1543,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"litch\"\n    my_file: \"install_litch\"\n    module_name:"
  },
  {
    "path": "ansible/install_lynx.yml",
    "chars": 427,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"lynx\"\n    my_file: \"install_lynx\"\n    module_name: \""
  },
  {
    "path": "ansible/install_macproxy_classic.yml",
    "chars": 1234,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"macproxy_classic\"\n    my_file: \"install_macproxy_cla"
  },
  {
    "path": "ansible/install_mc.yml",
    "chars": 529,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"mc\"\n    my_file: \"install_mc\"\n    module_name: \"mc\"\n"
  },
  {
    "path": "ansible/install_megatools.yml",
    "chars": 1397,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"megatools\"\n    my_file: \"install_megatools\"\n    modul"
  },
  {
    "path": "ansible/install_minicom.yml",
    "chars": 1707,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"minicom\"\n    my_file: \"install_{{ my_name }}\"\n    my"
  },
  {
    "path": "ansible/install_mister-organize.yml",
    "chars": 1922,
    "preview": "---\n- hosts: localhost\n\n  vars:\n    my_name: \"MiSTer Organize\"\n    my_file: \"install_mister-organize\"\n    module_name: \""
  },
  {
    "path": "ansible/install_mister_cifs.yml",
    "chars": 2577,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"MiSTer CIFS\"\n    my_file: \"install_mister_cifs\"\n    "
  },
  {
    "path": "ansible/install_mtcp-netdrive.yml",
    "chars": 2143,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"mtcp-netdrive\"\n    my_file: \"install_mtcp-netdrive\"\n "
  },
  {
    "path": "ansible/install_mysticbbs.yml",
    "chars": 2460,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"mysticbbs\"\n    my_file: \"install_mysticbbs\"\n    modul"
  },
  {
    "path": "ansible/install_nabu.yml",
    "chars": 1766,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"nabu\"\n    my_file: \"install_{{ my_name }}\"\n    my_di"
  },
  {
    "path": "ansible/install_nbd-client.yml",
    "chars": 691,
    "preview": "---\n- hosts: localhost\n\n  vars:\n    my_name: \"nbd-client\"\n    my_file: \"install_nbd-client\"\n    module_name: \"nbd-client"
  },
  {
    "path": "ansible/install_netatalk2.yml",
    "chars": 4172,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Netatalk2\"\n    my_file: \"install_netatalk2\"\n\n    pack"
  },
  {
    "path": "ansible/install_netatalk2x.yml",
    "chars": 3294,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Netatalk2.X\"\n    my_file: \"install_netatalk2x\"\n\n    p"
  },
  {
    "path": "ansible/install_netatalk3.yml",
    "chars": 2876,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"Netatalk3\"\n    my_file: \"install_netatalk3\"\n\n    pac"
  },
  {
    "path": "ansible/install_netatalk3_source.yml",
    "chars": 4614,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Netatalk3\"\n    my_file: \"install_netatalk3\"\n\n    pack"
  },
  {
    "path": "ansible/install_netatalk4.yml",
    "chars": 6407,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Netatalk4\"\n    my_file: \"install_netatalk4\"\n    modul"
  },
  {
    "path": "ansible/install_netlink.yml",
    "chars": 2082,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"netlink\"\n    my_file: \"install_netlink\"\n    module_n"
  },
  {
    "path": "ansible/install_netmount.yml",
    "chars": 2863,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"netmount\"\n    my_file: \"install_netmount\"\n    module_"
  },
  {
    "path": "ansible/install_network-presets-ethernet-dhcp.yml",
    "chars": 2146,
    "preview": "---\n# networkmanager\n- ansible.builtin.import_playbook: install_networkmanager.yml\n\n- hosts: localhost\n  gather_facts: f"
  },
  {
    "path": "ansible/install_network-presets-standalone.yml",
    "chars": 5755,
    "preview": "---\n# networkmanager\n- ansible.builtin.import_playbook: install_networkmanager.yml\n\n# hostapd\n# using NM api mode now\n# "
  },
  {
    "path": "ansible/install_network-presets-zoned.yml",
    "chars": 3828,
    "preview": "---\n# networkmanager\n- ansible.builtin.import_playbook: install_networkmanager.yml\n\n# firewalld\n- ansible.builtin.import"
  },
  {
    "path": "ansible/install_networkmanager.yml",
    "chars": 363,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"network manager\"\n    my_file: \"install_{{ my_name }}"
  },
  {
    "path": "ansible/install_nfs.yml",
    "chars": 155,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    module_name: \"nfs\"\n\n  tasks:\n\n    - ansible.builtin.import_rol"
  },
  {
    "path": "ansible/install_nginx.yml",
    "chars": 177,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    module_name: \"nginx\"\n\n  roles:\n    - retronas.role.sslcert\n   "
  },
  {
    "path": "ansible/install_ntp.yml",
    "chars": 1247,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"ntp\"\n    my_service: \"openntpd\"\n    my_file: \"instal"
  },
  {
    "path": "ansible/install_open-iscsi.yml",
    "chars": 831,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"open-iscsi\"\n    my_file: \"install_{{ my_name }}\"\n   "
  },
  {
    "path": "ansible/install_openssh.yml",
    "chars": 967,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"OpenSSH\"\n    module_name: \"openssh\"\n\n    packages:\n "
  },
  {
    "path": "ansible/install_pandoc.yml",
    "chars": 501,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    - my_name: \"pandoc\"\n    - my_file: \"install_pandoc\"\n\n    - pac"
  },
  {
    "path": "ansible/install_pfsshell.yml",
    "chars": 959,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"pfsshell\"\n    my_file: \"install_pfsshell\"\n    module"
  },
  {
    "path": "ansible/install_pi1541.yml",
    "chars": 764,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"pi1541\"\n    my_file: \"install_{{ my_name }}\"\n    mod"
  },
  {
    "path": "ansible/install_piscsi.yml",
    "chars": 3304,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"piscsi\"\n    my_file: \"install_piscsi\"\n    module_name"
  },
  {
    "path": "ansible/install_proftpd.yml",
    "chars": 1471,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"ProFTPd\"\n    my_file: \"install_proftpd\"\n    module_n"
  },
  {
    "path": "ansible/install_ps2_openps2loader.yml",
    "chars": 2493,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"PS2 OpenPS2Loader\"\n    my_file: \"install_ps2_openps2l"
  },
  {
    "path": "ansible/install_ps2_udpbd.yml",
    "chars": 2428,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"ps2_udpbd\"\n    my_file: \"install_ps2_udpbd\"\n    modul"
  },
  {
    "path": "ansible/install_ps3netsrv.yml",
    "chars": 4385,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"ps3netsrv\"\n    my_file: \"install_ps3netsrv\"\n    modul"
  },
  {
    "path": "ansible/install_pygopherd.yml",
    "chars": 1400,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"pygopherd\"\n    my_file: \"install_pygopherd\"\n    modu"
  },
  {
    "path": "ansible/install_rclone.yml",
    "chars": 1312,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"rclone\"\n    my_file: \"install_rclone\"\n    module_nam"
  },
  {
    "path": "ansible/install_recalbox_cifs.yml",
    "chars": 909,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"Recalbox CIFS\"\n    my_file: \"install_recalbox_cifs\"\n"
  },
  {
    "path": "ansible/install_redumper.yml",
    "chars": 864,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"redumper\"\n    my_file: \"install_{{ my_name }}\"\n    m"
  },
  {
    "path": "ansible/install_retroaimserver.yml",
    "chars": 2810,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"retroaimserver\"\n    my_file: \"install_retroaimserver\""
  },
  {
    "path": "ansible/install_retroarch_cifs.yml",
    "chars": 609,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"RetroArch Based Systems CIFS\"\n    my_file: \"install_"
  },
  {
    "path": "ansible/install_retrodeck_cifs.yml",
    "chars": 1697,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"retrodeck CIFS\"\n    my_file: \"install_retrodeck_cifs"
  },
  {
    "path": "ansible/install_romdir.yml",
    "chars": 238,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    module_name: \"romdir\"\n\n  tasks:\n    - ansible.builtin.import_r"
  },
  {
    "path": "ansible/install_romimport.yml",
    "chars": 1422,
    "preview": "---\n- hosts: localhost\n\n  vars:\n    my_name: \"ROM Import\"\n    my_file: \"install_romimport\"\n    module_name: \"romimport\"\n"
  },
  {
    "path": "ansible/install_romm_cifs.yml",
    "chars": 3336,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"RomM CIFS\"\n    my_file: \"install_romm_cifs\"\n    modu"
  },
  {
    "path": "ansible/install_sabretools.yml",
    "chars": 911,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"SabreTools\"\n    my_file: \"install_sabretools\"\n    mod"
  },
  {
    "path": "ansible/install_samba.yml",
    "chars": 202,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  roles:\n    - retronas.role.samba\n\n  vars:\n    module_name: \"samba\"\n\n  ta"
  },
  {
    "path": "ansible/install_seaweedfs.yml",
    "chars": 3070,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"seaweedfs\"\n    my_file: \"install_{{ my_name }}\"\n    "
  },
  {
    "path": "ansible/install_sit.yml",
    "chars": 817,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"sit\"\n    my_file: \"install_sit\"\n    module_name: \"si"
  },
  {
    "path": "ansible/install_smbmounter.yml",
    "chars": 1423,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"smbmounter\"\n    my_file: \"install_{{ my_name }}\"\n   "
  },
  {
    "path": "ansible/install_sslcert.yml",
    "chars": 206,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  roles:\n    - retronas.role.sslcert\n\n  vars:\n    module_name: \"sslcert\"\n\n"
  },
  {
    "path": "ansible/install_syncthing.yml",
    "chars": 1967,
    "preview": "---\n- hosts: localhost\n\n  vars:\n    my_name: \"Syncthing\"\n    my_file: \"install_syncthing\"\n    module_name: \"syncthing\"\n\n"
  },
  {
    "path": "ansible/install_tcpser.yml",
    "chars": 1165,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"tcpser\"\n    my_file: \"install_tcpser\"\n    module_nam"
  },
  {
    "path": "ansible/install_telnet.yml",
    "chars": 1055,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"Telnet\"\n    my_file: \"install_telnet\"\n    module_name"
  },
  {
    "path": "ansible/install_tftpd-hpa.yml",
    "chars": 1026,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"tftpd-hpa\"\n    my_file: \"install_tftpd-hpa\"\n    modu"
  },
  {
    "path": "ansible/install_tnfs.yml",
    "chars": 1689,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"TNFS Atari 8-bit and ZX Spectrum\"\n    my_file: \"inst"
  },
  {
    "path": "ansible/install_troubleshooting.yml",
    "chars": 681,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"troubleshooting\"\n    my_file: \"install_troubleshooti"
  },
  {
    "path": "ansible/install_ucon64.yml",
    "chars": 817,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"ucon64\"\n    my_file: \"install_ucon64\"\n    module_nam"
  },
  {
    "path": "ansible/install_waybackproxy.yml",
    "chars": 1617,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"waybackproxy\"\n    my_file: \"install_{{ my_name }}\"\n "
  },
  {
    "path": "ansible/install_webone.yml",
    "chars": 1995,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  vars:\n    my_name: \"WebOne proxy\"\n    my_file: \"install_webone\"\n    modul"
  },
  {
    "path": "ansible/install_wrp.yml",
    "chars": 2104,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"wrp\"\n    my_file: \"install_{{ my_name }}\"\n    module"
  },
  {
    "path": "ansible/install_xbox.yml",
    "chars": 1442,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"xbox\"\n    my_file: \"install_xbox\"\n    module_name: \""
  },
  {
    "path": "ansible/install_xbox360.yml",
    "chars": 1348,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"XBox360\"\n    my_file: \"install_xbox360\"\n    module_n"
  },
  {
    "path": "ansible/install_xbox360_netiso.yml",
    "chars": 1888,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  vars:\n    my_name: \"XBox360 NetISO\"\n    my_file: \"install_xbox360_netiso"
  },
  {
    "path": "ansible/install_xboxmanager.yml",
    "chars": 1493,
    "preview": "---\n# Dependencies\n- ansible.builtin.import_playbook: install_extract-xiso.yml\n\n- hosts: localhost\n  gather_facts: true\n"
  },
  {
    "path": "ansible/install_xlink-kai.yml",
    "chars": 2978,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n  become: true\n\n  # https://dist.teamxlink.co.uk/\n\n  vars:\n    my_name: \"xl"
  },
  {
    "path": "ansible/install_ytree.yml",
    "chars": 930,
    "preview": "---\n- hosts: localhost\n  gather_facts: no\n\n  vars:\n    my_name: \"ytree\"\n    my_file: \"install_{{ my_name }}\"\n    module_"
  },
  {
    "path": "ansible/install_zterm.yml",
    "chars": 2417,
    "preview": "---\n- hosts: localhost\n\n  vars:\n    my_name: \"zterm\"\n    my_file: \"install_{{ my_name }}\"\n    module_name: \"zterm\"\n    a"
  },
  {
    "path": "ansible/migrate_mister_cifs_issue21.yml",
    "chars": 3891,
    "preview": "---\n### migration playbook for issue #21\n# this issue is old and the fix is slow so users who haven't updated in a while"
  },
  {
    "path": "ansible/retronas_create_dirs.yml",
    "chars": 2782,
    "preview": "---\n- name: \"{{ my_name }} - Include systems map\"\n  ansible.builtin.include_vars: \"retronas_systems.yml\"\n\n- name: \"{{ my"
  },
  {
    "path": "ansible/retronas_dependencies.yml",
    "chars": 1081,
    "preview": "---\n- hosts: localhost\n  become: yes\n\n  vars:\n    my_name: \"RetroNAS dependencies\"\n    my_file: \"retronas_dependencies\"\n"
  },
  {
    "path": "ansible/retronas_system_config.yml",
    "chars": 88,
    "preview": "---\n- hosts: localhost\n  gather_facts: true\n\n  roles:\n    - retronas.role.system-config\n"
  },
  {
    "path": "ansible/retronas_systems.yml",
    "chars": 232454,
    "preview": "---\n#                            __________________________\n#                       .-:=[ RetroNAS_Systems_Mapping ]=:-."
  },
  {
    "path": "ansible/retronas_update_user.yml",
    "chars": 279,
    "preview": "---\n- hosts: localhost\n  gather_facts: false\n\n  tasks:\n    - name: \"Load RetroNAS config\"\n      ansible.builtin.include_"
  },
  {
    "path": "ansible/retronas_vars.yml.default",
    "chars": 965,
    "preview": "retronas_path: \"/data/retronas\"\nretronas_user: \"retronas\"\nretronas_group: \"retronas\"\nretronas_root: \"/opt/retronas\"\nretr"
  },
  {
    "path": "ansible/roles/retronas.role.apt-backports/tasks/main.yaml",
    "chars": 2535,
    "preview": "---\n- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- name: \"{{ my_nam"
  },
  {
    "path": "ansible/roles/retronas.role.apt-backports/vars/main.yaml",
    "chars": 102,
    "preview": "---\nmy_name: \"Apt Backports\"\nmy_file: \"install_apt-backports\"\n\npackages:\n  - gnupg\n  - aria2\n  - curl\n"
  },
  {
    "path": "ansible/roles/retronas.role.cache/tasks/main.yaml",
    "chars": 698,
    "preview": "- name: \"{{ my_name }} - Gather required facts\"\n  ansible.builtin.setup:\n    gather_subset:\n      - date_time\n\n- name: \""
  },
  {
    "path": "ansible/roles/retronas.role.cache/vars/main.yaml",
    "chars": 136,
    "preview": "retronas_cache_file: \"{{ retronas_root }}/cache/s1_localhost\"\nretronas_systems_file: \"{{ retronas_root }}/ansible/retron"
  },
  {
    "path": "ansible/roles/retronas.role.cockpit/handlers/main.yaml",
    "chars": 141,
    "preview": "- name: \"{{ my_name }} - Restart service\"\n  ansible.builtin.service:\n    name: \"{{ my_service }}\"\n    state: restarted\n "
  },
  {
    "path": "ansible/roles/retronas.role.cockpit/tasks/main.yaml",
    "chars": 1361,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- name: \"{{ my_name }}"
  },
  {
    "path": "ansible/roles/retronas.role.cockpit/vars/main.yaml",
    "chars": 202,
    "preview": "my_name: \"Cockpit\"\nmy_file: \"install_cockpit\"\nmy_service: \"cockpit\"\n\npackages:\n  - cockpit\n  - cockpit-storaged\n  - cock"
  },
  {
    "path": "ansible/roles/retronas.role.cockpit-packages/tasks/main.yaml",
    "chars": 530,
    "preview": "- name: \"{{ my_name }} - install prerequisite packages\"\n  ansible.builtin.package:\n      name: \"{{ package_tools }}\"\n   "
  },
  {
    "path": "ansible/roles/retronas.role.cockpit-packages/templates/install_cockpit-packages/cockpit-packages.sh.j2",
    "chars": 1563,
    "preview": "#!/bin/bash\n#\n# Clone down additional Cockpit Packages\n#\n\nset -u\n\nRNTMP=/tmp/rn_cpack\nCOCKPIT=/usr/share/cockpit\n\n# clea"
  },
  {
    "path": "ansible/roles/retronas.role.cockpit-packages/vars/main.yaml",
    "chars": 133,
    "preview": "my_name: \"cockpit-packages\"\nmy_file: \"install_cockpit-packages\"\n\npackage_tools:\n  - lm-sensors\n\npackage_data:\n  - cockpi"
  },
  {
    "path": "ansible/roles/retronas.role.createdirs/tasks/main.yaml",
    "chars": 2877,
    "preview": "---\n- name: \"{{ my_name }} - Include systems map\"\n  ansible.builtin.include_vars: \"retronas_systems.yml\"\n\n- name: \"{{ my"
  },
  {
    "path": "ansible/roles/retronas.role.curlftpfs/tasks/main.yaml",
    "chars": 745,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.curlftpfs/templates/install_curlftpfs.sh.j2",
    "chars": 408,
    "preview": "# curlftpfs\n\nset -u\n\nVERS=${1:-0.9.2}\nAPPNAME=curlftpfs-${VERS}\nREPO=https://ixpeering.dl.sourceforge.net/project/curlft"
  },
  {
    "path": "ansible/roles/retronas.role.curlftpfs/vars/main.yaml",
    "chars": 249,
    "preview": "my_name: \"curlftpfs\"\nmy_file: \"install_{{ my_name }}\"\n\npackages:\n  - curl\n  - build-essential\n  - libglib2.0-dev\n  - lib"
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore3/tasks/main.yaml",
    "chars": 1082,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore3/vars/main.yaml",
    "chars": 191,
    "preview": "my_name: \"DotNet Core 3.X SDK\"\nmy_file: \"install_dotnetcore3\"\n\npackages:\n  - wget\n  - curl\n  - aria2\n  - coreutils\n\nsrcd"
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore6/tasks/main.yaml",
    "chars": 1082,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore6/vars/main.yaml",
    "chars": 182,
    "preview": "my_name: \"DotNet Core 6.X SDK\"\nmy_file: \"install_dotnetcore6\"\n\npackages:\n- wget\n- curl\n- aria2\n- coreutils\n\nsrcdir: \"{{ "
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore8/tasks/main.yaml",
    "chars": 1083,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.dotnetcore8/vars/main.yaml",
    "chars": 183,
    "preview": "my_name: \"DotNet Core 8.X SDK\"\nmy_file: \"install_dotnetcore8\"\n\npackages:\n- wget\n- curl\n- aria2\n- coreutils\n\nsrcdir: \"{{ "
  },
  {
    "path": "ansible/roles/retronas.role.extradirs/tasks/main.yaml",
    "chars": 65,
    "preview": "- ansible.builtin.import_role:\n    name: retronas.role.createdirs"
  },
  {
    "path": "ansible/roles/retronas.role.extradirs/vars/main.yaml",
    "chars": 319,
    "preview": "my_name: \"Generic Extra dir(s)\"\nmy_file: \"install_romdir\"\nmodule_name: \"extradirs\"\n\ntop_level_paths:\n  - { name: \"saves\""
  },
  {
    "path": "ansible/roles/retronas.role.filesystems/tasks/main.yaml",
    "chars": 171,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n    \n- ansible.builtin."
  },
  {
    "path": "ansible/roles/retronas.role.filesystems/vars/main.yaml",
    "chars": 291,
    "preview": "my_name: \"RetroNAS filesystems\"\nmy_file: \"install_filesystems\"\n\npackages:\n  - btrfs-progs\n  - ntfs-3g\n  - exfatprogs\n  -"
  },
  {
    "path": "ansible/roles/retronas.role.firewalld.port/tasks/main.yaml",
    "chars": 1092,
    "preview": "#\n# FIREWALL\n#\n- name: \"{{ my_name }} - checking firewall rule\"\n  ansible.builtin.stat:\n    path: /etc/firewalld/service"
  },
  {
    "path": "ansible/roles/retronas.role.htpasswd/tasks/main.yaml",
    "chars": 306,
    "preview": "---\n- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- name: \"{{ my_nam"
  },
  {
    "path": "ansible/roles/retronas.role.htpasswd/vars/main.yml",
    "chars": 48,
    "preview": "---\nretronas_htpasswd: \"/etc/retronas.htpasswd\"\n"
  },
  {
    "path": "ansible/roles/retronas.role.nfs/handlers/main.yaml",
    "chars": 150,
    "preview": "- name: \"{{ my_name }} - Restart service\"\n  ansible.builtin.service:\n    name: \"{{ item }}\"\n    state: restarted\n  with_"
  },
  {
    "path": "ansible/roles/retronas.role.nfs/tasks/main.yaml",
    "chars": 952,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.nfs/vars/main.yaml",
    "chars": 346,
    "preview": "my_name: \"NFS\"\nmy_file: \"install_nfs\"\nmodule_name: \"nfs\"\n\npackages:\n  - nfs-common\n  - nfs-kernel-server\n\npaths:\n  - { n"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/handlers/main.yaml",
    "chars": 165,
    "preview": "- name: \"restart nginx\"\n  ansible.builtin.service:\n    name: \"{{ item.name }}\"\n    state: restarted\n  with_items: \"{{ sy"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/tasks/main.yaml",
    "chars": 3933,
    "preview": "---\n- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin."
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/conf/includes/autoindex.conf",
    "chars": 86,
    "preview": "autoindex on;\nautoindex_exact_size off;\nautoindex_format html;\nautoindex_localtime on;"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/conf/includes/listen-80.conf",
    "chars": 26,
    "preview": "listen 80;\nlisten [::]:80;"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/conf/includes/ssl.conf",
    "chars": 228,
    "preview": "listen 443 ssl;\nlisten [::]:443 ssl;\n\nssl_certificate     /etc/ssl/private/retronas.crt;\nssl_certificate_key /etc/ssl/pr"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/conf/sites-available/10-retronas.conf",
    "chars": 486,
    "preview": "server {\n    server_name retronas;\n    server_name retro;\n    server_name www.*;\n\n    include includes/listen-80.conf;\n "
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/conf/sites-available/99-retronas-files.conf",
    "chars": 231,
    "preview": "server {\n    server_name files.*;\n\n    include includes/listen-80.conf;\n    include includes/ssl.conf;\n\n    location / {"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/templates/install_nginx/www/index.html",
    "chars": 418,
    "preview": "<html lang=\"en\">\n<head>\n<title>retroNAS</title>\n</head>\n<body>\n        <a href=\"//files.retro\">files</a><br />\n        <"
  },
  {
    "path": "ansible/roles/retronas.role.nginx/vars/main.yaml",
    "chars": 714,
    "preview": "my_name: \"nginx\"\nmy_file: \"install_{{ my_name }}\"\n\nnginx_sites_available: \"/etc/{{ my_name }}/sites-available\"\nnginx_sit"
  },
  {
    "path": "ansible/roles/retronas.role.package.latest/tasks/main.yaml",
    "chars": 153,
    "preview": "- name: \"{{ my_name }} - Install packages\"\n  ansible.builtin.package:\n    name: \"{{ packages }}\"\n    state: latest\n    u"
  },
  {
    "path": "ansible/roles/retronas.role.paths/tasks/main.yaml",
    "chars": 396,
    "preview": "- name: \"{{ my_name }} - paths\"\n  ansible.builtin.file:\n    src: \"{{ item.src | default(omit) }}\"\n    dest: \"{{ item.des"
  },
  {
    "path": "ansible/roles/retronas.role.romdir/tasks/main.yaml",
    "chars": 70,
    "preview": "---\n- ansible.builtin.import_role:\n    name: retronas.role.createdirs\n"
  },
  {
    "path": "ansible/roles/retronas.role.romdir/vars/main.yaml",
    "chars": 146,
    "preview": "---\nmy_name: \"Generic ROM dir\"\nmy_file: \"install_romdir\"\nmodule_name: \"romdir\"\n\ntop_level_paths:\n  - { name: \"roms\", ena"
  },
  {
    "path": "ansible/roles/retronas.role.samba/handlers/main.yaml",
    "chars": 123,
    "preview": "- name: \"restart samba\"\n  ansible.builtin.service:\n    name: \"{{ item }}\"\n    state: restarted\n  loop: \"{{ my_services }"
  },
  {
    "path": "ansible/roles/retronas.role.samba/tasks/main.yaml",
    "chars": 703,
    "preview": "---\n- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin."
  },
  {
    "path": "ansible/roles/retronas.role.samba/templates/retronas.conf.j2",
    "chars": 341,
    "preview": "## RetroNAS config.\n## This is autogenerated. Changes will be lost.\ncomment = retronas\npath = {{ retronas_path }}\nguest "
  },
  {
    "path": "ansible/roles/retronas.role.samba/vars/main.yaml",
    "chars": 1723,
    "preview": "---\nmy_name: \"Samba\"\nmy_file: \"\"  # required to clear out any play set var\n\npackages:\n  - avahi-daemon\n  - samba\n  - sam"
  },
  {
    "path": "ansible/roles/retronas.role.samba.system/tasks/link.yml",
    "chars": 1985,
    "preview": "---\n- name: \"{{ my_name }} - build layout list (set fact) (links)\"\n  ansible.builtin.set_fact:\n    path_list_ll: \"{{ pat"
  },
  {
    "path": "ansible/roles/retronas.role.samba.system/tasks/main.yaml",
    "chars": 1854,
    "preview": "---\n- name: \"{{ my_name }} - Include systems map\"\n  ansible.builtin.include_vars: \"retronas_systems.yml\"\n\n- name: \"{{ my"
  },
  {
    "path": "ansible/roles/retronas.role.samba.system/tasks/nolink.yml",
    "chars": 985,
    "preview": "---\n- name: \"{{ my_name }} - build layout nolink list (set fact) (dir)\"\n  ansible.builtin.set_fact:\n    path_list_ll: \"{"
  },
  {
    "path": "ansible/roles/retronas.role.samba.system/templates/retronas_system.conf.j2",
    "chars": 361,
    "preview": "## RetroNAS config.\n## This is autogenerated. Changes will be lost.\ncomment = {{ system_key }}\npath = {{ retronas_path }"
  },
  {
    "path": "ansible/roles/retronas.role.sslcert/tasks/main.yaml",
    "chars": 629,
    "preview": "- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- ansible.builtin.impo"
  },
  {
    "path": "ansible/roles/retronas.role.sslcert/vars/main.yaml",
    "chars": 154,
    "preview": "my_name: \"sslcert\"\nmy_file: \"install_{{ my_name }}\"\nmy_cert: /etc/ssl/private/retronas.crt\nmy_key: /etc/ssl/private/retr"
  },
  {
    "path": "ansible/roles/retronas.role.system-config/tasks/main.yaml",
    "chars": 2626,
    "preview": "---\n- name: \"{{ my_name }} - Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- name: \"{{ my_nam"
  },
  {
    "path": "ansible/roles/retronas.role.system-config/vars/main.yaml",
    "chars": 580,
    "preview": "---\nmy_name: \"retronas user config setup\"\nmodule_state: \"present\"\n\nsystem_user_dirs:\n  - config\n  - config/modules\n\ngene"
  },
  {
    "path": "ansible/roles/retronas.role.templates/tasks/main.yaml",
    "chars": 461,
    "preview": "---\n- name: \"{{ my_name }} - templates\"\n  ansible.builtin.template:\n    src: \"templates/{{ my_file }}/{{ tmpl.sub + '/' "
  },
  {
    "path": "ansible/roles/retronas.role.update-user/tasks/main.yaml",
    "chars": 251,
    "preview": "- name: \"Load RetroNAS config\"\n  ansible.builtin.include_vars: retronas_vars.yml\n\n- name: \"update user\"\n  ansible.builti"
  },
  {
    "path": "ansible/roles/retronas.role.x11vnc/tasks/main.yaml",
    "chars": 136,
    "preview": "- ansible.builtin.import_role:\n    name: retronas.role.package.latest\n\n- ansible.builtin.import_role:\n    name: retronas"
  },
  {
    "path": "ansible/roles/retronas.role.x11vnc/templates/install_x11vnc/x11vnc_wrapper.sh.j2",
    "chars": 310,
    "preview": "#!/bin/bash\n\nXDISPLAY=$1\nXAUTH=$2\nPORT=$3\n\nRFBAUTH=/etc/vncpasswd_retronas\n\n# use a local auth file if it exists\nif [ -f"
  },
  {
    "path": "ansible/roles/retronas.role.x11vnc/vars/main.yaml",
    "chars": 165,
    "preview": "my_name: \"x11vnc\"\nmy_file: \"install_{{ my_name }}\"\n\npackages:\n  - xvfb\n  - x11vnc\n\ntemplates:\n  - { name: \"x11vnc_wrappe"
  },
  {
    "path": "ansible/templates/install_3ds_qr_codes/3ds_qr.sh.j2",
    "chars": 2161,
    "preview": "#!/bin/bash\n\n## RetroNAS autogenerated\n\nFLUSH=\"\"\nOPTSTRING=\"f\"\n\nwhile getopts $OPTSTRING ARG\ndo\n  case $ARG in\n    f)\n  "
  },
  {
    "path": "ansible/templates/install_3ds_qr_codes/retronas_3ds_qr.cron.j2",
    "chars": 201,
    "preview": "# RetroNAS automatically generated\n# Every 15 minutes check for new 3DS titles and generate a QR code to match\n*/15 * * "
  },
  {
    "path": "ansible/templates/install_adtpro/ADTPro.properties.j2",
    "chars": 334,
    "preview": "#ADTPro.properties\nAudioHardwareIndex=0\nAudioPortIndex=0\nClient01xCompatibleProtocol=false\nCommPort=/dev/ttyUSB0\nCommPor"
  },
  {
    "path": "ansible/templates/install_adtpro/adtpro.service.j2",
    "chars": 277,
    "preview": "[Unit]\nDescription=ADTPro %i\nStartLimitIntervalSec=60\nStartLimitBurst=4\n\n[Service]\nWorkingDirectory={{ my_dir }}\nExecSta"
  },
  {
    "path": "ansible/templates/install_adtpro/adtpro_retronas.sh.j2",
    "chars": 502,
    "preview": "#!/bin/bash\n\nMODE=${1:-localhost}\nPORT=${2:-60000}\n\nPARENTPID=$(ps -ef | grep -E \"xvfb-run.*adtpro.*$MODE\" | grep -v gre"
  },
  {
    "path": "ansible/templates/install_adtpro/install_adtpro.sh.j2",
    "chars": 931,
    "preview": "#!/bin/bash\n\nset -u\n\nBINDIR=\"/opt/adtpro\"\nDLDIR=$(mktemp -d)\n\n\necho \"Downloading adtpro release...\"\nRELEASE=$( curl -kLs"
  },
  {
    "path": "ansible/templates/install_affstools/install_affstools.sh.j2",
    "chars": 497,
    "preview": "#!/bin/bash\n\nAPP=affstools\nSRCDIR=\"{{ retronas_root }}/src\"\nBINDIR=\"/usr/local/sbin\"\n\nBINS=(\n    affsck\n    mkaffs\n)\n\nec"
  },
  {
    "path": "ansible/templates/install_amitools/install_amitools.sh.j2",
    "chars": 309,
    "preview": "#!/bin/bash\n\nAPP=amitools\nmv /usr/lib/python3*/EXTERNALLY-MANAGED /usr/lib/python3/EXTERNALLY-MANAGED.old 2> /dev/null\np"
  }
]

// ... and 335 more files (download for full content)

About this extraction

This page contains the full source code of the danmons/retronas GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 535 files (998.8 KB), approximately 295.9k tokens, and a symbol index with 11 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!