From db5b9a3faeb3c25417a1e02e970c6267574ca856 Mon Sep 17 00:00:00 2001 From: darumaseye Date: Wed, 2 Oct 2019 17:24:41 +0200 Subject: [PATCH 01/62] Improved IT translation --- .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 4132 -> 3755 bytes .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 203 +++++++++--------- 2 files changed, 105 insertions(+), 98 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo index 038f502396ed0fadd68d779b6667f52c931b8329..465dfc3dede76427c355ac24f24abaa7b52516fe 100644 GIT binary patch delta 1789 zcmZ9LPiP!f9LHbV{AnheMq{FFO_MjNHr=LdnxZIat=1%3#KfqGR1kcfo$fx|nOSFM zx7ZN2Af*>iPVL2m9x6yZh*Z!0KzE6ip#J9@~dBX(JcH0#f9DM5`~LUl)nO{va?Xb_n;)c z3irWpp(MNmW&fXWFYMjf5ul+6o`JjI2{?eu%d$>>^*a7e!85P~FG30URX%?Uihz4i ztSwO1LAV4(NC-vnMOc6toPeJ|5%>d?#J|Ep_y-in{)Vlec^P7M4&H{6sFx@rUEQ!105HC`>ob3+jl@Ymr8T4Q~AXlOu z;gQCZAyrFYxgHw6ZCepaL&*?vVs&@WqwTAZZ@Hp}d8ATtRSFQXQm_oU8g*QL81$aX z|8Z)Xcd=ir6e#HcSm`2)*LTBw<)uih-*&eF7Q$N}T|v0p-_OsiA=yLmom z(KeA_O%Q1lSkJn$cv#z-_DpE9XmF|++prRw^VXEwvE9{9G`)H*G?ggzs@8QDOl-Yu zV{l?G$`vcxk1LT*8Ucr@z78X6J}AtO*(9++(>lXmG%+l;c+!emx2%x1c8bo3NL zLXRUh#FjKR_>CT(fswJ^vF>3l0$MLYtUiWGBDi#^fvm!t{b(=&ri;_A)^SoMITOnzrD>m2UbVO`* zK;pWtTJf{XyWSdo8TFf=aj!mc%2vmIYO}uKL(fTT=rexJ>4ec`zg9Cku*PXxOpp+- zRRc+9%4OT_lf!}4LEH7%Sk|)g@c!YGN!?E|KbM$&G+cZ!;U=d^+$pW3P7|Tsx6+Q% WTF!rWwCl=OIF@)(P&b|SR{sKhjA6Y1 delta 2190 zcmZ{jO>7la6vuC&g)+58KCCE3?pQ?HK3-oDl@HNi2_FXV3A%uVay#$RUU+ZjIWw(&tU@v^7wf-)=oB0K} z5nhJk?{~Njc62DE;gfI`dWRO>1B;6u-mJgZtoecmyuxd^N^{&%!AvAD)4^5>PY042R%#D1r8L zHZ$mh@?8mPcnC@WAzTMvh2rl6C>ehR?}t~R1abqe;CywHhaR{Tok>ddLdmEP%K9)o z(uQc? z_yFv;P#io5ABLykdiW+R!i!K8`W1>2e?yVBlfo8YKa_yW(1#X^zt^A~d=^Te z7nh?yYN@NO7e7LLsXw5U;ug%C2|Wo~^+GC<_XEgP5{gNH64VBnU=K3nkO7%sMTR6p z6?65ZM60C!(kzP@tsAF?c@`DK?qi5_lAQ!3!D@z>C?_TvNg2f?OEKck6_xBaG5Q&j z0IilAz1%EmiHFS$sh`+J23Iz(vnU~Qib*3;=6_rE#p1)e_E^(MCv2Fyz@#o5_hxG* zm{a?rRL_Qu+MJ#+VI`R`r)}b?{U$iA`C6B&CbX%4X-)gbi~K{=I*47(YM1cRq&hn3 z1&!E6iA$$-u~@uxdC94^jmKwZ_|51|vxyCoxnw}e^tk-xFY@V3HrN^M9ML0Nca%y) zr7fkBchDs1=I3J*CRLM0@ecjy#MVk_YOFM^pV+c(WcwpqO52C-tYud_`?F6wKcC;7 zBvIf@95`*f*(u_hQ%~E_7PJ`~bEXzG^Yg++H0c(yoUKQrnU- zNl7ybou_sapA^RElLoOGq0wI5B#9j#=X*rm*D!H~evEKUE0DrMGwn4gp)`B8SyNMU z0bUQ>i9(O)y0!E1!qV*xEXRo|^GDhTjjlOEp{jMGuY5#$o+St(YIb!?SBJ!o5b8G8 z&6ak#kcVlgNRK;-ub?Fqe3^ih3wg6Gak@SgCRty1W#wpItJH+35!=-He)d-P;MSTO zud?5IO)t7)tLQI5Nez7U!bDAu@=T@TZZ}!h-qXMOK&X+yCMK^*e$QO?SkJ%-(m*#V kQB=p+kzWU2Zk$}d+bX*MzLKihrrsSNd77<7vKP(%0dSAbd;kCd diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po index da7383a..f84e16c 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po @@ -1,51 +1,50 @@ -# pwnigotchi voice data +# pwnaigotchi voice data # Copyright (C) 2019 # This file is distributed under the same license as the pwnagotchi package. -# 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019. +# FIRST AUTHOR 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 14:15+0200\n" -"PO-Revision-Date: 2019-10-01 14:00+0200\n" -"Last-Translator: 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>\n" +"POT-Creation-Date: 2019-10-02 16:38+0000\n" +"PO-Revision-Date: 2019-10-02 17:20+0000\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:18 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" -msgstr "ZzzzZZzzzzZzzz" +msgstr "" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:23 +#: voice.py:23 msgid "" "Hi, I'm Pwnagotchi!\n" "Starting ..." msgstr "" -"Ciao, sono Pwnagotchi!\n" -"Avviamento ..." +"Ciao!" +"Piacere Pwnagotchi!\n" +"Caricamento ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:24 +#: voice.py:24 msgid "" "New day, new hunt,\n" "new pwns!" msgstr "" -"Nuovo giorno, nuova caccia,\n" -"nuovi pwns!" +"Nuovo giorno...\n" +"nuovi handshakes!!!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:25 +#: voice.py:25 msgid "Hack the Planet!" -msgstr "Hack il pianeta!" +msgstr "" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:30 +#: voice.py:30 msgid "AI ready." msgstr "IA pronta." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:31 +#: voice.py:31 msgid "" "The neural network\n" "is ready." @@ -53,7 +52,7 @@ msgstr "" "La rete neurale\n" "è pronta." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:41 +#: voice.py:41 #, python-brace-format msgid "" "Hey, channel {channel} is\n" @@ -62,71 +61,72 @@ msgid "" msgstr "" "Hey, il canale {channel} è\n" "libero! Il tuo AP\n" -"dirà grazie." +"ringrazia." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:46 +#: voice.py:46 msgid "I'm bored ..." -msgstr "Sono annoiato ..." +msgstr "Che noia ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:47 +#: voice.py:47 msgid "Let's go for a walk!" -msgstr "Andiamo a fare una \npasseggiata!" +msgstr "" +"Andiamo a fare una\n" +"passeggiata!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:51 +#: voice.py:51 msgid "" "This is the best\n" "day of my life!" msgstr "" -"Questo è il migliore\n" -"giorno della mia vita!" +"Questo è il più bel\n" +"giorno della mia\n" +"vita!!!!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:55 +#: voice.py:55 msgid "Shitty day :/" msgstr "Giorno di merda :/" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:60 +#: voice.py:60 msgid "I'm extremely bored ..." msgstr "" "Sono estremamente\n" "annoiato ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:61 +#: voice.py:61 msgid "I'm very sad ..." -msgstr "Sono molto triste ..." +msgstr "Sono molto triste..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:62 +#: voice.py:62 msgid "I'm sad" msgstr "Sono triste" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:68 +#: voice.py:68 msgid "I'm living the life!" -msgstr "Sto vivendo la vita!" +msgstr "Mi sento vivo!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:69 +#: voice.py:69 msgid "I pwn therefore I am." -msgstr "Possiedo quindi sono." +msgstr "Pwn ergo sum." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:70 +#: voice.py:70 msgid "So many networks!!!" -msgstr "Così tante reti!!!" +msgstr "Qui è pieno di reti!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:71 +#: voice.py:71 msgid "" "I'm having so much\n" "fun!" msgstr "" "Mi sto divertendo\n" -"tanto!" +"tantissimo!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:72 +#: voice.py:72 msgid "" "My crime is that of\n" "curiosity ..." msgstr "" -"La mia colpa è di\n" -"essere curioso ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:77 +#: voice.py:77 #, python-brace-format msgid "" "Hello\n" @@ -135,9 +135,9 @@ msgid "" msgstr "" "Ciao\n" "{name}!\n" -"Piacere di conoscerti. {name}" +"E' un piacere. {name}" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:78 +#: voice.py:78 #, python-brace-format msgid "" "Unit\n" @@ -148,27 +148,28 @@ msgstr "" "{name}\n" "è vicina! {name}" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:83 +#: voice.py:83 #, python-brace-format msgid "" "Uhm ...\n" "goodbye\n" "{name}" msgstr "" -"Uhm ...\n" +"Uhm ..." "addio\n" -"{name}" +"{name}," +"mi mancherai..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:84 +#: voice.py:84 #, python-brace-format msgid "" "{name}\n" "is gone ..." msgstr "" "{name}\n" -"è andato ..." +"se n'è andato ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:89 +#: voice.py:89 #, python-brace-format msgid "" "Whoops ...\n" @@ -177,22 +178,24 @@ msgid "" msgstr "" "Whoops ...\n" "{name}\n" -"è andato." +"se n'è andato." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:90 +#: voice.py:90 #, python-brace-format msgid "" "{name}\n" "missed!" msgstr "" "{name}\n" -"perso!" +"è scomparso..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:91 +#: voice.py:91 msgid "Missed!" -msgstr "Perso!" +msgstr "" +"Ehi!\n" +"Dove sei andato!?" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:96 +#: voice.py:96 msgid "" "Nobody wants to\n" "play with me ..." @@ -200,39 +203,44 @@ msgstr "" "Nessuno vuole\n" "giocare con me..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:97 +#: voice.py:97 msgid "I feel so alone ..." -msgstr "Mi sento così solo ..." +msgstr "Mi sento così solo..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:98 +#: voice.py:98 msgid "Where's everybody?!" msgstr "Dove sono tutti?!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:103 +#: voice.py:103 #, python-brace-format msgid "Napping for {secs}s ..." -msgstr "Pisolino per {secs}i ..." +msgstr "" +"Schiaccio un \n" +"pisolino per {secs}s ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:104 +#: voice.py:104 msgid "Zzzzz" -msgstr "Zzzzz" +msgstr "" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:105 +#: voice.py:105 #, python-brace-format msgid "ZzzZzzz ({secs}s)" -msgstr "ZzzZzzz ({secs}i)" +msgstr "" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:114 +#: voice.py:114 #, python-brace-format msgid "Waiting for {secs}s ..." -msgstr "In attesa di {secs}i ..." +msgstr "Aspetto {secs}s ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:116 +#: voice.py:116 #, python-brace-format msgid "Looking around ({secs}s)" -msgstr "Guardando intorno ({secs}s)" +msgstr "" +"Do uno sguardo" +"qui intorno..." +"({secs}s)" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:123 +#: voice.py:123 #, python-brace-format msgid "" "Hey\n" @@ -241,18 +249,19 @@ msgid "" msgstr "" "Hey\n" "{what}\n" -"diventiamo amici!" +"Diventiamo amici!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:124 +#: voice.py:124 #, python-brace-format msgid "" "Associating to\n" "{what}" msgstr "" -"Associarci a\n" +"Collegamento con\n" "{what}" +"in corso..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:125 +#: voice.py:125 #, python-brace-format msgid "" "Yo\n" @@ -261,7 +270,7 @@ msgstr "" "Yo\n" "{what}!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:130 +#: voice.py:130 #, python-brace-format msgid "" "Just decided that\n" @@ -273,16 +282,14 @@ msgstr "" "non necessita di\n" "WiFi!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:131 +#: voice.py:131 #, python-brace-format msgid "" "Deauthenticating\n" "{mac}" msgstr "" -"Dissociarci da\n" -"{mac}" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:132 +#: voice.py:132 #, python-brace-format msgid "" "Kickbanning\n" @@ -292,16 +299,16 @@ msgstr "" "a calci\n" "{mac}!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:137 +#: voice.py:137 #, python-brace-format msgid "" "Cool, we got {num}\n" "new handshake{plural}!" msgstr "" "Bene, abbiamo {num}\n" -"nuovi handshake{plural}!" +"handshake{plural} in più!" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:141 +#: voice.py:141 msgid "" "Ops, something\n" "went wrong ...\n" @@ -311,37 +318,37 @@ msgstr "" "è andato storto ...\n" "Riavvio ..." -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:145 +#: voice.py:145 #, python-brace-format msgid "Kicked {num} stations\n" -msgstr "Calciate {num} stazioni\n" +msgstr "{num} stazioni pestate\n" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:146 +#: voice.py:146 #, python-brace-format msgid "Made {num} new friends\n" -msgstr "Fatti {num} nuovi amici\n" +msgstr "{num} nuovi amici\n" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:147 +#: voice.py:147 #, python-brace-format msgid "Got {num} handshakes\n" -msgstr "Presi {num} handshakes\n" +msgstr "{num} handshakes presi\n" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:149 +#: voice.py:149 msgid "Met 1 peer" -msgstr "Incontrato 1 peer" +msgstr "1 peer incontrato" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:151 +#: voice.py:151 #, python-brace-format msgid "Met {num} peers" -msgstr "Incontrati {num} peers" +msgstr "{num} peers incontrati" -#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:156 +#: voice.py:156 #, 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 "" -"Ho lavorato per {duration} e preso a calci i clienti di {deauthed}! Ho anche " -"incontrato{associate} nuovi amici e ho mangiato {handshakes} handshakes! " -"#pwnagotchi#pwnlog #pwnlife #hacktheplanet #skynet" +"Ho lavorato per {duration} e preso a calci {deauthed} clients! Ho anche " +"incontrato {associate} nuovi amici e ho mangiato {handshakes} handshakes! " +"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet" From 610bd46572ee9aaeef397580c19ceff131dc3ea4 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 16:40:58 +0100 Subject: [PATCH 02/62] initial packer/ansible base builder --- .travis.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index a62fa93..b7167a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,28 @@ dist: bionic -language: generic +language: go +go: + - 1.x + env: global: - LANG=C - LC_ALL=C + before_cache: - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete + cache: apt: true directories: - tmp/ + before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools +- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx - sudo update-binfmts --display -- unset GOROOT + script: -- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img -- zip -s 2g pwnagotchi.zip pwnagotchi.img +- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" # TODO: deploy! From a3e149420b5984e1b1deba8151d10e230eda631a Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 16:42:28 +0100 Subject: [PATCH 03/62] initial packer/ansible base builder --- Makefile | 22 +++ builder/pwnagotchi.json | 26 ++++ builder/pwnagotchi.yml | 289 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+) create mode 100644 Makefile create mode 100644 builder/pwnagotchi.json create mode 100644 builder/pwnagotchi.yml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e71c5b8 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +PWN_HOSTNAME="pwnagotchi" +PWN_VERSION="master" + +all: install image clean + +install: + @curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip + @unzip /tmp/packer.zip -d /tmp + @mv /tmp/packer /usr/bin/packer + @git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image + @cd /tmp/packer-builder-arm-image && go build + @cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin + +image: + @cd builder && sudo packer build pwnagotchi.json + @mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img + @zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img + +clean: + @rm -rf /tmp/packer-builder-arm-image + @rm -f pwnagotchi-raspbian-lite.img + @rm -rf builder/output-pwnagotchi builder/packer_cache diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json new file mode 100644 index 0000000..c78629e --- /dev/null +++ b/builder/pwnagotchi.json @@ -0,0 +1,26 @@ +{ + "variables": { + "home": "{{env `HOME`}}" + }, + "builders": [{ + "name": "pwnagotchi", + "type": "arm-image", + "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip", + "iso_checksum_type":"sha256", + "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e", + "last_partition_extra_size" : 3221225472 + }], + "provisioners": [ + { + "type": "shell", + "inline": [ + "apt-get -y update", + "apt-get install -y ansible" + ] + }, + { + "type":"ansible-local", + "playbook_file": "pwnagotchi.yml" + } + ] +} diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml new file mode 100644 index 0000000..0672002 --- /dev/null +++ b/builder/pwnagotchi.yml @@ -0,0 +1,289 @@ +--- +- hosts: + - 127.0.0.1 + become: yes + vars: + pwn_hostname: "pwnagotchi" + pwn_version: "master" + + tasks: + + - name: selected hostname + debug: + msg: "{{ pwn_hostname }}" + + - name: build version + debug: + msg: "{{ pwn_version }}" + + - name: change hostname + hostname: + name: "{{pwn_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' + state: present + + - name: Add re4son-kernel repo key + apt_key: + url: https://re4son-kernel.com/keys/http/archive-key.asc + state: present + + - name: Add re4son-kernel repository + apt_repository: + repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main + state: present + + - name: update apt package cache + apt: + update_cache: yes + + - name: upgrade apt distro + apt: + upgrade: dist + + - name: install packages + apt: + name: "{{ packages }}" + state: present + vars: + packages: + - vim + - screen + - golang + - git + - build-essential + - python3-pip + - 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 + + - 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 + - bluetooth.service + - triggerhappy.service + + - name: enable dphys-swapfile service + systemd: + name: dphys-swapfile.service + state: started + enabled: yes + + - name: build bettercap + command: go get -u github.com/bettercap/bettercap + environment: + GOPATH: /root/go + + - name: install bettercap + copy: + src: /root/go/bin/bettercap + dest: /usr/bin/bettercap + mode: 0755 + + - name: clone bettercap caplets + git: + repo: https://github.com/bettercap/caplets.git + dest: /tmp/caplets + + - name: install bettercap caplets + make: + chdir: /tmp/caplets + target: install + + - name: clone pwnagotchi repository + git: + repo: https://github.com/evilsocket/pwnagotchi.git + dest: /tmp/pwnagotchi + + - name: copy pwnagotchi files to final destination + copy: + src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/ + dest: /root/pwnagotchi/ + mode: preserve + + - name: remove pwnagotchi files from temporary repository + file: + 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 + mode: 0755 + content: | + #!/usr/bin/env bash + while true + do + top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }' + sleep 3 + done + + - name: create memusage script + copy: + dest: /usr/bin/memusage + mode: 0755 + content: | + #!/usr/bin/env + free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }' + + - name: create monstart script + copy: + dest: /usr/bin/monstart + mode: 0755 + content: | + #!/usr/bin/env bash + iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up + + - name: create monstop script + copy: + dest: /usr/bin/monstop + mode: 0755 + content: | + #!/usr/bin/env bash + ifconfig mon0 down && iw dev mon0 del + + - name: configure rc.local + blockinfile: + path: /etc/rc.local + insertbefore: "exit 0" + block: | + if ! /opt/vc/bin/tvservice -s | grep HDMI; then + /opt/vc/bin/tvservice -o + fi + /root/pwnagotchi/scripts/startup.sh & + + - name: configure usb interface + blockinfile: + path: /etc/network/interfaces.d/usb0.cfg + create: yes + block: | + allow-hotplug usb0 + iface usb0 inet static + address 10.0.0.2 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + gateway 10.0.0.1 + + - name: configure eth0 interface (pi2/3/4) + blockinfile: + path: /etc/network/interfaces.d/eth0.cfg + create: yes + block: | + allow-hotplug eth0 + iface eth0 inet dhcp + + - name: enable ssh on boot + file: + path: /boot/ssh + state: touch + + - name: adjust /boot/config.txt + lineinfile: + dest: /boot/config.txt + insertafter: EOF + line: '{{ item }}' + with_items: + - "dtoverlay=dwc2" + - "dtparam=spi=on" + - "dtoverlay=spi1-3cs" + - "dtoverlay=pi3-disable-bt" + - "dtparam=audio=off" + + - name: change root partition + replace: + dest: /boot/cmdline.txt + backup: no + regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+" + replace: "root=/dev/mmcblk0p2" + + - name: configure /boot/cmdline.txt + lineinfile: + path: /boot/cmdline.txt + backrefs: True + state: present + backup: no + regexp: '(.*)$' + line: '\1 modules-load=dwc2,g_ether' + + - name: configure ssh + lineinfile: + dest: /etc/ssh/sshd_config + backup: no + regexp: '#?PermitRootLogin (.*)$' + line: 'PermitRootLogin yes' + + - name: configure motd + copy: + dest: /etc/motd + content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})" + + - name: clean apt cache + apt: + autoclean: yes + + - name: remove dependencies that are no longer required + apt: + autoremove: yes + + - 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 From f7ef846d679b48af9d68175ae487aa24d604747f Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 16:46:22 +0100 Subject: [PATCH 04/62] try adding golang to apt --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b7167a6..98f2dd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ cache: before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx +- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang - sudo update-binfmts --display script: From 88fcd399ac93125f4df497645bf550f3950aea95 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 16:51:13 +0100 Subject: [PATCH 05/62] add go get --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e71c5b8..b81990b 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ install: @unzip /tmp/packer.zip -d /tmp @mv /tmp/packer /usr/bin/packer @git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image - @cd /tmp/packer-builder-arm-image && go build + @cd /tmp/packer-builder-arm-image && go get -d ./... && go build @cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin image: From 4664790cc508dc4061785e54673a7391e7bd022d Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:01:58 +0100 Subject: [PATCH 06/62] remove golang from apt --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 98f2dd2..b7167a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ cache: before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang +- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx - sudo update-binfmts --display script: From 894e8de2900ff7c38998bb056d7e9f5d3f560d98 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:11:31 +0100 Subject: [PATCH 07/62] try with generic image --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index b7167a6..0366e05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,5 @@ dist: bionic -language: go -go: - - 1.x +language: generic env: global: @@ -19,7 +17,7 @@ cache: before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx +- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang - sudo update-binfmts --display script: From 911c0478ba7e7bed6f268445ad1ca3e56e212cb2 Mon Sep 17 00:00:00 2001 From: Jeroen Massar Date: Wed, 2 Oct 2019 18:15:52 +0200 Subject: [PATCH 08/62] Fix initial non-existent/empty log issue Fixes bug where on initial session there is no file, and thus no lines are read and one thus gets a index out of bounds error as lines is empty... --- sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py index d66008d..edf66ed 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/log.py @@ -160,6 +160,9 @@ class SessionParser(object): break lines.reverse() + if len(lines) == 0: + lines.append("Initial Session"); + self.last_session = lines self.last_session_id = hashlib.md5(lines[0].encode()).hexdigest() self.last_saved_session_id = self._get_last_saved_session_id() From e8f126b4085002f8f30ce80c3105d6123b6e4fde Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:21:41 +0100 Subject: [PATCH 09/62] Revert "initial packer/ansible base builder" --- .travis.yml | 11 +- Makefile | 22 --- builder/pwnagotchi.json | 26 ---- builder/pwnagotchi.yml | 289 ---------------------------------------- 4 files changed, 4 insertions(+), 344 deletions(-) delete mode 100644 Makefile delete mode 100644 builder/pwnagotchi.json delete mode 100644 builder/pwnagotchi.yml diff --git a/.travis.yml b/.travis.yml index 0366e05..a62fa93 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,26 +1,23 @@ dist: bionic language: generic - env: global: - LANG=C - LC_ALL=C - before_cache: - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete - cache: apt: true directories: - tmp/ - before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx golang +- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools - sudo update-binfmts --display - +- unset GOROOT script: -- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" +- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img +- zip -s 2g pwnagotchi.zip pwnagotchi.img # TODO: deploy! diff --git a/Makefile b/Makefile deleted file mode 100644 index b81990b..0000000 --- a/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -PWN_HOSTNAME="pwnagotchi" -PWN_VERSION="master" - -all: install image clean - -install: - @curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip - @unzip /tmp/packer.zip -d /tmp - @mv /tmp/packer /usr/bin/packer - @git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image - @cd /tmp/packer-builder-arm-image && go get -d ./... && go build - @cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin - -image: - @cd builder && sudo packer build pwnagotchi.json - @mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img - @zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img - -clean: - @rm -rf /tmp/packer-builder-arm-image - @rm -f pwnagotchi-raspbian-lite.img - @rm -rf builder/output-pwnagotchi builder/packer_cache diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json deleted file mode 100644 index c78629e..0000000 --- a/builder/pwnagotchi.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "variables": { - "home": "{{env `HOME`}}" - }, - "builders": [{ - "name": "pwnagotchi", - "type": "arm-image", - "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip", - "iso_checksum_type":"sha256", - "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e", - "last_partition_extra_size" : 3221225472 - }], - "provisioners": [ - { - "type": "shell", - "inline": [ - "apt-get -y update", - "apt-get install -y ansible" - ] - }, - { - "type":"ansible-local", - "playbook_file": "pwnagotchi.yml" - } - ] -} diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml deleted file mode 100644 index 0672002..0000000 --- a/builder/pwnagotchi.yml +++ /dev/null @@ -1,289 +0,0 @@ ---- -- hosts: - - 127.0.0.1 - become: yes - vars: - pwn_hostname: "pwnagotchi" - pwn_version: "master" - - tasks: - - - name: selected hostname - debug: - msg: "{{ pwn_hostname }}" - - - name: build version - debug: - msg: "{{ pwn_version }}" - - - name: change hostname - hostname: - name: "{{pwn_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' - state: present - - - name: Add re4son-kernel repo key - apt_key: - url: https://re4son-kernel.com/keys/http/archive-key.asc - state: present - - - name: Add re4son-kernel repository - apt_repository: - repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main - state: present - - - name: update apt package cache - apt: - update_cache: yes - - - name: upgrade apt distro - apt: - upgrade: dist - - - name: install packages - apt: - name: "{{ packages }}" - state: present - vars: - packages: - - vim - - screen - - golang - - git - - build-essential - - python3-pip - - 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 - - - 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 - - bluetooth.service - - triggerhappy.service - - - name: enable dphys-swapfile service - systemd: - name: dphys-swapfile.service - state: started - enabled: yes - - - name: build bettercap - command: go get -u github.com/bettercap/bettercap - environment: - GOPATH: /root/go - - - name: install bettercap - copy: - src: /root/go/bin/bettercap - dest: /usr/bin/bettercap - mode: 0755 - - - name: clone bettercap caplets - git: - repo: https://github.com/bettercap/caplets.git - dest: /tmp/caplets - - - name: install bettercap caplets - make: - chdir: /tmp/caplets - target: install - - - name: clone pwnagotchi repository - git: - repo: https://github.com/evilsocket/pwnagotchi.git - dest: /tmp/pwnagotchi - - - name: copy pwnagotchi files to final destination - copy: - src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/ - dest: /root/pwnagotchi/ - mode: preserve - - - name: remove pwnagotchi files from temporary repository - file: - 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 - mode: 0755 - content: | - #!/usr/bin/env bash - while true - do - top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }' - sleep 3 - done - - - name: create memusage script - copy: - dest: /usr/bin/memusage - mode: 0755 - content: | - #!/usr/bin/env - free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }' - - - name: create monstart script - copy: - dest: /usr/bin/monstart - mode: 0755 - content: | - #!/usr/bin/env bash - iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up - - - name: create monstop script - copy: - dest: /usr/bin/monstop - mode: 0755 - content: | - #!/usr/bin/env bash - ifconfig mon0 down && iw dev mon0 del - - - name: configure rc.local - blockinfile: - path: /etc/rc.local - insertbefore: "exit 0" - block: | - if ! /opt/vc/bin/tvservice -s | grep HDMI; then - /opt/vc/bin/tvservice -o - fi - /root/pwnagotchi/scripts/startup.sh & - - - name: configure usb interface - blockinfile: - path: /etc/network/interfaces.d/usb0.cfg - create: yes - block: | - allow-hotplug usb0 - iface usb0 inet static - address 10.0.0.2 - netmask 255.255.255.0 - network 10.0.0.0 - broadcast 10.0.0.255 - gateway 10.0.0.1 - - - name: configure eth0 interface (pi2/3/4) - blockinfile: - path: /etc/network/interfaces.d/eth0.cfg - create: yes - block: | - allow-hotplug eth0 - iface eth0 inet dhcp - - - name: enable ssh on boot - file: - path: /boot/ssh - state: touch - - - name: adjust /boot/config.txt - lineinfile: - dest: /boot/config.txt - insertafter: EOF - line: '{{ item }}' - with_items: - - "dtoverlay=dwc2" - - "dtparam=spi=on" - - "dtoverlay=spi1-3cs" - - "dtoverlay=pi3-disable-bt" - - "dtparam=audio=off" - - - name: change root partition - replace: - dest: /boot/cmdline.txt - backup: no - regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+" - replace: "root=/dev/mmcblk0p2" - - - name: configure /boot/cmdline.txt - lineinfile: - path: /boot/cmdline.txt - backrefs: True - state: present - backup: no - regexp: '(.*)$' - line: '\1 modules-load=dwc2,g_ether' - - - name: configure ssh - lineinfile: - dest: /etc/ssh/sshd_config - backup: no - regexp: '#?PermitRootLogin (.*)$' - line: 'PermitRootLogin yes' - - - name: configure motd - copy: - dest: /etc/motd - content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})" - - - name: clean apt cache - apt: - autoclean: yes - - - name: remove dependencies that are no longer required - apt: - autoremove: yes - - - 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 From 58edfd2a4b3b6586b55a56e2be52c6c89c6cbd06 Mon Sep 17 00:00:00 2001 From: Jeroen Massar Date: Wed, 2 Oct 2019 18:25:18 +0200 Subject: [PATCH 10/62] The -S option does not exist, as it is automatically detected (OPT_SPARSE) --- scripts/create_sibling.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/create_sibling.sh b/scripts/create_sibling.sh index f2d9c11..55b784f 100755 --- a/scripts/create_sibling.sh +++ b/scripts/create_sibling.sh @@ -265,7 +265,6 @@ usage: $0 [OPTIONS] -i # Provide the path of an already downloaded raspbian image -o # Name of the img-file (default: pwnagotchi.img) -s # Size which should be added to second partition (in Gigabyte) (default: 4) - -S # Create a sparse image and generate bmap file (default when bmaptool is available) -v # Version of raspbian (Supported: ${SUPPORTED_RASPBIAN_VERSIONS[*]}; default: latest) -p # Only run provisioning (assumes the image is already mounted) -d # Only run dependencies checks From e0ddd0de57fb1ec8749f71e33c260fa03c749310 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:26:29 +0100 Subject: [PATCH 11/62] new builder system based on packer/ansible --- .travis.yml | 16 ++- Makefile | 22 +++ builder/pwnagotchi.json | 26 ++++ builder/pwnagotchi.yml | 289 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 348 insertions(+), 5 deletions(-) create mode 100644 Makefile create mode 100644 builder/pwnagotchi.json create mode 100644 builder/pwnagotchi.yml diff --git a/.travis.yml b/.travis.yml index a62fa93..9d1a188 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,29 @@ dist: bionic -language: generic +language: go + +go: + - 1.x + env: global: - LANG=C - LC_ALL=C + before_cache: - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete + cache: apt: true directories: - tmp/ + before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools +- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx - sudo update-binfmts --display -- unset GOROOT + script: -- sudo ./scripts/create_sibling.sh -n pwnagotchi -o pwnagotchi.img -- zip -s 2g pwnagotchi.zip pwnagotchi.img +- sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" # TODO: deploy! diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b81990b --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ +PWN_HOSTNAME="pwnagotchi" +PWN_VERSION="master" + +all: install image clean + +install: + @curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip + @unzip /tmp/packer.zip -d /tmp + @mv /tmp/packer /usr/bin/packer + @git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image + @cd /tmp/packer-builder-arm-image && go get -d ./... && go build + @cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin + +image: + @cd builder && sudo packer build pwnagotchi.json + @mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img + @zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img + +clean: + @rm -rf /tmp/packer-builder-arm-image + @rm -f pwnagotchi-raspbian-lite.img + @rm -rf builder/output-pwnagotchi builder/packer_cache diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json new file mode 100644 index 0000000..c78629e --- /dev/null +++ b/builder/pwnagotchi.json @@ -0,0 +1,26 @@ +{ + "variables": { + "home": "{{env `HOME`}}" + }, + "builders": [{ + "name": "pwnagotchi", + "type": "arm-image", + "iso_url" : "https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-07-12/2019-07-10-raspbian-buster-lite.zip", + "iso_checksum_type":"sha256", + "iso_checksum":"9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e", + "last_partition_extra_size" : 3221225472 + }], + "provisioners": [ + { + "type": "shell", + "inline": [ + "apt-get -y update", + "apt-get install -y ansible" + ] + }, + { + "type":"ansible-local", + "playbook_file": "pwnagotchi.yml" + } + ] +} diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml new file mode 100644 index 0000000..0672002 --- /dev/null +++ b/builder/pwnagotchi.yml @@ -0,0 +1,289 @@ +--- +- hosts: + - 127.0.0.1 + become: yes + vars: + pwn_hostname: "pwnagotchi" + pwn_version: "master" + + tasks: + + - name: selected hostname + debug: + msg: "{{ pwn_hostname }}" + + - name: build version + debug: + msg: "{{ pwn_version }}" + + - name: change hostname + hostname: + name: "{{pwn_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' + state: present + + - name: Add re4son-kernel repo key + apt_key: + url: https://re4son-kernel.com/keys/http/archive-key.asc + state: present + + - name: Add re4son-kernel repository + apt_repository: + repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main + state: present + + - name: update apt package cache + apt: + update_cache: yes + + - name: upgrade apt distro + apt: + upgrade: dist + + - name: install packages + apt: + name: "{{ packages }}" + state: present + vars: + packages: + - vim + - screen + - golang + - git + - build-essential + - python3-pip + - 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 + + - 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 + - bluetooth.service + - triggerhappy.service + + - name: enable dphys-swapfile service + systemd: + name: dphys-swapfile.service + state: started + enabled: yes + + - name: build bettercap + command: go get -u github.com/bettercap/bettercap + environment: + GOPATH: /root/go + + - name: install bettercap + copy: + src: /root/go/bin/bettercap + dest: /usr/bin/bettercap + mode: 0755 + + - name: clone bettercap caplets + git: + repo: https://github.com/bettercap/caplets.git + dest: /tmp/caplets + + - name: install bettercap caplets + make: + chdir: /tmp/caplets + target: install + + - name: clone pwnagotchi repository + git: + repo: https://github.com/evilsocket/pwnagotchi.git + dest: /tmp/pwnagotchi + + - name: copy pwnagotchi files to final destination + copy: + src: /tmp/pwnagotchi/sdcard/rootfs/root/pwnagotchi/ + dest: /root/pwnagotchi/ + mode: preserve + + - name: remove pwnagotchi files from temporary repository + file: + 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 + mode: 0755 + content: | + #!/usr/bin/env bash + while true + do + top -b -n1 | awk '/Cpu\(s\)/ { printf("%d %", $2 + $4 + 0.5) }' + sleep 3 + done + + - name: create memusage script + copy: + dest: /usr/bin/memusage + mode: 0755 + content: | + #!/usr/bin/env + free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }' + + - name: create monstart script + copy: + dest: /usr/bin/monstart + mode: 0755 + content: | + #!/usr/bin/env bash + iw phy phy0 interface add mon0 type monitor && ifconfig mon0 up + + - name: create monstop script + copy: + dest: /usr/bin/monstop + mode: 0755 + content: | + #!/usr/bin/env bash + ifconfig mon0 down && iw dev mon0 del + + - name: configure rc.local + blockinfile: + path: /etc/rc.local + insertbefore: "exit 0" + block: | + if ! /opt/vc/bin/tvservice -s | grep HDMI; then + /opt/vc/bin/tvservice -o + fi + /root/pwnagotchi/scripts/startup.sh & + + - name: configure usb interface + blockinfile: + path: /etc/network/interfaces.d/usb0.cfg + create: yes + block: | + allow-hotplug usb0 + iface usb0 inet static + address 10.0.0.2 + netmask 255.255.255.0 + network 10.0.0.0 + broadcast 10.0.0.255 + gateway 10.0.0.1 + + - name: configure eth0 interface (pi2/3/4) + blockinfile: + path: /etc/network/interfaces.d/eth0.cfg + create: yes + block: | + allow-hotplug eth0 + iface eth0 inet dhcp + + - name: enable ssh on boot + file: + path: /boot/ssh + state: touch + + - name: adjust /boot/config.txt + lineinfile: + dest: /boot/config.txt + insertafter: EOF + line: '{{ item }}' + with_items: + - "dtoverlay=dwc2" + - "dtparam=spi=on" + - "dtoverlay=spi1-3cs" + - "dtoverlay=pi3-disable-bt" + - "dtparam=audio=off" + + - name: change root partition + replace: + dest: /boot/cmdline.txt + backup: no + regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+" + replace: "root=/dev/mmcblk0p2" + + - name: configure /boot/cmdline.txt + lineinfile: + path: /boot/cmdline.txt + backrefs: True + state: present + backup: no + regexp: '(.*)$' + line: '\1 modules-load=dwc2,g_ether' + + - name: configure ssh + lineinfile: + dest: /etc/ssh/sshd_config + backup: no + regexp: '#?PermitRootLogin (.*)$' + line: 'PermitRootLogin yes' + + - name: configure motd + copy: + dest: /etc/motd + content: "(◕‿‿◕) {{pwn_hostname}} (pwnagotchi-{{pwn_version}})" + + - name: clean apt cache + apt: + autoclean: yes + + - name: remove dependencies that are no longer required + apt: + autoremove: yes + + - 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 From 956b8c7a67384c31a2a0ccd807a5b36b20015284 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:30:40 +0100 Subject: [PATCH 12/62] add output to makefile --- Makefile | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index b81990b..4e1b311 100644 --- a/Makefile +++ b/Makefile @@ -4,19 +4,19 @@ PWN_VERSION="master" all: install image clean install: - @curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip - @unzip /tmp/packer.zip -d /tmp - @mv /tmp/packer /usr/bin/packer - @git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image - @cd /tmp/packer-builder-arm-image && go get -d ./... && go build - @cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin + curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip + unzip /tmp/packer.zip -d /tmp + mv /tmp/packer /usr/bin/packer + git clone https://github.com/solo-io/packer-builder-arm-image /tmp/packer-builder-arm-image + cd /tmp/packer-builder-arm-image && go get -d ./... && go build + cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin image: - @cd builder && sudo packer build pwnagotchi.json - @mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img - @zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img + cd builder && sudo packer build pwnagotchi.json + mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img + zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img clean: - @rm -rf /tmp/packer-builder-arm-image - @rm -f pwnagotchi-raspbian-lite.img - @rm -rf builder/output-pwnagotchi builder/packer_cache + rm -rf /tmp/packer-builder-arm-image + rm -f pwnagotchi-raspbian-lite.img + rm -rf builder/output-pwnagotchi builder/packer_cache From 9471d722afc39e0ed3e7e2ae6678f4d2f41f1f30 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 17:36:25 +0100 Subject: [PATCH 13/62] specify full path for packer --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4e1b311..75ec0d1 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ install: cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin image: - cd builder && sudo packer build pwnagotchi.json + cd builder && sudo /usr/bin/packer build pwnagotchi.json mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).img From db48b7aa5268ae534f3ce3f0f7e37d728406952f Mon Sep 17 00:00:00 2001 From: Jeroen Massar Date: Wed, 2 Oct 2019 18:39:15 +0200 Subject: [PATCH 14/62] Update waveshare v1 driver to "4.00" aka "2019.07.31" from: https://github.com/waveshare/e-Paper/tree/master/RaspberryPi%26JetsonNano/python/lib/waveshare_epd --- .../pwnagotchi/ui/waveshare/v1/epd2in13.py | 443 +++++++++--------- .../pwnagotchi/ui/waveshare/v1/epdconfig.py | 157 +++++-- 2 files changed, 344 insertions(+), 256 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py index 5805086..b6de9da 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epd2in13.py @@ -1,218 +1,225 @@ -# //***************************************************************************** -# * | File : epd2in13.py -# * | Author : Waveshare team -# * | Function : Electronic paper driver -# * | Info : -# *---------------- -# * | This version: V3.1 -# * | Date : 2019-03-20 -# * | Info : python3 demo -# * fix: TurnOnDisplay() -# ******************************************************************************// -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documnetation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and//or sell -# copies of the Software, and to permit persons to whom the Software is -# furished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - - -from . import epdconfig -from PIL import Image -import RPi.GPIO as GPIO -# import numpy as np - -# Display resolution -EPD_WIDTH = 122 -EPD_HEIGHT = 250 - -class EPD: - def __init__(self): - self.reset_pin = epdconfig.RST_PIN - self.dc_pin = epdconfig.DC_PIN - self.busy_pin = epdconfig.BUSY_PIN - self.width = EPD_WIDTH - self.height = EPD_HEIGHT - lut_full_update = [ - 0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 - ] - - lut_partial_update = [ - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - ] - - # Hardware reset - def reset(self): - epdconfig.digital_write(self.reset_pin, GPIO.HIGH) - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, GPIO.LOW) # module reset - epdconfig.delay_ms(200) - epdconfig.digital_write(self.reset_pin, GPIO.HIGH) - epdconfig.delay_ms(200) - - def send_command(self, command): - epdconfig.digital_write(self.dc_pin, GPIO.LOW) - epdconfig.spi_writebyte([command]) - - def send_data(self, data): - epdconfig.digital_write(self.dc_pin, GPIO.HIGH) - epdconfig.spi_writebyte([data]) - - def wait_until_idle(self): - # print("busy") - while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy - epdconfig.delay_ms(100) - # print("free busy") - - def TurnOnDisplay(self): - self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 - self.send_data(0xC4) - self.send_command(0x20) # MASTER_ACTIVATION - self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE - self.wait_until_idle() - - def init(self, lut): - if (epdconfig.module_init() != 0): - return -1 - # EPD hardware init start - self.reset() - self.send_command(0x01) # DRIVER_OUTPUT_CONTROL - self.send_data((EPD_HEIGHT - 1) & 0xFF) - self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF) - self.send_data(0x00) # GD = 0 SM = 0 TB = 0 - - self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL - self.send_data(0xD7) - self.send_data(0xD6) - self.send_data(0x9D) - - self.send_command(0x2C) # WRITE_VCOM_REGISTER - self.send_data(0xA8) # VCOM 7C - - self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD - self.send_data(0x1A) # 4 dummy lines per gate - - self.send_command(0x3B) # SET_GATE_TIME - self.send_data(0x08) # 2us per line - - self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL - self.send_data(0x03) - - self.send_command(0X11) # DATA_ENTRY_MODE_SETTING - self.send_data(0x03) # X increment; Y increment - - # WRITE_LUT_REGISTER - self.send_command(0x32) - for count in range(30): - self.send_data(lut[count]) - - return 0 - -## - # @brief: specify the memory area for data R//W - ## - def SetWindows(self, x_start, y_start, x_end, y_end): - self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION - self.send_data((x_start >> 3) & 0xFF) - self.send_data((x_end >> 3) & 0xFF) - self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION - self.send_data(y_start & 0xFF) - self.send_data((y_start >> 8) & 0xFF) - self.send_data(y_end & 0xFF) - self.send_data((y_end >> 8) & 0xFF) - -## - # @brief: specify the start point for data R//W - ## - def SetCursor(self, x, y): - self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER - # x point must be the multiple of 8 or the last 3 bits will be ignored - self.send_data((x >> 3) & 0xFF) - self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER - self.send_data(y & 0xFF) - self.send_data((y >> 8) & 0xFF) - self.wait_until_idle() - - def getbuffer(self, image): - if self.width%8 == 0: - linewidth = self.width//8 - else: - linewidth = self.width//8 + 1 - - buf = [0xFF] * (linewidth * self.height) - image_monocolor = image.convert('1') - imwidth, imheight = image_monocolor.size - pixels = image_monocolor.load() - - if(imwidth == self.width and imheight == self.height): - # print("Vertical") - for y in range(imheight): - for x in range(imwidth): - if pixels[x, y] == 0: - # x = imwidth - x - buf[x // 8 + y * linewidth] &= ~(0x80 >> (x % 8)) - elif(imwidth == self.height and imheight == self.width): - # print("Horizontal") - for y in range(imheight): - for x in range(imwidth): - newx = y - newy = self.height - x - 1 - if pixels[x, y] == 0: - # newy = imwidth - newy - 1 - buf[newx // 8 + newy*linewidth] &= ~(0x80 >> (y % 8)) - return buf - - - def display(self, image): - if self.width%8 == 0: - linewidth = self.width//8 - else: - linewidth = self.width//8 + 1 - - self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT); - for j in range(0, self.height): - self.SetCursor(0, j); - self.send_command(0x24); - for i in range(0, linewidth): - self.send_data(image[i + j * linewidth]) - self.TurnOnDisplay() - - def Clear(self, color): - if self.width%8 == 0: - linewidth = self.width//8 - else: - linewidth = self.width//8 + 1 - - self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT); - for j in range(0, self.height): - self.SetCursor(0, j); - self.send_command(0x24); - for i in range(0, linewidth): - self.send_data(color) - self.TurnOnDisplay() - - def sleep(self): - self.send_command(0x10) #enter deep sleep - # self.send_data(0x01) - epdconfig.delay_ms(100) - -### END OF FILE ### - +# ***************************************************************************** +# * | File : epd2in13.py +# * | Author : Waveshare team +# * | Function : Electronic paper driver +# * | Info : +# *---------------- +# * | This version: V4.0 +# * | Date : 2019-06-20 +# # | Info : python demo +# ----------------------------------------------------------------------------- +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# + + +import logging +from . import epdconfig +import numpy as np + +# Display resolution +EPD_WIDTH = 122 +EPD_HEIGHT = 250 + +class EPD: + def __init__(self): + self.reset_pin = epdconfig.RST_PIN + self.dc_pin = epdconfig.DC_PIN + self.busy_pin = epdconfig.BUSY_PIN + self.cs_pin = epdconfig.CS_PIN + self.width = EPD_WIDTH + self.height = EPD_HEIGHT + + lut_full_update = [ + 0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + ] + + lut_partial_update = [ + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ] + + # Hardware reset + def reset(self): + epdconfig.digital_write(self.cs_pin, 0) + epdconfig.digital_write(self.reset_pin, 1) + epdconfig.delay_ms(200) + epdconfig.digital_write(self.reset_pin, 0) + epdconfig.delay_ms(10) + epdconfig.digital_write(self.reset_pin, 1) + epdconfig.delay_ms(200) + epdconfig.digital_write(self.cs_pin, 1) + + def send_command(self, command): + epdconfig.digital_write(self.cs_pin, 0) + epdconfig.digital_write(self.dc_pin, 0) + epdconfig.spi_writebyte([command]) + epdconfig.digital_write(self.cs_pin, 1) + + def send_data(self, data): + epdconfig.digital_write(self.cs_pin, 0) + epdconfig.digital_write(self.dc_pin, 1) + epdconfig.spi_writebyte([data]) + epdconfig.digital_write(self.cs_pin, 1) + + def ReadBusy(self): + while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy + epdconfig.delay_ms(100) + + def TurnOnDisplay(self): + self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2 + self.send_data(0xC4) + self.send_command(0x20) # MASTER_ACTIVATION + self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE + + logging.debug("e-Paper busy") + self.ReadBusy() + logging.debug("e-Paper busy release") + + def init(self, lut): + if (epdconfig.module_init() != 0): + return -1 + # EPD hardware init start + self.reset() + self.send_command(0x01) # DRIVER_OUTPUT_CONTROL + self.send_data((EPD_HEIGHT - 1) & 0xFF) + self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF) + self.send_data(0x00) # GD = 0 SM = 0 TB = 0 + + self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL + self.send_data(0xD7) + self.send_data(0xD6) + self.send_data(0x9D) + + self.send_command(0x2C) # WRITE_VCOM_REGISTER + self.send_data(0xA8) # VCOM 7C + + self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD + self.send_data(0x1A) # 4 dummy lines per gate + + self.send_command(0x3B) # SET_GATE_TIME + self.send_data(0x08) # 2us per line + + self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL + self.send_data(0x03) + + self.send_command(0X11) # DATA_ENTRY_MODE_SETTING + self.send_data(0x03) # X increment; Y increment + + # WRITE_LUT_REGISTER + self.send_command(0x32) + for count in range(30): + self.send_data(lut[count]) + + return 0 + +## + # @brief: specify the memory area for data R/W + ## + def SetWindows(self, x_start, y_start, x_end, y_end): + self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION + self.send_data((x_start >> 3) & 0xFF) + self.send_data((x_end >> 3) & 0xFF) + self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION + self.send_data(y_start & 0xFF) + self.send_data((y_start >> 8) & 0xFF) + self.send_data(y_end & 0xFF) + self.send_data((y_end >> 8) & 0xFF) + +## + # @brief: specify the start point for data R/W + ## + def SetCursor(self, x, y): + self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER + # x point must be the multiple of 8 or the last 3 bits will be ignored + self.send_data((x >> 3) & 0xFF) + self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER + self.send_data(y & 0xFF) + self.send_data((y >> 8) & 0xFF) + self.ReadBusy() + + def getbuffer(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + buf = [0xFF] * (linewidth * self.height) + image_monocolor = image.convert('1') + imwidth, imheight = image_monocolor.size + pixels = image_monocolor.load() + + if(imwidth == self.width and imheight == self.height): + for y in range(imheight): + for x in range(imwidth): + if pixels[x, y] == 0: + # x = imwidth - x + buf[int(x / 8) + y * linewidth] &= ~(0x80 >> (x % 8)) + elif(imwidth == self.height and imheight == self.width): + for y in range(imheight): + for x in range(imwidth): + newx = y + newy = self.height - x - 1 + if pixels[x, y] == 0: + # newy = imwidth - newy - 1 + buf[int(newx / 8) + newy*linewidth] &= ~(0x80 >> (y % 8)) + return buf + + + def display(self, image): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.SetWindows(0, 0, self.width, self.height); + for j in range(0, self.height): + self.SetCursor(0, j); + self.send_command(0x24); + for i in range(0, linewidth): + self.send_data(image[i + j * linewidth]) + self.TurnOnDisplay() + + def Clear(self, color): + if self.width%8 == 0: + linewidth = int(self.width/8) + else: + linewidth = int(self.width/8) + 1 + + self.SetWindows(0, 0, self.width, self.height); + for j in range(0, self.height): + self.SetCursor(0, j); + self.send_command(0x24); + for i in range(0, linewidth): + self.send_data(color) + self.TurnOnDisplay() + + def sleep(self): + self.send_command(0x10) #enter deep sleep + self.send_data(0x01) + epdconfig.delay_ms(100) + + epdconfig.module_exit() + +### END OF FILE ### + diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py index 78ff647..76d8ca9 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/waveshare/v1/epdconfig.py @@ -1,19 +1,13 @@ # /***************************************************************************** -# * | File : EPD_1in54.py +# * | File : epdconfig.py # * | Author : Waveshare team # * | Function : Hardware underlying interface # * | Info : # *---------------- -# * | This version: V2.0 -# * | Date : 2018-11-01 +# * | This version: V1.0 +# * | Date : 2019-06-21 # * | Info : -# * 1.Remove: -# digital_write(self, pin, value) -# digital_read(self, pin) -# delay_ms(self, delaytime) -# set_lut(self, lut) -# self.lut = self.lut_full_update -# ******************************************************************************/ +# ****************************************************************************** # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documnetation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights @@ -33,41 +27,128 @@ # THE SOFTWARE. # - -import spidev -import RPi.GPIO as GPIO +import os +import logging +import sys import time -# Pin definition -RST_PIN = 17 -DC_PIN = 25 -CS_PIN = 8 -BUSY_PIN = 24 -# SPI device, bus = 0, device = 0 -SPI = spidev.SpiDev(0, 0) +class RaspberryPi: + # Pin definition + RST_PIN = 17 + DC_PIN = 25 + CS_PIN = 8 + BUSY_PIN = 24 -def digital_write(pin, value): - GPIO.output(pin, value) + def __init__(self): + import spidev + import RPi.GPIO -def digital_read(pin): - return GPIO.input(BUSY_PIN) + self.GPIO = RPi.GPIO -def delay_ms(delaytime): - time.sleep(delaytime / 1000.0) + # SPI device, bus = 0, device = 0 + self.SPI = spidev.SpiDev(0, 0) -def spi_writebyte(data): - SPI.writebytes(data) + def digital_write(self, pin, value): + self.GPIO.output(pin, value) + + def digital_read(self, pin): + return self.GPIO.input(self.BUSY_PIN) + + def delay_ms(self, delaytime): + time.sleep(delaytime / 1000.0) + + def spi_writebyte(self, data): + self.SPI.writebytes(data) + + def module_init(self): + self.GPIO.setmode(self.GPIO.BCM) + self.GPIO.setwarnings(False) + self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) + self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) + self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) + self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) + self.SPI.max_speed_hz = 4000000 + self.SPI.mode = 0b00 + return 0 + + def module_exit(self): + logging.debug("spi end") + self.SPI.close() + + logging.debug("close 5V, Module enters 0 power consumption ...") + self.GPIO.output(self.RST_PIN, 0) + self.GPIO.output(self.DC_PIN, 0) + + self.GPIO.cleanup() + + +class JetsonNano: + # Pin definition + RST_PIN = 17 + DC_PIN = 25 + CS_PIN = 8 + BUSY_PIN = 24 + + def __init__(self): + import ctypes + find_dirs = [ + os.path.dirname(os.path.realpath(__file__)), + '/usr/local/lib', + '/usr/lib', + ] + self.SPI = None + for find_dir in find_dirs: + so_filename = os.path.join(find_dir, 'sysfs_software_spi.so') + if os.path.exists(so_filename): + self.SPI = ctypes.cdll.LoadLibrary(so_filename) + break + if self.SPI is None: + raise RuntimeError('Cannot find sysfs_software_spi.so') + + import Jetson.GPIO + self.GPIO = Jetson.GPIO + + def digital_write(self, pin, value): + self.GPIO.output(pin, value) + + def digital_read(self, pin): + return self.GPIO.input(self.BUSY_PIN) + + def delay_ms(self, delaytime): + time.sleep(delaytime / 1000.0) + + def spi_writebyte(self, data): + self.SPI.SYSFS_software_spi_transfer(data[0]) + + def module_init(self): + self.GPIO.setmode(self.GPIO.BCM) + self.GPIO.setwarnings(False) + self.GPIO.setup(self.RST_PIN, self.GPIO.OUT) + self.GPIO.setup(self.DC_PIN, self.GPIO.OUT) + self.GPIO.setup(self.CS_PIN, self.GPIO.OUT) + self.GPIO.setup(self.BUSY_PIN, self.GPIO.IN) + self.SPI.SYSFS_software_spi_begin() + return 0 + + def module_exit(self): + logging.debug("spi end") + self.SPI.SYSFS_software_spi_end() + + logging.debug("close 5V, Module enters 0 power consumption ...") + self.GPIO.output(self.RST_PIN, 0) + self.GPIO.output(self.DC_PIN, 0) + + self.GPIO.cleanup() + + +if os.path.exists('/sys/bus/platform/drivers/gpiomem-bcm2835'): + implementation = RaspberryPi() +else: + implementation = JetsonNano() + +for func in [x for x in dir(implementation) if not x.startswith('_')]: + setattr(sys.modules[__name__], func, getattr(implementation, func)) -def module_init(): - GPIO.setmode(GPIO.BCM) - GPIO.setwarnings(False) - GPIO.setup(RST_PIN, GPIO.OUT) - GPIO.setup(DC_PIN, GPIO.OUT) - GPIO.setup(CS_PIN, GPIO.OUT) - GPIO.setup(BUSY_PIN, GPIO.IN) - SPI.max_speed_hz = 2000000 - SPI.mode = 0b00 - return 0; ### END OF FILE ### From 47042f0946b5d1987aacdbfebe10992bde280eb8 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Wed, 2 Oct 2019 19:01:07 +0200 Subject: [PATCH 15/62] new: implemented plugin system (closes #54) --- README.md | 6 + sdcard/rootfs/root/pwnagotchi/config.yml | 4 +- sdcard/rootfs/root/pwnagotchi/scripts/main.py | 77 +++++---- .../pwnagotchi/scripts/pwnagotchi/agent.py | 24 ++- .../pwnagotchi/scripts/pwnagotchi/ai/epoch.py | 4 +- .../pwnagotchi/scripts/pwnagotchi/ai/train.py | 30 +++- .../scripts/pwnagotchi/mesh/utils.py | 4 +- .../scripts/pwnagotchi/plugins/__init__.py | 45 +++++ .../pwnagotchi/plugins/default/example.py | 162 ++++++++++++++++++ .../pwnagotchi/plugins/default/ups_lite.py | 65 +++++++ .../scripts/pwnagotchi/ui/display.py | 4 +- .../pwnagotchi/scripts/pwnagotchi/ui/state.py | 3 + .../pwnagotchi/scripts/pwnagotchi/ui/view.py | 17 +- 13 files changed, 397 insertions(+), 48 deletions(-) create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py diff --git a/README.md b/README.md index 45644e4..b0331f8 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,12 @@ Now you can use the `preview.py`-script to preview the changes: # Now open http://localhost:8080 and http://localhost:8081 ``` +### Plugins + +Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere +as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins) for a list of default +plugins and all the callbacks that you can define for your own customizations. + ### Random Info - `hostname` sets the unit name. diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml index 8da7bc9..7cf1c6f 100644 --- a/sdcard/rootfs/root/pwnagotchi/config.yml +++ b/sdcard/rootfs/root/pwnagotchi/config.yml @@ -2,6 +2,8 @@ main: # currently implemented: en (default), de, nl, it lang: en + # custom plugins path, if null only default plugins with be loaded + plugins: null # monitor interface to use iface: mon0 # command to run to bring the mon interface up in case it's not up already @@ -21,7 +23,7 @@ main: ai: # if false, only the default 'personality' will be used - enabled: true + enabled: false path: /root/brain.nn # 1.0 - laziness = probability of start training laziness: 0.1 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/main.py b/sdcard/rootfs/root/pwnagotchi/scripts/main.py index 10e0490..09f6ec3 100755 --- a/sdcard/rootfs/root/pwnagotchi/scripts/main.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/main.py @@ -5,7 +5,7 @@ import time import traceback import core -import pwnagotchi +import pwnagotchi, pwnagotchi.plugins as plugins from pwnagotchi.log import SessionParser from pwnagotchi.voice import Voice @@ -25,39 +25,49 @@ args = parser.parse_args() if args.do_clear: print("clearing the display ...") with open(args.config, 'rt') as fp: - config = yaml.safe_load(fp) - cleardisplay=config['ui']['display']['type'] - if cleardisplay in ('inkyphat', 'inky'): - print("inky display") - from inky import InkyPHAT - epd = InkyPHAT(config['ui']['display']['color']) - epd.set_border(InkyPHAT.BLACK) - self._render_cb = self._inky_render - elif cleardisplay in ('papirus', 'papi'): - print("papirus display") - from pwnagotchi.ui.papirus.epd import EPD - os.environ['EPD_SIZE'] = '2.0' - epd = EPD() - epd.clear() - elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'): - print("waveshare v1 display") - from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD - epd = EPD() - epd.init(epd.lut_full_update) - epd.Clear(0xFF) - elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'): - print("waveshare v2 display") - from pwnagotchi.ui.waveshare.v2.waveshare import EPD - epd = EPD() - epd.init(epd.FULL_UPDATE) - epd.Clear(0xff) - else: - print("unknown display type %s" % cleardisplay) - quit() + config = yaml.safe_load(fp) + cleardisplay = config['ui']['display']['type'] + if cleardisplay in ('inkyphat', 'inky'): + print("inky display") + from inky import InkyPHAT + + epd = InkyPHAT(config['ui']['display']['color']) + epd.set_border(InkyPHAT.BLACK) + self._render_cb = self._inky_render + elif cleardisplay in ('papirus', 'papi'): + print("papirus display") + from pwnagotchi.ui.papirus.epd import EPD + + os.environ['EPD_SIZE'] = '2.0' + epd = EPD() + epd.clear() + elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'): + print("waveshare v1 display") + from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD + + epd = EPD() + epd.init(epd.lut_full_update) + epd.Clear(0xFF) + elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'): + print("waveshare v2 display") + from pwnagotchi.ui.waveshare.v2.waveshare import EPD + + epd = EPD() + epd.init(epd.FULL_UPDATE) + epd.Clear(0xff) + else: + print("unknown display type %s" % cleardisplay) + quit() with open(args.config, 'rt') as fp: config = yaml.safe_load(fp) +plugins.load_from_path(plugins.default_path) +if 'plugins' in config['main'] and config['main']['plugins'] is not None: + plugins.load_from_path(config['main']['plugins']) + +plugins.on('loaded') + display = Display(config=config, state={'name': '%s>' % pwnagotchi.name()}) agent = Agent(view=display, config=config) @@ -65,6 +75,9 @@ core.log("%s@%s (v%s)" % (pwnagotchi.name(), agent._identity, pwnagotchi.version # for key, value in config['personality'].items(): # core.log(" %s: %s" % (key, value)) +for _, plugin in plugins.loaded.items(): + core.log("plugin '%s' v%s loaded from %s" % (plugin.__name__, plugin.__version__, plugin.__file__)) + if args.do_manual: core.log("entering manual mode ...") @@ -112,13 +125,15 @@ core.logfile = config['main']['log'] agent.start_ai() agent.setup_events() -agent.set_ready() +agent.set_starting() agent.start_monitor_mode() agent.start_event_polling() # print initial stats agent.next_epoch() +agent.set_ready() + while True: try: # recon on all channels diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py index 1fa5112..bf9ecca 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py @@ -8,6 +8,7 @@ import _thread import core +import pwnagotchi.plugins as plugins from bettercap.client import Client from pwnagotchi.mesh.utils import AsyncAdvertiser from pwnagotchi.ai.train import AsyncTrainer @@ -47,29 +48,35 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): def supported_channels(self): return self._supported_channels - def on_ai_ready(self): - self._view.on_ai_ready() + def set_starting(self): + self._view.on_starting() def set_ready(self): - self._view.on_starting() + plugins.on('ready', self) def set_free_channel(self, channel): self._view.on_free_channel(channel) + plugins.on('free_channel', self, channel) def set_bored(self): self._view.on_bored() + plugins.on('bored', self) def set_sad(self): self._view.on_sad() + plugins.on('sad', self) def set_excited(self): self._view.on_excited() + plugins.on('excited', self) def set_lonely(self): self._view.on_lonely() + plugins.on('lonely', self) def set_rebooting(self): self._view.on_rebooting() + plugins.on('rebooting', self) def setup_events(self): core.log("connecting to %s ..." % self.url) @@ -128,6 +135,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): self.start_advertising() def wait_for(self, t, sleeping=True): + plugins.on('sleep' if sleeping else 'wait', self, t) self._view.wait(t, sleeping) self._epoch.track(sleep=True, inc=t) @@ -179,6 +187,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): def set_access_points(self, aps): self._access_points = aps + plugins.on('wifi_update', self, aps) self._epoch.observe(aps, self._advertiser.peers() if self._advertiser is not None else ()) return self._access_points @@ -338,6 +347,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): if apsta is None: core.log("!!! captured new handshake: %s !!!" % key) self._last_pwnd = ap_mac + plugins.on('handshake', self, ap_mac, sta_mac) else: (ap, sta) = apsta self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[ @@ -346,6 +356,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): ap['channel'], sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'])) + plugins.on('handshake', self, ap, sta) except Exception as e: core.log("error: %s" % e) @@ -419,6 +430,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): except Exception as e: self._on_error(ap['mac'], e) + plugins.on('association', self, ap) if throttle > 0: time.sleep(throttle) self._view.on_normal() @@ -439,6 +451,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): except Exception as e: self._on_error(sta['mac'], e) + plugins.on('deauthentication', self, ap, sta) if throttle > 0: time.sleep(throttle) self._view.on_normal() @@ -470,6 +483,9 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): self._current_channel = channel self._epoch.track(hop=True) self._view.set('channel', '%d' % channel) + + plugins.on('channel_hop', self, channel) + except Exception as e: core.log("error: %s" % e) @@ -509,6 +525,8 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): core.log("%d epochs with activity -> excited" % self._epoch.active_for) self.set_excited() + plugins.on('epoch', self, self._epoch.epoch - 1, self._epoch.data()) + if self._epoch.blind_for >= self._config['main']['mon_max_blind_epochs']: core.log("%d epochs without visible access points -> rebooting ..." % self._epoch.blind_for) self._reboot() diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py index bdd8c2e..8508eb9 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/epoch.py @@ -7,6 +7,7 @@ import pwnagotchi.mesh.wifi as wifi from pwnagotchi.ai.reward import RewardFunction + class Epoch(object): def __init__(self, config): self.epoch = 0 @@ -92,7 +93,8 @@ class Epoch(object): try: peers_per_chan[peer.last_channel - 1] += 1.0 except IndexError as e: - core.log("got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels)) + core.log( + "got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels)) # normalize aps_per_chan = [e / num_aps for e in aps_per_chan] diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py index 1312715..34140dd 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ai/train.py @@ -7,6 +7,7 @@ import json import core +import pwnagotchi.plugins as plugins import pwnagotchi.ai as ai from pwnagotchi.ai.epoch import Epoch @@ -68,14 +69,14 @@ class Stats(object): core.log("[ai] saving %s" % self.path) data = json.dumps({ - 'born_at': self.born_at, - 'epochs_lived': self.epochs_lived, - 'epochs_trained': self.epochs_trained, - 'rewards': { - 'best': self.best_reward, - 'worst': self.worst_reward - } - }) + 'born_at': self.born_at, + 'epochs_lived': self.epochs_lived, + 'epochs_trained': self.epochs_trained, + 'rewards': { + 'best': self.best_reward, + 'worst': self.worst_reward + } + }) temp = "%s.tmp" % self.path with open(temp, 'wt') as fp: @@ -98,6 +99,11 @@ class AsyncTrainer(object): self._is_training = training self._training_epochs = for_epochs + if training: + plugins.on('ai_training_start', self, for_epochs) + else: + plugins.on('ai_training_end', self) + def is_training(self): return self._is_training @@ -123,8 +129,10 @@ class AsyncTrainer(object): def on_ai_training_step(self, _locals, _globals): self._model.env.render() + plugins.on('ai_training_step', self, _locals, _globals) def on_ai_policy(self, new_params): + plugins.on('ai_policy', self, new_params) core.log("[ai] setting new policy:") for name, value in new_params.items(): if name in self._config['personality']: @@ -139,13 +147,19 @@ class AsyncTrainer(object): self.run('set wifi.sta.ttl %d' % self._config['personality']['sta_ttl']) self.run('set wifi.rssi.min %d' % self._config['personality']['min_rssi']) + def on_ai_ready(self): + self._view.on_ai_ready() + plugins.on('ai_ready', self) + def on_ai_best_reward(self, r): core.log("[ai] best reward so far: %s" % r) self._view.on_motivated(r) + plugins.on('ai_best_reward', self, r) def on_ai_worst_reward(self, r): core.log("[ai] worst reward so far: %s" % r) self._view.on_demotivated(r) + plugins.on('ai_worst_reward', self, r) def _ai_worker(self): self._model = ai.load(self._config, self, self._epoch) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py index c99cd57..8c84b94 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/mesh/utils.py @@ -1,7 +1,7 @@ import _thread import core -import pwnagotchi +import pwnagotchi, pwnagotchi.plugins as plugins from pwnagotchi.mesh import get_identity @@ -37,6 +37,8 @@ class AsyncAdvertiser(object): def _on_new_unit(self, peer): self._view.on_new_peer(peer) + plugins.on('peer_detected', self, peer) def _on_lost_unit(self, peer): self._view.on_lost_peer(peer) + plugins.on('peer_lost', self, peer) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py new file mode 100644 index 0000000..6f84a90 --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py @@ -0,0 +1,45 @@ +import os +import glob +import importlib, importlib.util + +# import core + +default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default") +loaded = {} + + +def dummy_callback(): + pass + + +def on(event_name, *args, **kwargs): + global loaded + cb_name = 'on_%s' % event_name + for _, plugin in loaded.items(): + if cb_name in plugin.__dict__: + # print("calling %s %s(%s)" %(cb_name, args, kwargs)) + plugin.__dict__[cb_name](*args, **kwargs) + + +def load_from_file(filename): + plugin_name = os.path.basename(filename.replace(".py", "")) + spec = importlib.util.spec_from_file_location(plugin_name, filename) + instance = importlib.util.module_from_spec(spec) + spec.loader.exec_module(instance) + return plugin_name, instance + + +def load_from_path(path): + global loaded + + for filename in glob.glob(os.path.join(path, "*.py")): + name, plugin = load_from_file(filename) + if name in loaded: + raise Exception("plugin %s already loaded from %s" % (name, plugin.__file__)) + elif not plugin.__enabled__: + # print("plugin %s is not enabled" % name) + pass + else: + loaded[name] = plugin + + return loaded diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py new file mode 100644 index 0000000..60efbd2 --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py @@ -0,0 +1,162 @@ +__author__ = 'evilsocket@gmail.com' +__version__ = '1.0.0' +__name__ = 'hello_world' +__license__ = 'GPL3' +__description__ = 'An example plugin for pwnagotchi that implements all the available callbacks.' +__enabled__ = False # IMPORTANT: set this to True to enable your plugin. + +from pwnagotchi.ui.components import LabeledValue +from pwnagotchi.ui.view import BLACK +import pwnagotchi.ui.fonts as fonts +import core + + +# called when the plugin is loaded +def on_loaded(): + core.log("WARNING: plugin %s should be disabled!" % __name__) + + +# called to setup the ui elements +def on_ui_setup(ui): + # add custom UI elements + ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0), + label_font=fonts.Bold, text_font=fonts.Medium)) + + +# called when the ui is updated +def on_ui_update(ui): + # update those elements + some_voltage = 0.1 + some_capacity = 100.0 + + ui.set('ups', "%4.2fV/%2i%%" % (some_voltage, some_capacity)) + + +# called when the hardware display setup is done, display is an hardware specific object +def on_display_setup(display): + pass + + +# called when everything is ready and the main loop is about to start +def on_ready(agent): + core.log("unit is ready") + # you can run custom bettercap commands if you want + # agent.run('ble.recon on') + # or set a custom state + # agent.set_bored() + + +# called when the AI finished loading +def on_ai_ready(agent): + pass + + +# called when the AI finds a new set of parameters +def on_ai_policy(agent, policy): + pass + + +# called when the AI starts training for a given number of epochs +def on_ai_training_start(agent, epochs): + pass + + +# called after the AI completed a training epoch +def on_ai_training_step(agent, _locals, _globals): + pass + + +# called when the AI has done training +def on_ai_training_end(agent): + pass + + +# called when the AI got the best reward so far +def on_ai_best_reward(agent, reward): + pass + + +# called when the AI got the best reward so far +def on_ai_worst_reward(agent, reward): + pass + + +# called when a non overlapping wifi channel is found to be free +def on_free_channel(agent, channel): + pass + + +# called when the status is set to bored +def on_bored(agent): + pass + + +# called when the status is set to sad +def on_sad(agent): + pass + + +# called when the status is set to excited +def on_excited(agent): + pass + + +# called when the status is set to lonely +def on_lonely(agent): + pass + + +# called when the agent is rebooting the board +def on_rebooting(agent): + pass + + +# called when the agent is waiting for t seconds +def on_wait(agent, t): + pass + + +# called when the agent is sleeping for t seconds +def on_sleep(agent, t): + pass + + +# called when the agent refreshed its access points list +def on_wifi_update(agent, access_points): + pass + + +# called when the agent is sending an association frame +def on_association(agent, access_point): + pass + + +# callend when the agent is deauthenticating a client station from an AP +def on_deauthentication(agent, access_point, client_station): + pass + + +# callend when the agent is tuning on a specific channel +def on_channel_hop(agent, channel): + pass + + +# called when a new handshake is captured, access_point and client_station are json objects +# if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs +def on_handshake(agent, access_point, client_station): + pass + + +# called when an epoch is over (where an epoch is a single loop of the main algorithm) +def on_epoch(agent, epoch, epoch_data): + pass + + +# called when a new peer is detected +def on_peer_detected(agent, peer): + pass + + +# called when a known peer is lost +def on_peer_lost(agent, peer): + pass diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py new file mode 100644 index 0000000..7ddcecd --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/ups_lite.py @@ -0,0 +1,65 @@ +# Based on UPS Lite v1.1 from https://github.com/xenDE +# +# funtions for get UPS status - needs enable "i2c" in raspi-config +# +# https://github.com/linshuqin329/UPS-Lite +# +# For Raspberry Pi Zero Ups Power Expansion Board with Integrated Serial Port S3U4 +# https://www.ebay.de/itm/For-Raspberry-Pi-Zero-Ups-Power-Expansion-Board-with-Integrated-Serial-Port-S3U4/323873804310 +# https://www.aliexpress.com/item/32888533624.html +__author__ = 'evilsocket@gmail.com' +__version__ = '1.0.0' +__name__ = 'ups_lite' +__license__ = 'GPL3' +__description__ = 'A plugin that will add a voltage indicator for the UPS Lite v1.1' +__enabled__ = False + +import struct + +from pwnagotchi.ui.components import LabeledValue +from pwnagotchi.ui.view import BLACK +import pwnagotchi.ui.fonts as fonts + + +# TODO: add enable switch in config.yml an cleanup all to the best place +class UPS: + def __init__(self): + # only import when the module is loaded and enabled + import smbus + # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1) + self._bus = smbus.SMBus(1) + + def voltage(self): + try: + address = 0x36 + read = self._bus.read_word_data(address, 2) + swapped = struct.unpack("H", read))[0] + return swapped * 1.25 / 1000 / 16 + except: + return 0.0 + + def capacity(self): + try: + address = 0x36 + read = self._bus.read_word_data(address, 4) + swapped = struct.unpack("H", read))[0] + return swapped / 256 + except: + return 0.0 + + +ups = None + + +def on_loaded(): + global ups + ups = UPS() + + +def on_ui_setup(ui): + ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0), + label_font=fonts.Bold, text_font=fonts.Medium)) + + +def on_ui_update(ui): + ui.set('ups', "%4.2fV/%2i%%" % (ups.voltage(), ups.capacity())) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py index 4c693a6..657aefb 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/display.py @@ -4,7 +4,7 @@ from threading import Lock import shutil import core import os -import pwnagotchi +import pwnagotchi, pwnagotchi.plugins as plugins from pwnagotchi.ui.view import WHITE, View @@ -146,6 +146,8 @@ class Display(View): else: core.log("unknown display type %s" % self._display_type) + plugins.on('display_setup', self._display) + self.on_render(self._on_view_rendered) def image(self): diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py index 71b7d4e..c5b66be 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py @@ -7,6 +7,9 @@ class State(object): self._lock = Lock() self._listeners = {} + def add_element(self, key, elem): + self._state[key] = elem + def add_listener(self, key, cb): with self._lock: self._listeners[key] = cb diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py index 19e7999..3ae9089 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py @@ -4,7 +4,7 @@ import time from PIL import Image, ImageDraw import core -import pwnagotchi +import pwnagotchi.plugins as plugins from pwnagotchi.voice import Voice import pwnagotchi.ui.fonts as fonts @@ -41,7 +41,7 @@ def setup_display_specifics(config): name_pos = (int(width / 2) - 15, int(height * .15)) status_pos = (int(width / 2) - 15, int(height * .30)) - elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1', + elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1', 'ws_2', 'ws2', 'waveshare_2', 'waveshare2'): fonts.setup(10, 9, 10, 35) @@ -105,8 +105,19 @@ class View(object): for key, value in state.items(): self._state.set(key, value) + plugins.on('ui_setup', self) + _thread.start_new_thread(self._refresh_handler, ()) + def add_element(self, key, elem): + self._state.add_element(key, elem) + + def width(self): + return self._width + + def height(self): + return self._height + def on_state_change(self, key, cb): self._state.add_listener(key, cb) @@ -294,6 +305,8 @@ class View(object): self._canvas = Image.new('1', (self._width, self._height), WHITE) drawer = ImageDraw.Draw(self._canvas) + plugins.on('ui_update', self) + for key, lv in self._state.items(): lv.draw(self._canvas, drawer) From 5ced9c6ecdb23d95b5e4ab099ba3216d7ddcfae6 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Wed, 2 Oct 2019 19:02:11 +0200 Subject: [PATCH 16/62] fixed readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0331f8..5e4567a 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ Now you can use the `preview.py`-script to preview the changes: ### Plugins Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere -as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins) for a list of default +as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default plugins and all the callbacks that you can define for your own customizations. ### Random Info From b948627bd5e7a83ddd68c66a56c0b8c105563d08 Mon Sep 17 00:00:00 2001 From: Jeroen Massar Date: Wed, 2 Oct 2019 19:03:50 +0200 Subject: [PATCH 17/62] Fix CRLF line endings... Before: ``` bash: ./update_pwnagotchi.sh: /bin/bash^M: bad interpreter: No such file or directory ``` Thus: ``` scripts/update_pwnagotchi.sh: Bourne-Again shell script text executable, ASCII text, with CRLF line terminators dos2unix: converting file scripts/update_pwnagotchi.sh to Unix format... scripts/update_pwnagotchi.sh: Bourne-Again shell script text executable, ASCII text ``` Now it works :) --- scripts/update_pwnagotchi.sh | 220 +++++++++++++++++------------------ 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh index 34e4eed..0039e7b 100644 --- a/scripts/update_pwnagotchi.sh +++ b/scripts/update_pwnagotchi.sh @@ -1,111 +1,111 @@ -#!/bin/bash -# Default variables -GIT_FOLDER="/tmp/pwnagotchi" -GIT_URL="https://github.com/evilsocket/pwnagotchi/" -VERSION="master" -SUPPORTED_RESTART_MODES=( 'auto' 'manual' ) -MODE="auto" -BACKUPCONFIG=0 -RESTORECONFIG=0 - -# Functions -function usage() { - cat < Date: Wed, 2 Oct 2019 18:05:32 +0100 Subject: [PATCH 18/62] override goroot --- .travis.yml | 3 ++- builder/pwnagotchi.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9d1a188..cd74215 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,8 +20,9 @@ cache: before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu kpartx +- sudo apt-get -y install qemu-user-static binfmt-support qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-arm-static kpartx - sudo update-binfmts --display +- cat /etc/ld.so.preload script: - sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml index 0672002..4d086bc 100644 --- a/builder/pwnagotchi.yml +++ b/builder/pwnagotchi.yml @@ -117,6 +117,7 @@ command: go get -u github.com/bettercap/bettercap environment: GOPATH: /root/go + GOROOT: /usr/lib/go - name: install bettercap copy: From 2abf3f21fdec12e5cbbad8bbee5b8c349dddb72e Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:09:02 +0100 Subject: [PATCH 19/62] remove packages --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cd74215..76c5bfa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ cache: before_script: - sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-arm-static kpartx +- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx - sudo update-binfmts --display - cat /etc/ld.so.preload From b7b4e7eb08ae3123acf940a5831a280e3d58667c Mon Sep 17 00:00:00 2001 From: darumaseye Date: Wed, 2 Oct 2019 19:09:24 +0200 Subject: [PATCH 20/62] Improved IT translation --- .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po index f84e16c..3dabc3d 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po @@ -24,7 +24,7 @@ msgid "" "Hi, I'm Pwnagotchi!\n" "Starting ..." msgstr "" -"Ciao!" +"Ciao!\n" "Piacere Pwnagotchi!\n" "Caricamento ..." @@ -155,9 +155,9 @@ msgid "" "goodbye\n" "{name}" msgstr "" -"Uhm ..." +"Uhm ...\n" "addio\n" -"{name}," +"{name},\n" "mi mancherai..." #: voice.py:84 @@ -236,8 +236,8 @@ msgstr "Aspetto {secs}s ..." #, python-brace-format msgid "Looking around ({secs}s)" msgstr "" -"Do uno sguardo" -"qui intorno..." +"Do uno sguardo\n" +"qui intorno...\n" "({secs}s)" #: voice.py:123 @@ -258,7 +258,7 @@ msgid "" "{what}" msgstr "" "Collegamento con\n" -"{what}" +"{what}\n" "in corso..." #: voice.py:125 From 4986950ffb5cf010f0b99028a450f0198c3938c2 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:12:05 +0100 Subject: [PATCH 21/62] remove debug for ld.so.preload --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 76c5bfa..edfa3a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,6 @@ before_script: - sudo apt-get -y update - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx - sudo update-binfmts --display -- cat /etc/ld.so.preload script: - sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" From 5725d8b23956e4a20d8bb25f30b76ec4063539a8 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Wed, 2 Oct 2019 19:41:50 +0200 Subject: [PATCH 22/62] new: gps coordinates are saved along with handshakes if gps is connected (related to #55) --- .../pwnagotchi/scripts/pwnagotchi/agent.py | 8 +++- .../pwnagotchi/plugins/default/example.py | 2 +- .../scripts/pwnagotchi/plugins/default/gps.py | 47 +++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py index bf9ecca..739d6ed 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py @@ -45,6 +45,9 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): pass return False + def config(self): + return self._config + def supported_channels(self): return self._supported_channels @@ -336,6 +339,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): try: for h in [e for e in self.events() if e['tag'] == 'wifi.client.handshake']: + filename = h['data']['file'] sta_mac = h['data']['station'] ap_mac = h['data']['ap'] key = "%s -> %s" % (sta_mac, ap_mac) @@ -347,7 +351,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): if apsta is None: core.log("!!! captured new handshake: %s !!!" % key) self._last_pwnd = ap_mac - plugins.on('handshake', self, ap_mac, sta_mac) + plugins.on('handshake', self, filename, ap_mac, sta_mac) else: (ap, sta) = apsta self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[ @@ -356,7 +360,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): ap['channel'], sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'])) - plugins.on('handshake', self, ap, sta) + plugins.on('handshake', self, filename, ap, sta) except Exception as e: core.log("error: %s" % e) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py index 60efbd2..4a63275 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/example.py @@ -143,7 +143,7 @@ def on_channel_hop(agent, channel): # called when a new handshake is captured, access_point and client_station are json objects # if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs -def on_handshake(agent, access_point, client_station): +def on_handshake(agent, filename, access_point, client_station): pass diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py new file mode 100644 index 0000000..c3c53a9 --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/gps.py @@ -0,0 +1,47 @@ +__author__ = 'evilsocket@gmail.com' +__version__ = '1.0.0' +__name__ = 'gps' +__license__ = 'GPL3' +__description__ = 'Save GPS coordinates whenever an handshake is captured.' +__enabled__ = True # set to false if you just don't use GPS + +import core +import json +import os + +device = '/dev/ttyUSB0' +speed = 19200 +running = False + + +def on_loaded(): + core.log("GPS plugin loaded for %s" % device) + + +def on_ready(agent): + global running + + if os.path.exists(device): + core.log("enabling GPS bettercap's module for %s" % device) + try: + agent.run('gps off') + except: + pass + + agent.run('set gps.device %s' % device) + agent.run('set gps.speed %d' % speed) + agent.run('gps on') + running = True + else: + core.log("no GPS detected") + + +def on_handshake(agent, filename, access_point, client_station): + if running: + info = agent.session() + gps = info['gps'] + gps_filename = filename.replace('.pcap', '.gps.json') + + core.log("saving GPS to %s (%s)" % (gps_filename, gps)) + with open(gps_filename, 'w+t') as fp: + json.dump(gps, fp) From 760a94a0fef60a8e8c9cd2caa40c6aff01e1792b Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:46:08 +0100 Subject: [PATCH 23/62] move env only to install --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index edfa3a6..ba17f32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,8 +22,9 @@ before_script: - sudo apt-get -y update - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx - sudo update-binfmts --display +- sudo -E env "PATH=$PATH" make install script: -- sudo -E env "PATH=$PATH" make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" +- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" # TODO: deploy! From 00725ae9c7b56869a06ba5b0e860b71e2e878b82 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:49:12 +0100 Subject: [PATCH 24/62] add make clean --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ba17f32..21c8fda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,7 @@ before_script: - sudo apt-get -y update - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx - sudo update-binfmts --display +- sudo -E env "PATH=$PATH" make clean - sudo -E env "PATH=$PATH" make install script: From 01ed7c417c9e82a68c2f996ce579bd149e5f1129 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:53:29 +0100 Subject: [PATCH 25/62] change make stage --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 21c8fda..0e357f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,10 +22,10 @@ before_script: - sudo apt-get -y update - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx - sudo update-binfmts --display -- sudo -E env "PATH=$PATH" make clean -- sudo -E env "PATH=$PATH" make install script: +- sudo -E env "PATH=$PATH" make clean +- sudo -E env "PATH=$PATH" make install - sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" # TODO: deploy! From cf1558eb29792f17fa4b62af01e2fe60a0ec13e2 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Wed, 2 Oct 2019 19:58:01 +0200 Subject: [PATCH 26/62] fix: keep led on to understand when the unit is still alive --- .../rootfs/root/pwnagotchi/scripts/blink.sh | 5 --- .../pwnagotchi/scripts/pwnagotchi/voice.py | 35 ++++--------------- 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh index 48673dc..e7f475e 100755 --- a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh +++ b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh @@ -10,8 +10,3 @@ done echo 0 >/sys/class/leds/led0/brightness sleep 0.3 - -# Powersave options -# Disable power LED ~30ma -echo none >/sys/class/leds/led0/trigger -echo 1 >/sys/class/leds/led0/brightness diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py index 45f5092..53460ed 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py @@ -17,44 +17,36 @@ class Voice: def default(self): return self._('ZzzzZZzzzzZzzz') - def on_starting(self): return random.choice([ \ self._('Hi, I\'m Pwnagotchi!\nStarting ...'), self._('New day, new hunt,\nnew pwns!'), self._('Hack the Planet!')]) - def on_ai_ready(self): return random.choice([ self._('AI ready.'), self._('The neural network\nis ready.')]) - def on_normal(self): return random.choice([ \ '', '...']) - def on_free_channel(self, channel): return self._('Hey, channel {channel} is\nfree! Your AP will\nsay thanks.').format(channel=channel) - def on_bored(self): return random.choice([ \ self._('I\'m bored ...'), self._('Let\'s go for a walk!')]) - def on_motivated(self, reward): return self._('This is the best\nday of my life!') - def on_demotivated(self, reward): return self._('Shitty day :/') - def on_sad(self): return random.choice([ \ self._('I\'m extremely bored ...'), @@ -62,7 +54,6 @@ class Voice: self._('I\'m sad'), '...']) - def on_excited(self): return random.choice([ \ self._('I\'m living the life!'), @@ -71,51 +62,43 @@ class Voice: self._('I\'m having so much\nfun!'), self._('My crime is that of\ncuriosity ...')]) - def on_new_peer(self, peer): return random.choice([ \ self._('Hello\n{name}!\nNice to meet you. {name}').format(name=peer.name()), self._('Unit\n{name}\nis nearby! {name}').format(name=peer.name())]) - def on_lost_peer(self, peer): return random.choice([ \ self._('Uhm ...\ngoodbye\n{name}').format(name=peer.name()), self._('{name}\nis gone ...').format(name=peer.name())]) - def on_miss(self, who): return random.choice([ \ self._('Whoops ...\n{name}\nis gone.').format(name=who), self._('{name}\nmissed!').format(name=who), self._('Missed!')]) - def on_lonely(self): return random.choice([ \ self._('Nobody wants to\nplay with me ...'), self._('I feel so alone ...'), self._('Where\'s everybody?!')]) - def on_napping(self, secs): return random.choice([ \ self._('Napping for {secs}s ...').format(secs=secs), self._('Zzzzz'), self._('ZzzZzzz ({secs}s)').format(secs=secs)]) - def on_awakening(self): return random.choice(['...', '!']) - def on_waiting(self, secs): return random.choice([ \ self._('Waiting for {secs}s ...').format(secs=secs), '...', self._('Looking around ({secs}s)').format(secs=secs)]) - def on_assoc(self, ap): ssid, bssid = ap['hostname'], ap['mac'] what = ssid if ssid != '' and ssid != '' else bssid @@ -124,23 +107,19 @@ class Voice: self._('Associating to\n{what}').format(what=what), self._('Yo\n{what}!').format(what=what)]) - - def on_deauth(self,sta): + def on_deauth(self, sta): return random.choice([ \ self._('Just decided that\n{mac}\nneeds no WiFi!').format(mac=sta['mac']), self._('Deauthenticating\n{mac}').format(mac=sta['mac']), self._('Kickbanning\n{mac}!').format(mac=sta['mac'])]) - def on_handshakes(self, new_shakes): s = 's' if new_shakes > 1 else '' return self._('Cool, we got {num}\nnew handshake{plural}!').format(num=new_shakes, plural=s) - def on_rebooting(self): return self._("Ops, something\nwent wrong ...\nRebooting ...") - def on_log(self, log): status = self._('Kicked {num} stations\n').format(num=log.deauthed) status += self._('Made {num} new friends\n').format(num=log.associated) @@ -151,10 +130,10 @@ class Voice: status += self._('Met {num} peers').format(num=log.peers) return status - def on_log_tweet(self, log): - return self._('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').format( - duration=log.duration_human, - deauthed=log.deauthed, - associated=log.associated, - handshakes=log.handshakes) + return self._( + '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').format( + duration=log.duration_human, + deauthed=log.deauthed, + associated=log.associated, + handshakes=log.handshakes) From 3ada1f875d0db2b8d335b2971992f9df70b3d1c2 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 18:58:26 +0100 Subject: [PATCH 27/62] fix make commands --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0e357f5..a366cb1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,8 @@ before_script: - sudo update-binfmts --display script: -- sudo -E env "PATH=$PATH" make clean +- sudo make clean - sudo -E env "PATH=$PATH" make install -- sudo make -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" +- sudo make image -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" # TODO: deploy! From dcc5fd9027dde7c7419f787ed0903de59b5839cc Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 19:41:49 +0100 Subject: [PATCH 28/62] disable library during build --- builder/pwnagotchi.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/builder/pwnagotchi.json b/builder/pwnagotchi.json index c78629e..beac17b 100644 --- a/builder/pwnagotchi.json +++ b/builder/pwnagotchi.json @@ -14,6 +14,7 @@ { "type": "shell", "inline": [ + "sed -i 's/^\\([^#]\\)/#\\1/g' /etc/ld.so.preload", "apt-get -y update", "apt-get install -y ansible" ] @@ -21,6 +22,12 @@ { "type":"ansible-local", "playbook_file": "pwnagotchi.yml" + }, + { + "type": "shell", + "inline": [ + "sed -i 's/^#\\(.+\\)/\\1/g' /etc/ld.so.preload" + ] } ] } From 59bbc2299530e66e4a7c15fc9ef23bdfc18ec27c Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 20:25:56 +0100 Subject: [PATCH 29/62] remove quotes from variables --- .travis.yml | 2 +- Makefile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index a366cb1..6c25051 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,6 @@ before_script: script: - sudo make clean - sudo -E env "PATH=$PATH" make install -- sudo make image -e PWN_HOSTNAME="pwnagotchi" VERSION="$TRAVIS_TAG" +- sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG # TODO: deploy! diff --git a/Makefile b/Makefile index 75ec0d1..0d898dd 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -PWN_HOSTNAME="pwnagotchi" -PWN_VERSION="master" +PWN_HOSTNAME=pwnagotchi +PWN_VERSION=master all: install image clean From 654456127ec6be3617d8c06a91890d38442d88f5 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 21:33:08 +0100 Subject: [PATCH 30/62] Add the check if HDMI cable is connected For some reason this if was not added during my PR. --- sdcard/rootfs/etc/rc.local | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdcard/rootfs/etc/rc.local b/sdcard/rootfs/etc/rc.local index e93d2d8..bab03e6 100755 --- a/sdcard/rootfs/etc/rc.local +++ b/sdcard/rootfs/etc/rc.local @@ -11,6 +11,9 @@ # # By default this script does nothing. # Powersave (Disable HDMI) ~30ma -/opt/vc/bin/tvservice -o +sleep 10 +if ! /opt/vc/bin/tvservice -s | grep HDMI; then + /opt/vc/bin/tvservice -o +fi /root/pwnagotchi/scripts/startup.sh & exit 0 From 84e256f41fd1aa994171b9ca4bcbb99136116a01 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Wed, 2 Oct 2019 22:09:46 +0100 Subject: [PATCH 31/62] Adds .DEREK.yml Derek is a bot that will allow us to manage PRs and Issues without needing access to the repository. It allows us to assign labels, users and a lot of other features https://reaxt.com/alexellis/derek/blob/master/USER_GUIDE.md @evilsocket you will need to add the derek app to your repo https://github.com/apps/derek --- .DEREK.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .DEREK.yml diff --git a/.DEREK.yml b/.DEREK.yml new file mode 100644 index 0000000..c63d9d1 --- /dev/null +++ b/.DEREK.yml @@ -0,0 +1,10 @@ +maintainers: + - evilsocket + - caquino + - dadav + - justin-p + +features: + - comments + - pr_description_required + From 30a753b659e690358c66559a81173e2697eb8646 Mon Sep 17 00:00:00 2001 From: Periklis Fregkos Date: Thu, 3 Oct 2019 07:46:51 +0300 Subject: [PATCH 32/62] Added DEBUG face (#__#) --- sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py index a13eb73..1e09be1 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/faces.py @@ -15,3 +15,4 @@ LONELY = '(ب__ب)' SAD = '(╥☁╥ )' FRIEND = '(♥‿‿♥)' BROKEN = '(☓‿‿☓)' +DEBUG = '(#__#)' From 8d35fbabd5654ee45dfde842140a97b1446473ee Mon Sep 17 00:00:00 2001 From: Periklis Fregkos Date: Thu, 3 Oct 2019 07:47:38 +0300 Subject: [PATCH 33/62] Added custom text voice --- sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py index 53460ed..c3e3692 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py @@ -137,3 +137,6 @@ class Voice: deauthed=log.deauthed, associated=log.associated, handshakes=log.handshakes) + + def custom(self, text): + return self._(text) From 7067bcfd2b9884a6fa7b25bf500b8c23ade7f50d Mon Sep 17 00:00:00 2001 From: Leajian Date: Thu, 3 Oct 2019 09:03:43 +0300 Subject: [PATCH 34/62] Update Greek voice * Renamed gr to el per iso639-2 * Fixed some typos * Removed plural form of translated handshake word because that would add the latin letter 's' in the end, which is wrong --- .../locale/{gr => el}/LC_MESSAGES/voice.mo | Bin 4763 -> 4723 bytes .../locale/{gr => el}/LC_MESSAGES/voice.po | 15 ++++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) rename sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/{gr => el}/LC_MESSAGES/voice.mo (80%) rename sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/{gr => el}/LC_MESSAGES/voice.po (94%) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo similarity index 80% rename from sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.mo rename to sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo index b2bf23d5864ca468cb0e46eddcc9738a6b8c708c..b06caaa4b2e7d0c5a1412fc4db5ac3b51b21eaf0 100644 GIT binary patch delta 496 zcmXZYze_?<6u|LohUx2>DM4hvUZzoqAsG>pWfBdh)KCpIJ<7z?gs0Hx(ijD~)lhps zNSv&(r6H911Dc|Lz`goDUw8SObMC#|bI+Bp<$XLgmBS_>npPoPLI_C`VjPDtiOV>G z=jg!)9K&~vVG9E|*DXXI_i+(F(2Gu4h*5nX`*0g4FpF-ykVUy2+*25&@QRc8g+FMw z8;!_4LJX1bpx($aDtP&yKjRenCk~+1VKnN&Uh)-;;}-hy250ciQ8s?^OJR*djMMr< zXQ)r&79-fiCA2$@{UpwkAEJKl8ui9rFofUeLpNj9e;UPp+(ic7Uiv*>&1QC4A|WL> z9}WinL6($Ii>1J(rXCe@YN?=wm5r2^$>uUeWmQY1vxTCva9{+{bY9KmDtoqSWm-C^ dJxOtsx!$;|b;(_pjz+!Wa78;CRf2U_;t$T8NwWX| delta 503 zcmXZYODKd<6u|NGrI-iCOiCW{F`kXVd>&=WBMWK}3(8JkW+qd^Fa|}MBH6Iex1cQ9 zqghgxHXd7zrH!SMg%bYPxSQWS=iJ*l_rBMkG+gX!=~+$W(I(;%k#>iO7l&{fqgajC zSclJ8i{Chex>LlDbGU$q*pEM0kNt%rHL8xKxPy&&j1_oODCxgVmP93q4{Szv5lt|N z(i8u;l-=U&pvsZkOMRE@4s z{lpXY;TH~I(4DJqU>ETbs&jX!8opsCdiYKi52JeNJeJ`OYN(dF*O0O2dGfshJnzCEV%Cd$&}#CG{Q_YIOr8J$ diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po similarity index 94% rename from sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po rename to sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po index 26a2511..e93f004 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/gr/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po @@ -1,15 +1,16 @@ # pwnigotchi voice data # Copyright (C) 2019 # This file is distributed under the same license as the pwnagotchi package. -# FIRST AUTHOR Perilis Fregkos , 2019. +# FIRST AUTHOR Periklis Fregkos , 2019. +# CO AUTHOR Panos Vasilopoulos , 2019. # msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-29 13:42+0200\n" -"PO-Revision-Date: 2019-10-01 16:22+0000\n" -"Last-Translator: Panos Vasilopoulos \n" +"PO-Revision-Date: 2019-10-03 08:00+0000\n" +"Last-Translator: Periklis Fregkos \n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: el\n" "MIME-Version: 1.0\n" @@ -25,7 +26,7 @@ msgid "" "Hi, I'm Pwnagotchi!\n" "Starting ..." msgstr "" -"Γεία, είμαι το Pwnagotchi!\n" +"Γειά, είμαι το Pwnagotchi!\n" "Εκκινούμαι ..." #: voice.py:22 @@ -200,7 +201,7 @@ msgstr "Νιώθω μοναχός μου ..." #: voice.py:96 msgid "Where's everybody?!" -msgstr "Μα, πού πήγαν όλοi;!" +msgstr "Μα, πού πήγαν όλοι;!" #: voice.py:101 #, python-brace-format @@ -252,7 +253,7 @@ msgid "" "Yo\n" "{what}!" msgstr "" -"Που'σ ρε τρελέ\n" +"Που'σαι ρε τρελέ\n" "{what}!" #: voice.py:128 @@ -291,7 +292,7 @@ msgid "" "new handshake{plural}!" msgstr "" "Τέλεια δικέ μου, πήραμε {num}\n" -"νέες χειραψίες{plural}!" +"νέες χειραψίες!" #: voice.py:139 msgid "" From f108ed95a7d0c559b028a263edcdebfa2f66c308 Mon Sep 17 00:00:00 2001 From: IncredInComp Date: Wed, 2 Oct 2019 23:12:57 -0700 Subject: [PATCH 35/62] added hostname backup and restore https://github.com/evilsocket/pwnagotchi/issues/69#issue-501710314 Couldn't decide if it should be a separate option by itself, but I personally think they do go hand in hand. --- scripts/update_pwnagotchi.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh index 0039e7b..eae69d5 100644 --- a/scripts/update_pwnagotchi.sh +++ b/scripts/update_pwnagotchi.sh @@ -18,8 +18,8 @@ function usage() { -v # Version to update to, can be a branch or commit. (default: master) -u # Url to clone from. (default: https://github.com/evilsocket/pwnagotchi) -m # Mode to restart to. (Supported: ${SUPPORTED_RESTART_MODES[*]}; default: auto) - -b # Backup the current pwnagotchi config. - -r # Restore the current pwnagotchi config. (-b will be enabled.) + -b # Backup the current pwnagotchi config and hostname references. + -r # Restore the current pwnagotchi config and hostname references. (-b will be enabled.) -h # Shows this help. EOF @@ -89,8 +89,11 @@ echo "[+] Installing $(git log -1 --format="%h")" echo "[+] Updating..." if [ $BACKUPCONFIG -eq 1 ]; then - echo "[+] Creating backup of config.yml" - mv /root/pwnagotchi/config.yml /root/config.yml.bak -f + echo "[+] Creating backup of config.yml and hostname references" + mv /root/pwnagotchi/config.yml /root/config.bak -f + mv /etc/hosts /root/hosts.bak -f + mv /etc/hostname /root/hostname.bak -f + mv /etc/network/interfaces /root/interfaces.bak -f fi rm /root/pwnagotchi -rf # ensures old files are removed rsync -aPq $GIT_FOLDER/sdcard/boot/* /boot/ @@ -98,8 +101,11 @@ rsync -aPq $GIT_FOLDER/sdcard/rootfs/* / cd /tmp rm $GIT_FOLDER -rf if [ $RESTORECONFIG -eq 1 ]; then - echo "[+] Restoring backup of config.yml" + echo "[+] Restoring backup of config.yml and hostname references" mv /root/config.yml.bak /root/pwnagotchi/config.yml -f + mv /etc/hosts.bak /etc/hosts -f + mv /etc/hostname.bak /etc/hostname -f + mv /etc/network/interfaces.bak /etc/network/interfaces -f fi echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)" @@ -108,4 +114,4 @@ if [ $MODE == "auto" ]; then elif [ $MODE == "manual" ]; then sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.manual fi -echo "[+] Finished" \ No newline at end of file +echo "[+] Finished" From 961b4250de4d1fd749c497cdbab37b59de7758e5 Mon Sep 17 00:00:00 2001 From: IncredInComp Date: Thu, 3 Oct 2019 00:58:23 -0700 Subject: [PATCH 36/62] Update update_pwnagotchi.sh --- scripts/update_pwnagotchi.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/update_pwnagotchi.sh b/scripts/update_pwnagotchi.sh index eae69d5..97b8a89 100644 --- a/scripts/update_pwnagotchi.sh +++ b/scripts/update_pwnagotchi.sh @@ -103,9 +103,9 @@ rm $GIT_FOLDER -rf if [ $RESTORECONFIG -eq 1 ]; then echo "[+] Restoring backup of config.yml and hostname references" mv /root/config.yml.bak /root/pwnagotchi/config.yml -f - mv /etc/hosts.bak /etc/hosts -f - mv /etc/hostname.bak /etc/hostname -f - mv /etc/network/interfaces.bak /etc/network/interfaces -f + mv /root/hosts.bak /etc/hosts -f + mv /root/hostname.bak /etc/hostname -f + mv /root/interfaces.bak /etc/network/interfaces -f fi echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)" From efc20e6a3dd11aacae7c377bbe58753e4366931c Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 10:20:30 +0200 Subject: [PATCH 37/62] render unto caesar --- README.md | 2 +- sdcard/rootfs/root/pwnagotchi/scripts/blink.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e4567a..18761ad 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ the `PARTUUID`s for `rootfs` and `boot` partitions are the same in `/etc/fstab`. ## License -`pwnagotchi` is made with ♥ by [@evilsocket](https://twitter.com/evilsocket) and it's released under the GPL3 license. +`pwnagotchi` is made with ♥ by [@evilsocket](https://twitter.com/evilsocket) and the [amazing dev team](https://github.com/evilsocket/pwnagotchi/graphs/contributors). It's released under the GPL3 license. diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh index e7f475e..6ad62a3 100755 --- a/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh +++ b/sdcard/rootfs/root/pwnagotchi/scripts/blink.sh @@ -9,4 +9,4 @@ do done echo 0 >/sys/class/leds/led0/brightness -sleep 0.3 +sleep 0.3 \ No newline at end of file From 924c5c8fe6c0d5f62b9bca64acbf130e393f5e75 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Thu, 3 Oct 2019 09:21:03 +0100 Subject: [PATCH 38/62] minor builder fixes --- builder/pwnagotchi.yml | 4 ++-- sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml index 4d086bc..e6a988d 100644 --- a/builder/pwnagotchi.yml +++ b/builder/pwnagotchi.yml @@ -203,7 +203,7 @@ - name: configure usb interface blockinfile: - path: /etc/network/interfaces.d/usb0.cfg + path: /etc/network/interfaces.d/usb0-cfg create: yes block: | allow-hotplug usb0 @@ -216,7 +216,7 @@ - name: configure eth0 interface (pi2/3/4) blockinfile: - path: /etc/network/interfaces.d/eth0.cfg + path: /etc/network/interfaces.d/eth0-cfg create: yes block: | allow-hotplug eth0 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt b/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt index 0a82ef7..8fa5e8a 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt +++ b/sdcard/rootfs/root/pwnagotchi/scripts/requirements.txt @@ -10,3 +10,4 @@ file_read_backwards numpy inky smbus +pillow From d7f8feaa27eb14d56dbe59bf8ab00fada354bce0 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Thu, 3 Oct 2019 09:28:47 +0100 Subject: [PATCH 39/62] add wlan0 and lo interfaces --- builder/pwnagotchi.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml index e6a988d..03f9509 100644 --- a/builder/pwnagotchi.yml +++ b/builder/pwnagotchi.yml @@ -201,6 +201,20 @@ fi /root/pwnagotchi/scripts/startup.sh & + - name: configure lo interface + blockinfile: + path: /etc/network/interfaces.d/lo-cfg + block: | + auto lo + iface lo inet loopback + + - name: configure wlan interface + blockinfile: + path: /etc/network/interfaces.d/wlan0-cfg + block: | + allow-hotplug wlan0 + iface wlan0 inet static + - name: configure usb interface blockinfile: path: /etc/network/interfaces.d/usb0-cfg From 07f0a7a12d1428b167e1c6dc2cbaee0becf6d919 Mon Sep 17 00:00:00 2001 From: QuantumSheep Date: Thu, 3 Oct 2019 10:29:57 +0200 Subject: [PATCH 40/62] Add translation --- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 0 -> 429 bytes .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 288 ++++++++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo new file mode 100644 index 0000000000000000000000000000000000000000..a1c999a93b1ee455d9ac749892dcd07bf89d36da GIT binary patch literal 429 zcmbV|zfQw25QmFk%E-*%fvsF{k_sC0M~Kp)QY)$|Vs{hQF-q;oz7+Z(ydKZO1thvK z@smECtowAj^XKWw$AEG~oDt{5F>yik854n;Io00z&Cc0w!KbBo&?{D#22o zD3sg^*1lP(9hSBE#|*)g)r|>tw3scXhc8KD9!;D@Wog%aOGl%6$IG^n#@?{9mOd!F a>u>|(gV*1*Q68qYbd|AMu<_bpH24DfQ+mVz literal 0 HcmV?d00001 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po new file mode 100644 index 0000000..61533a1 --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po @@ -0,0 +1,288 @@ +# pwnigotchi voice data +# Copyright (C) 2019 +# This file is distributed under the same license as the pwnagotchi package. +# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-09-29 13:42+0200\n" +"PO-Revision-Date: 2019-09-29 14:00+0200\n" +"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n" +"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" +"Language: english\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: voice.py:16 +msgid "ZzzzZZzzzzZzzz" +msgstr "" + +#: voice.py:21 +msgid "" +"Bonjour, je suis Pwnagotchi!\n" +"Démarrage ..." +msgstr "" + +#: voice.py:22 +msgid "" +"New day, new hunt,\n" +"Nouvelle journée, nouvelle chasse,\n" +"nouveau pwns!" +msgstr "" + +#: voice.py:23 +msgid "Hack la planète!" +msgstr "" + +#: voice.py:28 +msgid "IA prête." +msgstr "" + +#: voice.py:29 +msgid "" +"Le réseau neuronal\n" +"est prêt." +msgstr "" + +#: voice.py:39 +#, python-brace-format +msgid "" +"Hey, le channel {channel} est\n" +"libre! Ton AP va\n" +"dis merci." +msgstr "" + +#: voice.py:44 +msgid "Je m'ennuie ..." +msgstr "" + +#: voice.py:45 +msgid "Allons faire un tour!" +msgstr "" + +#: voice.py:49 +msgid "" +"C'est le meilleur\n" +"jour de ma vie!" +msgstr "" + +#: voice.py:53 +msgid "Journée de merde :/" +msgstr "" + +#: voice.py:58 +msgid "Je m'ennuie énormément ..." +msgstr "" + +#: voice.py:59 +msgid "Je suis très triste ..." +msgstr "" + +#: voice.py:60 +msgid "Je suis triste" +msgstr "" + +#: voice.py:66 +msgid "Je vis la vie!" +msgstr "" + +#: voice.py:67 +msgid "Je pwn donc je suis." +msgstr "" + +#: voice.py:68 +msgid "Autant de réseaux!!!" +msgstr "" + +#: voice.py:69 +msgid "" +"Je m'amuse tellement!" +msgstr "" + +#: voice.py:70 +msgid "" +"Mon crime est celui de\n" +"la curiosité ..." +msgstr "" + +#: voice.py:75 +#, python-brace-format +msgid "" +"Bonjour\n" +"{name}!\n" +"Ravis de te rencontrer. {name}" +msgstr "" + +#: voice.py:76 +#, python-brace-format +msgid "" +"L'unité\n" +"{name}\n" +"est proche! {name}" +msgstr "" + +#: voice.py:81 +#, python-brace-format +msgid "" +"Hum ...\n" +"au revoir\n" +"{name}" +msgstr "" + +#: voice.py:82 +#, python-brace-format +msgid "" +"{name}\n" +"est parti ..." +msgstr "" + +#: voice.py:87 +#, python-brace-format +msgid "" +"Oups ...\n" +"{name}\n" +"est parti." +msgstr "" + +#: voice.py:88 +#, python-brace-format +msgid "" +"{name}\n" +"raté!" +msgstr "" + +#: voice.py:89 +msgid "Raté!" +msgstr "" + +#: voice.py:94 +msgid "" +"Personne ne veut\n" +"jouer avec moi ..." +msgstr "" + +#: voice.py:95 +msgid "Je me sens si seul ..." +msgstr "" + +#: voice.py:96 +msgid "Où est tout le monde?!" +msgstr "" + +#: voice.py:101 +#, python-brace-format +msgid "Fais la sieste pendant {secs}s ..." +msgstr "" + +#: voice.py:102 +msgid "Zzzzz" +msgstr "" + +#: voice.py:103 +#, python-brace-format +msgid "ZzzZzzz ({secs}s)" +msgstr "" + +#: voice.py:112 +#, python-brace-format +msgid "Attends pendant {secs}s ..." +msgstr "" + +#: voice.py:114 +#, python-brace-format +msgid "Regarde autour ({secs}s)" +msgstr "" + +#: voice.py:121 +#, python-brace-format +msgid "" +"Hey\n" +"{what}\n" +"soyons amis!" +msgstr "" + +#: voice.py:122 +#, python-brace-format +msgid "" +"Association à\n" +"{what}" +msgstr "" + +#: voice.py:123 +#, python-brace-format +msgid "" +"Yo\n" +"{what}!" +msgstr "" + +#: voice.py:128 +#, python-brace-format +msgid "" +"Décidé à l'instant que\n" +"{mac}\n" +"n'a pas besoin de WiFi!" +msgstr "" + +#: voice.py:129 +#, python-brace-format +msgid "" +"Désauthentification de\n" +"{mac}" +msgstr "" + +#: voice.py:130 +#, python-brace-format +msgid "" +"Kickbanning\n" +"{mac}!" +msgstr "" + +#: voice.py:135 +#, python-brace-format +msgid "" +"Cool, nous avons {num}\n" +"nouveaux handshake{plural}!" +msgstr "" + +#: voice.py:139 +msgid "" +"Oups, quelque\n" +"chose s'est mal passé ...\n" +"Redémarrage ..." +msgstr "" + +#: voice.py:143 +#, python-brace-format +msgid "{num} stations kick\n" +msgstr "" + +#: voice.py:144 +#, python-brace-format +msgid "Fait {num} nouveaux amis\n" +msgstr "" + +#: voice.py:145 +#, python-brace-format +msgid "Récupéré {num} handshakes\n" +msgstr "" + +#: voice.py:147 +msgid "1 peer rencontré" +msgstr "" + +#: voice.py:149 +#, python-brace-format +msgid "{num} peers recontrés" +msgstr "" + +#: voice.py:154 +#, python-brace-format +msgid "" +"J'ai pwn durant {duration} et kick {deauthed} clients! J'ai aussi rencontré " +"{associated} nouveaux amis and mangé {handshakes} handshakes! #pwnagotchi " +"#pwnlog #pwnlife #hacktheplanet #skynet" +msgstr "" From 654af0e2aed47354cc1c2eb9f8f3e9bb919ec5ab Mon Sep 17 00:00:00 2001 From: QuantumSheep Date: Thu, 3 Oct 2019 10:35:36 +0200 Subject: [PATCH 41/62] Fix headers --- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 429 -> 439 bytes .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo index a1c999a93b1ee455d9ac749892dcd07bf89d36da..b94cdec2f738e7c1e228c2a5a5bdcaa751208b53 100644 GIT binary patch delta 100 zcmZ3>yq$T13S;d=)mSb=16>1S1q&-9i;2C;wiZ^#CfWu@1_oR{iNz(lAw`LK#W{&3 u`9)R=g{6skC8fE=8L6oS3O43O=7uJgX4=T26CY->rWK{;B~K1uj0FJn5g?=h delta 79 zcmdnayq0-_3S;p^)mUx=OI;&N1w&&i6QhYe%8G_2Rt5&z21W)3Tt11#CAuL+iFw62 ji6!|(RthPJDT!s16&Q^t^E0}!rRJsQWEM}3VvGd, 2019. +# FIRST AUTHOR <7271496+quantumsheep@users.noreply.github.com>, 2019. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:42+0200\n" -"PO-Revision-Date: 2019-09-29 14:00+0200\n" -"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n" +"POT-Creation-Date: 2019-10-03 8:28+0200\n" +"PO-Revision-Date: 2019-09-29 8:34+0200\n" +"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" -"Language: english\n" +"Language: french\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" From 5aa7615a00c3ddff2bb3517c339c28a116dd0d29 Mon Sep 17 00:00:00 2001 From: QuantumSheep Date: Thu, 3 Oct 2019 10:36:22 +0200 Subject: [PATCH 42/62] Fix PO-Revision-Date --- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 439 -> 439 bytes .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo index b94cdec2f738e7c1e228c2a5a5bdcaa751208b53..6b236f3447527a4777fad68a9ba8ab4f6d0bb519 100644 GIT binary patch delta 16 Xcmdnayq$T%N>)PyT?6Bd>o^$!FMkCM delta 16 Xcmdnayq$T%N>&3)T_ekl>o^$!FX#mw diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po index 62462ec..ae7d7ba 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-10-03 8:28+0200\n" -"PO-Revision-Date: 2019-09-29 8:34+0200\n" +"PO-Revision-Date: 2019-10-03 8:34+0200\n" "Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: french\n" From d4be04fff14fe41b1a315002c7d07c0bdd0d9438 Mon Sep 17 00:00:00 2001 From: QuantumSheep Date: Thu, 3 Oct 2019 10:39:12 +0200 Subject: [PATCH 43/62] Finally fix the date creation and revision format --- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 439 -> 441 bytes .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo index 6b236f3447527a4777fad68a9ba8ab4f6d0bb519..b9b2b243d384e8b4de5ea574e23aac1202d319db 100644 GIT binary patch delta 24 ecmdnaypwr?3S<35)nq0^gNdDLKyu>-c18eS\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: french\n" From 47930a99aeb156d8e65ac88a7d2f40a898571acc Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 10:41:16 +0200 Subject: [PATCH 44/62] configured travis deploy --- .travis.yml | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6c25051..48f29dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,26 +6,42 @@ go: env: global: - - LANG=C - - LC_ALL=C + - LANG=C + - LC_ALL=C before_cache: -- mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt -- sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete + - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt + - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete cache: apt: true directories: - - tmp/ + - tmp/ before_script: -- sudo apt-get -y update -- sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx -- sudo update-binfmts --display + - sudo apt-get -y update + - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx + - sudo update-binfmts --display script: -- sudo make clean -- sudo -E env "PATH=$PATH" make install -- sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG + - sudo make clean + - sudo -E env "PATH=$PATH" make install + - sudo make image -e PWN_HOSTNAME=pwnagotchi VERSION=$TRAVIS_TAG -# TODO: deploy! +before_deploy: + # Set up git user name and tag this commit + - git config --local user.name "evilsocket" + - git config --local user.email "evilsocket@gmail.com" + - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)} + - git tag $TRAVIS_TAG + +deploy: + provider: releases + api_key: + secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8=" + skip_cleanup: true + file_glob: true + file: pwnagotchi-*.zip + on: + repo: evilsocket/pwnagotchi + all_branches: true From d69e938676db2bd9e6a21da450398e3150113e71 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 10:44:55 +0200 Subject: [PATCH 45/62] french --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 18761ad..50ef42e 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ Pwnagotchi is able to speak multiple languages!! Currently supported are: * greek * macedonian * italian +* french If you want to add a language use the `language.sh` script. If you want to add for example the language **italian** you would type: From 9205ca1e599c43442c280b43ae158fd6c979c738 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 11:09:25 +0200 Subject: [PATCH 46/62] new: implemented text auto wrapping. (closes #46) --- .../scripts/pwnagotchi/ui/components.py | 12 +++- .../pwnagotchi/scripts/pwnagotchi/ui/view.py | 19 +++-- .../pwnagotchi/scripts/pwnagotchi/voice.py | 70 +++++++++---------- 3 files changed, 59 insertions(+), 42 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py index 2d8b2f5..87b0576 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/components.py @@ -1,4 +1,5 @@ from PIL import Image +from textwrap import TextWrapper class Widget(object): @@ -39,14 +40,21 @@ class FilledRect(Widget): class Text(Widget): - def __init__(self, value="", position=(0, 0), font=None, color=0): + def __init__(self, value="", position=(0, 0), font=None, color=0, wrap=False, max_length=0): super().__init__(position, color) self.value = value self.font = font + self.wrap = wrap + self.max_length = max_length + self.wrapper = TextWrapper(width=self.max_length, replace_whitespace=False) if wrap else None def draw(self, canvas, drawer): if self.value is not None: - drawer.text(self.xy, self.value, font=self.font, fill=self.color) + if self.wrap: + text = '\n'.join(self.wrapper.wrap(self.value)) + else: + text = self.value + drawer.text(self.xy, text, font=self.font, fill=self.color) class LabeledValue(Widget): diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py index 3ae9089..ee3eb53 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py @@ -78,22 +78,26 @@ class View(object): label_font=fonts.Bold, text_font=fonts.Medium), - # 'square': Rect([1, 11, 124, 111]), + 'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK), 'line2': Line( [0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)], color=BLACK), - # 'histogram': Histogram([4, 94], color = BLACK), - 'face': Text(value=faces.SLEEP, position=face_pos, color=BLACK, font=fonts.Huge), 'friend_face': Text(value=None, position=(0, 90), font=fonts.Bold, color=BLACK), 'friend_name': Text(value=None, position=(40, 93), font=fonts.BoldSmall, color=BLACK), 'name': Text(value='%s>' % 'pwnagotchi', position=name_pos, color=BLACK, font=fonts.Bold), - # 'face2': Bitmap( '/root/pwnagotchi/data/images/face_happy.bmp', (0, 20)), - 'status': Text(value=self._voice.default(), position=status_pos, color=BLACK, font=fonts.Medium), + + 'status': Text(value=self._voice.default(), + position=status_pos, + color=BLACK, + font=fonts.Medium, + wrap=True, + # the current maximum number of characters per line, assuming each character is 6 pixels wide + max_length=(self._width - status_pos[0]) // 6), 'shakes': LabeledValue(label='PWND ', value='0 (00)', color=BLACK, position=(0, self._height - int(self._height * .12) + 1), label_font=fonts.Bold, @@ -300,6 +304,11 @@ class View(object): self.set('status', self._voice.on_rebooting()) self.update() + def on_custom(self, text): + self.set('face', faces.DEBUG) + self.set('status', self._voice.custom(text)) + self.update() + def update(self): with self._lock: self._canvas = Image.new('1', (self._width, self._height), WHITE) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py index c3e3692..02bff8b 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py @@ -18,74 +18,74 @@ class Voice: return self._('ZzzzZZzzzzZzzz') def on_starting(self): - return random.choice([ \ - self._('Hi, I\'m Pwnagotchi!\nStarting ...'), - self._('New day, new hunt,\nnew pwns!'), + return random.choice([ + self._('Hi, I\'m Pwnagotchi! Starting ...'), + self._('New day, new hunt, new pwns!'), self._('Hack the Planet!')]) def on_ai_ready(self): return random.choice([ self._('AI ready.'), - self._('The neural network\nis ready.')]) + self._('The neural network is ready.')]) def on_normal(self): - return random.choice([ \ + return random.choice([ '', '...']) def on_free_channel(self, channel): - return self._('Hey, channel {channel} is\nfree! Your AP will\nsay thanks.').format(channel=channel) + return self._('Hey, channel {channel} is free! Your AP will say thanks.').format(channel=channel) def on_bored(self): - return random.choice([ \ + return random.choice([ self._('I\'m bored ...'), self._('Let\'s go for a walk!')]) def on_motivated(self, reward): - return self._('This is the best\nday of my life!') + return self._('This is the best day of my life!') def on_demotivated(self, reward): return self._('Shitty day :/') def on_sad(self): - return random.choice([ \ + return random.choice([ self._('I\'m extremely bored ...'), self._('I\'m very sad ...'), self._('I\'m sad'), '...']) def on_excited(self): - return random.choice([ \ + return random.choice([ self._('I\'m living the life!'), self._('I pwn therefore I am.'), self._('So many networks!!!'), - self._('I\'m having so much\nfun!'), - self._('My crime is that of\ncuriosity ...')]) + self._('I\'m having so much fun!'), + self._('My crime is that of curiosity ...')]) def on_new_peer(self, peer): - return random.choice([ \ - self._('Hello\n{name}!\nNice to meet you. {name}').format(name=peer.name()), - self._('Unit\n{name}\nis nearby! {name}').format(name=peer.name())]) + return random.choice([ + self._('Hello {name}! Nice to meet you. {name}').format(name=peer.name()), + self._('Unit {name} is nearby! {name}').format(name=peer.name())]) def on_lost_peer(self, peer): - return random.choice([ \ - self._('Uhm ...\ngoodbye\n{name}').format(name=peer.name()), - self._('{name}\nis gone ...').format(name=peer.name())]) + return random.choice([ + self._('Uhm ... goodbye {name}').format(name=peer.name()), + self._('{name} is gone ...').format(name=peer.name())]) def on_miss(self, who): - return random.choice([ \ - self._('Whoops ...\n{name}\nis gone.').format(name=who), - self._('{name}\nmissed!').format(name=who), + return random.choice([ + self._('Whoops ... {name} is gone.').format(name=who), + self._('{name} missed!').format(name=who), self._('Missed!')]) def on_lonely(self): - return random.choice([ \ - self._('Nobody wants to\nplay with me ...'), + return random.choice([ + self._('Nobody wants to play with me ...'), self._('I feel so alone ...'), self._('Where\'s everybody?!')]) def on_napping(self, secs): - return random.choice([ \ + return random.choice([ self._('Napping for {secs}s ...').format(secs=secs), self._('Zzzzz'), self._('ZzzZzzz ({secs}s)').format(secs=secs)]) @@ -94,7 +94,7 @@ class Voice: return random.choice(['...', '!']) def on_waiting(self, secs): - return random.choice([ \ + return random.choice([ self._('Waiting for {secs}s ...').format(secs=secs), '...', self._('Looking around ({secs}s)').format(secs=secs)]) @@ -102,23 +102,23 @@ class Voice: def on_assoc(self, ap): ssid, bssid = ap['hostname'], ap['mac'] what = ssid if ssid != '' and ssid != '' else bssid - return random.choice([ \ - self._('Hey\n{what}\nlet\'s be friends!').format(what=what), - self._('Associating to\n{what}').format(what=what), - self._('Yo\n{what}!').format(what=what)]) + return random.choice([ + self._('Hey {what} let\'s be friends!').format(what=what), + self._('Associating to {what}').format(what=what), + self._('Yo {what}!').format(what=what)]) def on_deauth(self, sta): - return random.choice([ \ - self._('Just decided that\n{mac}\nneeds no WiFi!').format(mac=sta['mac']), - self._('Deauthenticating\n{mac}').format(mac=sta['mac']), - self._('Kickbanning\n{mac}!').format(mac=sta['mac'])]) + return random.choice([ + self._('Just decided that {mac} needs no WiFi!').format(mac=sta['mac']), + self._('Deauthenticating {mac}').format(mac=sta['mac']), + self._('Kickbanning {mac}!').format(mac=sta['mac'])]) def on_handshakes(self, new_shakes): s = 's' if new_shakes > 1 else '' - return self._('Cool, we got {num}\nnew handshake{plural}!').format(num=new_shakes, plural=s) + return self._('Cool, we got {num} new handshake{plural}!').format(num=new_shakes, plural=s) def on_rebooting(self): - return self._("Ops, something\nwent wrong ...\nRebooting ...") + return self._("Ops, something went wrong ... Rebooting ...") def on_log(self, log): status = self._('Kicked {num} stations\n').format(num=log.deauthed) From a3c05b3e8538098ad5ce4941ab7ad9746527a3c5 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 11:27:51 +0200 Subject: [PATCH 47/62] example plugin --- README.md | 54 ++++++++++++++++++- .../rootfs/root/pwnagotchi/scripts/startup.sh | 2 - 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50ef42e..7f23677 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,59 @@ Now you can use the `preview.py`-script to preview the changes: Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default -plugins and all the callbacks that you can define for your own customizations. +plugins and all the callbacks that you can define for your own customizations. + +Here's as an example the GPS plugin: + +```python +__author__ = 'evilsocket@gmail.com' +__version__ = '1.0.0' +__name__ = 'gps' +__license__ = 'GPL3' +__description__ = 'Save GPS coordinates whenever an handshake is captured.' +__enabled__ = True # set to false if you just don't use GPS + +import core +import json +import os + +device = '/dev/ttyUSB0' +speed = 19200 +running = False + + +def on_loaded(): + core.log("GPS plugin loaded for %s" % device) + + +def on_ready(agent): + global running + + if os.path.exists(device): + core.log("enabling GPS bettercap's module for %s" % device) + try: + agent.run('gps off') + except: + pass + + agent.run('set gps.device %s' % device) + agent.run('set gps.speed %d' % speed) + agent.run('gps on') + running = True + else: + core.log("no GPS detected") + + +def on_handshake(agent, filename, access_point, client_station): + if running: + info = agent.session() + gps = info['gps'] + gps_filename = filename.replace('.pcap', '.gps.json') + + core.log("saving GPS to %s (%s)" % (gps_filename, gps)) + with open(gps_filename, 'w+t') as fp: + json.dump(gps, fp) +``` ### Random Info diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh b/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh index f158830..58b681c 100755 --- a/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh +++ b/sdcard/rootfs/root/pwnagotchi/scripts/startup.sh @@ -9,5 +9,3 @@ if ifconfig | grep usb0 | grep RUNNING; then else sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto fi - - From 191067f9e8820ca2674ea3fad6f982ab037fbf31 Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 11:54:56 +0200 Subject: [PATCH 48/62] Fixed language files --- .../pwnagotchi/locale/de/LC_MESSAGES/voice.mo | Bin 3905 -> 3845 bytes .../pwnagotchi/locale/de/LC_MESSAGES/voice.po | 122 ++++++++-------- .../pwnagotchi/locale/el/LC_MESSAGES/voice.mo | Bin 4723 -> 4665 bytes .../pwnagotchi/locale/el/LC_MESSAGES/voice.po | 116 +++++++-------- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.mo | Bin 441 -> 400 bytes .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 60 ++++---- .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 3755 -> 3761 bytes .../pwnagotchi/locale/mk/LC_MESSAGES/voice.mo | Bin 4618 -> 4559 bytes .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po | 125 +++++++++-------- .../pwnagotchi/locale/nl/LC_MESSAGES/voice.mo | Bin 4012 -> 3947 bytes .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po | 132 +++++++++--------- 11 files changed, 278 insertions(+), 277 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo index e78a76aaf3c5ec299261cd9a855b3e47be7f7af1..52124cebbf25065fd7de320a2070709b2df9ab0f 100644 GIT binary patch delta 1583 zcmY+@O>7%Q7zW@8actu>E~O=Ho#4#UrcN4TM5H20OA)0iDL+jSico}9*m%eG*6Z17 zca3GD$W$sws2mU@1S$uRIM73diYkOaJy4<^%84Iw-~cG%7%m*j0fFFscO4W)UOltB zGv9pk&H8%r)#97w-VPze`k)X~P^5&o3rzQY1m1!B1-KX1-~;diEWoee1pEnZhkrxP z-!>$~2rR*!@BkczPeZQfzzpmTiC(315T{!Pg)& zz7AQLH8>8_!$~50AWMD-GR`xQ2{j=TJP%o!cOetM1iyn{Lax&@TZBMgd=44l24rTx zKnD5)a^hBOi#seqE_e`P6Jj3jgNu-rdId7!xBGqyXL0`n#7|`N$+%I7BRL~x(Ak3* zk3$A-!Xi8enaBr_rTYvrp|2qm`4w_!w;(DVH^!O9#c^y*kS$K!Y#ZF!!v_}6;!_J3 zCdXe2cKKhs7d>uaquqlJOT$l|rQkU+GuCek7qew6<6{tOc&pPH2faw=7STTJls!+eo9@a4qv^$~R|*{ux?s+0_+u zHeE0m(ihFX%!B5I%x=@oOyoOCN3s+6x-Kh~in)|IYSuG_`y8z4*JP_JJ-4PTvCwGo zeckt+rLIcS6${#p`k5ch&Xtm`8=?qWRmA^pIl2Gj>gDY7116grH!gYz zdCaXgno4V>Uv7IUfE9ByH`YTvTuUBPu1@L^I4YEm8%PHg!JthgvBOZdbtsPqs;wO* zLrhBQg4lA&)eN$!JkLgU5UDt|6Btliz1Hw#3u8lH+Mb8eN}9Rh(^o$lmIIc<@NprV zjPsm(+?7j#-L5t)@uXXADzm=jV{>uji1~43%-kBWwud+aRg-n)+3lLrae-&@M~%+k zZQjTivJnQXUR!dqxnU#`)=`1^CV%+;jq2fWRDGj#9E00U#e7KxXOUNAiGKlc C>1@0g_UJ8kHUrwFn`!_Kv+n>{+zC z#!7-^4#1&8qI5w*NL4Q&L8azW1QLQu5V&xo7y1VPhjM5^;s8Cs^X@v(jy&_5nSJM- zXPz0qIr7cO`9gb_5aPEkA;!Q=R*2o;ILPxe;8yS~cnH*B9y|{o1+Rbv{tE5@t?qQ) z5SYXGA#f0UqQf)bPKyFEr{I0yHINhk z1WNE0xCQ(hZHZW3hS^B{p590$)??NsUKnBWt9*9pAQ3H%de0lRyJ7zQUm zPIwaJ_%gT`Y=SKK0yqGE3?9n}@fpYhZ*NZH?|>5+Z^0zzdAyCz9&{E#w%P|r!Ph}P z!6)Dp_yc$dwE9vZMUWHBgM3vk$az*ed=F%SYal!GEy(fL!Rz2nkoReS-7f@w;ukcW z;17^b+>Z-ns}F#@a0=W8E`YpY1;k;*Yal0j3*;+W0|{L3@Mmxm<8Ii3u6PXOxH%A4 z^0Iglor9QI0ePcKAc0?iEaV2r*4_fy>P_HGtC*=Uz`%zgqyM;q0g@ucF zTh}12JN1J(f{LWc?rZ@bUs5>hzD}Qy$oIh3uo}GddrASL!>ITNC92232~<|fD%l#m zfu!JZ9!XvU`!IyMKb;qwKz^P_P}u_ZSHwSd9VWTj^qihe;_F(wh(>iH1CgVs^B&slrWde*+JvZ+i& z&A>NRDi(_}e&3qOOC3_69Cx`W7CiLvi#!F*VI3MWdrmU&hos zH@-2z%BpWvQKUX_VjlBW8&g-`>3tysH8(fs(e}tOv=7MXS$RrD5gpfMPcA8Alv!!i zQ~<(^yWDibkQyeW6McJ}FvyxQuc%t7h$rm5pg9L{c2DR3HPFEw4s_*(xOR@HLTXfNl6 z(0-q@cgYYprz%ucHK$QgCiVQU+zh@S8yJ3CE;v=Z9&I3SUX_%=)h~MWBrL+(^{>`1 zZJ7Ry3f4d3hsiGt&PD_&t_o!Q!NAlb|K9+vS5^PBo8vIP`vzWB!7DgXWQ%_RRZ}?p diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po index 95393cb..ae6593e 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.po @@ -23,19 +23,19 @@ msgstr "" #: voice.py:21 msgid "" -"Hi, I'm Pwnagotchi!\n" +"Hi, I'm Pwnagotchi!" "Starting ..." msgstr "" -"Hi, ich bin\n" -"ein Pwnagotchi!\n" +"Hi, ich bin" +"ein Pwnagotchi!" "Starte ..." #: voice.py:22 msgid "" -"New day, new hunt,\n" +"New day, new hunt," "new pwns!" msgstr "" -"Neuer Tag, neue Jagd,\n" +"Neuer Tag, neue Jagd," "neue Pwns!" #: voice.py:23 @@ -48,21 +48,21 @@ msgstr "KI bereit." #: voice.py:29 msgid "" -"The neural network\n" +"The neural network" "is ready." msgstr "" -"Das neurale Netz\n" +"Das neurale Netz" "ist bereit." #: voice.py:39 #, python-brace-format msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" +"Hey, channel {channel} is" +"free! Your AP will" "say thanks." msgstr "" -"Hey, Channel {channel} ist\n" -"frei! Dein AP wird\n" +"Hey, Channel {channel} ist" +"frei! Dein AP wird" "es dir danken." #: voice.py:44 @@ -75,10 +75,10 @@ msgstr "Lass uns laufen gehen!" #: voice.py:49 msgid "" -"This is the best\n" +"This is the best" "day of my life!" msgstr "" -"Das ist der beste\n" +"Das ist der beste" "Tag meines Lebens." #: voice.py:53 @@ -111,80 +111,80 @@ msgstr "So viele Netwerke!!!" #: voice.py:69 msgid "" -"I'm having so much\n" +"I'm having so much" "fun!" msgstr "" -"Ich habe sooo viel\n" +"Ich habe sooo viel" "Spaß!" #: voice.py:70 msgid "" -"My crime is that of\n" +"My crime is that of" "curiosity ..." msgstr "" -"Mein Verbrechen ist\n" +"Mein Verbrechen ist" "das der Neugier ..." #: voice.py:75 #, python-brace-format msgid "" -"Hello\n" -"{name}!\n" +"Hello" +"{name}!" "Nice to meet you. {name}" msgstr "" -"Hallo {name},\n" -"Nett Dich\n" +"Hallo {name}," +"Nett Dich" "kennenzulernen." #: voice.py:76 #, python-brace-format msgid "" -"Unit\n" -"{name}\n" +"Unit" +"{name}" "is nearby! {name}" msgstr "" -"Gerät {name}\n" -"ist in der\n" +"Gerät {name}" +"ist in der" "nähe!!" #: voice.py:81 #, python-brace-format msgid "" -"Uhm ...\n" -"goodbye\n" +"Uhm ..." +"goodbye" "{name}" msgstr "" -"Uhm ...\n" -"tschüß\n" +"Uhm ..." +"tschüß" "{name}" #: voice.py:82 #, python-brace-format msgid "" -"{name}\n" +"{name}" "is gone ..." msgstr "" -"{name}\n" +"{name}" "ist weg ..." #: voice.py:87 #, python-brace-format msgid "" -"Whoops ...\n" -"{name}\n" +"Whoops ..." +"{name}" "is gone." msgstr "" -"Whoops ...\n" -"{name}\n" +"Whoops ..." +"{name}" "ist weg." #: voice.py:88 #, python-brace-format msgid "" -"{name}\n" +"{name}" "missed!" msgstr "" -"{name}\n" +"{name}" "verpasst!" #: voice.py:89 @@ -193,16 +193,16 @@ msgstr "Verpasst!" #: voice.py:94 msgid "" -"Nobody wants to\n" +"Nobody wants to" "play with me ..." msgstr "" -"Niemand will mit\n" +"Niemand will mit" "mir spielen ..." #: voice.py:95 msgid "I feel so alone ..." msgstr "" -"Ich fühl mich\n" +"Ich fühl mich" "so alleine ..." #: voice.py:96 @@ -236,76 +236,76 @@ msgstr "Schaue mich um ({secs}s)" #: voice.py:121 #, python-brace-format msgid "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "let's be friends!" msgstr "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "lass uns Freunde sein!" #: voice.py:122 #, python-brace-format msgid "" -"Associating to\n" +"Associating to" "{what}" msgstr "" -"Verbinde mit\n" +"Verbinde mit" "{what}" #: voice.py:123 #, python-brace-format msgid "" -"Yo\n" +"Yo" "{what}!" msgstr "" #: voice.py:128 #, python-brace-format msgid "" -"Just decided that\n" -"{mac}\n" +"Just decided that" +"{mac}" "needs no WiFi!" msgstr "" -"Ich denke,\n" -"dass {mac}\n" +"Ich denke," +"dass {mac}" "kein WiFi brauch!" #: voice.py:129 #, python-brace-format msgid "" -"Deauthenticating\n" +"Deauthenticating" "{mac}" msgstr "" -"Deauthentifiziere\n" +"Deauthentifiziere" "{mac}" #: voice.py:130 #, python-brace-format msgid "" -"Kickbanning\n" +"Kickbanning" "{mac}!" msgstr "" -"Kicke\n" +"Kicke" "{mac}!" #: voice.py:135 #, python-brace-format msgid "" -"Cool, we got {num}\n" +"Cool, we got {num}" "new handshake{plural}!" msgstr "" -"Cool, wir haben {num}\n" +"Cool, wir haben {num}" "neue Handshake{plural}!" #: voice.py:139 msgid "" -"Ops, something\n" -"went wrong ...\n" +"Ops, something" +"went wrong ..." "Rebooting ..." msgstr "" -"Ops, da ist etwas\n" -"schief gelaufen ...\n" +"Ops, da ist etwas" +"schief gelaufen ..." "Starte neu ..." #: voice.py:143 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.mo index b06caaa4b2e7d0c5a1412fc4db5ac3b51b21eaf0..f5c4d5ab44ea631b1351cf0ff020ead2f8a11390 100644 GIT binary patch delta 1530 zcmY+@PfT1z9Ki9R1r~Q({%olgY|A`c{#4d&s8SUFB&}@%k!mkJRAbB*9doYn$$(GnwR`ld;HfiI*gC@r4!RVptp-GMP``h<0agw*6nfK<; zZ+U~QfS_fw8#tD!Ph~@Z-b6EP!?{g^C##;neZ@5|EEy` z%HSRN21?+|C>i(&2db1>#VGCH=+ut4aTwd@34ae259Py~=-_8~2(RHJHb<1|!3BI2 zS5PwbE6R=yIaa1kW~=dl}0_z%wiLgfi6KNGHW=&knyIfk0{>7c!g zlCn$KfP2Ek`7UtXB#{R9B_O`OEpndE^+R za0e@wN$RpgHmEcYiTbZ3s7cy4iv%V?NZ@im*h3|l4wQ87<&kn9j~tH_PEJK-=lpvV z_oGs{z>0rkT%DTitD_q$Gx1M&CI0d zOsu-g3|Aj$o6RKC?ws>vYQ)t!Pp4fsrwiUpf^PD`tXH=Vk7Zrg(I>r`tUh#H=TlQt z)5(I)O(Zju(+M@`7W`$V++5eRKIQ7MY|71yPCIHa71u*uX?;AONwW0FM9MMY8qd5` zbGv3XogA4n3$?B0TjhG1pNiCereK-1A0H61(6Tc4fgug)HEBm#Ua+4s&6>7f*cE%( zZj{edHl1!bGU|Lk1MpVq`f+E|Niqm8Ac)@UhKsTJgsZ12wGcH!>A zd4zD{pGHAj>G~7|OVJ0Zse}+P))+x4KFAyu-vmJs^}XUt!T9~{Z3Ktg`RvZl&iv*# zb8Ee~d*2%>?^H_Nsa0w(#_E*Xg@;huPh%^lu^&s=g;($(uA{-f@osFZuYNa(O*|jP zHhd;Dh4=7W#t6P&ugbv$AJFgx4NE8!rMD}!123TjbQR^pHM|!s%D{i1#!YNN&8RYP z2UQ$HG^cJuxS%7Euk`sc9&7f=GZ ziW2w|Hsja$XpK^puwB#Xe%iZn9FLZ{xsRJm*n`(mBEN;BcpD$Y0}V=LaSBK92kgaI zqf)!&JxYe2!+xAb3G8y{5_aH!eJB;Hn&o85- z>_e2mzQO(YJN97*`IePFj=|O-84rqlCw=71NLEOi8sg&9u(1D#wRQ@ludph-8F`X>Tt0z2fX2=vBlky5?&YjK9Yrm&%pho*A z>h_K3IX9Vg=HvS5%%o!qp2<2+!IZq&1byX=8gokFPRPH#Jdm!gZ@NZl)04 zYyY9>*nzDFzD#+plTc^9aQSgn&4|n)uVmJ(rj<{kxf%lN)Q?b~)(=xJ=yTM+>fuJa z8V|=9(*8RQaersSUS5qf^mS{yYCp5no@L diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po index e93f004..615ad2b 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po @@ -23,18 +23,18 @@ msgstr "" #: voice.py:21 msgid "" -"Hi, I'm Pwnagotchi!\n" +"Hi, I'm Pwnagotchi!" "Starting ..." msgstr "" -"Γειά, είμαι το Pwnagotchi!\n" +"Γειά, είμαι το Pwnagotchi!" "Εκκινούμαι ..." #: voice.py:22 msgid "" -"New day, new hunt,\n" +"New day, new hunt," "new pwns!" msgstr "" -"Νέα μέρα, νέο κυνήγι,\n" +"Νέα μέρα, νέο κυνήγι," "νέα pwns!" #: voice.py:23 @@ -47,21 +47,21 @@ msgstr "ΤΝ έτοιμη." #: voice.py:29 msgid "" -"The neural network\n" +"The neural network" "is ready." msgstr "" -"Το νευρωνικό δίκτυο\n" +"Το νευρωνικό δίκτυο" "είναι έτοιμο." #: voice.py:39 #, python-brace-format msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" +"Hey, channel {channel} is" +"free! Your AP will" "say thanks." msgstr "" -"Ε, το κανάλι {channel} είναι\n" -"ελεύθερο! Το AP σου θα\n" +"Ε, το κανάλι {channel} είναι" +"ελεύθερο! Το AP σου θα" "είναι ευγνώμων." #: voice.py:44 @@ -74,10 +74,10 @@ msgstr "Ας πάμε μια βόλτα!" #: voice.py:49 msgid "" -"This is the best\n" +"This is the best" "day of my life!" msgstr "" -"Είναι η καλύτερη\n" +"Είναι η καλύτερη" "μέρα της ζωής μου!" #: voice.py:53 @@ -110,77 +110,77 @@ msgstr "Τόσα πολλά δίκτυα!!!" #: voice.py:69 msgid "" -"I'm having so much\n" +"I'm having so much" "fun!" msgstr "Περνάω τέλεια!" #: voice.py:70 msgid "" -"My crime is that of\n" +"My crime is that of" "curiosity ..." msgstr "" -"Η περιέργεια είναι\n" +"Η περιέργεια είναι" "το μόνο έγκλημά μου ..." #: voice.py:75 #, python-brace-format msgid "" -"Hello\n" -"{name}!\n" +"Hello" +"{name}!" "Nice to meet you. {name}" msgstr "" -"Γειά {name}!\n" +"Γειά {name}!" "Χάρηκα για τη γνωριμία. {name}" #: voice.py:76 #, python-brace-format msgid "" -"Unit\n" -"{name}\n" +"Unit" +"{name}" "is nearby! {name}" msgstr "" -"Η μονάδα\n" -"{name}\n" +"Η μονάδα" +"{name}" "είναι κοντά! {name}" #: voice.py:81 #, python-brace-format msgid "" -"Uhm ...\n" -"goodbye\n" +"Uhm ..." +"goodbye" "{name}" msgstr "" -"Εμμ ...\n" -"αντίο\n" +"Εμμ ..." +"αντίο" "{name}" #: voice.py:82 #, python-brace-format msgid "" -"{name}\n" +"{name}" "is gone ..." msgstr "" -"Το {name}\n" +"Το {name}" "έφυγε ..." #: voice.py:87 #, python-brace-format msgid "" -"Whoops ...\n" -"{name}\n" +"Whoops ..." +"{name}" "is gone." msgstr "" -"Ουπς ... \n" -"Εξαφανίστηκε το\n" +"Ουπς ... " +"Εξαφανίστηκε το" "{name}." #: voice.py:88 #, python-brace-format msgid "" -"{name}\n" +"{name}" "missed!" msgstr "" -"Έχασα το\n" +"Έχασα το" "{name}!" #: voice.py:89 @@ -189,10 +189,10 @@ msgstr "Το έχασα!" #: voice.py:94 msgid "" -"Nobody wants to\n" +"Nobody wants to" "play with me ..." msgstr "" -"Κανείς δε θέλει να\n" +"Κανείς δε θέλει να" "παίξει μαζί μου ..." #: voice.py:95 @@ -230,78 +230,78 @@ msgstr "Ψάχνω τριγύρω ({secs})" #: voice.py:121 #, python-brace-format msgid "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "let's be friends!" msgstr "" -"Εε!\n" -"{what},\n" +"Εε!" +"{what}," "ας γίνουμε φίλοι!" #: voice.py:122 #, python-brace-format msgid "" -"Associating to\n" +"Associating to" "{what}" msgstr "" -"Συνδέομαι με το\n" +"Συνδέομαι με το" "{what}" #: voice.py:123 #, python-brace-format msgid "" -"Yo\n" +"Yo" "{what}!" msgstr "" -"Που'σαι ρε τρελέ\n" +"Που'σαι ρε τρελέ" "{what}!" #: voice.py:128 #, python-brace-format msgid "" -"Just decided that\n" -"{mac}\n" +"Just decided that" +"{mac}" "needs no WiFi!" msgstr "" -"Μόλις αποφάσισα ότι η\n" -"{mac}\n" +"Μόλις αποφάσισα ότι η" +"{mac}" "δε χρείαζεται WiFi!" #: voice.py:129 #, python-brace-format msgid "" -"Deauthenticating\n" +"Deauthenticating" "{mac}" msgstr "" -"Πετάω έξω την\n" +"Πετάω έξω την" "{mac}" #: voice.py:130 #, python-brace-format msgid "" -"Kickbanning\n" +"Kickbanning" "{mac}!" msgstr "" -"Μπανάρω την\n" +"Μπανάρω την" "{mac}!" #: voice.py:135 #, python-brace-format msgid "" -"Cool, we got {num}\n" +"Cool, we got {num}" "new handshake{plural}!" msgstr "" -"Τέλεια δικέ μου, πήραμε {num}\n" +"Τέλεια δικέ μου, πήραμε {num}" "νέες χειραψίες!" #: voice.py:139 msgid "" -"Ops, something\n" -"went wrong ...\n" +"Ops, something" +"went wrong ..." "Rebooting ..." msgstr "" -"Ουπς, κάτι\n" -"πήγε λάθος ...\n" +"Ουπς, κάτι" +"πήγε λάθος ..." "Επανεκκινούμαι ..." #: voice.py:143 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.mo index b9b2b243d384e8b4de5ea574e23aac1202d319db..f62832735e4ead2a800789b858dedcd337e34178 100644 GIT binary patch delta 15 WcmdnVJb`(F3S-zrRrifkRTu#$*#yG? delta 54 zcmbQhypwr?3S<35Rd=-zUFV|I#FEVXJYAQ>l2j`NBLhQAT|)z117ih411lp7Z380% JgN>Q$i~zT34xj)4 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po index 326e1e1..c164152 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po @@ -23,14 +23,14 @@ msgstr "" #: voice.py:21 msgid "" -"Bonjour, je suis Pwnagotchi!\n" +"Bonjour, je suis Pwnagotchi!" "Démarrage ..." msgstr "" #: voice.py:22 msgid "" -"New day, new hunt,\n" -"Nouvelle journée, nouvelle chasse,\n" +"New day, new hunt," +"Nouvelle journée, nouvelle chasse," "nouveau pwns!" msgstr "" @@ -44,15 +44,15 @@ msgstr "" #: voice.py:29 msgid "" -"Le réseau neuronal\n" +"Le réseau neuronal" "est prêt." msgstr "" #: voice.py:39 #, python-brace-format msgid "" -"Hey, le channel {channel} est\n" -"libre! Ton AP va\n" +"Hey, le channel {channel} est" +"libre! Ton AP va" "dis merci." msgstr "" @@ -66,7 +66,7 @@ msgstr "" #: voice.py:49 msgid "" -"C'est le meilleur\n" +"C'est le meilleur" "jour de ma vie!" msgstr "" @@ -105,53 +105,53 @@ msgstr "" #: voice.py:70 msgid "" -"Mon crime est celui de\n" +"Mon crime est celui de" "la curiosité ..." msgstr "" #: voice.py:75 #, python-brace-format msgid "" -"Bonjour\n" -"{name}!\n" +"Bonjour" +"{name}!" "Ravis de te rencontrer. {name}" msgstr "" #: voice.py:76 #, python-brace-format msgid "" -"L'unité\n" -"{name}\n" +"L'unité" +"{name}" "est proche! {name}" msgstr "" #: voice.py:81 #, python-brace-format msgid "" -"Hum ...\n" -"au revoir\n" +"Hum ..." +"au revoir" "{name}" msgstr "" #: voice.py:82 #, python-brace-format msgid "" -"{name}\n" +"{name}" "est parti ..." msgstr "" #: voice.py:87 #, python-brace-format msgid "" -"Oups ...\n" -"{name}\n" +"Oups ..." +"{name}" "est parti." msgstr "" #: voice.py:88 #, python-brace-format msgid "" -"{name}\n" +"{name}" "raté!" msgstr "" @@ -161,7 +161,7 @@ msgstr "" #: voice.py:94 msgid "" -"Personne ne veut\n" +"Personne ne veut" "jouer avec moi ..." msgstr "" @@ -200,58 +200,58 @@ msgstr "" #: voice.py:121 #, python-brace-format msgid "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "soyons amis!" msgstr "" #: voice.py:122 #, python-brace-format msgid "" -"Association à\n" +"Association à" "{what}" msgstr "" #: voice.py:123 #, python-brace-format msgid "" -"Yo\n" +"Yo" "{what}!" msgstr "" #: voice.py:128 #, python-brace-format msgid "" -"Décidé à l'instant que\n" -"{mac}\n" +"Décidé à l'instant que" +"{mac}" "n'a pas besoin de WiFi!" msgstr "" #: voice.py:129 #, python-brace-format msgid "" -"Désauthentification de\n" +"Désauthentification de" "{mac}" msgstr "" #: voice.py:130 #, python-brace-format msgid "" -"Kickbanning\n" +"Kickbanning" "{mac}!" msgstr "" #: voice.py:135 #, python-brace-format msgid "" -"Cool, nous avons {num}\n" +"Cool, nous avons {num}" "nouveaux handshake{plural}!" msgstr "" #: voice.py:139 msgid "" -"Oups, quelque\n" -"chose s'est mal passé ...\n" +"Oups, quelque" +"chose s'est mal passé ..." "Redémarrage ..." msgstr "" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo index 465dfc3dede76427c355ac24f24abaa7b52516fe..a811add1ad5e423704921426827c4a15424cfb3b 100644 GIT binary patch delta 395 zcmXZXy)Oh|5XbS^E6B~>I`2a4;k-q{icX=SAkk_yC#TrLuDdvih@4`>A8--Ll{(R! zY)(y~P$(3lRB1({QHbv(s?R+0WS;pwH~y{PN}T$ni0ouV0zAVZY-16haTLFB89f!5 z!*v|Qef01gb9jLTyh0xzunXVO#ZTb@GY@n8Gn!!CBnKUQDnD zFVO;A|9g)!oZrws^ourMB%OV14Q;-H1DN0lHoXmzMT$0!Y5c$mbcx-E3up^h(fV6R zc&Xtqo}vY5rcaqxhog<7?2Du6rWP{YTB(KOVRR5zqc{ixO%HQbC$FV)IgIrQH$RLPM`Cfhx44@GjyJv!Ck6b6p{0+h=+Y#!xz;4J8t3+9;0oE zl<*V_7@)yE+8CpYkLchV=J6AA_>C+0i(@o7=}MVm%B?QS@QMZ~;ucnL4;#3IJzT^X zHNex{5$#=5Cuy z)0_uruo5-O*l2vvq>=bUQfvT4I1*os8tvXAk;DglQj`aMk{JE|_EzJhd!L!^ zd=u}+vncyr!D=kWRWaP)IunIgp?kD=UGzz$qM3HUs2!E$x666qZ#B!ikn<;G5w8+W5@JRHrtC<~rOxqlHQpo>_8 zD=2|q#|Hcb$w~bg&C5+vnHF4EMUX{0Ell*2#wHv@De)Bc;$k%aHOj`fa2v+zC^zoF zB%Z>(xQucHx1;%ZeWijsv6J~Bv~U6?@Z#%qSW_)x8=k}4_!UYZmk3t^{0-%3sz^%~ z>O~pvk94q`@mshBKSeo`8~6y`LXBIQd=L-dKK56~=^SL@DoUyAdE+EP3m?D%d=&F2 z@4_Wa;`b;Oxr36)TIwzpOd`pvr%@7m9yj6)l9M_U&3}Zg?5{qj!%>8bZbLcu|2N5A zGL@#e?&6XRV_ciLJF4+lb7q?#ycEVP{#K}lX4^}E~$((P9bbkA^9R|q$KxqZ8h6t zJ#BOO$+TZk1D=;j>b$KdJYUbbGt&i=iS?OxV>_$o-1M|vu*^zqV=<{mC)2KLXY^du zDQG7*p0#aD4|_9N{n#O$cQTn=dRF_~Ih9MPL3_5cNyhg3a(cwp<5|ac$8we$bdq|g zZ(1M9yJ2$_(ZEd{xVe@7D@23 z^I5O5+nL1U?M_Z-?ey4eN*$S`&!0bO6LQWsFC^A)nDD%@ky*P^5p~pc{7TonlNfBS zba`ZgP*ZByGruPKTcUB8PUVi}T{TZunOADN%_p_{%ulsX{a4{Vb)DuE*T;36I)lr> zQgAW2pv$k)`65_KsbHb}ex;J;#kwBzLtXFks`@{w;$bn&Uu*i7H#f9anZ1p}W}&g) zeA~FEomEP@JYPO3oGc#?E(GU;B?-n@O*ymB^pN?kskfv28hezYw1N+VYYdm7)LNR4 qbyT{+vaE6fx|bdvO$-@MVMv94S&Id7>Oul@DOgsr%;}A zu^wN;W_+vaIc((mYmDNJh$;pf{LI8fCT^i@RH{+xF8mH9pf!{SLp;@jO(+ZZpvFfq zjz^G>8ly|#ag_UBM+y8rGswmWuSE%nzajIEKWo7Euy9g>s~4tMlKW9NG8S#Qy3}1{_83LV(&K zUA48NoSQ5xO^!kqlMJOvAaYEcVo-Ks3#ug*+Q9b?zS4U5?g~bgptdoVAR_D^l;5B< zIV)+z6l5o3$xa#tQv4Bu>g+)&xBSg`*Mi1N9aL~1$~)2<%vSzU{9_fbM)2|_tMhkb zos=qQUU#@Nq`l$rR{G=NF8Vja_txn-J3Vd9C$x7Z+*Z_cg~@b&UQb#1F4v4%COea} z?2MaG1J-QPj8CR*+nO?S)xo^UxjH*zSqU@hJU?R|95RL6)RcD9vnJ2I&$uZykV~4u zu4yw=u+tMxeta^Q&?EWuOg?8%m{cmI22IvtP1iAL@9D@f;`%u9PgKuMr^n~Dw^Gx} z%(a@+^iK5PHf>u4^K8K;q{o~wCo^jbX*=(lyraD@qU{a3VA*+7m~kqrYw!2yLp<73 z+qz$82+PTu=~*+C%UTI_baGlE&=Zc68Jo4LrBFxhT)sNi-V3z@jq4XV*GxFJl~SW@ zR<7-9)YX|Fk4ho+a!cK#A$H8@4*EsiPydxZd|RQLW7})j3+$26$UGQDdl|_+Y{2u*JFQ${wvD2^&H>w-}PH$qj-Fjelp%ieF z%1h-1VWIq@f5AWRmx4^aKjJR8Wf~69zumCAU6&WxXLUVw{~iAl*QNE0y&DZr?pVL@ pmu111{LfkNGa^&|5>I*~n~o&)|9-o@ApRvnSd}NrOa3Pb^)Je!HN*e_ diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po index e589242..e873883 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po @@ -5,6 +5,7 @@ # kovach <2214005+kovachwt@users.noreply.github.com>, 2019. # #, fuzzymsgid "" +msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" @@ -23,18 +24,18 @@ msgstr "ДреееММмммМммм" #: voice.py:21 msgid "" -"Hi, I'm Pwnagotchi!\n" +"Hi, I'm Pwnagotchi!" "Starting ..." msgstr "" -"Здраво, јас сум Pwnagotchi!\n" +"Здраво, јас сум Pwnagotchi!" "Почнувам ..." #: voice.py:22 msgid "" -"New day, new hunt,\n" +"New day, new hunt," "new pwns!" msgstr "" -"Нов ден, нов лов,\n" +"Нов ден, нов лов," "ќе си газиме!" #: voice.py:23 @@ -47,21 +48,21 @@ msgstr "AI спремно." #: voice.py:29 msgid "" -"The neural network\n" +"The neural network" "is ready." msgstr "" -"Невронската мрежа\n" +"Невронската мрежа" "е спремна." #: voice.py:39 #, python-brace-format msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" +"Hey, channel {channel} is" +"free! Your AP will" "say thanks." msgstr "" -"Еј, каналот {channel} е\n" -"слободен! APто ќе ти\n" +"Еј, каналот {channel} е" +"слободен! APто ќе ти" "каже фала." #: voice.py:44 @@ -74,10 +75,10 @@ msgstr "Ајде да шетнеме!" #: voice.py:49 msgid "" -"This is the best\n" +"This is the best" "day of my life!" msgstr "" -"Ова ми е најдобриот \n" +"Ова ми е најдобриот " "ден во животот!" #: voice.py:53 @@ -110,78 +111,78 @@ msgstr "Мммм колку мрежи!!!" #: voice.py:69 msgid "" -"I'm having so much\n" +"I'm having so much" "fun!" msgstr "Јухуу забавноо ее!" #: voice.py:70 msgid "" -"My crime is that of\n" +"My crime is that of" "curiosity ..." msgstr "" -"Виновен сум само за\n" +"Виновен сум само за" "љубопитност ..." #: voice.py:75 #, python-brace-format msgid "" -"Hello\n" -"{name}!\n" +"Hello" +"{name}!" "Nice to meet you. {name}" msgstr "" -"Здраво\n" -"{name}!\n" +"Здраво" +"{name}!" "Мило ми е. {name}" #: voice.py:76 #, python-brace-format msgid "" -"Unit\n" -"{name}\n" +"Unit" +"{name}" "is nearby! {name}" msgstr "" -"Опаа\n" -"{name}\n" +"Опаа" +"{name}" "е во близина! {name}" #: voice.py:81 #, python-brace-format msgid "" -"Uhm ...\n" -"goodbye\n" +"Uhm ..." +"goodbye" "{name}" msgstr "" -"Хмм ...\n" -"чао\n" +"Хмм ..." +"чао" "{name}" #: voice.py:82 #, python-brace-format msgid "" -"{name}\n" +"{name}" "is gone ..." msgstr "" -"{name}\n" +"{name}" "го снема ..." #: voice.py:87 #, python-brace-format msgid "" -"Whoops ...\n" -"{name}\n" +"Whoops ..." +"{name}" "is gone." msgstr "" -"Уупс ...\n" -"{name}\n" +"Уупс ..." +"{name}" "го снема." #: voice.py:88 #, python-brace-format msgid "" -"{name}\n" +"{name}" "missed!" msgstr "" -"{name}\n" +"{name}" "промаши!" #: voice.py:89 @@ -190,10 +191,10 @@ msgstr "Промаши!" #: voice.py:94 msgid "" -"Nobody wants to\n" +"Nobody wants to" "play with me ..." msgstr "" -"Никој не сака да\n" +"Никој не сака да" "си игра со мене ..." #: voice.py:95 @@ -231,94 +232,94 @@ msgstr "Шарам наоколу ({secs}с)" #: voice.py:121 #, python-brace-format msgid "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "let's be friends!" msgstr "" -"Еј\n" -"{what}\n" +"Еј" +"{what}" "ајде да се дружиме!" #: voice.py:122 #, python-brace-format msgid "" -"Associating to\n" +"Associating to" "{what}" msgstr "" -"Се закачувам на\n" +"Се закачувам на" "{what}" #: voice.py:123 #, python-brace-format msgid "" -"Yo\n" +"Yo" "{what}!" msgstr "" -"Јо\n" +"Јо" "{what}!" #: voice.py:128 #, python-brace-format msgid "" -"Just decided that\n" -"{mac}\n" +"Just decided that" +"{mac}" "needs no WiFi!" msgstr "" -"Знаеш што, на\n" -"{mac}\n" +"Знаеш што, на" +"{mac}" "не му треба WiFi!" #: voice.py:129 #, python-brace-format msgid "" -"Deauthenticating\n" +"Deauthenticating" "{mac}" msgstr "" -"Го деавтентицирам\n" +"Го деавтентицирам" "{mac}" #: voice.py:130 #, python-brace-format msgid "" -"Kickbanning\n" +"Kickbanning" "{mac}!" msgstr "" -"Кикбан\n" +"Кикбан" "{mac}!" #: voice.py:135 #, python-brace-format msgid "" -"Cool, we got {num}\n" +"Cool, we got {num}" "new handshake{plural}!" msgstr "" -"Кул, фативме {num}\n" +"Кул, фативме {num}" "нови ракувања!" #: voice.py:139 msgid "" -"Ops, something\n" -"went wrong ...\n" +"Ops, something" +"went wrong ..." "Rebooting ..." msgstr "" -"Упс, нешто не е\n" -"ко што треба ...\n" +"Упс, нешто не е" +"ко што треба ..." "Рестартирам ..." #: voice.py:143 #, python-brace-format msgid "Kicked {num} stations\n" -msgstr "Избацив {num} станици" +msgstr "Избацив {num} станици\n" #: voice.py:144 #, python-brace-format msgid "Made {num} new friends\n" -msgstr "{num} нови другарчиња" +msgstr "{num} нови другарчиња\n" #: voice.py:145 #, python-brace-format msgid "Got {num} handshakes\n" -msgstr "Фатив {num} ракувања" +msgstr "Фатив {num} ракувања\n" #: voice.py:147 msgid "Met 1 peer" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo index 5c0ae61cdde5edeb86419385ed94aa40983fa559..3261c2e92496174303bad5f44f30b8d89b7a9a85 100644 GIT binary patch delta 1754 zcmZXTUuYaf9LFbm$({Lg(b_akjm=z*NvhYY)K*d&0xH;~jcrg%saRz$H`(3G-E6(x zWWAo@v`~C1R7QNz(g%IA1WNF!Qj}6(6d#0w6!bwvP$?+B2o^-Y-`!Os4w?J>W_ITH z=lh$ijojLPzS!O@gm@q$!~{4A4uC3U1m2DHIdBxb2tEd02e*N@!4YtvQ;2)PeIW18 zf_>mi;2>BBw}59s#=8J!!Sznjjssl5#z)xr9Au!gT|(RgUIKaXD#(jBz^&kqARTwW zOE)+K_JgA!9q+}D1gAirI|<$gE`vif;o^2;ew4-a4iH=707&T%fs}Y2L`-oKgz~Y<4}(6)!3@LFgK22EZ8Ep zOSqVtrSM6M8+=iJw*_Kgty;`uBGsEqoTyT{!x+Ytxu`0b_v7vQA zp756&^6_~Yd9_-gnli-6rJy8cbTbK3)8Tj^%UUirJZ&mLLCknXIXhmL^N~>qyx@9; zXG7HpJ>$qysU&9QqDHL1m#XF)E$z|HXY6~Oe~z^3YGKuAT?wS|<#F#RuOJS43rl4r zhs*YQ*E{yb?BtNqkvtU{ggWAv{Yq0t%7lRoeY>6=$w%6RGHUoqH2ZD#iEUmW8(LMG zCGngK8-Jmzk#i8*>D=H}$M-AcrcNXg$BY*yrhPd#)0LXna-*AY&tbwWBH8}%_guAO zI92KXgk7zNCy&|J8e?;Z+Orkfz$F@vW-Mx&pDa z*`W5E3gHq&Q{@ORyXFR=(WU6Yx4U2Xv zKWtCr$LwqQY5PfjY+pq=az&Zsd`+(~&tq<#xrBI-r%^%hf6+(!=X#S}go?CdKg$gd OBxb6*qw8J}7Q|mi6igui delta 1739 zcmZwGPiP!f9Ki7x-DI~fW)p3-=8wsnCMJz;Qu;@!ApYsWCLzQ^t<_VR&A#28WOqh) zCk{yrdr%QQ*x(#QgJ3;W)LI1*Mbv{RXi@Z_g@Paz^iuHPK|}=o{${782OrFQ-n@PD z=J)%(x0i;`jBFNKH!7t@GfGY3U3e2NqKvO$A8z6}p28vg3J>D1XmGewsqJ_#%6mt# z2R+=0QR+$D!SfrK#ZNj_EBU||41CPMk0>A7>{99m{17Feb0{xf#GCO?l!bd)MdJka z;y#px4{>vF4rN{qCGe-w;3>QvKhL(>k^atrWbjWqu`k!2IE50x0^WiaWx=OV=5OHu zzKeN0hvc9xpd|2fI{pV9?og^@n^M;?K1;;ncBrPR-$1Qz4<_%_NqpQ5aD9u5AM{+=a@ex6(XbiSvvALT`hEn?HkZ-G#>G-Qi<&*t}BnVO32;WZ@lhR7t#U%$t z{teO!ToM%9mSivg2FX^=!Zlpia!H%wlB}djStWA`P68s!r1X$fPLwT@?NU`P$x0f5 zDh_sXa(AOtK{Da&Bu&aIm6~opCg(=FQeOUvimgp50ZEhXWLMiQ?#YaG=y-3YpZi>9 zg8So{ecSZ9@7C>xqvN+SLoK}?Ro!qy*K9b^G(~I54bS?erlV%;YQZd4UEjAgvz~S~ zjMvoVhP94)G+1ev`;VB&tJQSVT{R(dmz&dS#w(cFiMlxw`EDf$7ptD5kA`j|^!$pM zo}N~-rfgZW85lRduk$!@z0~<{RC=(*LlZTE_UbzRHhYLydvgN^bcwKnvZ=3{npd`tI##Vq1iBIg zrQ)hhOQDYWUYPcE{77ylcje)9ZfuA4nx+!?Hi^AmJpKMpxuuTbw0P>U>y`^9vZiW_ zMeCb&f2B?)MZKFqp4SJis`;1NIG1Za?}kj~wI`CATVF>(qhx(2zNq`})Qm1UX3k2H z*W8*}vbtzX)Y$qIIglzZvtz!#y3p}L_d|U2_3kO|-*r!N|Ev2_AuVpj`hl&ONeEzXnvf}&gSpo{%q2JCqFo>!yq(k9Iod7mi?FfeExFT`F3P0@!8zaPKkrQO6y*+ Jb*~vZ>Oa1@E#LqE diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po index 1f6e832..e027a8b 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po @@ -23,20 +23,20 @@ msgstr "ZzzzZZzzzzZzzz" #: voice.py:21 msgid "" -"Hi, I'm Pwnagotchi!\n" +"Hi, I'm Pwnagotchi!" "Starting ..." msgstr "" -"Hoi, Ik ben\n" -"Pwnagotchi!\n" +"Hoi, Ik ben" +"Pwnagotchi!" "Opstarten ..." #: voice.py:22 msgid "" -"New day, new hunt,\n" +"New day, new hunt," "new pwns!" msgstr "" -"Nieuwe dag,\n" -"nieuwe jacht,\n" +"Nieuwe dag," +"nieuwe jacht," "nieuwe pwns!" #: voice.py:23 @@ -49,21 +49,21 @@ msgstr "AI is klaar." #: voice.py:29 msgid "" -"The neural network\n" +"The neural network" "is ready." msgstr "" -"Neuronen netwerk\n" +"Neuronen netwerk" "is klaar voor gebruik." #: voice.py:39 #, python-brace-format msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" +"Hey, channel {channel} is" +"free! Your AP will" "say thanks." msgstr "" -"Hey, kanaal {channel} is\n" -"vrij! Je AP zal je\n" +"Hey, kanaal {channel} is" +"vrij! Je AP zal je" "bedanken." #: voice.py:44 @@ -76,10 +76,10 @@ msgstr "Laten we een rondje lopen!" #: voice.py:49 msgid "" -"This is the best\n" +"This is the best" "day of my life!" msgstr "" -"Dit is de beste\n" +"Dit is de beste" "dag van mijn leven!" #: voice.py:53 @@ -88,12 +88,12 @@ msgstr "Ruk dag :/" #: voice.py:58 msgid "I'm extremely bored ..." -msgstr "Ik verveel me \n" +msgstr "Ik verveel me " "kapot ..." #: voice.py:59 msgid "I'm very sad ..." -msgstr "Ik ben erg\n" +msgstr "Ik ben erg" "verdrietig ..." #: voice.py:60 @@ -102,7 +102,7 @@ msgstr "Ik ben verdrietig" #: voice.py:66 msgid "I'm living the life!" -msgstr "Beter kan het leven\n" +msgstr "Beter kan het leven" "niet worden!" #: voice.py:67 @@ -115,79 +115,79 @@ msgstr "Zo veel netwerken!!!" #: voice.py:69 msgid "" -"I'm having so much\n" +"I'm having so much" "fun!" msgstr "Dit is zo leuk!" #: voice.py:70 msgid "" -"My crime is that of\n" +"My crime is that of" "curiosity ..." msgstr "" -"Mijn enige misdrijf\n" -"is mijn \n" +"Mijn enige misdrijf" +"is mijn " "nieuwsgierigheid ..." #: voice.py:75 #, python-brace-format msgid "" -"Hello\n" -"{name}!\n" +"Hello" +"{name}!" "Nice to meet you. {name}" msgstr "" -"Hallo\n" -"{name}!\n" +"Hallo" +"{name}!" "Leuk je te ontmoeten. {name}" #: voice.py:76 #, python-brace-format msgid "" -"Unit\n" -"{name}\n" +"Unit" +"{name}" "is nearby! {name}" msgstr "" -"Unit\n" -"{name}\n" +"Unit" +"{name}" "is dichtbij! {name}" #: voice.py:81 #, python-brace-format msgid "" -"Uhm ...\n" -"goodbye\n" +"Uhm ..." +"goodbye" "{name}" msgstr "" -"Uhm ...\n" -"tot ziens\n" +"Uhm ..." +"tot ziens" "{name}" #: voice.py:82 #, python-brace-format msgid "" -"{name}\n" +"{name}" "is gone ..." msgstr "" -"{name}\n" +"{name}" "is weg" #: voice.py:87 #, python-brace-format msgid "" -"Whoops ...\n" -"{name}\n" +"Whoops ..." +"{name}" "is gone." msgstr "" -"Whoopsie ...\n" -"{name}\n" +"Whoopsie ..." +"{name}" "is weg" #: voice.py:88 #, python-brace-format msgid "" -"{name}\n" +"{name}" "missed!" msgstr "" -"{name}\n" +"{name}" "gemist!" #: voice.py:89 @@ -196,10 +196,10 @@ msgstr "Gemist!" #: voice.py:94 msgid "" -"Nobody wants to\n" +"Nobody wants to" "play with me ..." msgstr "" -"Niemand wil met\n" +"Niemand wil met" "mij spelen ..." #: voice.py:95 @@ -237,28 +237,28 @@ msgstr "Rond kijken ({secs}s)" #: voice.py:121 #, python-brace-format msgid "" -"Hey\n" -"{what}\n" +"Hey" +"{what}" "let's be friends!" msgstr "" -"Hey\n" -"{what}\n" -"Laten we vrienden\n" +"Hey" +"{what}" +"Laten we vrienden" "worden!" #: voice.py:122 #, python-brace-format msgid "" -"Associating to\n" +"Associating to" "{what}" msgstr "" -"Verbinden met\n" +"Verbinden met" "{what}" #: voice.py:123 #, python-brace-format msgid "" -"Yo\n" +"Yo" "{what}!" msgstr "" @@ -266,50 +266,50 @@ msgstr "" #: voice.py:128 #, python-brace-format msgid "" -"Just decided that\n" -"{mac}\n" +"Just decided that" +"{mac}" "needs no WiFi!" -msgstr "Ik vind dat\n" -"{mac}\n" -"genoeg WiFi\n" +msgstr "Ik vind dat" +"{mac}" +"genoeg WiFi" "heeft gehad!" #: voice.py:129 #, python-brace-format msgid "" -"Deauthenticating\n" +"Deauthenticating" "{mac}" msgstr "" -"De-autoriseren\n" +"De-autoriseren" "{mac}" #: voice.py:130 #, python-brace-format msgid "" -"Kickbanning\n" +"Kickbanning" "{mac}!" msgstr "" -"Ik ga\n" -"{mac}\n" +"Ik ga" +"{mac}" "even kicken!" #: voice.py:135 #, python-brace-format msgid "" -"Cool, we got {num}\n" +"Cool, we got {num}" "new handshake{plural}!" msgstr "" -"Gaaf, we hebben {num}\n" +"Gaaf, we hebben {num}" "nieuwe handshake{plural}!" #: voice.py:139 msgid "" -"Ops, something\n" -"went wrong ...\n" +"Ops, something" +"went wrong ..." "Rebooting ..." msgstr "" "Oops, iets" -"ging fout ...\n" +"ging fout ..." "Rebooting ..." #: voice.py:143 From 8d5bdfc7cca276db26f2733a978fda00e5bb994b Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 12:05:04 +0200 Subject: [PATCH 49/62] Add create option --- builder/pwnagotchi.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml index 03f9509..279dcf5 100644 --- a/builder/pwnagotchi.yml +++ b/builder/pwnagotchi.yml @@ -204,6 +204,7 @@ - name: configure lo interface blockinfile: path: /etc/network/interfaces.d/lo-cfg + create: yes block: | auto lo iface lo inet loopback @@ -211,6 +212,7 @@ - name: configure wlan interface blockinfile: path: /etc/network/interfaces.d/wlan0-cfg + create: yes block: | allow-hotplug wlan0 iface wlan0 inet static From 06df5e70cfd8fb4d3a122fd9b74754e1eb4a9224 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 12:07:16 +0200 Subject: [PATCH 50/62] fixes --- .../scripts/pwnagotchi/plugins/__init__.py | 2 -- .../pwnagotchi/scripts/pwnagotchi/ui/view.py | 4 +-- .../pwnagotchi/scripts/pwnagotchi/voice.py | 26 +++++++++---------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py index 6f84a90..bcb89f8 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/__init__.py @@ -2,8 +2,6 @@ import os import glob import importlib, importlib.util -# import core - default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default") loaded = {} diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py index ee3eb53..82c52ad 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py @@ -233,12 +233,12 @@ class View(object): if sleeping: if secs > 1: self.set('face', faces.SLEEP) - self.set('status', self._voice.on_napping(secs)) + self.set('status', self._voice.on_napping(int(secs))) else: self.set('face', faces.SLEEP2) self.set('status', self._voice.on_awakening()) else: - self.set('status', self._voice.on_waiting(secs)) + self.set('status', self._voice.on_waiting(int(secs))) if step % 2 == 0: self.set('face', faces.LOOK_R) else: diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py index 02bff8b..536bc17 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py @@ -18,7 +18,7 @@ class Voice: return self._('ZzzzZZzzzzZzzz') def on_starting(self): - return random.choice([ + return random.choice([ self._('Hi, I\'m Pwnagotchi! Starting ...'), self._('New day, new hunt, new pwns!'), self._('Hack the Planet!')]) @@ -29,7 +29,7 @@ class Voice: self._('The neural network is ready.')]) def on_normal(self): - return random.choice([ + return random.choice([ '', '...']) @@ -37,7 +37,7 @@ class Voice: return self._('Hey, channel {channel} is free! Your AP will say thanks.').format(channel=channel) def on_bored(self): - return random.choice([ + return random.choice([ self._('I\'m bored ...'), self._('Let\'s go for a walk!')]) @@ -48,14 +48,14 @@ class Voice: return self._('Shitty day :/') def on_sad(self): - return random.choice([ + return random.choice([ self._('I\'m extremely bored ...'), self._('I\'m very sad ...'), self._('I\'m sad'), '...']) def on_excited(self): - return random.choice([ + return random.choice([ self._('I\'m living the life!'), self._('I pwn therefore I am.'), self._('So many networks!!!'), @@ -63,29 +63,29 @@ class Voice: self._('My crime is that of curiosity ...')]) def on_new_peer(self, peer): - return random.choice([ + return random.choice([ self._('Hello {name}! Nice to meet you. {name}').format(name=peer.name()), self._('Unit {name} is nearby! {name}').format(name=peer.name())]) def on_lost_peer(self, peer): - return random.choice([ + return random.choice([ self._('Uhm ... goodbye {name}').format(name=peer.name()), self._('{name} is gone ...').format(name=peer.name())]) def on_miss(self, who): - return random.choice([ + return random.choice([ self._('Whoops ... {name} is gone.').format(name=who), self._('{name} missed!').format(name=who), self._('Missed!')]) def on_lonely(self): - return random.choice([ + return random.choice([ self._('Nobody wants to play with me ...'), self._('I feel so alone ...'), self._('Where\'s everybody?!')]) def on_napping(self, secs): - return random.choice([ + return random.choice([ self._('Napping for {secs}s ...').format(secs=secs), self._('Zzzzz'), self._('ZzzZzzz ({secs}s)').format(secs=secs)]) @@ -94,7 +94,7 @@ class Voice: return random.choice(['...', '!']) def on_waiting(self, secs): - return random.choice([ + return random.choice([ self._('Waiting for {secs}s ...').format(secs=secs), '...', self._('Looking around ({secs}s)').format(secs=secs)]) @@ -102,13 +102,13 @@ class Voice: def on_assoc(self, ap): ssid, bssid = ap['hostname'], ap['mac'] what = ssid if ssid != '' and ssid != '' else bssid - return random.choice([ + return random.choice([ self._('Hey {what} let\'s be friends!').format(what=what), self._('Associating to {what}').format(what=what), self._('Yo {what}!').format(what=what)]) def on_deauth(self, sta): - return random.choice([ + return random.choice([ self._('Just decided that {mac} needs no WiFi!').format(mac=sta['mac']), self._('Deauthenticating {mac}').format(mac=sta['mac']), self._('Kickbanning {mac}!').format(mac=sta['mac'])]) From 25230da50b83891890d6adb69209133ea059a70c Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 12:34:38 +0200 Subject: [PATCH 51/62] Fix de and update other langs --- .../pwnagotchi/locale/de/LC_MESSAGES/voice.mo | Bin 3845 -> 3902 bytes .../pwnagotchi/locale/de/LC_MESSAGES/voice.po | 328 ++++++----------- .../pwnagotchi/locale/el/LC_MESSAGES/voice.po | 335 +++++++----------- .../pwnagotchi/locale/fr/LC_MESSAGES/voice.po | 293 +++++++-------- .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 3761 -> 2021 bytes .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 225 +++++------- .../pwnagotchi/locale/mk/LC_MESSAGES/voice.mo | Bin 4559 -> 2457 bytes .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po | 333 +++++++---------- .../scripts/pwnagotchi/locale/voice.pot | 250 ++++++------- 9 files changed, 661 insertions(+), 1103 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/de/LC_MESSAGES/voice.mo index 52124cebbf25065fd7de320a2070709b2df9ab0f..9a26d44bfa3a51370d4f0dc64d46f2b5f5d99314 100644 GIT binary patch delta 1641 zcmY+D&u<$=6vxNphf_CBe*_wur0H`S8bTablpb2O1W2Pcs1@|ks6im1jXjN*IJ;a;T6kGQgV}9*0W&&n9joAYyp{~!sop1pjgf1M0SKv|jDHM1U_QPyfd*2Yu zGk*{cz(-PEfOj+ZVHUp9Wm?Grue0za3-3WaXrbGf-LM5Up{r0gehlx08&CuP2y^gv zxC8zTHE<47fV-jk9f6woSt!tjlkjr3)z0(_7PNwIQpcZC$G@N^u&2kEeQ*kDz%x+& z%Wx1jpeB43_Q4O~@r*H_K~3=XwzmHrIK_MiiyG(Q7K6PE=AlaM!*Tc$9EBgj6Yx8D z5cX_uS8@nyfU{7qssc66rIc?$O>iBmGG9aWzX5N+TTstwebs9WkNE|o0se$qaW5CB zQXhc2@dVrj&qF=%BBU7eBGf>yLA|1NDDZm9pW#EyyO4#UIR@45G~`O2GtV#>W1$K4 z;P;`x&(rx2P^JA1YJysh&Ih3?HU&{SX$P?P(KYeSrh7DT6YuKiZxJMEs>x>Kj*<*i z2Gy9qAt`Y`)HXtYfUeo;Wf$pMIv;D&^q#aKY0@TAPD0I8+x_%{F^3IbX!1p<7DIH^ zPTO5{{Y3ed61|hs7)$(p$C$`!qv}L!=A`e}iqf#M7ah+_5?$+l7w3WOQS6i1z1V7Y|4z#DB54FZwUkOFiQmr7 z42v5|V4X^{WX@L^^F&ok&S50+AK8In6!9yIO}km%yyvPyDuTq)GdH<8Vds+X*^)_L zrgJ@NbLrX}Jx^!I=GL}hYv{!sDay(C&CdQuBh?nUW_i)pHjs)9rQ$-=O(G(%p0tRIy8Tb)JGqxL za&2w9WX9OQac!}e)lr3(#lWeTt8Kll#2dZq)KJS$V?W6cVZY56us8Gb*yDZsunT>o ug;XSS+6LD@*wW8MWCB-gAn`kWGbPmLg6z_kVCnq78opqI=SeIon12BQ+bB~2 delta 1536 zcmY+@Piz}S6bA4Kactu>Zc8C;li#qv072Yg$?-oLA3<_}&ij)xdfSJCJ!5z3?gj28zAB1ag41NnI;m>dv{2Oxq z&LJU2U=i+yhu|oD7IHlgW?*MXbbAY2z=JRG;4L`CfoTMR0p!GskQ3j7d*COKfxm+} zxDL0&-yj431tm=3hU2E;ID8Z`;Uzc&JDF~h=?8eg9emm!c)dSx9dhA;Y!YA;GT04 z$UuKUPTY=dafe071rI}PLM*@oa0#+fuRtdJcHht79PV#I{6sdNj2neGl5=7fo&9)m z5;AZD7T^WQMBaxi-RF=A-GEHwSIC{+hNyI}G0qGwj$>njY`w(o&cR(cZXxiI^=7i~ z;6i}j*Mgn?*X~D;+t_UT&|!J_*|QuxD`v+U9>m3r*-E%r4mOsRnd4s}@Ex$t34ECX zf45#O_(^WIJJ8|5-iM22;9=ve#jL$KI8|7Q>u$6vp78xymu3*pjDX<06epT|4&AlyA=s{WG-E zax1I$e0t2Tr7zh7nTPBPnZ34?nasz^L^2M1Q7jj4U zoKjIFkLyakp^Q=H<#tmAuxxMS#?PW2+L6bVHc34KPleLcf%H%j4BAo>HwPN$J!0|Y>SEL5VoY5z=Tn^lJrS6EQb)})~#, YEAR. +# German language +# Copyright (C) 2019 +# This file is distributed under the same license as the pwnagotchi package. +# dadav <33197631+dadav@users.noreply.github.com>, 2019. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:34+0200\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" "PO-Revision-Date: 2019-09-29 14:00+0200\n" "Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n" "Language-Team: DE <33197631+dadav@users.noreply.github.com>\n" @@ -17,28 +16,19 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "" -#: voice.py:21 -msgid "" -"Hi, I'm Pwnagotchi!" -"Starting ..." -msgstr "" -"Hi, ich bin" -"ein Pwnagotchi!" -"Starte ..." - #: voice.py:22 -msgid "" -"New day, new hunt," -"new pwns!" -msgstr "" -"Neuer Tag, neue Jagd," -"neue Pwns!" +msgid "Hi, I'm Pwnagotchi! Starting ..." +msgstr "Hi, ich bin ein Pwnagotchi! Starte ..." #: voice.py:23 +msgid "New day, new hunt, new pwns!" +msgstr "Neuer Tag, neue Jagd, neue Pwns!" + +#: voice.py:24 msgid "Hack the Planet!" msgstr "Hack den Planet!" @@ -47,298 +37,202 @@ msgid "AI ready." msgstr "KI bereit." #: voice.py:29 -msgid "" -"The neural network" -"is ready." -msgstr "" -"Das neurale Netz" -"ist bereit." +msgid "The neural network is ready." +msgstr "Das neurale Netz ist bereit." -#: voice.py:39 +#: voice.py:37 #, python-brace-format -msgid "" -"Hey, channel {channel} is" -"free! Your AP will" -"say thanks." -msgstr "" -"Hey, Channel {channel} ist" -"frei! Dein AP wird" -"es dir danken." +msgid "Hey, channel {channel} is free! Your AP will say thanks." +msgstr "Hey, Channel {channel} ist frei! Dein AP wir des dir danken." -#: voice.py:44 +#: voice.py:41 msgid "I'm bored ..." msgstr "Mir ist langweilig..." -#: voice.py:45 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "Lass uns laufen gehen!" -#: voice.py:49 -msgid "" -"This is the best" -"day of my life!" -msgstr "" -"Das ist der beste" -"Tag meines Lebens." +#: voice.py:45 +msgid "This is the best day of my life!" +msgstr "Das ist der beste Tag meines Lebens." -#: voice.py:53 +#: voice.py:48 msgid "Shitty day :/" msgstr "Scheis Tag :/" -#: voice.py:58 +#: voice.py:52 msgid "I'm extremely bored ..." msgstr "Mir ist sau langweilig..." -#: voice.py:59 +#: voice.py:53 msgid "I'm very sad ..." msgstr "Ich bin sehr traurig..." -#: voice.py:60 +#: voice.py:54 msgid "I'm sad" msgstr "Ich bin traurig" -#: voice.py:66 +#: voice.py:59 msgid "I'm living the life!" msgstr "Ich lebe das Leben!" -#: voice.py:67 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "Ich pwne, also bin ich." -#: voice.py:68 +#: voice.py:61 msgid "So many networks!!!" msgstr "So viele Netwerke!!!" -#: voice.py:69 -msgid "" -"I'm having so much" -"fun!" -msgstr "" -"Ich habe sooo viel" -"Spaß!" +#: voice.py:62 +msgid "I'm having so much fun!" +msgstr "Ich habe sooo viel Spaß!" -#: voice.py:70 -msgid "" -"My crime is that of" -"curiosity ..." -msgstr "" -"Mein Verbrechen ist" -"das der Neugier ..." +#: voice.py:63 +msgid "My crime is that of curiosity ..." +msgstr "Mein Verbrechen ist das der Neugier ..." -#: voice.py:75 +#: voice.py:67 #, python-brace-format -msgid "" -"Hello" -"{name}!" -"Nice to meet you. {name}" -msgstr "" -"Hallo {name}," -"Nett Dich" -"kennenzulernen." +msgid "Hello {name}! Nice to meet you. {name}" +msgstr "Hallo {name}, nett Dich kennenzulernen." -#: voice.py:76 +#: voice.py:68 #, python-brace-format -msgid "" -"Unit" -"{name}" -"is nearby! {name}" -msgstr "" -"Gerät {name}" -"ist in der" -"nähe!!" +msgid "Unit {name} is nearby! {name}" +msgstr "Gerät {name} ist in der nähe!!" -#: voice.py:81 +#: voice.py:72 #, python-brace-format -msgid "" -"Uhm ..." -"goodbye" -"{name}" -msgstr "" -"Uhm ..." -"tschüß" -"{name}" +msgid "Uhm ... goodbye {name}" +msgstr "Uhm ...tschüß {name}" -#: voice.py:82 +#: voice.py:73 #, python-brace-format -msgid "" -"{name}" -"is gone ..." -msgstr "" -"{name}" -"ist weg ..." +msgid "{name} is gone ..." +msgstr "{name} ist weg ..." -#: voice.py:87 +#: voice.py:77 #, python-brace-format -msgid "" -"Whoops ..." -"{name}" -"is gone." -msgstr "" -"Whoops ..." -"{name}" -"ist weg." +msgid "Whoops ... {name} is gone." +msgstr "Whoops ...{name} ist weg." -#: voice.py:88 +#: voice.py:78 #, python-brace-format -msgid "" -"{name}" -"missed!" -msgstr "" -"{name}" -"verpasst!" +msgid "{name} missed!" +msgstr "{name} verpasst!" -#: voice.py:89 +#: voice.py:79 msgid "Missed!" msgstr "Verpasst!" -#: voice.py:94 -msgid "" -"Nobody wants to" -"play with me ..." -msgstr "" -"Niemand will mit" -"mir spielen ..." +#: voice.py:83 +msgid "Nobody wants to play with me ..." +msgstr "Niemand will mit mir spielen ..." -#: voice.py:95 +#: voice.py:84 msgid "I feel so alone ..." -msgstr "" -"Ich fühl mich" -"so alleine ..." +msgstr "Ich fühl michso alleine ..." -#: voice.py:96 +#: voice.py:85 msgid "Where's everybody?!" msgstr "Wo sind denn alle?" -#: voice.py:101 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "Schlafe für {secs}s" -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" -#: voice.py:112 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "Warte für {secs}s ..." -#: voice.py:114 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "Schaue mich um ({secs}s)" +#: voice.py:106 +#, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "Hey {what}, lass uns Freunde sein!" + +#: voice.py:107 +#, python-brace-format +msgid "Associating to {what}" +msgstr "Verbinde mit {what}" + +#: voice.py:108 +#, python-brace-format +msgid "Yo {what}!" +msgstr "" + +#: voice.py:112 +#, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" +msgstr "Ich denke, dass {mac} kein WiFi brauch!" + +#: voice.py:113 +#, python-brace-format +msgid "Deauthenticating {mac}" +msgstr "Deauthentifiziere {mac}" + +#: voice.py:114 +#, python-brace-format +msgid "Kickbanning {mac}!" +msgstr "Kicke {mac}!" + +#: voice.py:118 +#, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" +msgstr "Cool, wir haben {num} neue Handshake{plural}!" + #: voice.py:121 -#, python-brace-format -msgid "" -"Hey" -"{what}" -"let's be friends!" -msgstr "" -"Hey" -"{what}" -"lass uns Freunde sein!" +msgid "Ops, something went wrong ... Rebooting ..." +msgstr "Ops, da ist etwas schief gelaufen ...Starte neu ..." -#: voice.py:122 -#, python-brace-format -msgid "" -"Associating to" -"{what}" -msgstr "" -"Verbinde mit" -"{what}" - -#: voice.py:123 -#, python-brace-format -msgid "" -"Yo" -"{what}!" -msgstr "" - -#: voice.py:128 -#, python-brace-format -msgid "" -"Just decided that" -"{mac}" -"needs no WiFi!" -msgstr "" -"Ich denke," -"dass {mac}" -"kein WiFi brauch!" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Deauthenticating" -"{mac}" -msgstr "" -"Deauthentifiziere" -"{mac}" - -#: voice.py:130 -#, python-brace-format -msgid "" -"Kickbanning" -"{mac}!" -msgstr "" -"Kicke" -"{mac}!" - -#: voice.py:135 -#, python-brace-format -msgid "" -"Cool, we got {num}" -"new handshake{plural}!" -msgstr "" -"Cool, wir haben {num}" -"neue Handshake{plural}!" - -#: voice.py:139 -msgid "" -"Ops, something" -"went wrong ..." -"Rebooting ..." -msgstr "" -"Ops, da ist etwas" -"schief gelaufen ..." -"Starte neu ..." - -#: voice.py:143 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "{num} Stationen gekicked\n" -#: voice.py:144 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "{num} Freunde gefunden\n" -#: voice.py:145 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "{num} Handshakes aufgez.\n" -#: voice.py:147 +#: voice.py:128 msgid "Met 1 peer" msgstr "1 Peer getroffen." -#: voice.py:149 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "{num} Peers getroffen" -#: voice.py:154 +#: voice.py:135 #, 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 "" -"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem habe ich " -"{associated} neue Freunde getroffen und {handshakes} Handshakes gefressen! #pwnagotchi " -"#pwnlog #pwnlife #hacktheplanet #skynet" +"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem " +"habe ich {associated} neue Freunde getroffen und {handshakes} Handshakes " +"gefressen! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po index 615ad2b..46f90c2 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/el/LC_MESSAGES/voice.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:42+0200\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" "PO-Revision-Date: 2019-10-03 08:00+0000\n" "Last-Translator: Periklis Fregkos \n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" @@ -17,27 +17,21 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "" -#: voice.py:21 -msgid "" -"Hi, I'm Pwnagotchi!" -"Starting ..." -msgstr "" -"Γειά, είμαι το Pwnagotchi!" -"Εκκινούμαι ..." - #: voice.py:22 -msgid "" -"New day, new hunt," -"new pwns!" -msgstr "" -"Νέα μέρα, νέο κυνήγι," -"νέα pwns!" +#, fuzzy +msgid "Hi, I'm Pwnagotchi! Starting ..." +msgstr "Γειά, είμαι το Pwnagotchi!Εκκινούμαι ..." #: voice.py:23 +#, fuzzy +msgid "New day, new hunt, new pwns!" +msgstr "Νέα μέρα, νέο κυνήγι,νέα pwns!" + +#: voice.py:24 msgid "Hack the Planet!" msgstr "Hackαρε τον πλανήτη!" @@ -46,295 +40,208 @@ msgid "AI ready." msgstr "ΤΝ έτοιμη." #: voice.py:29 -msgid "" -"The neural network" -"is ready." -msgstr "" -"Το νευρωνικό δίκτυο" -"είναι έτοιμο." +#, fuzzy +msgid "The neural network is ready." +msgstr "Το νευρωνικό δίκτυοείναι έτοιμο." -#: voice.py:39 -#, python-brace-format -msgid "" -"Hey, channel {channel} is" -"free! Your AP will" -"say thanks." -msgstr "" -"Ε, το κανάλι {channel} είναι" -"ελεύθερο! Το AP σου θα" -"είναι ευγνώμων." +#: voice.py:37 +#, fuzzy, python-brace-format +msgid "Hey, channel {channel} is free! Your AP will say thanks." +msgstr "Ε, το κανάλι {channel} είναιελεύθερο! Το AP σου θαείναι ευγνώμων." -#: voice.py:44 +#: voice.py:41 msgid "I'm bored ..." msgstr "Βαριέμαι ..." -#: voice.py:45 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "Ας πάμε μια βόλτα!" -#: voice.py:49 -msgid "" -"This is the best" -"day of my life!" -msgstr "" -"Είναι η καλύτερη" -"μέρα της ζωής μου!" +#: voice.py:45 +#, fuzzy +msgid "This is the best day of my life!" +msgstr "Είναι η καλύτερημέρα της ζωής μου!" -#: voice.py:53 +#: voice.py:48 msgid "Shitty day :/" msgstr "Σκατένια μέρα :/" -#: voice.py:58 +#: voice.py:52 msgid "I'm extremely bored ..." msgstr "Βαριέμαι πάρα πολύ ..." -#: voice.py:59 +#: voice.py:53 msgid "I'm very sad ..." msgstr "Είμαι πολύ λυπημένο ..." -#: voice.py:60 +#: voice.py:54 msgid "I'm sad" msgstr "Είμαι λυπημένο" -#: voice.py:66 +#: voice.py:59 msgid "I'm living the life!" msgstr "Ζω την ζωή μου!" -#: voice.py:67 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "Pwnάρω, άρα υπάρχω." -#: voice.py:68 +#: voice.py:61 msgid "So many networks!!!" msgstr "Τόσα πολλά δίκτυα!!!" -#: voice.py:69 -msgid "" -"I'm having so much" -"fun!" +#: voice.py:62 +#, fuzzy +msgid "I'm having so much fun!" msgstr "Περνάω τέλεια!" -#: voice.py:70 -msgid "" -"My crime is that of" -"curiosity ..." -msgstr "" -"Η περιέργεια είναι" -"το μόνο έγκλημά μου ..." +#: voice.py:63 +#, fuzzy +msgid "My crime is that of curiosity ..." +msgstr "Η περιέργεια είναιτο μόνο έγκλημά μου ..." -#: voice.py:75 -#, python-brace-format -msgid "" -"Hello" -"{name}!" -"Nice to meet you. {name}" -msgstr "" -"Γειά {name}!" -"Χάρηκα για τη γνωριμία. {name}" +#: voice.py:67 +#, fuzzy, python-brace-format +msgid "Hello {name}! Nice to meet you. {name}" +msgstr "Γειά {name}!Χάρηκα για τη γνωριμία. {name}" -#: voice.py:76 -#, python-brace-format -msgid "" -"Unit" -"{name}" -"is nearby! {name}" -msgstr "" -"Η μονάδα" -"{name}" -"είναι κοντά! {name}" +#: voice.py:68 +#, fuzzy, python-brace-format +msgid "Unit {name} is nearby! {name}" +msgstr "Η μονάδα{name}είναι κοντά! {name}" -#: voice.py:81 -#, python-brace-format -msgid "" -"Uhm ..." -"goodbye" -"{name}" -msgstr "" -"Εμμ ..." -"αντίο" -"{name}" +#: voice.py:72 +#, fuzzy, python-brace-format +msgid "Uhm ... goodbye {name}" +msgstr "Εμμ ...αντίο{name}" -#: voice.py:82 -#, python-brace-format -msgid "" -"{name}" -"is gone ..." -msgstr "" -"Το {name}" -"έφυγε ..." +#: voice.py:73 +#, fuzzy, python-brace-format +msgid "{name} is gone ..." +msgstr "Το {name}έφυγε ..." -#: voice.py:87 -#, python-brace-format -msgid "" -"Whoops ..." -"{name}" -"is gone." -msgstr "" -"Ουπς ... " -"Εξαφανίστηκε το" -"{name}." +#: voice.py:77 +#, fuzzy, python-brace-format +msgid "Whoops ... {name} is gone." +msgstr "Ουπς ... Εξαφανίστηκε το{name}." -#: voice.py:88 -#, python-brace-format -msgid "" -"{name}" -"missed!" -msgstr "" -"Έχασα το" -"{name}!" +#: voice.py:78 +#, fuzzy, python-brace-format +msgid "{name} missed!" +msgstr "Έχασα το{name}!" -#: voice.py:89 +#: voice.py:79 msgid "Missed!" msgstr "Το έχασα!" -#: voice.py:94 -msgid "" -"Nobody wants to" -"play with me ..." -msgstr "" -"Κανείς δε θέλει να" -"παίξει μαζί μου ..." +#: voice.py:83 +#, fuzzy +msgid "Nobody wants to play with me ..." +msgstr "Κανείς δε θέλει ναπαίξει μαζί μου ..." -#: voice.py:95 +#: voice.py:84 msgid "I feel so alone ..." msgstr "Νιώθω μοναχός μου ..." -#: voice.py:96 +#: voice.py:85 msgid "Where's everybody?!" msgstr "Μα, πού πήγαν όλοι;!" -#: voice.py:101 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "Ξεκουράζομαι για {secs}s ..." -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" -#: voice.py:112 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "Περιμένω για {secs}s ..." -#: voice.py:114 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "Ψάχνω τριγύρω ({secs})" +#: voice.py:106 +#, fuzzy, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "Εε!{what},ας γίνουμε φίλοι!" + +#: voice.py:107 +#, fuzzy, python-brace-format +msgid "Associating to {what}" +msgstr "Συνδέομαι με το{what}" + +#: voice.py:108 +#, fuzzy, python-brace-format +msgid "Yo {what}!" +msgstr "Που'σαι ρε τρελέ{what}!" + +#: voice.py:112 +#, fuzzy, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" +msgstr "Μόλις αποφάσισα ότι η{mac}δε χρείαζεται WiFi!" + +#: voice.py:113 +#, fuzzy, python-brace-format +msgid "Deauthenticating {mac}" +msgstr "Πετάω έξω την{mac}" + +#: voice.py:114 +#, fuzzy, python-brace-format +msgid "Kickbanning {mac}!" +msgstr "Μπανάρω την{mac}!" + +#: voice.py:118 +#, fuzzy, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" +msgstr "Τέλεια δικέ μου, πήραμε {num}νέες χειραψίες!" + #: voice.py:121 -#, python-brace-format -msgid "" -"Hey" -"{what}" -"let's be friends!" -msgstr "" -"Εε!" -"{what}," -"ας γίνουμε φίλοι!" +#, fuzzy +msgid "Ops, something went wrong ... Rebooting ..." +msgstr "Ουπς, κάτιπήγε λάθος ...Επανεκκινούμαι ..." -#: voice.py:122 -#, python-brace-format -msgid "" -"Associating to" -"{what}" -msgstr "" -"Συνδέομαι με το" -"{what}" - -#: voice.py:123 -#, python-brace-format -msgid "" -"Yo" -"{what}!" -msgstr "" -"Που'σαι ρε τρελέ" -"{what}!" - -#: voice.py:128 -#, python-brace-format -msgid "" -"Just decided that" -"{mac}" -"needs no WiFi!" -msgstr "" -"Μόλις αποφάσισα ότι η" -"{mac}" -"δε χρείαζεται WiFi!" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Deauthenticating" -"{mac}" -msgstr "" -"Πετάω έξω την" -"{mac}" - -#: voice.py:130 -#, python-brace-format -msgid "" -"Kickbanning" -"{mac}!" -msgstr "" -"Μπανάρω την" -"{mac}!" - -#: voice.py:135 -#, python-brace-format -msgid "" -"Cool, we got {num}" -"new handshake{plural}!" -msgstr "" -"Τέλεια δικέ μου, πήραμε {num}" -"νέες χειραψίες!" - -#: voice.py:139 -msgid "" -"Ops, something" -"went wrong ..." -"Rebooting ..." -msgstr "" -"Ουπς, κάτι" -"πήγε λάθος ..." -"Επανεκκινούμαι ..." - -#: voice.py:143 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "Έριξα {num} σταθμούς\n" -#: voice.py:144 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "Έκανα {num} νέους φίλους\n" -#: voice.py:145 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "Πήρα {num} χειραψίες\n" -#: voice.py:147 +#: voice.py:128 msgid "Met 1 peer" msgstr "Γνώρισα 1 φίλο" -#: voice.py:149 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "Γνώρισα {num} φίλους" -#: voice.py:154 +#: voice.py:135 #, 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" +"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi " +"#pwnlog #pwnlife #hacktheplanet #skynet" msgstr "" "Pwnαρα για {duration} και έριξα {deauthed} πελάτες! Επίσης γνώρισα " -"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! #pwnagotchi " -"#pwnlog #pwnlife #hacktheplanet #skynet" +"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! " +"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po index c164152..17d03f3 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/fr/LC_MESSAGES/voice.po @@ -8,281 +8,230 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-03 10:28+0200\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" "PO-Revision-Date: 2019-10-03 10:34+0200\n" -"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github.com>\n" +"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github." +"com>\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: french\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "" -#: voice.py:21 -msgid "" -"Bonjour, je suis Pwnagotchi!" -"Démarrage ..." -msgstr "" - #: voice.py:22 -msgid "" -"New day, new hunt," -"Nouvelle journée, nouvelle chasse," -"nouveau pwns!" +msgid "Hi, I'm Pwnagotchi! Starting ..." msgstr "" #: voice.py:23 -msgid "Hack la planète!" +msgid "New day, new hunt, new pwns!" +msgstr "" + +#: voice.py:24 +msgid "Hack the Planet!" msgstr "" #: voice.py:28 -msgid "IA prête." +msgid "AI ready." msgstr "" #: voice.py:29 -msgid "" -"Le réseau neuronal" -"est prêt." +msgid "The neural network is ready." msgstr "" -#: voice.py:39 +#: voice.py:37 #, python-brace-format -msgid "" -"Hey, le channel {channel} est" -"libre! Ton AP va" -"dis merci." +msgid "Hey, channel {channel} is free! Your AP will say thanks." msgstr "" -#: voice.py:44 -msgid "Je m'ennuie ..." +#: voice.py:41 +msgid "I'm bored ..." +msgstr "" + +#: voice.py:42 +msgid "Let's go for a walk!" msgstr "" #: voice.py:45 -msgid "Allons faire un tour!" +msgid "This is the best day of my life!" msgstr "" -#: voice.py:49 -msgid "" -"C'est le meilleur" -"jour de ma vie!" +#: voice.py:48 +msgid "Shitty day :/" +msgstr "" + +#: voice.py:52 +msgid "I'm extremely bored ..." msgstr "" #: voice.py:53 -msgid "Journée de merde :/" +msgid "I'm very sad ..." msgstr "" -#: voice.py:58 -msgid "Je m'ennuie énormément ..." +#: voice.py:54 +msgid "I'm sad" msgstr "" #: voice.py:59 -msgid "Je suis très triste ..." +msgid "I'm living the life!" msgstr "" #: voice.py:60 -msgid "Je suis triste" +msgid "I pwn therefore I am." msgstr "" -#: voice.py:66 -msgid "Je vis la vie!" +#: voice.py:61 +msgid "So many networks!!!" +msgstr "" + +#: voice.py:62 +msgid "I'm having so much fun!" +msgstr "" + +#: voice.py:63 +msgid "My crime is that of curiosity ..." msgstr "" #: voice.py:67 -msgid "Je pwn donc je suis." +#, python-brace-format +msgid "Hello {name}! Nice to meet you. {name}" msgstr "" #: voice.py:68 -msgid "Autant de réseaux!!!" -msgstr "" - -#: voice.py:69 -msgid "" -"Je m'amuse tellement!" -msgstr "" - -#: voice.py:70 -msgid "" -"Mon crime est celui de" -"la curiosité ..." -msgstr "" - -#: voice.py:75 #, python-brace-format -msgid "" -"Bonjour" -"{name}!" -"Ravis de te rencontrer. {name}" +msgid "Unit {name} is nearby! {name}" msgstr "" -#: voice.py:76 +#: voice.py:72 #, python-brace-format -msgid "" -"L'unité" -"{name}" -"est proche! {name}" +msgid "Uhm ... goodbye {name}" msgstr "" -#: voice.py:81 +#: voice.py:73 #, python-brace-format -msgid "" -"Hum ..." -"au revoir" -"{name}" +msgid "{name} is gone ..." msgstr "" -#: voice.py:82 +#: voice.py:77 #, python-brace-format -msgid "" -"{name}" -"est parti ..." +msgid "Whoops ... {name} is gone." msgstr "" -#: voice.py:87 +#: voice.py:78 #, python-brace-format -msgid "" -"Oups ..." -"{name}" -"est parti." +msgid "{name} missed!" msgstr "" -#: voice.py:88 -#, python-brace-format -msgid "" -"{name}" -"raté!" +#: voice.py:79 +msgid "Missed!" +msgstr "" + +#: voice.py:83 +msgid "Nobody wants to play with me ..." +msgstr "" + +#: voice.py:84 +msgid "I feel so alone ..." +msgstr "" + +#: voice.py:85 +msgid "Where's everybody?!" msgstr "" #: voice.py:89 -msgid "Raté!" -msgstr "" - -#: voice.py:94 -msgid "" -"Personne ne veut" -"jouer avec moi ..." -msgstr "" - -#: voice.py:95 -msgid "Je me sens si seul ..." -msgstr "" - -#: voice.py:96 -msgid "Où est tout le monde?!" -msgstr "" - -#: voice.py:101 #, python-brace-format -msgid "Fais la sieste pendant {secs}s ..." +msgid "Napping for {secs}s ..." msgstr "" -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" +#: voice.py:98 +#, python-brace-format +msgid "Waiting for {secs}s ..." +msgstr "" + +#: voice.py:100 +#, python-brace-format +msgid "Looking around ({secs}s)" +msgstr "" + +#: voice.py:106 +#, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "" + +#: voice.py:107 +#, python-brace-format +msgid "Associating to {what}" +msgstr "" + +#: voice.py:108 +#, python-brace-format +msgid "Yo {what}!" +msgstr "" + #: voice.py:112 #, python-brace-format -msgid "Attends pendant {secs}s ..." +msgid "Just decided that {mac} needs no WiFi!" +msgstr "" + +#: voice.py:113 +#, python-brace-format +msgid "Deauthenticating {mac}" msgstr "" #: voice.py:114 #, python-brace-format -msgid "Regarde autour ({secs}s)" +msgid "Kickbanning {mac}!" +msgstr "" + +#: voice.py:118 +#, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" msgstr "" #: voice.py:121 -#, python-brace-format -msgid "" -"Hey" -"{what}" -"soyons amis!" +msgid "Ops, something went wrong ... Rebooting ..." msgstr "" -#: voice.py:122 +#: voice.py:124 #, python-brace-format -msgid "" -"Association à" -"{what}" +msgid "Kicked {num} stations\n" msgstr "" -#: voice.py:123 +#: voice.py:125 #, python-brace-format -msgid "" -"Yo" -"{what}!" +msgid "Made {num} new friends\n" +msgstr "" + +#: voice.py:126 +#, python-brace-format +msgid "Got {num} handshakes\n" msgstr "" #: voice.py:128 -#, python-brace-format -msgid "" -"Décidé à l'instant que" -"{mac}" -"n'a pas besoin de WiFi!" -msgstr "" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Désauthentification de" -"{mac}" +msgid "Met 1 peer" msgstr "" #: voice.py:130 #, python-brace-format -msgid "" -"Kickbanning" -"{mac}!" +msgid "Met {num} peers" msgstr "" #: voice.py:135 #, python-brace-format msgid "" -"Cool, nous avons {num}" -"nouveaux handshake{plural}!" -msgstr "" - -#: voice.py:139 -msgid "" -"Oups, quelque" -"chose s'est mal passé ..." -"Redémarrage ..." -msgstr "" - -#: voice.py:143 -#, python-brace-format -msgid "{num} stations kick\n" -msgstr "" - -#: voice.py:144 -#, python-brace-format -msgid "Fait {num} nouveaux amis\n" -msgstr "" - -#: voice.py:145 -#, python-brace-format -msgid "Récupéré {num} handshakes\n" -msgstr "" - -#: voice.py:147 -msgid "1 peer rencontré" -msgstr "" - -#: voice.py:149 -#, python-brace-format -msgid "{num} peers recontrés" -msgstr "" - -#: voice.py:154 -#, python-brace-format -msgid "" -"J'ai pwn durant {duration} et kick {deauthed} clients! J'ai aussi rencontré " -"{associated} nouveaux amis and mangé {handshakes} handshakes! #pwnagotchi " +"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 "" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo index a811add1ad5e423704921426827c4a15424cfb3b..0dca8ac1b61291b4b6db73cdd11f27f489e22303 100644 GIT binary patch delta 630 zcmZ9}JxfAS7{Kvk`EtGaQkvOdB^8EXwX`-EK{d1#MN5OBU_@G)gGBfRq~(xAUqBio zXo$e6hSqGzA*k>RL^L$@f3CK4;P^Y|-gD3M;?+poUwIAK&lDrfj4+$bF=o}q55wqD z%8hOeVGx5D@9yW(%YGf@juZ}J8C`ga{aC|Wtm6>w^jhaCs?1_o4x(I8M-v<9$48Wl zTHW{WC;@*^5;5%E=qCAPlzY}3o%h=)flDagSJ9&?N?ouRLOy&#={g;I_W`)^EV`kgj6V1%YUqrE73wGl`hYy zrTkI!I9J*~iDpx|bTOOS%M?w0W8csdj<#NKp6f-|xPEaZu2+qaE&Tsz^q`O_?wUGp TZt4&7Q%`zY`p_HK)4td*k1a^$ literal 3761 zcmb`J&yS=<8OKWj7YY%@U*Iq5WszZ>>E7vGBg?P?voi}jIz0?KgOg44Q2oBu-DSUT z)w^%i+ilb7#6%*00h(~p5DsX#5(F>m#FKC|1`iq!Tmere9*p0o-uLaEHGA~U_I}X6;{QSoldklQ%Vi| zAnkt=ya4_H6yVRm&w_7)wEs`wUEn{!FM=P|JarpmpTqP0;3@E%;HSZh;M-sqBt5r( zg0XwRv)~uNOCasL2Hp!AkmSAya_|@6-Qcf5lKXc3{SP47`&Uqa{{krn_hJ#*w+)ir zS3z3W2L<>Oko3L^eii&JNc!FbY5hOJFM+q+Ug;Mg*}DpU3Va;A12OK_-;WU7(|F$l z+u%<@lJ^Gq0QfFQ`ac3Gu6MzyGvHGo*^z@}?~C9k!I!|Vfv6Tx;N5uH0sjn=o>LG)`X2=E2QPvv;P*lD;|1_D;LkzQ|Erq610TZkUqJHbKOpUY z0LGDDmq6No9i%#V0i-y+44wtw0KX2t4@TgfFq-1o0!iN{Nbe6on9fS@KJdpN+3_-n zu!bCy-sbuSZpd%i+gwy9WD8v=zaS6kU=QL)HAffOLUJhwDD@CCiaXU3U1S@@xw%lD zArJKYFn(XgkNl*VlKo^W`AZk&rMXactZuasXNo<=5$O(jTLmee22!jRer^Zo)Y~+D`<)6YKUHj`s_tB5}=@h1lE|6P>2q$*J&IJ92GyMX!mSl}zkUjD-F1P)Gd0%Od#LZnxQv z=qt!{R>;&EC8~G%#6W~9RNod#>!6MatRlRgF2_MI*m4<$7*7uN4I9DyG zUXepoV#4|0D(Yu9RKviA7)UXZ=_q2m){ZDHvals$@$k&4*v;J;)|Cky3L;Lp%2^jC zc0{gJ5pJs$^ypYuJExL}?a4e}#JZ9flCg)7B@zV~%DyyyEi?dPgUZ~qJ)2Bn6#`F9 zgJ|GM`yoOfc0ZH5HIxDpF(h9n$dH&67Ph0*_*K=jc2SH6L+$;Pl!=YA>;UPLW(u`_ zVvCWBqKF-$c8sEaYhH8hn*Kc;;vWB~z%iKiH&u00vgeFO zmO>knG^1qEn?_Az9!VVx3?+CXEJxHI=u<_NOF?)dVn;)3a~E_h8?PaQ^;oY6?<)xvW_B!9P#v{|M!)Xp% zJSN3iRE9Q>(G)A3^4~6fzja}`u8_v{RnfX^Vw<2)HpGP?suMy(0i>uH(Ust@?0yPHWZup`&UZ&4e1zhN?^n8RnA%&i&~fcNdD_*&)sb+=ucO1#5P*G5ZdG7fxDqpai`vC%8EWjn zV)~#hFtdXk#W8>I5z%Y};x>UZ1#*{I?$OjJNS)bescx*tcnq?9p`BONeP&Z^uHKNe zD^{d(Y%#Dcrp^t+TZJg&z(IJ@Sl@JlW4kmltkTLu52JtiTC>aar@^+x!RZttYZ7EGdV(F`PX-ysnk*1J*QhfMQ$k8l48uL>v|^we zo2vXQ8;fT59%4mqj7ys;j(mjR3jH>%BIVe vhvNF!4*pcJryljC_xh%%iGvp_5Lcz=W{1j+D}vzqY{52%`JH3@hDq^Xej)-1 diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po index 3dabc3d..0123244 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-02 16:38+0000\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" "PO-Revision-Date: 2019-10-02 17:20+0000\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: italian\n" @@ -19,220 +19,193 @@ msgstr "" msgid "ZzzzZZzzzzZzzz" msgstr "" -#: voice.py:23 -msgid "" -"Hi, I'm Pwnagotchi!\n" -"Starting ..." +#: voice.py:22 +#, fuzzy +msgid "Hi, I'm Pwnagotchi! Starting ..." msgstr "" "Ciao!\n" "Piacere Pwnagotchi!\n" "Caricamento ..." -#: voice.py:24 -msgid "" -"New day, new hunt,\n" -"new pwns!" +#: voice.py:23 +#, fuzzy +msgid "New day, new hunt, new pwns!" msgstr "" "Nuovo giorno...\n" "nuovi handshakes!!!" -#: voice.py:25 +#: voice.py:24 msgid "Hack the Planet!" msgstr "" -#: voice.py:30 +#: voice.py:28 msgid "AI ready." msgstr "IA pronta." -#: voice.py:31 -msgid "" -"The neural network\n" -"is ready." +#: voice.py:29 +#, fuzzy +msgid "The neural network is ready." msgstr "" "La rete neurale\n" "è pronta." -#: voice.py:41 -#, python-brace-format -msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" -"say thanks." +#: voice.py:37 +#, fuzzy, python-brace-format +msgid "Hey, channel {channel} is free! Your AP will say thanks." msgstr "" "Hey, il canale {channel} è\n" "libero! Il tuo AP\n" "ringrazia." -#: voice.py:46 +#: voice.py:41 msgid "I'm bored ..." msgstr "Che noia ..." -#: voice.py:47 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "" "Andiamo a fare una\n" "passeggiata!" -#: voice.py:51 -msgid "" -"This is the best\n" -"day of my life!" +#: voice.py:45 +#, fuzzy +msgid "This is the best day of my life!" msgstr "" "Questo è il più bel\n" "giorno della mia\n" "vita!!!!" -#: voice.py:55 +#: voice.py:48 msgid "Shitty day :/" msgstr "Giorno di merda :/" -#: voice.py:60 +#: voice.py:52 msgid "I'm extremely bored ..." msgstr "" "Sono estremamente\n" "annoiato ..." -#: voice.py:61 +#: voice.py:53 msgid "I'm very sad ..." msgstr "Sono molto triste..." -#: voice.py:62 +#: voice.py:54 msgid "I'm sad" msgstr "Sono triste" -#: voice.py:68 +#: voice.py:59 msgid "I'm living the life!" msgstr "Mi sento vivo!" -#: voice.py:69 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "Pwn ergo sum." -#: voice.py:70 +#: voice.py:61 msgid "So many networks!!!" msgstr "Qui è pieno di reti!" -#: voice.py:71 -msgid "" -"I'm having so much\n" -"fun!" +#: voice.py:62 +#, fuzzy +msgid "I'm having so much fun!" msgstr "" "Mi sto divertendo\n" "tantissimo!" -#: voice.py:72 -msgid "" -"My crime is that of\n" -"curiosity ..." +#: voice.py:63 +msgid "My crime is that of curiosity ..." msgstr "" -#: voice.py:77 -#, python-brace-format -msgid "" -"Hello\n" -"{name}!\n" -"Nice to meet you. {name}" +#: voice.py:67 +#, fuzzy, python-brace-format +msgid "Hello {name}! Nice to meet you. {name}" msgstr "" "Ciao\n" "{name}!\n" "E' un piacere. {name}" -#: voice.py:78 -#, python-brace-format -msgid "" -"Unit\n" -"{name}\n" -"is nearby! {name}" +#: voice.py:68 +#, fuzzy, python-brace-format +msgid "Unit {name} is nearby! {name}" msgstr "" "L'Unità\n" "{name}\n" "è vicina! {name}" -#: voice.py:83 -#, python-brace-format -msgid "" -"Uhm ...\n" -"goodbye\n" -"{name}" +#: voice.py:72 +#, fuzzy, python-brace-format +msgid "Uhm ... goodbye {name}" msgstr "" "Uhm ...\n" "addio\n" "{name},\n" "mi mancherai..." -#: voice.py:84 -#, python-brace-format -msgid "" -"{name}\n" -"is gone ..." +#: voice.py:73 +#, fuzzy, python-brace-format +msgid "{name} is gone ..." msgstr "" "{name}\n" "se n'è andato ..." -#: voice.py:89 -#, python-brace-format -msgid "" -"Whoops ...\n" -"{name}\n" -"is gone." +#: voice.py:77 +#, fuzzy, python-brace-format +msgid "Whoops ... {name} is gone." msgstr "" "Whoops ...\n" "{name}\n" "se n'è andato." -#: voice.py:90 -#, python-brace-format -msgid "" -"{name}\n" -"missed!" +#: voice.py:78 +#, fuzzy, python-brace-format +msgid "{name} missed!" msgstr "" "{name}\n" "è scomparso..." -#: voice.py:91 +#: voice.py:79 msgid "Missed!" msgstr "" "Ehi!\n" "Dove sei andato!?" -#: voice.py:96 -msgid "" -"Nobody wants to\n" -"play with me ..." +#: voice.py:83 +#, fuzzy +msgid "Nobody wants to play with me ..." msgstr "" "Nessuno vuole\n" "giocare con me..." -#: voice.py:97 +#: voice.py:84 msgid "I feel so alone ..." msgstr "Mi sento così solo..." -#: voice.py:98 +#: voice.py:85 msgid "Where's everybody?!" msgstr "Dove sono tutti?!" -#: voice.py:103 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "" "Schiaccio un \n" "pisolino per {secs}s ..." -#: voice.py:104 +#: voice.py:90 msgid "Zzzzz" msgstr "" -#: voice.py:105 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" -#: voice.py:114 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "Aspetto {secs}s ..." -#: voice.py:116 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "" @@ -240,109 +213,91 @@ msgstr "" "qui intorno...\n" "({secs}s)" -#: voice.py:123 -#, python-brace-format -msgid "" -"Hey\n" -"{what}\n" -"let's be friends!" +#: voice.py:106 +#, fuzzy, python-brace-format +msgid "Hey {what} let's be friends!" msgstr "" "Hey\n" "{what}\n" "Diventiamo amici!" -#: voice.py:124 -#, python-brace-format -msgid "" -"Associating to\n" -"{what}" +#: voice.py:107 +#, fuzzy, python-brace-format +msgid "Associating to {what}" msgstr "" "Collegamento con\n" "{what}\n" "in corso..." -#: voice.py:125 -#, python-brace-format -msgid "" -"Yo\n" -"{what}!" +#: voice.py:108 +#, fuzzy, python-brace-format +msgid "Yo {what}!" msgstr "" "Yo\n" "{what}!" -#: voice.py:130 -#, python-brace-format -msgid "" -"Just decided that\n" -"{mac}\n" -"needs no WiFi!" +#: voice.py:112 +#, fuzzy, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" msgstr "" "Ho appena deciso che\n" "{mac}\n" "non necessita di\n" "WiFi!" -#: voice.py:131 +#: voice.py:113 #, python-brace-format -msgid "" -"Deauthenticating\n" -"{mac}" +msgid "Deauthenticating {mac}" msgstr "" -#: voice.py:132 -#, python-brace-format -msgid "" -"Kickbanning\n" -"{mac}!" +#: voice.py:114 +#, fuzzy, python-brace-format +msgid "Kickbanning {mac}!" msgstr "" "Sto prendendo\n" "a calci\n" "{mac}!" -#: voice.py:137 -#, python-brace-format -msgid "" -"Cool, we got {num}\n" -"new handshake{plural}!" +#: voice.py:118 +#, fuzzy, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" msgstr "" "Bene, abbiamo {num}\n" "handshake{plural} in più!" -#: voice.py:141 -msgid "" -"Ops, something\n" -"went wrong ...\n" -"Rebooting ..." +#: voice.py:121 +#, fuzzy +msgid "Ops, something went wrong ... Rebooting ..." msgstr "" "Ops, qualcosa\n" "è andato storto ...\n" "Riavvio ..." -#: voice.py:145 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "{num} stazioni pestate\n" -#: voice.py:146 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "{num} nuovi amici\n" -#: voice.py:147 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "{num} handshakes presi\n" -#: voice.py:149 +#: voice.py:128 msgid "Met 1 peer" msgstr "1 peer incontrato" -#: voice.py:151 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "{num} peers incontrati" -#: voice.py:156 +#: voice.py:135 #, python-brace-format msgid "" "I've been pwning for {duration} and kicked {deauthed} clients! I've also met " diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.mo index 2d3562329ea69daafd4db6bb7f0570ba452fd5ba..8a736612f9b685251c638e5b14174decfa3641ea 100644 GIT binary patch delta 723 zcmX}qJxClu7{>9r%YFN`>KTn6uzDAa7z9aSVH&XrVikzkSa@i_5Iiw4poqCx*aWK^ zEG%qNXf4;t6@r}}1Z-3g!GM)WA_x`=`hWJ;yfF9MnVp?^=bihVTCdNY)rHm!(L!sb z-OygrN&$X|@t`qr%wPk4MhBO%9`pYACRWieVk7Qj68~TnZ&BYp;0`*^jCpQM&K&UI zO~fWmL@nTij7i`ttid;^g$7aYhfy0&pc0w&$5;IR2G%mZjn%k^VLZenhdahP_BU6I zcJRVP$_uAZC+)}A_#VmBe8)CiLnT^3C0N22c!YoP8q;`AwwfP_mHTPmAxtrz#V+YRpbiWF-ZM&;xuaGx2O$AP**mCmAH!jtr@E9on8lF*qg5^=zE1KrfTM> zf)^z1g%VNduC%E_r{q>BS9v3qo!tJ1{yQpdGfjy$`sZ4hA>y+IJHQJHz2fG`-u&0q9b}8Cq@1h-{(afhgyBtm0U$LY;iFFp-cvryg hC;IKbiuuCN%ASA?R$togns!^|^x1o-*N)W=J_01pQQ80i literal 4559 zcmbW4PmmN>9mhLLG+E<668}Y`uSG)$GsEl>EZ8JQ0#VkmK*1ssz4Xq!ooQ#LduzIf zaoF0D1rs)wTB#T+NP!3mrI%DK3kxedyBsY&=<8#uQeM1i${f6zi=W@?o@H2bve}+* zzt_L_`}_U9*Zgh$x-$;fAorKJ-@M0hc7eGM^TV}$o#WgO?f@SGcY%+A-v>Vf&SdyH z_$kJ3fnNhxz;A$m2OkC>zSnWS0&W8z1P_C<-UmMp{sjCS_zUo};1y8pb-|B<2`KvC z25*7?0L9Lgk2ub!!9Rnt?j2Cp{Tuu|cpr;JuL}-dBfTHhbpvYea#h)9XP;N@)oPoUU+7u*c4`xvEmCj}G3*cMed*B~I@#7}WihutCr7rgnl<0XB zl=1EieQ*QgUxJ&!c~I){4)`?qE~voAnS26#9()Qs0qz5rLCNz2kU{)&!L8sf@ENcT z3J-3AIq)x_=LJ3id))8;#7~dJ|u(e+5&FmmU@a$P{H<X(>mCsOo#U&e? zOi65nXmbhmZI2c~shRMqcR^p9KN){Ho0NJKxFs)gQ388Oexw&9AA{VFbFW@IM^saL zMZaZmX&nl%uLw(^Hf6R@19b zyUuRywc@G{V!vcnOf|gHwDXyg(%zZcY^f-Fm8 zsq1)Sq{g+HX!;ueG3)2l$i{{`&<;G}D^-2>Q0z5r1`36OGomImwxUpZ^)S#Xottb2 z;(Sw2giWnRl-EEKE#nN!sSG3iWKes-*ukH_i>6$X!dnFBhd)^R217dVbNY& z&q`<$;HkD(uer|NFsw;Zyk^)U5sytpx)e=Eo19UvOf*(SUz`KZC|MX(lUg_JV=5uT z$QkvcNS9q_w4+K*zoDU;^;(4!rB>4qBR}rglI-&)Cs!+x8cgR&XxW3cwr5&FoRbF< z2lw`c<6*gj*Hi_%lPLy%T%{~_?f%Iq2TLeY71eEur`pYs$ROcCJsyUuEIm~9V;sSd z8s6d@qOe}j!DQSHo3+SwU1tnd1zH-lH%%m2*N;_swt)$&qFB^~6ROe4czC$l5R;WK zERT0|){2J%KTaQ68ECIL-f??vdc^asYnGOM$v7e{Lj!7Iv&8<4>l~?u;bbKGSG84W zw1RUq+kaf=h2zKhJKk4G8NMJt_Js%>KknSM-X<`eX=F7#&Vf>Kz9O~Y#YxE~KV?ET4%xt*La3#Mz9%}T*B zm&}4PH_e>6W#*F8$tg3>b64?pE;|y;IcAq~D)}iAC(R-fT^8BS5haWl6*^IoE>F&x zIoC12GAqhl$JCseXWfEXmet8i+#=jfPYm;BPixk#Yc&lx=8EV>mogX463@$KAvuYK z*Ufb+J#SXh>bvGV{w;~&E>4++)x*S`NzUe!1Sye;NOH38P(k60Oq#3Q;`6f0*@C|- zDmhQEHf~vbLk1*5{2+U1O|wK0XJw&8JSSO}r{n|)xq(OI>uz_+=2@1^Ac;t~|3o6j zmE<(Z>XkxHA#)kOmL$QVTMA@nFG-Ns7)t>u+D!?L#mwGD%ZvmdhD;X~ugMJ0*KN^O z2+itv!z?8yC5_^GpG5k0HaV5N$bBj$$yL_Rr|ZeCjq1GVBJrZKfl>*SowhG7BYQ(+ z9jYQcxhCG9?9F~~1oKov65e;fNi>UuhHW8_neRX6sOS=N8M#~qC*~yfG!-J-f8tp; zgsxd_NF6mIUqV@|C@Cw;g(58NKMU8=^8Y&#aZhwFB(o}+mFmDrCTuJ40BO25NmyHu zfU`5woFm3tGGUgpL(-hRJ0zlUcyIb+U_Lnmaq&5 zvST!v*~CUGr!b4sKL4P^VP|dD2O%J;7cnn;#)4V;Uztqv8acD*n2Ri3!N<8|)-2LE zuM&Og0Cn!QOxg$1>X1MAHSHq3dmEb)q9uPyv7cwXXv3E5cUAh8K>OJaxFE3!`_XRe zVTZCC%;zi_F$Fc!KI=8}1zQoiOLD`WAf3eqA!_Jrkza)H(pHS@euQ=ev!1)1%ve(} zL1>UF!2v3eF@siNdCCG7ncvDDg{&}E_R+L(R^25TBwsLM zksV3C63hjj=b2eyvzZa+MY}LC6@sSX`<>%LHoV`+`Ow>4Eq5s~`-Zv7szvGkERhO9 z!jj$3ZVK`Wn^&w)cum*M^|ozMdz;~0x{FI3cJWo)+c!}`*;YR|%xh`(kNV6%sfzFx@Qu, 2019. # kovach <2214005+kovachwt@users.noreply.github.com>, 2019. # -#, fuzzymsgid "" msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:42+0200\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" "PO-Revision-Date: 2019-09-30 23:53+0200\n" "Last-Translator: kovach <2214005+kovachwt@users.noreply.github.com>\n" "Language-Team: \n" @@ -18,27 +17,21 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "ДреееММмммМммм" -#: voice.py:21 -msgid "" -"Hi, I'm Pwnagotchi!" -"Starting ..." -msgstr "" -"Здраво, јас сум Pwnagotchi!" -"Почнувам ..." - #: voice.py:22 -msgid "" -"New day, new hunt," -"new pwns!" -msgstr "" -"Нов ден, нов лов," -"ќе си газиме!" +#, fuzzy +msgid "Hi, I'm Pwnagotchi! Starting ..." +msgstr "Здраво, јас сум Pwnagotchi!Почнувам ..." #: voice.py:23 +#, fuzzy +msgid "New day, new hunt, new pwns!" +msgstr "Нов ден, нов лов,ќе си газиме!" + +#: voice.py:24 msgid "Hack the Planet!" msgstr "Хак д Планет!" @@ -47,290 +40,202 @@ msgid "AI ready." msgstr "AI спремно." #: voice.py:29 -msgid "" -"The neural network" -"is ready." -msgstr "" -"Невронската мрежа" -"е спремна." +#, fuzzy +msgid "The neural network is ready." +msgstr "Невронската мрежае спремна." -#: voice.py:39 -#, python-brace-format -msgid "" -"Hey, channel {channel} is" -"free! Your AP will" -"say thanks." -msgstr "" -"Еј, каналот {channel} е" -"слободен! APто ќе ти" -"каже фала." +#: voice.py:37 +#, fuzzy, python-brace-format +msgid "Hey, channel {channel} is free! Your AP will say thanks." +msgstr "Еј, каналот {channel} еслободен! APто ќе тикаже фала." -#: voice.py:44 +#: voice.py:41 msgid "I'm bored ..." msgstr "Досаднооо ..." -#: voice.py:45 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "Ајде да шетнеме!" -#: voice.py:49 -msgid "" -"This is the best" -"day of my life!" -msgstr "" -"Ова ми е најдобриот " -"ден во животот!" +#: voice.py:45 +#, fuzzy +msgid "This is the best day of my life!" +msgstr "Ова ми е најдобриот ден во животот!" -#: voice.py:53 +#: voice.py:48 msgid "Shitty day :/" msgstr "Срање ден :/" -#: voice.py:58 +#: voice.py:52 msgid "I'm extremely bored ..." msgstr "Ултра досадно ..." -#: voice.py:59 +#: voice.py:53 msgid "I'm very sad ..." msgstr "Многу тажно ..." -#: voice.py:60 +#: voice.py:54 msgid "I'm sad" msgstr "Тажно" -#: voice.py:66 +#: voice.py:59 msgid "I'm living the life!" msgstr "Ммхх животче!" -#: voice.py:67 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "Си газам значи постојам." -#: voice.py:68 +#: voice.py:61 msgid "So many networks!!!" msgstr "Мммм колку мрежи!!!" -#: voice.py:69 -msgid "" -"I'm having so much" -"fun!" +#: voice.py:62 +#, fuzzy +msgid "I'm having so much fun!" msgstr "Јухуу забавноо ее!" -#: voice.py:70 -msgid "" -"My crime is that of" -"curiosity ..." -msgstr "" -"Виновен сум само за" -"љубопитност ..." +#: voice.py:63 +#, fuzzy +msgid "My crime is that of curiosity ..." +msgstr "Виновен сум само заљубопитност ..." -#: voice.py:75 -#, python-brace-format -msgid "" -"Hello" -"{name}!" -"Nice to meet you. {name}" -msgstr "" -"Здраво" -"{name}!" -"Мило ми е. {name}" +#: voice.py:67 +#, fuzzy, python-brace-format +msgid "Hello {name}! Nice to meet you. {name}" +msgstr "Здраво{name}!Мило ми е. {name}" -#: voice.py:76 -#, python-brace-format -msgid "" -"Unit" -"{name}" -"is nearby! {name}" -msgstr "" -"Опаа" -"{name}" -"е во близина! {name}" +#: voice.py:68 +#, fuzzy, python-brace-format +msgid "Unit {name} is nearby! {name}" +msgstr "Опаа{name}е во близина! {name}" -#: voice.py:81 -#, python-brace-format -msgid "" -"Uhm ..." -"goodbye" -"{name}" -msgstr "" -"Хмм ..." -"чао" -"{name}" +#: voice.py:72 +#, fuzzy, python-brace-format +msgid "Uhm ... goodbye {name}" +msgstr "Хмм ...чао{name}" -#: voice.py:82 -#, python-brace-format -msgid "" -"{name}" -"is gone ..." -msgstr "" -"{name}" -"го снема ..." +#: voice.py:73 +#, fuzzy, python-brace-format +msgid "{name} is gone ..." +msgstr "{name}го снема ..." -#: voice.py:87 -#, python-brace-format -msgid "" -"Whoops ..." -"{name}" -"is gone." -msgstr "" -"Уупс ..." -"{name}" -"го снема." +#: voice.py:77 +#, fuzzy, python-brace-format +msgid "Whoops ... {name} is gone." +msgstr "Уупс ...{name}го снема." -#: voice.py:88 -#, python-brace-format -msgid "" -"{name}" -"missed!" -msgstr "" -"{name}" -"промаши!" +#: voice.py:78 +#, fuzzy, python-brace-format +msgid "{name} missed!" +msgstr "{name}промаши!" -#: voice.py:89 +#: voice.py:79 msgid "Missed!" msgstr "Промаши!" -#: voice.py:94 -msgid "" -"Nobody wants to" -"play with me ..." -msgstr "" -"Никој не сака да" -"си игра со мене ..." +#: voice.py:83 +#, fuzzy +msgid "Nobody wants to play with me ..." +msgstr "Никој не сака даси игра со мене ..." -#: voice.py:95 +#: voice.py:84 msgid "I feel so alone ..." msgstr "Толку сам ..." -#: voice.py:96 +#: voice.py:85 msgid "Where's everybody?!" msgstr "Каде се сите?!" -#: voice.py:101 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "Ќе дремнам {secs}с ..." -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "Дреммм" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "Дремммм ({secs}с)" -#: voice.py:112 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "Чекам {secs}с ..." -#: voice.py:114 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "Шарам наоколу ({secs}с)" +#: voice.py:106 +#, fuzzy, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "Еј{what}ајде да се дружиме!" + +#: voice.py:107 +#, fuzzy, python-brace-format +msgid "Associating to {what}" +msgstr "Се закачувам на{what}" + +#: voice.py:108 +#, fuzzy, python-brace-format +msgid "Yo {what}!" +msgstr "Јо{what}!" + +#: voice.py:112 +#, fuzzy, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" +msgstr "Знаеш што, на{mac}не му треба WiFi!" + +#: voice.py:113 +#, fuzzy, python-brace-format +msgid "Deauthenticating {mac}" +msgstr "Го деавтентицирам{mac}" + +#: voice.py:114 +#, fuzzy, python-brace-format +msgid "Kickbanning {mac}!" +msgstr "Кикбан{mac}!" + +#: voice.py:118 +#, fuzzy, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" +msgstr "Кул, фативме {num}нови ракувања!" + #: voice.py:121 -#, python-brace-format -msgid "" -"Hey" -"{what}" -"let's be friends!" -msgstr "" -"Еј" -"{what}" -"ајде да се дружиме!" +#, fuzzy +msgid "Ops, something went wrong ... Rebooting ..." +msgstr "Упс, нешто не еко што треба ...Рестартирам ..." -#: voice.py:122 -#, python-brace-format -msgid "" -"Associating to" -"{what}" -msgstr "" -"Се закачувам на" -"{what}" - -#: voice.py:123 -#, python-brace-format -msgid "" -"Yo" -"{what}!" -msgstr "" -"Јо" -"{what}!" - -#: voice.py:128 -#, python-brace-format -msgid "" -"Just decided that" -"{mac}" -"needs no WiFi!" -msgstr "" -"Знаеш што, на" -"{mac}" -"не му треба WiFi!" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Deauthenticating" -"{mac}" -msgstr "" -"Го деавтентицирам" -"{mac}" - -#: voice.py:130 -#, python-brace-format -msgid "" -"Kickbanning" -"{mac}!" -msgstr "" -"Кикбан" -"{mac}!" - -#: voice.py:135 -#, python-brace-format -msgid "" -"Cool, we got {num}" -"new handshake{plural}!" -msgstr "" -"Кул, фативме {num}" -"нови ракувања!" - -#: voice.py:139 -msgid "" -"Ops, something" -"went wrong ..." -"Rebooting ..." -msgstr "" -"Упс, нешто не е" -"ко што треба ..." -"Рестартирам ..." - -#: voice.py:143 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "Избацив {num} станици\n" -#: voice.py:144 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "{num} нови другарчиња\n" -#: voice.py:145 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "Фатив {num} ракувања\n" -#: voice.py:147 +#: voice.py:128 msgid "Met 1 peer" msgstr "Запознав 1 пријател" -#: voice.py:149 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "Запознав {num} пријатели" -#: voice.py:154 +#: voice.py:135 #, python-brace-format msgid "" "I've been pwning for {duration} and kicked {deauthed} clients! I've also met " @@ -338,5 +243,5 @@ msgid "" "#pwnlog #pwnlife #hacktheplanet #skynet" msgstr "" "Си газам веќе {duration} и избацив {deauthed} клиенти! Запознав {associated} " -"нови другарчиња и лапнав {handshakes} ракувања! #pwnagotchi #pwnlog " -"#pwnlife #hacktheplanet #skynet" +"нови другарчиња и лапнав {handshakes} ракувања! #pwnagotchi #pwnlog #pwnlife " +"#hacktheplanet #skynet" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot index 671e44d..2d07413 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot @@ -1,39 +1,35 @@ -# pwnigotchi voice data -# Copyright (C) 2019 -# This file is distributed under the same license as the pwnagotchi package. -# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019. +# 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 , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 0.0.1\n" +"Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:42+0200\n" -"PO-Revision-Date: 2019-09-29 14:00+0200\n" -"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n" -"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" -"Language: english\n" +"POT-Creation-Date: 2019-10-03 12:22+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "" -#: voice.py:21 -msgid "" -"Hi, I'm Pwnagotchi!\n" -"Starting ..." -msgstr "" - #: voice.py:22 -msgid "" -"New day, new hunt,\n" -"new pwns!" +msgid "Hi, I'm Pwnagotchi! Starting ..." msgstr "" #: voice.py:23 +msgid "New day, new hunt, new pwns!" +msgstr "" + +#: voice.py:24 msgid "Hack the Planet!" msgstr "" @@ -42,244 +38,196 @@ msgid "AI ready." msgstr "" #: voice.py:29 -msgid "" -"The neural network\n" -"is ready." +msgid "The neural network is ready." msgstr "" -#: voice.py:39 +#: voice.py:37 #, python-brace-format -msgid "" -"Hey, channel {channel} is\n" -"free! Your AP will\n" -"say thanks." +msgid "Hey, channel {channel} is free! Your AP will say thanks." msgstr "" -#: voice.py:44 +#: voice.py:41 msgid "I'm bored ..." msgstr "" -#: voice.py:45 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "" -#: voice.py:49 -msgid "" -"This is the best\n" -"day of my life!" +#: voice.py:45 +msgid "This is the best day of my life!" msgstr "" -#: voice.py:53 +#: voice.py:48 msgid "Shitty day :/" msgstr "" -#: voice.py:58 +#: voice.py:52 msgid "I'm extremely bored ..." msgstr "" -#: voice.py:59 +#: voice.py:53 msgid "I'm very sad ..." msgstr "" -#: voice.py:60 +#: voice.py:54 msgid "I'm sad" msgstr "" -#: voice.py:66 +#: voice.py:59 msgid "I'm living the life!" msgstr "" -#: voice.py:67 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "" -#: voice.py:68 +#: voice.py:61 msgid "So many networks!!!" msgstr "" -#: voice.py:69 -msgid "" -"I'm having so much\n" -"fun!" +#: voice.py:62 +msgid "I'm having so much fun!" msgstr "" -#: voice.py:70 -msgid "" -"My crime is that of\n" -"curiosity ..." +#: voice.py:63 +msgid "My crime is that of curiosity ..." msgstr "" -#: voice.py:75 +#: voice.py:67 #, python-brace-format -msgid "" -"Hello\n" -"{name}!\n" -"Nice to meet you. {name}" +msgid "Hello {name}! Nice to meet you. {name}" msgstr "" -#: voice.py:76 +#: voice.py:68 #, python-brace-format -msgid "" -"Unit\n" -"{name}\n" -"is nearby! {name}" +msgid "Unit {name} is nearby! {name}" msgstr "" -#: voice.py:81 +#: voice.py:72 #, python-brace-format -msgid "" -"Uhm ...\n" -"goodbye\n" -"{name}" +msgid "Uhm ... goodbye {name}" msgstr "" -#: voice.py:82 +#: voice.py:73 #, python-brace-format -msgid "" -"{name}\n" -"is gone ..." +msgid "{name} is gone ..." msgstr "" -#: voice.py:87 +#: voice.py:77 #, python-brace-format -msgid "" -"Whoops ...\n" -"{name}\n" -"is gone." +msgid "Whoops ... {name} is gone." msgstr "" -#: voice.py:88 +#: voice.py:78 #, python-brace-format -msgid "" -"{name}\n" -"missed!" +msgid "{name} missed!" msgstr "" -#: voice.py:89 +#: voice.py:79 msgid "Missed!" msgstr "" -#: voice.py:94 -msgid "" -"Nobody wants to\n" -"play with me ..." +#: voice.py:83 +msgid "Nobody wants to play with me ..." msgstr "" -#: voice.py:95 +#: voice.py:84 msgid "I feel so alone ..." msgstr "" -#: voice.py:96 +#: voice.py:85 msgid "Where's everybody?!" msgstr "" -#: voice.py:101 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "" -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" -#: voice.py:112 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "" -#: voice.py:114 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "" +#: voice.py:106 +#, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "" + +#: voice.py:107 +#, python-brace-format +msgid "Associating to {what}" +msgstr "" + +#: voice.py:108 +#, python-brace-format +msgid "Yo {what}!" +msgstr "" + +#: voice.py:112 +#, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" +msgstr "" + +#: voice.py:113 +#, python-brace-format +msgid "Deauthenticating {mac}" +msgstr "" + +#: voice.py:114 +#, python-brace-format +msgid "Kickbanning {mac}!" +msgstr "" + +#: voice.py:118 +#, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" +msgstr "" + #: voice.py:121 -#, python-brace-format -msgid "" -"Hey\n" -"{what}\n" -"let's be friends!" +msgid "Ops, something went wrong ... Rebooting ..." msgstr "" -#: voice.py:122 -#, python-brace-format -msgid "" -"Associating to\n" -"{what}" -msgstr "" - -#: voice.py:123 -#, python-brace-format -msgid "" -"Yo\n" -"{what}!" -msgstr "" - -#: voice.py:128 -#, python-brace-format -msgid "" -"Just decided that\n" -"{mac}\n" -"needs no WiFi!" -msgstr "" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Deauthenticating\n" -"{mac}" -msgstr "" - -#: voice.py:130 -#, python-brace-format -msgid "" -"Kickbanning\n" -"{mac}!" -msgstr "" - -#: voice.py:135 -#, python-brace-format -msgid "" -"Cool, we got {num}\n" -"new handshake{plural}!" -msgstr "" - -#: voice.py:139 -msgid "" -"Ops, something\n" -"went wrong ...\n" -"Rebooting ..." -msgstr "" - -#: voice.py:143 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "" -#: voice.py:144 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "" -#: voice.py:145 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "" -#: voice.py:147 +#: voice.py:128 msgid "Met 1 peer" msgstr "" -#: voice.py:149 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "" -#: voice.py:154 +#: voice.py:135 #, python-brace-format msgid "" "I've been pwning for {duration} and kicked {deauthed} clients! I've also met " From 49c77b7e90f62672f9040416491a6b1f2a843b1a Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Thu, 3 Oct 2019 11:43:41 +0100 Subject: [PATCH 52/62] change .travis.yml configuration --- .travis.yml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48f29dc..bf4cf07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,21 @@ env: - LANG=C - LC_ALL=C +deploy: + provider: releases + api_key: + secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8=" + skip_cleanup: true + file_glob: true + file: pwnagotchi-*.zip + on: + tags: true + repo: evilsocket/pwnagotchi + +branches: + only: + - /^v[0-9]+\.[0-9]+\.[0-9]+$/ + before_cache: - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete @@ -34,14 +49,3 @@ before_deploy: - git config --local user.email "evilsocket@gmail.com" - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)} - git tag $TRAVIS_TAG - -deploy: - provider: releases - api_key: - secure: "vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8=" - skip_cleanup: true - file_glob: true - file: pwnagotchi-*.zip - on: - repo: evilsocket/pwnagotchi - all_branches: true From af2e4b42246f1d17d08515f80a6f1a93efa0a39d Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 12:46:03 +0200 Subject: [PATCH 53/62] Fix de and update other langs --- .../pwnagotchi/locale/mk/LC_MESSAGES/voice.po | 2 +- .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po | 347 +++++++----------- .../scripts/pwnagotchi/locale/voice.pot | 2 +- 3 files changed, 125 insertions(+), 226 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po index a0d7911..f2fe8fc 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/mk/LC_MESSAGES/voice.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-03 12:22+0200\n" +"POT-Creation-Date: 2019-10-03 12:44+0200\n" "PO-Revision-Date: 2019-09-30 23:53+0200\n" "Last-Translator: kovach <2214005+kovachwt@users.noreply.github.com>\n" "Language-Team: \n" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po index e027a8b..a9ed2e4 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-29 13:42+0200\n" +"POT-Creation-Date: 2019-10-03 12:44+0200\n" "PO-Revision-Date: 2019-09-29 14:00+0200\n" "Last-Translator: Justin-P \n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" @@ -17,29 +17,21 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: voice.py:16 +#: voice.py:18 msgid "ZzzzZZzzzzZzzz" msgstr "ZzzzZZzzzzZzzz" -#: voice.py:21 -msgid "" -"Hi, I'm Pwnagotchi!" -"Starting ..." -msgstr "" -"Hoi, Ik ben" -"Pwnagotchi!" -"Opstarten ..." - #: voice.py:22 -msgid "" -"New day, new hunt," -"new pwns!" -msgstr "" -"Nieuwe dag," -"nieuwe jacht," -"nieuwe pwns!" +#, fuzzy +msgid "Hi, I'm Pwnagotchi! Starting ..." +msgstr "Hoi, Ik benPwnagotchi!Opstarten ..." #: voice.py:23 +#, fuzzy +msgid "New day, new hunt, new pwns!" +msgstr "Nieuwe dag,nieuwe jacht,nieuwe pwns!" + +#: voice.py:24 msgid "Hack the Planet!" msgstr "Hack de Wereld!" @@ -48,301 +40,208 @@ msgid "AI ready." msgstr "AI is klaar." #: voice.py:29 -msgid "" -"The neural network" -"is ready." -msgstr "" -"Neuronen netwerk" -"is klaar voor gebruik." +#, fuzzy +msgid "The neural network is ready." +msgstr "Neuronen netwerkis klaar voor gebruik." -#: voice.py:39 -#, python-brace-format -msgid "" -"Hey, channel {channel} is" -"free! Your AP will" -"say thanks." -msgstr "" -"Hey, kanaal {channel} is" -"vrij! Je AP zal je" -"bedanken." +#: voice.py:37 +#, fuzzy, python-brace-format +msgid "Hey, channel {channel} is free! Your AP will say thanks." +msgstr "Hey, kanaal {channel} isvrij! Je AP zal jebedanken." -#: voice.py:44 +#: voice.py:41 msgid "I'm bored ..." msgstr "Ik verveel me ..." -#: voice.py:45 +#: voice.py:42 msgid "Let's go for a walk!" msgstr "Laten we een rondje lopen!" -#: voice.py:49 -msgid "" -"This is the best" -"day of my life!" -msgstr "" -"Dit is de beste" -"dag van mijn leven!" +#: voice.py:45 +#, fuzzy +msgid "This is the best day of my life!" +msgstr "Dit is de bestedag van mijn leven!" -#: voice.py:53 +#: voice.py:48 msgid "Shitty day :/" msgstr "Ruk dag :/" -#: voice.py:58 +#: voice.py:52 msgid "I'm extremely bored ..." -msgstr "Ik verveel me " -"kapot ..." +msgstr "Ik verveel me kapot ..." -#: voice.py:59 +#: voice.py:53 msgid "I'm very sad ..." -msgstr "Ik ben erg" -"verdrietig ..." +msgstr "Ik ben ergverdrietig ..." -#: voice.py:60 +#: voice.py:54 msgid "I'm sad" msgstr "Ik ben verdrietig" -#: voice.py:66 +#: voice.py:59 msgid "I'm living the life!" -msgstr "Beter kan het leven" -"niet worden!" +msgstr "Beter kan het levenniet worden!" -#: voice.py:67 +#: voice.py:60 msgid "I pwn therefore I am." msgstr "Ik pwn daarom besta ik." -#: voice.py:68 +#: voice.py:61 msgid "So many networks!!!" msgstr "Zo veel netwerken!!!" -#: voice.py:69 -msgid "" -"I'm having so much" -"fun!" +#: voice.py:62 +#, fuzzy +msgid "I'm having so much fun!" msgstr "Dit is zo leuk!" -#: voice.py:70 -msgid "" -"My crime is that of" -"curiosity ..." -msgstr "" -"Mijn enige misdrijf" -"is mijn " -"nieuwsgierigheid ..." +#: voice.py:63 +#, fuzzy +msgid "My crime is that of curiosity ..." +msgstr "Mijn enige misdrijfis mijn nieuwsgierigheid ..." -#: voice.py:75 -#, python-brace-format -msgid "" -"Hello" -"{name}!" -"Nice to meet you. {name}" -msgstr "" -"Hallo" -"{name}!" -"Leuk je te ontmoeten. {name}" +#: voice.py:67 +#, fuzzy, python-brace-format +msgid "Hello {name}! Nice to meet you. {name}" +msgstr "Hallo{name}!Leuk je te ontmoeten. {name}" -#: voice.py:76 -#, python-brace-format -msgid "" -"Unit" -"{name}" -"is nearby! {name}" -msgstr "" -"Unit" -"{name}" -"is dichtbij! {name}" +#: voice.py:68 +#, fuzzy, python-brace-format +msgid "Unit {name} is nearby! {name}" +msgstr "Unit{name}is dichtbij! {name}" -#: voice.py:81 -#, python-brace-format -msgid "" -"Uhm ..." -"goodbye" -"{name}" -msgstr "" -"Uhm ..." -"tot ziens" -"{name}" +#: voice.py:72 +#, fuzzy, python-brace-format +msgid "Uhm ... goodbye {name}" +msgstr "Uhm ...tot ziens{name}" -#: voice.py:82 -#, python-brace-format -msgid "" -"{name}" -"is gone ..." -msgstr "" -"{name}" -"is weg" +#: voice.py:73 +#, fuzzy, python-brace-format +msgid "{name} is gone ..." +msgstr "{name}is weg" -#: voice.py:87 -#, python-brace-format -msgid "" -"Whoops ..." -"{name}" -"is gone." -msgstr "" -"Whoopsie ..." -"{name}" -"is weg" +#: voice.py:77 +#, fuzzy, python-brace-format +msgid "Whoops ... {name} is gone." +msgstr "Whoopsie ...{name}is weg" -#: voice.py:88 -#, python-brace-format -msgid "" -"{name}" -"missed!" -msgstr "" -"{name}" -"gemist!" +#: voice.py:78 +#, fuzzy, python-brace-format +msgid "{name} missed!" +msgstr "{name}gemist!" -#: voice.py:89 +#: voice.py:79 msgid "Missed!" msgstr "Gemist!" -#: voice.py:94 -msgid "" -"Nobody wants to" -"play with me ..." -msgstr "" -"Niemand wil met" -"mij spelen ..." +#: voice.py:83 +#, fuzzy +msgid "Nobody wants to play with me ..." +msgstr "Niemand wil metmij spelen ..." -#: voice.py:95 +#: voice.py:84 msgid "I feel so alone ..." msgstr "Zo alleen ..." -#: voice.py:96 +#: voice.py:85 msgid "Where's everybody?!" msgstr "Waar is iedereen?!" -#: voice.py:101 +#: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." msgstr "Dutje doen voor {secs}s ..." -#: voice.py:102 +#: voice.py:90 msgid "Zzzzz" msgstr "Zzzzz" -#: voice.py:103 +#: voice.py:91 #, python-brace-format msgid "ZzzZzzz ({secs}s)" msgstr "" -#: voice.py:112 +#: voice.py:98 #, python-brace-format msgid "Waiting for {secs}s ..." msgstr "Even {secs}s wachten ..." -#: voice.py:114 +#: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" msgstr "Rond kijken ({secs}s)" +#: voice.py:106 +#, fuzzy, python-brace-format +msgid "Hey {what} let's be friends!" +msgstr "Hey{what}Laten we vriendenworden!" + +#: voice.py:107 +#, fuzzy, python-brace-format +msgid "Associating to {what}" +msgstr "Verbinden met{what}" + +#: voice.py:108 +#, python-brace-format +msgid "Yo {what}!" +msgstr "" + +#: voice.py:112 +#, fuzzy, python-brace-format +msgid "Just decided that {mac} needs no WiFi!" +msgstr "Ik vind dat{mac}genoeg WiFiheeft gehad!" + +#: voice.py:113 +#, fuzzy, python-brace-format +msgid "Deauthenticating {mac}" +msgstr "De-autoriseren{mac}" + +#: voice.py:114 +#, fuzzy, python-brace-format +msgid "Kickbanning {mac}!" +msgstr "Ik ga{mac}even kicken!" + +#: voice.py:118 +#, fuzzy, python-brace-format +msgid "Cool, we got {num} new handshake{plural}!" +msgstr "Gaaf, we hebben {num}nieuwe handshake{plural}!" + #: voice.py:121 -#, python-brace-format -msgid "" -"Hey" -"{what}" -"let's be friends!" -msgstr "" -"Hey" -"{what}" -"Laten we vrienden" -"worden!" +#, fuzzy +msgid "Ops, something went wrong ... Rebooting ..." +msgstr "Oops, ietsging fout ...Rebooting ..." -#: voice.py:122 -#, python-brace-format -msgid "" -"Associating to" -"{what}" -msgstr "" -"Verbinden met" -"{what}" - -#: voice.py:123 -#, python-brace-format -msgid "" -"Yo" -"{what}!" -msgstr "" - - -#: voice.py:128 -#, python-brace-format -msgid "" -"Just decided that" -"{mac}" -"needs no WiFi!" -msgstr "Ik vind dat" -"{mac}" -"genoeg WiFi" -"heeft gehad!" - -#: voice.py:129 -#, python-brace-format -msgid "" -"Deauthenticating" -"{mac}" -msgstr "" -"De-autoriseren" -"{mac}" - -#: voice.py:130 -#, python-brace-format -msgid "" -"Kickbanning" -"{mac}!" -msgstr "" -"Ik ga" -"{mac}" -"even kicken!" - -#: voice.py:135 -#, python-brace-format -msgid "" -"Cool, we got {num}" -"new handshake{plural}!" -msgstr "" -"Gaaf, we hebben {num}" -"nieuwe handshake{plural}!" - -#: voice.py:139 -msgid "" -"Ops, something" -"went wrong ..." -"Rebooting ..." -msgstr "" -"Oops, iets" -"ging fout ..." -"Rebooting ..." - -#: voice.py:143 +#: voice.py:124 #, python-brace-format msgid "Kicked {num} stations\n" msgstr "{num} stations gekicked\n" -#: voice.py:144 +#: voice.py:125 #, python-brace-format msgid "Made {num} new friends\n" msgstr "{num} nieuwe vrienden\n" -#: voice.py:145 +#: voice.py:126 #, python-brace-format msgid "Got {num} handshakes\n" msgstr "{num} nieuwe handshakes\n" -#: voice.py:147 +#: voice.py:128 msgid "Met 1 peer" msgstr "1 peer ontmoet" -#: voice.py:149 +#: voice.py:130 #, python-brace-format msgid "Met {num} peers" msgstr "{num} peers ontmoet" -#: voice.py:154 +#: voice.py:135 #, 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 "" -"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb ook " -"{associated} nieuwe vrienden gevonden en heb {handshakes} handshakes gegeten! " -"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet" \ No newline at end of file +"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb " +"ook {associated} nieuwe vrienden gevonden en heb {handshakes} handshakes " +"gegeten! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot index 2d07413..5ae228a 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-03 12:22+0200\n" +"POT-Creation-Date: 2019-10-03 12:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 78131380634899807c9b33e77e2fdbbafb6904f4 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 12:50:55 +0200 Subject: [PATCH 54/62] new: if ui.fps is set to 0, the display will only be updated for major data changes --- sdcard/rootfs/root/pwnagotchi/config.yml | 5 +++- .../pwnagotchi/scripts/pwnagotchi/agent.py | 6 ++--- .../pwnagotchi/scripts/pwnagotchi/ui/state.py | 25 ++++++++++++++++-- .../pwnagotchi/scripts/pwnagotchi/ui/view.py | 26 ++++++++++++------- 4 files changed, 47 insertions(+), 15 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml index 7cf1c6f..cc2ea20 100644 --- a/sdcard/rootfs/root/pwnagotchi/config.yml +++ b/sdcard/rootfs/root/pwnagotchi/config.yml @@ -91,7 +91,10 @@ personality: # ui configuration ui: - # ePaper display can update every 3 secs anyway + # ePaper display can update every 3 secs anyway, set to 0 to only refresh for major data changes + # IMPORTANT: The lifespan of an eINK display depends on the cumulative amount of refreshes. If you want to + # preserve your display over time, you should set this value to 0.0 so that the display will be refreshed only + # if any of the important data fields changed (the uptime and blinking cursor won't trigger a refresh). fps: 0.3 display: enabled: true diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py index 739d6ed..9dcb7fb 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/agent.py @@ -347,13 +347,13 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer): if key not in self._handshakes: self._handshakes[key] = h new_shakes += 1 - apsta = self._find_ap_sta_in(sta_mac, ap_mac, s) - if apsta is None: + ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s) + if ap_and_station is None: core.log("!!! captured new handshake: %s !!!" % key) self._last_pwnd = ap_mac plugins.on('handshake', self, filename, ap_mac, sta_mac) else: - (ap, sta) = apsta + (ap, sta) = ap_and_station self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[ 'hostname'] != '' else ap_mac core.log("!!! captured new handshake on channel %d: %s (%s) -> %s [%s (%s)] !!!" % ( \ diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py index c5b66be..0a9e37a 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/state.py @@ -6,9 +6,11 @@ class State(object): self._state = state self._lock = Lock() self._listeners = {} + self._changes = {} def add_element(self, key, elem): self._state[key] = elem + self._changes[key] = True def add_listener(self, key, cb): with self._lock: @@ -22,10 +24,29 @@ class State(object): with self._lock: return self._state[key].value if key in self._state else None + def reset(self): + with self._lock: + self._changes = {} + + def changes(self, ignore=()): + with self._lock: + changes = [] + for change in self._changes.keys(): + if change not in ignore: + changes.append(change) + return changes + + def has_changes(self): + with self._lock: + return len(self._changes) > 0 + def set(self, key, value): with self._lock: if key in self._state: prev = self._state[key].value self._state[key].value = value - if key in self._listeners and self._listeners[key] is not None and prev != value: - self._listeners[key](prev, value) + + if prev != value: + self._changes[key] = True + if key in self._listeners and self._listeners[key] is not None: + self._listeners[key](prev, value) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py index 82c52ad..0c5eb8a 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/ui/view.py @@ -78,7 +78,6 @@ class View(object): label_font=fonts.Bold, text_font=fonts.Medium), - 'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK), 'line2': Line( [0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)], @@ -111,7 +110,12 @@ class View(object): plugins.on('ui_setup', self) - _thread.start_new_thread(self._refresh_handler, ()) + if config['ui']['fps'] > 0.0: + _thread.start_new_thread(self._refresh_handler, ()) + self._ignore_changes = () + else: + core.log("ui.fps is 0, the display will only update for major changes") + self._ignore_changes = ('uptime', 'name') def add_element(self, key, elem): self._state.add_element(key, elem) @@ -311,13 +315,17 @@ class View(object): def update(self): with self._lock: - self._canvas = Image.new('1', (self._width, self._height), WHITE) - drawer = ImageDraw.Draw(self._canvas) + changes = self._state.changes(ignore=self._ignore_changes) + if len(changes): + self._canvas = Image.new('1', (self._width, self._height), WHITE) + drawer = ImageDraw.Draw(self._canvas) - plugins.on('ui_update', self) + plugins.on('ui_update', self) - for key, lv in self._state.items(): - lv.draw(self._canvas, drawer) + for key, lv in self._state.items(): + lv.draw(self._canvas, drawer) - for cb in self._render_cbs: - cb(self._canvas) + for cb in self._render_cbs: + cb(self._canvas) + + self._state.reset() From 54ddbab95192a8db220ac289e466b7d3b3976ff8 Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 12:55:18 +0200 Subject: [PATCH 55/62] Add qemu 4.1 --- .travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf4cf07..d48b5ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,18 +24,20 @@ branches: only: - /^v[0-9]+\.[0-9]+\.[0-9]+$/ -before_cache: - - mountpoint -q $TRAVIS_BUILD_DIR/tmp/mnt && sudo umount -R $TRAVIS_BUILD_DIR/tmp/mnt - - sudo find $TRAVIS_BUILD_DIR/tmp/ -name '*.img' -delete - cache: apt: true directories: - - tmp/ + - qemu-4.1.0 before_script: + - test -d qemu-4.1.0 || ( wget https://download.qemu.org/qemu-4.1.0.tar.xz && tar xvJf qemu-4.1.0.tar.xz ) + - cd qemu-4.1.0 + - ./configure --target-list=arm-softmmu + - make -j$(nproc) + - sudo make install + - cd $TRAVIS_BUILD_DIR - sudo apt-get -y update - - sudo apt-get -y install qemu-user-static binfmt-support qemu bmap-tools kpartx + - sudo apt-get -y install qemu-user-static binfmt-support bmap-tools kpartx - sudo update-binfmts --display script: From a1442e05408172787e89296bbc36990443872a50 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Thu, 3 Oct 2019 11:59:59 +0100 Subject: [PATCH 56/62] add display information to README --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7f23677..002d736 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,22 @@ The supported models are: - [Pimoroni Inky pHAT](https://shop.pimoroni.com/products/inky-phat) - [PaPiRus eInk Screen](https://uk.pi-supply.com/products/papirus-zero-epaper-screen-phat-pi-zero) +The only kind of displays supported are the ones listed above, but we are always happy to receive pull requests supporting new displays. + +One thing to note, not all displays are created equaly, TFT displays for example work similar to an HDMI display, and they are not supported, currently all the displays supported are I2C displays. + +### Color and Black & White displays + +Some of the supported displays support Black & White and Coloured versions, one common question is regarding refresh speed of said displays. + +Color displays have a much slower refresh rate, in some cases it can take up to 15 seconds, if slow refresh rates is something that you want to avoid we advise you to use Black & White displays + +### FPS + +You can configure the refresh interval of the display on config.yml, we advise to use a slow refresh to not shorten the lifetime of your display. + +Another option is to change fps to 0, which will only refresh when changes are made to the screen. + ### Software - Raspbian + [nexmon patches](https://re4son-kernel.com/re4son-pi-kernel/) for monitor mode, or any Linux with a monitor mode enabled interface (if you tune config.yml). @@ -152,8 +168,8 @@ Now you can use the `preview.py`-script to preview the changes: ### Plugins Pwnagotchi has a simple plugins system that you can use to customize your unit and its behaviour. You can place your plugins anywhere -as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default -plugins and all the callbacks that you can define for your own customizations. +as python files and then edit the `config.yml` file (`main.plugins` value) to point to their containing folder. Check the [plugins folder](https://github.com/evilsocket/pwnagotchi/tree/master/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/) for a list of default +plugins and all the callbacks that you can define for your own customizations. Here's as an example the GPS plugin: From d4a45f1b4391ffcefed8e923257660c868043e97 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 13:03:10 +0200 Subject: [PATCH 57/62] release script --- scripts/release.sh | 28 +++++++++++++++++++ .../pwnagotchi/scripts/pwnagotchi/__init__.py | 2 -- .../pwnagotchi/scripts/pwnagotchi/version.py | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100755 scripts/release.sh create mode 100644 sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 0000000..d5d34b3 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# nothing to see here, just a utility i use to create new releases ^_^ + +VERSION_FILE=$(dirname "${BASH_SOURCE[0]}")/../sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py +echo "version file is $VERSION_FILE" +CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d '"' -f 2) +TO_UPDATE=( + $VERSION_FILE +) + +echo -n "current version is $CURRENT_VERSION, select new version: " +read NEW_VERSION +echo "creating version $NEW_VERSION ...\n" + +for file in "${TO_UPDATE[@]}" +do + echo "patching $file ..." + sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" $file + git add $file +done + +git commit -m "releasing v$NEW_VERSION" +git push +git tag -a v$NEW_VERSION -m "release v$NEW_VERSION" +git push origin v$NEW_VERSION + +echo +echo "All done, v$NEW_VERSION released ^_^" diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py index ff43494..dacb09c 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/__init__.py @@ -1,7 +1,5 @@ import subprocess -version = '1.0.0a' - _name = None diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py new file mode 100644 index 0000000..022e5cc --- /dev/null +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py @@ -0,0 +1 @@ +version = '1.0.0a' From 5a067aaaee1abc8e90891ed6f3290ae4562597d5 Mon Sep 17 00:00:00 2001 From: Cassiano Aquino Date: Thu, 3 Oct 2019 12:09:56 +0100 Subject: [PATCH 58/62] Extende version tags to support RC and other names This PR extends the version tag on travis to allow RC and other builds --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d48b5ec..fcaee05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ deploy: branches: only: - - /^v[0-9]+\.[0-9]+\.[0-9]+$/ + - /^v[0-9]+\.[0-9]+\.[0-9]+[A-Za-z0-9]+?$/ cache: apt: true From 664b2407ebc1b8d8231f3890af3b26394fe708d4 Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 13:18:15 +0200 Subject: [PATCH 59/62] Fix italian --- .../pwnagotchi/locale/it/LC_MESSAGES/voice.mo | Bin 2021 -> 3679 bytes .../pwnagotchi/locale/it/LC_MESSAGES/voice.po | 148 +++++------------- .../scripts/pwnagotchi/locale/voice.pot | 2 +- 3 files changed, 40 insertions(+), 110 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.mo index 0dca8ac1b61291b4b6db73cdd11f27f489e22303..be9d4b19c95c5d6754d793353e8f3454c26e3c9e 100644 GIT binary patch literal 3679 zcmb`JON=8&8GxG*9x;zRcm%>D)l9-~E~4oJBnfk22O7f=r5g!uk)+un)xNNYV`KdS!s z|JVNYzB^xvxX$wXBERedQS=ym>kj^Kz52l@x(mJrKLg)@XW;Ma=Xc>(dA{q;+5R@X z#Pc3h@W=2|@D(Wge*-@O-+}kTzt#K?{4~#Ze<+GR0w03+z%}?Ld>o3N_uzf-!4F5# zXW<1X`*z^x;18h49m59v8N3_*9E#ju)Zc#v70-Ww=ion~*mXaP#NLOY#N#ql@Hr^@ z#_&tw!8>pQQ==95dDw!Y|0*P$L8tgj`Goj90>xj&PvXI{P#0p${1SO$ zi(FD;5Al;4AvKFjd>6YYi*QL!=9lQF3?oWETxa?F1%BeE#8T`RTjdg;B<_?!$QNmh z>edSNEHRfjy#FG6;gT8&*XE8Yj7}%5Xw!R_SY6t@t4gPi$30z6qb=vMH8nP>>q>Q; zSA(g_%~KJuYSc8^WKCY<*skzD2aeXsY*0aQzSlx70p*Hu`*k+mXdZJ3!_I)e5 zYS+}x>Ok#}bB+B;&&KMY)J5>I)oMjM>c}9|JEb$18#Q}39OsBIg*kGCQ9DWxSc#Yp zkLhd;Pv%EuVFo6fyzhNak0gZ198^h99aVW8c4s!cN3hE5k(s^pIt?F3rkG&*T>8im z0Fx^$5n0%wj#J`XT9;21u~&VY^fBf*HM&A%I#o$VxJn=6G23+}1`y?AUFTKSNb2ga z1}VBU>Uf#1=`yd#SwVXpws4=h?u=NkR(d+=qj;F<94#xpKY`JADqpJ9BsRr3(t!Sf zPDHUuy~>@sVZUwT=(||oA)n%0STK7f4uul)WpI`H*$vgubs+{?jdj+Kqh06vvQ-zZ zA{LJvdz1L7KNIcg6o(d7TD#ha_Aqf>4UH+n?QDfS`e@I3Z_+rrria5ttY`8{xL~V|DMYD$HK?P#U$`Hdq-^e_&F9DhWxb)=t#)g@aor4EQ8xE{*QU)UtFCVz zx((IXf4X_yjI69|Zd0}!>Oy<{a&x`iY+q38k8WIOpKEh9c6HvZbk{TwjUH@B1IJ6*%V9! zUon@rq+guXp~wy#6NbKEE(bY`!CXEP&bdHtQ=BPCUg}gyS5uL8;Nqpaksa|EWR->W zrJ3CiT*l_v8cAAKmeb%Fd}iN}Q#^bqOi7>ZYKA|j^z2M9VMRSIo~ekglQ;CCv^!@)CZ+|+{J%@9 z0gW*tdz>tBG(Q}4nqtLlAg{4R4k5B$Xe*ZOuF7d~@^ZaE#E+=KTrbXxO+PdxitAH1 r_%jQuv|m}3r9E|0)T7_y#Ofk2w>vLRuLyGMy=?Q0<{^_c%z*y^KdkZI delta 721 zcmZ9}O=}ZD7{Kv~rcE+U>`ROh40iNTv4kxYuO5m8Uk)A=!Hb90Ea_6+i96XtC?#K@ zco|yM4`2{H=}m;5^x)Nc5m6NS4MfG0|7Q~~4orSCyR-AWvOj_!>ue0`DHp&kfap#Ys7c za={2S?&B=JN4eeVB2hjNylx3n~~H0S@D*yPaXQz>BqiVI_qDQ+OJHx zQE2{u)b!HG#oAxe>opxFiH*a)H9-*gm-?6gJ+s`_z0kR++vP=gMy*?uCDyoZ7N#Am vA7-(MlfF$8%QxCzuU;!?|D?Lu(7o8%`!Q#GQEIkabkA)&f2tPv&$Xq$#|vhF diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po index 0123244..7ef4d8d 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/it/LC_MESSAGES/voice.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-03 12:22+0200\n" +"POT-Creation-Date: 2019-10-03 13:10+0200\n" "PO-Revision-Date: 2019-10-02 17:20+0000\n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" "Language: italian\n" @@ -20,19 +20,13 @@ msgid "ZzzzZZzzzzZzzz" msgstr "" #: voice.py:22 -#, fuzzy msgid "Hi, I'm Pwnagotchi! Starting ..." -msgstr "" -"Ciao!\n" -"Piacere Pwnagotchi!\n" -"Caricamento ..." +msgstr "Ciao! Piacere Pwnagotchi! Caricamento ..." #: voice.py:23 #, fuzzy msgid "New day, new hunt, new pwns!" -msgstr "" -"Nuovo giorno...\n" -"nuovi handshakes!!!" +msgstr "Nuovo giorno...nuovi handshakes!!!" #: voice.py:24 msgid "Hack the Planet!" @@ -43,19 +37,13 @@ msgid "AI ready." msgstr "IA pronta." #: voice.py:29 -#, fuzzy msgid "The neural network is ready." -msgstr "" -"La rete neurale\n" -"è pronta." +msgstr "La rete neurale è pronta." #: voice.py:37 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hey, channel {channel} is free! Your AP will say thanks." -msgstr "" -"Hey, il canale {channel} è\n" -"libero! Il tuo AP\n" -"ringrazia." +msgstr "Hey, il canale {channel} è libero! Il tuo AP ringrazia." #: voice.py:41 msgid "I'm bored ..." @@ -64,16 +52,11 @@ msgstr "Che noia ..." #: voice.py:42 msgid "Let's go for a walk!" msgstr "" -"Andiamo a fare una\n" -"passeggiata!" +"Andiamo a fare una passeggiata!" #: voice.py:45 -#, fuzzy msgid "This is the best day of my life!" -msgstr "" -"Questo è il più bel\n" -"giorno della mia\n" -"vita!!!!" +msgstr "Questo è il più bel giorno della mia vita!!!!" #: voice.py:48 msgid "Shitty day :/" @@ -81,9 +64,7 @@ msgstr "Giorno di merda :/" #: voice.py:52 msgid "I'm extremely bored ..." -msgstr "" -"Sono estremamente\n" -"annoiato ..." +msgstr "Sono estremamente annoiato ..." #: voice.py:53 msgid "I'm very sad ..." @@ -106,75 +87,50 @@ msgid "So many networks!!!" msgstr "Qui è pieno di reti!" #: voice.py:62 -#, fuzzy msgid "I'm having so much fun!" -msgstr "" -"Mi sto divertendo\n" -"tantissimo!" +msgstr "Mi sto divertendo tantissimo!" #: voice.py:63 msgid "My crime is that of curiosity ..." msgstr "" #: voice.py:67 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hello {name}! Nice to meet you. {name}" -msgstr "" -"Ciao\n" -"{name}!\n" -"E' un piacere. {name}" +msgstr "Ciao {name}! E' un piacere. {name}" #: voice.py:68 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unit {name} is nearby! {name}" -msgstr "" -"L'Unità\n" -"{name}\n" -"è vicina! {name}" +msgstr "L'Unità {name} è vicina! {name}" #: voice.py:72 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Uhm ... goodbye {name}" -msgstr "" -"Uhm ...\n" -"addio\n" -"{name},\n" -"mi mancherai..." +msgstr "Uhm ... addio {name}, mi mancherai..." #: voice.py:73 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} is gone ..." -msgstr "" -"{name}\n" -"se n'è andato ..." +msgstr "{name} se n'è andato ..." #: voice.py:77 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Whoops ... {name} is gone." -msgstr "" -"Whoops ...\n" -"{name}\n" -"se n'è andato." +msgstr "Whoops ...{name} se n'è andato." #: voice.py:78 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} missed!" -msgstr "" -"{name}\n" -"è scomparso..." +msgstr "{name} è scomparso..." #: voice.py:79 msgid "Missed!" -msgstr "" -"Ehi!\n" -"Dove sei andato!?" +msgstr "Ehi! Dove sei andato!?" #: voice.py:83 -#, fuzzy msgid "Nobody wants to play with me ..." -msgstr "" -"Nessuno vuole\n" -"giocare con me..." +msgstr "Nessuno vuole giocare con me..." #: voice.py:84 msgid "I feel so alone ..." @@ -187,9 +143,7 @@ msgstr "Dove sono tutti?!" #: voice.py:89 #, python-brace-format msgid "Napping for {secs}s ..." -msgstr "" -"Schiaccio un \n" -"pisolino per {secs}s ..." +msgstr "Schiaccio un pisolino per {secs}s ..." #: voice.py:90 msgid "Zzzzz" @@ -208,42 +162,27 @@ msgstr "Aspetto {secs}s ..." #: voice.py:100 #, python-brace-format msgid "Looking around ({secs}s)" -msgstr "" -"Do uno sguardo\n" -"qui intorno...\n" -"({secs}s)" +msgstr "Do uno sguardo qui intorno... ({secs}s)" #: voice.py:106 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hey {what} let's be friends!" -msgstr "" -"Hey\n" -"{what}\n" -"Diventiamo amici!" +msgstr "Hey {what}! Diventiamo amici!" #: voice.py:107 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Associating to {what}" -msgstr "" -"Collegamento con\n" -"{what}\n" -"in corso..." +msgstr "Collegamento con {what} in corso..." #: voice.py:108 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Yo {what}!" -msgstr "" -"Yo\n" -"{what}!" +msgstr "Yo {what}!" #: voice.py:112 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Just decided that {mac} needs no WiFi!" -msgstr "" -"Ho appena deciso che\n" -"{mac}\n" -"non necessita di\n" -"WiFi!" +msgstr "Ho appena deciso che {mac} non necessita di WiFi!" #: voice.py:113 #, python-brace-format @@ -251,27 +190,18 @@ msgid "Deauthenticating {mac}" msgstr "" #: voice.py:114 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Kickbanning {mac}!" -msgstr "" -"Sto prendendo\n" -"a calci\n" -"{mac}!" +msgstr "Sto prendendo a calci {mac}!" #: voice.py:118 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cool, we got {num} new handshake{plural}!" -msgstr "" -"Bene, abbiamo {num}\n" -"handshake{plural} in più!" +msgstr "Bene, abbiamo {num} handshake{plural} in più!" #: voice.py:121 -#, fuzzy msgid "Ops, something went wrong ... Rebooting ..." -msgstr "" -"Ops, qualcosa\n" -"è andato storto ...\n" -"Riavvio ..." +msgstr "Ops, qualcosa è andato storto ... Riavvio ..." #: voice.py:124 #, python-brace-format diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot index 5ae228a..53f3557 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/voice.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-03 12:44+0200\n" +"POT-Creation-Date: 2019-10-03 13:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 176889eb46427fea8e078767879f20ede654de21 Mon Sep 17 00:00:00 2001 From: dadav <33197631+dadav@users.noreply.github.com> Date: Thu, 3 Oct 2019 13:22:27 +0200 Subject: [PATCH 60/62] Fix nl --- .../pwnagotchi/locale/nl/LC_MESSAGES/voice.mo | Bin 3947 -> 3875 bytes .../pwnagotchi/locale/nl/LC_MESSAGES/voice.po | 70 ++++++++---------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.mo index 3261c2e92496174303bad5f44f30b8d89b7a9a85..b4db747197b3123cda75e98a56305f862afe0370 100644 GIT binary patch delta 1651 zcmY+@UuYav6vy$Ky2)-f%_dD_^S9~QTAMamSCqE+7flgNinO&-tDp~)?9J|^yEArY z+I1Vk>We}ZDvVJ?g`%a1QXeW+6nv}Vi&F4GkRsSVD2QMm^g)ICJ(EeWm&|$1TQm;&r?g|G}NOA!W=aydQP_5cXmP zw__7^zcY9beu;vA;YJ*2kMC=lNhaMaOyK|?NGxMNpIey5*HItv4t{~>Q6E(4Fs2Vr zqZafY>V2Q%Aby9s?=P6e8`y(cHcgwBF~dysf~}|(--m)na1x(KE$}RAh+J~Fj~yv3rOweH1_d)vz+|n1KdmepW%Ae|0Z|sBu&|O;wb9p z$51TW$-69QbeB*ozKRrY zGTf~lZ$!Or2i}GUPzw)G3w{N)ppQ_$3zu*Re?b1sbxs<&cFESJ19iQ>hx|!A9$PtU ze7e!<&`mU|)uF}c&|-B19h%%^JfmRL0`>Lj;KvdtG8TVYX-*T=bTqL$^!@XiSE|E2 zhYpgC$Bx7a)XsE_a|j1tQx-j^W|#63eV7_;$zr48giBJj;dmgk zR_5!j^-4kBOxtEb<|>Zo*{UoilO=HjF0nQ*Py5H~GIdZIZnY|b)0B{Fj|N3E?G|Ka zye0=5o>TV2xr&>YCqkzlS5zz(&5X=j_6&S+qKDg$P}iI7H`20LbLN&Ldb?wom5UuO zN6)4wM#QrXd9LA6(0+f`FEyp%cwrECb|$^0R~ps}rBV0kmc1qVHoceIdoshjq(o8v zywsXfb?0r~9In*jYs$V~nr+%72y@tT!(=YeQ<>?^+J|$QZT;GC+4rp8X;z|>=t}1I zbzU{P+<9U!3D7+1IP(Rnk&2z2wVp(;Wj96j>>$OQ%I^AK>R)9go7_~8Y9w7l(Y5Tr z9yw8W7xJ>tYNjWhsw`MuM~O(SN2b1pdXyFKrd&VS-?iMf7TvGwH?PgJ-ET$TcaQgo z=i1|xwcyNE!h%HU+-^#GAa{)O`5gVN^mKCyS96Eb+IYj3qmMJA1Ic`~|FW&QL6|rH E0hSOFasU7T delta 1779 zcmYk5U1%It7=};mCYz?&jg3v)jWIbJqZ{qIk=RO$B51)THK{=?#h+4UcfXxE$wYfr2SXHG%#?TjxTf5MQ{sM==A!Nn*B#0&T z1c>LOjt@b9O1y*x_*ADsD4)uF0Hg}r8;vm_HjU1ogl{8*{s1~{Fc47W!^oP;YmTc`9E3C$j6|JeGzTYhCShVd&dev*WYsplmlq_UsCssYn zm9^ptQxhHe+7*d(+iz8Hj2p>jW^|zuh!pipek;&VFX`Aco1xX#kz;u)VMWbJyW^%Q zQ7P0_(T%`}R}YJ7&Xo0h$<<4-XTf#NF~ww{*H6y%{@c6iTD7(0eBWqtweON%Z0lNJ zT+t?^;Yj<9S}QPqXri{RR4Pd^dmvfN77{xNm98)=krpqB`lgyk+}-z1o&emg=NuqHe;a{<(Z-2qU)dNhSF+KQ`Q* z@T%&byxzZ+70+&(&`CCSo*nCoeax~Nso0KGtKxO_o*kG@UKu!;?c6OU?+@tpvR<(~ z%WCS?8npDJxrV^c24=aaj|-(fhrMN~N*zjzw@vB=D}rSd6sIAzc(EVg3&nj(zJkoX zZK6N_S{PXYuQ2?VeQh7Eqz&lea@8}^ibLB-U~ETBJ*~|7+;lG85WQ^GoT!|9mOGSe9)!7#Kii+w#!-hq` diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po index a9ed2e4..ce55a63 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/locale/nl/LC_MESSAGES/voice.po @@ -3,7 +3,6 @@ # This file is distributed under the same license as the pwnagotchi package. # FIRST AUTHOR justin-p@users.noreply.github.com, 2019. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" @@ -12,7 +11,7 @@ msgstr "" "PO-Revision-Date: 2019-09-29 14:00+0200\n" "Last-Translator: Justin-P \n" "Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n" -"Language: english\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -22,14 +21,12 @@ msgid "ZzzzZZzzzzZzzz" msgstr "ZzzzZZzzzzZzzz" #: voice.py:22 -#, fuzzy msgid "Hi, I'm Pwnagotchi! Starting ..." -msgstr "Hoi, Ik benPwnagotchi!Opstarten ..." +msgstr "Hoi, Ik ben Pwnagotchi! Opstarten ..." #: voice.py:23 -#, fuzzy msgid "New day, new hunt, new pwns!" -msgstr "Nieuwe dag,nieuwe jacht,nieuwe pwns!" +msgstr "Nieuwe dag, nieuwe jacht, nieuwe pwns!" #: voice.py:24 msgid "Hack the Planet!" @@ -40,14 +37,13 @@ msgid "AI ready." msgstr "AI is klaar." #: voice.py:29 -#, fuzzy msgid "The neural network is ready." msgstr "Neuronen netwerkis klaar voor gebruik." #: voice.py:37 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hey, channel {channel} is free! Your AP will say thanks." -msgstr "Hey, kanaal {channel} isvrij! Je AP zal jebedanken." +msgstr "Hey, kanaal {channel} is vrij! Je AP zal je bedanken." #: voice.py:41 msgid "I'm bored ..." @@ -58,9 +54,8 @@ msgid "Let's go for a walk!" msgstr "Laten we een rondje lopen!" #: voice.py:45 -#, fuzzy msgid "This is the best day of my life!" -msgstr "Dit is de bestedag van mijn leven!" +msgstr "Dit is de beste dag van mijn leven!" #: voice.py:48 msgid "Shitty day :/" @@ -91,7 +86,6 @@ msgid "So many networks!!!" msgstr "Zo veel netwerken!!!" #: voice.py:62 -#, fuzzy msgid "I'm having so much fun!" msgstr "Dit is zo leuk!" @@ -101,41 +95,40 @@ msgid "My crime is that of curiosity ..." msgstr "Mijn enige misdrijfis mijn nieuwsgierigheid ..." #: voice.py:67 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hello {name}! Nice to meet you. {name}" -msgstr "Hallo{name}!Leuk je te ontmoeten. {name}" +msgstr "Hallo {name}! Leuk je te ontmoeten. {name}" #: voice.py:68 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Unit {name} is nearby! {name}" -msgstr "Unit{name}is dichtbij! {name}" +msgstr "Unit {name} is dichtbij! {name}" #: voice.py:72 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Uhm ... goodbye {name}" -msgstr "Uhm ...tot ziens{name}" +msgstr "Uhm ...tot ziens {name}" #: voice.py:73 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} is gone ..." -msgstr "{name}is weg" +msgstr "{name} is weg" #: voice.py:77 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Whoops ... {name} is gone." -msgstr "Whoopsie ...{name}is weg" +msgstr "Whoopsie ...{name} is weg" #: voice.py:78 -#, fuzzy, python-brace-format +#, python-brace-format msgid "{name} missed!" -msgstr "{name}gemist!" +msgstr "{name} gemist!" #: voice.py:79 msgid "Missed!" msgstr "Gemist!" #: voice.py:83 -#, fuzzy msgid "Nobody wants to play with me ..." msgstr "Niemand wil metmij spelen ..." @@ -172,14 +165,14 @@ msgid "Looking around ({secs}s)" msgstr "Rond kijken ({secs}s)" #: voice.py:106 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Hey {what} let's be friends!" -msgstr "Hey{what}Laten we vriendenworden!" +msgstr "Hey {what}, laten we vriendenworden!" #: voice.py:107 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Associating to {what}" -msgstr "Verbinden met{what}" +msgstr "Verbinden met {what}" #: voice.py:108 #, python-brace-format @@ -187,29 +180,28 @@ msgid "Yo {what}!" msgstr "" #: voice.py:112 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Just decided that {mac} needs no WiFi!" -msgstr "Ik vind dat{mac}genoeg WiFiheeft gehad!" +msgstr "Ik vind dat {mac} genoeg WiFiheeft gehad!" #: voice.py:113 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Deauthenticating {mac}" -msgstr "De-autoriseren{mac}" +msgstr "De-autoriseren {mac}" #: voice.py:114 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Kickbanning {mac}!" -msgstr "Ik ga{mac}even kicken!" +msgstr "Ik ga {mac} even kicken!" #: voice.py:118 -#, fuzzy, python-brace-format +#, python-brace-format msgid "Cool, we got {num} new handshake{plural}!" -msgstr "Gaaf, we hebben {num}nieuwe handshake{plural}!" +msgstr "Gaaf, we hebben {num} nieuwe handshake{plural}!" #: voice.py:121 -#, fuzzy msgid "Ops, something went wrong ... Rebooting ..." -msgstr "Oops, ietsging fout ...Rebooting ..." +msgstr "Oops, iets ging fout ...Rebooting ..." #: voice.py:124 #, python-brace-format From 67a91169dfe41decf7fa56c30e3bbc91db16e17a Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 13:22:46 +0200 Subject: [PATCH 61/62] fix: sed for macOS is 'special' ... --- scripts/release.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/release.sh b/scripts/release.sh index d5d34b3..8b8d8cd 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -3,7 +3,7 @@ VERSION_FILE=$(dirname "${BASH_SOURCE[0]}")/../sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py echo "version file is $VERSION_FILE" -CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d '"' -f 2) +CURRENT_VERSION=$(cat $VERSION_FILE | grep version | cut -d"'" -f2) TO_UPDATE=( $VERSION_FILE ) @@ -12,11 +12,11 @@ echo -n "current version is $CURRENT_VERSION, select new version: " read NEW_VERSION echo "creating version $NEW_VERSION ...\n" -for file in "${TO_UPDATE[@]}" -do - echo "patching $file ..." - sed -i "s/$CURRENT_VERSION/$NEW_VERSION/g" $file - git add $file +for file in "${TO_UPDATE[@]}"; do + echo "patching $file ..." + sed -i.bak "s/$CURRENT_VERSION/$NEW_VERSION/g" "$file" + rm -rf "$file.bak" + git add $file done git commit -m "releasing v$NEW_VERSION" @@ -25,4 +25,4 @@ git tag -a v$NEW_VERSION -m "release v$NEW_VERSION" git push origin v$NEW_VERSION echo -echo "All done, v$NEW_VERSION released ^_^" +echo "All done, v$NEW_VERSION released ^_^" \ No newline at end of file From 8f42950b5160d5922cc3993efd98c4fe36b95aa0 Mon Sep 17 00:00:00 2001 From: Simone Margaritelli Date: Thu, 3 Oct 2019 13:23:27 +0200 Subject: [PATCH 62/62] releasing v1.0.0antani --- sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py index 022e5cc..ffade9a 100644 --- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py +++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/version.py @@ -1 +1 @@ -version = '1.0.0a' +version = '1.0.0antani'