From f552ec520977fc747ac98bf6b7e2b38dfb7c9617 Mon Sep 17 00:00:00 2001 From: Cyrille Nofficial Date: Fri, 7 Feb 2020 13:38:30 +0100 Subject: [PATCH] First implementation --- .gitignore | 151 ++++++ LICENSE | 201 ++++++++ README.md | 25 + .../group_vars/all/rabbitmq_credentials.yaml | 8 + ansible/hosts | 9 + .../base/files/10-vchiq-permissions.rules | 1 + ansible/roles/base/files/authorized_keys | 2 + ansible/roles/base/handlers/main.yml | 9 + ansible/roles/base/tasks/hardware.yml | 42 ++ ansible/roles/base/tasks/main.yml | 67 +++ ansible/roles/base/templates/alias | 53 ++ ansible/roles/base/templates/bashrc | 128 +++++ ansible/roles/base/templates/config.txt | 76 +++ ansible/roles/base/templates/gitconfig | 27 + ansible/roles/base/templates/locale | 2 + ansible/roles/base/templates/locale.gen | 483 ++++++++++++++++++ ansible/roles/base/templates/vimrc | 31 ++ ansible/roles/docker/tasks/docker.yml | 35 ++ ansible/roles/docker/tasks/main.yml | 4 + ansible/roles/donkey/defaults/main.yml | 13 + ansible/roles/donkey/tasks/data.yml | 16 + ansible/roles/donkey/tasks/main.yml | 62 +++ ansible/roles/donkey/templates/bash_custom | 2 + ansible/roles/python/defaults/main.yml | 4 + ansible/roles/python/tasks/main.yml | 52 ++ ansible/roles/rabbitmq/handlers/main.yml | 11 + ansible/roles/rabbitmq/tasks/main.yml | 32 ++ ansible/site.yml | 18 + bootstrap/build_sdcard.sh | 83 +++ bootstrap/wpa_supplicant.conf | 9 + 30 files changed, 1656 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ansible/group_vars/all/rabbitmq_credentials.yaml create mode 100644 ansible/hosts create mode 100644 ansible/roles/base/files/10-vchiq-permissions.rules create mode 100644 ansible/roles/base/files/authorized_keys create mode 100644 ansible/roles/base/handlers/main.yml create mode 100644 ansible/roles/base/tasks/hardware.yml create mode 100644 ansible/roles/base/tasks/main.yml create mode 100644 ansible/roles/base/templates/alias create mode 100644 ansible/roles/base/templates/bashrc create mode 100755 ansible/roles/base/templates/config.txt create mode 100644 ansible/roles/base/templates/gitconfig create mode 100644 ansible/roles/base/templates/locale create mode 100644 ansible/roles/base/templates/locale.gen create mode 100644 ansible/roles/base/templates/vimrc create mode 100644 ansible/roles/docker/tasks/docker.yml create mode 100644 ansible/roles/docker/tasks/main.yml create mode 100644 ansible/roles/donkey/defaults/main.yml create mode 100644 ansible/roles/donkey/tasks/data.yml create mode 100644 ansible/roles/donkey/tasks/main.yml create mode 100644 ansible/roles/donkey/templates/bash_custom create mode 100644 ansible/roles/python/defaults/main.yml create mode 100644 ansible/roles/python/tasks/main.yml create mode 100644 ansible/roles/rabbitmq/handlers/main.yml create mode 100644 ansible/roles/rabbitmq/tasks/main.yml create mode 100644 ansible/site.yml create mode 100755 bootstrap/build_sdcard.sh create mode 100644 bootstrap/wpa_supplicant.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6515a7f --- /dev/null +++ b/.gitignore @@ -0,0 +1,151 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Vim template +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +### Windows template +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +!/bootstrap/.secret +Supprimerait ansible/roles/docker/templates/ +Supprimerait bootstrap/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..aa0379a --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# robocar-setup + +Tools to init and boot robocar stack on raspberrypi boards. + + + +## Bootstrap sdcard + + * add your ssh public key in `authorized_keys` file + * to configure wifi, add `.secret` file with content: +```bash +WIFI_SSID="ssid" +WIFI_PASSWORD="password" +``` + * uncomment and fix `SD_CARD_*` variables in `build_sdcard.sh` + * insert sdcard and run `build_sdcard.sh` + + +## Configure raspberry and install stack + +Install ansible on local host and run: +```bash +cd ansible +ansible-playbook -i hosts site.yml +``` diff --git a/ansible/group_vars/all/rabbitmq_credentials.yaml b/ansible/group_vars/all/rabbitmq_credentials.yaml new file mode 100644 index 0000000..049f621 --- /dev/null +++ b/ansible/group_vars/all/rabbitmq_credentials.yaml @@ -0,0 +1,8 @@ +$ANSIBLE_VAULT;1.1;AES256 +62663835343566613663623336313161646363633064623663303132373038633038356138636139 +6636616636653236633030383635373037373630653664350a353134356661613137336633336630 +66393130656530333335616465346437363835313036653166326635333234356438633733313738 +3536633935663730360a656133663436376239646631346466393037613432343339373836373263 +30333861653837643663333234366561313062326437326366633733626230396634663738633034 +32666533666234663639383733393466636164393531663534343963663863343237303931666466 +333639333234373231613130346562326665 diff --git a/ansible/hosts b/ansible/hosts new file mode 100644 index 0000000..0112a4e --- /dev/null +++ b/ansible/hosts @@ -0,0 +1,9 @@ +[car] +satanas.local ansible_user=pi become=yes become_user=root +diabolo.local ansible_user=pi become=yes become_user=root + +[microservice] +diabolo.local + +[donkey] +satanas.local diff --git a/ansible/roles/base/files/10-vchiq-permissions.rules b/ansible/roles/base/files/10-vchiq-permissions.rules new file mode 100644 index 0000000..1237f5f --- /dev/null +++ b/ansible/roles/base/files/10-vchiq-permissions.rules @@ -0,0 +1 @@ +SUBSYSTEM=="vchiq", GROUP="video", MODE="0660" diff --git a/ansible/roles/base/files/authorized_keys b/ansible/roles/base/files/authorized_keys new file mode 100644 index 0000000..444a614 --- /dev/null +++ b/ansible/roles/base/files/authorized_keys @@ -0,0 +1,2 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzGhjQj0Ods7dlErUOQuF1x3ODZpIrHxWdpay7jaV4Crr5jcr2xayyjRpjlBNrkGCWuTm0Wmjiqnl6VAvJqzHEsXTRcB0fhbS6qX7aC+uzzEbZNZNSVl2WrFpeAx7qREcEPy+rhW4ijdixMN85uv8hJo17/AcMbH3OtnMPvVQ+DvjE1v5GawwlEk45eqhnhOJKoieiPgyTFol5KKYX56KMC8BvvKW6KcYHON+66Pe4rS5JE3qAQytEhM51S2iycfjvWGuXoz9RJfo/qNYIoMaCcEVWXNBQmY0D02q4W8Wfl3LZJWE1/X26xf0NGGQk1ofReM3Ktb68HTHXjpOyr6wLQ== cynoffic@cyrilix.fr +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCctxtMaU+L9g/goud+2kNUVfvW0RIHFmgKyFqdjixqsdo8haglLjKqFLEeX0h7O95sreKOzrys+8GIsDT0mZbUWmaazrFoX1iaqO9SiaykQyZI2tFZVm2N/SXok6JoxJYt5IovyIxeeJchhCIjc+rKUwwYqPuDKdNMMHSX6jZC3AGvmVzu5xpMx5tD50pNnnUhLQAg+OBaflInpWwDwNSvFFa12JP12/qDLVXkM4fP8Ky9xgywlhqYTb3cfVDwigU41yDD9Kgp0+V73AqJkdrFvscP+lMY0WFyPlARRnCoc9QAITr++GKNkWc4gQGa4KC9x7gLCalDaSpiYyJadd1P cyrille.nofficial@renault-digital.com diff --git a/ansible/roles/base/handlers/main.yml b/ansible/roles/base/handlers/main.yml new file mode 100644 index 0000000..5550ecb --- /dev/null +++ b/ansible/roles/base/handlers/main.yml @@ -0,0 +1,9 @@ +--- +- name: expand filesystem + shell: resize2fs /dev/mmcblk0p2 + notify: + - reboot + +- name: reboot + reboot: + diff --git a/ansible/roles/base/tasks/hardware.yml b/ansible/roles/base/tasks/hardware.yml new file mode 100644 index 0000000..c8299bb --- /dev/null +++ b/ansible/roles/base/tasks/hardware.yml @@ -0,0 +1,42 @@ +--- + +- name: Deploy raspberry config + template: + src: config.txt + dest: /boot/config.txt + notify: reboot + +- name: Set pi user in groups + user: + name: pi + groups: tty,dialout + +#- name: Disable console +# replace: +# path: /boot/cmdline.txt +# regexp: '(.*) console=[^ ]+(\s+.*)?$' +# replace: '\1\2' +# notify: reboot + +#- name: Disable tty use +# systemd: +# name: getty@tty1.service +# masked: yes +# enabled: no +# daemon_reload: yes +# notify: reboot + + +- name: Set group on camera device + copy: + src: 10-vchiq-permissions.rules + dest: /etc/udev/rules.d/10-vchiq-permissions.rules + notify: reboot + + +- name: Set groups to pi user + user: + name: pi + groups: tty,video + +- meta: flush_handlers diff --git a/ansible/roles/base/tasks/main.yml b/ansible/roles/base/tasks/main.yml new file mode 100644 index 0000000..7331321 --- /dev/null +++ b/ansible/roles/base/tasks/main.yml @@ -0,0 +1,67 @@ +--- +- name: Set default language to FR + template: + src: locale + dest: /etc/default/locale + +- name: Set locales + template: + src: locale.gen + dest: /etc/locale.gen + register: locale + +- name: Generate locales + shell: dpkg-reconfigure -f noninteractive locales + when: locale.changed + +- name: Set timezone + timezone: + name: Europe/Paris + + +- name: Set hostname resolution + replace: + path: /etc/hosts + regexp: '(\s+)raspberrypi(\s+.*)?$' + replace: '\1{{ ansible_hostname }}\2' + +- name: Install basic tools + apt: + name: + - cpufrequtils + - vim + - git + - python3 + - python3-pip + - python-apt + state: present + update_cache: yes + +- name: Copy ssh authorized keys file + copy: + src: authorized_keys + dest: /home/pi/.ssh/authorized_keys + owner: pi + group: pi + mode: 0600 + +- name: Files configuration + template: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + owner: pi + group: pi + with_items: + - src: vimrc + dest: /home/pi/.vimrc + - src: alias + dest: /home/pi/.alias + - src: bashrc + dest: /home/pi/.bashrc + - src: gitconfig + dest: /home/pi/.gitconfig + + +- include_tasks: hardware.yml + + diff --git a/ansible/roles/base/templates/alias b/ansible/roles/base/templates/alias new file mode 100644 index 0000000..cf21f7f --- /dev/null +++ b/ansible/roles/base/templates/alias @@ -0,0 +1,53 @@ + +# Gestion du ls : couleur + touche pas aux accents +alias ls='ls --classify --tabsize=0 --literal --color=auto --show-control-chars --human-readable' +alias lc='ls --classify --tabsize=0 --literal --color=always --show-control-chars --human-readable' + +# Demande confirmation avant d'écraser un fichier +alias cp='cp --interactive' +alias mv='mv --interactive' +#alias rm='rm --interactive' + +# Raccourcis pour 'ls' +alias ll='ls -lh' +alias llc='ls -lh --color=always' +alias la='ls -a' +alias lac='ls -a --color=always' +alias lla='ls -lha' +alias llac='ls -lha --color=always' + +# Quelques alias pratiques +alias c='clear' +alias s='cd ..' +alias df='df --human-readable' +alias du='du --human-readable' +alias grec='egrep --color=always' + +#APT +alias apts='aptitude search' +alias aptn='aptitude search \~N' +alias aptsh='apt show' +alias apti='apt install' +alias aptp='apt purge' +alias aptr='apt remove' +alias aptfug='apt full-upgrade' +alias aptug='apt upgrade' +alias aptu='apt update' +alias aptlu='apt list --upgradable' +alias aptf='aptitude forget-new' + +alias sshr="ssh -X root@`hostname --short`.local" + +alias free='free -h' + +alias diff=colordiff +alias gh="git history" + +alias v=view + +if [ -f ~/.alias_custom ] +then + source ~/.alias_custom +fi + + diff --git a/ansible/roles/base/templates/bashrc b/ansible/roles/base/templates/bashrc new file mode 100644 index 0000000..93a1deb --- /dev/null +++ b/ansible/roles/base/templates/bashrc @@ -0,0 +1,128 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +parse_git_branch() { + git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' +} +export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\] $ " +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w $(parse_git_branch) \$\[\033[00m\] ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$(parse_git_branch)\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + + +if [[ -f ~/.alias ]] +then + source ~/.alias +fi + +if [[ -f ~/.bash_custom ]] +then + source ~/.bash_custom +fi diff --git a/ansible/roles/base/templates/config.txt b/ansible/roles/base/templates/config.txt new file mode 100755 index 0000000..31b1dd4 --- /dev/null +++ b/ansible/roles/base/templates/config.txt @@ -0,0 +1,76 @@ +# For more options and information see +# http://rpf.io/configtxt +# Some settings may impact device functionality. See link above for details + +# uncomment if you get no picture on HDMI for a default "safe" mode +#hdmi_safe=1 + +# uncomment this if your display has a black border of unused pixels visible +# and your display can output without overscan +#disable_overscan=1 + +# uncomment the following to adjust overscan. Use positive numbers if console +# goes off screen, and negative if there is too much border +#overscan_left=16 +#overscan_right=16 +#overscan_top=16 +#overscan_bottom=16 + +# uncomment to force a console size. By default it will be display's size minus +# overscan. +#framebuffer_width=1280 +#framebuffer_height=720 + +# uncomment if hdmi display is not detected and composite is being output +#hdmi_force_hotplug=1 + +# uncomment to force a specific HDMI mode (this will force VGA) +#hdmi_group=1 +#hdmi_mode=1 + +# uncomment to force a HDMI mode rather than DVI. This can make audio work in +# DMT (computer monitor) modes +#hdmi_drive=2 + +# uncomment to increase signal to HDMI, if you have interference, blanking, or +# no display +#config_hdmi_boost=4 + +# uncomment for composite PAL +#sdtv_mode=2 + +#uncomment to overclock the arm. 700 MHz is the default. +#arm_freq=800 + +# Uncomment some or all of these to enable the optional hardware interfaces +dtparam=i2c_arm=on +dtparam=i2s=on +dtparam=spi=on + +# Uncomment this to enable infrared communication. +#dtoverlay=gpio-ir,gpio_pin=17 +#dtoverlay=gpio-ir-tx,gpio_pin=18 + +# Uncomment this to enable the lirc-rpi module +#dtoverlay=lirc-rpi + +# Additional overlays and parameters are documented /boot/overlays/README + +# Enable audio (loads snd_bcm2835) +dtparam=audio=on + +[pi4] +# Enable DRM VC4 V3D driver on top of the dispmanx display stack +dtoverlay=vc4-fkms-v3d +max_framebuffers=2 +dtoverlay=uart2 + +[all] +#dtoverlay=vc4-fkms-v3d +# Disable bluetooth in order to enable serial TTL +dtoverlay=pi3-disable-bt + + +# Enable camera +start_x=1 +gpu_mem=256 diff --git a/ansible/roles/base/templates/gitconfig b/ansible/roles/base/templates/gitconfig new file mode 100644 index 0000000..956b47b --- /dev/null +++ b/ansible/roles/base/templates/gitconfig @@ -0,0 +1,27 @@ +[color] + branch = auto + diff = auto + interactive = auto + status = auto + ui = auto + +[i18n] + commitEncoding = UTF-8 + logOutputEncoding = UTF-8 + +[alias] + co = checkout + history = log --all --graph --abbrev-commit --pretty=format:'%C(auto)%h [%ad] %d %s %C(reset) - %aN' --date=short + h = log --all --graph --abbrev-commit --pretty=format:'%C(auto)%h [%ad] %d %s %C(reset) - %aN' --date=short + +[mergetool] + prompt = false + keepBackup = false + keepTemporaries = false + +[pull] + rebase = true + +[push] + default = simple + diff --git a/ansible/roles/base/templates/locale b/ansible/roles/base/templates/locale new file mode 100644 index 0000000..1d11029 --- /dev/null +++ b/ansible/roles/base/templates/locale @@ -0,0 +1,2 @@ +# {{ ansible_managed }} +LANG=fr_FR.UTF-8 diff --git a/ansible/roles/base/templates/locale.gen b/ansible/roles/base/templates/locale.gen new file mode 100644 index 0000000..15f60f4 --- /dev/null +++ b/ansible/roles/base/templates/locale.gen @@ -0,0 +1,483 @@ +# This file lists locales that you wish to have built. You can find a list +# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add +# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change +# this file, you need to rerun locale-gen. +# + +# aa_DJ ISO-8859-1 +# aa_DJ.UTF-8 UTF-8 +# aa_ER UTF-8 +# aa_ER@saaho UTF-8 +# aa_ET UTF-8 +# af_ZA ISO-8859-1 +# af_ZA.UTF-8 UTF-8 +# ak_GH UTF-8 +# am_ET UTF-8 +# an_ES ISO-8859-15 +# an_ES.UTF-8 UTF-8 +# anp_IN UTF-8 +# ar_AE ISO-8859-6 +# ar_AE.UTF-8 UTF-8 +# ar_BH ISO-8859-6 +# ar_BH.UTF-8 UTF-8 +# ar_DZ ISO-8859-6 +# ar_DZ.UTF-8 UTF-8 +# ar_EG ISO-8859-6 +# ar_EG.UTF-8 UTF-8 +# ar_IN UTF-8 +# ar_IQ ISO-8859-6 +# ar_IQ.UTF-8 UTF-8 +# ar_JO ISO-8859-6 +# ar_JO.UTF-8 UTF-8 +# ar_KW ISO-8859-6 +# ar_KW.UTF-8 UTF-8 +# ar_LB ISO-8859-6 +# ar_LB.UTF-8 UTF-8 +# ar_LY ISO-8859-6 +# ar_LY.UTF-8 UTF-8 +# ar_MA ISO-8859-6 +# ar_MA.UTF-8 UTF-8 +# ar_OM ISO-8859-6 +# ar_OM.UTF-8 UTF-8 +# ar_QA ISO-8859-6 +# ar_QA.UTF-8 UTF-8 +# ar_SA ISO-8859-6 +# ar_SA.UTF-8 UTF-8 +# ar_SD ISO-8859-6 +# ar_SD.UTF-8 UTF-8 +# ar_SS UTF-8 +# ar_SY ISO-8859-6 +# ar_SY.UTF-8 UTF-8 +# ar_TN ISO-8859-6 +# ar_TN.UTF-8 UTF-8 +# ar_YE ISO-8859-6 +# ar_YE.UTF-8 UTF-8 +# as_IN UTF-8 +# ast_ES ISO-8859-15 +# ast_ES.UTF-8 UTF-8 +# ayc_PE UTF-8 +# az_AZ UTF-8 +# be_BY CP1251 +# be_BY.UTF-8 UTF-8 +# be_BY@latin UTF-8 +# bem_ZM UTF-8 +# ber_DZ UTF-8 +# ber_MA UTF-8 +# bg_BG CP1251 +# bg_BG.UTF-8 UTF-8 +# bhb_IN.UTF-8 UTF-8 +# bho_IN UTF-8 +# bn_BD UTF-8 +# bn_IN UTF-8 +# bo_CN UTF-8 +# bo_IN UTF-8 +# br_FR ISO-8859-1 +# br_FR.UTF-8 UTF-8 +# br_FR@euro ISO-8859-15 +# brx_IN UTF-8 +# bs_BA ISO-8859-2 +# bs_BA.UTF-8 UTF-8 +# byn_ER UTF-8 +# ca_AD ISO-8859-15 +# ca_AD.UTF-8 UTF-8 +# ca_ES ISO-8859-1 +# ca_ES.UTF-8 UTF-8 +# ca_ES.UTF-8@valencia UTF-8 +# ca_ES@euro ISO-8859-15 +# ca_ES@valencia ISO-8859-15 +# ca_FR ISO-8859-15 +# ca_FR.UTF-8 UTF-8 +# ca_IT ISO-8859-15 +# ca_IT.UTF-8 UTF-8 +# ce_RU UTF-8 +# chr_US UTF-8 +# cmn_TW UTF-8 +# crh_UA UTF-8 +# cs_CZ ISO-8859-2 +# cs_CZ.UTF-8 UTF-8 +# csb_PL UTF-8 +# cv_RU UTF-8 +# cy_GB ISO-8859-14 +# cy_GB.UTF-8 UTF-8 +# da_DK ISO-8859-1 +# da_DK.UTF-8 UTF-8 +# de_AT ISO-8859-1 +# de_AT.UTF-8 UTF-8 +# de_AT@euro ISO-8859-15 +# de_BE ISO-8859-1 +# de_BE.UTF-8 UTF-8 +# de_BE@euro ISO-8859-15 +# de_CH ISO-8859-1 +# de_CH.UTF-8 UTF-8 +# de_DE ISO-8859-1 +# de_DE.UTF-8 UTF-8 +# de_DE@euro ISO-8859-15 +# de_IT ISO-8859-1 +# de_IT.UTF-8 UTF-8 +# de_LI.UTF-8 UTF-8 +# de_LU ISO-8859-1 +# de_LU.UTF-8 UTF-8 +# de_LU@euro ISO-8859-15 +# doi_IN UTF-8 +# dv_MV UTF-8 +# dz_BT UTF-8 +# el_CY ISO-8859-7 +# el_CY.UTF-8 UTF-8 +# el_GR ISO-8859-7 +# el_GR.UTF-8 UTF-8 +# en_AG UTF-8 +# en_AU ISO-8859-1 +# en_AU.UTF-8 UTF-8 +# en_BW ISO-8859-1 +# en_BW.UTF-8 UTF-8 +# en_CA ISO-8859-1 +# en_CA.UTF-8 UTF-8 +# en_DK ISO-8859-1 +# en_DK.ISO-8859-15 ISO-8859-15 +# en_DK.UTF-8 UTF-8 +# en_GB ISO-8859-1 +# en_GB.ISO-8859-15 ISO-8859-15 +en_GB.UTF-8 UTF-8 +# en_HK ISO-8859-1 +# en_HK.UTF-8 UTF-8 +# en_IE ISO-8859-1 +# en_IE.UTF-8 UTF-8 +# en_IE@euro ISO-8859-15 +# en_IL UTF-8 +# en_IN UTF-8 +# en_NG UTF-8 +# en_NZ ISO-8859-1 +# en_NZ.UTF-8 UTF-8 +# en_PH ISO-8859-1 +# en_PH.UTF-8 UTF-8 +# en_SG ISO-8859-1 +# en_SG.UTF-8 UTF-8 +# en_US ISO-8859-1 +# en_US.ISO-8859-15 ISO-8859-15 +# en_US.UTF-8 UTF-8 +# en_ZA ISO-8859-1 +# en_ZA.UTF-8 UTF-8 +# en_ZM UTF-8 +# en_ZW ISO-8859-1 +# en_ZW.UTF-8 UTF-8 +# eo UTF-8 +# es_AR ISO-8859-1 +# es_AR.UTF-8 UTF-8 +# es_BO ISO-8859-1 +# es_BO.UTF-8 UTF-8 +# es_CL ISO-8859-1 +# es_CL.UTF-8 UTF-8 +# es_CO ISO-8859-1 +# es_CO.UTF-8 UTF-8 +# es_CR ISO-8859-1 +# es_CR.UTF-8 UTF-8 +# es_CU UTF-8 +# es_DO ISO-8859-1 +# es_DO.UTF-8 UTF-8 +# es_EC ISO-8859-1 +# es_EC.UTF-8 UTF-8 +# es_ES ISO-8859-1 +# es_ES.UTF-8 UTF-8 +# es_ES@euro ISO-8859-15 +# es_GT ISO-8859-1 +# es_GT.UTF-8 UTF-8 +# es_HN ISO-8859-1 +# es_HN.UTF-8 UTF-8 +# es_MX ISO-8859-1 +# es_MX.UTF-8 UTF-8 +# es_NI ISO-8859-1 +# es_NI.UTF-8 UTF-8 +# es_PA ISO-8859-1 +# es_PA.UTF-8 UTF-8 +# es_PE ISO-8859-1 +# es_PE.UTF-8 UTF-8 +# es_PR ISO-8859-1 +# es_PR.UTF-8 UTF-8 +# es_PY ISO-8859-1 +# es_PY.UTF-8 UTF-8 +# es_SV ISO-8859-1 +# es_SV.UTF-8 UTF-8 +# es_US ISO-8859-1 +# es_US.UTF-8 UTF-8 +# es_UY ISO-8859-1 +# es_UY.UTF-8 UTF-8 +# es_VE ISO-8859-1 +# es_VE.UTF-8 UTF-8 +# et_EE ISO-8859-1 +# et_EE.ISO-8859-15 ISO-8859-15 +# et_EE.UTF-8 UTF-8 +# eu_ES ISO-8859-1 +# eu_ES.UTF-8 UTF-8 +# eu_ES@euro ISO-8859-15 +# eu_FR ISO-8859-1 +# eu_FR.UTF-8 UTF-8 +# eu_FR@euro ISO-8859-15 +# fa_IR UTF-8 +# ff_SN UTF-8 +# fi_FI ISO-8859-1 +# fi_FI.UTF-8 UTF-8 +# fi_FI@euro ISO-8859-15 +# fil_PH UTF-8 +# fo_FO ISO-8859-1 +# fo_FO.UTF-8 UTF-8 +# fr_BE ISO-8859-1 +# fr_BE.UTF-8 UTF-8 +# fr_BE@euro ISO-8859-15 +# fr_CA ISO-8859-1 +# fr_CA.UTF-8 UTF-8 +# fr_CH ISO-8859-1 +# fr_CH.UTF-8 UTF-8 +# fr_FR ISO-8859-1 +fr_FR.UTF-8 UTF-8 +# fr_FR@euro ISO-8859-15 +# fr_LU ISO-8859-1 +# fr_LU.UTF-8 UTF-8 +# fr_LU@euro ISO-8859-15 +# fur_IT UTF-8 +# fy_DE UTF-8 +# fy_NL UTF-8 +# ga_IE ISO-8859-1 +# ga_IE.UTF-8 UTF-8 +# ga_IE@euro ISO-8859-15 +# gd_GB ISO-8859-15 +# gd_GB.UTF-8 UTF-8 +# gez_ER UTF-8 +# gez_ER@abegede UTF-8 +# gez_ET UTF-8 +# gez_ET@abegede UTF-8 +# gl_ES ISO-8859-1 +# gl_ES.UTF-8 UTF-8 +# gl_ES@euro ISO-8859-15 +# gu_IN UTF-8 +# gv_GB ISO-8859-1 +# gv_GB.UTF-8 UTF-8 +# ha_NG UTF-8 +# hak_TW UTF-8 +# he_IL ISO-8859-8 +# he_IL.UTF-8 UTF-8 +# hi_IN UTF-8 +# hne_IN UTF-8 +# hr_HR ISO-8859-2 +# hr_HR.UTF-8 UTF-8 +# hsb_DE ISO-8859-2 +# hsb_DE.UTF-8 UTF-8 +# ht_HT UTF-8 +# hu_HU ISO-8859-2 +# hu_HU.UTF-8 UTF-8 +# hy_AM UTF-8 +# hy_AM.ARMSCII-8 ARMSCII-8 +# ia_FR UTF-8 +# id_ID ISO-8859-1 +# id_ID.UTF-8 UTF-8 +# ig_NG UTF-8 +# ik_CA UTF-8 +# is_IS ISO-8859-1 +# is_IS.UTF-8 UTF-8 +# it_CH ISO-8859-1 +# it_CH.UTF-8 UTF-8 +# it_IT ISO-8859-1 +# it_IT.UTF-8 UTF-8 +# it_IT@euro ISO-8859-15 +# iu_CA UTF-8 +# ja_JP.EUC-JP EUC-JP +# ja_JP.UTF-8 UTF-8 +# ka_GE GEORGIAN-PS +# ka_GE.UTF-8 UTF-8 +# kk_KZ PT154 +# kk_KZ.RK1048 RK1048 +# kk_KZ.UTF-8 UTF-8 +# kl_GL ISO-8859-1 +# kl_GL.UTF-8 UTF-8 +# km_KH UTF-8 +# kn_IN UTF-8 +# ko_KR.EUC-KR EUC-KR +# ko_KR.UTF-8 UTF-8 +# kok_IN UTF-8 +# ks_IN UTF-8 +# ks_IN@devanagari UTF-8 +# ku_TR ISO-8859-9 +# ku_TR.UTF-8 UTF-8 +# kw_GB ISO-8859-1 +# kw_GB.UTF-8 UTF-8 +# ky_KG UTF-8 +# lb_LU UTF-8 +# lg_UG ISO-8859-10 +# lg_UG.UTF-8 UTF-8 +# li_BE UTF-8 +# li_NL UTF-8 +# lij_IT UTF-8 +# ln_CD UTF-8 +# lo_LA UTF-8 +# lt_LT ISO-8859-13 +# lt_LT.UTF-8 UTF-8 +# lv_LV ISO-8859-13 +# lv_LV.UTF-8 UTF-8 +# lzh_TW UTF-8 +# mag_IN UTF-8 +# mai_IN UTF-8 +# mg_MG ISO-8859-15 +# mg_MG.UTF-8 UTF-8 +# mhr_RU UTF-8 +# mi_NZ ISO-8859-13 +# mi_NZ.UTF-8 UTF-8 +# mk_MK ISO-8859-5 +# mk_MK.UTF-8 UTF-8 +# ml_IN UTF-8 +# mn_MN UTF-8 +# mni_IN UTF-8 +# mr_IN UTF-8 +# ms_MY ISO-8859-1 +# ms_MY.UTF-8 UTF-8 +# mt_MT ISO-8859-3 +# mt_MT.UTF-8 UTF-8 +# my_MM UTF-8 +# nan_TW UTF-8 +# nan_TW@latin UTF-8 +# nb_NO ISO-8859-1 +# nb_NO.UTF-8 UTF-8 +# nds_DE UTF-8 +# nds_NL UTF-8 +# ne_NP UTF-8 +# nhn_MX UTF-8 +# niu_NU UTF-8 +# niu_NZ UTF-8 +# nl_AW UTF-8 +# nl_BE ISO-8859-1 +# nl_BE.UTF-8 UTF-8 +# nl_BE@euro ISO-8859-15 +# nl_NL ISO-8859-1 +# nl_NL.UTF-8 UTF-8 +# nl_NL@euro ISO-8859-15 +# nn_NO ISO-8859-1 +# nn_NO.UTF-8 UTF-8 +# nr_ZA UTF-8 +# nso_ZA UTF-8 +# oc_FR ISO-8859-1 +# oc_FR.UTF-8 UTF-8 +# om_ET UTF-8 +# om_KE ISO-8859-1 +# om_KE.UTF-8 UTF-8 +# or_IN UTF-8 +# os_RU UTF-8 +# pa_IN UTF-8 +# pa_PK UTF-8 +# pap_AW UTF-8 +# pap_CW UTF-8 +# pl_PL ISO-8859-2 +# pl_PL.UTF-8 UTF-8 +# ps_AF UTF-8 +# pt_BR ISO-8859-1 +# pt_BR.UTF-8 UTF-8 +# pt_PT ISO-8859-1 +# pt_PT.UTF-8 UTF-8 +# pt_PT@euro ISO-8859-15 +# quz_PE UTF-8 +# raj_IN UTF-8 +# ro_RO ISO-8859-2 +# ro_RO.UTF-8 UTF-8 +# ru_RU ISO-8859-5 +# ru_RU.CP1251 CP1251 +# ru_RU.KOI8-R KOI8-R +# ru_RU.UTF-8 UTF-8 +# ru_UA KOI8-U +# ru_UA.UTF-8 UTF-8 +# rw_RW UTF-8 +# sa_IN UTF-8 +# sat_IN UTF-8 +# sc_IT UTF-8 +# sd_IN UTF-8 +# sd_IN@devanagari UTF-8 +# se_NO UTF-8 +# sgs_LT UTF-8 +# shs_CA UTF-8 +# si_LK UTF-8 +# sid_ET UTF-8 +# sk_SK ISO-8859-2 +# sk_SK.UTF-8 UTF-8 +# sl_SI ISO-8859-2 +# sl_SI.UTF-8 UTF-8 +# so_DJ ISO-8859-1 +# so_DJ.UTF-8 UTF-8 +# so_ET UTF-8 +# so_KE ISO-8859-1 +# so_KE.UTF-8 UTF-8 +# so_SO ISO-8859-1 +# so_SO.UTF-8 UTF-8 +# sq_AL ISO-8859-1 +# sq_AL.UTF-8 UTF-8 +# sq_MK UTF-8 +# sr_ME UTF-8 +# sr_RS UTF-8 +# sr_RS@latin UTF-8 +# ss_ZA UTF-8 +# st_ZA ISO-8859-1 +# st_ZA.UTF-8 UTF-8 +# sv_FI ISO-8859-1 +# sv_FI.UTF-8 UTF-8 +# sv_FI@euro ISO-8859-15 +# sv_SE ISO-8859-1 +# sv_SE.ISO-8859-15 ISO-8859-15 +# sv_SE.UTF-8 UTF-8 +# sw_KE UTF-8 +# sw_TZ UTF-8 +# szl_PL UTF-8 +# ta_IN UTF-8 +# ta_LK UTF-8 +# tcy_IN.UTF-8 UTF-8 +# te_IN UTF-8 +# tg_TJ KOI8-T +# tg_TJ.UTF-8 UTF-8 +# th_TH TIS-620 +# th_TH.UTF-8 UTF-8 +# the_NP UTF-8 +# ti_ER UTF-8 +# ti_ET UTF-8 +# tig_ER UTF-8 +# tk_TM UTF-8 +# tl_PH ISO-8859-1 +# tl_PH.UTF-8 UTF-8 +# tn_ZA UTF-8 +# tr_CY ISO-8859-9 +# tr_CY.UTF-8 UTF-8 +# tr_TR ISO-8859-9 +# tr_TR.UTF-8 UTF-8 +# ts_ZA UTF-8 +# tt_RU UTF-8 +# tt_RU@iqtelif UTF-8 +# ug_CN UTF-8 +# uk_UA KOI8-U +# uk_UA.UTF-8 UTF-8 +# unm_US UTF-8 +# ur_IN UTF-8 +# ur_PK UTF-8 +# uz_UZ ISO-8859-1 +# uz_UZ.UTF-8 UTF-8 +# uz_UZ@cyrillic UTF-8 +# ve_ZA UTF-8 +# vi_VN UTF-8 +# wa_BE ISO-8859-1 +# wa_BE.UTF-8 UTF-8 +# wa_BE@euro ISO-8859-15 +# wae_CH UTF-8 +# wal_ET UTF-8 +# wo_SN UTF-8 +# xh_ZA ISO-8859-1 +# xh_ZA.UTF-8 UTF-8 +# yi_US CP1255 +# yi_US.UTF-8 UTF-8 +# yo_NG UTF-8 +# yue_HK UTF-8 +# zh_CN GB2312 +# zh_CN.GB18030 GB18030 +# zh_CN.GBK GBK +# zh_CN.UTF-8 UTF-8 +# zh_HK BIG5-HKSCS +# zh_HK.UTF-8 UTF-8 +# zh_SG GB2312 +# zh_SG.GBK GBK +# zh_SG.UTF-8 UTF-8 +# zh_TW BIG5 +# zh_TW.EUC-TW EUC-TW +# zh_TW.UTF-8 UTF-8 +# zu_ZA ISO-8859-1 +# zu_ZA.UTF-8 UTF-8 diff --git a/ansible/roles/base/templates/vimrc b/ansible/roles/base/templates/vimrc new file mode 100644 index 0000000..3ea1027 --- /dev/null +++ b/ansible/roles/base/templates/vimrc @@ -0,0 +1,31 @@ +" Vim5 and later versions support syntax highlighting. Uncommenting the next +" line enables syntax highlighting by default. +syntax on + +" If using a dark background within the editing area and syntax highlighting +" turn on this option as well +set background=dark +colorscheme desert + +"" Numérotation des lignes +set nu + +" Uncomment the following to have Vim load indentation rules and plugins +" according to the detected filetype. +if has("autocmd") + filetype plugin indent on +endif + +" Source a global configuration file if available +if filereadable("/etc/vim/vimrc.local") + source /etc/vim/vimrc.local +endif + +" formattage auto du xml +au FileType xml setlocal equalprg="XMLLINT_INDENT=4 xmllint\ --format\ --recover\ -\ 2>/dev/null" + +" remplacement des tabulations par des espaces +set expandtab +set tabstop=4 +" To change the number of space characters inserted for indentation, use the 'shiftwidth' option: +set shiftwidth=4 diff --git a/ansible/roles/docker/tasks/docker.yml b/ansible/roles/docker/tasks/docker.yml new file mode 100644 index 0000000..40a19cd --- /dev/null +++ b/ansible/roles/docker/tasks/docker.yml @@ -0,0 +1,35 @@ +- name: Add apt key + apt_key: + url: https://download.docker.com/linux/debian/gpg + +- name: Add docker-ce repository + apt_repository: + repo: deb [arch={{ arch | default('armhf') }}] https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable + state: present + filename: 'docker' + + +- meta: flush_handlers + +- name: Install docker-ce + apt: + name: + - python-pip + - docker-ce + - xfsprogs + state: present + +- name: Set groups to pi user + user: + name: pi + groups: docker + +- meta: flush_handlers +- name: Install ansible tool docker and docker-compose + pip: + name: + - docker-compose + executable: pip3 + + + diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml new file mode 100644 index 0000000..4fc2686 --- /dev/null +++ b/ansible/roles/docker/tasks/main.yml @@ -0,0 +1,4 @@ +--- + +- include_tasks: docker.yml + diff --git a/ansible/roles/donkey/defaults/main.yml b/ansible/roles/donkey/defaults/main.yml new file mode 100644 index 0000000..a00ce51 --- /dev/null +++ b/ansible/roles/donkey/defaults/main.yml @@ -0,0 +1,13 @@ +--- + +donkey_username: pi +donkey_groupname: pi +donkey_home_dir: /home/{{ donkey_username }} + +donkey_git_repo: https://github.com/cyrilix/donkey.git +donkey_git_branch: master + +donkey_sources: "{{ donkey_home_dir }}/donkeycar" +donkey_virtualenv_dir: "{{ donkey_home_dir }}/venv" + +donkey_data_dir: "{{ donkey_home_dir }}/data" diff --git a/ansible/roles/donkey/tasks/data.yml b/ansible/roles/donkey/tasks/data.yml new file mode 100644 index 0000000..795e43f --- /dev/null +++ b/ansible/roles/donkey/tasks/data.yml @@ -0,0 +1,16 @@ +--- + +- name: Make data directory + file: + path: "{{ donkey_data_dir }}" + owner: "{{ donkey_username }}" + group: "{{ donkey_groupname }}" + state: directory + +- name: Make tmpfs + mount: + path: "{{ donkey_data_dir }}" + src: tmpfs + fstype: tmpfs + opts: defaults + state: mounted diff --git a/ansible/roles/donkey/tasks/main.yml b/ansible/roles/donkey/tasks/main.yml new file mode 100644 index 0000000..4e18aa3 --- /dev/null +++ b/ansible/roles/donkey/tasks/main.yml @@ -0,0 +1,62 @@ +--- + +- include_tasks: data.yml + +- name: Install dependencies + apt: + name: + - python3-setuptools-git + - virtualenv + - libopenjp2-7 + - libtiff5 + - libblas3 + - liblapack3 + - libatlas3-base + - libjpeg-dev + - libilmbase12 + - libopenexr22 + - libgstreamer1.0-0 + - libavcodec57 + - libavformat57 + - libswscale4 + - libgtk-3-0 + - i2c-tools + - read-edid + - libsdl1.2debian + - libjasper1 + - libqtgui4 + - libqt4-test + - python-h5py + state: present + +- name: Fetch git repository + become_user: "{{ donkey_username }}" + git: + repo: "{{ donkey_git_repo }}" + dest: "{{ donkey_sources }}" + version: "{{ donkey_git_branch }}" + ssh_opts: "-o StrictHostKeyChecking=no" + +- name: Install donkey + become_user: "{{ donkey_username }}" + pip: + name: "{{ donkey_sources }}" + virtualenv_python: python3 + virtualenv: "{{ donkey_virtualenv_dir }}" + editable: yes + + +#- name: Install dependencies +# become_user: "{{ donkey_username }}" +# pip: +# requirements: "{{ donkey_sources }}/requirements-pi.txt" +# virtualenv: "{{ donkey_virtualenv_dir }}" +# virtualenv_python: python3 + +- name: Load virtualenv at connection + template: + src: bash_custom + dest: "{{ donkey_home_dir }}/.bash_custom" + owner: "{{ donkey_username }}" + group: "{{ donkey_groupname }}" + mode: 0644 diff --git a/ansible/roles/donkey/templates/bash_custom b/ansible/roles/donkey/templates/bash_custom new file mode 100644 index 0000000..5b3f1d8 --- /dev/null +++ b/ansible/roles/donkey/templates/bash_custom @@ -0,0 +1,2 @@ +# Activate virtualenv +source {{ donkey_virtualenv_dir }}/bin/activate diff --git a/ansible/roles/python/defaults/main.yml b/ansible/roles/python/defaults/main.yml new file mode 100644 index 0000000..f6f30d5 --- /dev/null +++ b/ansible/roles/python/defaults/main.yml @@ -0,0 +1,4 @@ +--- + +version: 3.6.6 +threads: 4 diff --git a/ansible/roles/python/tasks/main.yml b/ansible/roles/python/tasks/main.yml new file mode 100644 index 0000000..dbddefc --- /dev/null +++ b/ansible/roles/python/tasks/main.yml @@ -0,0 +1,52 @@ +--- + +- name: "Install python {{version}} runtime & build dependencies" + become: yes + apt: name={{item}} + with_items: + - build-essential + - tk-dev + - libncurses5-dev + - libncursesw5-dev + - libreadline6-dev + - libdb5.3-dev + - libgdbm-dev + - libsqlite3-dev + - libssl-dev + - libbz2-dev + - libexpat1-dev + - liblzma-dev + - libffi-dev + - uuid-dev + - zlib1g-dev + +- name: "Download python{{version}}" + get_url: + url: "https://www.python.org/ftp/python/{{version}}/Python-{{version}}.tar.xz" + dest: "/tmp/Python-{{version}}.tar.xz" + +- name: "Unarchive python{{version}}" + unarchive: + src: "/tmp/Python-{{version}}.tar.xz" + dest: "/tmp/" + copy: no + creates: "/tmp/Python-{{version}}" + +- name: "configure python{{version}} build" + command: ./configure --prefix=/opt/python-{{version}} --enable-optimizations + args: + chdir: "/tmp/Python-{{version}}" + creates: "/tmp/Python-{{version}}/Makefile" + +- name: "build python{{version}}" + # not using make module to be able to use -j and creates option to fully skip step + command: make -j{{threads}} + args: + chdir: "/tmp/Python-{{version}}" + creates: "/tmp/Python-{{version}}/python" + +- name: "install python{{version}}" + become: yes + make: + chdir: "/tmp/Python-{{version}}" + target: altinstall diff --git a/ansible/roles/rabbitmq/handlers/main.yml b/ansible/roles/rabbitmq/handlers/main.yml new file mode 100644 index 0000000..26c0ea3 --- /dev/null +++ b/ansible/roles/rabbitmq/handlers/main.yml @@ -0,0 +1,11 @@ +--- +- name: expand filesystem + shell: resize2fs /dev/mmcblk0p2 + notify: + - reboot + +- name: restart rabbitmq + service: + name: rabbitmq-server + start: restarted + diff --git a/ansible/roles/rabbitmq/tasks/main.yml b/ansible/roles/rabbitmq/tasks/main.yml new file mode 100644 index 0000000..91bc2d8 --- /dev/null +++ b/ansible/roles/rabbitmq/tasks/main.yml @@ -0,0 +1,32 @@ +--- +- name: Install ansible dependencies + apt: + name: "python-requests" + state: present + +- name: Install rabbitmq package + apt: + name: rabbitmq-server + state: present + +- name: Enables rabbitmq plugins + rabbitmq_plugin: + names: rabbitmq_management,rabbitmq_mqtt + state: enabled + +- name: Add rabbitmq user + rabbitmq_user: + user: "{{ rabbitmq_user }}" + password: "{{ rabbitmq_password }}" + vhost: / + configure_priv: .* + read_priv: .* + write_priv: .* + tags: administrator + state: present + +- name: Create exchange + rabbitmq_exchange: + name: car + type: topic + vhost: "/" diff --git a/ansible/site.yml b/ansible/site.yml new file mode 100644 index 0000000..1db22db --- /dev/null +++ b/ansible/site.yml @@ -0,0 +1,18 @@ +--- + +- hosts: car + become: yes + roles: + - { role: base, tags: [base]} + +- hosts: microservice + become: yes + roles: + - { role: rabbitmq, tags: [rabbitmq] } + - { role: docker, tags: [docker] } + +- hosts: donkey + become: yes + roles: + - { role: python, tags: [python]} + - { role: donkey, tags: [donkey] } diff --git a/bootstrap/build_sdcard.sh b/bootstrap/build_sdcard.sh new file mode 100755 index 0000000..a816d61 --- /dev/null +++ b/bootstrap/build_sdcard.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +set -e + +# Uncomment and fix variables before run script +SD_CARD_DEVICE="/dev/sda" +SD_CARD_BOOT_PARTITION=${SD_CARD_DEVICE}1 +SD_CARD_ROOT_PARTITION=${SD_CARD_DEVICE}2 + +HOSTNAME_CAR="satanas" + +WIFI_SECRET_FILE=".secret" + +# For debug +ADD_TTL_SUPPORT_FOR_DEBUG=1 + +########### End Configuration ############ +mkdir -p build + +if [ ! -f build/raspbian.zip ] +then + wget -O build/raspbian.zip https://downloads.raspberrypi.org/raspbian_lite_latest + cd build + unzip raspbian.zip + cd .. +fi + +raspbian_image=`ls build/*.img` + +echo "Copy image ${raspbian_image} to sdcard" +sudo dd if=${raspbian_image} of=${SD_CARD_DEVICE} bs=4M conv=fsync status=progress + +echo "Force disk sync" +sync + + +echo "Mount boot sdcard" +mkdir -p build/mnt +sudo mount ${SD_CARD_BOOT_PARTITION} ./build/mnt + +echo "Force ssh to start at first boot" +sudo touch build/mnt/ssh + +if [ "${ADD_TTL_SUPPORT_FOR_DEBUG}" == "1" ] +then + echo "# Disable bluetooth in order to enable serial TTL" | sudo tee -a build/mnt/config.txt > /dev/null + echo "dtoverlay=pi3-disable-bt" | sudo tee -a build/mnt/config.txt > /dev/null +fi + +echo "Umount boot partition" +sudo umount build/mnt + + +echo "Mount root sdcard" +sudo mount ${SD_CARD_ROOT_PARTITION} ./build/mnt + +echo "Set hostname" +echo ${HOSTNAME_CAR} | sudo tee build/mnt/etc/hostname > /dev/null +echo sudo sed -i "s/raspberrypi/$HOSTNAME_CAR/g" build/mnt/etc/hosts + +echo "Disable default password for 'pi' use" +sudo sed -i -E "s/(pi:)[^:]*(:.*)/\1*\2/" build/mnt/etc/shadow* + +echo "Copy authorized keys" +sudo mkdir -p build/mnt/home/pi/.ssh/ +sudo cp ../ansible/roles/base/files/authorized_keys build/mnt/home/pi/.ssh/ +sudo chmod 600 build/mnt/home/pi/.ssh/authorized_keys +sudo chown -R 1000:1000 build/mnt/home/pi + +echo "Copy wifi configuration" +source ${WIFI_SECRET_FILE} +eval "echo \"$(cat wpa_supplicant.conf)\"" | sudo tee build/mnt/etc/wpa_supplicant/wpa_supplicant.conf > /dev/null +sudo chmod 600 build/mnt/etc/wpa_supplicant/wpa_supplicant.conf + + +echo "Umount sdcard" +sudo umount ./build/mnt + +echo "Force disk sync" +sync + +echo "Bootstrap finished, plug sdcard on raspberrypi and connect with command:" +echo " ssh pi@${HOSTNAME_CAR}.local" + diff --git a/bootstrap/wpa_supplicant.conf b/bootstrap/wpa_supplicant.conf new file mode 100644 index 0000000..4141220 --- /dev/null +++ b/bootstrap/wpa_supplicant.conf @@ -0,0 +1,9 @@ +ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev +update_config=1 +country=FR + +network={ + ssid=\"${WIFI_SSID}\" + psk=\"${WIFI_PASSWORD}\" + priority=2 +}