Compare commits
	
		
			99 Commits
		
	
	
		
			ae4967bc04
			...
			prod
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0d3931d738 | |||
| 7c93f25a5d | |||
| 8445b64d6b | |||
| 8dfb3fe2a6 | |||
| 5b749d2100 | |||
| 57ca267aa5 | |||
| 2ca308c287 | |||
| 40ee72b587 | |||
| 13bc98d7ef | |||
| d916637798 | |||
| 71d236d0ba | |||
| d81c424878 | |||
| 73e527640f | |||
| aa3075a9fc | |||
| 89cdf8157f | |||
| 4e0ff86295 | |||
| 305b8df6ff | |||
| 6a78933875 | |||
| 7095636915 | |||
| 80bba3b21b | |||
| d98bbb02a9 | |||
| 00c87328ab | |||
| b4cdea984e | |||
| 4651726268 | |||
| 3410cf4426 | |||
| d5393f60f3 | |||
| 5f882df33f | |||
| 0dfbd0bd68 | |||
| 0d5b095ad6 | |||
| 07e32decf8 | |||
| afc3b20785 | |||
| ed160da316 | |||
| 2f08b1414e | |||
| c279884da2 | |||
| df8b330893 | |||
| 08a7a22dde | |||
| 57243f65e3 | |||
| 35469851b3 | |||
| 2cf4a348c3 | |||
| 4a33adf073 | |||
| fb00d3e6bc | |||
| 267a260e90 | |||
| 03b9f7e1b2 | |||
| 57dc62a74a | |||
| f7c321bf23 | |||
| 130b243be3 | |||
| 400ef8400c | |||
| d35d9ccdd2 | |||
| a730919b43 | |||
| 4e9e714504 | |||
| c0ba27e782 | |||
| 6d2a822323 | |||
| a8e6e0b6c6 | |||
| 93b919f48b | |||
| 215e7dee69 | |||
| 70ac7bff94 | |||
| 54589ca033 | |||
| 2dd0303176 | |||
| 411f203024 | |||
| 9f22385040 | |||
| 103a79a7ee | |||
| 602376df5f | |||
| 95c87448c8 | |||
| df5421defe | |||
| 1e7e11ed91 | |||
| 07dc365410 | |||
| c248a3c048 | |||
| 16466fb0c8 | |||
| 86e3f40d36 | |||
| 8038e10364 | |||
| 295f29dece | |||
| 8181ee0848 | |||
| c87c4468b3 | |||
| e19902074a | |||
| c12b54d0dc | |||
| a5023b2ef7 | |||
| ad6601f17e | |||
| 8e3e284753 | |||
| df4efb2beb | |||
| c7d06da91e | |||
| 3e1b0cc961 | |||
| 2b551cbff5 | |||
| 64c77cbd20 | |||
| c8186d30da | |||
| 68e1e5a48f | |||
| f61fe14a94 | |||
| a03a1b6493 | |||
| d1f50523fb | |||
| 9339b590e0 | |||
| dfe0b26498 | |||
| 57f14fed8d | |||
| 23b16f5db4 | |||
| a15e0017a6 | |||
| a7e1d0d25a | |||
| b203eab7b5 | |||
| 6d4ac9bb69 | |||
| 5c8eb77f95 | |||
| 544519bbfa | |||
| 1ab1594f6c | 
@@ -7,6 +7,10 @@
 | 
			
		||||
    sshfs: sshfs
 | 
			
		||||
    tar: tar
 | 
			
		||||
    iftop: iftop
 | 
			
		||||
    nethogs: nethogs
 | 
			
		||||
    ntp_server: chrony
 | 
			
		||||
    dig: dig
 | 
			
		||||
    neofetch: neofetch
 | 
			
		||||
 | 
			
		||||
- name: General | Facts | Packages | Parrot OS Fixes
 | 
			
		||||
  set_fact:
 | 
			
		||||
@@ -22,8 +26,14 @@
 | 
			
		||||
    microcode_intel: intel-microcode
 | 
			
		||||
    cron: cron
 | 
			
		||||
    encfs: encfs
 | 
			
		||||
    dig: dnsutils
 | 
			
		||||
  when: ansible_pkg_mgr == "apt"
 | 
			
		||||
 | 
			
		||||
- name: General | Facts | Package | apt | Debian Trixie
 | 
			
		||||
  set_fact:
 | 
			
		||||
    neofetch: fastfetch
 | 
			
		||||
  when: ansible_pkg_mgr == "apt" and ansible_distribution_release == "trixie"
 | 
			
		||||
 | 
			
		||||
- name: General | Facts | Package | pacman
 | 
			
		||||
  set_fact:
 | 
			
		||||
    locate: mlocate
 | 
			
		||||
@@ -99,7 +109,7 @@
 | 
			
		||||
            echo -e "******* Apt *******\n*** Update Cache ***" &&
 | 
			
		||||
            sudo apt update &&
 | 
			
		||||
            echo -e "\n*** Auto Remove ***" &&
 | 
			
		||||
            sudo apt autoremove {{ update_accept_var }} &&
 | 
			
		||||
            sudo apt autoremove --purge {{ update_accept_var }} &&
 | 
			
		||||
            echo -e "\n*** Clean ***" &&
 | 
			
		||||
            sudo apt clean {{ update_accept_var }} &&
 | 
			
		||||
            echo -e "Cleaned!\n\n*** Configure DPKG ***" &&
 | 
			
		||||
@@ -114,7 +124,7 @@
 | 
			
		||||
            echo -e "******* Parrot *******\n*** Update Cache ***" &&
 | 
			
		||||
            sudo apt update &&
 | 
			
		||||
            echo -e "\n*** Auto Remove ***" &&
 | 
			
		||||
            sudo apt autoremove {{ update_accept_var }} &&
 | 
			
		||||
            sudo apt autoremove --purge {{ update_accept_var }} &&
 | 
			
		||||
            parrot_mirrors_suck=true &&
 | 
			
		||||
            while [[ $parrot_mirrors_suck ]]; do
 | 
			
		||||
              unset parrot_mirrors_suck
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    st_install_dir: /usr/local/src/st
 | 
			
		||||
    global_bin: /usr/local/bin
 | 
			
		||||
    x_desktops: /usr/share/xsessions
 | 
			
		||||
    git_repo_http: http://{{ git_host }}/{{ git_user }}/{{ git_project }}
 | 
			
		||||
    git_repo_http: https://{{ git_host }}/{{ git_user }}/{{ git_project }}
 | 
			
		||||
    git_repo_ssh: ssh://git@{{ git_host }}:{{ git_ssh_port }}/{{ git_user }}/{{ git_project }}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								files/scripts/backup_system.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								files/scripts/backup_system.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
## Variables ##
 | 
			
		||||
 | 
			
		||||
if [[ -z "$HOSTNAME" ]]; then
 | 
			
		||||
	echo "*** Pulling Hostname From Command ***"
 | 
			
		||||
	export HOSTNAME="`hostname`"
 | 
			
		||||
fi
 | 
			
		||||
if [[ -z "$HOSTNAME" ]]; then
 | 
			
		||||
	echo "*** Pulling Hostname From /etc/ File ***"
 | 
			
		||||
	export HOSTNAME="`cat /etc/hostname`"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
EXTRA="$1"
 | 
			
		||||
TAG="System"
 | 
			
		||||
DATE="`date "+%Y%m%d-%H%M%S"`"
 | 
			
		||||
BACKUP_DIR="/srv/backup"
 | 
			
		||||
BASENAME="Backup"
 | 
			
		||||
BACKUP="$BACKUP_DIR/$BASENAME.$DATE.$HOSTNAME.$TAG.zip"
 | 
			
		||||
 | 
			
		||||
## Initialization ##
 | 
			
		||||
 | 
			
		||||
echo "*** Creating Backup Directory ***"
 | 
			
		||||
sudo mkdir -pv "$BACKUP_DIR"
 | 
			
		||||
sudo mkdir -pv "$BACKUP_DIR/TRASH"
 | 
			
		||||
sudo chmod -Rv 775 "$BACKUP_DIR"
 | 
			
		||||
sudo chown -Rv root:root "$BACKUP_DIR"
 | 
			
		||||
 | 
			
		||||
## Cleanup ##
 | 
			
		||||
 | 
			
		||||
echo "*** Removing Old Backups ***"
 | 
			
		||||
cd "$BACKUP_DIR"
 | 
			
		||||
sudo mv -v "$BASENAME"*"$TAG"* TRASH/
 | 
			
		||||
sudo rm -v TRASH/*
 | 
			
		||||
 | 
			
		||||
## Main
 | 
			
		||||
 | 
			
		||||
echo "*** Creating backup at '$BACKUP' ***"
 | 
			
		||||
sudo zip -rv "$BACKUP" \
 | 
			
		||||
	/etc /var/{log,mail,spool} /srv /boot \
 | 
			
		||||
	/usr/local/etc $EXTRA \
 | 
			
		||||
	-x "/srv/backup/*"
 | 
			
		||||
status="$?"
 | 
			
		||||
 | 
			
		||||
if [[ "$status" != 0 ]]; then
 | 
			
		||||
	echo "*** ERROR: Failed to create '$BACKUP', file may be incorrect. ***"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -e "$BACKUP" ]]; then
 | 
			
		||||
	ls -alh "$BACKUP"
 | 
			
		||||
	echo "*** '$BACKUP' created successfully! ***"
 | 
			
		||||
else
 | 
			
		||||
	echo "*** '$BACKUP' not found! ***"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -12,6 +12,9 @@
 | 
			
		||||
	"editor.tabSize": 3,
 | 
			
		||||
	"editor.insertSpaces": false,
 | 
			
		||||
	"files.insertFinalNewline": true,
 | 
			
		||||
	"[html]": {
 | 
			
		||||
		"files.insertFinalNewline": false
 | 
			
		||||
	},
 | 
			
		||||
	"files.trimFinalNewlines": true,
 | 
			
		||||
	"git.confirmSync": false,
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -125,13 +125,13 @@
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Provisioning Configuration | General | Load
 | 
			
		||||
  set_fact:
 | 
			
		||||
    provision:  "{{ lookup('ini', 'enable     file={{gen_file}} default=false') }}"
 | 
			
		||||
    provision:  "{{ lookup('ini', 'enable     file={{gen_file}} default=false') | bool }}"
 | 
			
		||||
    user:       "{{ lookup('ini', 'user       file={{gen_file}} default=ling') }}"
 | 
			
		||||
    user_desc:  "{{ lookup('ini', 'user_desc  file={{gen_file}} default=Hyperling') }}"
 | 
			
		||||
    branch:     "{{ lookup('ini', 'branch     file={{gen_file}} default=main') }}"
 | 
			
		||||
    pentesting: "{{ lookup('ini', 'pentesting file={{gen_file}} default=false') }}"
 | 
			
		||||
    no_telem:   "{{ lookup('ini', 'no_telem   file={{gen_file}} default=false') }}"
 | 
			
		||||
    battery:    "{{ lookup('ini', 'battery    file={{gen_file}} default=false') }}"
 | 
			
		||||
    pentesting: "{{ lookup('ini', 'pentesting file={{gen_file}} default=false') | bool }}"
 | 
			
		||||
    no_telem:   "{{ lookup('ini', 'no_telem   file={{gen_file}} default=false') | bool }}"
 | 
			
		||||
    battery:    "{{ lookup('ini', 'battery    file={{gen_file}} default=false') | bool }}"
 | 
			
		||||
    swap_block: "{{ lookup('ini', 'swap_block file={{gen_file}} default=false') }}"
 | 
			
		||||
    swap_count: "{{ lookup('ini', 'swap_count file={{gen_file}} default=1') }}"
 | 
			
		||||
    swap_file:  "{{ lookup('ini', 'swap_file  file={{gen_file}} default=/swapfile') }}"
 | 
			
		||||
@@ -179,6 +179,7 @@
 | 
			
		||||
      ;  enable : Set to true for system to be considered a workstation.
 | 
			
		||||
      ;
 | 
			
		||||
      ;  coding : Set to true for installation of code editors (VSCode, PyCharm, Android Studio)
 | 
			
		||||
      ;  - sdks : Set to true to download additional SDKs to test against.
 | 
			
		||||
      ;
 | 
			
		||||
      ; editing : Set to true for installation of Audio/Video editors (Shotcut, Audacity, OBS Stdio, GIMP)
 | 
			
		||||
      ;           Set to video for only the video related portions.
 | 
			
		||||
@@ -211,15 +212,16 @@
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Provisioning Configuration | Workstation | Load
 | 
			
		||||
  set_fact:
 | 
			
		||||
    workstation: "{{ lookup('ini', 'enable  file={{wrk_file}} default=false') }}"
 | 
			
		||||
    coding:      "{{ lookup('ini', 'coding  file={{wrk_file}} default=false') }}"
 | 
			
		||||
    workstation: "{{ lookup('ini', 'enable  file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    coding:      "{{ lookup('ini', 'coding  file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    sdks:        "{{ lookup('ini', 'sdks    file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    editing:     "{{ lookup('ini', 'editing file={{wrk_file}} default=false') }}"
 | 
			
		||||
    gaming:      "{{ lookup('ini', 'gaming  file={{wrk_file}} default=false') }}"
 | 
			
		||||
    rdp:         "{{ lookup('ini', 'rdp     file={{wrk_file}} default=false') }}"
 | 
			
		||||
    vnc:         "{{ lookup('ini', 'vnc     file={{wrk_file}} default=false') }}"
 | 
			
		||||
    bsd_gpu:     "{{ lookup('ini', 'bsd_gpu file={{wrk_file}} default=false') }}"
 | 
			
		||||
    mobile:      "{{ lookup('ini', 'mobile  file={{wrk_file}} default=false') }}"
 | 
			
		||||
    redmode:     "{{ lookup('ini', 'redmode file={{wrk_file}} default=true' ) }}"
 | 
			
		||||
    gaming:      "{{ lookup('ini', 'gaming  file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    rdp:         "{{ lookup('ini', 'rdp     file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    vnc:         "{{ lookup('ini', 'vnc     file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    bsd_gpu:     "{{ lookup('ini', 'bsd_gpu file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    mobile:      "{{ lookup('ini', 'mobile  file={{wrk_file}} default=false') | bool }}"
 | 
			
		||||
    redmode:     "{{ lookup('ini', 'redmode file={{wrk_file}} default=true' ) | bool }}"
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Provisioning Configuration | Workstation | List
 | 
			
		||||
  set_fact:
 | 
			
		||||
@@ -227,6 +229,7 @@
 | 
			
		||||
  loop:
 | 
			
		||||
    - { 'workstation': "{{ workstation }}" }
 | 
			
		||||
    - { 'coding': "{{ coding }}" }
 | 
			
		||||
    - { 'sdks': "{{ sdks }}" }
 | 
			
		||||
    - { 'editing': "{{ editing }}" }
 | 
			
		||||
    - { 'gaming': "{{ gaming }}" }
 | 
			
		||||
    - { 'rdp': "{{ rdp }}" }
 | 
			
		||||
@@ -285,18 +288,18 @@
 | 
			
		||||
#
 | 
			
		||||
#- name: General | Account Management | Provisioning Configuration | Miner | Load
 | 
			
		||||
#  set_fact:
 | 
			
		||||
#    miner:              "{{ lookup('ini', 'enable             file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    amdgpu:             "{{ lookup('ini', 'amdgpu             file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer:          "{{ lookup('ini', 'nanominer          file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer_cpu:      "{{ lookup('ini', 'nanominer_cpu      file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer_cpu_pool: "{{ lookup('ini', 'nanominer_cpu_pool file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer_gpu:      "{{ lookup('ini', 'nanominer_gpu      file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer_gpus:     "{{ lookup('ini', 'nanominer_gpus     file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nanominer_gpu_pool: "{{ lookup('ini', 'nanominer_gpu_pool file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    eth_minhashrate:    "{{ lookup('ini', 'eth_minhashrate    file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    ethminer:           "{{ lookup('ini', 'ethminer           file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    nvidia:             "{{ lookup('ini', 'nvidia             file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    xmr_stak_cpu:       "{{ lookup('ini', 'xmr_stak_cpu       file={{mnr_file}} default=false') }}"
 | 
			
		||||
#    miner:              "{{ lookup('ini', 'enable             file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    amdgpu:             "{{ lookup('ini', 'amdgpu             file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer:          "{{ lookup('ini', 'nanominer          file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer_cpu:      "{{ lookup('ini', 'nanominer_cpu      file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer_cpu_pool: "{{ lookup('ini', 'nanominer_cpu_pool file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer_gpu:      "{{ lookup('ini', 'nanominer_gpu      file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer_gpus:     "{{ lookup('ini', 'nanominer_gpus     file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nanominer_gpu_pool: "{{ lookup('ini', 'nanominer_gpu_pool file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    eth_minhashrate:    "{{ lookup('ini', 'eth_minhashrate    file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    ethminer:           "{{ lookup('ini', 'ethminer           file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    nvidia:             "{{ lookup('ini', 'nvidia             file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#    xmr_stak_cpu:       "{{ lookup('ini', 'xmr_stak_cpu       file={{mnr_file}} default=false') | bool }}"
 | 
			
		||||
#
 | 
			
		||||
#- name: General | Account Management | Provisioning Configuration | Miner | List
 | 
			
		||||
#  set_fact:
 | 
			
		||||
@@ -354,14 +357,14 @@
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Provisioning Configuration | Server | Load
 | 
			
		||||
  set_fact:
 | 
			
		||||
    server:     "{{ lookup('ini', 'enable     file={{srv_file}} default=false') }}"
 | 
			
		||||
    server:     "{{ lookup('ini', 'enable     file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    domain:     "{{ lookup('ini', 'domain     file={{srv_file}} default=hyperling.com') }}"
 | 
			
		||||
    onlyoffice: "{{ lookup('ini', 'onlyoffice file={{srv_file}} default=false') }}"
 | 
			
		||||
    grafana:    "{{ lookup('ini', 'grafana    file={{srv_file}} default=false') }}"
 | 
			
		||||
    influxdb1:  "{{ lookup('ini', 'influxdb1  file={{srv_file}} default=false') }}"
 | 
			
		||||
    influxdb2:  "{{ lookup('ini', 'influxdb2  file={{srv_file}} default=false') }}"
 | 
			
		||||
    certbot:    "{{ lookup('ini', 'certbot    file={{srv_file}} default=false') }}"
 | 
			
		||||
    hugo:       "{{ lookup('ini', 'hugo       file={{srv_file}} default=false') }}"
 | 
			
		||||
    onlyoffice: "{{ lookup('ini', 'onlyoffice file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    grafana:    "{{ lookup('ini', 'grafana    file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    influxdb1:  "{{ lookup('ini', 'influxdb1  file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    influxdb2:  "{{ lookup('ini', 'influxdb2  file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    certbot:    "{{ lookup('ini', 'certbot    file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
    hugo:       "{{ lookup('ini', 'hugo       file={{srv_file}} default=false') | bool }}"
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Provisioning Configuration | Server | List
 | 
			
		||||
  set_fact:
 | 
			
		||||
 
 | 
			
		||||
@@ -283,6 +283,19 @@
 | 
			
		||||
      alias edit-config-wrk="sudo $EDITOR {{ wrk_file }}"
 | 
			
		||||
      alias edit-config-mnr="sudo $EDITOR {{ mnr_file }}"
 | 
			
		||||
      alias edit-config-srv="sudo $EDITOR {{ srv_file }}"
 | 
			
		||||
    function_clean_trashed: |
 | 
			
		||||
      function clean-trashed {
 | 
			
		||||
        dir="$1"
 | 
			
		||||
        if [[ -z $dir ]]; then
 | 
			
		||||
          dir="./"
 | 
			
		||||
        fi
 | 
			
		||||
        cd $dir
 | 
			
		||||
        dir="`pwd`"
 | 
			
		||||
        echo "Removing '.trashed*' files in '$dir'."
 | 
			
		||||
        find "$dir" -name ".trashed*" -exec du -h {} \; -delete | sort -h
 | 
			
		||||
      }
 | 
			
		||||
      alias trashed-cleanup="clean-trashed"
 | 
			
		||||
      alias trashed-clean="clean-trashed"
 | 
			
		||||
    function_check_trash: |
 | 
			
		||||
      function check-trash() {
 | 
			
		||||
        unset OPTIND
 | 
			
		||||
@@ -378,6 +391,9 @@
 | 
			
		||||
        fi
 | 
			
		||||
        echo "Checking but not cleaning /var/mail..."
 | 
			
		||||
        du -ha /var/mail | sort -h
 | 
			
		||||
        if [[ $clean == "Y" ]]; then
 | 
			
		||||
          clean-trashed "~/"
 | 
			
		||||
        fi
 | 
			
		||||
        return 0
 | 
			
		||||
      }
 | 
			
		||||
      alias check_trash="check-trash"
 | 
			
		||||
@@ -386,18 +402,20 @@
 | 
			
		||||
    alias_trash_clean: alias trash-clean='trash-check --clean'
 | 
			
		||||
    alias_clean_dir: |
 | 
			
		||||
      function clean-dir() {
 | 
			
		||||
        sudo du -hs
 | 
			
		||||
        clean_dir="`date '+%Y%m%d_%H%M%S'`_CLEANED"
 | 
			
		||||
        trash_dir="$HOME/TRASH/$clean_dir"
 | 
			
		||||
        curr_dir="`pwd`"
 | 
			
		||||
        mkdir -pv "$trash_dir"
 | 
			
		||||
        echo "$curr_dir is being cleaned at `date`." | tee "$trash_dir"/INFO.txt
 | 
			
		||||
        mv -v ..?* .[!.]* * "$trash_dir"/ | tee -a "$trash_dir"/INFO.txt
 | 
			
		||||
        sudo du -hs
 | 
			
		||||
      }
 | 
			
		||||
    function_clean: |
 | 
			
		||||
      function clean() {
 | 
			
		||||
        sudo du -hs
 | 
			
		||||
        clean-dir
 | 
			
		||||
        sudo du -hs
 | 
			
		||||
        clean-trash
 | 
			
		||||
        clean-code
 | 
			
		||||
        clean-backups
 | 
			
		||||
      }
 | 
			
		||||
    function_flatpak_usage: |
 | 
			
		||||
      function flatpak-usage() {
 | 
			
		||||
@@ -409,6 +427,10 @@
 | 
			
		||||
          fi
 | 
			
		||||
        done | sort -n
 | 
			
		||||
      }
 | 
			
		||||
      alias flatpak-info="flatpak-usage"
 | 
			
		||||
      alias flatpak-space="flatpak-usage"
 | 
			
		||||
      alias flatpak-size="flatpak-usage"
 | 
			
		||||
      alias flatpak-sizes="flatpak-usage"
 | 
			
		||||
    function_flatpak_purge: |
 | 
			
		||||
      function flatpak-purge() {
 | 
			
		||||
        flatpak remove --all --delete-data &&
 | 
			
		||||
@@ -436,6 +458,7 @@
 | 
			
		||||
        docker compose up -d
 | 
			
		||||
 | 
			
		||||
        if [[ -n "$1" ]]; then
 | 
			
		||||
          echo "Following logs of '$1':"
 | 
			
		||||
          docker logs -f $1
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
@@ -458,6 +481,7 @@
 | 
			
		||||
        docker compose up -d
 | 
			
		||||
 | 
			
		||||
        if [[ -n "$1" ]]; then
 | 
			
		||||
          echo "Following logs of '$1':"
 | 
			
		||||
          docker logs -f $1
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
@@ -524,6 +548,7 @@
 | 
			
		||||
        docker compose up -d
 | 
			
		||||
 | 
			
		||||
        if [[ -n "$1" ]]; then
 | 
			
		||||
          echo "Following logs of '$1':"
 | 
			
		||||
          docker logs -f $1
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
@@ -539,6 +564,16 @@
 | 
			
		||||
          echo -e "\n*** `basename $project` ***"
 | 
			
		||||
          cd $project
 | 
			
		||||
          if [[ -d .git ]]; then
 | 
			
		||||
            git ls-remote --exit-code --heads origin dev
 | 
			
		||||
            dev_exists="$?"
 | 
			
		||||
            if [[ "$dev_exists" == 0 ]]; then
 | 
			
		||||
              git switch dev
 | 
			
		||||
            elif [[ "$dev_exists" == 2 ]]; then
 | 
			
		||||
              git switch main
 | 
			
		||||
            else
 | 
			
		||||
              echo "ERROR: Unknown status for dev_exists, '$dev_exists'."
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
            git pull
 | 
			
		||||
            git push
 | 
			
		||||
          else
 | 
			
		||||
@@ -567,14 +602,27 @@
 | 
			
		||||
          env-ansible dev
 | 
			
		||||
          env-docker dev
 | 
			
		||||
          env-termux dev
 | 
			
		||||
          env-obtainium-hyperling dev
 | 
			
		||||
          nodejs-website dev
 | 
			
		||||
          ebook-health-protocol dev
 | 
			
		||||
          ebook-freedom-flyer dev
 | 
			
		||||
          ebook-technology-alternatives dev
 | 
			
		||||
          ebook-narcissism-healing dev
 | 
			
		||||
          ebook-forest-howto dev
 | 
			
		||||
          ebook-template main
 | 
			
		||||
          flutter-expense-tracker dev
 | 
			
		||||
          flutter-social-traveler-app dev
 | 
			
		||||
          nodejs-social-traveler-server dev
 | 
			
		||||
          misc-spare-change main
 | 
			
		||||
          flutter-buddy-website dev
 | 
			
		||||
          flutter-sunset-alarm dev
 | 
			
		||||
          android-infinite-timer dev
 | 
			
		||||
          android-carb-up dev
 | 
			
		||||
          android-hypergames dev
 | 
			
		||||
          android-45-minute-rule dev
 | 
			
		||||
          android-tictactoe dev
 | 
			
		||||
          hugo-jackanope dev
 | 
			
		||||
          hugo-website dev
 | 
			
		||||
      EOF
 | 
			
		||||
      }
 | 
			
		||||
      function code-reseed {
 | 
			
		||||
@@ -667,6 +715,9 @@
 | 
			
		||||
        done
 | 
			
		||||
        cd
 | 
			
		||||
 | 
			
		||||
        echo -e "******* PDFs *******"
 | 
			
		||||
        find ~/Code/ebook-* -name "*.pdf" -exec du -h {} \; -delete | sort -h
 | 
			
		||||
 | 
			
		||||
        echo -e "\n*** Done! ***"
 | 
			
		||||
      }
 | 
			
		||||
      alias code-clean="clean-code"
 | 
			
		||||
@@ -724,6 +775,184 @@
 | 
			
		||||
      alias chmod='chmod -c'
 | 
			
		||||
    alias_iftop: |
 | 
			
		||||
      alias iftop='sudo iftop'
 | 
			
		||||
    alias_ls: |
 | 
			
		||||
      alias l='ls'
 | 
			
		||||
      alias ll='ls -alh'
 | 
			
		||||
      alias lh='ls -ash'
 | 
			
		||||
    alias_progs: |
 | 
			
		||||
      alias progs='ps -ef'
 | 
			
		||||
    alias_nethogs: |
 | 
			
		||||
      alias nethogs='sudo nethogs'
 | 
			
		||||
    alias_ansible_facts: |
 | 
			
		||||
      alias ansible-facts='ansible localhost -m setup --connection=local'
 | 
			
		||||
    function_now: |
 | 
			
		||||
      function now {
 | 
			
		||||
        date "+%Y%m%d-%H%M%S"
 | 
			
		||||
      }
 | 
			
		||||
      function today {
 | 
			
		||||
        date "+%Y%m%d"
 | 
			
		||||
      }
 | 
			
		||||
    function_backup: |
 | 
			
		||||
      function backup {
 | 
			
		||||
        /usr/local/bin/backup_system.sh
 | 
			
		||||
      }
 | 
			
		||||
      alias backup-system="backup"
 | 
			
		||||
      alias system-backup="backup"
 | 
			
		||||
      alias check-backups="ll /srv/backup"
 | 
			
		||||
      function clean-backup {
 | 
			
		||||
        sh -c "rm -rfv /srv/backup/*"
 | 
			
		||||
      }
 | 
			
		||||
      alias clean-backups="clean-backup"
 | 
			
		||||
    function_log: |
 | 
			
		||||
      function log {
 | 
			
		||||
        echo -e "$1"
 | 
			
		||||
      }
 | 
			
		||||
      function blog {
 | 
			
		||||
        echo -e "\n\n$1\n\n"
 | 
			
		||||
      }
 | 
			
		||||
    function_debian_upgrade: |
 | 
			
		||||
      function debian-upgrade {
 | 
			
		||||
        typeset -l OLD NEW
 | 
			
		||||
        OLD="$1"
 | 
			
		||||
        NEW="$2"
 | 
			
		||||
        blog "*** Upgrading from '$OLD' to '$NEW' ***"
 | 
			
		||||
        if [[ -z "$OLD" || -z "$NEW" ]]; then
 | 
			
		||||
          echo -n "ERROR: Please pass the OLD and NEW version names"
 | 
			
		||||
          echo ", such as 'debian-upgrade bookworm trixie'. "
 | 
			
		||||
          return 1
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        blog "*** Running 'backup' before starting upgrade. ***"
 | 
			
		||||
        sleep 1
 | 
			
		||||
 | 
			
		||||
        backup
 | 
			
		||||
 | 
			
		||||
        blog "*** Listing the current apt listing for '$OLD' ***"
 | 
			
		||||
        sudo grep "$OLD" /etc/apt/sources.list /etc/apt/sources.list.d/*
 | 
			
		||||
 | 
			
		||||
        echo -en "\nAre these the entries you'd like changed to '$NEW'? (y/N) "
 | 
			
		||||
        typeset -u confirm_change
 | 
			
		||||
        read confirm_change
 | 
			
		||||
 | 
			
		||||
        if [[ -z "$confirm_change" || "$confirm_change" == "N"* ]]; then
 | 
			
		||||
          blog "*** Aborting upgrade, change rejected. ***"
 | 
			
		||||
          return 1
 | 
			
		||||
        fi
 | 
			
		||||
        unset confirm_change
 | 
			
		||||
 | 
			
		||||
        blog "*** Continuing with upgrade. ***"
 | 
			
		||||
        sudo sed -i "s/$OLD/$NEW/g" /etc/apt/sources.list
 | 
			
		||||
        find /etc/apt/sources.list.d/ -name "*.list" \
 | 
			
		||||
          -exec sudo sed -i "s/$OLD/$NEW/g" {} \;
 | 
			
		||||
        find /etc/apt/sources.list.d/ -name "*.sources" \
 | 
			
		||||
          -exec sudo sed -i "s/$OLD/$NEW/g" {} \;
 | 
			
		||||
 | 
			
		||||
        sudo grep $OLD /etc/apt/sources.list /etc/apt/sources.list.d/*.{list,sources}
 | 
			
		||||
        sudo grep $NEW /etc/apt/sources.list /etc/apt/sources.list.d/*.{list,sources}
 | 
			
		||||
 | 
			
		||||
        echo -en "\nDo the source files look correct? (y/N) "
 | 
			
		||||
        typeset -u confirm_correct
 | 
			
		||||
        read confirm_correct
 | 
			
		||||
 | 
			
		||||
        if [[ -z "$confirm_correct" || "$confirm_correct" == "N"* ]]; then
 | 
			
		||||
          blog "*** Aborting upgrade, confirmation rejected. ***"
 | 
			
		||||
          return 1
 | 
			
		||||
        fi
 | 
			
		||||
        unset confirm_correct
 | 
			
		||||
 | 
			
		||||
        blog "*** Starting the upgrade. ***"
 | 
			
		||||
        sleep 1
 | 
			
		||||
 | 
			
		||||
        sudo apt update
 | 
			
		||||
        sudo apt upgrade --without-new-pkgs
 | 
			
		||||
 | 
			
		||||
        blog -e "*** Upgrades complete, now add new packages. ***"
 | 
			
		||||
        sleep 1
 | 
			
		||||
        sudo apt full-upgrade
 | 
			
		||||
 | 
			
		||||
        blog "*** New packages complete, clean apt files. ***"
 | 
			
		||||
        sleep 1
 | 
			
		||||
        sudo apt autoremove --purge
 | 
			
		||||
        sudo apt clean
 | 
			
		||||
 | 
			
		||||
        blog "*** All done! '$OLD' is now '$NEW'. Please reboot. ***"
 | 
			
		||||
        sleep 1
 | 
			
		||||
        unset OLD NEW
 | 
			
		||||
      }
 | 
			
		||||
      alias upgrade-debian="debian-upgrade"
 | 
			
		||||
    function_ebook_convert: |
 | 
			
		||||
      # Regenerate all eBook projects at once.
 | 
			
		||||
      function ebook-convert {
 | 
			
		||||
        find ~/Code/ebook-* -name "*.pdf" -print -delete
 | 
			
		||||
        find ~/Code/ebook-* -name convert.sh -print -exec bash "{}" \;
 | 
			
		||||
      }
 | 
			
		||||
      alias ebooks="ebook-convert"
 | 
			
		||||
      alias convert="ebook-convert"
 | 
			
		||||
    alias_sudo: |
 | 
			
		||||
      # Allows for alias expansions when using sudo, such as doing "sudo ll".
 | 
			
		||||
      alias sudo="sudo "
 | 
			
		||||
    function_load_branch: |
 | 
			
		||||
      # Change a branch to point at another.
 | 
			
		||||
      function load-branch {
 | 
			
		||||
        rcvr="$1" # branch which we want to modify
 | 
			
		||||
        base="$2" # branch with the changes we want
 | 
			
		||||
 | 
			
		||||
        if [[ "$rcvr" == "main" ]]; then
 | 
			
		||||
          echo "*** ERROR: Are you nuts, fool!? Not main! Do it manually! ***"
 | 
			
		||||
          exit 1
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        if [[ -z "$base" ]]; then
 | 
			
		||||
          if [[ "$rcvr" == "prod" ]]; then
 | 
			
		||||
            base="stage"
 | 
			
		||||
          elif [[ "$rcvr" == "stage" ]]; then
 | 
			
		||||
            base="dev"
 | 
			
		||||
          else
 | 
			
		||||
            echo "* Unsure which branch to use for '$rcvr'. Please specify."
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          echo "* Base was not specified, using '$base' for '$rcvr'."
 | 
			
		||||
        else
 | 
			
		||||
          echo "* Requested pointing '$rcvr' branch to '$base'."
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        echo -e "\n* Ensuring we are on base branch '$base'." &&
 | 
			
		||||
        git switch "$base" &&
 | 
			
		||||
        echo -e "\n* Changing pointer for '$rcvr' to '$base'." &&
 | 
			
		||||
        git branch -f "$rcvr" "$base" &&
 | 
			
		||||
        #echo -e "\n* Switching to branch '$rcvr'." &&
 | 
			
		||||
        #git switch "$rcvr" &&
 | 
			
		||||
        echo -e "\n* Forcing push on branch '$rcvr'." &&
 | 
			
		||||
        git push --force --set-upstream origin "$rcvr" &&
 | 
			
		||||
        echo -e "\n* Done! Displaying list of remote branches." &&
 | 
			
		||||
        git ls-remote --heads | sort
 | 
			
		||||
 | 
			
		||||
        if [[ "$base" != "dev" ]]; then
 | 
			
		||||
          echo -e "\n* Checking if a dev branch exists."
 | 
			
		||||
          git ls-remote --exit-code --heads origin dev
 | 
			
		||||
          dev_exists="$?"
 | 
			
		||||
          if [[ "$dev_exists" == 0 ]]; then
 | 
			
		||||
            echo -e "\n* Switching back to dev."
 | 
			
		||||
            git switch dev
 | 
			
		||||
          elif [[ "$dev_exists" == 2 ]]; then
 | 
			
		||||
            echo -e "\n* Switching back to main."
 | 
			
		||||
            git switch main
 | 
			
		||||
          else
 | 
			
		||||
            echo "*** ERROR: Unknown status for dev_exists, '$dev_exists'. ***"
 | 
			
		||||
          fi
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        echo -e "\n* Verifying which branch we're on."
 | 
			
		||||
        git branch
 | 
			
		||||
      }
 | 
			
		||||
      alias load-prod="load-branch prod"
 | 
			
		||||
      alias load-stage="load-branch stage"
 | 
			
		||||
      alias rollback-prod="load-branch prod main"
 | 
			
		||||
      alias rollback-stage="load-branch stage prod"
 | 
			
		||||
      alias rollback-dev="load-branch dev stage"
 | 
			
		||||
      alias reset-prod="load-branch prod main"
 | 
			
		||||
      alias reset-stage="load-branch stage main"
 | 
			
		||||
      alias reset-dev="load-branch dev main"
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Users | Files | Common Variable
 | 
			
		||||
  set_fact:
 | 
			
		||||
@@ -761,6 +990,7 @@
 | 
			
		||||
      {{ metasploit_aliases }}
 | 
			
		||||
      {{ show_config_aliases }}
 | 
			
		||||
      {{ edit_config_aliases }}
 | 
			
		||||
      {{ function_clean_trashed }}
 | 
			
		||||
      {{ function_check_trash }}
 | 
			
		||||
      {{ function_clean }}
 | 
			
		||||
      {{ function_flatpak_usage }}
 | 
			
		||||
@@ -788,6 +1018,17 @@
 | 
			
		||||
      {{ function_ansible_vars }}
 | 
			
		||||
      {{ alias_permission_commands }}
 | 
			
		||||
      {{ alias_iftop }}
 | 
			
		||||
      {{ alias_ls }}
 | 
			
		||||
      {{ alias_progs }}
 | 
			
		||||
      {{ alias_nethogs }}
 | 
			
		||||
      {{ alias_ansible_facts }}
 | 
			
		||||
      {{ function_now }}
 | 
			
		||||
      {{ function_backup }}
 | 
			
		||||
      {{ function_log }}
 | 
			
		||||
      {{ function_debian_upgrade }}
 | 
			
		||||
      {{ function_ebook_convert }}
 | 
			
		||||
      {{ alias_sudo }}
 | 
			
		||||
      {{ function_load_branch }}
 | 
			
		||||
 | 
			
		||||
- name: General | Account Management | Users | Files | .bashrc
 | 
			
		||||
  blockinfile:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,18 @@
 | 
			
		||||
---
 | 
			
		||||
# Jobs relating to the ansible user.
 | 
			
		||||
 | 
			
		||||
# $RANDOM is anywhere from 0 to 32767 in BASH. This would be up to ~9 hours.
 | 
			
		||||
# $RANDOM /  10 can be up to about 3200 seconds, or ~55 minutes.
 | 
			
		||||
# $RANDOM /  20 can be up to about 1600 seconds, or ~27 minutes.
 | 
			
		||||
# $RANDOM /  50 can be up to about  650 seconds, or ~11 minutes.
 | 
			
		||||
# $RANDOM / 100 can be up to about  320 seconds, or  ~5 minutes.
 | 
			
		||||
# This prevents multiple systems from hitting it at the exact same time.
 | 
			
		||||
- name: General | Cron | Ansible | Create Subscriber Job
 | 
			
		||||
  cron:
 | 
			
		||||
    user: ansible
 | 
			
		||||
    name: "Ansible Sync"
 | 
			
		||||
    minute: "*/30"
 | 
			
		||||
    job: "sudo {{ ansible_pull_exec.stdout }} -o -U {{ git_repo_http }} --checkout {{ branch }}"
 | 
			
		||||
    job: "bash -c 'sleep $(( $RANDOM / 20 )); sudo {{ ansible_pull_exec.stdout }} -v -o -U {{ git_repo_http }} --checkout {{ branch }}'"
 | 
			
		||||
    state: present
 | 
			
		||||
    disabled: "{{ 'yes' if no_telem else 'no' }}"
 | 
			
		||||
 | 
			
		||||
@@ -14,7 +20,7 @@
 | 
			
		||||
  cron:
 | 
			
		||||
    user: ansible
 | 
			
		||||
    name: "Ansible Weekly Forced Sync"
 | 
			
		||||
    special_time: weekly
 | 
			
		||||
    job: "{{ user_root.home }}/bin/scm.sh"
 | 
			
		||||
    special_time: daily
 | 
			
		||||
    job: "bash -c 'sleep $(( $RANDOM /  1 )); sudo {{ ansible_pull_exec.stdout }} -v    -U {{ git_repo_http }} --checkout {{ branch }}'"
 | 
			
		||||
    state: present
 | 
			
		||||
    disabled: "{{ 'yes' if no_telem else 'no' }}"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,22 @@
 | 
			
		||||
    metasploit_installer: msfinstall
 | 
			
		||||
  when: ansible_system in ("Linux", "Darwin")
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Metasploit | Refresh Apt Files
 | 
			
		||||
  shell: "{{ item }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    - "mkdir -p /tmp/apt/"
 | 
			
		||||
    - "mv -fv /usr/share/keyrings/metasploit-framework.gpg /tmp/apt/metasploit-framework.gpg.old"
 | 
			
		||||
    - "mv -fv /etc/apt/sources.list.d/metasploit-framework.list /tmp/apt/metasploit-framework.list.old"
 | 
			
		||||
    - "mv -fv /etc/apt/preferences.d/pin-metasploit.pref /tmp/apt/pin-metasploit.pref.old"
 | 
			
		||||
  when: ansible_system in ("Linux")
 | 
			
		||||
  ignore_errors: true
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Metasploit | Install
 | 
			
		||||
  shell: "{{ item }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    - "mv -fv /usr/share/keyrings/metasploit-framework.gpg /usr/share/keyrings/metasploit-framework.gpg.old"
 | 
			
		||||
    - "curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > {{ metasploit_installer }}"
 | 
			
		||||
    - "chmod 755 {{ metasploit_installer }}"
 | 
			
		||||
    - "mkdir -p {{ global_bin }}"
 | 
			
		||||
    - "mv -fv ./msfinstall {{ global_bin }}/{{ metasploit_installer }}"
 | 
			
		||||
    - "{{ global_bin }}/{{ metasploit_installer }}"
 | 
			
		||||
    - yes y | "{{ global_bin }}/{{ metasploit_installer }}"
 | 
			
		||||
  when: ansible_system in ("Linux", "Darwin")
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@
 | 
			
		||||
    - bash
 | 
			
		||||
    - sudo
 | 
			
		||||
    - nmap
 | 
			
		||||
    - neofetch
 | 
			
		||||
    - "{{ neofetch }}"
 | 
			
		||||
    - "{{ sshfs }}"
 | 
			
		||||
    - "{{ locate }}"
 | 
			
		||||
    - zsh
 | 
			
		||||
@@ -57,6 +57,9 @@
 | 
			
		||||
    - "{{ encfs }}"
 | 
			
		||||
    - rsync
 | 
			
		||||
    - "{{ iftop }}"
 | 
			
		||||
    - "{{ nethogs }}"
 | 
			
		||||
    - "{{ ntp_server }}"
 | 
			
		||||
    - "{{ dig }}"
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Packages | Install Software (DEV)
 | 
			
		||||
@@ -139,14 +142,6 @@
 | 
			
		||||
  when: ansible_distribution != "Ubuntu"
 | 
			
		||||
  ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Packages | GS Connect (KDE Connect, Android Tool)
 | 
			
		||||
  package:
 | 
			
		||||
    name:
 | 
			
		||||
    - gnome-shell-extension-gsconnect
 | 
			
		||||
    state: present
 | 
			
		||||
  when: ansible_distribution in ("Debian")
 | 
			
		||||
  ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Packages | Other Debian Packages
 | 
			
		||||
  package:
 | 
			
		||||
    name:
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,11 @@
 | 
			
		||||
    pattern: "{{ crond_pattern }}"
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: yes
 | 
			
		||||
  when: ansible_virtualization_type != 'docker'
 | 
			
		||||
  register: cron_status
 | 
			
		||||
  until: cron_status.state == "started"
 | 
			
		||||
  retries: 3
 | 
			
		||||
  delay: 3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## CUPS ##
 | 
			
		||||
@@ -76,6 +81,11 @@
 | 
			
		||||
    pattern: "{{ sshd_pattern }}"
 | 
			
		||||
    state: reloaded
 | 
			
		||||
    enabled: yes
 | 
			
		||||
  when: ansible_virtualization_type != 'docker'
 | 
			
		||||
  register: sshd_status
 | 
			
		||||
  until: sshd_status.state == "started"
 | 
			
		||||
  retries: 3
 | 
			
		||||
  delay: 3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## JournalCTL ##
 | 
			
		||||
@@ -96,3 +106,24 @@
 | 
			
		||||
    state: stopped
 | 
			
		||||
    enabled: no
 | 
			
		||||
  ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
## NTP ##
 | 
			
		||||
 | 
			
		||||
- name: General | Software | Services | NTP | Enable
 | 
			
		||||
  service:
 | 
			
		||||
    name: "{{ ntp_server }}"
 | 
			
		||||
    pattern: "{{ ntp_server }}"
 | 
			
		||||
    state: started
 | 
			
		||||
    enabled: yes
 | 
			
		||||
  when: ansible_virtualization_type != 'docker'
 | 
			
		||||
  register: ntp_status
 | 
			
		||||
  until: ntp_status.state == "started"
 | 
			
		||||
  retries: 3
 | 
			
		||||
  delay: 3
 | 
			
		||||
 | 
			
		||||
## Timezone ##
 | 
			
		||||
 | 
			
		||||
# TBD/TODO:
 | 
			
		||||
# Add a field to general.yml config file which gets applied via timedatectl and /etc/localtime.
 | 
			
		||||
# Example of what to do to file:
 | 
			
		||||
#    /etc/localtime -> ../usr/share/zoneinfo/America/Phoenix
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,9 @@
 | 
			
		||||
  - name: General | Software | Swap | Check For Swapfile
 | 
			
		||||
    stat:
 | 
			
		||||
      path: "{{ swap_file }}"
 | 
			
		||||
      get_attributes: false
 | 
			
		||||
      get_checksum: false
 | 
			
		||||
      get_mime: false
 | 
			
		||||
    register: swap_check
 | 
			
		||||
 | 
			
		||||
  - name: General | Software | Swap | Install Block
 | 
			
		||||
 
 | 
			
		||||
@@ -121,7 +121,7 @@
 | 
			
		||||
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"
 | 
			
		||||
 | 
			
		||||
- name: Miner | Driver | AMDGPU | Update + Clean System
 | 
			
		||||
  shell: "apt update; apt dist-upgrade -y; apt autoremove -y"
 | 
			
		||||
  shell: "apt update; apt dist-upgrade -y; apt autoremove --purge -y"
 | 
			
		||||
  when: amdgpu_install.failed and hwe_kernel.stdout != "0"
 | 
			
		||||
 | 
			
		||||
# This is to ensure we can test adding `apt install --install-recommends linux-generic` later
 | 
			
		||||
 
 | 
			
		||||
@@ -30,23 +30,142 @@
 | 
			
		||||
    android_sdkmanager_temp: "{{ android_sdk_cmdline_temp }}/cmdline-tools/bin/sdkmanager"
 | 
			
		||||
    android_sdkmanager_final: "{{ android_sdk_cmdline_final }}/sdkmanager"
 | 
			
		||||
 | 
			
		||||
# Regarding images to download; the `default` is the smallest, then `playstore`.
 | 
			
		||||
# The `google_apis` images are significantly larger than the `playstore` option.
 | 
			
		||||
#
 | 
			
		||||
# This script was used to download and test the sizes:
 | 
			
		||||
#
 | 
			
		||||
### #!/bin/bash
 | 
			
		||||
###
 | 
			
		||||
### cd /home/ling/SDKs/Android/Sdk/cmdline-tools/latest/bin
 | 
			
		||||
###
 | 
			
		||||
### # Actually to be used
 | 
			
		||||
### echo "35 Play Store"
 | 
			
		||||
### ./sdkmanager --install "system-images;android-35;google_apis_playstore;x86_64"
 | 
			
		||||
### echo "36 Play Store"
 | 
			
		||||
### ./sdkmanager --install "system-images;android-36;google_apis_playstore;x86_64"
 | 
			
		||||
###
 | 
			
		||||
### # FORTESTING file size
 | 
			
		||||
### echo "35 AOSP"
 | 
			
		||||
### ./sdkmanager --install "system-images;android-35;default;x86_64"
 | 
			
		||||
### echo "36 APIs Only"
 | 
			
		||||
### ./sdkmanager --install "system-images;android-36;google_apis;x86_64"
 | 
			
		||||
### echo "35 APIs Only"
 | 
			
		||||
### ./sdkmanager --install "system-images;android-35;google_apis;x86_64"
 | 
			
		||||
###
 | 
			
		||||
### exit 0
 | 
			
		||||
#
 | 
			
		||||
# These were the results:
 | 
			
		||||
#
 | 
			
		||||
### ~/SDKs/Android/Sdk/system-images]$ du -had2 | sort -h
 | 
			
		||||
### 1.7G	./android-35/default
 | 
			
		||||
### 2.2G	./android-35/google_apis_playstore
 | 
			
		||||
### 2.3G	./android-36/google_apis_playstore
 | 
			
		||||
### 3.5G	./android-35/google_apis
 | 
			
		||||
### 4.3G	./android-36/google_apis
 | 
			
		||||
### 6.6G	./android-36
 | 
			
		||||
### 7.3G	./android-35
 | 
			
		||||
### 14G	.
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Facts [Downloads]
 | 
			
		||||
  set_fact:
 | 
			
		||||
    android_downloads_required:
 | 
			
		||||
      ### 36 ###
 | 
			
		||||
      - build-tools;36.0.0
 | 
			
		||||
      - platforms;android-36
 | 
			
		||||
      - sources;android-36
 | 
			
		||||
      # Images
 | 
			
		||||
      #- system-images;android-35;default;x86_64 # TODO: Switch once it exists.
 | 
			
		||||
      - system-images;android-36;google_apis_playstore;x86_64
 | 
			
		||||
      ### 16 ###
 | 
			
		||||
      - platforms;android-16
 | 
			
		||||
      - sources;android-16
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-16;default;x86
 | 
			
		||||
    android_downloads_additional:
 | 
			
		||||
      ### 35 ###
 | 
			
		||||
      - platforms;android-35
 | 
			
		||||
      - sources;android-35
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-35;default;x86_64
 | 
			
		||||
      ### 34 ###
 | 
			
		||||
      - platforms;android-34
 | 
			
		||||
      - sources;android-34
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-34;default;x86_64
 | 
			
		||||
      ### 33 ###
 | 
			
		||||
      - platforms;android-33
 | 
			
		||||
      - sources;android-33
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-33;default;x86_64
 | 
			
		||||
      ### 30 ###
 | 
			
		||||
      - platforms;android-30
 | 
			
		||||
      - sources;android-30
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-30;default;x86_64
 | 
			
		||||
      ### 27 ###
 | 
			
		||||
      - platforms;android-27
 | 
			
		||||
      - sources;android-27
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-27;default;x86_64
 | 
			
		||||
      ### 21 ###
 | 
			
		||||
      - platforms;android-21
 | 
			
		||||
      - sources;android-21
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-21;default;x86_64
 | 
			
		||||
    android_downloads_unused:
 | 
			
		||||
      ### 36 ###
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-36;google_apis;x86_64
 | 
			
		||||
      ### 35 ###
 | 
			
		||||
      - build-tools;35.0.0
 | 
			
		||||
      - build-tools;35.0.1
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-35;aosp_atd;x86_64 # ATD = Automated Test Device
 | 
			
		||||
      - system-images;android-35;google_apis;x86_64
 | 
			
		||||
      - system-images;android-35;google_apis_playstore;x86_64
 | 
			
		||||
      ### 34 ###
 | 
			
		||||
      - build-tools;34.0.0
 | 
			
		||||
      - platforms;android-34
 | 
			
		||||
      - sources;android-34
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-34;google_apis;x86_64
 | 
			
		||||
      - system-images;android-34;google_apis_playstore;x86_64
 | 
			
		||||
      ### 16 ###
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-16;google_apis;x86
 | 
			
		||||
      ### 15 ###
 | 
			
		||||
      - platforms;android-15
 | 
			
		||||
      - sources;android-15
 | 
			
		||||
      # Images
 | 
			
		||||
      - system-images;android-15;default;x86 # Not working in Android AVDs
 | 
			
		||||
 | 
			
		||||
## Checks ##
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Check SDK Manager Exists [1/2]
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ android_sdkmanager_temp }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: android_sdkmanager_temp_stat
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Check SDK Manager Exists [2/2]
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ android_sdkmanager_final }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: android_sdkmanager_final_stat
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Check Download Exists
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ android_download_file }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: android_download_stat
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
@@ -112,7 +231,7 @@
 | 
			
		||||
## Configure Modules ##
 | 
			
		||||
 | 
			
		||||
# This can only be run once, otherwise cmdline-tools creates latest-* folders.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Install Consistent Modules
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Install | Consistent Modules
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_temp }} --install '{{ item }}' --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    # Current
 | 
			
		||||
@@ -123,40 +242,30 @@
 | 
			
		||||
  when: coding == true and not android_sdkmanager_final_stat.stat.exists
 | 
			
		||||
 | 
			
		||||
# These are safe to run multiple times, and uses the new `latest` version.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Install Modules
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Install | Required Modules
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_final }} --install '{{ item }}' --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    ### 36 ###
 | 
			
		||||
    - build-tools;36.0.0
 | 
			
		||||
    - platforms;android-36
 | 
			
		||||
    - sources;android-36
 | 
			
		||||
    ## Images
 | 
			
		||||
    #- system-images;android-35;default;x86_64 # Does not exist yet
 | 
			
		||||
    #- system-images;android-36;google_apis;x86_64 # Unsure whether to use this
 | 
			
		||||
    - system-images;android-36;google_apis_playstore;x86_64
 | 
			
		||||
    ### 35 ###
 | 
			
		||||
    - build-tools;35.0.1
 | 
			
		||||
    - platforms;android-35
 | 
			
		||||
    - sources;android-35
 | 
			
		||||
    ## Images
 | 
			
		||||
    #- system-images;android-35;default;x86_64     # Already have Store version
 | 
			
		||||
    #- system-images;android-35;google_apis;x86_64 # Already have Store version
 | 
			
		||||
    - system-images;android-35;google_apis_playstore;x86_64
 | 
			
		||||
  loop: "{{ android_downloads_required }}"
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
# Remove any versions which used to be part of this script and no longer used.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Remove Modules
 | 
			
		||||
# Add more versions for testing across all the important platforms.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Install | Additional Modules
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_final }} --install '{{ item }}' --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  loop: "{{ android_downloads_additional }}"
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding == true and sdks == true
 | 
			
		||||
 | 
			
		||||
# Remove extra downloads if system is not meant for full amount of testing.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Uninstall | Additional Modules
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_final }} --uninstall '{{ item }}' --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  loop:
 | 
			
		||||
    ### 35 ###
 | 
			
		||||
    - build-tools;35.0.0
 | 
			
		||||
    ## Images
 | 
			
		||||
    - system-images;android-35;aosp_atd;x86_64 # Automated Test Device, unnecessary.
 | 
			
		||||
    ### 34 ###
 | 
			
		||||
    - build-tools;34.0.0
 | 
			
		||||
    - platforms;android-34
 | 
			
		||||
    - sources;android-34
 | 
			
		||||
  loop: "{{ android_downloads_additional }}"
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding != true or sdks != true
 | 
			
		||||
 | 
			
		||||
# Remove any versions which used to be part of this script and no longer used.
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Uninstall | Unused Modules
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_final }} --uninstall '{{ item }}' --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  loop: "{{ android_downloads_unused }}"
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
@@ -173,7 +282,7 @@
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Android | Licenses Agreements [1/2]
 | 
			
		||||
- name: Workstation | Linux | Software | Android | License Agreements [1/2]
 | 
			
		||||
  shell: "yes | {{ android_sdkmanager_final }} --licenses --sdk_root={{ android_sdk_location }}"
 | 
			
		||||
  become_user: "{{ user }}"
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 
 | 
			
		||||
@@ -34,18 +34,20 @@
 | 
			
		||||
- name: Workstation | Linux | Flatpak Distro | Flatpak | Arrays
 | 
			
		||||
  set_fact:
 | 
			
		||||
    flatpaks_generic:
 | 
			
		||||
      - { app: "org.libreoffice.LibreOffice", name: "office", extra: "" }
 | 
			
		||||
      - { app: "io.gitlab.librewolf-community", name: "librewolf", extra: "" }
 | 
			
		||||
      - { app: "org.signal.Signal", name: "signal", extra: "" }
 | 
			
		||||
      - { app: "org.mozilla.firefox", name: "firefox-flatpak", extra: "" }
 | 
			
		||||
      - { app: "com.transmissionbt.Transmission", name: "transmission", extra: "" }
 | 
			
		||||
      - { app: "io.gitlab.librewolf-community", name: "librewolf", extra: "" }
 | 
			
		||||
      - { app: "chat.simplex.simplex", name: "simplex", extra: "" }
 | 
			
		||||
      - { app: "org.signal.Signal", name: "signal", extra: "" }
 | 
			
		||||
      - { app: "im.riot.Riot", name: "element", extra: "" }
 | 
			
		||||
      - { app: "org.telegram.desktop", name: "telegram", extra: "" }
 | 
			
		||||
      - { app: "org.gimp.GIMP", name: "gimp", extra: "" }
 | 
			
		||||
      - { app: "org.libreoffice.LibreOffice", name: "office", extra: "" }
 | 
			
		||||
      - { app: "com.transmissionbt.Transmission", name: "transmission", extra: "" }
 | 
			
		||||
    flatpaks_coding:
 | 
			
		||||
      - { app: "com.vscodium.codium", name: "codium-flatpak", extra: "" }
 | 
			
		||||
      - { app: "com.google.AndroidStudio", name: "android-studio", extra: "" }
 | 
			
		||||
      - { app: "io.dbeaver.DBeaverCommunity", name: "dbeaver", extra: "" }
 | 
			
		||||
      - { app: "org.godotengine.Godot", name: "godot", extra: "" }
 | 
			
		||||
      - { app: "com.visualstudio.code-oss", name: "code", extra: "" }
 | 
			
		||||
      - { app: "com.visualstudio.code-oss", name: "code-flatpak", extra: "" }
 | 
			
		||||
    flatpaks_editing_video:
 | 
			
		||||
      - { app: "org.shotcut.Shotcut", name: "shotcut", extra: "" }
 | 
			
		||||
      - { app: "com.obsproject.Studio", name: "obs", extra: "" }
 | 
			
		||||
@@ -67,14 +69,13 @@
 | 
			
		||||
      - { app: "org.audacityteam.Audacity", name: "audacity", extra: "" } # Say "no thanks" to spyware.
 | 
			
		||||
      - { app: "com.discordapp.Discord", name: "discord", extra: "" } # Stopped working, just spins and says Starting.
 | 
			
		||||
      # 2022-11-20 No longer using any of these and they're taking up a lot of space. #
 | 
			
		||||
      - { app: "im.riot.Riot", name: "element", extra: "" }
 | 
			
		||||
      - { app: "org.telegram.desktop", name: "telegram", extra: "" }
 | 
			
		||||
      - { app: "com.jetbrains.PyCharm-Community", name: "pycharm", extra: "" }
 | 
			
		||||
      # End 2022-11-20 #
 | 
			
		||||
      - { app: "io.lbry.lbry-app", name: "lbry", extra: "dbus-launch" } # No longer supported, noticed 2023-09-01.
 | 
			
		||||
      - { app: "chat.delta.desktop", name: "deltachat", extra: "" } # No longer used, removed 2023-12-18.
 | 
			
		||||
      - { app: "org.gnome.Geary", name: "geary", extra: "" } # No longer used, removed 2024-12-15
 | 
			
		||||
      - { app: "org.rncbc.qsynth", name: "qsynth", extra: "" } # 2024-12-15, Not worth the setup, use LMMS or VMPK.
 | 
			
		||||
      - { app: "org.godotengine.Godot", name: "godot", extra: "" } # 20250831 Stopped playing with this months / years ago.
 | 
			
		||||
 | 
			
		||||
# Generic #
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,12 +36,18 @@
 | 
			
		||||
- name: Workstation | Linux | Software | Flutter | Check SDK Exists
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ flutter_sdk_location }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: flutter_sdk_stat
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Flutter | Check Download Exists
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ flutter_download_file }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: flutter_download_stat
 | 
			
		||||
  when: coding == true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,9 @@
 | 
			
		||||
- name: Workstation | Linux | Software | Lutris | Check PPA
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ lutris_source_list }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: lutris_source_exists
 | 
			
		||||
  when: ansible_pkg_mgr == "apt"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,8 +39,17 @@
 | 
			
		||||
      - "{{ evolution }}"
 | 
			
		||||
      - "{{ evolution }}*"
 | 
			
		||||
      - gparted
 | 
			
		||||
      - hugo
 | 
			
		||||
    state: present
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Packages | GS Connect (KDE Connect, Android Tool)
 | 
			
		||||
  package:
 | 
			
		||||
    name:
 | 
			
		||||
    - gnome-shell-extension-gsconnect
 | 
			
		||||
    state: present
 | 
			
		||||
  when: ansible_distribution in ("Debian")
 | 
			
		||||
  ignore_errors: yes
 | 
			
		||||
 | 
			
		||||
# Remove Repo Software #
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Linux | Software | Packages | Remove Applications
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,9 @@
 | 
			
		||||
- name: Workstation | Linux | Software | VS Codium | Check PPA
 | 
			
		||||
  stat:
 | 
			
		||||
    path: "{{ vscodium_source_list }}"
 | 
			
		||||
    get_attributes: false
 | 
			
		||||
    get_checksum: false
 | 
			
		||||
    get_mime: false
 | 
			
		||||
  register: vscodium_source_exists
 | 
			
		||||
  when: ansible_pkg_mgr == "apt"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,6 @@
 | 
			
		||||
                      , 'io.gitlab.librewolf-community.desktop', 'librewolf.desktop'
 | 
			
		||||
                      , 'org.mozilla.firefox.desktop', 'firefox.desktop'
 | 
			
		||||
                      , 'org.signal.Signal.desktop', 'signal-desktop.desktop'
 | 
			
		||||
                      , 'im.riot.Riot.desktop'
 | 
			
		||||
                      , 'org.telegram.desktop.desktop'
 | 
			
		||||
                      , 'com.discordapp.Discord.desktop'
 | 
			
		||||
                      , 'com.vscodium.codium.desktop'
 | 
			
		||||
@@ -39,6 +38,9 @@
 | 
			
		||||
#, 'com.visualstudio.code-oss.desktop', 'code-oss.desktop'
 | 
			
		||||
# 2025-03-21 Not really using Android Studio now that Flutter is working.
 | 
			
		||||
#, 'com.google.AndroidStudio.desktop'
 | 
			
		||||
# 2025-08-31 Not used a whole lot, installed again just to explore.
 | 
			
		||||
#, 'im.riot.Riot.desktop'
 | 
			
		||||
#, 'chat.simplex.simplex.desktop'
 | 
			
		||||
 | 
			
		||||
- name: Workstation | Account Management | GNOME | Facts (NixOS)
 | 
			
		||||
  set_fact:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user