├── .gitignore ├── LICENSE-MIT ├── README.md ├── ansible.cfg ├── init.yml ├── inventory ├── requirements.yml └── roles ├── ansible-macos.atom └── library │ └── apm.py ├── ansible-macos.homebrew ├── defaults │ └── main.yml ├── meta │ └── main.yml └── tasks │ └── main.yml ├── ansible-macos.packages ├── defaults │ └── main.yml ├── meta │ └── main.yml └── tasks │ └── main.yml ├── ansible-macos.settings ├── tasks │ └── main.yml └── templates │ └── wallpaper │ └── roppet.png ├── designer-fonts └── tasks │ └── main.yml ├── designer-sketch └── defaults │ └── main.yml ├── designer ├── defaults │ └── main.yml ├── meta │ └── main.yml └── tasks │ └── main.yml ├── developer-atom ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ └── atom │ ├── config.cson │ ├── init.coffee │ ├── keymap.cson │ └── styles.less ├── developer-common ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ ├── aliases │ └── git.sh │ ├── git │ ├── gitconfig │ └── gitignore │ └── hg │ └── hgrc ├── developer-datascience ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ └── aliases │ └── data.science.sh ├── developer-devops ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ └── aliases │ ├── docker.sh │ ├── gitlab.sh │ └── k8s.sh ├── developer-mobile ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ └── aliases │ └── docker.sh ├── developer-nginx ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ ├── aliases │ └── nginx.sh │ ├── conf │ ├── http_geoip2.conf │ └── nginx.conf │ ├── directives │ ├── extra-security.conf │ ├── spdy.conf │ ├── ssl-stampling.conf │ └── ssl.conf │ └── sites-templates │ ├── php.conf │ ├── symfony.conf │ └── wordpress.conf ├── developer-nodejs ├── defaults │ └── main.yml ├── meta │ └── main.yml └── tasks │ └── main.yml ├── developer-nvim ├── defaults │ └── main.yml ├── meta │ └── main.yml └── tasks │ └── main.yml ├── developer-php ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml ├── templates │ ├── aliases │ │ └── php.sh │ ├── ext-xdebug.ini │ └── php.ini └── vars │ └── main.yml ├── developer-terminal ├── defaults │ └── main.yml ├── meta │ └── main.yml ├── tasks │ └── main.yml └── templates │ ├── env_common │ ├── ssh.add.a.plist │ ├── terminal │ └── Base16-ocean.terminal │ └── zsh │ ├── zsh_aliases │ └── zshrc └── developer-vscode ├── defaults └── main.yml ├── meta └── main.yml └── tasks └── main.yml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.retry 3 | .vscode 4 | node_modules 5 | roles/elliotweiser.osx-command-line-tools 6 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OSX Playbook [WIP] 2 | 3 | An Ansible Playbook for web developers using OS X 4 | 5 | ## Getting Started 6 | 7 | Use the next commands to install ansible and run the playbooks 8 | 9 | ### Install pip in OSX 10 | 11 | sudo easy_install pip 12 | 13 | ### Install ansible 14 | 15 | sudo pip install ansible 16 | 17 | ### Install ansible requirements 18 | 19 | ansible-galaxy install -r requirements.yml 20 | chmod -x ./inventory 21 | 22 | ### Run the playbook 23 | 24 | ansible-playbook init.yml --ask-become-pass 25 | 26 | ## Common problems 27 | 28 | If while running the install.yml playbook some of the casks are missing try to run: 29 | 30 | brew update && brew upgrade brew-cask 31 | -------------------------------------------------------------------------------- /ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | hostfile = ./inventory 3 | roles_path = ./roles 4 | -------------------------------------------------------------------------------- /init.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - hosts: localhost 3 | vars: 4 | cli_lang: en_US.UTF-8 5 | user_email: luis.munoz.hdez@gmail.com 6 | user_name: Luis Hdez 7 | docker_hub_user: luishdez 8 | github_user: luishdez 9 | gitlab_user: luishdez 10 | date_timezone: Europe/Madrid 11 | project_sources_path: /Volumes/work-data/sources/ 12 | cask_packages: 13 | - slack 14 | - discord 15 | roles: 16 | - role: elliotweiser.osx-command-line-tools 17 | - role: ansible-macos.homebrew 18 | - role: ansible-macos.settings 19 | - role: developer-common 20 | - role: developer-terminal 21 | - role: developer-php 22 | - role: developer-nodejs 23 | - role: developer-devops 24 | - role: developer-vscode 25 | - role: ansible-macos.packages 26 | -------------------------------------------------------------------------------- /inventory: -------------------------------------------------------------------------------- 1 | localhost ansible_connection=local 2 | -------------------------------------------------------------------------------- /requirements.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - src: elliotweiser.osx-command-line-tools 3 | -------------------------------------------------------------------------------- /roles/ansible-macos.atom/library/apm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | # (c) 2017, Luis Hdez [npm -> apm] 5 | 6 | ANSIBLE_METADATA = {'status': ['preview'], 7 | 'supported_by': 'community', 8 | 'version': '1.0'} 9 | 10 | DOCUMENTATION = ''' 11 | --- 12 | module: apm 13 | short_description: Manage atom packages with apm 14 | description: 15 | - Manage Atom packages with Node Package Manager (apm) 16 | version_added: 1.2 17 | author: "Luis hdez (@chrishoffman)" 18 | options: 19 | name: 20 | description: 21 | - The name of a node.js library to install 22 | required: false 23 | version: 24 | description: 25 | - The version to be installed 26 | required: false 27 | ignore_scripts: 28 | description: 29 | - Use the --ignore-scripts flag when installing. 30 | required: false 31 | choices: [ "yes", "no" ] 32 | default: no 33 | version_added: "1.8" 34 | state: 35 | description: 36 | - The state of the node.js library 37 | required: false 38 | default: present 39 | choices: [ "present", "absent" ] 40 | ''' 41 | 42 | EXAMPLES = ''' 43 | description: Install "coffee-script" Atom package. 44 | - apm: 45 | name: coffee-script 46 | description: Install "coffee-script" Atom package on version 1.6.1. 47 | - apm: 48 | name: coffee-script 49 | version: '1.6.1' 50 | description: Remove the package "coffee-script". 51 | - apm: 52 | name: coffee-script 53 | state: absent 54 | ''' 55 | 56 | import os 57 | 58 | try: 59 | import json 60 | except ImportError: 61 | try: 62 | import simplejson as json 63 | except ImportError: 64 | # Let snippet from module_utils/basic.py return a proper error in this case 65 | pass 66 | 67 | 68 | class Apm(object): 69 | def __init__(self, module, **kwargs): 70 | self.module = module 71 | self.glbl = kwargs['glbl'] 72 | self.name = kwargs['name'] 73 | self.version = kwargs['version'] 74 | self.path = kwargs['path'] 75 | self.registry = kwargs['registry'] 76 | self.production = kwargs['production'] 77 | self.ignore_scripts = kwargs['ignore_scripts'] 78 | 79 | if kwargs['executable']: 80 | self.executable = kwargs['executable'].split(' ') 81 | else: 82 | self.executable = [module.get_bin_path('apm', True)] 83 | 84 | if kwargs['version']: 85 | self.name_version = self.name + '@' + str(self.version) 86 | else: 87 | self.name_version = self.name 88 | 89 | def _exec(self, args, run_in_check_mode=False, check_rc=True): 90 | if not self.module.check_mode or (self.module.check_mode and run_in_check_mode): 91 | cmd = self.executable + args 92 | 93 | if self.glbl: 94 | cmd.append('--global') 95 | if self.production: 96 | cmd.append('--production') 97 | if self.ignore_scripts: 98 | cmd.append('--ignore-scripts') 99 | if self.name: 100 | cmd.append(self.name_version) 101 | if self.registry: 102 | cmd.append('--registry') 103 | cmd.append(self.registry) 104 | 105 | #If path is specified, cd into that path and run the command. 106 | cwd = None 107 | if self.path: 108 | if not os.path.exists(self.path): 109 | os.makedirs(self.path) 110 | if not os.path.isdir(self.path): 111 | self.module.fail_json(msg="path %s is not a directory" % self.path) 112 | cwd = self.path 113 | 114 | rc, out, err = self.module.run_command(cmd, check_rc=check_rc, cwd=cwd) 115 | return out 116 | return '' 117 | 118 | def list(self): 119 | cmd = ['list', '--json'] 120 | 121 | installed = list() 122 | missing = list() 123 | data = json.loads(self._exec(cmd, True, False)) 124 | if 'dependencies' in data: 125 | for dep in data['dependencies']: 126 | if 'missing' in data['dependencies'][dep] and data['dependencies'][dep]['missing']: 127 | missing.append(dep) 128 | elif 'invalid' in data['dependencies'][dep] and data['dependencies'][dep]['invalid']: 129 | missing.append(dep) 130 | else: 131 | installed.append(dep) 132 | if self.name and self.name not in installed: 133 | missing.append(self.name) 134 | #Named dependency not installed 135 | else: 136 | missing.append(self.name) 137 | 138 | return installed, missing 139 | 140 | def install(self): 141 | return self._exec(['install']) 142 | 143 | def update(self): 144 | return self._exec(['update']) 145 | 146 | def uninstall(self): 147 | return self._exec(['uninstall']) 148 | 149 | 150 | def main(): 151 | arg_spec = dict( 152 | name=dict(default=None), 153 | path=dict(default=None, type='path'), 154 | version=dict(default=None), 155 | production=dict(default='no', type='bool'), 156 | executable=dict(default=None, type='path'), 157 | registry=dict(default=None), 158 | state=dict(default='present', choices=['present', 'absent']), 159 | ignore_scripts=dict(default=False, type='bool'), 160 | ) 161 | arg_spec['global'] = dict(default='no', type='bool') 162 | module = AnsibleModule( 163 | argument_spec=arg_spec, 164 | supports_check_mode=True 165 | ) 166 | 167 | name = module.params['name'] 168 | path = module.params['path'] 169 | version = module.params['version'] 170 | glbl = module.params['global'] 171 | production = module.params['production'] 172 | executable = module.params['executable'] 173 | registry = module.params['registry'] 174 | state = module.params['state'] 175 | ignore_scripts = module.params['ignore_scripts'] 176 | 177 | if not path and not glbl: 178 | module.fail_json(msg='path must be specified when not using global') 179 | if state == 'absent' and not name: 180 | module.fail_json(msg='uninstalling a package is only available for named packages') 181 | 182 | apm = Apm(module, name=name, path=path, version=version, glbl=glbl, production=production, \ 183 | executable=executable, registry=registry, ignore_scripts=ignore_scripts) 184 | 185 | changed = False 186 | if state == 'present': 187 | installed, missing = apm.list() 188 | if len(missing): 189 | changed = True 190 | apm.install() 191 | else: #absent 192 | installed, missing = apm.list() 193 | if name in installed: 194 | changed = True 195 | apm.uninstall() 196 | 197 | module.exit_json(changed=changed) 198 | 199 | # import module snippets 200 | from ansible.module_utils.basic import * 201 | 202 | if __name__ == '__main__': 203 | main() 204 | -------------------------------------------------------------------------------- /roles/ansible-macos.homebrew/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | homebrew_repo: https://github.com/Homebrew/brew 3 | homebrew_prefix: /usr/local 4 | homebrew_install_path: "{{ homebrew_prefix }}/Homebrew" 5 | homebrew_brew_bin_path: /usr/local/bin 6 | homebrew_upgrade_all_packages: no 7 | homebrew_use_brewfile: true 8 | homebrew_taps: 9 | - homebrew/core 10 | -------------------------------------------------------------------------------- /roles/ansible-macos.homebrew/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: Installs homebrew 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | - homebrew 19 | -------------------------------------------------------------------------------- /roles/ansible-macos.homebrew/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: Ensure Homebrew parent directory has correct permissions. 2 | file: 3 | path: "{{ homebrew_prefix }}" 4 | owner: root 5 | group: admin 6 | state: directory 7 | mode: 0775 8 | become: yes 9 | 10 | - name: Ensure Homebrew directory exists. 11 | file: 12 | path: "{{ homebrew_install_path }}" 13 | owner: "{{ ansible_user_id }}" 14 | group: admin 15 | state: directory 16 | mode: 0775 17 | become: yes 18 | 19 | # Clone Homebrew. 20 | - name: Ensure Homebrew is installed. 21 | git: 22 | repo: "{{ homebrew_repo }}" 23 | version: master 24 | dest: "{{ homebrew_install_path }}" 25 | update: no 26 | accept_hostkey: yes 27 | depth: 1 28 | 29 | # Adjust Homebrew permissions. 30 | - name: Ensure proper permissions and ownership on homebrew_brew_bin_path dirs. 31 | file: 32 | path: "{{ homebrew_brew_bin_path }}" 33 | state: directory 34 | owner: "{{ ansible_user_id }}" 35 | group: admin 36 | mode: 0775 37 | become: yes 38 | 39 | - name: Ensure proper ownership on homebrew_install_path subdirs. 40 | file: 41 | path: "{{ homebrew_install_path }}" 42 | state: directory 43 | owner: "{{ ansible_user_id }}" 44 | group: admin 45 | recurse: true 46 | become: yes 47 | 48 | - name: Check if homebrew binary is already in place. 49 | stat: "path={{ homebrew_brew_bin_path }}/brew" 50 | register: homebrew_binary 51 | 52 | - name: Symlink brew to homebrew_brew_bin_path. 53 | file: 54 | src: "{{ homebrew_install_path }}/bin/brew" 55 | dest: "{{ homebrew_brew_bin_path }}/brew" 56 | state: link 57 | when: homebrew_binary.stat.exists == false 58 | become: yes 59 | 60 | - name: Force update brew after installation. 61 | command: "{{ homebrew_brew_bin_path }}/brew update --force" 62 | when: homebrew_binary.stat.exists == false 63 | 64 | - name: Ensure configured taps are tapped. 65 | homebrew_tap: "tap={{ item }} state=present" 66 | with_items: "{{ homebrew_taps }}" 67 | 68 | - name: Upgrade all homebrew packages (if configured). 69 | homebrew: update_homebrew=yes upgrade_all=yes 70 | when: homebrew_upgrade_all_packages 71 | -------------------------------------------------------------------------------- /roles/ansible-macos.packages/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | brew_taps: [] 3 | brew_taps_excludes: [] 4 | brew_packages: [] 5 | brew_excludes: [] 6 | cask_packages: [] 7 | cask_excludes: [] 8 | pip_packages: [] 9 | pip_excludes: [] 10 | gem_packages: [] 11 | gem_excludes: [] 12 | npm_packages: [] 13 | npm_excludes: [] 14 | pear_packages: [] 15 | pear_excludes: [] 16 | -------------------------------------------------------------------------------- /roles/ansible-macos.packages/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: Helper to manage multiple common packages in MacOS 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: [developer, packaging, homebrew, npm, gem, pip, pear] 16 | dependencies: 17 | - role: ansible-macos.homebrew 18 | -------------------------------------------------------------------------------- /roles/ansible-macos.packages/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - homebrew_tap: 3 | name: "{{ item.name|default(item) }}" 4 | state: "{{ item.state|default('present') }}" 5 | url: "{{ item.url|default(omit) }}" 6 | with_items: "{{ brew_taps|difference(brew_taps_excludes) }}" 7 | - homebrew: 8 | name: "{{ item.name|default(item) }}" 9 | state: "{{ item.state|default('present') }}" 10 | options: "{{ item.options|default(omit) }}" 11 | with_items: "{{ brew_packages|difference(brew_excludes) }}" 12 | - homebrew_cask: 13 | name: "{{ item.name|default(item) }}" 14 | state: "{{ item.state|default('present') }}" 15 | options: "{{ item.options|default(omit) }}" 16 | with_items: "{{ cask_packages|difference(cask_excludes) }}" 17 | - npm: 18 | name: "{{ item.name|default(item) }}" 19 | global: "{{ item.global|default('yes') }}" 20 | with_items: "{{ npm_packages|difference(npm_excludes) }}" 21 | - pear: 22 | name: "{{ item.name|default(item) }}" 23 | with_items: "{{ pear_packages|difference(pear_excludes) }}" 24 | - pip: 25 | name: "{{ item.name|default(item) }}" 26 | state: "{{ item.state|default('present') }}" 27 | version: "{{ item.version|default(omit) }}" 28 | extra_args: "{{ item.extra_args|default(omit) }}" 29 | executable: "{{ item.executable|default(omit) }}" 30 | requirements: "{{ item.requirements|default(omit) }}" 31 | with_items: "{{ pip_packages|difference(pip_excludes) }}" 32 | - gem: 33 | name: "{{ item.name|default(item) }}" 34 | state: "{{ item.state|default('present') }}" 35 | version: "{{ item.version|default(omit) }}" 36 | gem_source: "{{ item.gem_source|default(omit) }}" 37 | executable: "{{ item.executable|default(omit) }}" 38 | pre_release: "{{ item.pre_release|default(omit) }}" 39 | repository: "{{ item.repository|default(omit) }}" 40 | with_items: "{{ gem_packages|difference(gem_excludes) }}" 41 | -------------------------------------------------------------------------------- /roles/ansible-macos.settings/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: "Finder: Enables ethernet for AirDrop" 2 | command: defaults write com.apple.NetworkBrowser BrowseAllInterfaces 1 3 | - name: "Finder: show all filename extensions" 4 | command: defaults write NSGlobalDomain AppleShowAllExtensions -bool true 5 | - name: "Finder: When performing a search, search the current folder by default" 6 | command: defaults write com.apple.finder FXDefaultSearchScope -string "SCcf" 7 | - name: "Finder: Avoid creating .DS_Store files on network volumes" 8 | command: defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true 9 | - name: "Show the ~/Library folder" 10 | command: chflags nohidden ~/Library 11 | - name: "Don't Ask confirmation for change extension" 12 | command: defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false 13 | 14 | # copy wallpaper file to -> ~/.wallpapers/ 15 | # osascript -e 'tell application "Finder" to set desktop picture to POSIX file "~/.wallpapers/roppet.png"' 16 | -------------------------------------------------------------------------------- /roles/ansible-macos.settings/templates/wallpaper/roppet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansible-macos/macos-playbook/549a527af1189f1de538581963d8c7641a58339d/roles/ansible-macos.settings/templates/wallpaper/roppet.png -------------------------------------------------------------------------------- /roles/designer-fonts/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_cask_packages: 3 | - font-raleway 4 | - font-raleway-dtos 5 | - font-droid-sans 6 | - font-droid-sans-mono 7 | - font-lato 8 | - font-open-sans 9 | - font-montserrat 10 | - font-proxima-nova 11 | - font-pt-sans 12 | - font-roboto 13 | - font-robot-slab 14 | - font-ubuntu 15 | - font-titillium 16 | - font-walkaway 17 | -------------------------------------------------------------------------------- /roles/designer-sketch/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_sketch_plugins: 3 | - gb-sketch-segmentcircle 4 | -------------------------------------------------------------------------------- /roles/designer/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_cask_packages: 3 | - sketch 4 | - sketch-toolbox 5 | - origami-studio 6 | - adobe-photoshop-cc 7 | - adobe-illustrator-cc 8 | -------------------------------------------------------------------------------- /roles/designer/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - design 17 | dependencies: 18 | - role: ansible-macos.packages 19 | cask_packages: "{{ default_cask_packages }}" 20 | -------------------------------------------------------------------------------- /roles/designer/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Tap hombrew formulas 3 | homebrew_tap: name={{ item }} 4 | with_items: brew_taps 5 | when: brew_taps is defined 6 | 7 | - name: Install homebrew package(s) with brew options 8 | homebrew: name={{ item.pkg }} install_options={{ item.opts }} state={{ item.state|default("latest") }} 9 | with_items: brew_pkg_with_opts 10 | when: brew_pkg_with_opts is defined 11 | 12 | - name: Install the homebrew packages 13 | homebrew: name={{ item }} state=latest 14 | with_items: brew_packages 15 | 16 | - name: Install the cask packages 17 | homebrew_cask: name={{ item }} 18 | with_items: cask_packages 19 | -------------------------------------------------------------------------------- /roles/developer-atom/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_npm_packages: 3 | - dockerlint 4 | - eslint 5 | - yaml-js 6 | - csslint 7 | default_brew_packages: 8 | - node 9 | default_cask_packages: 10 | - atom 11 | - font-inconsolata 12 | - font-source-code-pro 13 | default_atom_packages: 14 | - vim-mode-plus 15 | - set-syntax 16 | - sublime-style-column-selection 17 | - atom-terminal 18 | - ask-stack 19 | - trailing-spaces 20 | - auto-detect-indentation 21 | - highlight-selected 22 | - highlight-bad-chars 23 | - less-than-slash 24 | - quick-editor 25 | - editorconfig 26 | - emmet 27 | - pigments 28 | - api-workbench 29 | - file-icons 30 | - tabularize 31 | - language-docker 32 | - language-twig 33 | - language-diff 34 | - language-nginx 35 | - behat-atom 36 | - docblockr 37 | - autocomplete-php 38 | - atom-autocomplete-php 39 | - atom-symfony2 40 | - php-getters-setters 41 | - linter 42 | - linter-php 43 | - linter-phpcs 44 | - linter-phpmd 45 | - linter-js-yaml 46 | - linter-htmlhint 47 | - linter-csslint 48 | - linter-eslint 49 | - atom-ternjs 50 | - language-babel 51 | - linter-docker 52 | - language-r 53 | - autocomplete-R 54 | -------------------------------------------------------------------------------- /roles/developer-atom/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | npm_packages: "{{ default_npm_packages }}" 21 | brew_packages: "{{ default_brew_packages }}" 22 | cask_packages: "{{ default_cask_packages }}" 23 | -------------------------------------------------------------------------------- /roles/developer-atom/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: Setup plugin for atom 2 | command: apm install {{ item }} 3 | with_items: "{{ default_atom_packages }}" 4 | 5 | - name: Setup atom config 6 | template: src=templates/atom/config.cson dest=~/.atom/config.cson 7 | 8 | - name: Setup atom init 9 | template: src=templates/atom/init.coffee dest=~/.atom/init.coffee 10 | 11 | - name: Setup atom keymap 12 | template: src=templates/atom/keymap.cson dest=~/.atom/keymap.cson 13 | 14 | - name: Setup atom styles 15 | template: src=templates/atom/styles.less dest=~/.atom/styles.less 16 | 17 | - name: Download atom schema handler 18 | unarchive: 19 | src: https://github.com/WizardOfOgz/atom-handler/releases/download/1.1.2/atom-handler.app.zip 20 | dest: /Applications 21 | remote_src: true 22 | -------------------------------------------------------------------------------- /roles/developer-atom/templates/atom/config.cson: -------------------------------------------------------------------------------- 1 | "*": 2 | "PHP-Debug": {} 3 | "atom-autocomplete-php": 4 | autoloadPaths: [ 5 | "vendor/autoload.php" 6 | "app/Symfony/vendor/autoload.php" 7 | "app/vendor/autoload.php" 8 | ] 9 | binPhp: "/usr/local/bin/php" 10 | classMapFiles: [ 11 | "app/vendor/composer/autoload_classmap.php" 12 | "app/symfony/vendor/composer/autoload_classmap.php" 13 | "app/app/vendor/composer/autoload_classmap.php" 14 | "app/Symfony/vendor/composer/autoload_classmap.php" 15 | "vendor/composer/autoload_classmap.php" 16 | ] 17 | "atom-beautify": 18 | _analyticsUserId: "db83172e-7699-4357-879b-1812302b5f6e" 19 | "atom-symfony2": 20 | console: [ 21 | "app/bin/console" 22 | "app/app/bin/console" 23 | "app/Symfony/app/console" 24 | ] 25 | "atom-ternjs": 26 | inlineFnCompletionDocumentation: true 27 | useSnippets: true 28 | useSnippetsAndFunction: true 29 | atomatigit: {} 30 | "autocomplete-plus": {} 31 | core: 32 | audioBeep: false 33 | disabledPackages: [ 34 | "language-swig" 35 | "file-type-icons" 36 | "file-types" 37 | "atom-color-highlight" 38 | "api-blueprint-preview" 39 | "atom-terminal" 40 | "javascript-snippets" 41 | "git-control" 42 | "language-api-blueprint" 43 | "linter-tidy" 44 | "php-introspector" 45 | "terminal-panel" 46 | "language-todo" 47 | "linter-htmlhint" 48 | "markdown-themeable-pdf" 49 | "linter-jshint" 50 | "atom-autocomplete-php" 51 | "atom-beautify" 52 | "atom-html-preview" 53 | "php-debug" 54 | "quick-editor" 55 | "atomatigit" 56 | "api-workbench" 57 | "linter-jscs" 58 | ] 59 | excludeVcsIgnoredPaths: false 60 | followSymlinks: false 61 | ignoredNames: [ 62 | ".DS_Store" 63 | ".vagrant" 64 | "._*" 65 | "Thumbs.db" 66 | ] 67 | projectHome: "/Volumes/work-data/sources" 68 | telemetryConsent: "limited" 69 | themes: [ 70 | "one-dark-ui" 71 | "atom-base16-wobblecode-dark-syntax" 72 | ] 73 | diagrams: 74 | previewWidth: 520 75 | editor: 76 | fontFamily: "SF Mono" 77 | invisibles: {} 78 | emmet: {} 79 | "exception-reporting": 80 | userId: "3ce78e03-e80b-ddcb-0f10-15e50a8b8fc0" 81 | "file-icons": 82 | onChanges: true 83 | "file-types": 84 | ".swig$": "text.html.twig" 85 | "fuzzy-finder": {} 86 | "imdone-atom": {} 87 | linter: 88 | disabledProviders: [ 89 | "PHPMD" 90 | "PHPCS" 91 | ] 92 | ignoredLinterErrors: [ 93 | "phpcs" 94 | "phpmd" 95 | ] 96 | subtleLinterErrors: [ 97 | "php" 98 | ] 99 | "linter-docker": {} 100 | "linter-js-yaml": 101 | jsYamlExecutablePath: "/usr/local/bin/js-yaml" 102 | "linter-jshint": {} 103 | "linter-php": 104 | phpExecutablePath: "/usr/local/bin/php" 105 | "linter-phpcs": 106 | executablePath: "/usr/local/bin/phpcs" 107 | phpcsExecutablePath: "/usr/local/bin/phpcs" 108 | standard: "PSR2" 109 | "linter-phpmd": 110 | phpmdExecutablePath: "/usr/local/bin/phpmd" 111 | "linter-ui-default": 112 | panelHeight: 203 113 | "markdown-themeable-pdf": {} 114 | "one-dark-ui": {} 115 | "php-cs-fixer": 116 | executablePath: "/usr/local/bin/php-cs-fixer" 117 | level: "symfony" 118 | "php-debug": {} 119 | pigments: 120 | groupPaletteColors: "by file" 121 | sortPaletteColors: "by name" 122 | react: {} 123 | "todo-show": 124 | findTheseRegexes: [ 125 | "@todos" 126 | "/ @TODO:?(.+$)/gi" 127 | "TODOS" 128 | "/ TODO:?(.+$)/gi" 129 | ] 130 | "tree-view": 131 | hideIgnoredNames: true 132 | "vim-mode": {} 133 | "vim-mode-plus": {} 134 | welcome: 135 | showOnStartup: false 136 | ".php.source": 137 | editor: 138 | tabLength: 4 139 | ".shell.source": 140 | editor: 141 | tabLength: 4 142 | ".js.source.twig": 143 | editor: 144 | scrollPastEnd: false 145 | -------------------------------------------------------------------------------- /roles/developer-atom/templates/atom/init.coffee: -------------------------------------------------------------------------------- 1 | # Your init script 2 | # 3 | # Atom will evaluate this file each time a new window is opened. It is run 4 | # after packages are loaded/activated and after the previous editor state 5 | # has been restored. 6 | # 7 | # An example hack to log to the console when each text editor is saved. 8 | # 9 | # atom.workspace.observeTextEditors (editor) -> 10 | # editor.onDidSave -> 11 | # console.log "Saved! #{editor.getPath()}" 12 | {extname} = require 'path' 13 | 14 | # process.env.PATH = ["/usr/local/bin", process.env.PATH].join(":") 15 | 16 | atom.commands.add '.workspace', 'github:stage-and-commit', -> 17 | workspace = atom.views.getView atom.workspace 18 | atom.commands.dispatch(workspace, 'github:toggle-git-tab-focus') 19 | 20 | setTimeout (-> 21 | github = document.querySelector('.github-Panel') 22 | atom.commands.dispatch(github, 'github:stage-all-changes'); 23 | atom.commands.dispatch(github, 'github:commit'); 24 | return 25 | ), 140 26 | -------------------------------------------------------------------------------- /roles/developer-atom/templates/atom/keymap.cson: -------------------------------------------------------------------------------- 1 | # Your keymap 2 | # 3 | # Atom keymaps work similarly to style sheets. Just as style sheets use 4 | # selectors to apply styles to elements, Atom keymaps use selectors to associate 5 | # keystrokes with events in specific contexts. 6 | # 7 | # You can create a new keybinding in this file by typing "key" and then hitting 8 | # tab. 9 | # 10 | # Here's an example taken from Atom's built-in keymap: 11 | # 12 | # 'atom-text-editor': 13 | # 'enter': 'editor:newline' 14 | # 15 | # 'atom-workspace': 16 | # 'ctrl-shift-p': 'core:move-up' 17 | # 'ctrl-p': 'core:move-down' 18 | # 19 | # You can find more information about keymaps in these guides: 20 | # * https://atom.io/docs/latest/using-atom-basic-customization#customizing-key-bindings 21 | # * https://atom.io/docs/latest/behind-atom-keymaps-in-depth 22 | # 23 | # This file uses CoffeeScript Object Notation (CSON). 24 | # If you are unfamiliar with CSON, you can read more about it here: 25 | # https://github.com/bevry/cson#what-is-cson 26 | '.workspace': 27 | 'cmd-shift-c': 'github:stage-and-commit' 28 | 'ctrl-shift-p': 'github:push' 29 | 30 | '.github-Panel': 31 | 'shift-enter': 'github:commit' 32 | 'cmd-shift-d': 'github:discard-all-changes' 33 | 34 | '.github-StagingView': 35 | 'shift-c': 'github:commit' 36 | 'c': 'github:commit' 37 | 's': 'core:confirm' 38 | 'u': 'core:confirm' 39 | 'shift-s': 'github:stage-all-changes' 40 | 'shift-u': 'github:unstage-all-changes' 41 | 42 | 'atom-text-editor.vim-mode:not(.insert-mode)': 43 | 'g q': 'autoflow:reflow-selection' 44 | 45 | 'atom-text-editor.vim-mode.operator-pending-mode, atom-text-editor.vim-mode.visual-mode': 46 | 'g q': 'autoflow:reflow-selection' 47 | -------------------------------------------------------------------------------- /roles/developer-atom/templates/atom/styles.less: -------------------------------------------------------------------------------- 1 | // https://github.com/atom/atom/blob/master/static/variables/ui-variables.less 2 | 3 | atom-panel-container.left, 4 | atom-panel-container.right { 5 | min-width: 0; 6 | } 7 | 8 | .tree-view { 9 | font-size: 1em; 10 | background: #343945; 11 | } 12 | 13 | .tree-view .selected:before { 14 | background: #4F576B; 15 | } 16 | 17 | atom-text-editor {} 18 | atom-text-editor::shadow .cursor {} 19 | 20 | .gutter .line-numbers .php-debug-breakpoint { 21 | color: #fff; 22 | background-color: #A266F9; 23 | } 24 | 25 | .tab-bar { 26 | border-bottom: 1px solid #2D3342; 27 | } 28 | 29 | .tab-bar .tab::after { 30 | border-right: none; 31 | box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.06), 1px 0 0 #2e333c !important; 32 | } 33 | 34 | .tab-bar .tab .title { 35 | -webkit-mask: none; 36 | background-color: #343945; 37 | } 38 | 39 | atom-text-editor.editor .wrap-guide { 40 | background-color: #3B414D; 41 | } 42 | 43 | atom-pane { 44 | border-left: 1px solid #2B3038 !important; 45 | border-bottom: 1px solid #2B3038 !important; 46 | } 47 | 48 | atom-pane-container { 49 | padding-top: 0; 50 | } 51 | 52 | atom-pane-container atom-pane { 53 | position: relative; 54 | padding-top: 0em !important; 55 | padding-right: 0em !important; 56 | } 57 | 58 | atom-pane-container atom-pane .item-views { 59 | border: none !important; 60 | border-top: none; 61 | } 62 | 63 | .tree-view-scroller { 64 | border-image: none; 65 | border-bottom: 1px solid #2B3038 !important; 66 | } 67 | 68 | .theme-one-dark-ui { 69 | atom-dock .tab-bar .tab.active { 70 | background-color: #343945; 71 | } 72 | 73 | .atom-dock-inner.atom-dock-open.left { 74 | border-right: 1px solid #31353C; 75 | } 76 | 77 | .tab-bar { 78 | font-size: 13px; 79 | background: #343945; 80 | box-shadow: inset 0 -1px 0 #31353C; 81 | } 82 | 83 | .tab-bar .tab { 84 | background-color: #343945; 85 | border-left: 1px solid #2a2e35; 86 | } 87 | 88 | .tab-bar .tab:first-child { 89 | border-left: none; 90 | } 91 | 92 | .tab-bar .tab:last-of-type { 93 | box-shadow: 1px 0 0 #2a2e35; 94 | } 95 | 96 | .tab-bar .tab .title { -webkit-mask: none; } 97 | .tree-view { font-size: 13px;} 98 | 99 | .status-bar { 100 | font-size: 12px; 101 | background-color: #343945; 102 | } 103 | } 104 | 105 | /** 106 | * Theme 107 | */ 108 | .variable { 109 | color: #7A6D7E; 110 | } 111 | 112 | .punctuation.definition.string, 113 | .punctuation.definition.variable, 114 | .punctuation.definition.string, 115 | .punctuation.definition.parameters, 116 | .punctuation.definition.string, 117 | .punctuation.definition.array { 118 | color: #A5BEEA; 119 | } 120 | 121 | .entity.name.function, .meta.require, .support.function.any-method { 122 | color: #E2EF6D; 123 | } 124 | 125 | .constant.numeric { 126 | color: #F0FF0A; 127 | font-weight: 300; 128 | } 129 | 130 | .constant { 131 | color: #E3FF33; 132 | font-weight: 200; 133 | } 134 | -------------------------------------------------------------------------------- /roles/developer-common/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_taps: [] 3 | default_brew_packages: 4 | - git 5 | - httpie 6 | default_cask_packages: 7 | - google-chrome 8 | - firefox 9 | - studio-3t 10 | - rdm 11 | - sequel-pro 12 | - cyberduck 13 | 14 | # - transmission 15 | # - vlc 16 | # - skype 17 | # - slack 18 | # - discord 19 | # - rambox 20 | # - sourcetree 21 | # - qlcolorcode # quicklook plugin 22 | # - qlstephen # quicklook plugin 23 | # - qlmarkdown # quicklook plugin 24 | # - quicklook-json # quicklook plugin 25 | # - qlprettypatch # quicklook plugin 26 | # - quicklook-csv # quicklook plugin 27 | # - betterzipql # quicklook plugin 28 | # - qlimagesize # quicklook plugin 29 | # - quicklook-pat # quicklook plugin 30 | -------------------------------------------------------------------------------- /roles/developer-common/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.10 12 | - 10.11 13 | - 10.12 14 | - 10.13 15 | - 10.14 16 | categories: 17 | - developer 18 | - packaging 19 | dependencies: 20 | - role: ansible-macos.packages 21 | brew_taps: "{{ default_brew_taps }}" 22 | brew_packages: "{{ default_brew_packages }}" 23 | cask_packages: "{{ default_cask_packages }}" 24 | -------------------------------------------------------------------------------- /roles/developer-common/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: Setup hg VCS 2 | template: src=templates/hg/hgrc dest=~/.hgrc 3 | 4 | - name: Copy global gitconfig 5 | template: src=templates/git/gitconfig dest=~/.gitconfig 6 | 7 | - name: Copy global gitignore 8 | template: src=templates/git/gitignore dest=~/.gitignore 9 | 10 | - name: Ensure .zsh directory 11 | file: path=~/.zsh/ state=directory 12 | 13 | - name: Ensure .zsh aliases directory 14 | file: path=~/.zsh/aliases/ state=directory 15 | 16 | - name: Copy git aliases 17 | template: src=templates/aliases/git.sh dest=~/.zsh/aliases/git.sh 18 | -------------------------------------------------------------------------------- /roles/developer-common/templates/aliases/git.sh: -------------------------------------------------------------------------------- 1 | # Git 2 | alias gs="git status --short" 3 | alias gss="git status" 4 | alias gl='git log --graph --pretty=format:"%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)" --abbrev-commit --date=relative' 5 | alias gls='git log --pretty=format:"%h - %an, %ar : %s" -n 20' 6 | alias gc='git checkout' 7 | alias gcb='git checkout -b' 8 | alias gb='git branch -a' 9 | alias git.amend='git commit --amend -m' 10 | alias git.upmod='git commit -m "Update submodule"' 11 | alias git.diff='git difftool' 12 | alias git.all='git add -u .' 13 | alias git.reset='git reset --hard' 14 | alias git.bump="mversion" 15 | alias git.check='alias git branch -r | xargs -t -n 1 git branch -r --contains' 16 | alias git.subpull='git pull && git submodule init && git submodule update && git submodule status' 17 | 18 | # Git flow 19 | alias gf.init="git flow init -d" 20 | alias gf.f="git flow feature start" 21 | alias gf.ff="git flow feature finish" 22 | alias gf.fp="git flow feature publish" 23 | alias gf.h="git flow hotfix start" 24 | alias gf.ff="git flow hotfix finish" 25 | alias gf.r="git flow release start" 26 | alias gf.fr="git flow release finish" 27 | alias gf.s="git flow support start" 28 | -------------------------------------------------------------------------------- /roles/developer-common/templates/git/gitconfig: -------------------------------------------------------------------------------- 1 | [user] 2 | name = {{ user_name }} 3 | email = {{ user_email }} 4 | 5 | [alias] 6 | # View the SHA, description, and history graph of the latest 20 commits 7 | l = log --pretty=oneline -n 20 --graph 8 | # View the current working tree status using the short format 9 | s = status -s 10 | # Show the diff between the latest commit and the current state 11 | d = !"git diff-index --quiet HEAD -- || clear; git diff --patch-with-stat" 12 | # `git di $number` shows the diff between the state `$number` revisions ago and the current state 13 | di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d" 14 | # Pull in remote changes for the current repository and all its submodules 15 | p = !"git pull; git submodule foreach git pull origin master" 16 | # Clone a repository including all submodules 17 | c = clone --recursive 18 | # Commit all changes 19 | ca = !git add -A && git commit -av 20 | # Switch to a branch, creating it if necessary 21 | go = checkout -B 22 | # Show verbose output about tags, branches or remotes 23 | tags = tag -l 24 | branches = branch -a 25 | remotes = remote -v 26 | # Credit an author on the latest commit 27 | credit = "!f() { git commit --amend --author \"$1 <$2>\" -C HEAD; }; f" 28 | # Interactive rebase with the given number of latest commits 29 | reb = "!r() { git rebase -i HEAD~$1; }; r" 30 | # Undo a `git push` 31 | undopush = push -f origin HEAD^:master 32 | 33 | [apply] 34 | # Detect whitespace errors when applying a patch 35 | whitespace = fix 36 | 37 | [core] 38 | editor = "vim" 39 | ignorecase = false 40 | # Use custom `.gitignore` and `.gitattributes` 41 | excludesfile = ~/.gitignore 42 | attributesfile = ~/.gitattributes 43 | # Treat spaces before tabs, lines that are indented with 8 or more spaces, and all kinds of trailing whitespace as an error 44 | whitespace = space-before-tab,indent-with-non-tab,trailing-space 45 | 46 | [color] 47 | # Use colors in Git commands that are capable of colored output when outputting to the terminal 48 | ui = auto 49 | [color "branch"] 50 | current = yellow reverse 51 | local = yellow 52 | remote = green 53 | [color "diff"] 54 | meta = yellow bold 55 | frag = magenta bold 56 | old = red bold 57 | new = green bold 58 | [color "status"] 59 | added = yellow 60 | changed = green 61 | untracked = cyan 62 | [merge] 63 | # Include summaries of merged commits in newly created merge commit messages 64 | log = true 65 | tool = Kaleidoscope 66 | 67 | # Use `origin` as the default remote on the `master` branch in all cases 68 | [branch "master"] 69 | remote = origin 70 | merge = refs/heads/master 71 | 72 | # URL shorthands 73 | [url "git@github.com:"] 74 | insteadOf = "gh:" 75 | pushInsteadOf = "github:" 76 | pushInsteadOf = "git://github.com/" 77 | [url "git://github.com/"] 78 | insteadOf = "github:" 79 | [url "git@gist.github.com:"] 80 | insteadOf = "gst:" 81 | pushInsteadOf = "gist:" 82 | pushInsteadOf = "git://gist.github.com/" 83 | [url "git://gist.github.com/"] 84 | insteadOf = "gist:" 85 | [push] 86 | default = current 87 | [difftool "sourcetree"] 88 | cmd = opendiff \"$LOCAL\" \"$REMOTE\" 89 | path = 90 | [mergetool "sourcetree"] 91 | cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\" 92 | trustExitCode = true 93 | 94 | [difftool "Kaleidoscope"] 95 | cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\" 96 | [mergetool "Kaleidoscope"] 97 | cmd = ksdiff --merge --output \"$MERGED\" --base \"$BASE\" -- \"$LOCAL\" --snapshot \"$REMOTE\" --snapshot 98 | trustExitCode = true 99 | [diff] 100 | tool = Kaleidoscope 101 | [difftool] 102 | prompt = false 103 | [mergetool] 104 | prompt = false 105 | -------------------------------------------------------------------------------- /roles/developer-common/templates/git/gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .AppleDouble 3 | .LSOverride 4 | Icon 5 | 6 | # Thumbnails 7 | ._* 8 | 9 | # Files that might appear on external disk 10 | .Spotlight-V100 11 | .Trashes 12 | 13 | # Compiled Python files 14 | *.pyc 15 | 16 | # Folder view configuration files 17 | .DS_Store 18 | Desktop.ini 19 | 20 | # Thumbnail cache files 21 | ._* 22 | Thumbs.db 23 | .svn 24 | *~ 25 | .*.swp 26 | 27 | # Ides 28 | .idea 29 | .Rhistory 30 | *.xcuserstate 31 | .vscode 32 | TODO 33 | TODOS 34 | 35 | # Tools 36 | .phpcomplete_extended 37 | .capistrano/metrics 38 | -------------------------------------------------------------------------------- /roles/developer-common/templates/hg/hgrc: -------------------------------------------------------------------------------- 1 | # example user config (see "hg help config" for more info) 2 | [ui] 3 | # name and email, e.g. 4 | # username = Jane Doe 5 | username = Luis Hdez 6 | 7 | [extensions] 8 | # uncomment these lines to enable some popular extensions 9 | # (see "hg help extensions" for more info) 10 | # 11 | pager = 12 | progress = 13 | color = 14 | strip = 15 | -------------------------------------------------------------------------------- /roles/developer-datascience/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_taps: 3 | - homebrew/science 4 | default_cask_packages: 5 | - xquartz 6 | - rstudio 7 | -------------------------------------------------------------------------------- /roles/developer-datascience/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.10 12 | - 10.11 13 | - 10.12 14 | - 10.13 15 | - 10.14 16 | categories: 17 | - developer 18 | - packaging 19 | dependencies: 20 | - role: ansible-macos.packages 21 | brew_taps: "{{ default_brew_taps }}" 22 | cask_packages: "{{ default_cask_packages }}" 23 | -------------------------------------------------------------------------------- /roles/developer-datascience/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # - name: Copy aliases 3 | # template: src=templates/aliases/data.science.sh dest=~/.zsh/aliases/data.science.sh 4 | -------------------------------------------------------------------------------- /roles/developer-datascience/templates/aliases/data.science.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # data.science 3 | -------------------------------------------------------------------------------- /roles/developer-devops/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_npm_packages: 3 | - letsencrypt-cli 4 | default_brew_packages: 5 | - helmfile 6 | - kubernetes-cli 7 | - kubernetes-helm 8 | - python3 9 | - certbot 10 | - dehydrated 11 | - ruby 12 | - s3cmd 13 | - libmaxminddb 14 | - tor 15 | - privoxy 16 | default_gem_packages: [] 17 | # - librarian-chef 18 | # - knife-solo 19 | # - capistrano 20 | default_pip_packages: 21 | - awscli 22 | - docker-compose 23 | default_cask_packages: 24 | - virtualbox 25 | - vagrant 26 | - docker 27 | -------------------------------------------------------------------------------- /roles/developer-devops/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.10 12 | - 10.11 13 | - 10.12 14 | - 10.13 15 | - 10.14 16 | categories: 17 | - developer 18 | - packaging 19 | dependencies: 20 | - role: ansible-macos.packages 21 | brew_packages: "{{ default_brew_packages }}" 22 | cask_packages: "{{ default_cask_packages }}" 23 | pip_packages: "{{ default_pip_packages }}" 24 | gem_packages: "{{ default_gem_packages }}" 25 | -------------------------------------------------------------------------------- /roles/developer-devops/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Copy docker aliases 3 | template: src=templates/aliases/docker.sh dest=~/.zsh/aliases/docker.sh 4 | - name: Copy gitlab aliases 5 | template: src=templates/aliases/gitlab.sh dest=~/.zsh/aliases/gitlab.sh 6 | - name: Copy k8s 7 | template: src=templates/aliases/gitlab.sh dest=~/.zsh/aliases/k8s.sh 8 | 9 | # autoload -U +X compinit && compinit 10 | # autoload -U +X bashcompinit && bashcompinit 11 | 12 | # vagrant plugin install vagrant-hostsupdater 13 | 14 | # Privoxy /usr/local/etc/privoxy/config 15 | # forward-socks5 / 127.0.0.1:9050 . 16 | 17 | # vagrant plugin install vagrant-hostsupdater 18 | # vagrant plugin install vagrant-hostmanager 19 | ## Add to playbook /etc/sudoers 20 | # # Allow passwordless startup of Vagrant with vagrant-hostsupdater. 21 | # Cmnd_Alias VAGRANT_HOSTS_ADD = /bin/sh -c echo "*" >> /etc/hosts 22 | # Cmnd_Alias VAGRANT_HOSTS_REMOVE = /usr/bin/sed -i -e /*/ d /etc/hosts 23 | # %admin ALL=(root) NOPASSWD: VAGRANT_HOSTS_ADD, VAGRANT_HOSTS_REMOVE 24 | -------------------------------------------------------------------------------- /roles/developer-devops/templates/aliases/docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # docker.* 3 | function docker.stop.all { 4 | docker stop `docker ps -a -q` 5 | } 6 | 7 | function docker.rm.all { 8 | docker rm `docker ps -a -q` 9 | } 10 | 11 | function docker.rm.exited { 12 | docker rm `docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs sudo docker rm` 13 | } 14 | 15 | function docker.volume.rm.all { 16 | docker volume rm `docker volume ls -q` 17 | } 18 | 19 | function docker.rmi.all { 20 | docker rmi $(docker images -q) 21 | } 22 | 23 | function docker.rmi.none { 24 | docker rmi $(docker images | grep "^" | awk "{print $3}") 25 | } 26 | 27 | function docker.clear { 28 | docker.stop.all 29 | docker.rm.all 30 | docker.volume.rm.all 31 | } 32 | -------------------------------------------------------------------------------- /roles/developer-devops/templates/aliases/gitlab.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # gl.* 3 | function gitlab.push.new { 4 | if [-z "${1}"]; then 5 | echo 'Usage: gitlab.push.new group/repo-name' 6 | fi 7 | 8 | if [-n "${1}"]; then 9 | git push --set-upstream git@gitlab.com:${1}.git master 10 | fi 11 | } 12 | -------------------------------------------------------------------------------- /roles/developer-devops/templates/aliases/k8s.sh: -------------------------------------------------------------------------------- 1 | alias k="kubectl" 2 | -------------------------------------------------------------------------------- /roles/developer-mobile/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_npm_packages: [] 3 | default_brew_packages: [] 4 | default_gem_packages: [] 5 | default_pip_packages: [] 6 | default_cask_packages: 7 | - fastlane 8 | -------------------------------------------------------------------------------- /roles/developer-mobile/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_packages: "{{ default_brew_packages }}" 21 | cask_packages: "{{ default_cask_packages }}" 22 | pip_packages: "{{ default_pip_packages }}" 23 | gem_packages: "{{ default_gem_packages }}" 24 | -------------------------------------------------------------------------------- /roles/developer-mobile/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | -------------------------------------------------------------------------------- /roles/developer-mobile/templates/aliases/docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | -------------------------------------------------------------------------------- /roles/developer-nginx/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_taps: 3 | - homebrew/nginx 4 | default_brew_packages: 5 | - name: nginx-full 6 | options: with-upload-module,with-upload-progress-module,with-geoip2-module,with-flv,with-http2 7 | -------------------------------------------------------------------------------- /roles/developer-nginx/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_taps: "{{ default_brew_taps }}" 21 | brew_packages: "{{ default_brew_packages }}" 22 | -------------------------------------------------------------------------------- /roles/developer-nginx/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ## Initial config 3 | - file: path=/usr/local/etc/nginx/ssl state=directory 4 | - file: path=/usr/local/etc/nginx/geoip state=directory 5 | - file: path=/usr/local/etc/nginx/sites-available state=directory 6 | - file: path=/usr/local/etc/nginx/sites-enabled state=directory 7 | - file: path=/usr/local/etc/nginx/sites-templates state=directory 8 | - file: path=/usr/local/etc/nginx/conf.d state=directory 9 | - file: path=/usr/local/var/log/nginx state=directory 10 | - file: path=/usr/local/var/nginx/fastcgi state=directory 11 | - file: path=/usr/local/var/nginx/proxy state=directory 12 | - file: path=/usr/local/var/nginx/client_body state=directory 13 | - name: Project sources 14 | file: path={{ project_sources_path }} state=directory group=staff 15 | - name: Copy nginx aliases 16 | template: src=templates/aliases/nginx.sh dest=~/.zsh/aliases/nginx.sh 17 | - name: Copy nginx conf 18 | template: src=templates/conf/nginx.conf dest=/usr/local/etc/nginx/nginx.conf 19 | - name: Copy nginx geoip conf 20 | template: src=templates/conf/http_geoip2.conf dest=/usr/local/etc/nginx/conf.d/http_geoip2.conf 21 | - name: Download GeoLite2-Country 22 | get_url: url=http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz dest=/usr/local/etc/nginx/geoip/ 23 | - name: Unarchive GeoLite2-Country 24 | command: gunzip -f -d GeoLite2-Country.mmdb.gz chdir=/usr/local/etc/nginx/geoip/ 25 | - name: Download GeoLite2-City 26 | get_url: url=http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz dest=/usr/local/etc/nginx/geoip/ 27 | - name: Unarchive GeoLite2-Country 28 | command: gunzip -f -d GeoLite2-City.mmdb.gz chdir=/usr/local/etc/nginx/geoip/ 29 | - name: Copy nginx vhosts templates 30 | copy: src=templates/sites-templates/{{ item }} dest=/usr/local/etc/nginx/sites-templates/ 31 | with_items: 32 | - php.conf 33 | - symfony.conf 34 | - wordpress.conf 35 | - file: path={{ project_sources_path }} state=directory group=staff recurse=no 36 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/aliases/nginx.sh: -------------------------------------------------------------------------------- 1 | alias nginx.start='sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.nginx.plist' 2 | alias nginx.stop='sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.nginx.plist' 3 | alias nginx.restart='nginx.stop && nginx.start' 4 | alias nginx.reload='sudo nginx -s reload' 5 | alias nginx.edit="$VISUAL /usr/local/etc/nginx/" 6 | 7 | function nginx.log { 8 | tail -250f "/usr/local/var/log/nginx/${1}/${2}.${3}.log" 9 | } 10 | 11 | function nginx.ssl { 12 | mkdir -p /usr/local/etc/nginx/ssl/${1}/${2} 13 | openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=State/L=Town/O=Office/CN=${1}" -keyout /usr/local/etc/nginx/ssl/${1}/${2}.key -out /usr/local/etc/nginx/ssl/${1}/${2}.crt 14 | } 15 | 16 | function nginx.create { 17 | mkdir -p /usr/local/etc/nginx/sites-available/${1}/ 18 | mkdir -p /usr/local/var/log/nginx/${1}/ 19 | 20 | nginx.ssl ${1} ${2} 21 | # @todo Add a task to create confs from templates 22 | } 23 | 24 | function nginx.enable { 25 | mkdir -p /usr/local/etc/nginx/sites-enabled/${1}/ 26 | ln -sfv /usr/local/etc/nginx/sites-available/${1}/${2}.conf /usr/local/etc/nginx/sites-enabled/${1}/${2}.conf 27 | } 28 | 29 | function nginx.disable { 30 | rm -f /usr/local/etc/nginx/sites-enabled/${1}/${2}.conf 31 | } 32 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/conf/http_geoip2.conf: -------------------------------------------------------------------------------- 1 | 2 | geoip2 /usr/local/etc/nginx/geoip/GeoLite2-Country.mmdb { 3 | $geoip2_data_country_code default=ES country iso_code; 4 | $geoip2_data_country_name country names en; 5 | } 6 | 7 | geoip2 /usr/local/etc/nginx/geoip/GeoLite2-City.mmdb { 8 | $geoip2_data_city_name default=Madrid city names en; 9 | } 10 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/conf/nginx.conf: -------------------------------------------------------------------------------- 1 | worker_processes 1; 2 | 3 | error_log /usr/local/var/log/nginx/error.log debug; 4 | 5 | events { 6 | worker_connections 1024; 7 | } 8 | 9 | http { 10 | include mime.types; 11 | default_type application/octet-stream; 12 | 13 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 14 | '$status $body_bytes_sent "$http_referer" ' 15 | '"$http_user_agent" "$http_x_forwarded_for"'; 16 | 17 | access_log /usr/local/var/log/nginx/access.log main; 18 | 19 | sendfile on; 20 | keepalive_timeout 65; 21 | index index.html index.php; 22 | 23 | client_body_buffer_size 10K; 24 | client_header_buffer_size 1k; 25 | large_client_header_buffers 2 1k; 26 | client_max_body_size 8m; 27 | 28 | include /usr/local/etc/nginx/conf.d/*.conf; 29 | include /usr/local/etc/nginx/sites-enabled/*/*.conf; 30 | include /usr/local/etc/nginx/sites-enabled/*.conf; 31 | } 32 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/directives/extra-security.conf: -------------------------------------------------------------------------------- 1 | # The X-Frame-Options header indicates whether a browser should be allowed 2 | # to render a page within a frame or iframe. 3 | add_header X-Frame-Options SAMEORIGIN; 4 | 5 | # MIME type sniffing security protection 6 | # There are very few edge cases where you wouldn't want this enabled. 7 | add_header X-Content-Type-Options nosniff; 8 | 9 | # The X-XSS-Protection header is used by Internet Explorer version 8+ 10 | # The header instructs IE to enable its inbuilt anti-cross-site scripting filter. 11 | add_header X-XSS-Protection "1; mode=block"; 12 | 13 | # with Content Security Policy (CSP) enabled (and a browser that supports it (http://caniuse.com/#feat=contentsecuritypolicy), 14 | # you can tell the browser that it can only download content from the domains you explicitly allow 15 | # CSP can be quite difficult to configure, and cause real issues if you get it wrong 16 | # There is website that helps you generate a policy here http://cspisawesome.com/ 17 | # add_header Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' https://www.google-analytics.com;"; 18 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/directives/spdy.conf: -------------------------------------------------------------------------------- 1 | # Nginx's spdy module is compiled by default from 1.6 2 | # SPDY only works on HTTPS connections 3 | 4 | # Inform browser of SPDY availability 5 | add_header Alternate-Protocol 443:npn-spdy/3; 6 | 7 | # Adjust connection keepalive for SPDY clients: 8 | spdy_keepalive_timeout 300; # up from 180 secs default 9 | 10 | # enable SPDY header compression 11 | spdy_headers_comp 6; 12 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/directives/ssl-stampling.conf: -------------------------------------------------------------------------------- 1 | # OCSP stapling... 2 | ssl_stapling on; 3 | ssl_stapling_verify on; 4 | 5 | #trusted cert must be made up of your intermediate certificate followed by root certificate 6 | #ssl_trusted_certificate /path/to/ca.crt; 7 | 8 | resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s; 9 | resolver_timeout 2s; 10 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/directives/ssl.conf: -------------------------------------------------------------------------------- 1 | ssl on; 2 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 3 | ssl_session_timeout 24h; 4 | ssl_session_cache shared:SSL:10m; 5 | ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;" 6 | ssl_prefer_server_ciphers on; 7 | keepalive_timeout 300; 8 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/sites-templates/php.conf: -------------------------------------------------------------------------------- 1 | 2 | server { 3 | server_name localhost; 4 | listen 80; 5 | return 301 https://$host$request_uri; 6 | } 7 | 8 | server { 9 | listen 443; 10 | server_name localhost; 11 | root {{ project_sources_path }}; 12 | 13 | access_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.access.log main; 14 | error_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.error.log; 15 | 16 | ssl on; 17 | ssl_certificate /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.crt; 18 | ssl_certificate_key /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.key; 19 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 20 | ssl_session_timeout 24h; 21 | ssl_session_cache shared:SSL:50m; 22 | ssl_session_tickets on; 23 | ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; 24 | ssl_prefer_server_ciphers on; 25 | 26 | rewrite ^/app\.php/?(.*)$ /$1 permanent; 27 | 28 | location / { 29 | index app.php; 30 | try_files $uri @rewriteapp; 31 | } 32 | 33 | location @rewriteapp { 34 | rewrite ^(.*)$ /app.php/$1 last; 35 | } 36 | 37 | location ~ ^/(app|app_dev)\.php(/|$) { 38 | fastcgi_pass 127.0.0.1:9000; 39 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 40 | 41 | include fastcgi_params; 42 | fastcgi_param GEOIP_ADDR $remote_addr; 43 | fastcgi_param GEOIP_COUNTRY_CODE $geoip2_data_country_code; 44 | fastcgi_param GEOIP_COUNTRY_NAME $geoip2_data_country_name; 45 | fastcgi_param GEOIP_REGION $geoip2_data_region; 46 | fastcgi_param GEOIP_REGION_NAME $geoip2_data_region_name; 47 | fastcgi_param GEOIP_CITY $geoip2_data_city; 48 | fastcgi_param GEOIP_AREA_CODE $geoip2_data_area_code; 49 | fastcgi_param GEOIP_LATITUDE $geoip2_data_latitude; 50 | fastcgi_param GEOIP_LONGITUDE $geoip2_data_longitude; 51 | fastcgi_param GEOIP_POSTAL_CODE $geoip2_data_postal_code; 52 | 53 | fastcgi_param APP_ENV dev; 54 | fastcgi_param PATH_INFO $fastcgi_path_info; 55 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 56 | fastcgi_param HTTPS on; 57 | fastcgi_buffers 8 16k; 58 | fastcgi_buffer_size 32k; 59 | fastcgi_read_timeout 2000; 60 | fastcgi_ignore_client_abort on; 61 | fastcgi_temp_path /usr/local/var/nginx/fastcgi 1 2; 62 | proxy_temp_path /usr/local/var/nginx/tmp/proxy 1 2; 63 | client_body_temp_path /usr/local/var/nginx/tmp/client_body 1 2; 64 | } 65 | 66 | location ~ /\.ht { 67 | deny all; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/sites-templates/symfony.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 443; 3 | server_name localhost; 4 | root {{ project_sources_path }}/{{ server_name }}; 5 | 6 | access_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.access.log main; 7 | error_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.error.log; 8 | 9 | ssl on; 10 | ssl_certificate /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.crt; 11 | ssl_certificate_key /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.key; 12 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 13 | ssl_session_timeout 24h; 14 | ssl_session_cache shared:SSL:50m; 15 | ssl_session_tickets on; 16 | ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; 17 | ssl_prefer_server_ciphers on; 18 | 19 | location ~ ^/(app|app_dev)\.php(/|$) { 20 | fastcgi_pass 127.0.0.1:9000; 21 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 22 | 23 | include fastcgi_params; 24 | fastcgi_param SYMFONY__ENV dev; 25 | fastcgi_param SYMFONY__APP__ENV dev; 26 | fastcgi_param SYMFONY__DATABASE__USER user; 27 | fastcgi_param SYMFONY__HOST $server_name; 28 | fastcgi_param SYMFONY__HTTP__PORT 8000; 29 | fastcgi_param SYMFONY__BASE__HOST localhost; 30 | fastcgi_param SYMFONY__BASE__URL localhost/app_dev.php; 31 | 32 | fastcgi_param GEOIP_ADDR $remote_addr; 33 | fastcgi_param GEOIP_COUNTRY_CODE $geoip2_data_country_code; 34 | fastcgi_param GEOIP_COUNTRY_NAME $geoip2_data_country_name; 35 | fastcgi_param GEOIP_REGION $geoip2_data_region; 36 | fastcgi_param GEOIP_REGION_NAME $geoip2_data_region_name; 37 | fastcgi_param GEOIP_CITY $geoip2_data_city; 38 | fastcgi_param GEOIP_AREA_CODE $geoip2_data_area_code; 39 | fastcgi_param GEOIP_LATITUDE $geoip2_data_latitude; 40 | fastcgi_param GEOIP_LONGITUDE $geoip2_data_longitude; 41 | fastcgi_param GEOIP_POSTAL_CODE $geoip2_data_postal_code; 42 | 43 | fastcgi_param PHP_VALUE "newrelic.appname=$server_name"; 44 | fastcgi_param PATH_INFO $fastcgi_path_info; 45 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 46 | fastcgi_param HTTPS on; 47 | fastcgi_buffers 8 16k; 48 | fastcgi_buffer_size 32k; 49 | fastcgi_read_timeout 2000; 50 | fastcgi_ignore_client_abort on; 51 | fastcgi_temp_path /usr/local/var/nginx/fastcgi 1 2; 52 | proxy_temp_path /usr/local/var/nginx/tmp/proxy 1 2; 53 | client_body_temp_path /usr/local/var/nginx/tmp/client_body 1 2; 54 | } 55 | 56 | location ~ /\.ht { 57 | deny all; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /roles/developer-nginx/templates/sites-templates/wordpress.conf: -------------------------------------------------------------------------------- 1 | 2 | server { 3 | server_name localhost; 4 | listen 80; 5 | return 301 https://$host$request_uri; 6 | } 7 | 8 | server { 9 | listen 443; 10 | server_name localhost; 11 | root {{ project_sources_path }}; 12 | 13 | access_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.access.log main; 14 | error_log /usr/local/var/log/nginx/{{ project }}/{{ server_name }}.error.log; 15 | 16 | ssl on; 17 | ssl_certificate /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.crt; 18 | ssl_certificate_key /usr/local/etc/nginx/ssl/{{ project }}/{{ server_name }}.key; 19 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 20 | ssl_session_timeout 24h; 21 | ssl_session_cache shared:SSL:50m; 22 | ssl_session_tickets on; 23 | ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; 24 | ssl_prefer_server_ciphers on; 25 | 26 | location / { 27 | index index.php index.html index.htm; 28 | try_files $uri $uri/ /index.php?q=$uri&$args; 29 | } 30 | 31 | location ~ \.php(/|$) { 32 | fastcgi_pass 127.0.0.1:9000; 33 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 34 | include fastcgi_params; 35 | fastcgi_param PATH_INFO $fastcgi_path_info; 36 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 37 | fastcgi_param HTTPS on; 38 | 39 | fastcgi_param GEOIP_ADDR $remote_addr; 40 | fastcgi_param GEOIP_COUNTRY_CODE $geoip2_data_country_code; 41 | fastcgi_param GEOIP_COUNTRY_NAME $geoip2_data_country_name; 42 | fastcgi_param GEOIP_REGION $geoip2_data_region; 43 | fastcgi_param GEOIP_REGION_NAME $geoip2_data_region_name; 44 | fastcgi_param GEOIP_CITY $geoip2_data_city; 45 | fastcgi_param GEOIP_AREA_CODE $geoip2_data_area_code; 46 | fastcgi_param GEOIP_LATITUDE $geoip2_data_latitude; 47 | fastcgi_param GEOIP_LONGITUDE $geoip2_data_longitude; 48 | fastcgi_param GEOIP_POSTAL_CODE $geoip2_data_postal_code; 49 | 50 | fastcgi_buffers 8 16k; 51 | fastcgi_buffer_size 32k; 52 | } 53 | 54 | location ~ /\.ht { 55 | deny all; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /roles/developer-nodejs/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_packages: 3 | - node 4 | default_npm_packages: [] 5 | default_cask_packages: [] -------------------------------------------------------------------------------- /roles/developer-nodejs/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_packages: "{{ default_brew_packages }}" 21 | cask_packages: "{{ default_cask_packages }}" 22 | npm_packages: "{{ default_npm_packages }}" 23 | -------------------------------------------------------------------------------- /roles/developer-nodejs/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | -------------------------------------------------------------------------------- /roles/developer-nvim/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_pip_packages: 3 | - cargo 4 | default_brew_packages: 5 | - neovim/neovim/neovim 6 | - python3 7 | - rust 8 | - homebrew/completions/cargo-completion 9 | -------------------------------------------------------------------------------- /roles/developer-nvim/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_packages: "{{ default_brew_packages }}" 21 | pip_packages: "{{ default_pip_packages }}" 22 | -------------------------------------------------------------------------------- /roles/developer-nvim/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - stat: path=~/.config/nvim 3 | register: nvim_config_dir 4 | - name: Get repo nvim-gecko 5 | git: 6 | repo: https://github.com/luishdez/neovim-gecko.git 7 | dest: ~/.config/nvim 8 | accept_hostkey: true 9 | when: nvim_config_dir.stat.exists 10 | - name: Setup vim-plug 11 | get_url: 12 | url: https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 13 | dest: ~/.config/nvim/autoload/plug.vim 14 | 15 | # @todo chmod 755 to -R with sudo ~/.local/share/nvim 16 | -------------------------------------------------------------------------------- /roles/developer-php/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_taps: 3 | - blackfireio/homebrew-blackfire 4 | default_brew_packages: 5 | - php@7.3 6 | - blackfireio/blackfire/blackfire-php73 7 | - blackfire-agent 8 | - php-code-sniffer 9 | - php-cs-fixer 10 | - phpunit 11 | - composer 12 | default_pear_packages: 13 | - pecl/redis 14 | - pecl/mongodb 15 | - pecl/apcu 16 | - pecl/xdebug 17 | -------------------------------------------------------------------------------- /roles/developer-php/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_taps: "{{ default_brew_taps }}" 21 | brew_packages: "{{ default_brew_packages }}" 22 | pear_packages: "{{ default_pear_packages }}" 23 | -------------------------------------------------------------------------------- /roles/developer-php/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Copy php.ini settings 3 | template: src=templates/php.ini dest=/usr/local/etc/php/7.3/conf.d/php.user.ini 4 | - name: Copy php.ini settings 5 | template: src=templates/ext-xdebug.ini dest=/usr/local/etc/php/7.3/conf.d/ext-xdebug.ini 6 | - name: Set PSR2 as default 7 | command: phpcs --config-set default_standard PSR2 8 | - name: Copy php aliases 9 | template: src=templates/aliases/php.sh dest=~/.zsh/aliases/php.sh 10 | 11 | # @todo blackfire-agent --register 12 | -------------------------------------------------------------------------------- /roles/developer-php/templates/aliases/php.sh: -------------------------------------------------------------------------------- 1 | # phpcs 2 | alias phpcs.symfony2="phpcs --config-set default_standard Symfony2" 3 | alias phpcs.PSR2="phpcs --config-set default_standard PSR2" 4 | alias phpcs.PSR1="phpcs --config-set default_standard PSR1" 5 | 6 | # php 7 | function php.restart { 8 | currentversion="`php -r \"echo str_replace('.', '', substr(phpversion(), 0, 3));\"`" 9 | brew services restart php$currentversion 10 | } 11 | 12 | function php.switch { 13 | if [ $# -ne 1 ]; then 14 | echo "Usage: php.switch [phpversion]" 15 | echo "Eg: php.switch 70" 16 | exit 1 17 | fi 18 | 19 | currentversion="`php -r \"echo str_replace('.', '', substr(phpversion(), 0, 3));\"`" 20 | newversion="$1" 21 | 22 | shortOld="`php -r \"echo substr(phpversion(), 0, 1);\"`" 23 | shortNew="`php -r \"echo substr('$1', 0, 1);\"`" 24 | 25 | brew list php$newversion 2> /dev/null > /dev/null 26 | 27 | if [ $? -eq 0 ]; then 28 | echo "PHP version $newversion found" 29 | 30 | echo "Unlinking old binaries..." 31 | brew unlink php$currentversion 2> /dev/null > /dev/null 32 | 33 | echo "Linking new binaries..." 34 | brew link php$newversion 35 | 36 | brew services stop php$currentversion 2> /dev/null > /dev/null 37 | brew services start php$newversion 38 | 39 | echo "Done." 40 | else 41 | echo "PHP version $newversion was not found." 42 | exit 1 43 | fi 44 | } 45 | -------------------------------------------------------------------------------- /roles/developer-php/templates/ext-xdebug.ini: -------------------------------------------------------------------------------- 1 | [xdebug] 2 | ;zend_extension="/usr/local/Cellar/php73-xdebug/2.5.5/xdebug.so" 3 | 4 | ;xdebug.default_enable = 0 5 | ;xdebug.max_nesting_level = 1000 6 | ;xdebug.remote_enable = 1 7 | ;xdebug.remote_host = localhost 8 | ;xdebug.remote_port = 9000 9 | 10 | xdebug.file_link_format = "vscode://open?url=file:/%f&line=%l" 11 | # atom: xdebug.file_link_format="atm://open?url=file://%f&line=%l" 12 | -------------------------------------------------------------------------------- /roles/developer-php/templates/php.ini: -------------------------------------------------------------------------------- 1 | 2 | memory_limit = {{ php_ini_memory_limit }} 3 | phar.readonly = Off 4 | date.timezone = {{ date_timezone }} 5 | 6 | realpath_cache_size = 4096k 7 | realpath_cache_ttl = 7200 8 | 9 | always_populate_raw_post_data = -1 10 | -------------------------------------------------------------------------------- /roles/developer-php/vars/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | date_timezone: Europe/Madrid 3 | php_ini_memory_limit: 2048M 4 | -------------------------------------------------------------------------------- /roles/developer-terminal/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | default_brew_taps: 3 | - thoughtbot/formulae 4 | default_brew_packages: 5 | - zsh 6 | - the_silver_searcher # Command line searcher 7 | - pick # Fuzzy finder command line tool to select options 8 | - fzf # Fuzzy finder command line tool to select options 9 | - commitizen 10 | - asciinema # Record terminal sessions to asciinema.org 11 | - youtube-dl # media youtube downloader 12 | - ffmpeg # media converter 13 | - libav # media codecs 14 | - lame # media codecs 15 | - flac # media codecs 16 | - yt-dlp # media youtube downloader 17 | - kubectl # kubernetes cli 18 | - kubectx # kubernetes cli context switcher 19 | default_cask_packages: 20 | - warp 21 | - font-inconsolata 22 | - font-source-code-pro 23 | -------------------------------------------------------------------------------- /roles/developer-terminal/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.9 12 | - 10.10 13 | - 10.11 14 | - 10.12 15 | categories: 16 | - developer 17 | - packaging 18 | dependencies: 19 | - role: ansible-macos.packages 20 | brew_taps: "{{ default_brew_taps }}" 21 | brew_packages: "{{ default_brew_packages }}" 22 | cask_packages: "{{ default_cask_packages }}" 23 | -------------------------------------------------------------------------------- /roles/developer-terminal/tasks/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Install zsh from repository 3 | git: repo=https://github.com/robbyrussell/oh-my-zsh.git dest=~/.oh-my-zsh/ 4 | 5 | - file: path=~/.zsh state=directory mode=0755 6 | 7 | - file: path=~/.zsh/aliases state=directory mode=0755 8 | 9 | - name: Copy zshrc 10 | template: src=templates/zsh/zshrc dest=~/.zshrc 11 | 12 | - name: Copy zsh_aliases 13 | template: src=templates/zsh/zsh_aliases dest=~/.zsh/aliases/common 14 | 15 | - name: Copy env_common 16 | template: src=templates/env_common dest=~/.env_common 17 | 18 | - name: Make zsh as default terminal 19 | command: chsh -s /bin/zsh 20 | become: yes 21 | 22 | - file: path=~/Library/LaunchAgents state=directory mode=0755 23 | 24 | - name: Add launthAgent for ssh-add -A on every boot 25 | template: src=templates/ssh.add.a.plist dest=~/Library/LaunchAgents/ssh.add.a.plist 26 | # @todo Setup terminal Theme 27 | # @todo symlink ssh keys from dropbox, S3 or iCloud 28 | # - name: Ensure 600 for ~/.ssh/id_rsa 29 | # command: chmod 600 ~/.ssh/id_rsa 30 | # - name: Ensure 600 for ~/.ssh/id_rsa.pub 31 | # command: chmod 600 ~/.ssh/id_rsa.pub 32 | # - name: Ensure 600 for ~/.ssh/known_hosts 33 | # command: chmod 600 ~/.ssh/known_hosts 34 | # - name: Ensure 755 for ~/.ssh 35 | # command: chmod 755 ~/.ssh 36 | -------------------------------------------------------------------------------- /roles/developer-terminal/templates/env_common: -------------------------------------------------------------------------------- 1 | export LANG={{ cli_lang }} 2 | export HOMEBREW_CASK_OPTS="--appdir=/Applications" 3 | export OPENSSL_ROOT_DIR=/usr/local/opt/openssl/ 4 | export OPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include 5 | export DEP_OPENSSL_INCLUDE=/usr/local/opt/openssl/include 6 | export VISUAL=code 7 | export EDITOR=vim 8 | export SOURCES={{ project_sources_path }} 9 | export DOCKER_ID_USER={{ docker_hub_user }} 10 | -------------------------------------------------------------------------------- /roles/developer-terminal/templates/ssh.add.a.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Label 6 | ssh-add-a 7 | ProgramArguments 8 | 9 | ssh-add 10 | -A 11 | 12 | RunAtLoad 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /roles/developer-terminal/templates/terminal/Base16-ocean.terminal: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ANSIBlackColor 6 | 7 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 8 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw 9 | LjEyNTQ5MDE5NjEgMC4xMzcyNTQ5MDIgMC4xNzY0NzA1ODgyABABgALSEBESE1okY2xh 10 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 11 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA 12 | ABkAAAAAAAAAAAAAAAAAAADY 13 | 14 | ANSIBlueColor 15 | 16 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 17 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 18 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjQxODc5ODY1 19 | NyAwLjQyNTE1Njk4MTIgMC44MTQ2NDQ5NDk4IDFPECcwLjM0MTEzMDQzNTUgMC4zMjY3 20 | NTM0MDc3IDAuODAzMjExMzMxNAAQAYACgAbTFA0VFhcYVU5TSUNDWU5TU3BhY2VJRIAD 21 | gAUQDNIaDRscV05TLmRhdGFPEQIkAAACJGFwcGwEAAAAbW50clJHQiBYWVogB98ACgAO 22 | AA0ACAA5YWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1h 23 | cHBs5bsOmGe9Rs1LvkRuvRt1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK 24 | ZGVzYwAAAPwAAABlY3BydAAAAWQAAAAjd3RwdAAAAYgAAAAUclhZWgAAAZwAAAAUZ1hZ 25 | WgAAAbAAAAAUYlhZWgAAAcQAAAAUclRSQwAAAdgAAAAgY2hhZAAAAfgAAAAsYlRSQwAA 26 | AdgAAAAgZ1RSQwAAAdgAAAAgZGVzYwAAAAAAAAALRGlzcGxheSBQMwAAAAAAAAAAAAAA 27 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 28 | AAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAy 29 | MDE1AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAACD3wAAPb////+7WFlaIAAA 30 | AAAAAEq/AACxNwAACrlYWVogAAAAAAAAKDgAABELAADIuXBhcmEAAAAAAAMAAAACZmYA 31 | APKwAAANUAAAE7YAAAn8c2YzMgAAAAAAAQxCAAAF3v//8yYAAAeTAAD9kP//+6L///2j 32 | AAAD3AAAwG6ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg 33 | IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj 34 | ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa 35 | ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALYA4ADiAOQA5gDtAPMA/QD/AQEBAwEIARAD 36 | OAM6Az8DSgNTA2EDZQNsA3UDegOHA4oDlwOcA6QDpwO5A7wDwQAAAAAAAAIBAAAAAAAA 37 | AC8AAAAAAAAAAAAAAAAAAAPD 38 | 39 | ANSIBrightBlackColor 40 | 41 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 42 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw 43 | LjMwOTgwMzkzMjkgMC4zNTY4NjI3NTM2IDAuNDAwMDAwMDA2ABABgALSEBESE1okY2xh 44 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 45 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA 46 | ABkAAAAAAAAAAAAAAAAAAADY 47 | 48 | ANSIBrightBlueColor 49 | 50 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 51 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 52 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjggMC40NjY2 53 | NjY2NjY3IDAuNDkwMTk2MDc4NCAxTxAnMC43NzY1Nzg5NjI4IDAuNDI2NzMzMzQ0OCAw 54 | LjQ2MDMzNTg1MDcAEAGAAoAG0hQNFRZVTlNJQ0OAA4AF0hgNGRpXTlMuZGF0YU8RAnQA 55 | AAJ0YXBwbAQAAABtbnRyUkdCIFhZWiAH3AALAAwAEgA6ABdhY3NwQVBQTAAAAAAAAAAA 56 | AAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxmSfnZPIV3n7QGSpkeOnQsAAAA 57 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAAGNkc2NtAAABbAAA 58 | ACxjcHJ0AAABmAAAAC13dHB0AAAByAAAABRyWFlaAAAB3AAAABRnWFlaAAAB8AAAABRi 59 | WFlaAAACBAAAABRyVFJDAAACGAAAABBiVFJDAAACKAAAABBnVFJDAAACOAAAABBjaGFk 60 | AAACSAAAACxkZXNjAAAAAAAAAAlIRCA3MDktQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 61 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 62 | AAAAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAQAAAAHABIAEQAIAA3ADAAOQAtAEF0 63 | ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAxMAAAAABYWVog 64 | AAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAABvoQAAOSMAAAOMWFlaIAAAAAAAAGKWAAC3 65 | vAAAGMpYWVogAAAAAAAAJJ4AAA87AAC2znBhcmEAAAAAAAAAAAAB9gRwYXJhAAAAAAAA 66 | AAAAAfYEcGFyYQAAAAAAAAAAAAH2BHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH/ 67 | //ui///9owAAA9wAAMBsgATSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJs 68 | ZURhdGGjHiAhVk5TRGF0YVhOU09iamVjdNIcHSMkXE5TQ29sb3JTcGFjZaIlIVxOU0Nv 69 | bG9yU3BhY2XSHB0nKFdOU0NvbG9yoichXxAPTlNLZXllZEFyY2hpdmVy0SssVHJvb3SA 70 | AQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjACuANgA2gDcAN4A4wDpAOsA7QDy 71 | APoDcgN0A3kDhAONA5sDnwOmA68DtAPBA8QD0QPWA94D4QPzA/YD+wAAAAAAAAIBAAAA 72 | AAAAAC0AAAAAAAAAAAAAAAAAAAP9 73 | 74 | ANSIBrightCyanColor 75 | 76 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 77 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 78 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjI0MzEzNzI1 79 | NDkgMC43NDUwOTgwMzkyIDAuNiAxTxAmMC4yMzc1NzIzNzIgMC43Mzc3ODAyMTM0IDAu 80 | NTcyODEzNzQ5MwAQAYACgAbSFA0VFlVOU0lDQ4ADgAXSGA0ZGldOUy5kYXRhTxECdAAA 81 | AnRhcHBsBAAAAG1udHJSR0IgWFlaIAfcAAsADAASADoAF2Fjc3BBUFBMAAAAAAAAAAAA 82 | AAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbGZJ+dk8hXeftAZKmR46dCwAAAAA 83 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAY2RzY20AAAFsAAAA 84 | LGNwcnQAAAGYAAAALXd0cHQAAAHIAAAAFHJYWVoAAAHcAAAAFGdYWVoAAAHwAAAAFGJY 85 | WVoAAAIEAAAAFHJUUkMAAAIYAAAAEGJUUkMAAAIoAAAAEGdUUkMAAAI4AAAAEGNoYWQA 86 | AAJIAAAALGRlc2MAAAAAAAAACUhEIDcwOS1BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 87 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 88 | AAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABAAAAAcAEgARAAgADcAMAA5AC0AQXRl 89 | eHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDEwAAAAAFhZWiAA 90 | AAAAAADzUgABAAAAARbPWFlaIAAAAAAAAG+hAAA5IwAAA4xYWVogAAAAAAAAYpYAALe8 91 | AAAYylhZWiAAAAAAAAAkngAADzsAALbOcGFyYQAAAAAAAAAAAAH2BHBhcmEAAAAAAAAA 92 | AAAB9gRwYXJhAAAAAAAAAAAAAfYEc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf// 93 | +6L///2jAAAD3AAAwGyABNIcHR4fWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxl 94 | RGF0YaMeICFWTlNEYXRhWE5TT2JqZWN00hwdIyRcTlNDb2xvclNwYWNloiUhXE5TQ29s 95 | b3JTcGFjZdIcHScoV05TQ29sb3KiJyFfEA9OU0tleWVkQXJjaGl2ZXLRKyxUcm9vdIAB 96 | AAgAEQAaACMALQAyADcAPwBFAFAAXQBjAHAAhQCMAK4A1wDZANsA3QDiAOgA6gDsAPEA 97 | +QNxA3MDeAODA4wDmgOeA6UDrgOzA8ADwwPQA9UD3QPgA/ID9QP6AAAAAAAAAgEAAAAA 98 | AAAALQAAAAAAAAAAAAAAAAAAA/w= 99 | 100 | ANSIBrightGreenColor 101 | 102 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 103 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 104 | LjE1Njg2Mjc0NTEgMC4xODAzOTIxNTY5IDAuMjExNzY0NzA1OQAQAYAC0hAREhNaJGNs 105 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 106 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 107 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 108 | 109 | ANSIBrightMagentaColor 110 | 111 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 112 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 113 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjQwMDk4NjA1 114 | MTQgMC4yMzg2MTkzNzM2IDAuNDY5MzUwOTYxNSAxTxAnMC4zNjU4OTMxMjU1IDAuMTkz 115 | OTM0MjYxOCAwLjQzODIzMjU0MTEAEAGAAoAG0hQNFRZVTlNJQ0OAA4AF0hgNGRpXTlMu 116 | ZGF0YU8RAnQAAAJ0YXBwbAQAAABtbnRyUkdCIFhZWiAH3AALAAwAEgA6ABdhY3NwQVBQ 117 | TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxmSfnZPIV3n7QG 118 | SpkeOnQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAAGNk 119 | c2NtAAABbAAAACxjcHJ0AAABmAAAAC13dHB0AAAByAAAABRyWFlaAAAB3AAAABRnWFla 120 | AAAB8AAAABRiWFlaAAACBAAAABRyVFJDAAACGAAAABBiVFJDAAACKAAAABBnVFJDAAAC 121 | OAAAABBjaGFkAAACSAAAACxkZXNjAAAAAAAAAAlIRCA3MDktQQAAAAAAAAAAAAAAAAAA 122 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 123 | AAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAQAAAAHABIAEQAIAA3 124 | ADAAOQAtAEF0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAx 125 | MAAAAABYWVogAAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAABvoQAAOSMAAAOMWFlaIAAA 126 | AAAAAGKWAAC3vAAAGMpYWVogAAAAAAAAJJ4AAA87AAC2znBhcmEAAAAAAAAAAAAB9gRw 127 | YXJhAAAAAAAAAAAAAfYEcGFyYQAAAAAAAAAAAAH2BHNmMzIAAAAAAAEMQgAABd7///Mm 128 | AAAHkgAA/ZH///ui///9owAAA9wAAMBsgATSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2Vz 129 | XU5TTXV0YWJsZURhdGGjHiAhVk5TRGF0YVhOU09iamVjdNIcHSMkXE5TQ29sb3JTcGFj 130 | ZaIlIVxOU0NvbG9yU3BhY2XSHB0nKFdOU0NvbG9yoichXxAPTlNLZXllZEFyY2hpdmVy 131 | 0SssVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOEA4wDlAOcA 132 | 7ADyAPQA9gD7AQMDewN9A4IDjQOWA6QDqAOvA7gDvQPKA80D2gPfA+cD6gP8A/8EBAAA 133 | AAAAAAIBAAAAAAAAAC0AAAAAAAAAAAAAAAAAAAQG 134 | 135 | ANSIBrightRedColor 136 | 137 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 138 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 139 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjgxNTY4NjI3 140 | NDUgMC41Mjk0MTE3NjQ3IDAuNDM5MjE1Njg2MyAxTxAmMC43OTQxNDY0MTg2IDAuNDk2 141 | NjE4NDE5OSAwLjQwODc5ODMzNwAQAYACgAbSFA0VFlVOU0lDQ4ADgAXSGA0ZGldOUy5k 142 | YXRhTxECdAAAAnRhcHBsBAAAAG1udHJSR0IgWFlaIAfcAAsADAASADoAF2Fjc3BBUFBM 143 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbGZJ+dk8hXeftAZK 144 | mR46dCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAY2Rz 145 | Y20AAAFsAAAALGNwcnQAAAGYAAAALXd0cHQAAAHIAAAAFHJYWVoAAAHcAAAAFGdYWVoA 146 | AAHwAAAAFGJYWVoAAAIEAAAAFHJUUkMAAAIYAAAAEGJUUkMAAAIoAAAAEGdUUkMAAAI4 147 | AAAAEGNoYWQAAAJIAAAALGRlc2MAAAAAAAAACUhEIDcwOS1BAAAAAAAAAAAAAAAAAAAA 148 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 149 | AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABAAAAAcAEgARAAgADcA 150 | MAA5AC0AQXRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDEw 151 | AAAAAFhZWiAAAAAAAADzUgABAAAAARbPWFlaIAAAAAAAAG+hAAA5IwAAA4xYWVogAAAA 152 | AAAAYpYAALe8AAAYylhZWiAAAAAAAAAkngAADzsAALbOcGFyYQAAAAAAAAAAAAH2BHBh 153 | cmEAAAAAAAAAAAAB9gRwYXJhAAAAAAAAAAAAAfYEc2YzMgAAAAAAAQxCAAAF3v//8yYA 154 | AAeSAAD9kf//+6L///2jAAAD3AAAwGyABNIcHR4fWiRjbGFzc25hbWVYJGNsYXNzZXNd 155 | TlNNdXRhYmxlRGF0YaMeICFWTlNEYXRhWE5TT2JqZWN00hwdIyRcTlNDb2xvclNwYWNl 156 | oiUhXE5TQ29sb3JTcGFjZdIcHScoV05TQ29sb3KiJyFfEA9OU0tleWVkQXJjaGl2ZXLR 157 | KyxUcm9vdIABAAgAEQAaACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALcA4ADiAOQA5gDr 158 | APEA8wD1APoBAgN6A3wDgQOMA5UDowOnA64DtwO8A8kDzAPZA94D5gPpA/sD/gQDAAAA 159 | AAAAAgEAAAAAAAAALQAAAAAAAAAAAAAAAAAABAU= 160 | 161 | ANSIBrightWhiteColor 162 | 163 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 164 | AAGGoKMHCA9VJG51bGzTCQoLDA0OV05TV2hpdGVcTlNDb2xvclNwYWNlViRjbGFzc0Ix 165 | ABADgALSEBESE1okY2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3Rf 166 | EA9OU0tleWVkQXJjaGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSFBdZGdpa3B7hIyPmKqt 167 | sgAAAAAAAAEBAAAAAAAAABkAAAAAAAAAAAAAAAAAAAC0 168 | 169 | ANSIBrightYellowColor 170 | 171 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 172 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 173 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjMxMzcyNTQ5 174 | MDIgMC4zNTY4NjI3NDUxIDAuNCAxTxAnMC4yODM4MjcwOTYyIDAuMzI0NzA2MjI2NiAw 175 | LjM2ODI1NDkyOTgAEAGAAoAG0hQNFRZVTlNJQ0OAA4AF0hgNGRpXTlMuZGF0YU8RAnQA 176 | AAJ0YXBwbAQAAABtbnRyUkdCIFhZWiAH3AALAAwAEgA6ABdhY3NwQVBQTAAAAAAAAAAA 177 | AAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxmSfnZPIV3n7QGSpkeOnQsAAAA 178 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAAGNkc2NtAAABbAAA 179 | ACxjcHJ0AAABmAAAAC13dHB0AAAByAAAABRyWFlaAAAB3AAAABRnWFlaAAAB8AAAABRi 180 | WFlaAAACBAAAABRyVFJDAAACGAAAABBiVFJDAAACKAAAABBnVFJDAAACOAAAABBjaGFk 181 | AAACSAAAACxkZXNjAAAAAAAAAAlIRCA3MDktQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 182 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 183 | AAAAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAQAAAAHABIAEQAIAA3ADAAOQAtAEF0 184 | ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAxMAAAAABYWVog 185 | AAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAABvoQAAOSMAAAOMWFlaIAAAAAAAAGKWAAC3 186 | vAAAGMpYWVogAAAAAAAAJJ4AAA87AAC2znBhcmEAAAAAAAAAAAAB9gRwYXJhAAAAAAAA 187 | AAAAAfYEcGFyYQAAAAAAAAAAAAH2BHNmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH/ 188 | //ui///9owAAA9wAAMBsgATSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJs 189 | ZURhdGGjHiAhVk5TRGF0YVhOU09iamVjdNIcHSMkXE5TQ29sb3JTcGFjZaIlIVxOU0Nv 190 | bG9yU3BhY2XSHB0nKFdOU0NvbG9yoichXxAPTlNLZXllZEFyY2hpdmVy0SssVHJvb3SA 191 | AQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjACuANgA2gDcAN4A4wDpAOsA7QDy 192 | APoDcgN0A3kDhAONA5sDnwOmA68DtAPBA8QD0QPWA94D4QPzA/YD+wAAAAAAAAIBAAAA 193 | AAAAAC0AAAAAAAAAAAAAAAAAAAP9 194 | 195 | ANSICyanColor 196 | 197 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 198 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 199 | LjIwMzkyMTU4NjMgMC42MzUyOTQxMzk0IDAuNTE3NjQ3MDg3NgAQAoAC0hAREhNaJGNs 200 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 201 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 202 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 203 | 204 | ANSIGreenColor 205 | 206 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 207 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 208 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjE5NTUxODMw 209 | MzkgMC43Nzc1NDQwNzA1IDAuNTMyMzkzNzM0OSAxTxAmMC4yMDA0MTIyMjg3IDAuNzc1 210 | ODk3MDI2MSAwLjUwMzAxNjI5MwAQAYACgAbSFA0VFlVOU0lDQ4ADgAXSGA0ZGldOUy5k 211 | YXRhTxECdAAAAnRhcHBsBAAAAG1udHJSR0IgWFlaIAfcAAsADAASADoAF2Fjc3BBUFBM 212 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbGZJ+dk8hXeftAZK 213 | mR46dCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAY2Rz 214 | Y20AAAFsAAAALGNwcnQAAAGYAAAALXd0cHQAAAHIAAAAFHJYWVoAAAHcAAAAFGdYWVoA 215 | AAHwAAAAFGJYWVoAAAIEAAAAFHJUUkMAAAIYAAAAEGJUUkMAAAIoAAAAEGdUUkMAAAI4 216 | AAAAEGNoYWQAAAJIAAAALGRlc2MAAAAAAAAACUhEIDcwOS1BAAAAAAAAAAAAAAAAAAAA 217 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 218 | AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABAAAAAcAEgARAAgADcA 219 | MAA5AC0AQXRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDEw 220 | AAAAAFhZWiAAAAAAAADzUgABAAAAARbPWFlaIAAAAAAAAG+hAAA5IwAAA4xYWVogAAAA 221 | AAAAYpYAALe8AAAYylhZWiAAAAAAAAAkngAADzsAALbOcGFyYQAAAAAAAAAAAAH2BHBh 222 | cmEAAAAAAAAAAAAB9gRwYXJhAAAAAAAAAAAAAfYEc2YzMgAAAAAAAQxCAAAF3v//8yYA 223 | AAeSAAD9kf//+6L///2jAAAD3AAAwGyABNIcHR4fWiRjbGFzc25hbWVYJGNsYXNzZXNd 224 | TlNNdXRhYmxlRGF0YaMeICFWTlNEYXRhWE5TT2JqZWN00hwdIyRcTlNDb2xvclNwYWNl 225 | oiUhXE5TQ29sb3JTcGFjZdIcHScoV05TQ29sb3KiJyFfEA9OU0tleWVkQXJjaGl2ZXLR 226 | KyxUcm9vdIABAAgAEQAaACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALcA4ADiAOQA5gDr 227 | APEA8wD1APoBAgN6A3wDgQOMA5UDowOnA64DtwO8A8kDzAPZA94D5gPpA/sD/gQDAAAA 228 | AAAAAgEAAAAAAAAALQAAAAAAAAAAAAAAAAAABAU= 229 | 230 | ANSIMagentaColor 231 | 232 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 233 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NGMSAw 234 | IDEAEAGAAtIQERITWiRjbGFzc25hbWVYJGNsYXNzZXNXTlNDb2xvcqISFFhOU09iamVj 235 | dF8QD05TS2V5ZWRBcmNoaXZlctEXGFRyb290gAEIERojLTI3O0FITltiaWttcn2GjpGa 236 | rK+0AAAAAAAAAQEAAAAAAAAAGQAAAAAAAAAAAAAAAAAAALY= 237 | 238 | ANSIRedColor 239 | 240 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 241 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 242 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjgyODM4NjU3 243 | OTIgMC4zMTE5MTk0NjA0IDAuMzIzODM5MzU2NyAxTxAnMC44NjA5MTAyOTY0IDAuMTY3 244 | MDE2MzI3NCAwLjIzODk4NzQzMDkAEAGAAoAG0xQNFRYXGFVOU0lDQ1lOU1NwYWNlSUSA 245 | A4AFEAzSGg0bHFdOUy5kYXRhTxECJAAAAiRhcHBsBAAAAG1udHJSR0IgWFlaIAffAAoA 246 | DgANAAgAOWFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMt 247 | YXBwbOW7DphnvUbNS75Ebr0bdZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 248 | CmRlc2MAAAD8AAAAZWNwcnQAAAFkAAAAI3d0cHQAAAGIAAAAFHJYWVoAAAGcAAAAFGdY 249 | WVoAAAGwAAAAFGJYWVoAAAHEAAAAFHJUUkMAAAHYAAAAIGNoYWQAAAH4AAAALGJUUkMA 250 | AAHYAAAAIGdUUkMAAAHYAAAAIGRlc2MAAAAAAAAAC0Rpc3BsYXkgUDMAAAAAAAAAAAAA 251 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 252 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwg 253 | MjAxNQAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAg98AAD2/////u1hZWiAA 254 | AAAAAABKvwAAsTcAAAq5WFlaIAAAAAAAACg4AAARCwAAyLlwYXJhAAAAAAADAAAAAmZm 255 | AADysAAADVAAABO2AAAJ/HNmMzIAAAAAAAEMQgAABd7///MmAAAHkwAA/ZD///ui///9 256 | owAAA9wAAMBugATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGj 257 | ICIjVk5TRGF0YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3Bh 258 | Y2XSHh8pKldOU0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEA 259 | GgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOEA4wDlAOcA7gD0AP4BAAECAQQBCQER 260 | AzkDOwNAA0sDVANiA2YDbQN2A3sDiAOLA5gDnQOlA6gDugO9A8IAAAAAAAACAQAAAAAA 261 | AAAvAAAAAAAAAAAAAAAAAAADxA== 262 | 263 | ANSIWhiteColor 264 | 265 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 266 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 267 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NHMSAxIDEgMU8QHDAu 268 | OTk5ODg2MDk1NSAxIDAuOTk5ODM5ODQyMwAQAYACgAbTFA0VFhcYVU5TSUNDWU5TU3Bh 269 | Y2VJRIADgAUQDNIaDRscV05TLmRhdGFPEQIkAAACJGFwcGwEAAAAbW50clJHQiBYWVog 270 | B98ACgAOAA0ACAA5YWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEA 271 | AAAA0y1hcHBs5bsOmGe9Rs1LvkRuvRt1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 272 | AAAAAAAKZGVzYwAAAPwAAABlY3BydAAAAWQAAAAjd3RwdAAAAYgAAAAUclhZWgAAAZwA 273 | AAAUZ1hZWgAAAbAAAAAUYlhZWgAAAcQAAAAUclRSQwAAAdgAAAAgY2hhZAAAAfgAAAAs 274 | YlRSQwAAAdgAAAAgZ1RSQwAAAdgAAAAgZGVzYwAAAAAAAAALRGlzcGxheSBQMwAAAAAA 275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 276 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJ 277 | bmMuLCAyMDE1AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAACD3wAAPb////+7 278 | WFlaIAAAAAAAAEq/AACxNwAACrlYWVogAAAAAAAAKDgAABELAADIuXBhcmEAAAAAAAMA 279 | AAACZmYAAPKwAAANUAAAE7YAAAn8c2YzMgAAAAAAAQxCAAAF3v//8yYAAAeTAAD9kP// 280 | +6L///2jAAAD3AAAwG6ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxl 281 | RGF0YaMgIiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29s 282 | b3JTcGFjZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIAB 283 | AAgAEQAaACMALQAyADcAPwBFAFAAXQBjAHAAhQCMAJQAswC1ALcAuQDAAMYA0ADSANQA 284 | 1gDbAOMDCwMNAxIDHQMmAzQDOAM/A0gDTQNaA10DagNvA3cDegOMA48DlAAAAAAAAAIB 285 | AAAAAAAAAC8AAAAAAAAAAAAAAAAAAAOW 286 | 287 | ANSIYellowColor 288 | 289 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 290 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 291 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECYwLjg1MjQxMTU1 292 | MyAwLjg5NTI2MjU4MiAwLjQxMTU3NTIxODMgMU8QJTAuODA4NTAxNDgyIDAuODg4MDcx 293 | MjM5IDAuMjQ5NDQyMDQwOQAQAYACgAbTFA0VFhcYVU5TSUNDWU5TU3BhY2VJRIADgAUQ 294 | DNIaDRscV05TLmRhdGFPEQIkAAACJGFwcGwEAAAAbW50clJHQiBYWVogB98ACgAOAA0A 295 | CAA5YWNzcEFQUEwAAAAAQVBQTAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1hcHBs 296 | 5bsOmGe9Rs1LvkRuvRt1mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZGVz 297 | YwAAAPwAAABlY3BydAAAAWQAAAAjd3RwdAAAAYgAAAAUclhZWgAAAZwAAAAUZ1hZWgAA 298 | AbAAAAAUYlhZWgAAAcQAAAAUclRSQwAAAdgAAAAgY2hhZAAAAfgAAAAsYlRSQwAAAdgA 299 | AAAgZ1RSQwAAAdgAAAAgZGVzYwAAAAAAAAALRGlzcGxheSBQMwAAAAAAAAAAAAAAAAAA 300 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 301 | AAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBJbmMuLCAyMDE1 302 | AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAACD3wAAPb////+7WFlaIAAAAAAA 303 | AEq/AACxNwAACrlYWVogAAAAAAAAKDgAABELAADIuXBhcmEAAAAAAAMAAAACZmYAAPKw 304 | AAANUAAAE7YAAAn8c2YzMgAAAAAAAQxCAAAF3v//8yYAAAeTAAD9kP//+6L///2jAAAD 305 | 3AAAwG6ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNW 306 | TlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIe 307 | HykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMA 308 | LQAyADcAPwBFAFAAXQBjAHAAhQCMALUA3QDfAOEA4wDqAPAA+gD8AP4BAAEFAQ0DNQM3 309 | AzwDRwNQA14DYgNpA3IDdwOEA4cDlAOZA6EDpAO2A7kDvgAAAAAAAAIBAAAAAAAAAC8A 310 | AAAAAAAAAAAAAAAAAAPA 311 | 312 | BackgroundBlur 313 | 1 314 | BackgroundColor 315 | 316 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 317 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 318 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjIwMzkyMTU2 319 | ODYgMC4yMjM1Mjk0MTE4IDAuMjcwNTg4MjM1MyAxTxAnMC4xNTAyNTk2Mjg5IDAuMTY4 320 | NzE2MDI4MyAwLjIxMjA2NTc4NjEAEAGAAoAG0xQNFRYXGFVOU0lDQ1lOU1NwYWNlSUSA 321 | A4AFEAzSGg0bHFdOUy5kYXRhTxECJAAAAiRhcHBsBAAAAG1udHJSR0IgWFlaIAffAAoA 322 | DgANAAgAOWFjc3BBUFBMAAAAAEFQUEwAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMt 323 | YXBwbOW7DphnvUbNS75Ebr0bdZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 324 | CmRlc2MAAAD8AAAAZWNwcnQAAAFkAAAAI3d0cHQAAAGIAAAAFHJYWVoAAAGcAAAAFGdY 325 | WVoAAAGwAAAAFGJYWVoAAAHEAAAAFHJUUkMAAAHYAAAAIGNoYWQAAAH4AAAALGJUUkMA 326 | AAHYAAAAIGdUUkMAAAHYAAAAIGRlc2MAAAAAAAAAC0Rpc3BsYXkgUDMAAAAAAAAAAAAA 327 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 328 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwg 329 | MjAxNQAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAg98AAD2/////u1hZWiAA 330 | AAAAAABKvwAAsTcAAAq5WFlaIAAAAAAAACg4AAARCwAAyLlwYXJhAAAAAAADAAAAAmZm 331 | AADysAAADVAAABO2AAAJ/HNmMzIAAAAAAAEMQgAABd7///MmAAAHkwAA/ZD///ui///9 332 | owAAA9wAAMBugATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGj 333 | ICIjVk5TRGF0YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3Bh 334 | Y2XSHh8pKldOU0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEA 335 | GgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOEA4wDlAOcA7gD0AP4BAAECAQQBCQER 336 | AzkDOwNAA0sDVANiA2YDbQN2A3sDiAOLA5gDnQOlA6gDugO9A8IAAAAAAAACAQAAAAAA 337 | AAAvAAAAAAAAAAAAAAAAAAADxA== 338 | 339 | CursorBlink 340 | 341 | CursorColor 342 | 343 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 344 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 345 | Ljc1Mjk0MTE5MTIgMC43NzI1NDkwMzMyIDAuODA3ODQzMTQ4NwAQAYAC0hAREhNaJGNs 346 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 347 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 348 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 349 | 350 | CursorType 351 | 2 352 | Font 353 | 354 | YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 355 | AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs 356 | YXNzI0AwAAAAAAAAEBCAAoADXlNGTW9uby1SZWd1bGFy0hMUFRZaJGNsYXNzbmFtZVgk 357 | Y2xhc3Nlc1ZOU0ZvbnSiFRdYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2ZXLRGhtUcm9v 358 | dIABCBEaIy0yNzxCS1JbYmlydHZ4h4yXoKeqs8XIzQAAAAAAAAEBAAAAAAAAABwAAAAA 359 | AAAAAAAAAAAAAADP 360 | 361 | FontAntialias 362 | 363 | FontHeightSpacing 364 | 1.05 365 | ProfileCurrentVersion 366 | 2.0499999999999998 367 | SelectionColor 368 | 369 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 370 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 371 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjI0NzA1ODgy 372 | MzUgMC4yODYyNzQ1MDk4IDAuMzI1NDkwMTk2MSAxTxAnMC4yMTg5MzA5Mjk5IDAuMjU1 373 | MjgyNjEwNyAwLjI5NDE3MTM5MjkAEAGAAoAG0hQNFRZVTlNJQ0OAA4AF0hgNGRpXTlMu 374 | ZGF0YU8RAnQAAAJ0YXBwbAQAAABtbnRyUkdCIFhZWiAH3AALAAwAEgA6ABdhY3NwQVBQ 375 | TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxmSfnZPIV3n7QG 376 | SpkeOnQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAAGNk 377 | c2NtAAABbAAAACxjcHJ0AAABmAAAAC13dHB0AAAByAAAABRyWFlaAAAB3AAAABRnWFla 378 | AAAB8AAAABRiWFlaAAACBAAAABRyVFJDAAACGAAAABBiVFJDAAACKAAAABBnVFJDAAAC 379 | OAAAABBjaGFkAAACSAAAACxkZXNjAAAAAAAAAAlIRCA3MDktQQAAAAAAAAAAAAAAAAAA 380 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 381 | AAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAQAAAAHABIAEQAIAA3 382 | ADAAOQAtAEF0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAx 383 | MAAAAABYWVogAAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAABvoQAAOSMAAAOMWFlaIAAA 384 | AAAAAGKWAAC3vAAAGMpYWVogAAAAAAAAJJ4AAA87AAC2znBhcmEAAAAAAAAAAAAB9gRw 385 | YXJhAAAAAAAAAAAAAfYEcGFyYQAAAAAAAAAAAAH2BHNmMzIAAAAAAAEMQgAABd7///Mm 386 | AAAHkgAA/ZH///ui///9owAAA9wAAMBsgATSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2Vz 387 | XU5TTXV0YWJsZURhdGGjHiAhVk5TRGF0YVhOU09iamVjdNIcHSMkXE5TQ29sb3JTcGFj 388 | ZaIlIVxOU0NvbG9yU3BhY2XSHB0nKFdOU0NvbG9yoichXxAPTlNLZXllZEFyY2hpdmVy 389 | 0SssVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOEA4wDlAOcA 390 | 7ADyAPQA9gD7AQMDewN9A4IDjQOWA6QDqAOvA7gDvQPKA80D2gPfA+cD6gP8A/8EBAAA 391 | AAAAAAIBAAAAAAAAAC0AAAAAAAAAAAAAAAAAAAQG 392 | 393 | ShouldLimitScrollback 394 | 1 395 | TextBoldColor 396 | 397 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 398 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 399 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjg1NzMwNTQ2 400 | MzYgMC44NTczMDU0NjM2IDAuODU3MzA1NDYzNiAxTxAnMC44NDUyMjAzMjc0IDAuODQ2 401 | MDE5OTgzMyAwLjg0NTMxMzQyOTgAEAGAAoAG0hQNFRZVTlNJQ0OAA4AF0hgNGRpXTlMu 402 | ZGF0YU8RAnQAAAJ0YXBwbAQAAABtbnRyUkdCIFhZWiAH3AALAAwAEgA6ABdhY3NwQVBQ 403 | TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxmSfnZPIV3n7QG 404 | SpkeOnQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAAGNk 405 | c2NtAAABbAAAACxjcHJ0AAABmAAAAC13dHB0AAAByAAAABRyWFlaAAAB3AAAABRnWFla 406 | AAAB8AAAABRiWFlaAAACBAAAABRyVFJDAAACGAAAABBiVFJDAAACKAAAABBnVFJDAAAC 407 | OAAAABBjaGFkAAACSAAAACxkZXNjAAAAAAAAAAlIRCA3MDktQQAAAAAAAAAAAAAAAAAA 408 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 409 | AAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAQAAAAHABIAEQAIAA3 410 | ADAAOQAtAEF0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAx 411 | MAAAAABYWVogAAAAAAAA81IAAQAAAAEWz1hZWiAAAAAAAABvoQAAOSMAAAOMWFlaIAAA 412 | AAAAAGKWAAC3vAAAGMpYWVogAAAAAAAAJJ4AAA87AAC2znBhcmEAAAAAAAAAAAAB9gRw 413 | YXJhAAAAAAAAAAAAAfYEcGFyYQAAAAAAAAAAAAH2BHNmMzIAAAAAAAEMQgAABd7///Mm 414 | AAAHkgAA/ZH///ui///9owAAA9wAAMBsgATSHB0eH1okY2xhc3NuYW1lWCRjbGFzc2Vz 415 | XU5TTXV0YWJsZURhdGGjHiAhVk5TRGF0YVhOU09iamVjdNIcHSMkXE5TQ29sb3JTcGFj 416 | ZaIlIVxOU0NvbG9yU3BhY2XSHB0nKFdOU0NvbG9yoichXxAPTlNLZXllZEFyY2hpdmVy 417 | 0SssVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBwAIUAjAC3AOEA4wDlAOcA 418 | 7ADyAPQA9gD7AQMDewN9A4IDjQOWA6QDqAOvA7gDvQPKA80D2gPfA+cD6gP8A/8EBAAA 419 | AAAAAAIBAAAAAAAAAC0AAAAAAAAAAAAAAAAAAAQG 420 | 421 | TextColor 422 | 423 | YnBsaXN0MDDUAQIDBAUGKSpYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 424 | AAGGoKcHCBMXGyImVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 425 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjcxMzcyNTQ5 426 | MDIgMC43MzMzMzMzMzMzIDAuNzc2NDcwNTg4MiAxTxAmMC42OTI3MzEwODI0IDAuNzEy 427 | MzA1MDY5IDAuNzU4NzE5Mzg0NwAQAYACgAbSFA0VFlVOU0lDQ4ADgAXSGA0ZGldOUy5k 428 | YXRhTxECdAAAAnRhcHBsBAAAAG1udHJSR0IgWFlaIAfcAAsADAASADoAF2Fjc3BBUFBM 429 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbGZJ+dk8hXeftAZK 430 | mR46dCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2Rlc2MAAAEIAAAAY2Rz 431 | Y20AAAFsAAAALGNwcnQAAAGYAAAALXd0cHQAAAHIAAAAFHJYWVoAAAHcAAAAFGdYWVoA 432 | AAHwAAAAFGJYWVoAAAIEAAAAFHJUUkMAAAIYAAAAEGJUUkMAAAIoAAAAEGdUUkMAAAI4 433 | AAAAEGNoYWQAAAJIAAAALGRlc2MAAAAAAAAACUhEIDcwOS1BAAAAAAAAAAAAAAAAAAAA 434 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 435 | AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABAAAAAcAEgARAAgADcA 436 | MAA5AC0AQXRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIENvbXB1dGVyLCBJbmMuLCAyMDEw 437 | AAAAAFhZWiAAAAAAAADzUgABAAAAARbPWFlaIAAAAAAAAG+hAAA5IwAAA4xYWVogAAAA 438 | AAAAYpYAALe8AAAYylhZWiAAAAAAAAAkngAADzsAALbOcGFyYQAAAAAAAAAAAAH2BHBh 439 | cmEAAAAAAAAAAAAB9gRwYXJhAAAAAAAAAAAAAfYEc2YzMgAAAAAAAQxCAAAF3v//8yYA 440 | AAeSAAD9kf//+6L///2jAAAD3AAAwGyABNIcHR4fWiRjbGFzc25hbWVYJGNsYXNzZXNd 441 | TlNNdXRhYmxlRGF0YaMeICFWTlNEYXRhWE5TT2JqZWN00hwdIyRcTlNDb2xvclNwYWNl 442 | oiUhXE5TQ29sb3JTcGFjZdIcHScoV05TQ29sb3KiJyFfEA9OU0tleWVkQXJjaGl2ZXLR 443 | KyxUcm9vdIABAAgAEQAaACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALcA4ADiAOQA5gDr 444 | APEA8wD1APoBAgN6A3wDgQOMA5UDowOnA64DtwO8A8kDzAPZA94D5gPpA/sD/gQDAAAA 445 | AAAAAgEAAAAAAAAALQAAAAAAAAAAAAAAAAAABAU= 446 | 447 | UseBoldFonts 448 | 449 | UseBrightBold 450 | 451 | columnCount 452 | 130 453 | name 454 | Base16-ocean 455 | type 456 | Window Settings 457 | 458 | 459 | -------------------------------------------------------------------------------- /roles/developer-terminal/templates/zsh/zsh_aliases: -------------------------------------------------------------------------------- 1 | # Paths 2 | alias dt="cd ~/Desktop" 3 | alias dl="cd ~/Downloads" 4 | alias do="cd ~/Documents" 5 | alias db="cd ~/Dropbox" 6 | alias lb="cd ~/Library" 7 | 8 | # Configs 9 | alias e-zsh="code ~/.oh-my-zsh" 10 | alias e-nginx="code /opt/homebrew/etc/nginx/" 11 | alias e-php="code /opt/homebrew/etc/php/" 12 | alias e-mariadb="code /opt/homebrew/etc/mariadb/" 13 | 14 | # Services 15 | alias h="history" 16 | alias j="jobs" 17 | alias v="vim" 18 | alias o="open" 19 | alias oo="open ." 20 | 21 | # Edit common files 22 | alias eh="sudo $VISUAL /etc/hosts" 23 | 24 | # Pick alias 25 | alias ph='$(history | cut -c8- | sort -u | pick)' 26 | alias pcd='cd $(find . -type d | pick)' 27 | alias pgcb='git checkout $(git branch | cut -c 3- | pick)=' 28 | alias pso='cd /Volumes/work-data/sources/$(find /Volumes/work-data/sources -type d -maxdepth 2 -mindepth 2 | cut -c28- | pick) && clear' 29 | alias psv='cd /Volumes/work-data/sources/$(find /Volumes/work-data/sources -type d -maxdepth 2 -mindepth 2 | cut -c28- | pick) && nvim' 30 | alias psa='cd /Volumes/ 31 | 32 | # Common & Utilities 33 | alias ssh.key="cat ~/.ssh/id_rsa.pub; cat ~/.ssh/id_rsa.pub | pbcopy" 34 | alias rebed="kill -9 `pgrep SoundflowerBed`" 35 | 36 | # IP addresses 37 | alias ip="dig +short myip.opendns.com @resolver1.opendns.com" 38 | alias ips="ifconfig -a | grep -o 'inet6\? \(\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)\|[a-fA-F0-9:]\+\)' | sed -e 's/inet6* //'" 39 | alias torip="vim /Applications/TorBrowser.app/TorBrowser/Data/Tor/torrc" 40 | 41 | # Delete Tools 42 | alias ds_remove="find . -type f -name '*.DS_Store' -ls -delete" 43 | 44 | # Finder tools 45 | alias show="defaults write com.apple.Finder AppleShowAllFiles -bool true && killall Finder" 46 | alias hide="defaults write com.apple.Finder AppleShowAllFiles -bool false && killall Finder" 47 | 48 | # Screenshots 49 | alias disableScreenShadow="defaults write com.apple.screencapture disable-shadow -bool true" 50 | alias enableScreenShadow="defaults write com.apple.screencapture disable-shadow -bool false" 51 | 52 | # Media alias 53 | alias youtube.mp3="youtube-dl -x --audio-format mp3 --audio-quality 0 " 54 | alias youtube.wav="youtube-dl -x --audio-format mp3 --audio-quality 0 " 55 | alias flac2mp3="for f in *.flac; do flac -cd "$f" | lame -b 320 - "${f%.*}.mp3"; done" 56 | alias flac2alac="for f in *.flac; do avconv -i "$f" -c:a alac "${f%.flac}.m4a"; done" 57 | -------------------------------------------------------------------------------- /roles/developer-terminal/templates/zsh/zshrc: -------------------------------------------------------------------------------- 1 | 2 | # Path to your oh-my-zsh installation. 3 | export ZSH=$HOME/.oh-my-zsh 4 | ZSH_THEME="robbyrussell" 5 | plugins=(git git-extras docker npm composer kubectl symfony2) 6 | source $ZSH/oh-my-zsh.sh 7 | 8 | # Paths 9 | export PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin" 10 | export PATH="$PATH:/usr/local/share/npm/bin" 11 | export PATH="$PATH:/usr/local/opt/ruby/bin" 12 | 13 | ## Source all environment files 14 | for f in ~/.env_*; do 15 | . $f 16 | done 17 | 18 | ## Source all aliases 19 | for f in ~/.oh-my-zsh/aliases/*; do 20 | . $f 21 | done 22 | -------------------------------------------------------------------------------- /roles/developer-vscode/defaults/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | vscode_setup_sf_font: true 3 | default_npm_packages: [] 4 | default_brew_packages: [] 5 | default_cask_packages: 6 | - visual-studio-code 7 | default_vscode_packages: 8 | 9 | # vscode 10 | - smlombardi.mariana 11 | - laurenttreguier.vscode-simple-icons 12 | - chrislajoie.vscode-modelines 13 | - eamodio.gitlens 14 | - wengerk.highlight-bad-chars 15 | - stkb.rewrap 16 | 17 | # yaml 18 | - redhat.vscode-yaml 19 | 20 | # js 21 | - dbaeumer.vscode-eslint 22 | 23 | # php 24 | - bmewburn.vscode-intelephense-client 25 | - ikappas.phpcs 26 | - junstyle.php-cs-fixer 27 | - neilbrayfield.php-docblocker 28 | 29 | # docker 30 | - peterjausovec.vscode-docker 31 | 32 | # mongo 33 | - ms-azuretools.vscode-cosmosdb 34 | -------------------------------------------------------------------------------- /roles/developer-vscode/meta/main.yml: -------------------------------------------------------------------------------- 1 | --- 2 | galaxy_info: 3 | author: Luis Hdez 4 | description: ~ 5 | company: wobblecode 6 | license: MIT 7 | min_ansible_version: 2.1 8 | platforms: 9 | - name: MacOSX 10 | versions: 11 | - 10.11 12 | - 10.12 13 | - 10.13 14 | - 10.14 15 | categories: 16 | - developer 17 | - packaging 18 | - vscode 19 | dependencies: 20 | - role: ansible-macos.packages 21 | npm_packages: "{{ default_npm_packages }}" 22 | brew_packages: "{{ default_brew_packages }}" 23 | cask_packages: "{{ default_cask_packages }}" 24 | -------------------------------------------------------------------------------- /roles/developer-vscode/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: extensions for vscode 2 | shell: code --install-extension {{ item }} 3 | register: vscode_result 4 | changed_when: "'was successfully installed' in vscode_result.stdout" 5 | with_items: 6 | - "{{ default_vscode_packages }}" 7 | 8 | - name: Setup SF Fonts for mac 9 | copy: 10 | src: "{{ item }}" 11 | dest: ~/Library/Fonts/ 12 | with_fileglob: 13 | - /Applications/Utilities/Terminal.app/Contents/Resources/Fonts/SFMono-*.otf 14 | when: 15 | - vscode_setup_sf_font 16 | - ansible_facts['os_family'] == "Darwin" 17 | --------------------------------------------------------------------------------