Compare commits
	
		
			1 Commits
		
	
	
		
			main
			...
			gnome-shel
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9020fc0459 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,2 @@ | ||||
| external | ||||
| playbooks/test.yaml | ||||
| __pycache__ | ||||
|  | ||||
| @ -2,4 +2,4 @@ | ||||
| collections_path = collections | ||||
| library = library | ||||
| roles_path = roles | ||||
| result_format = yaml | ||||
| stdout_callback = yaml | ||||
|  | ||||
							
								
								
									
										154
									
								
								library/gnome_custom_keybindings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								library/gnome_custom_keybindings.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | ||||
| #!/usr/bin/python | ||||
| 
 | ||||
| # Copyright: (c) 2018, Terry Jones <terry.jones@example.org> | ||||
| # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | ||||
| from __future__ import (absolute_import, division, print_function) | ||||
| from typing import Dict, List | ||||
| __metaclass__ = type | ||||
| 
 | ||||
| DOCUMENTATION = r''' | ||||
| --- | ||||
| module: my_test | ||||
| 
 | ||||
| short_description: This is my test module | ||||
| 
 | ||||
| # If this is part of a collection, you need to use semantic versioning, | ||||
| # i.e. the version is of the form "2.5.0" and not "2.4". | ||||
| version_added: "1.0.0" | ||||
| 
 | ||||
| description: This is my longer description explaining my test module. | ||||
| 
 | ||||
| options: | ||||
|     name: | ||||
|         description: This is the message to send to the test module. | ||||
|         required: true | ||||
|         type: str | ||||
|     new: | ||||
|         description: | ||||
|             - Control to demo if the result of this module is changed or not. | ||||
|             - Parameter description can be a list as well. | ||||
|         required: false | ||||
|         type: bool | ||||
| # Specify this value according to your collection | ||||
| # in format of namespace.collection.doc_fragment_name | ||||
| # extends_documentation_fragment: | ||||
| #     - my_namespace.my_collection.my_doc_fragment_name | ||||
| 
 | ||||
| author: | ||||
|     - Your Name (@yourGitHubHandle) | ||||
| ''' | ||||
| 
 | ||||
| EXAMPLES = r''' | ||||
| # Pass in a message | ||||
| - name: Test with a message | ||||
|   my_namespace.my_collection.my_test: | ||||
|     name: hello world | ||||
| 
 | ||||
| # pass in a message and have changed true | ||||
| - name: Test with a message and changed output | ||||
|   my_namespace.my_collection.my_test: | ||||
|     name: hello world | ||||
|     new: true | ||||
| 
 | ||||
| # fail the module | ||||
| - name: Test failure of the module | ||||
|   my_namespace.my_collection.my_test: | ||||
|     name: fail me | ||||
| ''' | ||||
| 
 | ||||
| RETURN = r''' | ||||
| # These are examples of possible return values, and in general should use other names for return values. | ||||
| original_message: | ||||
|     description: The original name param that was passed in. | ||||
|     type: str | ||||
|     returned: always | ||||
|     sample: 'hello world' | ||||
| message: | ||||
|     description: The output message that the test module generates. | ||||
|     type: str | ||||
|     returned: always | ||||
|     sample: 'goodbye' | ||||
| ''' | ||||
| 
 | ||||
| from ansible.module_utils.basic import AnsibleModule, subprocess | ||||
| 
 | ||||
| 
 | ||||
| def run_module(): | ||||
|     # define available arguments/parameters a user can pass to the module | ||||
|     module_args = dict( | ||||
|         keybindings=dict(type='list', require=True), | ||||
|     ) | ||||
| 
 | ||||
|     # seed the result dict in the object | ||||
|     # we primarily care about changed and state | ||||
|     # changed is if this module effectively modified the target | ||||
|     # state will include any data that you want your module to pass back | ||||
|     # for consumption, for example, in a subsequent task | ||||
|     result = dict( | ||||
|         changed=False, | ||||
|         original_message='', | ||||
|         message='' | ||||
|     ) | ||||
| 
 | ||||
|     # the AnsibleModule object will be our abstraction working with Ansible | ||||
|     # this includes instantiation, a couple of common attr would be the | ||||
|     # args/params passed to the execution, as well as if the module | ||||
|     # supports check mode | ||||
|     module = AnsibleModule( | ||||
|         argument_spec=module_args, | ||||
|         supports_check_mode=True | ||||
|     ) | ||||
| 
 | ||||
|     # if the user is working with this module in only check mode we do not | ||||
|     # want to make any changes to the environment, just return the current | ||||
|     # state with no modifications | ||||
|     if module.check_mode: | ||||
|         module.exit_json(**result) | ||||
| 
 | ||||
|     # manipulate or modify the state as needed (this is going to be the | ||||
|     # part where your module will do what it needs to do) | ||||
| 
 | ||||
|     keys = [] | ||||
|     for index, keybinding in enumerate(module.params["keybindings"]): | ||||
|         key = f"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom{index}" | ||||
|         for value in ["binding", "command", "name"]: | ||||
|             subprocess.check_call( | ||||
|                 ["dconf", "write", f"/{key}{value}", f"'{keybinding[value]}'"] | ||||
|             ) | ||||
|         keys.append(key) | ||||
| 
 | ||||
|     subprocess.check_call( | ||||
|         [ | ||||
|             "dconf", | ||||
|             "write", | ||||
|             "/org/gnome/settings-daemon/plugins/media-keys", | ||||
|             f"['{"', '".join(keys)}']", | ||||
|         ] | ||||
|     ) | ||||
| 
 | ||||
|     # result['original_message'] = str(keybinding_entries) | ||||
|     # result["message"] = str(custom_keybindings) | ||||
| 
 | ||||
|     # use whatever logic you need to determine whether or not this module | ||||
|     # made any modifications to your target | ||||
|     # if module.params['new']: | ||||
|     result['changed'] = True | ||||
| 
 | ||||
|     # during the execution of the module, if there is an exception or a | ||||
|     # conditional state that effectively causes a failure, run | ||||
|     # AnsibleModule.fail_json() to pass in the message and the result | ||||
|     # if module.params['name'] == 'fail me': | ||||
|     #     module.fail_json(msg='You requested this to fail', **result) | ||||
| 
 | ||||
|     # in the event of a successful module execution, you will want to | ||||
|     # simple AnsibleModule.exit_json(), passing the key/value results | ||||
|     module.exit_json(**result) | ||||
| 
 | ||||
| 
 | ||||
| def main(): | ||||
|     run_module() | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
| 
 | ||||
| @ -1,146 +0,0 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| from typing import Tuple | ||||
| from ansible.module_utils.basic import AnsibleModule | ||||
| 
 | ||||
| DOCUMENTATION = """ | ||||
| module: gsettings | ||||
| author: | ||||
|     - Kenneth Benzie (Benie) | ||||
| short_description: Ansible module for the gsettings configuration tool | ||||
| options: | ||||
|     schema: | ||||
|         description: | ||||
|             - Schema ID of the settings to configure. | ||||
|         type: str | ||||
|     key: | ||||
|         description: | ||||
|             - Key of an individaul setting to configure. | ||||
|         type: str | ||||
|     value: | ||||
|         description: | ||||
|             - Value to configure the setting with. | ||||
|             - Mutually exclusive with reset. | ||||
|         type: str | ||||
|     reset: | ||||
|         description: | ||||
|             - Flag to reset the setting to the default value. | ||||
|             - Mutually exclusive with value. | ||||
|         type: | ||||
|         default: false | ||||
| """ | ||||
| 
 | ||||
| EXAMPLES = """ | ||||
| - name: get gnome color-scheme current value | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.interface | ||||
|     key: color-scheme | ||||
|   register: color_scheme | ||||
| - debug: msg={{color_scheme.value}} | ||||
| 
 | ||||
| - name: set gnome color-scheme to 'prefer-dark' | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.interface | ||||
|     key: color-scheme | ||||
|     value: "'prefer-dark'" | ||||
| 
 | ||||
| - name: reset gnome color-scheme to default value | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.interface | ||||
|     key: color-scheme | ||||
|     reset: true | ||||
| """ | ||||
| 
 | ||||
| RETURN = """ | ||||
| value: | ||||
|     description: Value of the setting. | ||||
|     returned: Returned when there is a value. | ||||
|     type: str | ||||
|     sample: "'default'" | ||||
| stderr: | ||||
|     description: Error output from gsettings. | ||||
|     returned: Returned when there is an error. | ||||
|     type: str | ||||
|     sample: No such key “doesnt-exist” | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| class GSettingsError(Exception): | ||||
|     def __init__(self, command, rc, stderr): | ||||
|         self.command = command | ||||
|         self.rc = (rc,) | ||||
|         self.stderr = stderr | ||||
| 
 | ||||
| 
 | ||||
| def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]: | ||||
|     command = [ | ||||
|         "gsettings", | ||||
|         "get", | ||||
|         module.params["schema"], | ||||
|         module.params["key"], | ||||
|     ] | ||||
|     rc, stdout, stderr = module.run_command(command) | ||||
|     if rc != 0: | ||||
|         raise GSettingsError(command, rc, stderr) | ||||
|     return False, stdout.rstrip() | ||||
| 
 | ||||
| 
 | ||||
| def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]: | ||||
|     command = [ | ||||
|         "gsettings", | ||||
|         "set", | ||||
|         module.params["schema"], | ||||
|         module.params["key"], | ||||
|         module.params["value"], | ||||
|     ] | ||||
|     _, before = gsettings_get(module) | ||||
|     rc, _, stderr = module.run_command(command) | ||||
|     if rc != 0: | ||||
|         raise GSettingsError(command, rc, stderr) | ||||
|     _, after = gsettings_get(module) | ||||
|     return before != after, after | ||||
| 
 | ||||
| 
 | ||||
| def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]: | ||||
|     command = [ | ||||
|         "gsettings", | ||||
|         "reset", | ||||
|         module.params["schema"], | ||||
|         module.params["key"], | ||||
|     ] | ||||
|     _, before = gsettings_get(module) | ||||
|     rc, stdout, stderr = module.run_command(command) | ||||
|     if rc != 0: | ||||
|         raise GSettingsError(command, rc, stderr) | ||||
|     _, after = gsettings_get(module) | ||||
|     return before != after, after | ||||
| 
 | ||||
| 
 | ||||
| def main() -> None: | ||||
|     module = AnsibleModule( | ||||
|         argument_spec=dict( | ||||
|             schema=dict(type="str"), | ||||
|             key=dict(type="str"), | ||||
|             value=dict(type="str"), | ||||
|             reset=dict(type="bool", default=False), | ||||
|         ), | ||||
|         mutually_exclusive=[["value", "reset"]], | ||||
|         required_together=[["schema", "key"]], | ||||
|     ) | ||||
| 
 | ||||
|     try: | ||||
|         if module.params["value"]: | ||||
|             changed, value = gsettings_set(module) | ||||
|         elif module.params["reset"]: | ||||
|             changed, value = gsettings_reset(module) | ||||
|         else: | ||||
|             changed, value = gsettings_get(module) | ||||
|         module.exit_json(changed=changed, value=value) | ||||
|     except GSettingsError as error: | ||||
|         module.fail_json( | ||||
|             f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
| @ -93,7 +93,7 @@ function Get-GitRemoteHeadBranch { | ||||
|     $result = Run-Command -command $command -working_directory $dest | ||||
|     if ($result.rc -ne 0) { | ||||
|         $module.FailJson("Could not determine the default HEAD branch of remote: $remote" ` + | ||||
|                          $result.stderr) | ||||
|                          "$result.stdout $result.stderr") | ||||
|     } | ||||
|     return $result.stdout.Trim().Replace("$remote/", '') | ||||
| } | ||||
| @ -108,16 +108,6 @@ function Get-GitCurrentSha { | ||||
|     return $result.stdout.Trim() | ||||
| } | ||||
| 
 | ||||
| function Get-GitRemoteUrl { | ||||
|     [CmdletBinding()] | ||||
|     Param ( | ||||
|         [Parameter(Mandatory = $true)] [String] $dest, | ||||
|         [Parameter(Mandatory = $true)] [String] $remote | ||||
|     ) | ||||
|     $result = Run-Command -command "`"$git`" remote get-url $remote" -working_directory $dest | ||||
|     return $result.stdout.Trim() | ||||
| } | ||||
| 
 | ||||
| function Invoke-GitClone { | ||||
|     [CmdletBinding()] | ||||
|     Param ( | ||||
| @ -197,19 +187,6 @@ function Invoke-GitSubmoduleUpdate { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function Invoke-GitRemoteSetUrl { | ||||
|     [CmdletBinding()] | ||||
|     Param ( | ||||
|         [Parameter(Mandatory = $true)] [String] $dest, | ||||
|         [Parameter(Mandatory = $true)] [String] $remote, | ||||
|         [Parameter(Mandatory = $true)] [String] $url | ||||
|     ) | ||||
|     $result = Run-Command -command "`"$git`" remote set-url $remote `"$url`"" -working_directory $dest | ||||
|     if ($result.rc -ne 0) { | ||||
|         $module.FailJson("Failed to set remote URL:`n" + $result.stderr) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| # ================================ Start logic ================================= | ||||
| 
 | ||||
| if (!$dest) { | ||||
| @ -230,10 +207,6 @@ if (($dest -and ![System.IO.File]::Exists($gitconfig))) { | ||||
|     if (Test-GitLocalChanges $dest) { | ||||
|         $module.FailJson('Local modifications exist in repository.') | ||||
|     } | ||||
|     $url = Get-GitRemoteUrl $dest $remote | ||||
|     if ($url -ne $repo) { | ||||
|         Invoke-GitRemoteSetUrl $dest $remote $repo | ||||
|     } | ||||
|     Invoke-GitFetch $dest $remote $version | ||||
|     Invoke-GitCheckout $dest $remote $version | ||||
|     Invoke-GitPull $dest $remote $version | ||||
|  | ||||
| @ -22,6 +22,27 @@ seealso: | ||||
|     - module: ansible.builtin.git | ||||
| ''' | ||||
| 
 | ||||
| # DOCUMENTATION = r''' | ||||
| # --- | ||||
| # module: win_ping | ||||
| # short_description: A windows version of the classic ping module | ||||
| # description: | ||||
| #   - Checks management connectivity of a windows host. | ||||
| #   - This is NOT ICMP ping, this is just a trivial test module. | ||||
| #   - For non-Windows targets, use the M(ansible.builtin.ping) module instead. | ||||
| # options: | ||||
| #   data: | ||||
| #     description: | ||||
| #       - Alternate data to return instead of 'pong'. | ||||
| #       - If this parameter is set to C(crash), the module will cause an exception. | ||||
| #     type: str | ||||
| #     default: pong | ||||
| # seealso: | ||||
| # - module: ansible.builtin.ping | ||||
| # author: | ||||
| # - Chris Church (@cchurch) | ||||
| # ''' | ||||
| 
 | ||||
| EXAMPLES = r''' | ||||
| # Test connectivity to a windows host | ||||
| # ansible winserver -m ansible.windows.win_ping | ||||
|  | ||||
| @ -1,99 +0,0 @@ | ||||
| #!powershell | ||||
| 
 | ||||
| #AnsibleRequires -CSharpUtil Ansible.Basic | ||||
| #AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil | ||||
| 
 | ||||
| $module = [Ansible.Basic.AnsibleModule]::Create($args, @{ | ||||
|     options = @{ | ||||
|         name = @{ | ||||
|             type = "list" | ||||
|             elements = "str" | ||||
|             required = $true | ||||
|         } | ||||
|         state = @{ | ||||
|             type = "str" | ||||
|             default = "present" | ||||
|             choices = ("absent", "latest", "present") | ||||
|         } | ||||
|     } | ||||
|     supports_check_mode = $false | ||||
| }) | ||||
| 
 | ||||
| $names = $module.Params.name | ||||
| $state = $module.Params.state | ||||
| $winget = Get-ExecutablePath "winget" | ||||
| $noPackageString = "No installed package found matching input criteria." | ||||
| 
 | ||||
| if ($name -and $id) { | ||||
|     $module.FailJson("name `"$name`" and id `"$id`" must not both be provided") | ||||
| } | ||||
| 
 | ||||
| function Test-Installed { | ||||
|     $command = "`"$winget`" list `"$name`"" | ||||
|     $result = Run-Command -command $command | ||||
|     if ($result.rc -eq 0) { | ||||
|         return $true | ||||
|     } | ||||
|     return $false | ||||
| } | ||||
| 
 | ||||
| function Test-UpgradeAvailable { | ||||
|     if (!(Test-Installed)) { | ||||
|         return $true | ||||
|     } | ||||
|     $command = "`"$winget`" list --upgrade-available `"$name`"" | ||||
|     $result = Run-Command -command $command | ||||
|     if ($result.stdout.Contains($noPackageString)) { | ||||
|         return $false | ||||
|     } | ||||
|     return $true | ||||
| } | ||||
| 
 | ||||
| foreach ($name in $names) { | ||||
|     switch ($state) { | ||||
|         "absent" { | ||||
|             if (Test-Installed) { | ||||
|                 $command = "`"$winget`" uninstall `"$name`"" | ||||
|                 $result = Run-Command -command $command | ||||
|                 if ($result.rc -ne 0) { | ||||
|                     $module.Result.rc = $result.rc | ||||
|                     $module.Result.stdout = $result.stdout | ||||
|                     $module.FailJson("Failed to uninstall package `"$name`"") | ||||
|                 } | ||||
|                 $module.Result.stdout = $result.stdout | ||||
|                 $module.Result.changed = $true | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         "latest" { | ||||
|             if (Test-UpgradeAvailable) { | ||||
|                 $command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`"" | ||||
|                 $result = Run-Command -command $command | ||||
|                 if ($result.rc -ne 0) { | ||||
|                     $module.Result.rc = $result.rc | ||||
|                     $module.Result.stdout = $result.stdout | ||||
|                     $module.FailJson("Failed to install package `"$name`"") | ||||
|                 } | ||||
|                 $module.Result.stdout = $result.stdout | ||||
|                 $module.Result.changed = $true | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         "present" { | ||||
|             if (!(Test-Installed)) { | ||||
|                 $command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`"" | ||||
|                 $result = Run-Command -command $command | ||||
|                 if ($result.rc -ne 0) { | ||||
|                     $module.Result.rc = $result.rc | ||||
|                     $module.Result.stdout = $result.stdout | ||||
|                     $module.FailJson("Failed to install package `"$name`"") | ||||
|                 } | ||||
|                 $module.Result.stdout = $result.stdout | ||||
|                 $module.Result.changed = $true | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| $module.Result.rc = 0 | ||||
| $module.ExitJson() | ||||
| @ -1,47 +0,0 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| 
 | ||||
| DOCUMENTATION = ''' | ||||
| module: win_winget | ||||
| author: | ||||
|   - "Kenneth Benzie (Benie)" | ||||
| short_desription: Manages packages with WinGet | ||||
| description: | ||||
|   - Magage packages using WinGet. | ||||
| options: | ||||
|   name: | ||||
|     description: | ||||
|       - Name of the package to manage. | ||||
|     type: list[str] | ||||
|   state: | ||||
|     description: | ||||
|       - Indicates the desired package state. V(latest) ensures that the latest | ||||
|         version is installed. | ||||
|     type: str | ||||
|     choices: [ absent, present, latest ] | ||||
|     default: present | ||||
| ''' | ||||
| 
 | ||||
| EXAMPLES = ''' | ||||
| - name: Install Apple Music | ||||
|   win_winget: | ||||
|     name: Apple Music | ||||
|     state: present | ||||
| 
 | ||||
| - name: Install latest version of Neovim Qt | ||||
|   win_winget: | ||||
|     name: neovim-qt | ||||
|     state: latest | ||||
| 
 | ||||
| - name: Uninstall Microsoft OneDrive | ||||
|   win_winget: | ||||
|     id: Microsoft.OneDrive | ||||
|     state: absent | ||||
| ''' | ||||
| 
 | ||||
| RETURN = ''' | ||||
| stdout: | ||||
|   description: Output from WinGet. | ||||
|   returned: Success, when needed. | ||||
|   type: str | ||||
|   sample: '' | ||||
| ''' | ||||
| @ -1,6 +1,4 @@ | ||||
| --- | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   roles: | ||||
|     - 1password | ||||
|  | ||||
| @ -2,16 +2,21 @@ | ||||
| - import_playbook: LinuxCLI.yaml | ||||
| - import_playbook: UnixGUI.yaml | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: firefox | ||||
|     - role: kitty | ||||
|     - role: guake | ||||
|     - role: cider | ||||
|     - role: ulauncher | ||||
|     - role: gnome-shell | ||||
|       when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" | ||||
|     - role: xremap | ||||
|       when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" | ||||
|     - role: fedora-workstation | ||||
|       when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora' | ||||
|       when: > | ||||
|         'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and | ||||
|         ansible_env.XDG_SESSION_TYPE == 'wayland' and ( | ||||
|             ansible_os_family == "RedHat" or | ||||
|             ansible_os_family == "Debian" | ||||
|         ) | ||||
|  | ||||
| @ -1,17 +1,15 @@ | ||||
| --- | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: rpmfusion | ||||
|       when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora' | ||||
| - import_playbook: UnixCLI.yaml | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   roles: | ||||
|     - role: gdb | ||||
|     - role: nvtop | ||||
|     - role: podman | ||||
|     - role: system-info | ||||
|       when: disable_systemd is not defined | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| --- | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: sudo | ||||
|       when: ansible_user_id != "root" | ||||
| @ -30,7 +32,6 @@ | ||||
|     - role: ripgrep | ||||
|     - role: tidy | ||||
|     - role: tree | ||||
|     - role: typst | ||||
|     - role: watch | ||||
|     - role: wget | ||||
|     - role: yq | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| --- | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: flatpak | ||||
|       when: ansible_os_family != "Darwin" | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| --- | ||||
| - import_playbook: LinuxCLI.yaml | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: wsl | ||||
|  | ||||
| @ -1,17 +1,37 @@ | ||||
| --- | ||||
| - import_playbook: WindowsCLI.yaml | ||||
| - hosts: windows | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: python | ||||
|     - role: git | ||||
|     - role: powershell | ||||
|     - role: neovim | ||||
|     - role: system-info | ||||
| 
 | ||||
|     - role: ag | ||||
|     - role: bat | ||||
|     - role: curl | ||||
|     - role: fd | ||||
|     - role: fzf | ||||
|     - role: gh | ||||
|     - role: glab | ||||
|     - role: jq | ||||
|     - role: ripgrep | ||||
|     - role: tree | ||||
|     - role: yq | ||||
| 
 | ||||
|     - role: llvm | ||||
|     - role: nodejs | ||||
| 
 | ||||
|     - role: 1password | ||||
|     - role: autohotkey | ||||
|     - role: apple-music | ||||
|     - role: cider | ||||
|     - role: ferdium | ||||
|     - role: firefox | ||||
|     - role: fonts | ||||
|     - role: obsidian | ||||
|     - role: powertoys | ||||
|     - role: windows-terminal | ||||
|     - role: wezterm | ||||
|     - role: neovide | ||||
|  | ||||
| @ -1,27 +0,0 @@ | ||||
| --- | ||||
| - hosts: windows | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   roles: | ||||
|     - role: scoop | ||||
|     - role: python | ||||
|     - role: git | ||||
|     - role: powershell | ||||
|     - role: neovim | ||||
|     - role: system-info | ||||
| 
 | ||||
|     - role: ag | ||||
|     - role: bat | ||||
|     - role: curl | ||||
|     - role: fd | ||||
|     - role: fzf | ||||
|     - role: gh | ||||
|     - role: glab | ||||
|     - role: jq | ||||
|     - role: ripgrep | ||||
|     - role: tree | ||||
|     - role: typst | ||||
|     - role: yq | ||||
| 
 | ||||
|     - role: llvm | ||||
|     - role: nodejs | ||||
| @ -1,23 +1,22 @@ | ||||
| --- | ||||
| - import_playbook: UnixCLI.yaml | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   roles: | ||||
|     - role: system-info | ||||
| - import_playbook: UnixGUI.yaml | ||||
| - hosts: localhost | ||||
|   vars_files: | ||||
|     - vars/environment.yaml | ||||
|   vars: | ||||
|     github_auth_headers: >- | ||||
|       {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|           if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
|   roles: | ||||
|     - role: mas | ||||
| 
 | ||||
|     - role: hiddenbar | ||||
|     - role: iterm | ||||
|     - role: kitty | ||||
|     - role: neovide | ||||
|     - role: magnet | ||||
|     - role: windows-app | ||||
|     - role: microsoft-remote-desktop | ||||
|     - role: viscosity | ||||
| 
 | ||||
|     - role: macos | ||||
|  | ||||
| @ -1,15 +0,0 @@ | ||||
| --- | ||||
| # GitHub may rate limit unauthenticated API requests, this is more likely when | ||||
| # behind a network proxy. Set the GITHUB_TOKEN environment variable to | ||||
| # authenticate any GitHub API requests executed while playing roles. | ||||
| github_auth_headers: >- | ||||
|   {{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') } | ||||
|       if lookup('env', 'GITHUB_TOKEN') else {} }} | ||||
| 
 | ||||
| # When working behind a network proxy, set the http_proxy and https_proxy | ||||
| # environment variables. These will be passed through to uses of the `get_url` | ||||
| # module when playing roles. | ||||
| proxy_environment: >- | ||||
|   {{ { 'http_proxy': lookup('env', 'http_proxy'), | ||||
|        'https_proxy': lookup('env', 'https_proxy') } | ||||
|       if lookup('env', 'http_proxy') and lookup('env', 'https_proxy') else {} }} | ||||
| @ -16,7 +16,6 @@ | ||||
|   get_url: | ||||
|     url: https://downloads.1password.com/linux/keys/1password.asc | ||||
|     dest: '{{keyring}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: set compatible architecture | ||||
|   when: ansible_machine == 'x86_64' | ||||
| @ -62,5 +61,4 @@ | ||||
|     src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe | ||||
|     dest: ~/.local/bin/op | ||||
| 
 | ||||
| - include_tasks: linux-autostart.yaml | ||||
| - include_tasks: zsh-completion.yaml | ||||
|  | ||||
| @ -20,5 +20,3 @@ | ||||
|   dnf: | ||||
|     name: 1password | ||||
|     state: latest | ||||
| 
 | ||||
| - include_tasks: linux-autostart.yaml | ||||
|  | ||||
| @ -6,10 +6,25 @@ | ||||
|     app_exe: '{{ansible_env.LOCALAPPDATA}}/1Password/app/8/1Password.exe' | ||||
|     installer_exe: '{{ansible_env.TEMP}}/1PasswordSetup-latest.exe' | ||||
| 
 | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     state: latest | ||||
|     name: 1password | ||||
| - name: check if already installed | ||||
|   win_stat: | ||||
|     path: '{{app_exe}}' | ||||
|   register: app_stat | ||||
| 
 | ||||
| - name: download latest installer | ||||
|   when: not app_stat.stat.exists | ||||
|   win_get_url: | ||||
|     url: https://downloads.1password.com/win/1PasswordSetup-latest.exe | ||||
|     dest: '{{installer_exe}}' | ||||
| 
 | ||||
| - name: run installer | ||||
|   when: not app_stat.stat.exists | ||||
|   win_command: '{{installer_exe}}' | ||||
| 
 | ||||
| - name: remove installer | ||||
|   win_file: | ||||
|     path: '{{installer_exe}}' | ||||
|     state: absent | ||||
| 
 | ||||
| - name: create start menu shortcut | ||||
|   win_shortcut: | ||||
| @ -18,27 +33,50 @@ | ||||
|     icon: '{{app_exe}},0' | ||||
| 
 | ||||
| # CLI | ||||
| - name: install scoop cli package | ||||
|   community.windows.win_scoop: | ||||
|     state: present | ||||
|     name: 1password-cli | ||||
| 
 | ||||
| - set_fact: | ||||
|     cli_dir: '{{ansible_env.LOCALAPPDATA}}\1Password\cli' | ||||
|     cli_zip: '{{ansible_env.TEMP}}/op_windows_amd64.zip' | ||||
| - set_fact: | ||||
|     cli_exe: '{{cli_dir}}\op.exe' | ||||
| 
 | ||||
| - name: create cli directory | ||||
|   win_file: | ||||
|     state: directory | ||||
|     path: '{{cli_dir}}' | ||||
| - name: check if op already installed | ||||
|   win_stat: | ||||
|     path: '{{cli_exe}}' | ||||
|   register: cli_stat | ||||
| 
 | ||||
| - name: remove old op executable | ||||
|   win_file: | ||||
|     state: absent | ||||
|     path: '{{cli_dir}}\op.exe' | ||||
| - name: get installed op version | ||||
|   when: cli_stat.stat.exists == True | ||||
|   win_command: '{{cli_exe}} --version' | ||||
|   register: cli_version | ||||
|   changed_when: false | ||||
| 
 | ||||
| - name: remove old op install directory from user PATH | ||||
| - when: cli_stat.stat.exists == True | ||||
|   set_fact: | ||||
|     cli_installed_version: '{{cli_version.stdout.strip()}}' | ||||
| 
 | ||||
| - name: get list of op releases | ||||
|   win_uri: | ||||
|     url: https://raw.githubusercontent.com/kbenzie/op-release-scraper/main/op-releases.json | ||||
|     return_content: true | ||||
|   register: releases | ||||
| 
 | ||||
| - set_fact: | ||||
|     latest: '{{releases.json[0]}}' | ||||
| 
 | ||||
| - name: download latest op zip archive | ||||
|   when: cli_installed_version is not defined or cli_installed_version != latest.version | ||||
|   win_get_url: | ||||
|     url: '{{latest.downloads.Windows.amd64}}' | ||||
|     dest: '{{cli_zip}}' | ||||
| 
 | ||||
| - name: unzip op zip archive | ||||
|   when: cli_installed_version is not defined or cli_installed_version != latest.version | ||||
|   win_unzip: | ||||
|     src: '{{cli_zip}}' | ||||
|     dest: '{{cli_dir}}' | ||||
| 
 | ||||
| - name: add op install directory to user PATH | ||||
|   win_path: | ||||
|     state: absent | ||||
|     scope: user | ||||
|     name: Path | ||||
|     elements: '{{cli_dir}}' | ||||
| @ -46,7 +84,7 @@ | ||||
| - name: get op powershell completion script | ||||
|   win_command: | ||||
|     argv: | ||||
|       - '{{ansible_env.LOCALAPPDATA}}\Scoop\shims\op.exe' | ||||
|       - '{{ansible_env.LOCALAPPDATA}}/1Password/cli/op.exe' | ||||
|       - completion | ||||
|       - powershell | ||||
|   register: powershell_completion_script | ||||
|  | ||||
| @ -1,20 +0,0 @@ | ||||
| --- | ||||
| - name: create ~/.config/autostart directory | ||||
|   file: | ||||
|     state: directory | ||||
|     path: ~/.config/autostart | ||||
| 
 | ||||
| - name: create autostart desktop file | ||||
|   copy: | ||||
|     dest: '{{ansible_env.HOME}}/.config/autostart/1password.desktop' | ||||
|     content: | | ||||
|       [Desktop Entry] | ||||
|       Name=1Password | ||||
|       Exec=/opt/1Password/1password %U | ||||
|       Terminal=false | ||||
|       Type=Application | ||||
|       Icon=1password | ||||
|       StartupWMClass=1Password | ||||
|       Comment=Password manager and secure wallet | ||||
|       MimeType=x-scheme-handler/onepassword;x-scheme-handler/onepassword8; | ||||
|       Categories=Office; | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: ag | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: ag | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,10 +0,0 @@ | ||||
| --- | ||||
| - name: install Apple Music from Microsoft Store | ||||
|   win_winget: | ||||
|     name: Apple Music | ||||
|     state: latest | ||||
| 
 | ||||
| - name: remove Cider from Chocolatey | ||||
|   win_chocolatey: | ||||
|     name: Cider | ||||
|     state: absent | ||||
| @ -6,9 +6,9 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   win_git: | ||||
|     repo: git@git.infektor.net:config/AutoHotKey.git | ||||
|     repo: git@code.infektor.net:config/AutoHotKey.git | ||||
|     dest: '{{autohotkey_repo_dir}}' | ||||
|     branch: main | ||||
|     branch: master | ||||
| 
 | ||||
| - name: create scheduled task | ||||
|   win_scheduled_task: | ||||
| @ -31,25 +31,3 @@ | ||||
|     run_level: highest | ||||
|     start_when_available: true | ||||
|     wake_to_run: false | ||||
| 
 | ||||
| - name: create scheduled task | ||||
|   win_scheduled_task: | ||||
|     path: Benie | ||||
|     name: mouse.ahk | ||||
|     state: present | ||||
|     enable: true | ||||
|     triggers: | ||||
|       - type: logon | ||||
|         enabled: true | ||||
|       - type: registration | ||||
|         enabled: true | ||||
|     actions: | ||||
|       - path: '{{autohotkey_repo_dir}}/mouse.ahk' | ||||
|     disallow_start_if_on_batteries: false | ||||
|     stop_if_going_on_batteries: false | ||||
|     execution_time_limit: PT0S | ||||
|     logon_type: interactive_token | ||||
|     multiple_instances: 3 | ||||
|     run_level: highest | ||||
|     start_when_available: true | ||||
|     wake_to_run: false | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: Bat | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: bat | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -51,7 +51,6 @@ | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{bat_deb}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install .deb file | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|  | ||||
| @ -13,4 +13,3 @@ | ||||
|   become: true | ||||
|   flatpak: | ||||
|     name: sh.cider.Cider | ||||
|     state: latest | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: curl | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: curl | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -19,14 +19,8 @@ | ||||
|     name: fd | ||||
|     state: latest | ||||
| 
 | ||||
| - name: remove chocolatey package | ||||
| - name: install Chocolatey package | ||||
|   when: ansible_os_family == 'Windows' | ||||
|   win_chocolatey: | ||||
|     name: fd | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   when: ansible_os_family == 'Windows' | ||||
|   community.windows.win_scoop: | ||||
|     name: fd | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,16 +0,0 @@ | ||||
| --- | ||||
| - assert: | ||||
|     that: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora' | ||||
| 
 | ||||
| - name: install non-free gstreamer plugins | ||||
|   become: true | ||||
|   dnf: | ||||
|     state: latest | ||||
|     allowerasing: true | ||||
|     name: | ||||
|       - ffmpeg | ||||
|       - gstreamer1-plugins-bad-free | ||||
|       - gstreamer1-plugins-bad-freeworld | ||||
|       - gstreamer1-plugins-base | ||||
|       - gstreamer1-plugins-good | ||||
|       - gstreamer1-plugins-ugly | ||||
| @ -14,4 +14,3 @@ | ||||
|   become: true | ||||
|   flatpak: | ||||
|     name: org.ferdium.Ferdium | ||||
|     state: latest | ||||
|  | ||||
| @ -17,7 +17,6 @@ | ||||
|   get_url: | ||||
|     url: https://packages.mozilla.org/apt/repo-signing-key.gpg | ||||
|     dest: /etc/apt/keyrings/packages.mozilla.org.asc | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: add mozilla apt repo | ||||
|   become: true | ||||
|  | ||||
| @ -1,4 +1,8 @@ | ||||
| --- | ||||
| - name: enable homebrew tap | ||||
|   homebrew_tap: | ||||
|     name: homebrew/cask-fonts | ||||
| 
 | ||||
| - name: install Caskaydia Cove Nerd Font | ||||
|   homebrew_cask: | ||||
|     name: font-caskaydia-cove-nerd-font | ||||
|  | ||||
| @ -37,7 +37,6 @@ | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install Caskaydia Cove Nerd Font | ||||
|   when: needs_installed | ||||
|  | ||||
| @ -9,16 +9,5 @@ | ||||
| - name: create symbolic links | ||||
|   file: | ||||
|     state: link | ||||
|     src: '{{ item.src }}' | ||||
|     dest: '{{ item.dest }}' | ||||
|   with_items: | ||||
|     - src: ~/.local/src/fzf/bin/fzf | ||||
|     src: ~/.local/src/fzf/bin/fzf | ||||
|     dest: ~/.local/bin/fzf | ||||
|     - src: ~/.local/src/fzf/bin/fzf-tmux | ||||
|       dest: ~/.local/bin/fzf-tmux | ||||
|     - src: ~/.local/src/fzf/bin/fzf-preview.sh | ||||
|       dest: ~/.local/bin/fzf-preview.sh | ||||
|     - src: ~/.local/src/fzf/man/man1/fzf.1 | ||||
|       dest: ~/.local/share/man/man1/fzf.1 | ||||
|     - src: ~/.local/src/fzf/man/man1/fzf-tmux.1 | ||||
|       dest: ~/.local/share/man/man1/fzf-tmux.1 | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: fzf | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: fzf | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,14 +0,0 @@ | ||||
| --- | ||||
| - name: install homebrew package | ||||
|   when: ansible_os_family == 'Darwin' | ||||
|   homebrew: | ||||
|     state: latest | ||||
|     name: gemini-cli | ||||
| 
 | ||||
| - name: install npm package | ||||
|   when: ansible_os_family != 'Darwin' | ||||
|   become: true | ||||
|   community.general.npm: | ||||
|     name: '@google/gemini-cli' | ||||
|     state: latest | ||||
|     global: true | ||||
| @ -15,7 +15,6 @@ | ||||
|     url: https://cli.github.com/packages/githubcli-archive-keyring.gpg | ||||
|     dest: /usr/share/keyrings/githubcli-archive-keyring.gpg | ||||
|     mode: 0644 | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: add apt repository list | ||||
|   become: true | ||||
|  | ||||
| @ -4,7 +4,6 @@ | ||||
|   get_url: | ||||
|     url: https://cli.github.com/packages/rpm/gh-cli.repo | ||||
|     dest: /etc/yum.repos.d/gh-cli.repo | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install dnf package | ||||
|   become: true | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: gh | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: gh | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -19,7 +19,6 @@ | ||||
|   win_get_url: | ||||
|     url: '{{git_asset.browser_download_url}}' | ||||
|     dest: '{{git_installer_path}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: run installer command | ||||
|   win_command: | ||||
|  | ||||
| @ -36,7 +36,7 @@ | ||||
|   win_git: | ||||
|     repo: '{{item.repo}}' | ||||
|     dest: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}' | ||||
|     version: main | ||||
|     version: master | ||||
|   with_items: '{{git_config_repos}}' | ||||
| 
 | ||||
| # - TODO: install pip packages | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
|   git: | ||||
|     repo: '{{item.repo}}' | ||||
|     dest: '~/.config/{{item.name}}' | ||||
|     version: main | ||||
|     version: master | ||||
|   with_items: '{{git_config_repos}}' | ||||
| 
 | ||||
| - name: install homebrew packages | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| --- | ||||
| git_config_repos: | ||||
|   - repo: git@git.infektor.net:config/git.git | ||||
|   - repo: git@code.infektor.net:config/git.git | ||||
|     name: git | ||||
|   - repo: git@git.infektor.net:benie/config.git | ||||
|   - repo: git@code.infektor.net:benie/config.git | ||||
|     name: private | ||||
| git_pip_packages: | ||||
|   - git+https://github.com/kbenzie/git-issue.git | ||||
|  | ||||
| @ -40,11 +40,10 @@ | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{tea_package_exe}}' | ||||
|     mode: '0755' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install package | ||||
|   when: install_required | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: 'stow --no-folding --target /usr/local .' | ||||
|     cmd: 'stow --target /usr/local .' | ||||
|     chdir: '{{tea_package_dir}}' | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
|     path: '{{glab}}' | ||||
|   register: stat_glab | ||||
| 
 | ||||
| - name: get install version | ||||
| - name: get instlal version | ||||
|   when: stat_glab.stat.exists | ||||
|   command: '{{glab}} --version' | ||||
|   register: glab_version_output | ||||
| @ -31,9 +31,8 @@ | ||||
|     latest_version: '{{releases.json[0].tag_name}}' | ||||
|     query: > | ||||
|       [?contains(name, `glab`)] | | ||||
|       [?contains(name, `linux`)] | | ||||
|       [?contains(name, `{{ | ||||
|         {'x86_64': 'amd64', 'arm64': 'arm64'}[ansible_machine]}}.deb`)] | [0] | ||||
|       [?contains(name, `Linux`)] | | ||||
|       [?contains(name, `{{ansible_machine}}.deb`)] | [0] | ||||
| - set_fact: | ||||
|     asset: '{{latest.assets.links|json_query(query)}}' | ||||
| 
 | ||||
| @ -49,7 +48,6 @@ | ||||
|   get_url: | ||||
|     url: '{{asset.url}}' | ||||
|     dest: '{{tempdir.path}}/glab.deb' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install .deb file | ||||
|   when: glab_version is not defined or glab_version != latest_version | ||||
| @ -63,13 +61,7 @@ | ||||
|     state: absent | ||||
|     path: '{{tempdir.path}}' | ||||
| 
 | ||||
| - name: get zsh completions source | ||||
|   command: glab completion -s zsh | ||||
|   register: glab_zsh_completions | ||||
|   changed_when: false | ||||
| 
 | ||||
| - name: install zsh completions | ||||
|   become: true | ||||
|   copy: | ||||
|     content: '{{glab_zsh_completions.stdout}}' | ||||
|     dest: /usr/local/share/zsh/site-functions/_glab | ||||
|   when: glab_version is not defined or glab_version != latest_version | ||||
|   command: | ||||
|     glab completion -s zsh > ~/.local/share/zsh/site-functions/_glab | ||||
|  | ||||
| @ -1,12 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: | ||||
|       - glab | ||||
|       - glab.portable | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: glab | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,18 +0,0 @@ | ||||
| --- | ||||
| - name: ubuntu dock disable dock-fixed | ||||
|   gsettings: | ||||
|     schema: org.gnome.shell.extensions.dash-to-dock | ||||
|     key: dock-fixed | ||||
|     value: 'false' | ||||
| 
 | ||||
| - name: ubuntu dock set dock-position to bottom | ||||
|   gsettings: | ||||
|     schema: org.gnome.shell.extensions.dash-to-dock | ||||
|     key: dock-position | ||||
|     value: "'BOTTOM'" | ||||
| 
 | ||||
| - name: ubuntu dock disable extend-height | ||||
|   gsettings: | ||||
|     schema: org.gnome.shell.extensions.dash-to-dock | ||||
|     key: extend-height | ||||
|     value: 'false' | ||||
| @ -2,72 +2,37 @@ | ||||
| - assert: | ||||
|     that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" | ||||
| 
 | ||||
| - name: install packages | ||||
| - name: install gnome-tweaks | ||||
|   become: true | ||||
|   package: | ||||
|     name: | ||||
|       - gnome-tweaks | ||||
|       - gnome-themes-extra | ||||
|     name: gnome-tweaks | ||||
|     state: latest | ||||
| 
 | ||||
| - name: prefer dark mode | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.interface | ||||
|     key: color-scheme | ||||
|     value: "'prefer-dark'" | ||||
| 
 | ||||
| - name: disable activate-window-menu keybinding | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.wm.keybindings | ||||
|     key: activate-window-menu | ||||
|     value: '@as []' | ||||
| 
 | ||||
| - name: disable switch-input-source keybinding | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.wm.keybindings | ||||
|     key: switch-input-source | ||||
|     value: '@as []' | ||||
| - name: disable switch-input-source-backward keybinding | ||||
|   gsettings: | ||||
|     schema: org.gnome.desktop.wm.keybindings | ||||
|     key: switch-input-source-backward | ||||
|     value: '@as []' | ||||
| 
 | ||||
| # TODO: window full screen toggle keybinding | ||||
| 
 | ||||
| # NOTE: Use this command to see default keybindings | ||||
| # gsettings list-recursively | grep -i -E 'media-keys|keybindings' | ||||
| # NOTE: Use this command to inspect the current state of the custom keybindings | ||||
| # dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p' | ||||
| 
 | ||||
| - name: 1password quick access custom keybinding | ||||
|   dconf: | ||||
|     state: present | ||||
|     key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/{{item.key}}' | ||||
|     value: '{{item.value}}' | ||||
|   with_items: | ||||
|     - {key: 'binding', value: "'<Shift><Alt>space'"} | ||||
|     - {key: 'command', value: "'1password --quick-access'"} | ||||
|     - {key: 'name', value: "'1Password Quick Access'"} | ||||
| - set_fact: | ||||
|     custom_keybindings: | ||||
|       # TODO: 1Password Quick Access | ||||
|       # [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0] | ||||
|       # binding='<Shift><Alt>space' | ||||
|       # command='1password --quick-access' | ||||
|       # name='1Password Quick Access' | ||||
|       - binding: <Shift><Alt>space | ||||
|         command: 1password --quick-access | ||||
|         name: 1Password Quick Access | ||||
| 
 | ||||
| - name: ulauncher toggle custom keybinding | ||||
|   dconf: | ||||
|     state: present | ||||
|     key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/{{item.key}}' | ||||
|     value: '{{item.value}}' | ||||
|   with_items: | ||||
|     - {key: 'binding', value: "'<Alt>space'"} | ||||
|     - {key: 'command', value: "'ulauncher-toggle'"} | ||||
|     - {key: 'name', value: "'Ulauncher Toggle'"} | ||||
|       # TODO: Guake toggle - this requires removing a default binding | ||||
|       # [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1] | ||||
|       # binding='<Super>space' | ||||
|       # command='guake-toggle' | ||||
|       # name='Guake Toggle' | ||||
|       - binding: <Super>space | ||||
|         command: guake-toggle | ||||
|         name: Guake Toggle | ||||
| 
 | ||||
| - name: list of entries defining custom-keybindings | ||||
|   dconf: | ||||
|     state: present | ||||
|     key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings' | ||||
|     value: "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']" | ||||
| 
 | ||||
| - when: ansible_distribution == 'Ubuntu' | ||||
|   include_tasks: Ubuntu.yaml | ||||
| 
 | ||||
| # TODO: install gnome extensions | ||||
| # TODO: /org/gnome/shell/extensions/quake-terminal/terminal-shortcut = ['<Super>space'] | ||||
| # TODO: List of custom-keybindings | ||||
| # [org/gnome/settings-daemon/plugins/media-keys] | ||||
| # custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/'] | ||||
|  | ||||
							
								
								
									
										8
									
								
								roles/guake/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								roles/guake/tasks/main.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| --- | ||||
| - assert: | ||||
|     that: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows' | ||||
| 
 | ||||
| - name: install package | ||||
|   package: | ||||
|     name: guake | ||||
|     state: latest | ||||
| @ -40,4 +40,3 @@ | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{jp_exe}}' | ||||
|     mode: +x | ||||
|   environment: '{{proxy_environment}}' | ||||
|  | ||||
| @ -50,4 +50,3 @@ | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{ansible_env.HOME}}/.local/bin/jp' | ||||
|     mode: '0755' | ||||
|   environment: '{{proxy_environment}}' | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: jq | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: jq | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,108 +1,6 @@ | ||||
| --- | ||||
| - name: remove apt package | ||||
| - name: install apt package | ||||
|   become: true | ||||
|   apt: | ||||
|     name: kitty | ||||
|     state: absent | ||||
| 
 | ||||
| - name: get latest version | ||||
|   uri: | ||||
|     url: https://api.github.com/repos/kovidgoyal/kitty/releases/latest | ||||
|     headers: '{{github_auth_headers}}' | ||||
|   register: latest | ||||
| 
 | ||||
| - set_fact: | ||||
|     kitty_latest_version: '{{latest.json.tag_name[1:]}}' | ||||
|     kitty_exe: /usr/local/bin/kitty | ||||
|     kitty_package_dir: /usr/local/stow/kitty | ||||
| 
 | ||||
| - name: check if already installed | ||||
|   stat: | ||||
|     path: '{{kitty_exe}}' | ||||
|   register: kitty | ||||
| 
 | ||||
| - name: get installed version | ||||
|   when: kitty.stat.exists | ||||
|   command: '{{kitty_exe}} --version' | ||||
|   register: kitty_version | ||||
|   changed_when: false | ||||
| 
 | ||||
| - when: kitty.stat.exists | ||||
|   set_fact: | ||||
|     kitty_install_version: | ||||
|       '{{kitty_version.stdout | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}' | ||||
| 
 | ||||
| - set_fact: | ||||
|     kitty_asset_query: > | ||||
|       [? contains(name, | ||||
|         `kitty-{{kitty_latest_version}}-{{ansible_architecture}}.txz`)] | [0] | ||||
| 
 | ||||
| - set_fact: | ||||
|     kitty_install_required: > | ||||
|       {{ kitty_install_version is not defined or | ||||
|         kitty_latest_version != kitty_install_version }} | ||||
|     kitty_asset: "{{ latest.json.assets | json_query(kitty_asset_query) }}" | ||||
| 
 | ||||
| - name: uninstall package | ||||
|   when: kitty_install_required and kitty.stat.exists | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: 'stow --delete --target /usr/local .' | ||||
|     chdir: '{{kitty_package_dir}}' | ||||
| 
 | ||||
| - name: remove outdated package | ||||
|   when: kitty_install_required and kitty.stat.exists | ||||
|   become: true | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '{{kitty_package_dir}}' | ||||
| 
 | ||||
| - set_fact: | ||||
|     kitty_package_archive: '{{kitty_package_dir}}/{{kitty_asset.name}}' | ||||
| 
 | ||||
| - name: create package directory | ||||
|   become: true | ||||
|   file: | ||||
|     state: directory | ||||
|     path: '{{kitty_package_dir}}' | ||||
| 
 | ||||
| - name: download package | ||||
|   when: kitty_install_required | ||||
|   become: true | ||||
|   get_url: | ||||
|     url: '{{kitty_asset.browser_download_url}}' | ||||
|     dest: '{{kitty_package_archive}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: decompress package | ||||
|   when: kitty_install_required | ||||
|   become: true | ||||
|   unarchive: | ||||
|     src: '{{kitty_package_archive}}' | ||||
|     dest: '{{kitty_package_dir}}' | ||||
|     owner: root | ||||
|     group: staff | ||||
| 
 | ||||
| - name: remove package archive | ||||
|   when: kitty_install_required | ||||
|   become: true | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '{{kitty_package_archive}}' | ||||
| 
 | ||||
| # FIXME: This is bound to break something somewhere but on Ubuntu 22.04 this | ||||
| # file breaks a bunch of other stuff when the kitty package in installed in | ||||
| # /usr/local with stow so we delete it before stowing. | ||||
| - name: remove conflicting library | ||||
|   when: kitty_install_required | ||||
|   become: true | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '{{kitty_package_dir}}/lib/libglib-2.0.so.0' | ||||
| 
 | ||||
| - name: install package | ||||
|   when: kitty_install_required | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: "stow --no-folding --target /usr/local --ignore='lib/.*$' ." | ||||
|     chdir: '{{kitty_package_dir}}' | ||||
|     state: latest | ||||
|  | ||||
| @ -3,6 +3,5 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   git: | ||||
|     repo: git@git.infektor.net:config/kitty.git | ||||
|     repo: git@code.infektor.net:config/kitty.git | ||||
|     dest: ~/.config/kitty | ||||
|     version: main | ||||
|  | ||||
| @ -57,7 +57,6 @@ | ||||
|   get_url: | ||||
|     url: https://apt.llvm.org/llvm-snapshot.gpg.key | ||||
|     dest: '{{keyring}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: add upstream deb repository | ||||
|   become: true | ||||
|  | ||||
| @ -4,5 +4,5 @@ | ||||
| 
 | ||||
| - name: install homebrew cask | ||||
|   homebrew_cask: | ||||
|     name: windows-app | ||||
|     name: microsoft-remote-desktop | ||||
|     state: latest | ||||
| @ -1,14 +0,0 @@ | ||||
| --- | ||||
| - name: install homebrew package | ||||
|   when: ansible_os_family == 'Darwin' | ||||
|   homebrew_cask: | ||||
|     name: neovide-app | ||||
|     state: latest | ||||
| 
 | ||||
| - name: install winget package | ||||
|   when: ansible_os_family == 'Winodws' | ||||
|   win_winget: | ||||
|     name: Neovide.Neovide | ||||
|     state: latest | ||||
| 
 | ||||
| # TODO: install linux package | ||||
| @ -9,14 +9,6 @@ | ||||
|     name: neovim | ||||
|     state: absent | ||||
| 
 | ||||
| - set_fact: | ||||
|     old_package_dirs: | ||||
|       - /usr/local/lib/nvim/nvim-linux-x86_64 | ||||
|       - /usr/local/stow/nvim/nvim-linux64 | ||||
| 
 | ||||
| - include_tasks: sudo-rmdir.yaml | ||||
|   with_items: '{{old_package_dirs}}' | ||||
| 
 | ||||
| - name: install gnu stow for managing tar.gz package | ||||
|   become: true | ||||
|   apt: | ||||
| @ -25,6 +17,7 @@ | ||||
|     state: latest | ||||
| 
 | ||||
| - name: install python provider pip package | ||||
|   become: true | ||||
|   pip: | ||||
|     name: pynvim | ||||
|     state: latest | ||||
| @ -54,31 +47,25 @@ | ||||
|     install_required: | ||||
|       '{{installed_version is not defined or | ||||
|          installed_version != latest.json.tag_name}}' | ||||
|     asset_query: '[?contains(name, `nvim-linux-x86_64.tar.gz`)]' | ||||
|     package_dir: '/usr/local/stow/nvim' | ||||
|     asset_query: '[?contains(name, `nvim-linux64.tar.gz`)]' | ||||
|     package_dir: '/usr/local/lib/nvim' | ||||
| - set_fact: | ||||
|     uninstall_required: '{{nvim.stat.exists and install_required}}' | ||||
|     asset: '{{latest.json.assets | json_query(asset_query)}}' | ||||
|     package_path: '{{package_dir}}/{{latest.json.name}}' | ||||
| 
 | ||||
| - name: remove nuisance mimeinfo.cache file | ||||
|   become: true | ||||
|   file: | ||||
|     path: /usr/local/stow/nvim/nvim-linux-x86_64/share/applications/mimeinfo.cache | ||||
|     state: absent | ||||
| 
 | ||||
| - name: uninstall old package from /usr/local | ||||
|   when: uninstall_required | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: 'stow --delete --target /usr/local .' | ||||
|     chdir: '{{package_dir}}/nvim-linux-x86_64' | ||||
|     chdir: '{{package_dir}}/nvim-linux64' | ||||
| 
 | ||||
| - name: remove old package | ||||
|   become: true | ||||
|   when: uninstall_required | ||||
|   file: | ||||
|     path: '{{package_dir}}/nvim-linux-x86_64' | ||||
|     path: '{{package_dir}}/nvim-linux64' | ||||
|     state: absent | ||||
| 
 | ||||
| - name: create package directory | ||||
| @ -93,7 +80,6 @@ | ||||
|   get_url: | ||||
|     url: '{{asset[0].browser_download_url}}' | ||||
|     dest: '{{package_path}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: extract package archive | ||||
|   when: install_required | ||||
| @ -109,11 +95,20 @@ | ||||
|     path: '{{package_path}}' | ||||
|     state: absent | ||||
| 
 | ||||
| - name: move man to share/man | ||||
|   when: install_required | ||||
|   become: true | ||||
|   command: | ||||
|     argv: | ||||
|       - mv | ||||
|       - '{{package_dir}}/nvim-linux64/man' | ||||
|       - '{{package_dir}}/nvim-linux64/share' | ||||
| 
 | ||||
| - name: install package to /usr/local | ||||
|   when: install_required | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: 'stow --no-folding --target /usr/local .' | ||||
|     chdir: '{{package_dir}}/nvim-linux-x86_64' | ||||
|     cmd: 'stow --target /usr/local .' | ||||
|     chdir: '{{package_dir}}/nvim-linux64' | ||||
| 
 | ||||
| - include_tasks: Unix.yaml | ||||
|  | ||||
							
								
								
									
										36
									
								
								roles/neovim/tasks/Unix-plugins.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								roles/neovim/tasks/Unix-plugins.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| --- | ||||
| - name: clone plugin repos | ||||
|   git: | ||||
|     repo: 'https://github.com/{{item.repo}}.git' | ||||
|     dest: '{{plugin_dir}}/{{item.mode | default("start")}}/{{item.repo | regex_replace("^.*\/(.*)$", "\1")}}' | ||||
|     version: '{{item.branch | default("HEAD")}}' | ||||
|   with_items: '{{plugins}}' | ||||
| 
 | ||||
| - name: get list of managed plugin paths | ||||
|   set_fact: | ||||
|     managed_plugins: >- | ||||
|       {{ | ||||
|         managed_plugins | default([]) + [ | ||||
|             plugin_dir + "/" + | ||||
|             item.mode | default("start") + "/" + | ||||
|             item.repo | regex_replace("^.*\/(.*)$", "\1") | ||||
|         ] | ||||
|       }} | ||||
|   with_items: '{{plugins}}' | ||||
| 
 | ||||
| - name: find all installed plugin directories | ||||
|   find: | ||||
|     paths: | ||||
|       - '{{plugin_dir}}/start' | ||||
|       - '{{plugin_dir}}/opt' | ||||
|     file_type: directory | ||||
|   register: found_plugins | ||||
| 
 | ||||
| - name: remove found plugins which are not in the managed list | ||||
|   file: | ||||
|     path: '{{item.path}}' | ||||
|     state: absent | ||||
|   with_items: '{{found_plugins.files}}' | ||||
|   when: item.path not in managed_plugins | ||||
|   loop_control: | ||||
|     label: '{{item.path}}' | ||||
| @ -4,7 +4,7 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   git: | ||||
|     repo: git@git.infektor.net:config/nvim.git | ||||
|     repo: git@code.infektor.net:config/nvim.git | ||||
|     dest: '{{vim_config_dir}}' | ||||
|     version: main | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										43
									
								
								roles/neovim/tasks/Windows-plugins.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								roles/neovim/tasks/Windows-plugins.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | ||||
| --- | ||||
| - name: clone plugin repos | ||||
|   win_git: | ||||
|     repo: 'https://github.com/{{item.repo}}.git' | ||||
|     dest: '{{plugin_dir}}/{{item.mode | default("start")}}/{{item.repo | regex_replace("^.*\/(.*)$", "\1")}}' | ||||
|     branch: '{{item.branch | default("HEAD")}}' | ||||
|   with_items: '{{plugins}}' | ||||
| 
 | ||||
| - name: get list of managed plugin paths | ||||
|   set_fact: | ||||
|     managed_plugins: >- | ||||
|       {{ | ||||
|         managed_plugins | default([]) + [ | ||||
|             plugin_dir + "/" + | ||||
|             item.mode | default("start") + "/" + | ||||
|             item.repo | regex_replace("^.*\/(.*)$", "\1") | ||||
|         ] | ||||
|       }} | ||||
|   with_items: '{{plugins}}' | ||||
| 
 | ||||
| - name: find all start plugin directories | ||||
|   win_find: | ||||
|     paths: | ||||
|       - '{{plugin_dir}}/start' | ||||
|       - '{{plugin_dir}}/opt' | ||||
|     file_type: directory | ||||
|   register: found_plugins | ||||
| 
 | ||||
| - set_fact: | ||||
|     backslashes: '\\' | ||||
|     forwardslash: '/' | ||||
| - set_fact: | ||||
|     managed_plugins: "{{managed_plugins | replace(backslashes, forwardslash)}}" | ||||
|     found_plugins: "{{found_plugins | replace(backslashes, forwardslash)}}" | ||||
| 
 | ||||
| - name: remove found plugins which are not in the managed list | ||||
|   win_file: | ||||
|     path: '{{item.path}}' | ||||
|     state: absent | ||||
|   with_items: '{{found_plugins.files}}' | ||||
|   when: item.path not in managed_plugins | ||||
|   loop_control: | ||||
|     label: '{{item.path}}' | ||||
| @ -1,34 +1,59 @@ | ||||
| --- | ||||
| - name: install winget packages | ||||
|   win_winget: | ||||
|     name: | ||||
|       - neovim.neovim | ||||
|       - equalsraf.neovim-qt | ||||
|     state: latest | ||||
| 
 | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey packages | ||||
|   win_chocolatey: | ||||
|     name: neovim | ||||
|     state: absent | ||||
|     state: latest | ||||
| 
 | ||||
| - set_fact: | ||||
|     vim_config_dir: '{{ansible_env.LOCALAPPDATA}}\nvim' | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   win_git: | ||||
|     repo: git@git.infektor.net:config/nvim.git | ||||
|     repo: git@code.infektor.net:config/nvim.git | ||||
|     dest: '{{vim_config_dir}}' | ||||
|     branch: main | ||||
| 
 | ||||
| # TODO: Create neovim-qt start menu shortcut | ||||
| # Need a reliable way to get the path to nvim-qt which doesn't reply on | ||||
| # where.exe or similar as it won't work on first install due to environment | ||||
| # variable update. winget installs the equalsraf.neovim-qt package in | ||||
| # {{ansible_env.ProgramFiles}}\neovim-qt {{neovim_qt_version}}\bin\nvim.qt.exe | ||||
| # so if I can get the version out of winget that would be a start. | ||||
| # - name: create nvim start menu shortcut | ||||
| #   win_shortcut: | ||||
| #     src: '{{neovim_qt_exe}}' | ||||
| #     dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk' | ||||
| #     icon: '{{neovim_qt_exe}},0' | ||||
| #     directory: '{{ansible_env.USERPROFILE}}' | ||||
| # - TODO: neovim install pip packages | ||||
| #   win_pip: | ||||
| #     name: '{{neovim_pip_packages}}' | ||||
| #     state: latest | ||||
| 
 | ||||
| - name: create nvim start menu shortcut | ||||
|   win_shortcut: | ||||
|     src: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe' | ||||
|     dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/nvim-qt.lnk' | ||||
|     icon: '{{ansible_env.ChocolateyToolsLocation}}/neovim/nvim-win64/bin/nvim-qt.exe,0' | ||||
|     directory: '{{ansible_env.USERPROFILE}}' | ||||
| 
 | ||||
| - name: check for config repo tasks.yaml | ||||
|   win_stat: | ||||
|     path: '{{vim_config_dir}}/tasks.yaml' | ||||
|   register: config_repo_tasks | ||||
| 
 | ||||
| # TODO: this doesn't work for non localhost setups | ||||
| # probably need to copy the tasks.yaml and plugins.yaml to the controller in a | ||||
| # temporary directory then include them | ||||
| - when: config_repo_tasks.stat.exists | ||||
|   fetch: | ||||
|     src: '{{vim_config_dir}}/tasks.yaml' | ||||
|     dest: vim_config_tasks.yaml | ||||
|     flat: true | ||||
|   changed_when: false | ||||
| 
 | ||||
| - when: config_repo_tasks.stat.exists | ||||
|   include_tasks: vim_config_tasks.yaml | ||||
| 
 | ||||
| - name: remove fetched tasks | ||||
|   file: | ||||
|     state: absent | ||||
|     path: vim_config_tasks.yaml | ||||
|   changed_when: false | ||||
|   delegate_to: localhost | ||||
| 
 | ||||
| - when: ansible_os_family != "Windows" and | ||||
|         plugin_dir is defined and plugins is defined | ||||
|   include_tasks: 'Unix-plugins.yaml' | ||||
| - when: ansible_os_family == "Windows" and | ||||
|         plugin_dir is defined and plugins is defined | ||||
|   include_tasks: 'Windows-plugins.yaml' | ||||
|  | ||||
| @ -1,19 +0,0 @@ | ||||
| --- | ||||
| - name: check if {{item}} exists | ||||
|   stat: | ||||
|     path: '{{item}}' | ||||
|   register: old_package | ||||
| 
 | ||||
| - name: uninstall package from {{item}} | ||||
|   when: old_package.stat.exists | ||||
|   become: true | ||||
|   command: | ||||
|     cmd: 'stow --delete --target /usr/local .' | ||||
|     chdir: '{{item}}' | ||||
| 
 | ||||
| - name: remove {{item}} | ||||
|   when: old_package.stat.exists | ||||
|   become: true | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '{{item}}' | ||||
| @ -1,3 +1,7 @@ | ||||
| --- | ||||
| neovim_pip_packages: | ||||
|   - cmake-language-server | ||||
|   - cmakelint | ||||
|   - compdb | ||||
|   - vim-vint | ||||
|   - yamllint | ||||
|  | ||||
| @ -13,7 +13,6 @@ | ||||
|   get_url: | ||||
|     url: 'https://nodejs.org/dist/{{latest.json[0].version}}/node-{{latest.json[0].version}}-linux-x64.tar.gz' | ||||
|     dest: ~/.local/src/node/node.tar.gz | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: extract downloaded package | ||||
|   unarchive: | ||||
|  | ||||
| @ -1,40 +0,0 @@ | ||||
| --- | ||||
| - name: get latest github release | ||||
|   uri: | ||||
|     url: https://api.github.com/repos/Syllo/nvtop/releases/latest | ||||
|     headers: '{{github_auth_headers}}' | ||||
|   register: latest | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset_query: '[?contains(name, `x86_64.AppImage`)] | [0]' | ||||
|     assets: '{{latest.json.assets}}' | ||||
|     latest_version: '{{latest.json.tag_name}}' | ||||
|     nvtop_exe: '/usr/local/bin/nvtop' | ||||
| 
 | ||||
| - name: check if already installed | ||||
|   stat: | ||||
|     path: '{{nvtop_exe}}' | ||||
|   register: nvtop_stat | ||||
| 
 | ||||
| - name: get installed version | ||||
|   when: nvtop_stat.stat.exists == True | ||||
|   command: '{{nvtop_exe}} --version' | ||||
|   register: nvtop_version_output | ||||
|   changed_when: false | ||||
| 
 | ||||
| - when: nvtop_stat.stat.exists == True | ||||
|   set_fact: | ||||
|     installed_version: | ||||
|       '{{nvtop_version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}' | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset: '{{assets | to_json | from_json | json_query(asset_query)}}' | ||||
| 
 | ||||
| - name: download executable | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   become: true | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{nvtop_exe}}' | ||||
|     mode: +x | ||||
|   environment: '{{proxy_environment}}' | ||||
| @ -1,10 +0,0 @@ | ||||
| --- | ||||
| - name: install dnf package | ||||
|   when: ansible_os_family == 'RedHat' | ||||
|   become: true | ||||
|   dnf: | ||||
|     state: latest | ||||
|     name: nvtop | ||||
| 
 | ||||
| - when: ansible_os_family != 'RedHat' | ||||
|   include_tasks: install-appimage.yaml | ||||
| @ -3,7 +3,6 @@ | ||||
|   become: true | ||||
|   flatpak: | ||||
|     name: md.obsidian.Obsidian | ||||
|     state: latest | ||||
| 
 | ||||
| # Remove old appimage if it exists | ||||
| - name: stat appimage symlink | ||||
|  | ||||
| @ -5,14 +5,14 @@ | ||||
| 
 | ||||
| - name: clone config repos | ||||
|   win_git: | ||||
|     repo: git@git.infektor.net:config/WindowsPowerShell.git | ||||
|     repo: https://code.infektor.net/config/WindowsPowerShell.git | ||||
|     dest: '{{powershell_config_dir}}' | ||||
|     branch: main | ||||
|     branch: master | ||||
| 
 | ||||
| - name: remove cmder chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: Cmder | ||||
|     state: absent | ||||
|     state: latest | ||||
| 
 | ||||
| - name: get NuGet package provider | ||||
|   ansible.windows.win_powershell: | ||||
| @ -38,14 +38,3 @@ | ||||
|     name: posh-git | ||||
|     state: latest | ||||
|     accept_license: true | ||||
| 
 | ||||
| - name: install pwsh for powershell lsp | ||||
|   community.windows.win_scoop: | ||||
|     name: pwsh | ||||
|     state: present | ||||
| 
 | ||||
| - name: run install script | ||||
|   win_command: | ||||
|     cmd: 'powershell.exe {{powershell_config_dir}}/install.ps1' | ||||
|   register: powershell_install | ||||
|   changed_when: "'changed' in powershell_install.stdout" | ||||
|  | ||||
| @ -1,13 +1,7 @@ | ||||
| --- | ||||
| - name: stat old config repo | ||||
|   stat: | ||||
|     path: ~/.config/python/.git | ||||
|   register: config_python_git | ||||
| 
 | ||||
| - name: remove old config repo | ||||
|   when: config_python_git.stat.exists | ||||
|   file: | ||||
|     state: absent | ||||
| - name: install config repo | ||||
|   git: | ||||
|     repo: git@code.infektor.net:config/python.git | ||||
|     dest: ~/.config/python | ||||
| 
 | ||||
| - name: create config directories | ||||
| @ -19,45 +13,34 @@ | ||||
|     - ~/.config/ipython/profile_default | ||||
|     - ~/.config/pip | ||||
| 
 | ||||
| - name: stat pip.conf | ||||
|   stat: | ||||
|     path: ~/.config/pip/pip.conf | ||||
|   register: pip_conf | ||||
| 
 | ||||
| - name: remove pip.conf if its a symbolic link | ||||
|   when: pip_conf.stat.exists and pip_conf.stat.islnk | ||||
| # Ensure that pip.conf exists before ever installing pip packages since | ||||
| # Debian has enabled `EXTERNALLY-MANAGED` from PEP 668 which breaks `pip | ||||
| # install --user` unless configured otherwise. | ||||
| - name: create symbolic links | ||||
|   file: | ||||
|     state: absent | ||||
|     path: ~/.config/pip/pip.conf | ||||
| 
 | ||||
| # Ensure that pip.conf exists before ever installing pip packages since Debian | ||||
| # has enabled `EXTERNALLY-MANAGED` from PEP 668 which breaks `pip install | ||||
| # --user` unless configured otherwise. | ||||
| - name: create user pip.conf from template | ||||
|   template: | ||||
|     src: pip.conf.j2 | ||||
|     dest: ~/.config/pip/pip.conf | ||||
| 
 | ||||
| # TODO: Also configure pip to disable `EXTERNALLY-MANAGED` globally? | ||||
| 
 | ||||
| - name: stat old ipython_config.py | ||||
|   stat: | ||||
|     path: ~/.config/ipython/profile_default/ipython_config.py | ||||
|   register: ipython_config_py | ||||
| 
 | ||||
| - name: remove ipython_conifg.py if its a symbolic link | ||||
|   when: ipython_config_py.stat.exists and ipython_config_py.stat.islnk | ||||
|   file: | ||||
|     state: absent | ||||
|     path: ~/.config/ipython/profile_default/ipython_config.py | ||||
| 
 | ||||
| - name: create ipython config from template | ||||
|   template: | ||||
|     src: ipython_config.py | ||||
|     state: link | ||||
|     src: '{{item.src}}' | ||||
|     dest: '{{item.dest}}' | ||||
|   with_items: | ||||
|     - src: ~/.config/python/flake8 | ||||
|       dest: ~/.config/flake8 | ||||
|     - src: ~/.config/python/pylintrc | ||||
|       dest: ~/.pylintrc | ||||
|     - src: ~/.config/python/ipython_config.py | ||||
|       dest: ~/.config/ipython/profile_default/ipython_config.py | ||||
|     - src: ~/.config/python/pip.conf | ||||
|       dest: ~/.config/pip/pip.conf | ||||
| 
 | ||||
| - name: install pip packages | ||||
|   pip: | ||||
|     name: '{{python_pip_packages}}' | ||||
|     state: latest | ||||
|     extra_args: --user | ||||
| 
 | ||||
| - name: create directories | ||||
|   file: | ||||
|     state: directory | ||||
|     dest: '{{item}}' | ||||
|   with_items: | ||||
|     - ~/.config/ipython/profile_default | ||||
|     - ~/.config/pip | ||||
|  | ||||
| @ -1 +0,0 @@ | ||||
| c.TerminalInteractiveShell.editing_mode = 'vi' | ||||
| @ -1,8 +0,0 @@ | ||||
| [global] | ||||
| break-system-packages = true | ||||
| {% if ansible_env.http_proxy is defined %} | ||||
| proxy = {{ ansible_env.http_proxy }} | ||||
| {% endif %} | ||||
| 
 | ||||
| [list] | ||||
| format=columns | ||||
| @ -6,7 +6,6 @@ python_pip_packages: | ||||
|   - ipython | ||||
|   - isort | ||||
|   - jmespath | ||||
|   - psutil | ||||
|   - pylint | ||||
|   - python-gist | ||||
|   - yapf | ||||
|  | ||||
| @ -19,14 +19,8 @@ | ||||
|     name: ripgrep | ||||
|     state: latest | ||||
| 
 | ||||
| - name: remove chocolatey package | ||||
| - name: install Chocolatey package | ||||
|   when: ansible_os_family == 'Windows' | ||||
|   win_chocolatey: | ||||
|     name: ripgrep | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   when: ansible_os_family == 'Windows' | ||||
|   community.windows.win_scoop: | ||||
|     name: ripgrep | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| - name: detect if scoop is installed | ||||
|   win_command: where.exe scoop | ||||
|   changed_when: false | ||||
|   failed_when: false | ||||
|   register: scoop_result | ||||
| 
 | ||||
| - assert: | ||||
|     that: scoop_result.rc == 0 | ||||
|     fail_msg: Scoop is not installed | ||||
| 
 | ||||
| - name: add extras bucket | ||||
|   community.windows.win_scoop_bucket: | ||||
|     name: extras | ||||
|     state: present | ||||
| 
 | ||||
| - name: install completions | ||||
|   community.windows.win_scoop: | ||||
|     name: scoop-completion | ||||
|     state: present | ||||
| 
 | ||||
| - win_owner: | ||||
|     path: '{{ansible_env.LOCALAPPDATA}}/Scoop/buckets/extras' | ||||
|     user: '{{ansible_env.USERNAME}}' | ||||
|     recurse: true | ||||
| @ -1,43 +0,0 @@ | ||||
| --- | ||||
| # FIXME: This will only work for Debian or Ubuntu but not Ubuntu derived distros | ||||
| - set_fact: | ||||
|     assets: '{{latest.json.assets}}' | ||||
|     asset_name: 'sunshine-{{ ansible_distribution | lower }}-{{ ansible_distribution_version }}-amd64.deb' | ||||
| - set_fact: | ||||
|     asset_query: '[?contains(name, `{{asset_name}}`)] | [0]' | ||||
| - set_fact: | ||||
|     asset: '{{assets | json_query(asset_query)}}' | ||||
| 
 | ||||
| - name: download deb file | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '/tmp/{{asset_name}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install package from deb file | ||||
|   become: true | ||||
|   apt: | ||||
|     deb: '/tmp/{{asset_name}}' | ||||
| 
 | ||||
| - name: remove deb file | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '/tmp/{{asset_name}}' | ||||
| 
 | ||||
| - name: fix systemd unit | ||||
|   become: true | ||||
|   copy: | ||||
|     dest: /usr/lib/systemd/user/sunshine.service | ||||
|     content: | | ||||
|       [Unit] | ||||
|       Description=Sunshine is a self-hosted game stream host for Moonlight. | ||||
|       StartLimitIntervalSec=500 | ||||
|       StartLimitBurst=5 | ||||
| 
 | ||||
|       [Service] | ||||
|       ExecStart=/usr/bin/sunshine | ||||
|       Restart=on-failure | ||||
|       RestartSec=5s | ||||
| 
 | ||||
|       [Install] | ||||
|       WantedBy=xdg-desktop-autostart.target | ||||
| @ -1,56 +0,0 @@ | ||||
| --- | ||||
| - assert: | ||||
|     that: | ||||
|       - ansible_distribution == "Fedora" | ||||
|       - assets is defined | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset_name: 'sunshine-{{ ansible_distribution | lower }}-{{ ansible_distribution_version }}-amd64.rpm' | ||||
| - set_fact: | ||||
|     asset_query: '[?contains(name, `{{asset_name}}`)] | [0]' | ||||
| - set_fact: | ||||
|     asset: '{{assets | json_query(asset_query)}}' | ||||
| 
 | ||||
| - name: download rpm file | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '/tmp/{{asset_name}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: install package from rpm file | ||||
|   dnf: | ||||
|     name: '/tmp/{{asset_name}}' | ||||
| 
 | ||||
| - name: remove rpm file | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '/tmp/{{asset_name}}' | ||||
| 
 | ||||
| - name: create udev rules for uinput | ||||
|   become: true | ||||
|   copy: | ||||
|     content: | | ||||
|       KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess" | ||||
|     dest: /etc/udev/rules.d/60-sunshine.rules | ||||
| 
 | ||||
| - name: reload udev rules for uinput | ||||
|   become: true | ||||
|   command: udevadm control --reload-rules | ||||
| 
 | ||||
| - name: request udev events | ||||
|   become: true | ||||
|   command: udevadm trigger | ||||
| 
 | ||||
| - name: add uinput module | ||||
|   become: true | ||||
|   modprobe: | ||||
|     name: uinput | ||||
| 
 | ||||
| - name: stat sunshine | ||||
|   stat: | ||||
|     path: /usr/bin/sunshine | ||||
|   register: sunshine | ||||
| 
 | ||||
| - name: enable permissions for KMS capture | ||||
|   become: true | ||||
|   command: 'setcap cap_sys_admin+p {{ sunshine.stat.lnk_source }}' | ||||
| @ -1,18 +0,0 @@ | ||||
| --- | ||||
| - name: get latest version | ||||
|   uri: | ||||
|     url: https://api.github.com/repos/LizardByte/Sunshine/releases/latest | ||||
|     headers: '{{github_auth_headers}}' | ||||
|   register: latest | ||||
| 
 | ||||
| - set_fact: | ||||
|     assets: '{{latest.json.assets}}' | ||||
| 
 | ||||
| - include_tasks: '{{ansible_os_family}}.yaml' | ||||
| 
 | ||||
| - name: enable systemd service | ||||
|   ansible.builtin.systemd_service: | ||||
|     name: sunshine | ||||
|     scope: user | ||||
|     enabled: true | ||||
|     state: started | ||||
| @ -1,25 +1,4 @@ | ||||
| --- | ||||
| - name: get list of running launchd services | ||||
|   command: launchctl list | ||||
|   register: launchd_running_services | ||||
|   changed_when: false | ||||
| 
 | ||||
| - name: determine if system-info is currently running | ||||
|   set_fact: | ||||
|     system_info_debug: true | ||||
|     system_info_plist_path: '{{ansible_env.HOME}}/Library/LaunchAgents/system-info.plist' | ||||
|     system_info_running: "{{'system-info' in launchd_running_services.stdout}}" | ||||
| 
 | ||||
| - name: install system-info launchd plist | ||||
|   template: | ||||
|     src: system-info.plist.j2 | ||||
|     dest: '{{system_info_plist_path}}' | ||||
|   register: system_info_plist | ||||
| 
 | ||||
| - name: unload running system-info launchd service | ||||
|   when: system_info_plist.changed and system_info_running | ||||
|   command: 'launchctl unload -w {{system_info_plist_path}}' | ||||
| 
 | ||||
| - name: load system-info launchd service | ||||
|   when: system_info_plist.changed or not system_info_running | ||||
|   command: 'launchctl load -w {{system_info_plist_path}}' | ||||
| # TODO: create a launchd module that handles user mode services | ||||
| # cp $script_dir/system-info.plist ~/Library/LaunchAgents/system-info.plist | ||||
| # launchctl load -w ~/Library/LaunchAgents/system-info.plist | ||||
|  | ||||
| @ -1,19 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
|   <dict> | ||||
|     <key>Label</key> | ||||
|     <string>system-info</string> | ||||
|     <key>EnvironmentVariables</key> | ||||
|     <dict> | ||||
|       <key>PATH</key> | ||||
|       <string>/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> | ||||
|     </dict> | ||||
|     <key>Program</key> | ||||
|     <string>{{ansible_env.HOME}}/.config/tmux/system-info/system-info-macOS.sh</string> | ||||
|     <key>RunAtLoad</key> | ||||
|     <true/> | ||||
|     <key>KeepAlive</key> | ||||
|     <true/> | ||||
|   </dict> | ||||
| </plist> | ||||
| @ -18,7 +18,6 @@ | ||||
|   get_url: | ||||
|     url: https://gist.githubusercontent.com/nicm/ea9cf3c93f22e0246ec858122d9abea1/raw/37ae29fc86e88b48dbc8a674478ad3e7a009f357/tmux-256color | ||||
|     dest: ~/tmux-256color | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: compile terminal info | ||||
|   when: terminfo_exists.rc == 1 | ||||
|  | ||||
| @ -3,11 +3,8 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   git: | ||||
|     repo: git@git.infektor.net:config/tmux.git | ||||
|     repo: git@code.infektor.net:config/tmux.git | ||||
|     dest: ~/.config/tmux | ||||
|     version: main | ||||
|     version: master | ||||
| 
 | ||||
| - name: run install script | ||||
|   command: ~/.config/tmux/install.sh | ||||
|   register: tmux_install | ||||
|   changed_when: "'changed' in tmux_install.stdout" | ||||
| - include_tasks: ~/.config/tmux/tasks.yaml | ||||
|  | ||||
| @ -1,76 +0,0 @@ | ||||
| --- | ||||
| - name: get latest github release | ||||
|   uri: | ||||
|     url: https://api.github.com/repos/typst/typst/releases/latest | ||||
|     headers: '{{github_auth_headers}}' | ||||
|   register: latest | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset_name: >- | ||||
|       {{ | ||||
|         { | ||||
|           'amd64': 'typst-x86_64-unknown-linux-musl', | ||||
|           'x86_64': 'typst-x86_64-unknown-linux-musl', | ||||
|           'arm64': 'typst-aarch64-unknown-linux-musl', | ||||
|         }[ansible_architecture] | ||||
|       }} | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset_query: '[?contains(name, `{{asset_name}}.tar.xz`)] | [0]' | ||||
|     assets: '{{latest.json.assets}}' | ||||
|     asset_archive: '{{asset_name}}.tar.xz' | ||||
|     latest_version: '{{latest.json.tag_name}}' | ||||
|     exe: '{{ansible_env.HOME}}/.local/bin/typst' | ||||
| 
 | ||||
| - name: check if already installed | ||||
|   stat: | ||||
|     path: '{{exe}}' | ||||
|   register: stat_exe | ||||
| 
 | ||||
| - name: get installed version | ||||
|   when: stat_exe.stat.exists == True | ||||
|   command: '{{exe}} --version' | ||||
|   register: version_output | ||||
|   changed_when: false | ||||
| 
 | ||||
| - when: stat_exe.stat.exists == True | ||||
|   set_fact: | ||||
|     installed_version: | ||||
|       'v{{version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}' | ||||
| 
 | ||||
| - set_fact: | ||||
|     asset: '{{assets | to_json | from_json | json_query(asset_query)}}' | ||||
| 
 | ||||
| - name: download archive | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '/tmp/{{asset_archive}}' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: extract archive | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   unarchive: | ||||
|     src: '/tmp/{{asset_archive}}' | ||||
|     dest: '/tmp' | ||||
| 
 | ||||
| - name: remove archive | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '/tmp/{{asset_archive}}' | ||||
| 
 | ||||
| - name: copy executable | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   copy: | ||||
|     src: '/tmp/{{asset_name}}/typst' | ||||
|     dest: '{{exe}}' | ||||
|     mode: +x | ||||
| 
 | ||||
| - name: remove extraced archive | ||||
|   when: installed_version is not defined or installed_version != latest_version | ||||
|   file: | ||||
|     state: absent | ||||
|     path: '/tmp/{{asset_archive}}' | ||||
| 
 | ||||
| # TODO: install zsh completions | ||||
| @ -1,15 +0,0 @@ | ||||
| --- | ||||
| - name: install homebrew package | ||||
|   when: ansible_os_family == 'Darwin' | ||||
|   homebrew: | ||||
|     state: latest | ||||
|     name: typst | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   when: ansible_os_family == 'Windows' | ||||
|   community.windows.win_scoop: | ||||
|     state: present | ||||
|     name: typst | ||||
| 
 | ||||
| - when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows' | ||||
|   include_tasks: Linux.yaml | ||||
| @ -1,54 +0,0 @@ | ||||
| --- | ||||
| - name: install keyring | ||||
|   when: ansible_distribution == 'Debian' | ||||
|   become: true | ||||
|   get_url: | ||||
|     url: '{{ulauncher_keyring_url}}' | ||||
|     dest: '{{ulauncher_keyring_path}}' | ||||
|     mode: '0644' | ||||
|     force: true | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: slurp /etc/os-release | ||||
|   when: ansible_distribution != 'Debian' | ||||
|   slurp: | ||||
|     src: /etc/os-release | ||||
|   register: os_release_slurp | ||||
| 
 | ||||
| - when: ansible_distribution != 'Debian' | ||||
|   set_fact: | ||||
|     os_release: "{{ os_release_slurp.content | | ||||
|         b64decode | trim() | replace('=', ': ') | from_yaml }}" | ||||
| 
 | ||||
| - set_fact: | ||||
|     codename: '{{ansible_distribution_release}}' | ||||
| - when: ansible_distribution != 'Debian' and 'UBUNTU_CODENAME' in os_release | ||||
|   set_fact: | ||||
|     codename: '{{os_release.UBUNTU_CODENAME}}' | ||||
| 
 | ||||
| - debug: var=codename | ||||
| 
 | ||||
| - name: add apt sources list | ||||
|   when: ansible_distribution == 'Debian' | ||||
|   become: true | ||||
|   copy: | ||||
|     content: >- | ||||
|       deb [signed-by={{ulauncher_keyring_path}}] | ||||
|       http://ppa.launchpad.net/agornostal/ulauncher/ubuntu | ||||
|       {{codename}} main" | ||||
|     dest: '{{ulauncher_apt_sources_list_path}}' | ||||
| 
 | ||||
| - name: add ppa repository | ||||
|   when: ansible_distribution != 'Debian' | ||||
|   become: true | ||||
|   apt_repository: | ||||
|     repo: ppa:agornostal/ulauncher | ||||
|     codename: '{{codename}}' | ||||
| 
 | ||||
| - name: install apt package | ||||
|   become: true | ||||
|   apt: | ||||
|     name: ulauncher | ||||
|     state: latest | ||||
| 
 | ||||
| - include_tasks: linux-autostart.yaml | ||||
| @ -1,8 +0,0 @@ | ||||
| --- | ||||
| - name: install dnf package | ||||
|   become: true | ||||
|   dnf: | ||||
|     name: ulauncher | ||||
|     state: latest | ||||
| 
 | ||||
| - include_tasks: linux-autostart.yaml | ||||
| @ -1,15 +0,0 @@ | ||||
| --- | ||||
| - name: create autostart desktop file | ||||
|   copy: | ||||
|     dest: '{{ansible_env.HOME}}/.config/autostart/ulauncher.desktop' | ||||
|     content: | | ||||
|       [Desktop Entry] | ||||
|       Name=Ulauncher | ||||
|       Comment=Application launcher for Linux | ||||
|       GenericName=Launcher | ||||
|       Categories=GNOME;GTK;Utility; | ||||
|       TryExec=/usr/bin/ulauncher | ||||
|       Exec=env GDK_BACKEND=x11 /usr/bin/ulauncher --hide-window | ||||
|       Icon=ulauncher | ||||
|       Terminal=false | ||||
|       Type=Application | ||||
| @ -1,2 +0,0 @@ | ||||
| --- | ||||
| - include_tasks: '{{ansible_os_family}}.yaml' | ||||
| @ -1,4 +0,0 @@ | ||||
| --- | ||||
| ulauncher_keyring_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x59ebde772980c381ca13fa59faf1020699503176 | ||||
| ulauncher_keyring_path: /usr/share/keyrings/ulauncher-archive-keyring.gpg | ||||
| ulauncher_apt_list_path: /etc/apt/sources.list.d/ulauncher.list | ||||
| @ -28,7 +28,6 @@ | ||||
|     url: 'https://cdn-2.webcatalog.io/webcatalog/{{appimage}}' | ||||
|     dest: '{{ansible_env.HOME}}/.local/bin/{{appimage}}' | ||||
|     mode: '0755' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: create directories | ||||
|   file: | ||||
|  | ||||
| @ -1,10 +0,0 @@ | ||||
| --- | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: wezterm | ||||
|     state: latest | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   win_git: | ||||
|     repo: git@git.infektor.net:config/wezterm.git | ||||
|     dest: '{{ansible_env.USERPROFILE}}/.config/wezterm' | ||||
| @ -1,2 +0,0 @@ | ||||
| --- | ||||
| - include_tasks: '{{ansible_os_family}}.yaml' | ||||
| @ -4,7 +4,6 @@ | ||||
|     src: '{{windows_terminal_settings_json}}' | ||||
|   register: slurped_settings | ||||
| 
 | ||||
| # TODO: Handle comments in settings.json | ||||
| - name: decode settings into fact | ||||
|   set_fact: | ||||
|     settings: '{{slurped_settings.content | b64decode | from_json}}' | ||||
|  | ||||
| @ -1,11 +1,8 @@ | ||||
| --- | ||||
| - assert: | ||||
|     that: > | ||||
|       'XDG_CURRENT_DESKTOP' in ansible_env and | ||||
|       'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and ( | ||||
|         ansible_env.XDG_SESSION_TYPE == 'wayland' or | ||||
|         ansible_env.XDG_SESSION_TYPE == 'x11' | ||||
|       ) | ||||
|       'GNOME' in ansible_env.XDG_CURRENT_DESKTOP and | ||||
|       ansible_env.XDG_SESSION_TYPE == 'wayland' | ||||
| 
 | ||||
| - set_fact: | ||||
|     install_dir: '{{ansible_env.HOME}}/.local/bin' | ||||
| @ -66,7 +63,6 @@ | ||||
|   get_url: | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{install_dir}}/xremap.zip' | ||||
|   environment: '{{proxy_environment}}' | ||||
| 
 | ||||
| - name: extract release archive | ||||
|   when: needs_installed | ||||
| @ -109,9 +105,8 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   git: | ||||
|     repo: git@git.infektor.net:config/xremap.git | ||||
|     repo: git@code.infektor.net:config/xremap.git | ||||
|     dest: '{{config_dir}}' | ||||
|     version: main | ||||
|   notify: restart xremap | ||||
| 
 | ||||
| - name: install xremap systemd unit | ||||
|  | ||||
| @ -36,4 +36,3 @@ | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{yq_exe}}' | ||||
|     mode: +x | ||||
|   environment: '{{proxy_environment}}' | ||||
|  | ||||
| @ -50,4 +50,3 @@ | ||||
|     url: '{{asset.browser_download_url}}' | ||||
|     dest: '{{ansible_env.HOME}}/.local/bin/yq' | ||||
|     mode: '0755' | ||||
|   environment: '{{proxy_environment}}' | ||||
|  | ||||
| @ -1,10 +1,5 @@ | ||||
| --- | ||||
| - name: remove chocolatey package | ||||
| - name: install chocolatey package | ||||
|   win_chocolatey: | ||||
|     name: yq | ||||
|     state: absent | ||||
| 
 | ||||
| - name: install scoop package | ||||
|   community.windows.win_scoop: | ||||
|     name: yq | ||||
|     state: present | ||||
|     state: latest | ||||
|  | ||||
| @ -3,14 +3,84 @@ | ||||
| 
 | ||||
| - name: clone config repo | ||||
|   git: | ||||
|     repo: git@git.infektor.net:config/zsh.git | ||||
|     repo: git@code.infektor.net:config/zsh.git | ||||
|     dest: ~/.config/zsh | ||||
|     version: main | ||||
|     version: master | ||||
| 
 | ||||
| - name: run install script | ||||
|   command: ~/.config/zsh/install.zsh | ||||
|   register: zsh_install | ||||
|   changed_when: "'changed' in zsh_install.stdout" | ||||
| - name: clone plugin repos | ||||
|   git: | ||||
|     repo: '{{item.repo}}' | ||||
|     dest: '{{item.dest}}' | ||||
|   with_items: | ||||
|     - repo: https://github.com/zsh-users/zsh-autosuggestions.git | ||||
|       dest: ~/.config/zsh/zsh-autosuggestions | ||||
|     - repo: https://github.com/zsh-users/zsh-history-substring-search.git | ||||
|       dest: ~/.config/zsh/zsh-history-substring-search | ||||
|     - repo: https://github.com/zsh-users/zsh-syntax-highlighting.git | ||||
|       dest: ~/.config/zsh/zsh-syntax-highlighting | ||||
|     - repo: https://github.com/zsh-users/zsh-completions.git | ||||
|       dest: ~/.config/zsh/zsh-completions | ||||
|   loop_control: | ||||
|     label: '{{item.repo | regex_search("https://github.com/(.*)\.git$", "\1")}}' | ||||
| 
 | ||||
| - name: create directories | ||||
|   file: | ||||
|     state: directory | ||||
|     dest: '{{item}}' | ||||
|   with_items: | ||||
|     - ~/.local/bin | ||||
|     - ~/.local/share/zsh/site-functions | ||||
| 
 | ||||
| - name: create symbolic links | ||||
|   file: | ||||
|     state: link | ||||
|     src: '{{item.src}}' | ||||
|     dest: '{{item.dest}}' | ||||
|   with_items: | ||||
|     - src: ~/.config/zsh/zlogin | ||||
|       dest: ~/.zlogin | ||||
|     - src: ~/.config/zsh/zlogout | ||||
|       dest: ~/.zlogout | ||||
|     - src: ~/.config/zsh/zprofile | ||||
|       dest: ~/.zprofile | ||||
|     - src: ~/.config/zsh/zshenv | ||||
|       dest: ~/.zshenv | ||||
|     - src: ~/.config/zsh/zshrc | ||||
|       dest: ~/.zshrc | ||||
|     - src: ~/.config/zsh/prompt_fresh_setup | ||||
|       dest: ~/.local/share/zsh/site-functions/prompt_fresh_setup | ||||
|     - src: ~/.config/zsh/build/_build-dir | ||||
|       dest: ~/.local/share/zsh/site-functions/_build-dir | ||||
|     - src: ~/.config/zsh/sandbox/_sandbox | ||||
|       dest: ~/.local/share/zsh/site-functions/_sandbox | ||||
|     - src: ~/.config/zsh/layout/_layout | ||||
|       dest: ~/.local/share/zsh/site-functions/_layout | ||||
|     - src: ~/.config/zsh/notes/_note | ||||
|       dest: ~/.local/share/zsh/site-functions/_note | ||||
|     - src: ~/.config/zsh/cmake-uninstall | ||||
|       dest: ~/.local/bin/cmake-uninstall | ||||
|     - src: ~/.config/zsh/$ | ||||
|       dest: ~/.local/bin/$ | ||||
|     - src: ~/.config/zsh/url/url | ||||
|       dest: ~/.local/bin/url | ||||
|     - src: ~/.config/zsh/url/_url | ||||
|       dest: ~/.local/share/zsh/site-functions/_url | ||||
| 
 | ||||
|   loop_control: | ||||
|     label: '{{item.dest}}' | ||||
| 
 | ||||
| - name: list commands with available completions | ||||
|   command: | ||||
|     zsh {{ansible_env.HOME}}/.config/zsh/list-commands-with-available-completions.zsh | ||||
|   changed_when: false | ||||
|   register: completion_commands | ||||
| 
 | ||||
| - name: install completions for available commands | ||||
|   file: | ||||
|     state: link | ||||
|     src: '~/.config/zsh/zsh-completions/src/_{{item}}' | ||||
|     dest: '~/.local/share/zsh/site-functions/_{{item}}' | ||||
|   with_items: '{{completion_commands.stdout}}' | ||||
| 
 | ||||
| - name: get absolute path | ||||
|   shell: command -v zsh | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user