From 50dd651fab8174c97017bd8a0e17771d15b9a0f0 Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Fri, 4 Oct 2019 23:15:47 +0100
Subject: [PATCH 01/10] move dependencies to binary or deb packages

---
 builder/pwnagotchi.yml | 79 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 64 insertions(+), 15 deletions(-)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index 515ee70..e091dab 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -3,8 +3,9 @@
     - 127.0.0.1
   become: yes
   vars:
-    pwn_hostname: "pwnagotchi"
-    pwn_version: "master"
+    pwn_hostname: "{{ lookup('env', 'PWN_HOSTNAME') | default('pwnagotchi', true) }}"
+    pwn_version: "{{ lookup('env', 'PWN_VERSION') | default('master', true) }} "
+    bettercap_query: "assets[?contains(name, 'armv6l')].browser_download_url"
 
   tasks:
 
@@ -57,6 +58,7 @@
         - git
         - build-essential
         - python3-pip
+        - unzip
         - gawk
         - libopenmpi-dev
         - libatlas-base-dev
@@ -87,6 +89,25 @@
         - fonts-dejavu
         - fonts-dejavu-core
         - fonts-dejavu-extra
+        - python3-crypto
+        - python3-requests
+        - python3-yaml
+        - python3-smbus
+        - python3-inkyphat
+        - python3-numpy
+        - python3-pil
+        - python3-tweepy
+        - python3-opencv
+        - python3-termcolor
+        - python3-astor
+        - python3-backports.weakref
+        - python3-keras-applications
+        - python3-keras-preprocessing
+        - python3-six
+        - python3-protobuf
+        - python3-wrapt
+        - python3-wheel
+        - python3-mock
 
   - name: configure dphys-swapfile
     file:
@@ -113,16 +134,48 @@
       state: started
       enabled: yes
 
-  - name: build bettercap
-    command: go get -u github.com/bettercap/bettercap
-    environment:
-      GOPATH: /root/go
-      GOROOT: /usr/lib/go
+  - name: acquire python3 pip target
+    command: "python3 -c 'import sys;print(sys.path.pop())'"
+    register: pip_target
 
-  - name: install bettercap
-    copy:
-      src: /root/go/bin/bettercap
-      dest: /usr/bin/bettercap
+  - name: install pip packages that are not architecture tied
+    pip:
+      name: "{{ packages }}"
+      extra_args: "--no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --prefer-binary --no-cache-dir --platform=armv6l --target={{ pip_target.stdout }}"
+    vars:
+      packages:
+        - absl-py
+        - enum34
+        - gast
+        - google_pasta
+        - opt_einsum
+        - tensorboard
+        - scapy
+        - gym
+        - stable-baselines
+        - file_read_backwards
+        - tensorflow_estimator
+
+  - name: install grpcio
+    command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://www.piwheels.hostedpi.com/simple/grpcio/grpcio-1.24.1-cp37-cp37m-linux_armv6l.whl"
+
+  - name: install tensorflow
+    command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://storage.googleapis.com/tensorflow/raspberrypi/tensorflow-1.14.0-cp34-none-linux_armv6l.whl"
+
+  - name: fetch bettercap release information
+    uri:
+      url: https://api.github.com/repos/bettercap/bettercap/releases/latest
+      return_content: yes
+    register: bettercap_release
+
+  - name: download and install bettercap
+    unarchive:
+      src: "{{ bettercap_release.content | from_json | json_query(bettercap_query) | first }}"
+      dest: /usr/bin
+      remote_src: yes
+      exclude:
+        - README.md
+        - LICENSE.md
       mode: 0755
 
   - name: clone bettercap caplets
@@ -151,10 +204,6 @@
       path: /tmp/pwnagotchi
       state: absent
 
-  - name: install python modules
-    pip:
-      requirements: /root/pwnagotchi/scripts/requirements.txt
-
   - name: create cpuusage script
     copy:
       dest: /usr/bin/cpuusage

From 695499314d094b346d26164aaf8a5f1ad8aa2761 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Sat, 5 Oct 2019 17:57:15 +0200
Subject: [PATCH 02/10] Fix split-bug in script

---
 sdcard/rootfs/root/pwnagotchi/config.yml                 | 4 ++--
 .../scripts/pwnagotchi/plugins/default/auto-backup.py    | 9 ++++++++-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml
index bbc93b8..ae470ad 100644
--- a/sdcard/rootfs/root/pwnagotchi/config.yml
+++ b/sdcard/rootfs/root/pwnagotchi/config.yml
@@ -15,7 +15,7 @@ main:
         files:
           - /root/brain.nn
           - /root/brain.json
-          - /root/custom.yaml
+          - /root/custom.yml
           - /root/handshakes
           - /etc/ssh
           - /etc/hostname
@@ -24,7 +24,7 @@ main:
           - /var/log/pwnagotchi.log
         commands:
           - 'tar czf /tmp/backup.tar.gz {files}'
-          - 'scp /tmp/backup.tar.gz pwnagotchi@10.0.0.1:/home/pwnagotchi/backups/backup-$(date).tar.gz'
+          - 'scp /tmp/backup.tar.gz pwnagotchi@10.0.0.1:/home/pwnagotchi/backups/backup-$(date +%s).tar.gz'
       gps:
         enabled: false
       twitter:
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
index 7312201..731a40f 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
@@ -30,6 +30,7 @@ def on_loaded():
         return
 
     READY = True
+    logging.info("AUTO-BACKUP: Successfuly loaded.")
 
 
 def on_internet_available(display, config, log):
@@ -41,11 +42,17 @@ def on_internet_available(display, config, log):
 
         files_to_backup = " ".join(OPTIONS['files'])
         try:
+            logging.info("AUTO-BACKUP: Backing up ...")
             display.set('status', 'Backing up ...')
             display.update()
 
             for cmd in OPTIONS['commands']:
-                subprocess.call(cmd.format(files=files_to_backup).split(), stdout=open(os.devnull, 'wb'))
+                logging.info(f"AUTO-BACKUP: Running {cmd.format(files=files_to_backup)}")
+                process = subprocess.Popen(cmd.format(files=files_to_backup), shell=True, stdin=None,
+                                          stdout=open("/dev/null", "w"), stderr=None, executable="/bin/bash")
+                process.wait()
+                if process.returncode > 0:
+                    raise OSError(f"Command failed (rc: {process.returncode})")
 
             logging.info("AUTO-BACKUP: backup done")
             STATUS.update()

From 419208ee5d5d26307b7e273f46704a29e27dd61f Mon Sep 17 00:00:00 2001
From: Elliot Manson <adolfaka@gmail.com>
Date: Sat, 5 Oct 2019 19:02:59 +0300
Subject: [PATCH 03/10] Translated into Russian

---
 .../pwnagotchi/locale/ru/LC_MESSAGES/voice.mo | Bin 0 -> 5038 bytes
 .../pwnagotchi/locale/ru/LC_MESSAGES/voice.po | 205 ++++++++++++++++++
 2 files changed, 205 insertions(+)
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.mo
 create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.po

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.mo
new file mode 100644
index 0000000000000000000000000000000000000000..08fae17ce786f4525b5a7211b10217638ba6dea1
GIT binary patch
literal 5038
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
W*%|L@t=81+izGA4Bw1-9IrU%QkI=RN

literal 0
HcmV?d00001

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.po
new file mode 100644
index 0000000..796bf17
--- /dev/null
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/ru/LC_MESSAGES/voice.po
@@ -0,0 +1,205 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <25989971+adolfaka@users.noreply.github.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-10-03 16:47+0200\n"
+"PO-Revision-Date: 2019-10-05 18:50+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.2.4\n"
+"Last-Translator: Elliot Manson\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Language: ru_RU\n"
+
+msgid "ZzzzZZzzzzZzzz"
+msgstr "ZzzzZZzzzzZzzz"
+
+msgid "Hi, I'm Pwnagotchi! Starting ..."
+msgstr "Привет, я Pwnagotchi! Поехали …"
+
+msgid "New day, new hunt, new pwns!"
+msgstr "Новый день, новая охота, новые взломы!"
+
+msgid "Hack the Planet!"
+msgstr "Взломаем всю планету!"
+
+msgid "AI ready."
+msgstr "Искусственный интеллект готов."
+
+msgid "The neural network is ready."
+msgstr "Нейронная сеть готова."
+
+#, python-brace-format
+msgid "Hey, channel {channel} is free! Your AP will say thanks."
+msgstr "Эй, канал {channel} свободен! Ваша точка доступа скажет спасибо."
+
+msgid "I'm bored ..."
+msgstr "Мне скучно …"
+
+msgid "Let's go for a walk!"
+msgstr "Пойдем прогуляемся!"
+
+msgid "This is the best day of my life!"
+msgstr "Это лучший день в моей жизни!"
+
+msgid "Shitty day :/"
+msgstr "Дерьмовый день :/"
+
+msgid "I'm extremely bored ..."
+msgstr "Мне очень скучно …"
+
+msgid "I'm very sad ..."
+msgstr "Мне очень грустно …"
+
+msgid "I'm sad"
+msgstr "Мне грустно"
+
+msgid "I'm living the life!"
+msgstr "Я живу своей жизнью!"
+
+msgid "I pwn therefore I am."
+msgstr "Я взламываю, поэтому я существую."
+
+msgid "So many networks!!!"
+msgstr "Так, много сетей!!!"
+
+msgid "I'm having so much fun!"
+msgstr "Мне так весело!"
+
+msgid "My crime is that of curiosity ..."
+msgstr "Моё преступление - это любопытство …"
+
+#, python-brace-format
+msgid "Hello {name}! Nice to meet you. {name}"
+msgstr "Привет, {name}! Приятно познакомиться. {name}"
+
+#, python-brace-format
+msgid "Unit {name} is nearby! {name}"
+msgstr "Цель {name} близко! {name}"
+
+#, python-brace-format
+msgid "Uhm ... goodbye {name}"
+msgstr "Хм … до свидания {name}"
+
+#, python-brace-format
+msgid "{name} is gone ..."
+msgstr "{name} исчезла …"
+
+#, python-brace-format
+msgid "Whoops ... {name} is gone."
+msgstr "Упс … {name} исчезла."
+
+#, python-brace-format
+msgid "{name} missed!"
+msgstr "{name} упустил!"
+
+msgid "Missed!"
+msgstr "Промахнулся!"
+
+msgid "Nobody wants to play with me ..."
+msgstr "Никто не хочет играть со мной …"
+
+msgid "I feel so alone ..."
+msgstr "Мне так одиноко …"
+
+msgid "Where's everybody?!"
+msgstr "Где все?!"
+
+#, python-brace-format
+msgid "Napping for {secs}s ..."
+msgstr "Дремлет {secs}с …"
+
+msgid "Zzzzz"
+msgstr "Zzzzz"
+
+#, python-brace-format
+msgid "ZzzZzzz ({secs}s)"
+msgstr "ZzzZzzz ({secs}c)"
+
+#, python-brace-format
+msgid "Waiting for {secs}s ..."
+msgstr "Ждем {secs}c …"
+
+#, python-brace-format
+msgid "Looking around ({secs}s)"
+msgstr "Оглядываюсь вокруг ({secs}с)"
+
+#, python-brace-format
+msgid "Hey {what} let's be friends!"
+msgstr "Эй, {what} давай дружить!"
+
+#, python-brace-format
+msgid "Associating to {what}"
+msgstr "Связываюсь с {what}"
+
+#, python-brace-format
+msgid "Yo {what}!"
+msgstr "Йоy {what}!"
+
+#, python-brace-format
+msgid "Just decided that {mac} needs no WiFi!"
+msgstr "Просто решил, что {mac} не нужен WiFi! Кхе-кхе)"
+
+#, python-brace-format
+msgid "Deauthenticating {mac}"
+msgstr "Деаутентификация {mac}"
+
+#, python-brace-format
+msgid "Kickbanning {mac}!"
+msgstr "Кикаю {mac}!"
+
+#, python-brace-format
+msgid "Cool, we got {num} new handshake{plural}!"
+msgstr "Круто, мы получили {num} новое рукопожатие!"
+
+msgid "Ops, something went wrong ... Rebooting ..."
+msgstr "Ой, что-то пошло не так … Перезагружаюсь …"
+
+#, python-brace-format
+msgid "Kicked {num} stations\n"
+msgstr "Кикнул {num} станцию\n"
+
+#, python-brace-format
+msgid "Made {num} new friends\n"
+msgstr "Заимел {num} новых друзей\n"
+
+#, python-brace-format
+msgid "Got {num} handshakes\n"
+msgstr "Получил {num} рукопожатие\n"
+
+msgid "Met 1 peer"
+msgstr "Встретился один знакомый"
+
+#, python-brace-format
+msgid "Met {num} peers"
+msgstr "Встретились {num} приятелей"
+
+#, python-brace-format
+msgid ""
+"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
+"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
+"#pwnlog #pwnlife #hacktheplanet #skynet"
+msgstr ""
+"Я взламывал {duration} и кикнул {deauthed} клиентов! Я также встретил "
+"{associated} новых друзей и съел {handshakes} рукопожатий! #pwnagotchi "
+"#pwnlog #pwnlife #hacktheplanet #skynet"
+
+msgid "hours"
+msgstr "часов"
+
+msgid "hour"
+msgstr "час"
+
+msgid "minutes"
+msgstr "минут"
+
+msgid "minute"
+msgstr "минуту"

From 09c175e2ebd0eda5e264bf34d4ed99e1bd1a725d Mon Sep 17 00:00:00 2001
From: Elliot Manson <adolfaka@gmail.com>
Date: Sat, 5 Oct 2019 19:07:21 +0300
Subject: [PATCH 04/10] Corrected the documentation

---
 docs/configure.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/configure.md b/docs/configure.md
index 733abc9..d69bc9a 100644
--- a/docs/configure.md
+++ b/docs/configure.md
@@ -40,6 +40,7 @@ For instance, you can change `main.lang` to one of the supported languages:
 - macedonian
 - italian
 - french
+- russian
 
 ## Display Selection
 

From cc651c3290ff3b2538694b592f1df1ff9556a85e Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Sat, 5 Oct 2019 17:31:14 +0100
Subject: [PATCH 05/10] many builder fixes and support for serial gadget

---
 builder/pwnagotchi.yml | 44 +++++++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index e091dab..d2263a8 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -42,6 +42,19 @@
     apt:
       update_cache: yes
 
+  - name: remove unecessary apt packages
+    apt:
+      name: "{{ packages }}"
+      state: absent
+      purge: yes
+    var:
+      packages:
+        - rasberrypi-net-mods
+        - dhcpcd5
+        - triggerhappy
+        - wpa_supplicant
+        - nfs-common
+
   - name: upgrade apt distro
     apt:
       upgrade: dist
@@ -101,13 +114,14 @@
         - python3-termcolor
         - python3-astor
         - python3-backports.weakref
-        - python3-keras-applications
-        - python3-keras-preprocessing
+        - python3-h5py
         - python3-six
         - python3-protobuf
         - python3-wrapt
         - python3-wheel
         - python3-mock
+        - python3-scipy
+        - python3-cloudpickle
 
   - name: configure dphys-swapfile
     file:
@@ -125,8 +139,10 @@
         - apt-daily.service
         - apt-daily-upgrade.timer
         - apt-daily-upgrade.service
+        - wpa_supplicant.service
         - bluetooth.service
         - triggerhappy.service
+        - ifup@wlan0.service
 
   - name: enable dphys-swapfile service
     systemd:
@@ -134,33 +150,43 @@
       state: started
       enabled: yes
 
+  - name: enable gadget serial port service
+    systemd:
+      name: getty@ttyGS0.service
+      state: started
+      enabled: yes
+
   - name: acquire python3 pip target
     command: "python3 -c 'import sys;print(sys.path.pop())'"
     register: pip_target
 
-  - name: install pip packages that are not architecture tied
+  - name: install pip packages
     pip:
       name: "{{ packages }}"
       extra_args: "--no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --prefer-binary --no-cache-dir --platform=armv6l --target={{ pip_target.stdout }}"
     vars:
       packages:
-        - absl-py
+        - inky
+        - smbus2
+        - absl-py>=0.1.6
         - enum34
-        - gast
+        - gast==0.2.2
         - google_pasta
         - opt_einsum
-        - tensorboard
         - scapy
         - gym
+        - keras_applications>=1.0.6
+        - keras_preprocessing>=1.0.5
         - stable-baselines
         - file_read_backwards
-        - tensorflow_estimator
+        - tensorflow_estimator>=1.14.0,<1.15.0
+        - tensorboard>=1.13.0,<1.14.0
 
   - name: install grpcio
     command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://www.piwheels.hostedpi.com/simple/grpcio/grpcio-1.24.1-cp37-cp37m-linux_armv6l.whl"
 
   - name: install tensorflow
-    command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://storage.googleapis.com/tensorflow/raspberrypi/tensorflow-1.14.0-cp34-none-linux_armv6l.whl"
+    command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl"
 
   - name: fetch bettercap release information
     uri:
@@ -318,7 +344,7 @@
       state: present
       backup: no
       regexp: '(.*)$'
-      line: '\1 modules-load=dwc2,g_ether'
+      line: '\1 modules-load=dwc2,g_cdc'
 
   - name: configure ssh
     lineinfile:

From 74a23b3c069945f51b74f210b35e17fb3901ee0b Mon Sep 17 00:00:00 2001
From: Cassiano Aquino <cassianoaquino@me.com>
Date: Sat, 5 Oct 2019 17:41:13 +0100
Subject: [PATCH 06/10] fix typo on purge package blocks

---
 builder/pwnagotchi.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index d2263a8..77a5cdf 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -47,7 +47,7 @@
       name: "{{ packages }}"
       state: absent
       purge: yes
-    var:
+    vars:
       packages:
         - rasberrypi-net-mods
         - dhcpcd5

From 6ce522a2619caa4882bc11e76f7731df2a5e45d7 Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Sat, 5 Oct 2019 18:49:57 +0200
Subject: [PATCH 07/10] releasing v1.0.0plz3

---
 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
index c894d45..dd6c38a 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py
@@ -1,6 +1,6 @@
 import subprocess
 
-version = '1.0.0plz2'
+version = '1.0.0plz3'
 
 _name = None
 

From 7cc82bccb856b8d7773c16373d70c8f16afd32b5 Mon Sep 17 00:00:00 2001
From: swedishmike <mike@swedishmike.org>
Date: Sat, 5 Oct 2019 18:11:05 +0100
Subject: [PATCH 08/10] More documentation updates for languages

---
 docs/configure.md                        | 1 +
 sdcard/rootfs/root/pwnagotchi/config.yml | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/docs/configure.md b/docs/configure.md
index d69bc9a..d2bb0f5 100644
--- a/docs/configure.md
+++ b/docs/configure.md
@@ -41,6 +41,7 @@ For instance, you can change `main.lang` to one of the supported languages:
 - italian
 - french
 - russian
+- swedish
 
 ## Display Selection
 
diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml
index ae470ad..a93a7e8 100644
--- a/sdcard/rootfs/root/pwnagotchi/config.yml
+++ b/sdcard/rootfs/root/pwnagotchi/config.yml
@@ -1,6 +1,6 @@
 # main algorithm configuration
 main:
-    # currently implemented: en (default), de, el, fr, it, mk, nl, se
+    # currently implemented: en (default), de, el, fr, it, mk, nl, ru, se
     lang: en
     # custom plugins path, if null only default plugins with be loaded
     custom_plugins:

From 75b1e78e399ec641e3b36a3a1ee39a5c91731336 Mon Sep 17 00:00:00 2001
From: dadav <33197631+dadav@users.noreply.github.com>
Date: Sat, 5 Oct 2019 18:51:20 +0200
Subject: [PATCH 09/10] Refracture ansible playbook

---
 builder/pwnagotchi.yml | 270 ++++++++++++++++++++---------------------
 1 file changed, 133 insertions(+), 137 deletions(-)

diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml
index 77a5cdf..a8dca14 100644
--- a/builder/pwnagotchi.yml
+++ b/builder/pwnagotchi.yml
@@ -3,29 +3,135 @@
     - 127.0.0.1
   become: yes
   vars:
-    pwn_hostname: "{{ lookup('env', 'PWN_HOSTNAME') | default('pwnagotchi', true) }}"
-    pwn_version: "{{ lookup('env', 'PWN_VERSION') | default('master', true) }} "
-    bettercap_query: "assets[?contains(name, 'armv6l')].browser_download_url"
+    pwnagotchi:
+      hostname: "{{ lookup('env', 'PWN_HOSTNAME') | default('pwnagotchi', true) }}"
+      version: "{{ lookup('env', 'PWN_VERSION') | default('master', true) }} "
+    system:
+      boot_options:
+        - "dtoverlay=dwc2"
+        - "dtparam=spi=on"
+        - "dtoverlay=spi1-3cs"
+        - "dtoverlay=pi3-disable-bt"
+        - "dtparam=audio=off"
+    services:
+      enable:
+        - dphys-swapfile.service
+        - getty@ttyGS0.service
+      disable:
+        - apt-daily.timer
+        - apt-daily.service
+        - apt-daily-upgrade.timer
+        - apt-daily-upgrade.service
+        - wpa_supplicant.service
+        - bluetooth.service
+        - triggerhappy.service
+        - ifup@wlan0.service
+    packages:
+      pip:
+        install:
+          - inky
+          - smbus2
+          - absl-py>=0.1.6
+          - enum34
+          - gast==0.2.2
+          - google_pasta
+          - opt_einsum
+          - scapy
+          - gym
+          - keras_applications>=1.0.6
+          - keras_preprocessing>=1.0.5
+          - stable-baselines
+          - file_read_backwards
+          - tensorflow_estimator>=1.14.0,<1.15.0
+          - tensorboard>=1.13.0,<1.14.0
+      apt:
+        remove:
+          - rasberrypi-net-mods
+          - dhcpcd5
+          - triggerhappy
+          - wpa_supplicant
+          - nfs-common
+        install:
+          - vim
+          - screen
+          - golang
+          - git
+          - build-essential
+          - python3-pip
+          - unzip
+          - gawk
+          - libopenmpi-dev
+          - libatlas-base-dev
+          - libjasper-dev
+          - libqtgui4
+          - libqt4-test
+          - libopenjp2-7
+          - tcpdump
+          - lsof
+          - libilmbase23
+          - libopenexr23
+          - libgstreamer1.0-0
+          - libavcodec58
+          - libavformat58
+          - libswscale5
+          - libpcap-dev
+          - libusb-1.0-0-dev
+          - libnetfilter-queue-dev
+          - dphys-swapfile
+          - kalipi-kernel
+          - kalipi-bootloader
+          - kalipi-re4son-firmware
+          - kalipi-kernel-headers
+          - libraspberrypi0
+          - libraspberrypi-dev
+          - libraspberrypi-doc
+          - libraspberrypi-bin
+          - fonts-dejavu
+          - fonts-dejavu-core
+          - fonts-dejavu-extra
+          - python3-crypto
+          - python3-requests
+          - python3-yaml
+          - python3-smbus
+          - python3-inkyphat
+          - python3-numpy
+          - python3-pil
+          - python3-tweepy
+          - python3-opencv
+          - python3-termcolor
+          - python3-astor
+          - python3-backports.weakref
+          - python3-h5py
+          - python3-six
+          - python3-protobuf
+          - python3-wrapt
+          - python3-wheel
+          - python3-mock
+          - python3-scipy
+          - python3-cloudpickle
+
+    bettercap:
+      query: "assets[?contains(name, 'armv6l')].browser_download_url"
 
   tasks:
 
   - name: selected hostname
     debug:
-      msg: "{{ pwn_hostname }}"
+      msg: "{{ pwnagotchi.hostname }}"
 
   - name: build version
     debug:
-      msg: "{{ pwn_version }}"
+      msg: "{{ pwnagotchi.version }}"
 
   - name: change hostname
     hostname:
-      name: "{{pwn_hostname}}"
+      name: "{{pwnagotchi.hostname}}"
 
   - name: add hostname to /etc/hosts
     lineinfile:
       dest: /etc/hosts
       regexp: '^127\.0\.0\.1[ \t]+localhost'
-      line: '127.0.0.1 localhost {{pwn_hostname}} {{pwn_hostname}}.local'
+      line: '127.0.0.1 localhost {{pwnagotchi.hostname}} {{pwnagotchi.hostname}}.local'
       state: present
 
   - name: Add re4son-kernel repo key
@@ -44,16 +150,9 @@
 
   - name: remove unecessary apt packages
     apt:
-      name: "{{ packages }}"
+      name: "{{ packages.apt.remove }}"
       state: absent
       purge: yes
-    vars:
-      packages:
-        - rasberrypi-net-mods
-        - dhcpcd5
-        - triggerhappy
-        - wpa_supplicant
-        - nfs-common
 
   - name: upgrade apt distro
     apt:
@@ -61,126 +160,22 @@
 
   - name: install packages
     apt:
-      name: "{{ packages }}"
+      name: "{{ packages.apt.install }}"
       state: present
-    vars:
-      packages:
-        - vim
-        - screen
-        - golang
-        - git
-        - build-essential
-        - python3-pip
-        - unzip
-        - gawk
-        - libopenmpi-dev
-        - libatlas-base-dev
-        - libjasper-dev
-        - libqtgui4
-        - libqt4-test
-        - libopenjp2-7
-        - tcpdump
-        - lsof
-        - libilmbase23
-        - libopenexr23
-        - libgstreamer1.0-0
-        - libavcodec58
-        - libavformat58
-        - libswscale5
-        - libpcap-dev
-        - libusb-1.0-0-dev
-        - libnetfilter-queue-dev
-        - dphys-swapfile
-        - kalipi-kernel
-        - kalipi-bootloader
-        - kalipi-re4son-firmware
-        - kalipi-kernel-headers
-        - libraspberrypi0
-        - libraspberrypi-dev
-        - libraspberrypi-doc
-        - libraspberrypi-bin
-        - fonts-dejavu
-        - fonts-dejavu-core
-        - fonts-dejavu-extra
-        - python3-crypto
-        - python3-requests
-        - python3-yaml
-        - python3-smbus
-        - python3-inkyphat
-        - python3-numpy
-        - python3-pil
-        - python3-tweepy
-        - python3-opencv
-        - python3-termcolor
-        - python3-astor
-        - python3-backports.weakref
-        - python3-h5py
-        - python3-six
-        - python3-protobuf
-        - python3-wrapt
-        - python3-wheel
-        - python3-mock
-        - python3-scipy
-        - python3-cloudpickle
 
   - name: configure dphys-swapfile
     file:
       path: /etc/dphys-swapfile
       content: "CONF_SWAPSIZE=1024"
 
-  - name: disable unecessary services
-    systemd:
-      name: "{{services}}"
-      state: stopped
-      enabled: no
-    vars:
-      services:
-        - apt-daily.timer
-        - apt-daily.service
-        - apt-daily-upgrade.timer
-        - apt-daily-upgrade.service
-        - wpa_supplicant.service
-        - bluetooth.service
-        - triggerhappy.service
-        - ifup@wlan0.service
-
-  - name: enable dphys-swapfile service
-    systemd:
-      name: dphys-swapfile.service
-      state: started
-      enabled: yes
-
-  - name: enable gadget serial port service
-    systemd:
-      name: getty@ttyGS0.service
-      state: started
-      enabled: yes
-
   - name: acquire python3 pip target
     command: "python3 -c 'import sys;print(sys.path.pop())'"
     register: pip_target
 
   - name: install pip packages
     pip:
-      name: "{{ packages }}"
+      name: "{{packages.pip.install}}"
       extra_args: "--no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --prefer-binary --no-cache-dir --platform=armv6l --target={{ pip_target.stdout }}"
-    vars:
-      packages:
-        - inky
-        - smbus2
-        - absl-py>=0.1.6
-        - enum34
-        - gast==0.2.2
-        - google_pasta
-        - opt_einsum
-        - scapy
-        - gym
-        - keras_applications>=1.0.6
-        - keras_preprocessing>=1.0.5
-        - stable-baselines
-        - file_read_backwards
-        - tensorflow_estimator>=1.14.0,<1.15.0
-        - tensorboard>=1.13.0,<1.14.0
 
   - name: install grpcio
     command: "pip3 install --no-deps --extra-index-url=https://www.piwheels.hostedpi.com/simple/ --no-cache-dir --prefer-binary --platform=armv6l --only-binary=:all: --target={{ pip_target.stdout }} https://www.piwheels.hostedpi.com/simple/grpcio/grpcio-1.24.1-cp37-cp37m-linux_armv6l.whl"
@@ -196,7 +191,7 @@
 
   - name: download and install bettercap
     unarchive:
-      src: "{{ bettercap_release.content | from_json | json_query(bettercap_query) | first }}"
+      src: "{{ bettercap_release.content | from_json | json_query(bettercap.query) | first }}"
       dest: /usr/bin
       remote_src: yes
       exclude:
@@ -324,11 +319,7 @@
       insertafter: EOF
       line: '{{ item }}'
     with_items:
-      - "dtoverlay=dwc2"
-      - "dtparam=spi=on"
-      - "dtoverlay=spi1-3cs"
-      - "dtoverlay=pi3-disable-bt"
-      - "dtparam=audio=off"
+      - "{{system.boot_options}}"
 
   - name: change root partition
     replace:
@@ -356,7 +347,7 @@
   - name: configure motd
     copy:
       dest: /etc/motd
-      content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})"
+      content: "(◕‿‿◕) {{pwnagotchi.hostname}} (pwnagotchi-{{pwnagotchi.version}})"
 
   - name: clean apt cache
     apt:
@@ -366,16 +357,21 @@
     apt:
       autoremove: yes
 
+  - name: enable services
+    systemd:
+      name: "{{services.enable}}"
+      state: started
+      enabled: yes
+
+  - name: disable unecessary services
+    systemd:
+      name: "{{services.disable}}"
+      state: stopped
+      enabled: no
+
   - name: remove ssh keys
     file:
       state: absent
       path: "{{item}}"
-    with_items:
-      - /etc/ssh/ssh_host_rsa_key
-      - /etc/ssh/ssh_host_rsa_key.pub
-      - /etc/ssh/ssh_host_dsa_key
-      - /etc/ssh/ssh_host_dsa_key.pub
-      - /etc/ssh/ssh_host/ecdsa_key
-      - /etc/ssh/ssh_host/ecdsa_key.pub
-      - /etc/ssh/ssh_host_ed25519_key
-      - /etc/ssh/ssh_host_ed25519_key.pub
+    with_fileglob:
+      - "/etc/ssh/ssh_host*_key*"

From 006c6f30bc482a45e7357c38e32269fefb12247c Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Sat, 5 Oct 2019 20:14:18 +0200
Subject: [PATCH 10/10] docs: documented NN wifi card portability (fixes #145)

---
 docs/install.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/docs/install.md b/docs/install.md
index 6902979..203a38f 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -2,6 +2,9 @@
 
 The project has been developed to run on a Raspberry Pi 0 W configured as an [USB Ethernet gadget](https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/ethernet-gadget) device in order to connect to it via USB. However, given the proper configuration tweaks, any GNU/Linux computer with a WiFi interface that supports monitor mode could be used.
 
+*An important note about the AI:* a network trained with a specific WiFi interface will only work with another interface if it supports 
+the same exact WiFi channels of the first one. For instance, you can not use a neural network trained on a Raspberry Pi Zero W (that only supports 2.4Ghz channels) with a 5Ghz antenna, but you'll need to train one from scratch for those channels.
+
 ## Required Hardware
 
 - [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/).