1094 Commits

Author SHA1 Message Date
Simone Margaritelli
ff91f9b2f8 releasing v1.5.5 2021-04-18 19:05:49 +02:00
Simone Margaritelli
07b70dd0ee fix: updated travis credentials 2021-04-18 19:04:34 +02:00
Simone Margaritelli
c12b319287 releasing v1.5.4 2021-04-18 18:23:15 +02:00
Simone Margaritelli
712d0142a1 Merge pull request #919 from crahan/gps_config
Add configuration options to gps.py (position, vertical line spacing)
2021-04-18 17:43:15 +02:00
Thomas Bouve
9ba55b7f77 Merge updated 'master' into gps_config 2021-04-18 17:22:00 +02:00
Simone Margaritelli
abc16ce973 misc: updated bettercap and pwngrid versions in builder script 2021-04-18 17:17:31 +02:00
Simone Margaritelli
1318275b36 fix: using better symbols for ups charging status 2021-04-18 17:11:04 +02:00
Simone Margaritelli
297d9cd3b9 Merge pull request #905 from samuelkf/ups-lite-charging-status
Display UPS-Lite charging status
2021-04-18 17:08:37 +02:00
Simone Margaritelli
f164b8bb26 new: added new faces for uploading status 2021-04-18 17:03:21 +02:00
Simone Margaritelli
5c3b21f537 fix: recompiled localization files 2021-04-18 16:22:29 +02:00
Simone Margaritelli
6325428218 Merge pull request #903 from serginator/task/improve-es-lang
Improved Spanish translation
2021-04-18 16:00:44 +02:00
Simone Margaritelli
7d35f5cdc0 Merge branch 'master' into task/improve-es-lang 2021-04-18 16:00:37 +02:00
Simone Margaritelli
3fd3ac3c01 Merge pull request #911 from MannyLama/master
Improved Dutch translation
2021-04-18 15:59:13 +02:00
Simone Margaritelli
c1d3528ff7 Merge pull request #940 from ShaqKSmith/patch-1
Create voice.po
2021-04-18 15:58:59 +02:00
Simone Margaritelli
37fc65f834 Merge pull request #947 from theusu5k/patch-1
Update voice.po
2021-04-18 15:58:43 +02:00
Simone Margaritelli
80095edf4b Merge pull request #948 from MatthewNunu/master
Added Afrikaans translation
2021-04-18 15:56:45 +02:00
Simone Margaritelli
7e3e74635a Merge pull request #983 from xhrzg2017/patch-1
Update voice.po
2021-04-18 15:53:48 +02:00
Simone Margaritelli
6b3d9042fd Merge branch 'master' of github.com:evilsocket/pwnagotchi 2021-04-18 15:43:26 +02:00
Simone Margaritelli
4441ae852c misc: using stork for releases 2021-04-18 15:43:15 +02:00
Simone Margaritelli
edc0551e0a Merge pull request #933 from ajaswa/902/stop-using-uart-gpio-for-waveshare
swap out header file for one that doesn't tie up gpio pins 14 and 15 for waveshare_2
2021-04-18 15:16:23 +02:00
Simone Margaritelli
b6cf510f8e Merge pull request #876 from grokbeer/watchdog-reboot
Have watchdog plugin reboot system rather than restart application
2021-04-18 15:14:59 +02:00
Simone Margaritelli
7fb6be861a Merge pull request #909 from Tuinslak/patch-1
Make sure IPv4 works when eth0 is connected
2021-04-18 15:14:32 +02:00
Simone Margaritelli
f795598950 Merge pull request #918 from crahan/memtemp_gps_fixes
Add configuration options to memtemp.py (fields, position, vertical line spacing)
2021-04-18 15:13:23 +02:00
Simone Margaritelli
b0efd52961 Merge pull request #929 from HeroCC/master
Add donate option to Wigle plugin
2021-04-18 15:11:51 +02:00
Simone Margaritelli
38dfccb7c2 Merge pull request #953 from centraliota/master
Update wpa-sec.py logging
2021-04-18 15:11:10 +02:00
Simone Margaritelli
f912883f6e Merge pull request #967 from Xeyler/gps-bugfix
Fix display bug in gps module
2021-04-18 15:10:59 +02:00
Simone Margaritelli
661f26dedf Merge pull request #985 from Gadgetoid/patch-inky-ssd1608
Add support for SSD1608 variant 250x122 pixel Inky pHATs
2021-04-18 15:10:05 +02:00
Simone Margaritelli
d6c7a73f39 fix: fixed whl file urls 2021-04-18 15:07:16 +02:00
Simone Margaritelli
10f274dab7 fix: updated build scripts with latest packer version 2021-04-18 14:48:39 +02:00
Simone Margaritelli
decbeaccb1 Merge pull request #969 from jonspraggins/patch-1
Add Uploading 'Faces'
2021-04-18 13:18:43 +02:00
Philip Howard
34c2c8a06e Add support for SSD1608 variant 250x122 pixel Inky pHATs
Running `python3 -m inky.eeprom` should show display variant. Variants 10, 11 and 12 are SSD1608 based.

This patch adds support for auto-detecting and using them when "ui.display.color" is set to "auto".

Fixes #980 and #941

Signed-off-by: Philip Howard <phil@gadgetoid.com>
2021-04-09 10:23:59 +01:00
xhrzg2017
88a15528d6 Update voice.po 2021-04-09 10:06:58 +08:00
Jon Spraggins
0fd09878db Update faces.py
Added upload faces.
2021-03-18 11:47:25 -04:00
Brigham Campbell
c472e60615 Fix bug in gps module
Fix a bug caused by using a function in a conditional instead of the
return value of the function itself.

Signed-off-by: Brigham Campbell <me@brighamcampbell.com>
2021-03-14 11:46:04 -06:00
Simone Margaritelli
0704541dd1 Merge pull request #957 from FoxFromDarkness66/patch-1
Fix broken link in README
2021-03-14 16:29:03 +01:00
FoxFromDarkness66
ea061d473b Fix broken link in README
Default file is .toml now, not .yml
2021-01-25 20:00:21 +03:00
centraliota
6430a40847 Update wpa-sec.py logging
Added logging.info message for plugin loading, to keep consistent with behaviour of other plugins.
2020-11-17 18:01:52 -07:00
MatthewNunu
ba13b12593 added afrikaans lang 2020-11-12 12:05:29 +02:00
theusu5k
819be761ed Update voice.po
Some words were translated too literal.
Some menor corrections
2020-11-09 20:25:22 +01:00
ShaqKSmith
f701390d5a Create voice.po 2020-11-02 15:01:12 +08:00
Andrew Jaswa
2ddf040fac swap out header file for one that doesn't tie up gpio pins 14 and 15 for waveshare_2
Signed-off-by: Andrew Jaswa <andrew.jaswa@bonus.ly>
2020-10-09 21:13:31 -06:00
HeroCC
3bd9cd4f18 Tweak Wigle plugin
Adds a new 'donate' option to allow Wigle to include data for commercial use.

Also changes data header to reflect this is a pwnagotchi plugin.

Signed-off-by: HeroCC <herocc@herocc.com>
2020-10-03 17:06:29 +02:00
Thomas Bouve
5c6d8dc807 Adjust x coordinate for longer long field. 2020-09-20 22:12:54 +02:00
Thomas Bouve
c535ffd40e Fix version bump. 2020-09-20 21:24:33 +02:00
Thomas Bouve
fb7217b0fa Add configuration options and cleanup
- added support for configuring the plugin position and vertical line spacing
- fix default values for some displays which appeared to be incorrect
- change `ui.is_dfrobot_v2` to a function (to match other display entries)
- version bump to 1.0.2
2020-09-20 21:10:10 +02:00
Thomas Bouve
7da3cc5565 Revert. Changes are handled in a separate branch 2020-09-20 20:25:25 +02:00
Thomas Bouve
e72e2292a8 Update guessed coordinates based on other values. 2020-09-20 20:22:39 +02:00
Thomas Bouve
0f8643258e gps config updates 2020-09-20 11:14:00 +02:00
Thomas Bouve
1a0083eb38 Fix correct x positioning
Align fields right when less than 3 fields are shown in horizontal mode, using a 5-pixel character width with a 5-character width for each field (i.e. 25 pixels per field).
2020-09-20 01:43:52 +02:00
Thomas Bouve
72878454f9 Removed debug line. 2020-09-20 00:29:33 +02:00
Thomas Bouve
1c4df7a1c4 Additional comments 2020-09-20 00:27:26 +02:00
Thomas Bouve
c124a97514 Changelog update. 2020-09-20 00:25:52 +02:00
Thomas Bouve
b886b4e673 Added more configurable fields 2020-09-19 23:43:24 +02:00
Thomas Bouve
6d0e295276 Version bumps 2020-09-18 02:12:36 +02:00
Thomas Bouve
1aea0b95b1 Small gps fixes + memtemp rework 2020-09-18 02:11:37 +02:00
MannyLama
fddee8708e Updated dutch & fixed typos 2020-09-11 15:43:44 +02:00
MannyLama
ef4fbd96cc Updated dutch & fixed typos 2020-09-11 15:42:47 +02:00
Yeri Tiete
552df65422 Make sure IPv4 works when eth0 is connected
Resolves an issue where IPv4 traffic would not work when eth0 is connected (i.e. usb-ethernet adapter over OTG). The static route for usb0 precedes the DHCP route for eth0. Only IPv6 traffic would work, but not IPv4 until the metric for usb0 is increase and thus lowered in priority. If no eth0 is plugged in, internet works fine over usb0.
2020-09-04 17:49:41 +08:00
Sam Keating-Fry
2db8f143eb Display UPS-Lite charging status
Replace the '%' in the battery indicator with '' when the UPS-Lite is connected to an external power source.
Suggestions welcome for a different character as '' is a little hard to read on e-ink displays.
2020-08-29 14:40:44 +01:00
Sergio Ruiz
6111ee9d9d Improved Spanish translation
Signed-off-by: Sergio Ruiz <serginator@gmail.com>
2020-08-25 23:07:34 +02:00
Simone Margaritelli
713a14c504 Merge pull request #851 from MikeDawg/fixscripts
Fixing scripts - Make all scripts usage/help similar
2020-06-26 14:14:48 +02:00
Simone Margaritelli
2708fd032c Merge pull request #872 from grokbeer/shutdown-sync
Delaying fs sync to ensure shutdown message is logged to disk
2020-06-26 14:14:32 +02:00
Simone Margaritelli
f7cf4b3947 Merge pull request #874 from grokbeer/reboot-sync
Ensure fs is synced before reboot so logs aren't lost
2020-06-26 14:14:03 +02:00
Simone Margaritelli
1d312a727b Merge pull request #877 from grokbeer/fs-typo
Fix minor typo
2020-06-26 14:12:38 +02:00
Simone Margaritelli
dd3dbbe400 Merge pull request #882 from jacopotediosi/patch-1
Set maxZoom to max value
2020-06-26 14:12:15 +02:00
Simone Margaritelli
cfa034b555 Merge pull request #886 from elipsius/885/fix-2.7inch-waveshare-gps-display
Updated gps.py to include positioning for the waveshare 2.7 inch scre…
2020-06-26 14:11:17 +02:00
Simone Margaritelli
a0cd0d4936 Merge pull request #891 from voodoologic/master
If a step fails, abort script.
2020-06-26 14:10:52 +02:00
Simone Margaritelli
3e3fff298c Merge pull request #890 from BlackFrog1/laptop
Ignore python virtual environments
2020-06-26 14:10:33 +02:00
Doug
0b1c51dcc7 If a step fails, abort script. 2020-06-09 20:03:28 -07:00
BlackFrog1
8dd9a85615 quick ignore of python environments 2020-06-08 11:46:16 -04:00
Eric M Lipsius
929eac7bba Updated gps.py to include positioning for the waveshare 2.7 inch screen, tested on my hardware:
Raspberry Pi 3 /w waveshare 2.7 inch epaper hat, and USB GPS/GLONASS U-blox7

Signed-off-by: Eric M Lipsius <eric.lipsius@gmail.com>
2020-05-27 00:54:15 -04:00
Jacopo Tediosi
0f7870f770 Set maxZoom to max value
Why to limit zoom? As a user, I used sometimes to zoom so much.
2020-05-21 23:50:03 +02:00
grokbeer
37342c0685 Have watchdog plugin reboot system rather than restart application
Signed-off-by: grokbeer <1428380+grokbeer@users.noreply.github.com>
2020-05-08 23:17:12 +12:00
grokbeer
71514a97fa Delaying fs sync to ensure shutdown message is logged to disk
Signed-off-by: grokbeer <1428380+grokbeer@users.noreply.github.com>
2020-05-08 23:17:04 +12:00
grokbeer
03488819af Ensure fs is synced before reboot so logs aren't lost
Signed-off-by: grokbeer <1428380+grokbeer@users.noreply.github.com>
2020-05-08 23:16:54 +12:00
grokbeer
633b726bcd Fix minor typo
Signed-off-by: grokbeer <1428380+grokbeer@users.noreply.github.com>
2020-05-08 23:16:32 +12:00
Simone Margaritelli
05b235c38b Merge pull request #860 from misterf13/master
Display coordinates for dfrobotv2
2020-05-06 12:04:36 +02:00
Ferny G
840054f549 Display coordinates for dfrobotv2
Signed-off-by: misterf13 <fgarcia1337@gmail.com>
2020-04-20 22:40:39 -05:00
Simone Margaritelli
a3cf49244e Merge pull request #855 from dadav/develop
Bug fixes
2020-04-20 11:13:25 +02:00
dadav
e92751164f typo 2020-04-19 18:49:42 +02:00
dadav
c2f9860bc5 same as in the py file 2020-04-19 16:48:11 +02:00
dadav
f616871068 fix syntax 2020-04-19 16:46:34 +02:00
dadav
c726779f6e only go back 5 mins 2020-04-19 16:36:26 +02:00
dadav
a2e29d64d2 dont overwrite zips 2020-04-19 11:39:49 +02:00
dadav
bc84f22f7a fix ident 2020-04-19 11:37:48 +02:00
dadav
40d8d994d1 version++ 2020-04-19 11:34:39 +02:00
dadav
7ca5eee247 add custom repos 2020-04-19 11:26:18 +02:00
dadav
56c291d302 change treshhold to 5 2020-04-18 18:19:16 +02:00
dadav
1013e7dc19 make less verbose 2020-04-18 17:09:39 +02:00
dadav
ff4f5c672a move code out of ui update hook 2020-04-18 16:46:29 +02:00
dadav
d9d268ea81 fix bug 2020-04-18 13:53:42 +02:00
dadav
de62214970 add missing option 2020-04-18 13:30:43 +02:00
dadav
52cc413152 add check 2020-04-18 13:23:12 +02:00
dadav
716d5cd312 typo 2020-04-18 13:17:18 +02:00
dadav
e436dc8b8e fix 2020-04-18 13:02:42 +02:00
dadav
81db495f33 redirect to dashboard 2020-04-18 12:47:09 +02:00
dadav
7f8380c38a switch to static 2020-04-18 12:26:21 +02:00
Ferny G
8c2b4e2075 DFRobot V2 screen 2020-04-18 11:40:43 +02:00
dadav
2b17e5322b only kill if present 2020-04-18 11:29:54 +02:00
dadav
1be17b1f99 reboot if reload fails 2020-04-18 11:17:46 +02:00
dadav
2dee3987d4 add bash completion 2020-04-18 10:59:08 +02:00
dadav
eb76cc7023 fix location 2020-04-18 10:22:18 +02:00
dadav
35ea36ef33 auto redirect when decrypted 2020-04-18 10:09:20 +02:00
dadav
44e1e79245 scorp fix 2020-04-18 09:50:40 +02:00
dadav
6038f555fa fix 2020-04-18 00:02:25 +02:00
dadav
0b5a63a3d8 add missing var 2020-04-17 22:31:30 +02:00
dadav
430172e3dd remove button 2020-04-17 20:55:11 +02:00
dadav
fa87e03222 add max-lines 2020-04-17 20:18:12 +02:00
dadav
d1411ffa96 sort plugins 2020-04-17 16:45:04 +02:00
dadav
67b4747afa adjust cmd 2020-04-17 16:39:31 +02:00
dadav
311931c81d added watchdog 2020-04-17 16:32:24 +02:00
Simone Margaritelli
1f7bc60de6 Merge pull request #848 from Czechball/master
added Czech translation
2020-04-16 13:01:17 +02:00
Simone Margaritelli
57034d9fc6 Merge pull request #852 from dadav/develop
Various fixes
2020-04-16 13:01:08 +02:00
dadav
74fbf4da32 version++ 2020-04-16 10:31:59 +02:00
dadav
7ec20caf23 fix filter bug 2020-04-15 17:49:57 +02:00
dadav
568c5b020d aaaannnd even better 2020-04-15 17:19:41 +02:00
dadav
3965bdb554 performs better without it 2020-04-15 17:02:50 +02:00
dadav
585b208e9e support multiple passwords 2020-04-15 16:51:43 +02:00
dadav
e53bdc46a4 there is no logging to journald anymore 2020-04-15 13:19:01 +02:00
dadav
6805df858e basename should be dirname 2020-04-15 08:20:47 +02:00
dadav
8a07e822e6 breaks if never used 2020-04-14 22:20:42 +02:00
MikeDawg
5f7dd56ead Fixing scripts
Signed-off-by: MikeDawg <MikeDawg@gmail.com>
2020-04-14 14:08:16 -06:00
dadav
a808fd33c7 another toml fix in paradise 2020-04-14 21:53:17 +02:00
Simone Margaritelli
cedcc17391 releasing v1.5.1 2020-04-14 11:16:40 +02:00
Simone Margaritelli
6478b3827d Merge pull request #847 from dadav/develop
fix build problems
2020-04-14 11:12:59 +02:00
Czechball
68065d548a added Czech translation 2020-04-14 06:17:57 +02:00
dadav
463f4b50e4 fix build problems 2020-04-13 19:39:15 +02:00
Simone Margaritelli
793cde7147 misc: updated builder with newer bettercap version 2020-04-13 17:46:15 +02:00
Simone Margaritelli
518b9e665d Merge pull request #846 from dadav/develop
add dnsmasq
2020-04-13 17:37:35 +02:00
dadav
91ea7bdb9b add dnsmasq 2020-04-13 17:30:52 +02:00
Simone Margaritelli
3ce88f1d80 Merge pull request #845 from dadav/develop
ready to merge
2020-04-13 17:29:56 +02:00
dadav
6d45d01baf update version 2020-04-13 17:19:06 +02:00
dadav
1f2dd73976 Big update 2020-04-13 17:16:24 +02:00
Simone Margaritelli
5d8d86204a Merge pull request #843 from jacopotediosi/patch-2
Add single_files option to onlinehashcrack config
2020-04-03 15:39:28 +02:00
Jacopo Tediosi
7017e39c6d Add single_files option to onlinehashcrack config
See merged PR #821
2020-04-03 15:29:24 +02:00
Simone Margaritelli
1360c734ff Merge pull request #842 from dadav/develop
Some fixes
2020-04-03 14:49:17 +02:00
Simone Margaritelli
7c90050b17 Merge pull request #840 from Skeleton022/master
Corrected hungarian translation
2020-04-03 14:49:06 +02:00
Simone Margaritelli
9ca8aacdf6 Merge pull request #821 from jacopotediosi/patch-1
Onlinehashcrack should create .pcap.cracked files
2020-04-03 14:48:54 +02:00
dadav
d39c849daf github? you ok? 2020-04-02 23:06:39 +02:00
dadav
58bbae89c2 fix some bugs 2020-04-02 22:59:51 +02:00
dadav
0dedd0974f update 2020-04-02 20:10:07 +02:00
dadav
5bac678771 typo 2020-04-02 19:30:22 +02:00
dadav
3b9aacdd16 faces use dejavu 2020-04-02 19:24:52 +02:00
dadav
305f837486 more fonts 2020-04-02 19:06:28 +02:00
dadav
54ffbbcb0b used @k0uj1k's translation 2020-04-02 18:08:30 +02:00
dadav
60167fb8fe use latest version 2020-04-01 18:21:44 +02:00
dadav
9a1565813c cant import 2020-04-01 18:21:12 +02:00
dadav
03c014f414 fix webcfg 2020-04-01 18:20:12 +02:00
dadav
d10bf6bf1d we dont want this in the repo 2020-04-01 09:40:22 +02:00
dadav
9a22321799 save in dotted format 2020-04-01 09:39:32 +02:00
dadav
76b71f5c3f fixes import error 2020-03-31 18:56:15 +02:00
dadav
4aa05bb834 /proc/stat contains the cpu ticks since boot 2020-03-31 18:56:15 +02:00
dadav
71c4458858 not needed 2020-03-31 18:56:15 +02:00
Simone Margaritelli
8260b41bab Merge pull request #813 from silsha/fix-gps
Prevent saving gps file without coordinates
2020-03-31 16:02:44 +02:00
Simone Margaritelli
86530d4b97 Merge pull request #815 from xBelladonna/bugfix/ui
Fix hardware display startup sequence
2020-03-31 16:02:26 +02:00
Simone Margaritelli
c7d9a757f6 Merge pull request #824 from xBelladonna/bugfix/journal-logging
Fix typo in systemd service to disable journal logging
2020-03-31 16:02:10 +02:00
Skeleton022
b6a0ae9d3a Added proper hungarian language support
Corrected python's bad magic number error.
2020-03-23 15:18:10 +01:00
Skeleton022
34f52b0d3a Delete voice.po 2020-03-23 15:16:11 +01:00
Skeleton022
c68cefe80d Delete voice.mo 2020-03-23 15:16:03 +01:00
Skeleton022
052c99b858 replace existing 2020-03-23 01:45:59 +01:00
Simone Margaritelli
ccea7cbeef Merge pull request #828 from davenicoll/master
Fix for gps labels on inkyphat displays
2020-03-06 13:48:23 +01:00
Simone Margaritelli
a16a5f7bcb Merge pull request #832 from Skeleton022/master
Add support for hungarian language
2020-03-06 13:48:11 +01:00
Skeleton022
a5df77d737 Add support for hungarian language 2020-03-06 07:53:47 +01:00
David Nicoll
489bce0c01 Fix for gps labels on inkyphat displays
Positioned the gps labels correctly on inkyphat displays
2020-02-26 08:53:04 +00:00
xBelladonna
da4319f81b Fix typo in systemd service
Disable journal logging

Signed-off-by: xBelladonna <isabelladonnamoore@users.noreply.github.com>
2020-02-18 05:21:40 +09:30
Jacopo Tediosi
0e1a1f4c79 Changed filename generation to a regex 2020-02-17 12:15:26 +01:00
Jacopo Tediosi
b3bdb34e3f Onlinehashcrack should create .pcap.cracked files 2020-02-17 10:55:35 +01:00
xBelladonna
c791c86bee Fix display startup sequence
Signed-off-by: xBelladonna <isabelladonnamoore@users.noreply.github.com>
2020-01-22 22:44:17 +09:30
Silsha Fux
61e5872229 Prevent saving gps file without coordinates
Signed-off-by: Silsha Fux <hallo@silsha.me>
2020-01-21 17:50:02 +01:00
Simone Margaritelli
23616095ba Merge pull request #811 from dadav/fix/disable_journal_logging
Disable logging to journald
2020-01-20 11:14:00 +01:00
Simone Margaritelli
3c8e7fbea4 Merge pull request #810 from dadav/fix/remove_test_snippet
remove accidentally commited snippet
2020-01-20 11:13:51 +01:00
Simone Margaritelli
4a5d2d36cc Merge pull request #809 from dadav/fix/ohc_typo
Fix bug in ohc plugin
2020-01-20 11:13:41 +01:00
dadav
52d432e5b6 Psssst, Lennart 2020-01-19 17:46:12 +01:00
dadav
93bdf2e3a1 remove accidentally commited snippet 2020-01-19 16:48:35 +01:00
dadav
fe97315b0f bytes... 2020-01-19 15:47:58 +01:00
Simone Margaritelli
7e80a7b9ca Merge pull request #808 from dadav/feature/ohc_download
add password download from onlinehashcrack
2020-01-19 14:46:24 +01:00
Simone Margaritelli
64385f43ed Merge pull request #806 from dadav/feature/log2ram
add log2mem functionality and refracture
2020-01-19 14:46:17 +01:00
dadav
6a4d7a895e add log2mem functionality and refracture 2020-01-19 14:44:36 +01:00
Simone Margaritelli
5606ad7281 Merge pull request #804 from xenDE/patch-9
net-pos: make api_url configurable
2020-01-19 14:18:50 +01:00
Simone Margaritelli
23f09bc4b6 Merge pull request #803 from xenDE/patch-7
webgpsmap: load extern resources over https, show current position on…
2020-01-19 14:18:43 +01:00
Simone Margaritelli
238b90d988 Merge pull request #802 from xenDE/patch-8
webgpsmap: better logging informations for easy user debugging
2020-01-19 14:18:33 +01:00
Simone Margaritelli
138316d55a Merge pull request #805 from signout/master
Trained pwnagotchi in the skill of writing danish
2020-01-19 14:17:55 +01:00
Simone Margaritelli
67bbcfef9b Merge pull request #807 from dadav/feature/session_log
add session functionality to session-stats
2020-01-19 14:17:28 +01:00
Simone Margaritelli
1a0e0c46d2 Merge pull request #800 from dadav/fix/missing_import
fix import
2020-01-19 14:16:38 +01:00
Simone Margaritelli
4cd0f46ad7 Merge pull request #752 from xBelladonna/patch-1
Small fixes: correct typos and clarify plugin log entries/default configuration
2020-01-19 14:16:19 +01:00
Simone Margaritelli
155ea54d08 Merge pull request #795 from hectorm/allow-disable-installer
Allow installer deactivation
2020-01-19 14:15:58 +01:00
Simone Margaritelli
461e53ed79 Merge pull request #799 from dadav/fix/toml_converter
Convert keys to str
2020-01-19 14:15:43 +01:00
Simone Margaritelli
6d40388002 Merge pull request #798 from dadav/fix/version_import
Fix version import
2020-01-19 14:15:35 +01:00
dadav
37b25a142f add password download 2020-01-19 11:51:11 +01:00
dadav
665ad938b4 add save_directory variable 2020-01-19 11:14:05 +01:00
dadav
301a3d99cf add session logs 2020-01-19 11:11:13 +01:00
Dennis K Jensen
c4e0acad17 Add support for danish language 2020-01-18 22:53:35 +01:00
xenDE
9339ecb2fd net-pos: make api_url configurable
now its possible tzo set an own api_url in config:

[main.plugins.net-pos]
enabled = true
api_key = "test"
api_url = "https://location.services.my-own.com/v1/geolocate?key={api}"
2020-01-18 17:35:54 +01:00
xenDE
a28c9a1176 webgpsmap: better logging informations for easy user debugging 2020-01-18 16:52:52 +01:00
xenDE
c5d6f6d362 webgpsmap: load extern resources over https, show current position on https context (for self hosted/offlinemap) 2020-01-18 16:46:35 +01:00
dadav
ff843f0367 fix import 2020-01-18 09:30:44 +01:00
xBelladonna
717cb02743 Fix English typos
Fixed a typo in English translation, needing to regenerate locales because of changed msgid
Fixed typo in onlinehashcrack plugin logging

Signed-off-by: xBelladonna <isabelladonnamoore@users.noreply.github.com>
2020-01-18 14:31:15 +09:30
xBelladonna
8be643b2e0 Announce OnlineHashCrack plugin loaded in logs
Signed-off-by: xBelladonna <isabelladonnamoore@users.noreply.github.com>
2020-01-18 14:30:27 +09:30
xBelladonna
814392daa5 Add port onto paw-gps IP in logs for clarity
We show ip:port instead of just ip in logs to avoid confusion

Signed-off-by: xBelladonna <isabelladonnamoore@users.noreply.github.com>
2020-01-18 14:30:27 +09:30
dadav
4cc1c2ac1f more compact 2020-01-17 19:15:01 +01:00
dadav
fae6a0942b Convert keys to str 2020-01-17 19:12:15 +01:00
dadav
53ab63cf8a fix import 2020-01-17 18:10:33 +01:00
Simone Margaritelli
0764304be9 Merge pull request #796 from dadav/fix/version_parsing
Fix/version parsing
2020-01-17 11:37:46 +01:00
dadav
cdc0e0fa3e adjust release script 2020-01-16 19:25:58 +01:00
dadav
5ccd65e46e fix typo 2020-01-16 19:19:58 +01:00
dadav
afc3636939 fix version parsing 2020-01-16 18:52:40 +01:00
Simone Margaritelli
f154b97ab9 Merge pull request #770 from gerard780/patch-1
added support for timezones with - offset
2020-01-16 12:02:47 +01:00
Simone Margaritelli
66acecb387 Merge pull request #784 from hectorm/add-dbus-python
Add dbus-python to requirements.txt
2020-01-16 12:02:07 +01:00
Simone Margaritelli
a31d0a5e19 Merge pull request #786 from mbgroot/master
Updating the Russian translation: mo and po files.
2020-01-16 12:01:51 +01:00
Simone Margaritelli
026b9fc513 Merge pull request #787 from dadav/fix/bt-tether-params
Bt-Tether fix
2020-01-16 12:01:40 +01:00
Simone Margaritelli
1cdc1641fc Merge pull request #788 from dadav/fix/preview_toml_adjustment
Adjust preview.py (toml)
2020-01-16 12:01:17 +01:00
Simone Margaritelli
71de5925ee Merge pull request #790 from hectorm/use-sys-exit
Use "sys.exit" instead of "exit" builtin
2020-01-16 12:00:59 +01:00
Simone Margaritelli
4733e90e77 Merge pull request #792 from hectorm/bad-values-toml
Converted back to integer some values from "defaults.toml"
2020-01-16 12:00:48 +01:00
Héctor Molinero Fernández
7cf0a2ef4b Allow installer deactivation
Signed-off-by: Héctor Molinero Fernández <hector@molinero.dev>
2020-01-15 23:36:29 +01:00
Héctor Molinero Fernández
97e03843bd Converted back to integer some values from "defaults.toml"
Signed-off-by: Héctor Molinero Fernández <hector@molinero.dev>
2020-01-14 23:11:30 +01:00
Héctor Molinero Fernández
8b078383c2 Use "sys.exit" instead of "exit" builtin
Signed-off-by: Héctor Molinero Fernández <hector@molinero.dev>
2020-01-14 22:23:01 +01:00
gerard780
3e5bece3cf Merge remote-tracking branch 'upstream/master' into patch-1 2020-01-14 16:10:30 -05:00
Héctor Molinero Fernández
7645be6f3e Merge branch 'master' of https://github.com/evilsocket/pwnagotchi into add-dbus-python 2020-01-14 19:37:05 +01:00
dadav
779da95f78 related to toml migration 2020-01-14 18:37:39 +01:00
dadav
51e13aa1ad related to toml migration 2020-01-14 18:20:00 +01:00
Evgeny Zelenin
e489678cf5 Updating the Russian translation
Updating the Russian translation - po and mo files. Locally tested.
2020-01-14 16:02:20 +05:00
Simone Margaritelli
52015014b4 Merge pull request #767 from foreign-sub/packer_version
Add PACKER_VERSION to Makefile, bump packer to 1.4.5
2020-01-14 11:39:26 +01:00
Simone Margaritelli
f691f737ab Merge pull request #747 from dadav/feature/migrate_to_toml
Switch to toml
2020-01-14 11:39:13 +01:00
Héctor Molinero Fernández
2617a6edea Add dbus-python to requirements.txt
Signed-off-by: Héctor Molinero Fernández <hector@molinero.dev>
2020-01-13 23:54:07 +01:00
gerard780
6001b7630b Merge pull request #1 from dadav/fix/date_parsing
dateutil is easier than regex
2020-01-13 15:26:38 -05:00
dadav
78fba1f74b dateutil is easier than regex 2020-01-13 20:10:43 +01:00
dadav
6075296884 Switch to toml 2020-01-13 19:20:40 +01:00
Simone Margaritelli
9457622713 Merge pull request #779 from soebbing/add-easymaxis-fixes
Small german language fixes
2020-01-13 11:42:22 +01:00
Simone Margaritelli
7ef1c1f2f0 Merge pull request #774 from dadav/fix/a2c_files
Prevents permanent tfevent files
2020-01-13 11:41:54 +01:00
Simone Margaritelli
8e0488e16f Merge pull request #771 from espinielli/patch-1
typo (maybe)
2020-01-13 11:41:40 +01:00
Simone Margaritelli
5934ac4a55 Merge pull request #759 from WheresAlice/feature/749-pycryptodome-dependency
fix incorrect dependency for Crypto
2020-01-13 11:40:37 +01:00
Simone Margaritelli
15bae093fb Merge pull request #758 from xenDE/patch-6
webgpsmap: add function for download the map as one html file and show current position on map
2020-01-13 11:40:26 +01:00
Simone Margaritelli
0c76cd7ea7 Merge pull request #757 from dadav/feature/switcher
Add switcher plugin
2020-01-13 11:40:07 +01:00
Simone Margaritelli
5834b27ed8 Merge pull request #742 from TechAdvancedCyborg/master
Updated French Translations
2020-01-13 11:39:41 +01:00
Simone Margaritelli
a8ed9bcc1c Merge pull request #741 from benallard/ups_shutdown
ups_lite: Add auto-shutdown
2020-01-13 11:39:27 +01:00
Simone Margaritelli
0e88c3aa6a Merge pull request #720 from moheshmohan/master
Added support for waveshare 2.13 B display
2020-01-13 11:39:13 +01:00
Hendrik Söbbing
b1d61d95e6 Small german language fixes
Signed-off-by: Hendrik Söbbing <h.soebbing@shopware.com>
2020-01-03 09:12:26 +01:00
dadav
215af0fc88 Prevents permanent tfevent files 2020-01-02 14:07:27 +01:00
Enrico Spinielli
c09b72ff7e typo (maybe) 2019-12-31 14:54:38 +01:00
gerard780
2f1b35b3fa added support for timezones with - offset
introduced new regexp to better handle timestamps with a negative timezone offset like '2019-21-30T14:01:46.79231-05:00'
2019-12-30 14:01:59 -05:00
foreign-sub
d435ef2ba9 Add PACKER_VERSION to Makefile, bump packer to 1.4.5
Signed-off-by: foreign-sub <51928805+foreign-sub@users.noreply.github.com>
2019-12-29 22:10:22 +01:00
xenDE
4164e7c067 webgpsmap: get current position and set marker on map in interval (30s)
used the browsers geolocation function to get the current location, show a marker and center the map there.
on success (user allows usage of get-current-position) it gets position every 30s and reposition the marker without center the map to the marker.
2019-12-29 14:57:17 +01:00
WheresAlice
bb7737762c fix incorrect dependency for Crypto
Signed-off-by: WheresAlice <WheresAlice@users.noreply.github.com>
2019-12-27 18:03:50 +00:00
xenDE
c300e73726 webgpsmap: add function for download the map as one html file with json-positions inside
now it's possible to download the map as one Html file for local use on your pc or host somewhere for mobile use without your pownagotchi. uri: /plugins/webgpsmap/offlinemap
2019-12-26 18:51:00 +01:00
dadav
0587c4b09a Add switcher plugin 2019-12-26 09:43:07 +01:00
Simone Margaritelli
63dc672b11 releasing v1.4.3 2019-12-23 11:21:28 +01:00
evilsocket
0dac137df0 Merge pull request #746 from dadav/fix/scipy_version
Add scipy to requirements.txt
2019-12-23 11:16:53 +01:00
dadav
3db9ccb47e Add scipy to requirements.txt 2019-12-21 17:20:05 +01:00
T.A.C.T.I.C.A.L
f375e4905f Recompiled voice.mo
Recompiled voice.mo
2019-12-20 17:46:42 +01:00
T.A.C.T.I.C.A.L
8d17cf0bd2 Updated French Translations
Updated French translations to fix typos and translation issues...
2019-12-20 17:44:40 +01:00
Benoît Allard
d981b26842 ups_lite: Add auto-shutdown
Signed-off-by: Benoît Allard <benoit.allard@gmx.de>
2019-12-19 20:11:39 +01:00
Simone Margaritelli
a7164ea742 releasing v1.4.2 2019-12-19 17:36:09 +01:00
evilsocket
cae2a18016 Merge pull request #735 from dadav/fix/add_unload
add unload method
2019-12-17 16:48:23 +01:00
dadav
9d63eba232 add unload method 2019-12-16 18:50:40 +01:00
evilsocket
f141e15ba3 Merge pull request #727 from ArnCo/master
Set correct position for memtemp plugin so that it does not overlap with regular messages for waveshare27inch.
2019-12-16 12:00:46 +02:00
evilsocket
e68165ce06 Merge pull request #732 from xenDE/patch-5
webgpsmap: fix parsing new timezone format "Z" in gps data
2019-12-16 12:00:17 +02:00
evilsocket
3758806919 Merge pull request #725 from dadav/fix/remove_sysd_process_limits
remove process limits
2019-12-16 11:59:59 +02:00
evilsocket
1f91c6f09e Merge pull request #724 from dadav/feature/ensure_write
add ensure_write
2019-12-16 11:59:40 +02:00
evilsocket
3e8b6eafbd Merge pull request #722 from dadav/fix/no_comment
no comment
2019-12-16 11:59:12 +02:00
xenDE
44138ba463 webgpsmap: fix parsing new timezone format "Z" in gps data
fix timezone "Z": "2019-11-28T04:44:46.79231Z" >> "2019-11-28T04:44:46.79231+00:00"
issue: https://github.com/evilsocket/pwnagotchi/issues/708
2019-12-15 23:37:48 +01:00
ACO
4b71fea404 Set correct position for memtemp plugin so that it does not overlap with regular messages for waveshare27inch.
Signed-off-by: ArnCo <arnaud@cordier.work>
2019-12-14 11:49:21 +01:00
dadav
6babad0d02 remove process limits 2019-12-14 09:00:54 +01:00
dadav
e8513240ea add ensure_write 2019-12-13 19:42:04 +01:00
dadav
00101ccd07 no comment 2019-12-13 19:29:44 +01:00
mohesh.mohan
a0bc911c0e Display freeze recover enhancements - delay between poweron and off 2019-12-13 21:32:52 +04:00
mohesh.mohan
6d71bcd965 Display freeze recover enhancements 2019-12-13 21:08:56 +04:00
mohesh.mohan
91447a2a31 Waveshare213bc hung issues workaround - optimizations 2019-12-13 11:01:40 +04:00
mohesh.mohan
e06480e474 Waveshare213bc hung issues workaround 2019-12-13 10:33:41 +04:00
mohesh.mohan
819146f83a waveshare213b and waveshare213c support bug fixes 2019-12-12 01:56:52 +04:00
mohesh.mohan
cdd4c13336 waveshare213b and waveshare213c support bug fixes 2019-12-12 01:09:03 +04:00
mohesh.mohan
704d7ceaa1 waveshare213b and waveshare213c support bug fixes 2019-12-12 00:46:14 +04:00
mohesh.mohan
a4daf4af61 waveshare213b and waveshare213c support bug fixes 2019-12-12 00:37:24 +04:00
mohesh.mohan
eddcf32b62 213bc support additions 2019-12-11 23:47:14 +04:00
mohesh.mohan
6117235c52 added 213bc support 2019-12-11 23:08:29 +04:00
Simone Margaritelli
e0a66f5c99 misc: small fix or general refactoring i did not bother commenting 2019-12-10 21:22:44 +02:00
Simone Margaritelli
81061cea24 fix: fixed locked callback call on plugins 2019-12-10 21:17:46 +02:00
evilsocket
93bb633010 Merge pull request #713 from alanyee/patch-1
Replace string formatting with logging laziness in __init__.py
2019-12-10 21:06:57 +02:00
evilsocket
dbb64e0fab Merge pull request #711 from dadav/fix/bugs
Unknown variable; Logic error
2019-12-10 19:40:57 +02:00
Alan Yee
fa8751017d Update __init__.py 2019-12-09 15:36:26 -08:00
dadav
9d56c97aa5 Unknown variable; Logic error 2019-12-09 20:12:34 +01:00
Evgeny Zelenin
10f7161240 voice.mo update 2019-12-09 21:52:23 +05:00
Evgeny Zelenin
9b02548176 del old voice.mo 2019-12-09 21:52:06 +05:00
Evgeny Zelenin
f5f47c4f88 voice.mo update 2019-12-09 21:50:50 +05:00
evilsocket
1523dfc1ef Merge pull request #701 from alanyee/patch-1
Update automata.py
2019-12-09 18:10:15 +02:00
evilsocket
a02960b56d Merge pull request #705 from hmax42/master
UI adjustments for waveshare1
2019-12-09 18:09:19 +02:00
evilsocket
b6f59f99d4 Merge pull request #707 from AliceGrey/master
Added text overflow checking for over 999 associations
2019-12-09 18:08:33 +02:00
Simone Margaritelli
09a00adab9 fix: added a plugin::callback level mutex to avoid calling a callback while a previous call is still running 2019-12-09 17:46:44 +02:00
AliceGrey
7fa30c2868 Added text overflow checking for over 999 associations 2019-12-08 17:16:05 -08:00
hmax42
774d9c693c Update defaults.yml 2019-12-08 16:26:14 +01:00
hmax42
87b6cf7d40 Merge branch 'master' of https://github.com/hmax42/pwnagotchi 2019-12-08 16:25:23 +01:00
hmax42
88928eec82 remove buttonshim 2019-12-08 16:25:07 +01:00
hmax42
60f7849838 Merge branch 'master' into pr/3 2019-12-08 08:46:24 +01:00
hmax42
3cf041617c Update memtemp.py 2019-12-08 08:44:20 +01:00
evilsocket
ee6c06f306 Merge pull request #700 from dadav/fix/auto-update-lock
Add Lock
2019-12-07 16:28:57 +02:00
dadav
2e22a17610 Add Lock 2019-12-07 15:27:41 +01:00
Simone Margaritelli
1615fc8817 releasing v1.4.1 2019-12-07 15:45:15 +02:00
Simone Margaritelli
714cb00610 misc: small fix or general refactoring i did not bother commenting 2019-12-07 15:44:03 +02:00
Simone Margaritelli
a0a790635a fix: fuck me for trusting people's PR without checking 10000 times 2019-12-07 15:43:10 +02:00
Simone Margaritelli
9d17be959d releasing v1.4.0 2019-12-07 15:08:17 +02:00
evilsocket
4b651cd17b Merge pull request #694 from Evg33/fr_waveshare144lcd
waveshare 1.44inch lcd hat
2019-12-07 14:11:25 +02:00
evilsocket
2f70512076 Merge pull request #693 from Nels885/improve-plugins-web-page
improvement of the plugins web page
2019-12-07 14:10:37 +02:00
evilsocket
b79c59c639 Merge pull request #698 from dadav/feature/usr1_handler
Add signal handler
2019-12-07 14:09:36 +02:00
evilsocket
56f7b67699 Merge pull request #699 from dadav/fix/add-lock-to-ohc
Add lock to onlinehashcrack plugin
2019-12-07 14:09:05 +02:00
dadav
1a8472268e Add signal handler 2019-12-07 09:36:56 +01:00
dadav
4fb7205281 Add lock 2019-12-07 09:30:05 +01:00
Alan Yee
f8ffab426b Update automata.py
Replace string formatting with logging laziness in automata.py
2019-12-06 12:20:54 -08:00
Evg33
b4daf19401 layout redesign 2019-12-06 20:11:37 +03:00
evilsocket
e04e053cee Merge pull request #690 from alanyee/patch-1
Replace string formatting with logging laziness in agent.py
2019-12-06 15:04:45 +02:00
evilsocket
4f153e3899 Merge pull request #689 from dadav/fix/bt-tether-lock
Add lock to bt-tether
2019-12-06 15:01:29 +02:00
Evg33
04720ecc42 memtemp plugin for waveshare.com/1.44inch-lcd-hat 2019-12-06 03:24:44 +03:00
Evg33
a12e2aafa5 gps plugin for waveshare.com/1.44inch-lcd-hat 2019-12-06 03:24:24 +03:00
Evg33
1721f67ec3 fr waveshare.com/1.44inch-lcd-hat 2019-12-06 03:24:01 +03:00
Nels885
7693e42aa1 Change the name of the CSS class 'element' to 'plugins-box' and centering the text 2019-12-05 11:49:34 +01:00
Nels885
2ae48a2ef2 Changing the display style of the plugins page 2019-12-05 11:15:29 +01:00
Alan Yee
663bca41cd Update agent.py
Leverage logging laziness rather than string formatting
2019-12-03 11:34:40 -08:00
dadav
ede01e50cd Add lock 2019-12-03 18:15:35 +01:00
evilsocket
19973574e7 Merge pull request #677 from dadav/fix/plugins_setup_ui
Fix/plugins setup ui
2019-12-03 11:44:57 +01:00
evilsocket
a019b4c778 Merge pull request #678 from dadav/fix/net-pos-bug
Add lock; make less verbose
2019-12-03 11:44:12 +01:00
evilsocket
526c5bed87 Merge pull request #680 from Nels885/update-french-translation
Update french translation
2019-12-03 11:42:47 +01:00
evilsocket
4d6136633a Merge pull request #682 from jakubmilkowski/master
fix: Prevent duplicate entries for uploaded pcaps
2019-12-03 11:42:22 +01:00
evilsocket
6d90b75d10 Merge pull request #684 from dadav/feature/session_stats_plugin
Add session-stats plugin
2019-12-03 11:41:20 +01:00
evilsocket
03695be807 Merge pull request #687 from alanyee/patch-1
Use list comprehension in setup.py
2019-12-03 11:40:34 +01:00
Alan Yee
6a97476732 Update setup.py
Use list comprehension
2019-12-02 13:32:36 -08:00
dadav
b5e620684b this is apparently needed 2019-12-02 19:22:36 +01:00
dadav
95557ab37d Axes information will be lost otherwise 2019-12-02 19:20:47 +01:00
dadav
988d093e36 Add session-stats plugin 2019-12-01 21:49:27 +01:00
hmax42
f563d71477 Update gps.py 2019-12-01 14:27:13 +01:00
hmax42
7b219fd139 Update memtemp.py 2019-12-01 14:27:10 +01:00
hmax42
42ed698583 Update memtemp.py 2019-12-01 08:06:14 +01:00
hmax42
6df7bcd885 add ws1 2019-12-01 07:56:09 +01:00
hmax42
1c299832ae add ws1 2019-12-01 07:56:03 +01:00
hmax42
11476433ca Merge pull request #2 from evilsocket/master
update
2019-12-01 07:49:23 +01:00
jakubmilkowski
6e57e131b3 fix: Prevent duplicate entries for uploaded pcaps
For the same reasons like described here https://github.com/evilsocket/pwnagotchi/issues/657 duplicated entries could be created in /root/.ohc_uploads

Signed-off-by: jakubmilkowski <jakub.milkowsky@gmail.com>
2019-11-30 22:44:03 +01:00
dadav
548b42ef20 Lock ui on change 2019-11-30 14:20:37 +01:00
dadav
99614c8cd4 Call on_ready 2019-11-30 14:01:35 +01:00
VOIRIN Lionel
e19ea999e2 Correction of some French translations 2019-11-30 12:51:53 +01:00
VOIRIN Lionel
2207a1eacf Updating the French translation 2019-11-30 10:54:38 +01:00
dadav
9509dd0aa5 Add lock; make less verbose 2019-11-30 10:05:43 +01:00
dadav
608904daf8 Call unload with ui arg 2019-11-30 09:43:39 +01:00
dadav
f973997cdb Call on_ui_setup when plugin reloads 2019-11-30 09:35:19 +01:00
evilsocket
9b594f7fb2 Merge pull request #669 from cdiemel/master
added on_unfiltered_wifi_list
2019-11-29 15:45:43 +01:00
evilsocket
b8eed4f52a Merge pull request #671 from Evg33/reboot
feature/plugin/web/reboot
2019-11-29 15:45:26 +01:00
evilsocket
ad510429fe Merge pull request #672 from dadav/feature/plugins_urls
Add urls to plugins
2019-11-29 15:44:58 +01:00
dadav
f5a94fde96 Add url to plugin 2019-11-28 21:55:20 +01:00
Evg33
855bda9104 feature/plugin/web/reboot 2019-11-28 23:02:22 +03:00
Casey Diemel
e72fd08fb4 added on_unfiltered_wifi_list
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-11-28 14:39:15 -05:00
evilsocket
e44ebac43f Merge pull request #627 from soebbing/improve-german-translations
Improve German translations slightly
2019-11-28 11:29:30 +01:00
evilsocket
b5ddb716e2 Merge pull request #660 from mbgroot/master
Updating the Russian translation
2019-11-28 11:28:54 +01:00
evilsocket
82e7e09fa1 Merge pull request #664 from dadav/feature/wpa-sec-download
Add wpa-sec password download
2019-11-28 11:28:36 +01:00
evilsocket
8b40e94ca8 Merge pull request #665 from dadav/feature/plugins_web_page
Add plugins page
2019-11-28 11:28:15 +01:00
dadav
cc5c46906f Add plugins page 2019-11-27 21:22:40 +01:00
dadav
7cb52ba33a Add wpa-sec password download 2019-11-27 18:51:37 +01:00
Evgeny Zelenin
07f8e7bd4a Update voice.po 2019-11-27 22:01:43 +05:00
Evgeny Zelenin
48dc751d13 Update voice.po 2019-11-27 12:09:24 +05:00
Evgeny Zelenin
3c154ffe0c Update voice.po 2019-11-27 02:58:16 +05:00
Evgeny Zelenin
167f559d73 Update voice.po 2019-11-27 02:54:48 +05:00
evilsocket
19775b7d27 Merge pull request #654 from dadav/fix/webcfg_check_for_error
Fix/webcfg check for error
2019-11-26 12:32:10 +01:00
evilsocket
48e3a372cc Merge pull request #658 from sayak-brm/master
[BUGFIX] Prevent duplicate entries for reported networks
2019-11-26 12:04:00 +01:00
Sayak Brahmachari
d2c44797e5 Prevent duplicate entries for reported networks
Due to duplicate entries in `/root/.api-report.json`, [this code](https://github.com/evilsocket/pwnagotchi/blob/master/pwnagotchi/plugins/default/grid.py#L90) incorrectly reports the number of pwned networks, resulting in incorrect stats on the [pwnagotchi.ai website](https://pwnagotchi.ai/).
2019-11-26 14:05:10 +05:30
dadav
a03443986b Parse to str 2019-11-25 20:08:20 +01:00
dadav
a7ea499fac Should fail before write 2019-11-25 19:47:23 +01:00
evilsocket
722a91655a Merge pull request #649 from xenDE/patch-4
webgpsmap: add filter for: SSID, MAC, isCracked, Password
2019-11-25 12:03:49 +01:00
xenDE
93e06d7f59 add filter for: SSID, MAC, isCracked, Password 2019-11-24 18:49:32 +01:00
evilsocket
7de5121033 Merge pull request #645 from xenDE/patch-3
fix gpio_buttons plugin: gpio needs to be a number
2019-11-23 11:30:28 +01:00
xenDE
83f741bbb0 fix: gpio needs to be a number
fixes gpio id as string in config
https://github.com/evilsocket/pwnagotchi/issues/643
2019-11-23 02:05:01 +01:00
evilsocket
a779fb9b0b Merge pull request #640 from xenDE/patch-2
cleanup, fixes and add handling of .paw-gps.json
2019-11-21 17:03:08 +01:00
xenDE
c4a007e72a cleanup, fixes and add handling of .paw-gps.json
cleanup logging, increase cache item count from 1024 to 2048, add handling of corrupt long/lat position null, added handling of .paw-gps.json files - tested with master
2019-11-20 15:45:16 +01:00
evilsocket
1a71615fa8 Merge pull request #635 from Arttumiro/patch-3
Update to using .paw-gps.json files
2019-11-20 10:11:16 +01:00
evilsocket
7a9f84f495 Merge pull request #638 from xslendix/master
Added romanian language
2019-11-20 10:11:06 +01:00
evilsocket
6e3f5a1181 Merge pull request #632 from daniel156161/master
fix backup.sh (find with type f for no zero byte files into archive)
2019-11-20 10:10:33 +01:00
root
d045ed5afa Added romanian language 2019-11-19 22:58:49 +00:00
Arttumiro
0ee0aaff37 Update to using .paw-gps.json files
Remove old link due to it not being too good, update file extension to .paw-gps.json for better support on problems with webgpsmap.
2019-11-19 15:38:11 +02:00
evilsocket
0fb81a11c4 Merge pull request #629 from xenDE/patch-1
fix gps iso-datetime parsing
2019-11-19 11:30:15 +01:00
daniel156161
cfc0ad1b48 fix backup.sh (find with type f for no zero byte files into archive) 2019-11-19 05:03:21 +01:00
xenDE
3351c251ef fix gps timestamp parsing
problem on timestamp parsing if microseconds are more then 6 numbers.

will fix bug reported in this pr: https://github.com/evilsocket/pwnagotchi/pull/619

tested with testdata from https://github.com/xenDE/pwnagotchi-plugin-webgpsmap/tree/master/handshakes.gps-map-test

before:

[2019-11-19 00:37:51,946] [INFO] webgpsmap: scanning /root/handshakes.gps-map-test
[2019-11-19 00:37:52,022] [INFO] webgpsmap: Found 4 .(geo|gps).json files from 5 handshakes. Fetching positions ...
[2019-11-19 00:37:52,144] [ERROR] Lng is 0
[2019-11-19 00:37:52,241] [ERROR] Invalid isoformat string: '2019-11-14T12:30:41.097414739+01:00'
[2019-11-19 00:37:52,280] [ERROR] Lng is 0
[2019-11-19 00:37:52,329] [INFO] webgpsmap loaded 2 positions

after:

[2019-11-19 00:48:04,652] [INFO] webgpsmap: scanning /root/handshakes.gps-map-test
[2019-11-19 00:48:04,693] [INFO] webgpsmap: Found 5 .(geo|gps).json files from 6 handshakes. Fetching positions ...
[2019-11-19 00:48:04,760] [ERROR] Lng is 0
[2019-11-19 00:48:04,822] [ERROR] Lng is 0
[2019-11-19 00:48:04,850] [INFO] webgpsmap loaded 3 positions
2019-11-19 00:56:59 +01:00
Hendrik Söbbing
d9d399429c Improve German translations slightly
Signed-off-by: Hendrik Söbbing <h.soebbing@shopware.com>
2019-11-18 18:31:11 +01:00
hmax42
b1ad247e11 Merge pull request #1 from evilsocket/master
pull
2019-11-18 17:19:52 +01:00
evilsocket
b5a148f287 Merge pull request #625 from neutralinsomniac/invert_led_blink
fix: apparently for the led, 0 is ON and 1 is OFF
2019-11-18 15:56:50 +01:00
Jeremy O'Brien
7138f6469b fix: apparently for the led, 0 is ON and 1 is OFF
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-11-18 08:57:10 -05:00
Simone Margaritelli
785d678e30 releasing v1.3.0 2019-11-18 14:12:13 +01:00
Simone Margaritelli
9c8784e533 fix: reload inbox every 15 seconds 2019-11-18 13:24:58 +01:00
Simone Margaritelli
fd288b4acd misc: small fix or general refactoring i did not bother commenting 2019-11-18 13:21:44 +01:00
evilsocket
b704614254 Merge pull request #623 from Arttumiro/patch-2
Add link to better guide to paw-gps.py
2019-11-18 12:29:44 +01:00
Arttumiro
2dc36651df Add link to better guide to paw-gps.py
Got permission from LeonT for this
2019-11-18 13:27:30 +02:00
evilsocket
d8d6d52eda Merge pull request #617 from andrewbeard/master
Fix for issue #616
2019-11-16 10:09:49 +01:00
Andrew Beard
43c5ab7ecf - Fix the temperature symbol when using something other than celsius
- Add defaults so we don't throw an exception if an invalid scale is
selected. Bad things happen if you spell fahrenheit wrong.
2019-11-16 01:29:02 -05:00
evilsocket
de62424dbc Merge pull request #615 from neutralinsomniac/fix_backup_script_default_username
fix: don't use $USERNAME as default username for backup/restore scripts, as this is usually defined on linux hosts as the current logged in user
2019-11-15 14:59:53 +01:00
Jeremy O'Brien
8c51936c13 fix: don't use $USERNAME as default username for backup/restore scripts, as this is usually defined on linux hosts as the current logged in user
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-11-15 07:59:32 -05:00
Simone Margaritelli
87e46610f9 fix: --clear does not start the agent anymore 2019-11-15 12:27:53 +01:00
evilsocket
a96dead519 Merge pull request #606 from Arttumiro/master
Fixed Paw-Gps config, added a - mark
2019-11-15 12:06:06 +01:00
evilsocket
8ed2950eb5 Merge pull request #607 from Arttumiro/patch-1
Fixes to paw-gps.py
2019-11-15 12:05:58 +01:00
evilsocket
6f8133b2b8 Merge pull request #608 from benleb/add-spacing-to-gps
decrease spacing in gps ui
2019-11-15 12:05:07 +01:00
evilsocket
16afa87112 Merge branch 'master' into add-spacing-to-gps 2019-11-15 12:05:00 +01:00
evilsocket
ed22343877 Merge pull request #612 from budd3993/fix-webgpsmap-negatives
webgpsmap plugin - fixed check for nonzero lat/long
2019-11-15 12:04:00 +01:00
evilsocket
c70f2c30e9 Merge pull request #613 from wystans/master
Added signal strength to logging messages
2019-11-15 12:03:39 +01:00
Wystan Schmidt
5111490c70 Added rssi info to logging messages
Signed-off-by: Wystan Schmidt <wystans@gmail.com>
2019-11-14 20:13:50 -07:00
Josh Bauer
59ae35372e fixed check for nonzero lat/long 2019-11-14 21:15:12 -05:00
evilsocket
5f593a4231 Merge pull request #609 from benleb/more-pythonic
f-strings and double quotes in gps plugin
2019-11-14 23:05:43 +01:00
Arttumiro
56cc872daa Update paw-gps.py 2019-11-14 22:29:58 +02:00
Arttumiro
6e1490da78 Fix on_handshake, whole plugin should work now
Add the else: so if the ip is set in the options the plugin actually works.
2019-11-14 22:29:43 +02:00
Ben Lebherz
69597103b5 use f-strings and double quotes in gps plugin 2019-11-14 15:57:43 +01:00
Ben Lebherz
96ca5dd8e3 decrease spacing in gps ui 2019-11-14 15:46:12 +01:00
evilsocket
3efa3a935a Merge pull request #601 from benleb/add-gateway-option
add gateway option to bt-tether
2019-11-14 11:04:30 +01:00
evilsocket
39ccd141eb Merge pull request #602 from benleb/add-gps-coords-to-ui
show gps coords of last handshake in ui
2019-11-14 11:04:12 +01:00
evilsocket
1a30b52a90 Merge pull request #605 from benleb/make-label-spacing-dynamic
make label to value space configurable to better fit small fonts
2019-11-14 11:03:28 +01:00
Arttumiro
8965ad9272 change default ip of paw-gps, it needs port too.
Change default ip from 192.168.44.1 (which is the ip address of an android on bt tether) to 192.168.44.1:8080 so it has the default port paw-gps opens on, which is 8080.
2019-11-14 11:45:39 +02:00
Arttumiro
5dae0ce982 Fixed Paw-Gps, added a - mark to the config.
Before, paw-gps was set as pawgps in the config, this was different than the filename (paw-gps.py) so it didnt work, this request should fix that. (if this is the place that sets /etc/pwnagotchi/default.yml, this is my first PR so sorry im dumb)
2019-11-14 11:26:32 +02:00
Ben Lebherz
92266a783a make label to value space configurable to better fit small fonts 2019-11-13 21:11:21 +01:00
Ben Lebherz
9e656d4ea6 show gps coords of last handshake in ui 2019-11-13 15:38:21 +01:00
Ben Lebherz
1d255b577d add gateway option to bt-tether 2019-11-13 15:37:20 +01:00
Simone Margaritelli
1ff14c05a9 misc: small fix or general refactoring i did not bother commenting 2019-11-13 15:05:21 +01:00
Simone Margaritelli
ab63ecccd7 new: macos connection share script now autodetects the usb interface and uses en0 as default upstream (closes #597) 2019-11-13 14:54:49 +01:00
Simone Margaritelli
a7e37115d9 misc: small fix or general refactoring i did not bother commenting 2019-11-13 14:38:39 +01:00
Simone Margaritelli
b1d8aa3ba1 misc: several improvements on the web ui 2019-11-13 14:37:13 +01:00
evilsocket
6e26463278 Merge pull request #599 from ahsec/add_spanish_support
Adding support for Spanish language
2019-11-13 11:39:06 +01:00
evilsocket
7261073073 Merge pull request #600 from lexusburn/patch-1
small typo fix
2019-11-13 11:38:54 +01:00
lexusburn
a02c1d6d92 small typo fix 2019-11-13 09:17:18 +01:00
Angel
40caf3f51a Adding support for Spanish language
Signed-off-by: Angel <ahsec>
2019-11-12 22:58:02 -08:00
Simone Margaritelli
21f1273bd8 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-11-13 01:32:14 +01:00
Simone Margaritelli
a8c07ba997 fix: supporting channels greater than 140 for 5g (closes #583) 2019-11-13 01:32:05 +01:00
evilsocket
6bd09c7f43 Merge pull request #595 from qbit/macos_and_posix_fix
Remove '-w' as macOS doesn't have it. Fix var expansion in dash.
2019-11-13 01:17:58 +01:00
Aaron Bieber
1830a19b37 Remove '-w' as macOS doesn't have it. Fix var expansion in dash.
Signed-off-by: Aaron Bieber <aaron@bolddaemon.com>
2019-11-12 16:44:46 -07:00
Simone Margaritelli
9dcc647656 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-11-13 00:11:59 +01:00
Simone Margaritelli
8fcfd4cafd fix: plugin events dispatch is now asynchronous (fixes #592) 2019-11-13 00:11:50 +01:00
evilsocket
369d7a65a8 Merge pull request #578 from michelep/master
Add support for SpotPear 2,4inch LCD display via framebuffer
2019-11-12 23:58:30 +01:00
evilsocket
d7ad8ee0d7 Merge pull request #594 from dipsylala/additional_agent_properties
Providing APs/APs per channel and current channel as R/O from Agent
2019-11-12 23:57:46 +01:00
Simone Margaritelli
a5f9b9b2ee new: encountered units 2019-11-12 23:56:59 +01:00
Dispsylala
b266671864 Providing APs/APs per channel and current channel as R/O from Agent 2019-11-12 22:51:10 +00:00
Simone Margaritelli
c47b8f2d11 misc: small fix or general refactoring i did not bother commenting 2019-11-12 23:25:56 +01:00
Simone Margaritelli
8129fb7dd2 misc: small fix or general refactoring i did not bother commenting 2019-11-12 23:13:32 +01:00
Simone Margaritelli
c16cabc852 new: searchbox in the pwnmail 2019-11-12 23:08:39 +01:00
Simone Margaritelli
9a7de86057 new: fingerprint qrcode 2019-11-12 23:04:54 +01:00
Simone Margaritelli
440f2a470a new: added basic authentication to the web ui 2019-11-12 21:49:23 +01:00
Simone Margaritelli
81a89d43e0 misc: refactored ui.display.video as ui.web 2019-11-12 21:19:31 +01:00
Simone Margaritelli
91b409053b fix: using static assets 2019-11-12 21:03:21 +01:00
Simone Margaritelli
df01a03a4b new: pwngrid web client 2019-11-12 20:18:02 +01:00
evilsocket
e2be21004d Merge pull request #589 from luclu7/patch-1
Fixed a small typo in bt-tether
2019-11-12 13:18:42 +01:00
Luclu7
0f3d9db01d Fixed a small typo in bt-tether 2019-11-12 11:46:04 +01:00
evilsocket
19abc17816 Merge pull request #581 from dwi/patch-1
Small UPS Lite typo fix
2019-11-12 11:39:59 +01:00
evilsocket
4b9ebc2512 Merge pull request #586 from benleb/patch-2
shift word
2019-11-12 11:39:16 +01:00
evilsocket
41a3fad43e Merge pull request #587 from benleb/patch-3
fix baudrate option name in gps plugin
2019-11-12 11:39:00 +01:00
Ben Lebherz
f4b886cf7b fix baudrate option name 2019-11-12 08:37:36 +01:00
Ben Lebherz
0eb8e1829e shift word 2019-11-12 07:40:48 +01:00
hmax42
30b1874a0a New defaults for buttonshim 2019-11-11 19:08:12 +01:00
hmax42
b903f636d2 Blinking works now freely 2019-11-11 19:04:56 +01:00
dwi
52b40f049e Small UPS Lite typo fix
Fixing dfd534ac41 that fixes #521
2019-11-11 17:43:20 +01:00
evilsocket
3df35ef03b Merge pull request #580 from qbit/bkp_rstr_compat
Make backup / restore use POSIX shell for portability.
2019-11-11 17:37:11 +01:00
evilsocket
e87bcc4744 Merge pull request #577 from benleb/patch-1
fix completely broken gps plugin
2019-11-11 17:36:12 +01:00
Simone Margaritelli
dfd534ac41 fix: fixed ups_lite plugin layout (closes #521) 2019-11-11 17:35:45 +01:00
Aaron Bieber
0b2c156d29 Make backup / restore use POSIX shell for portability.
backup.sh:
  - Add use getopts for a more friendly user interface.
  - Add timeout to ping check.
  - Add unix epoch to backup file names.
  - Backup ssh information (/etc/ssh, $USER/.ssh).

restore.sh:
  - Add use getopts for a more friendly user interface.
  - Add timeout to ping check.
  - If user doesn't specify a backup file to restore, attempt to
    find the latest for the host name passed in.

Signed-off-by: Aaron Bieber <aaron@bolddaemon.com>
2019-11-11 07:49:24 -07:00
O-Zone
14064c3b5b Add support for SpotPear 2,4inch LCD display via framebuffer 2019-11-11 14:15:48 +01:00
Ben Lebherz
313fd66634 fix completely broken gps plugin :D 2019-11-11 14:12:38 +01:00
evilsocket
c939af4248 Merge pull request #575 from xenDE/master
added webgpsmap plugin
2019-11-11 11:00:57 +01:00
xenDE
e934181606 webgpsmap default disabled
was enabled default by mistake (copy&paste)
2019-11-11 10:59:54 +01:00
evilsocket
2505cbf14c Merge pull request #562 from DaniloNC/master
Add support to whitelist by MAC and MAC vendor
2019-11-11 10:51:57 +01:00
evilsocket
b2c6de72cd Merge pull request #574 from budd3993/fix-memtemp-inky
fixed memtemp location for inky display
2019-11-11 10:51:22 +01:00
evilsocket
307b3890f1 Merge pull request #567 from LaurentFough/master
Create .editorconfig
2019-11-11 10:50:26 +01:00
xenDE
b9a909de2b add handling for empty position data 2019-11-10 21:56:36 +00:00
Łaurent ʘ❢Ŧ Ŧough
b180f16aa6 Update .editorconfig
Removed; defaults that may not be used by everyone
2019-11-10 12:56:52 -08:00
Łaurent ʘ❢Ŧ Ŧough
2d517e3de5 Update .editorconfig
Removed *.py section
2019-11-10 12:55:28 -08:00
xenDE
a1746da7f1 comment default gpio button command examples 2019-11-10 19:45:43 +00:00
xenDE
1a1a70d6e8 added webgpsmap plugin 2019-11-10 19:34:49 +00:00
Josh Bauer
229e2671e8 fixed memtemp location for inky display
Signed-off-by: Josh Bauer <joshbauer3@gmail.com>
2019-11-10 14:08:33 -05:00
hmax42
92c1b6b005 blinking with static colors 2019-11-10 13:44:35 +01:00
Simone Margaritelli
a2ac679499 new: pwnfile link in the web ui (closes #557) 2019-11-10 13:24:56 +01:00
evilsocket
d7e1c59709 Merge pull request #569 from danielhoherd/improve-backup
Ignore backup archives. Use 'find | xargs' to handle missing files.
2019-11-10 13:11:30 +01:00
evilsocket
a5ed09cd08 Merge pull request #566 from xenDE/master
prevent double execution on gpio buttons
2019-11-10 13:10:49 +01:00
Simone Margaritelli
8c83f8129c fix: added memtemp defaults (fixes for PR #564) 2019-11-10 13:10:16 +01:00
hmax42
eddfdb3ebc Plugin for the Pimoroni Button Shim
this plugin enabled support for the 5 buttons of the shim. the rgb led is not supported yet. an example for config.yml lloks like this

      buttonshim:
        enabled: true
        buttons:
          - "date >> /home/pi/buttonA.txt"
          - "date >> /home/pi/buttonB.txt"
          - "date >> /home/pi/buttonC.txt"
          - "date >> /home/pi/buttonD.txt"
          - "date >> /home/pi/buttonE.txt"
2019-11-10 08:54:04 +01:00
Daniel Hoherd
7ca1168fed Ignore backup archives. Use 'find | xargs' to handle missing files. Correct file type in comments.
Signed-off-by: Daniel Hoherd <daniel.hoherd@gmail.com>
2019-11-09 17:20:42 -08:00
Łaurent ʘ❢Ŧ Ŧough
d41e5c1152 Create .editorconfig
Reasonably tame .editorconfig for help with editting the .py & especially the YAML files
2019-11-09 14:18:03 -08:00
xenDE
25eee18e7b verhindern von doppelten ausführungen
i had with the old value 250 many double executions, despite short push switches. The new value 600 prevents this. Tested with volume buttons.
2019-11-09 19:50:47 +01:00
evilsocket
38144a7abb Merge pull request #561 from mil1200/master
Added Slovak language
2019-11-09 10:30:49 +01:00
evilsocket
1f17d3cbbe Merge pull request #564 from bensmith83/patch-1
Add Fahrenheit and Kelvin temperature scales to memtemp.py
2019-11-09 10:30:26 +01:00
bensmith83
1da59b50b4 Add Fahrenheit and Kelvin temperature scales to memtemp.py 2019-11-08 19:50:33 -05:00
danilonc
1130c72098 Add support to whitelist by MAC and MAC vendor 2019-11-08 16:18:42 -06:00
Milan Kyselica
6b99deb7bd Update voice.po 2019-11-08 20:13:05 +01:00
Milan Kyselica
c3ed3509e9 + SK voice.mo 2019-11-08 20:12:23 +01:00
Milan Kyselica
e3a2e8c811 Delete voice.po 2019-11-08 20:12:04 +01:00
Milan Kyselica
89046bf0c5 + SK voice.po 2019-11-08 20:11:51 +01:00
Milan Kyselica
4cc61322de + SK voice.po 2019-11-08 20:09:53 +01:00
evilsocket
94521f2174 Merge pull request #559 from dadav/feature/webcfg-plugin
Add webcfg
2019-11-08 18:43:48 +01:00
dadav
b50acd364c Add webcfg 2019-11-08 17:55:48 +01:00
Simone Margaritelli
9bc7fcccb3 new: the grid plugin now triggers an on_unread_inbox event that other plugins can intercept (see led plugin) 2019-11-08 15:49:49 +01:00
Simone Margaritelli
bd61196c3c new: the auto-update plugin now triggers an on_updating event that other plugins can intercept (see led plugin) 2019-11-08 15:47:12 +01:00
Simone Margaritelli
186042aa20 misc: small fix or general refactoring i did not bother commenting 2019-11-08 15:43:57 +01:00
Simone Margaritelli
78bf801273 misc: small fix or general refactoring i did not bother commenting 2019-11-08 15:40:54 +01:00
Simone Margaritelli
89450ec1bd new: implemented led plugin (closes #522) 2019-11-08 15:31:40 +01:00
Simone Margaritelli
09f80cc842 fix: fixed typo in the example plugin 2019-11-08 14:08:43 +01:00
Simone Margaritelli
fcb5c87ef0 fix: enabling fstrim.timer from setup.py for updating users 2019-11-08 13:36:27 +01:00
Simone Margaritelli
bf0e480266 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-11-08 13:28:53 +01:00
Simone Margaritelli
fce57ad8eb misc: small fix or general refactoring i did not bother commenting 2019-11-08 13:28:37 +01:00
evilsocket
425fe7e55a Merge pull request #551 from Spindel/devel
Enable fstrim.timer to increase SDCard lifetime
2019-11-08 13:26:49 +01:00
Simone Margaritelli
5760864495 misc: small fix or general refactoring i did not bother commenting 2019-11-08 13:25:55 +01:00
Simone Margaritelli
3d9c559cdb misc: small fix or general refactoring i did not bother commenting 2019-11-08 13:20:14 +01:00
Simone Margaritelli
97a019fe25 new: implemented log rotation (closes #527) 2019-11-08 13:01:50 +01:00
Simone Margaritelli
8d5834232b fix: fixed exit after --version 2019-11-08 12:07:14 +01:00
evilsocket
ebc161e82f Merge pull request #554 from uzerai/master
Add  norwegian locale.
2019-11-08 10:58:30 +01:00
Edvard Botten
9485e53484 Add norwegian translation files.
Signed-off-by: Edvard Botten <edvbot@gmail.com>
2019-11-07 22:02:28 +00:00
D.S. Ljungmark
0d66f93ef3 Enable fstrim.timer to increase SDCard lifetime
fstrim timer triggers weekly to issue TRIM/DISCARD on devices that support it,
which includes SD and MMC devices.

This marks all unused diskspace as available for internal garbage collection
and wear levelling on the card.  It's preferrable to use the timer to the
discard option, as it involves a one-off cost of latency over a global slowing
down of all write or erase requests that the `discard` mount option does.
2019-11-07 17:41:17 +01:00
evilsocket
ad80fab554 Merge pull request #545 from dadav/fix/webhook_arguments
Changed webhook arguments, added exception handling, added logrotation
2019-11-07 11:06:14 +01:00
dadav
b7380018f1 Changed webhook arguments and add exception handling 2019-11-07 11:03:37 +01:00
Simone Margaritelli
2ea8e7fe6b misc: moved non-core and problematic plugins to separate repository (closes #542) 2019-11-07 10:59:40 +01:00
evilsocket
e23e1affae Merge pull request #538 from neutralinsomniac/normalize_waveshare29inch_config
normalize the waveshare29inch config string
2019-11-07 10:39:43 +01:00
evilsocket
8d8333b586 Merge pull request #546 from dadav/fix/gpio-plugin
Fix options of gpio-plugin
2019-11-07 10:38:16 +01:00
dadav
5712f5cd51 Fix arguments 2019-11-07 07:37:41 +01:00
Jeremy O'Brien
9cc15403c3 normalize the waveshare29inch config string
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-11-06 09:07:27 -05:00
evilsocket
15fa7039e8 Merge pull request #535 from deveth0/deveth0-523-webui
#523: Add some styling to webui
2019-11-06 11:31:40 +01:00
Alex Muthmann
f83c820b38 Fix missing js 2019-11-06 11:28:23 +01:00
evilsocket
323c9a74cc Merge pull request #531 from deveth0/deveth0-netpos-logging
Additional Logging for net-pos plugin
2019-11-06 11:24:14 +01:00
evilsocket
8a2d6eac9d Merge pull request #537 from FrixosTh/patch-3
Bug Fix on AircrackOnly Plugin preventing it to load
2019-11-06 11:23:36 +01:00
FrixosTh
61d8e28aad Bug Fix on AircrackOnly Plugin preventing it to load
Unnecessary/Wrong call to the super init method prevents AircrackOnly to load during startup
2019-11-06 01:46:48 +02:00
Alex Muthmann
337ebd6f9f Add some style 2019-11-06 00:06:19 +01:00
amuthmann
399dbf2b41 Fixes #523: Add some style 2019-11-06 00:03:29 +01:00
amuthmann
f952bcd298 Fixes #523: Add some style 2019-11-06 00:03:17 +01:00
Alex Muthmann
9dc7c92c86 Additional Logging for net-pos plugin to simplify search for broken files
I currently have some broken net-pos files on my device and the logging does not provide enough information to find the invalid files. I'd suggest to log the path.
2019-11-05 21:54:37 +01:00
Simone Margaritelli
9e92201d82 releasing v1.2.1 2019-11-05 19:11:37 +01:00
Simone Margaritelli
4e592df6d8 fix: fixed a bug which prevented rebooting 2019-11-05 19:07:16 +01:00
Simone Margaritelli
403ee242a6 releasing v1.2.0 2019-11-05 18:54:42 +01:00
Simone Margaritelli
106d72c4a2 reverted 5ddc2d7080 2019-11-05 18:51:01 +01:00
Simone Margaritelli
5ddc2d7080 fix: fixed issue with webui in landcape (fixes #523) 2019-11-05 18:30:09 +01:00
evilsocket
52f1111a5b Merge pull request #525 from dadav/fix/backup-loop
Add max_tries param
2019-11-05 18:25:44 +01:00
dadav
346773f790 Add max_tries param 2019-11-05 18:02:36 +01:00
Simone Margaritelli
9264b837c8 misc: small fix or general refactoring i did not bother commenting 2019-11-05 15:56:30 +01:00
Simone Margaritelli
81032fe5e3 misc: refactored webui into separate files instead of strings 2019-11-05 15:51:26 +01:00
Simone Margaritelli
2aa73d1a7e misc: small fix or general refactoring i did not bother commenting 2019-11-05 15:11:38 +01:00
Simone Margaritelli
b796384345 new: webui status pages reload /ui after a given interval 2019-11-05 15:04:58 +01:00
Simone Margaritelli
a6ca99c693 misc: small fix or general refactoring i did not bother commenting 2019-11-05 15:01:58 +01:00
Simone Margaritelli
60d9fd46ae misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:57:22 +01:00
Simone Margaritelli
de71d18a72 misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:52:54 +01:00
Simone Margaritelli
aba5b938bc misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:48:26 +01:00
Simone Margaritelli
0830e0c74b misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:37:42 +01:00
Simone Margaritelli
cf8a4da9e7 misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:33:16 +01:00
Simone Margaritelli
80e2cdcd8d refact: using flask templating 2019-11-05 14:26:35 +01:00
Simone Margaritelli
a5cfb9aa8b misc: small fix or general refactoring i did not bother commenting 2019-11-05 14:03:56 +01:00
Simone Margaritelli
62a0cc6276 fix: suppress flask logging 2019-11-05 14:03:15 +01:00
Simone Margaritelli
f8523eb382 fix: added flask requirements 2019-11-05 13:55:35 +01:00
Simone Margaritelli
58b0b0fea0 fix: using try/finally to return the html and then call the action 2019-11-05 11:03:41 +01:00
evilsocket
bdf585afe5 Merge pull request #518 from dadav/fix/bt-tet-loaded-msg
More bt-tether fixes
2019-11-05 10:48:19 +01:00
evilsocket
b7d1c82788 Merge pull request #519 from dadav/feature/flask_migration
Migrate to flask
2019-11-05 10:47:51 +01:00
evilsocket
74838d6b96 Merge pull request #520 from gkrs/master
Updated polish language pack. New messages translated.
2019-11-05 10:47:08 +01:00
dadav
7fc46ddcf6 Add restart route 2019-11-04 18:43:33 +01:00
dadav
4503e71bfb Rebased 2019-11-04 18:38:12 +01:00
dadav
11fb95d299 Add CSRF support 2019-11-04 18:31:58 +01:00
dadav
0aaeeb8011 First step 2019-11-04 18:29:26 +01:00
dadav
3e1f3d5eec Add deps 2019-11-04 18:28:42 +01:00
dadav
86a3443b8d Handle exception if no Interface found 2019-11-04 17:55:16 +01:00
dadav
806efa1fc2 More consistency 2019-11-04 17:45:53 +01:00
dadav
537519dea6 Fix typo 2019-11-04 17:44:53 +01:00
Simone Margaritelli
0c1d98f2ab misc: small fix or general refactoring i did not bother commenting 2019-11-04 17:44:35 +01:00
dadav
4852b3f59e Make bt-tet lil bit more verbose 2019-11-04 17:41:27 +01:00
Simone Margaritelli
364af70ad5 new: button to restart in auto or manu mode 2019-11-04 17:35:06 +01:00
Simone Margaritelli
e336fca0de fix: fixed race condition (again) on override files 2019-11-04 17:33:35 +01:00
Simone Margaritelli
00e7c04980 misc: small fix or general refactoring i did not bother commenting 2019-11-04 14:30:22 +01:00
evilsocket
2549433e34 Merge pull request #517 from neutralinsomniac/fix_pixelated_css
fix: use a css class for the pixelated property, since apparently this still isn't standardized among different browsers
2019-11-04 14:24:55 +01:00
Jeremy O'Brien
9f9fca02e5 fix: use a css class for the pixelated property, since apparently this still isn't standardized among different browsers
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-11-04 08:19:13 -05:00
gkrs
6945e260bd Updated polish language pack. New messages translated.
Signed-off-by: gkrs <457603+gkrs@users.noreply.github.com>
2019-11-04 13:07:43 +01:00
evilsocket
c21986488d Merge pull request #514 from xenDE/master
add timestamp to net-pos plugin, https://github.com/evilsocket/pwnago…
2019-11-04 12:49:41 +01:00
Simone Margaritelli
b52ceae2ee misc: small fix or general refactoring i did not bother commenting 2019-11-04 11:44:24 +01:00
Simone Margaritelli
19fc25d508 new: reporting version on startup (closes #504) 2019-11-04 11:32:09 +01:00
Simone Margaritelli
ba22b7d5d7 misc: basic refactoring of #502 2019-11-04 11:13:51 +01:00
evilsocket
59019efad0 Merge pull request #512 from edmael/web_reboot
Added "Reboot into AUTO mode" button in web ui
2019-11-04 11:07:22 +01:00
evilsocket
20aa0d1909 Merge pull request #510 from dwi/patch-1
Unblurred image rendering in browsers
2019-11-04 11:07:10 +01:00
evilsocket
c56c6bb8f5 Merge pull request #513 from dadav/fix/bt-tet-silence
Make bt-tet less verbose
2019-11-04 11:05:18 +01:00
xenDE
1e426f7411 add timestamp to net-pos plugin, https://github.com/evilsocket/pwnagotchi/issues/308
added timestam as "ts" var in both .json files.
tested with old plugin format.
2019-11-04 00:16:50 +01:00
dadav
aeb6002e10 Make bt-tet less verbose 2019-11-03 23:25:55 +01:00
Edoardo Maria Elidoro
dc2362c371 Added "Reboot into AUTO mode" button in web ui
As requested in issue #502
2019-11-03 22:57:32 +01:00
dwi
d6c0ec0dfd Unblurred image rendering in browsers
Unblurred image rendering in browsers. Affects both desktop and mobile image rendering.

![Before and after](https://i.imgur.com/pffQREV.png)
2019-11-03 22:14:43 +01:00
evilsocket
04e551600d Merge pull request #471 from neutralinsomniac/ohc_whitelist
Add whitelist support to onlinehashcrack plugin
2019-11-03 16:54:44 +01:00
evilsocket
62983dfea5 Merge pull request #478 from opteeks/master
Adding 2.9inch Display support
2019-11-03 16:48:55 +01:00
evilsocket
b2c812d05d Merge pull request #501 from damoklov/master
Added Ukrainian language
2019-11-03 15:57:54 +01:00
evilsocket
7ba9b35d06 Merge pull request #507 from FrixosTh/patch-2
Bug Fix on AircrackOnly.py plugin
2019-11-03 15:57:38 +01:00
FrixosTh
b4b14ba9fd Bug Fix on AircrackOnly.py plugin
The code will always delete the pcap file unless there is a PMKID due to the structure of the if statements. Added a new variable handshakeFound that will allow the file not to be deleted if there is a handshake and also it will scan for PMKID only if no handshake is found... If no handshake is found and no PMKID, only then the file is marked as to be deleted
2019-11-03 02:31:13 +02:00
opteeks
1ba3a69651 Merge branch 'master' into master 2019-11-02 13:48:11 -07:00
damoklov
0aef199131 Added Ukrainian language
Signed-off-by: damoklov <mishanya@protonmail.com>
2019-11-02 16:47:13 +02:00
evilsocket
ace61836e5 Merge pull request #496 from dadav/fix/bt-tet-defaults
Fix bt-tether config
2019-11-02 12:13:08 +01:00
evilsocket
d04f124add Merge pull request #498 from LuckyFishGeek/ch
Add Chinese translation version 0.0.1
2019-11-02 12:12:50 +01:00
LuckyFish
bc1db7ceea Add files via upload 2019-11-02 09:42:54 +08:00
dadav
fd506b1533 Fix bt-tether config 2019-11-01 21:42:02 +01:00
evilsocket
6c44a687b1 Merge pull request #492 from dadav/feature/multi-device-tether
Add multi bt-tether support
2019-11-01 20:19:22 +01:00
dadav
a2bb66ad57 Fix case 2019-11-01 20:12:04 +01:00
Jeremy O'Brien
61af8b4762 Add whitelist support to onlinehashcrack plugin
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-11-01 15:08:05 -04:00
dadav
9b58fed862 Typo 2019-11-01 18:23:55 +01:00
dadav
53ae8ea1cf Add check if connected but no interface created 2019-11-01 18:13:38 +01:00
dadav
5b66d687c4 Add multi bt-tether support 2019-11-01 18:00:07 +01:00
Simone Margaritelli
4b74de48bf misc: small fix or general refactoring i did not bother commenting 2019-11-01 17:49:50 +01:00
Simone Margaritelli
22e76f956c fix: fixed memtemp for waveshare v2 2019-11-01 17:45:53 +01:00
Simone Margaritelli
4418492637 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-11-01 15:53:39 +01:00
Simone Margaritelli
31a89cbe4b new: added new angry state (closes #486) 2019-11-01 15:53:31 +01:00
evilsocket
d91f49d596 Merge pull request #490 from dadav/fix/grid
Fix debug msg to fit new plugin class
2019-11-01 14:57:31 +01:00
dadav
66dc03ec05 Fix debug msg to fit new plugin class 2019-11-01 14:25:20 +01:00
Simone Margaritelli
2f948306eb misc: refactored plugin system to use classes 2019-11-01 13:51:45 +01:00
Simone Margaritelli
ae330dc0b5 fix: don't reset network interfaces configuration if not needed (closes #483) 2019-11-01 12:12:37 +01:00
evilsocket
e06f2a32e8 Merge pull request #487 from dadav/fix/fix-bt-disconnect-bug
Add reference to network object (bt-tether fix)
2019-11-01 10:45:33 +01:00
evilsocket
e184176ae4 Merge pull request #488 from dadav/feature/version-option
Add version option
2019-11-01 10:45:15 +01:00
dadav
1827ee564c Add version option 2019-11-01 10:04:36 +01:00
dadav
bfdaffa14b Add reference to network object 2019-11-01 09:20:06 +01:00
evilsocket
53f99f4c28 Merge pull request #485 from neutralinsomniac/backup_script_enhancements
enhancement: Improve the backup script
2019-10-31 19:06:32 +01:00
Jeremy O'Brien
3efa96b292 enhancement: Improve the backup script
- Significantly decrease time it takes to save a backup
- Remove host dependency on 'zip' binary
- Preserve file attributes on backed-up files
- Avoid copying files on the pi itself to /tmp

Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-10-31 14:02:07 -04:00
Simone Margaritelli
8118a10a6a new: auto-update is now enabled by default 2019-10-31 18:24:43 +01:00
Simone Margaritelli
bd63f71a1d fix: +x to /usr/bin/* while creating the .img 2019-10-31 17:25:21 +01:00
Simone Margaritelli
31d401e03b fix: increased delay before shutting down to allow slower displays to update (closes #446) 2019-10-31 15:39:59 +01:00
Simone Margaritelli
3c32bbb582 releasing v1.1.1 2019-10-31 14:50:03 +01:00
Simone Margaritelli
03067da005 misc: small fix or general refactoring i did not bother commenting 2019-10-31 14:49:44 +01:00
Simone Margaritelli
64aad56fba releasing v[3~1.1.1 2019-10-31 14:47:51 +01:00
Simone Margaritelli
4240d05872 misc: small fix or general refactoring i did not bother commenting 2019-10-31 14:20:35 +01:00
evilsocket
f03e07f0cf Merge pull request #472 from neutralinsomniac/grid_handle_malformed_filenames
fix: don't attempt to parse/upload pcaps with malformed filenames
2019-10-31 14:17:00 +01:00
Simone Margaritelli
13064879e0 fix: fixed, refactored and centralized launchers logic (closes #473) 2019-10-31 14:14:13 +01:00
Simone Margaritelli
96c617e152 misc: small fix or general refactoring i did not bother commenting 2019-10-31 12:56:27 +01:00
Simone Margaritelli
783ac61594 fix: the auto-update plugin now also installs launchers and service files via setup.py (closes #470) 2019-10-31 12:48:15 +01:00
evilsocket
279d885ec6 Merge pull request #479 from deveth0/patch-2
Change memory splitting to have more memory available
2019-10-31 10:52:59 +01:00
evilsocket
a8705c1d3c Merge pull request #476 from dadav/fix/provisioning
Change the ordering of the provisioners of packer
2019-10-31 10:50:30 +01:00
Alex Muthmann
90386c7a64 Change memory splitting to have more memory available
As most users won't use a big GUI, it should be sufficient to have 16MB assigned to the GPU and have some more for the system.
2019-10-31 08:49:58 +01:00
opteeks
205480bc38 Merge pull request #4 from opteeks/waveshare29inch
Added 2.9inch display libraries
2019-10-30 22:57:10 -07:00
opteeks
d2726c1a14 Added 2.9inch display libraries 2019-10-30 22:56:02 -07:00
opteeks
1c9a25d22a Merge pull request #3 from opteeks/opteeks-waveshare29inch
Add support for Waveshare 2.9inch display
2019-10-30 22:50:12 -07:00
opteeks
e9494992fc Add support for Waveshare 2.9inch display 2019-10-30 22:49:06 -07:00
dadav
c7931450c3 change ordering 2019-10-30 22:28:12 +01:00
opteeks
cc7299153c Merge pull request #2 from opteeks/opteeks-waveshare29inch
Added waveshare29inch.py
2019-10-30 13:22:23 -07:00
opteeks
a27f09871f Added waveshare29inch.py
Added the Waveshare e-ink 2.9 inch display definition and layout.
2019-10-30 13:09:32 -07:00
Jeremy O'Brien
3714899e95 fix: don't attempt to parse/upload pcaps with malformed filenames
Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
2019-10-30 15:33:09 -04:00
Simone Margaritelli
be414e57b3 fix: builder now uses files provisioners and auto-update installs project data (ref #470) 2019-10-30 19:24:12 +01:00
Simone Margaritelli
1600d8cbd1 fix: skipping open access points (fixes #463) 2019-10-30 17:50:56 +01:00
Simone Margaritelli
965416483d fix: more robust version parsing in auto-update (fixes #469) 2019-10-30 17:37:17 +01:00
Simone Margaritelli
78a036ed1a fix: fixed Slack invite link (fixes #466) 2019-10-30 16:49:20 +01:00
Simone Margaritelli
667c64832f releasing v1.1.0 2019-10-30 15:47:36 +01:00
Simone Margaritelli
9d19fb8e7a misc: small fix or general refactoring i did not bother commenting 2019-10-30 14:25:21 +01:00
Simone Margaritelli
cb09648ba1 misc: small fix or general refactoring i did not bother commenting 2019-10-30 14:11:14 +01:00
evilsocket
03b85ac66b Merge pull request #465 from dipsylala/master
Added exception handling to config.yml parsing
2019-10-30 11:59:23 +01:00
Dispsylala
5255e5fd13 Fix default setting to be an array, otherwise the iterator works over
characters, not strings.
2019-10-30 01:05:58 +00:00
Dispsylala
d5a8cda278 Merge remote-tracking branch 'upstream/master' 2019-10-29 23:21:29 +00:00
Dispsylala
bcdbf41bb8 Added exception handling to config.yml parsing/merging 2019-10-29 22:38:41 +00:00
evilsocket
3c86b58696 Merge pull request #461 from maxxer/fix-eth0-check
Fix eth0 connection check for MANU mode
2019-10-29 11:07:51 +01:00
Lorenzo Milesi
18a41f3e29 Fix eth0 connection check for MANU mode
Issue #460 - Originally noted by @ZeroCool-Dade
a78a4b0b3e (commitcomment-35683998)

Signed-off-by: Lorenzo Milesi <io@maxxer.it>
2019-10-29 08:47:44 +01:00
evilsocket
09f33112b4 Merge pull request #453 from deveth0/patch-2
Fix lcdhat _display.clear()
2019-10-28 17:10:48 +01:00
evilsocket
432d654cc5 Merge pull request #454 from ciara1234/master
check zip is installed first before running backup
2019-10-28 17:10:17 +01:00
Alex Muthmann
3b1d90baef Fix _display.clear()
There is a typo (uppercase / lowercase) which prevents the display from initializing.
2019-10-28 12:52:14 +01:00
Ciara Brennan
0ad6e887ac check zip is installed first
Signed-off-by: Ciara Brennan <ciara.brennan@gmail.com>
2019-10-28 11:49:24 +00:00
evilsocket
d42ab1574b Merge pull request #445 from chillinPanda/issue/444_waveshare_1.54_comment
Waveshare 1.54 inch screen - config possibility in defaults.yml
2019-10-28 10:30:55 +01:00
evilsocket
7189f3c461 Merge pull request #450 from ratmandu/gpio_plugin
Adding GPIO Plugin
2019-10-28 10:30:25 +01:00
evilsocket
32e3343596 Merge pull request #439 from dipsylala/master
InkyPHAT opt-in for fast refresh
2019-10-28 10:29:02 +01:00
evilsocket
b76144909a Merge pull request #438 from nikhiljha/ws213d
add waveshare 213d display
2019-10-28 10:28:32 +01:00
Justin Richards
7676b55b87 Revert "Adding original screen clearing LUT to help prevent burn-in"
This reverts commit dfcc2f6bf2.
2019-10-27 19:36:29 -05:00
Justin Richards
92773a2b37 adding to defaults.yml and shortening debounce a little bit
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 19:20:43 -05:00
Justin Richards
d3c6194e0f adding gpio plugin
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 19:11:36 -05:00
Nikhil Jha
7fd31e14f9 fix resolution
Signed-off-by: Nikhil Jha <hi@nikhiljha.com>
2019-10-27 14:32:30 -07:00
Dinh Bao Dang
c0434b7dde add waveshare154inch config possibility to defaults.yml, since ...
support was introduced in #434
2019-10-27 22:29:16 +01:00
Nikhil Jha
4d5bfc2adf maybe actually fix now
Signed-off-by: Nikhil Jha <hi@nikhiljha.com>
2019-10-27 14:20:56 -07:00
Nikhil Jha
4814e10940 attempt to fix init for 213d
Signed-off-by: Nikhil Jha <hi@nikhiljha.com>
2019-10-27 14:14:48 -07:00
Justin Richards
dfcc2f6bf2 Adding original screen clearing LUT to help prevent burn-in
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 15:48:14 -05:00
Dispsylala
a897e00c98 Merge remote-tracking branch 'origin/master' 2019-10-27 19:54:21 +00:00
Dispsylala
caec837050 Makes Inky Fast mode opt-in by selecting 'fastAndFurious'
Displays warning if selected.
Otherwise uses original InkyPHAT library
2019-10-27 19:53:29 +00:00
Nikhil Jha
786564ebb8 add waveshare 213d display
Signed-off-by: Nikhil Jha <hi@nikhiljha.com>
2019-10-27 12:52:01 -07:00
Dispsylala
bfe0ea7623 Makes Inky Fast mode opt-in by selecting 'fastAndFurious'
Displays warning if selected.
Otherwise uses original InkyPHAT library
2019-10-27 19:51:48 +00:00
evilsocket
15b815d8ad Merge pull request #422 from benleb/patch-1
polish backup.sh: add username, .bashrc to backup files, fix shellcheck lint issues
2019-10-27 18:00:13 +01:00
evilsocket
f74979b10c Merge pull request #434 from ronangaillard/feature/waveshare-154-inch
Add support for Waveshare 1.54 inch screen
2019-10-27 17:59:14 +01:00
Ben Lebherz
5119bf4326 quote shifting 2019-10-27 17:59:06 +01:00
evilsocket
74778a0acf Merge pull request #436 from dipsylala/master
Updated Preview
2019-10-27 17:58:34 +01:00
Dispsylala
65a3553521 Remove reference to VideoHandler, added reference to
Peer::first_encounter()
2019-10-27 15:43:42 +00:00
Ronan Gaillard
f4fa259781 Add support for Waveshare 1.54 inch screen 2019-10-27 16:02:00 +01:00
evilsocket
f86d5afb5c Merge pull request #417 from georgikoemdzhiev/AddBulgarian
Add Bulgarian language support
2019-10-27 13:02:22 +01:00
evilsocket
321595f93c Merge pull request #423 from PhyberApex/patch-2
Fix for #421 / Webhook missing positional argiment
2019-10-27 12:56:59 +01:00
evilsocket
d1d7107923 Merge pull request #425 from jsoref/spelling
Spelling
2019-10-27 12:56:20 +01:00
evilsocket
787a498c49 Merge pull request #426 from emedvedev/patch-1
Fix the AircrackOnly plugin
2019-10-27 12:55:17 +01:00
evilsocket
9c5006fefd Merge pull request #428 from ratmandu/waveshare-tricolor-fast
Adding Waveshare 2.13 tri-color display FAST MODE
2019-10-27 12:54:51 +01:00
evilsocket
18957c6ad3 Merge pull request #430 from strasharo/patch-2
Don't disable display output for DVI as well. fixes #429
2019-10-27 12:54:03 +01:00
georgikoemdzhiev
5e1486be93 Fixed compile
Signed-off-by: georgikoemdzhiev <koemdjiev@gmail.com>
2019-10-27 10:44:21 +00:00
strasharo
8cb3e1c8d5 Don't disable display output for DVI as well
Some people are attaching DVI displays through an adapter.
2019-10-27 10:38:28 +02:00
Justin Richards
723e1892e4 Fixed bug. Not sure how that got changed back
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 02:53:26 -05:00
Justin Richards
f1bc2d945b Adding fastAndFurious and warning info
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 02:29:09 -05:00
Justin Richards
16e310e377 Adding fast display update for waveshare 3-color
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-27 02:18:42 -05:00
Ed Medvedev
b66c86b31a Fix the AircrackOnly plugin
AircrackOnly plugin wasn't working because of a typo: marking files for deletion referenced a wrong variable.
2019-10-27 07:47:22 +02:00
Josh Soref
b93bcd07d4 spelling: uploads 2019-10-26 22:14:15 -04:00
Josh Soref
5ae7695229 spelling: unknown 2019-10-26 22:13:59 -04:00
Josh Soref
8a687b723b spelling: transfer 2019-10-26 22:13:42 -04:00
Josh Soref
0b495ebd13 spelling: successfully 2019-10-26 22:12:45 -04:00
Josh Soref
9888e1fb39 spelling: stopping 2019-10-26 22:12:28 -04:00
Josh Soref
5a16819feb spelling: pwnagotchi 2019-10-26 22:09:57 -04:00
Josh Soref
102a061814 spelling: please 2019-10-26 22:09:37 -04:00
Josh Soref
ecfc5f9063 spelling: occurred 2019-10-26 22:09:19 -04:00
Josh Soref
1c2ff20ab4 spelling: lifting 2019-10-26 22:08:50 -04:00
Josh Soref
a2c3df5c99 spelling: going 2019-10-26 22:08:06 -04:00
Josh Soref
28c28b8b0c spelling: furnished 2019-10-26 22:07:47 -04:00
Josh Soref
3bc887631b spelling: functions 2019-10-26 22:07:34 -04:00
Josh Soref
13b73a64c8 spelling: documentation 2019-10-26 22:05:42 -04:00
Josh Soref
479f9cf79d spelling: display 2019-10-26 22:05:29 -04:00
Josh Soref
8a87bbeb90 spelling: delete 2019-10-26 22:13:18 -04:00
Josh Soref
d3d4df2500 spelling: available 2019-10-26 22:03:31 -04:00
PhyberApex
69b3fabba1 Fix for #421
Missed giving the argument to actually be able to write the response.
2019-10-27 02:02:34 +02:00
Ben Lebherz
d5007385f3 add username option, .bashrc to backup files, implement shellcheck hints 2019-10-27 01:35:13 +02:00
georgikoemdzhiev
d2af951b34 Generated mo file 2019-10-26 20:09:39 +01:00
georgikoemdzhiev
a44c325877 Added meta data 2019-10-26 20:07:59 +01:00
georgikoemdzhiev
1522470fa5 Fixed compile 2019-10-26 19:55:14 +01:00
georgikoemdzhiev
3463740fd9 Small fixes 2019-10-26 19:51:37 +01:00
georgikoemdzhiev
d6228b133b Completed bulgarian translation 2019-10-26 19:47:47 +01:00
evilsocket
441bd905a5 Merge pull request #415 from ratmandu/add-dfrobot-display
Add support for DFRobot epaper display
2019-10-26 20:37:01 +02:00
georgikoemdzhiev
db7fc74b4a Added bulgarian language WiP 2019-10-26 19:01:02 +01:00
Justin Richards
88f7384f52 adding to list of available options
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-26 12:55:23 -05:00
Justin Richards
d984ea8a76 adding support for dfrobot 2.13in epaper display
Signed-off-by: Justin Richards <ratmandu@gmail.com>
2019-10-26 12:52:07 -05:00
evilsocket
4b606d9a6b Merge pull request #413 from emedvedev/imports-optimization
Optimize plugin imports
2019-10-26 17:54:47 +02:00
Edward Medvedev
ea51ab7014 Optimize plugin imports
Signed-off-by: Edward Medvedev <edward.medvedev@gmail.com>
2019-10-26 18:36:42 +03:00
Simone Margaritelli
68c11ada8d Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-26 17:15:58 +02:00
Simone Margaritelli
546c7fe397 fix: chown backup file (fixes #409) 2019-10-26 17:15:42 +02:00
evilsocket
5790f494df Merge pull request #408 from python273/set-cors-headers-only-if-added-to-config
Set CORS headers only if set in config
2019-10-26 17:07:48 +02:00
Simone Margaritelli
063cc73689 misc: small fix or general refactoring i did not bother commenting 2019-10-26 16:39:49 +02:00
python273
5643f9ae70 Set CORS headers only if set in config 2019-10-26 17:07:47 +03:00
Simone Margaritelli
99f6758aae releasing v1.1.0RC0 2019-10-26 14:14:43 +02:00
Simone Margaritelli
0a33f9c0af new: bump bettercap version to 2.26.1 2019-10-26 10:31:02 +02:00
evilsocket
d231541403 Merge pull request #399 from leon-th/patch-2
Added plugin PAW GPS
2019-10-26 10:29:56 +02:00
evilsocket
f1eb3316c6 Merge pull request #401 from SpiderDead/master
Updated libraries to V4.0 for the 2.7" display
2019-10-26 10:29:08 +02:00
evilsocket
f3a96b7981 Merge pull request #402 from PhyberApex/patch-1
Minor text fixes
2019-10-26 10:27:19 +02:00
PhyberApex
beb2b83f36 Minor text fixes
There is no plural of information.
2019-10-26 02:12:37 +02:00
SpiderDead
24ae443ee9 Updated libraries to V4.0 for the 2.7" display
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-25 23:20:01 +02:00
Simone Margaritelli
3f785ee06a misc: small fix or general refactoring i did not bother commenting 2019-10-25 19:38:23 +02:00
Simone Margaritelli
cf146a54ee misc: small fix or general refactoring i did not bother commenting 2019-10-25 19:36:23 +02:00
Simone Margaritelli
31c1d742e0 fix: webui /shutdown is now on POST 2019-10-25 19:34:31 +02:00
Simone Margaritelli
c0252c9830 fix: safer call to webhook 2019-10-25 19:32:11 +02:00
Simone Margaritelli
4aa29f1b79 misc: small fix or general refactoring i did not bother commenting 2019-10-25 19:15:55 +02:00
Leon T
5dc780a88f Edited defaut.yml to add the pawgps plugin 2019-10-25 17:02:15 +02:00
Leon T
39a6ae1be5 Created the paw-gps plugin v1.0.0
This plugin connects to PAW Server with the GPS hack and saves the GPS location when a handshake is detected
2019-10-25 16:57:05 +02:00
Simone Margaritelli
047f0d5d63 misc: bump bettercap to 2.26 2019-10-25 16:43:14 +02:00
Simone Margaritelli
715e696537 fix: rebooting after setting hostname 2019-10-25 16:37:45 +02:00
Simone Margaritelli
22afb563e3 misc: small fix or general refactoring i did not bother commenting 2019-10-25 16:01:53 +02:00
Simone Margaritelli
5f4ee26f99 new: pwnagotchi folder can now be in /boot/ in which case will be moved to /etc/pwnagotchi 2019-10-25 15:29:10 +02:00
Simone Margaritelli
1959bc08ae Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-25 13:21:17 +02:00
Simone Margaritelli
2c9f54567f misc: small fix or general refactoring i did not bother commenting 2019-10-25 13:21:08 +02:00
evilsocket
63694d57e5 Merge pull request #395 from deveth0/patch-1
Add missing lcdhat
2019-10-25 12:36:08 +02:00
Alex Muthmann
c6c2e0e7ce Update utils.py 2019-10-25 12:25:42 +02:00
Alex Muthmann
cb6365b9f2 Add missing lcdhat 2019-10-25 12:18:13 +02:00
Simone Margaritelli
8b00e0ae10 misc: small fix or general refactoring i did not bother commenting 2019-10-25 12:17:44 +02:00
Simone Margaritelli
7954bb5fcf misc: small fix or general refactoring i did not bother commenting 2019-10-25 12:15:56 +02:00
Simone Margaritelli
06d8cc63fb misc: added debug logs for AI loading times 2019-10-25 11:40:58 +02:00
evilsocket
c4ae3c15bd Merge pull request #392 from deveth0/Display-failed-Backup
Show information on failed backup on display
2019-10-25 11:21:21 +02:00
evilsocket
3604f483aa Merge pull request #393 from deveth0/391_verify_backupfiles
#391: Verify if the configured files exist
2019-10-25 11:21:01 +02:00
Alex Muthmann
d51d3f61ac #391: Verify if the configured files exist 2019-10-25 10:55:45 +02:00
Alex Muthmann
6bb8fede0c Show information on failed backup on display 2019-10-25 10:33:12 +02:00
evilsocket
c35d202ffd Merge pull request #385 from caquino/master
parse /proc/meminfo to gather memory usage
2019-10-25 10:21:46 +02:00
evilsocket
ffa432587a Merge pull request #389 from dadav/fix/bt-tet
Fix lot of bt-tether problems
2019-10-25 10:21:23 +02:00
dadav
6f013bb1ef Fix lot of bt-tether problems 2019-10-25 01:06:29 +02:00
Cassiano Aquino
f8f6608968 one decimal place 2019-10-24 20:35:30 +01:00
Cassiano Aquino
0c176ca308 parse /proc/meminfo to gather memory usage 2019-10-24 20:29:09 +01:00
Simone Margaritelli
ec430a5cba misc: small fix or general refactoring i did not bother commenting 2019-10-24 19:54:55 +02:00
Simone Margaritelli
97733cbf43 fix: hostname validation when provided by config 2019-10-24 18:12:10 +02:00
Simone Margaritelli
4445ef6432 misc: small fix or general refactoring i did not bother commenting 2019-10-24 17:53:02 +02:00
Simone Margaritelli
a25395a945 misc: small fix or general refactoring i did not bother commenting 2019-10-24 17:52:43 +02:00
Simone Margaritelli
0f171c35ce new: unit's name can be now set via main.name configuration parameter 2019-10-24 17:48:37 +02:00
Simone Margaritelli
61b957ac77 fix: prevent user contributed plugins to crash the main process while loading 2019-10-24 17:23:33 +02:00
Simone Margaritelli
30e3898f3c misc: small fix or general refactoring i did not bother commenting 2019-10-24 15:55:00 +02:00
Simone Margaritelli
094dde0e8c fix: 'effective configuration' is a debug log now 2019-10-24 15:47:21 +02:00
Simone Margaritelli
dc5a626bd5 misc: small fix or general refactoring i did not bother commenting 2019-10-24 15:34:52 +02:00
Simone Margaritelli
608aad4820 new: observing and reporting total number of peers met per each epoch 2019-10-24 15:18:04 +02:00
Simone Margaritelli
30f9c16778 new: bumped pwngrid required version to 1.10.1 2019-10-24 14:00:22 +02:00
Simone Margaritelli
97cccf5a1d new: face expression while looking around will change dependig if the unit is with friends or alone 2019-10-24 13:42:43 +02:00
Simone Margaritelli
ce0c248cf4 misc: small fix or general refactoring i did not bother commenting 2019-10-24 13:22:05 +02:00
Simone Margaritelli
d5ac988498 misc: small fix or general refactoring i did not bother commenting 2019-10-24 13:20:55 +02:00
Simone Margaritelli
6d70a24aae misc: small fix or general refactoring i did not bother commenting 2019-10-24 13:09:54 +02:00
Simone Margaritelli
032e183ff7 new: face expression when a new unit is detected depends on the units bond level 2019-10-24 13:02:50 +02:00
Simone Margaritelli
f00c861844 misc: small fix or general refactoring i did not bother commenting 2019-10-24 12:53:52 +02:00
Simone Margaritelli
4addefd57d misc: small fix or general refactoring i did not bother commenting 2019-10-24 12:48:04 +02:00
Simone Margaritelli
2239406272 misc: small fix or general refactoring i did not bother commenting 2019-10-24 12:33:03 +02:00
Simone Margaritelli
0df5e54f91 misc: small fix or general refactoring i did not bother commenting 2019-10-24 12:29:39 +02:00
Simone Margaritelli
3e0833698a fix: forcing view update when calling manual mode 2019-10-24 12:26:18 +02:00
Simone Margaritelli
ab9ddb4513 fix: throttled manual mode grid connections to avoid rate limits 2019-10-24 12:24:38 +02:00
Simone Margaritelli
2beef33251 fix: checking inbox correctly from the grid plugin 2019-10-24 12:21:48 +02:00
evilsocket
2b583d7458 Merge pull request #373 from dadav/fix/lang
Fix/lang
2019-10-24 10:53:29 +02:00
evilsocket
da7e21bbdd Merge pull request #375 from dadav/fix/wigle-bug
[Fix] Wigle plugin - add escape char
2019-10-24 10:53:19 +02:00
evilsocket
d9ddae9a41 Merge pull request #378 from spees/patch-1
Small fix
2019-10-24 10:53:06 +02:00
spees
d306877c7a Small fix
Last change broke the launchers.
2019-10-24 10:26:58 +02:00
dadav
7d34e631f5 add escape char 2019-10-23 23:27:25 +02:00
dadav
f39c154b23 fix en and de 2019-10-23 20:59:22 +02:00
dadav
04b2ee5b44 fix en and de 2019-10-23 20:57:26 +02:00
Simone Margaritelli
9a72a8868b misc: small fix or general refactoring i did not bother commenting 2019-10-23 20:02:42 +02:00
Simone Margaritelli
d636c2b1f2 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:53:23 +02:00
Simone Margaritelli
84616827ad misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:46:26 +02:00
Simone Margaritelli
d16180189e misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:41:14 +02:00
Simone Margaritelli
885fddfce8 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:35:51 +02:00
Simone Margaritelli
68d7686a03 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:32:24 +02:00
Simone Margaritelli
d20f6c8a52 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:28:05 +02:00
Simone Margaritelli
5bf9f25a46 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-23 19:24:16 +02:00
Simone Margaritelli
b85e4174dc misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:21:42 +02:00
evilsocket
0de2e3d150 Merge pull request #369 from zenzen666/aircrackonly-minor-correction
Aircrackonly minor correction
2019-10-23 19:13:45 +02:00
evilsocket
412fca5290 Merge pull request #370 from XavierForks/fix/language-fr
Correct some typos and update
2019-10-23 19:13:33 +02:00
Simone Margaritelli
3ab2088c79 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:09:36 +02:00
Simone Margaritelli
eda8a18788 misc: small fix or general refactoring i did not bother commenting 2019-10-23 19:08:43 +02:00
Xavier Stouder
ea14cb370e fix: forgot some exclamation mark fix
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 19:04:28 +02:00
Xavier Stouder
6f2228f439 fix: add translation
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 18:58:58 +02:00
Xavier Stouder
1d53dc7c4e fix: fix space before !
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 18:58:23 +02:00
Xavier Stouder
202cd1f32e fix: translate a word
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 18:54:12 +02:00
Xavier Stouder
ab871f9d2d fix: fix type of ellpsis in french
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 18:52:40 +02:00
Xavier Stouder
f2ceec0f8f fix: update french translation
Signed-off-by: Xavier Stouder <xavier@stouder.io>
2019-10-23 18:47:47 +02:00
Simone Margaritelli
f734c9cd68 new: bumped pwngrid required version to 1.10.0 2019-10-23 18:21:23 +02:00
Simone Margaritelli
36c3ea5bbc new: new grateful status that can override sad/bored/lonely if units with a strong bond are nearby 2019-10-23 18:19:43 +02:00
Zenzen San
062de3b618 minor logging correction
`on loaded` the plugin was showing a different name: `cleancap plugin loaded`
I've changed it with the name of the plugin to be consistent and easy to find what going on from pwnagotchi.log
2019-10-23 15:59:11 +00:00
Zenzen San
77ada644ed Merge pull request #2 from evilsocket/master
just rebase from origin
2019-10-23 15:56:38 +00:00
Simone Margaritelli
277906a673 fix: fixed bogus support for waveshare lcd displays (fixes #364) 2019-10-23 15:37:12 +02:00
Simone Margaritelli
a78a4b0b3e fix: fixes a race condition in the launcher scripts and enables MANU if eth0 is up (closes #365) 2019-10-23 15:26:53 +02:00
Simone Margaritelli
3ad426916f small refactoring to facilitate integration of the bond equation 2019-10-23 15:20:16 +02:00
Simone Margaritelli
23ef17d4c7 fix: using normal status to signal unread messages in order to avoid BT overlap bug 2019-10-23 15:14:55 +02:00
evilsocket
7779ebc983 Merge pull request #362 from python273/add-non-blocking-screen-updating
Add non blocking display updating
2019-10-23 12:52:02 +02:00
opteeks
ddc264bbb9 Deleted epd2in9.py
Wrong format
2019-10-23 00:25:08 -07:00
opteeks
f0092ff154 Waveshare 2.9 inch e-ink display 2019-10-23 00:17:28 -07:00
opteeks
ed0df18f68 Added 2.9 inch Waveshare E-Ink display 2019-10-23 00:11:25 -07:00
python273
4fa7e9f077 Add slight delay for waveshare v1 ReadBusy
Signed-off-by: python273 <iam@python273.pw>
2019-10-22 20:59:15 +03:00
python273
9ca2424df1 Add non-blocking screen updating
Signed-off-by: python273 <iam@python273.pw>
2019-10-22 20:53:15 +03:00
Simone Margaritelli
8c22b1d6f1 fix: if bettercap starts and no active interfaces are found, if mon0 is not explicitly passed it will fail with a 'No active interfces' error 2019-10-22 12:14:56 +02:00
Simone Margaritelli
538b547560 fix: on rpi4 sometimes systemd fails to monstart 2019-10-22 12:09:41 +02:00
Simone Margaritelli
414a6b4c7a misc: small fix or general refactoring i did not bother commenting 2019-10-22 11:35:35 +02:00
evilsocket
cdf11df270 Merge pull request #354 from caquino/caquino/papirus
papirus, fbi and idempotency changes
2019-10-22 11:11:01 +02:00
evilsocket
ef52cbcc25 Merge pull request #356 from SpiderDead/master
Changed the overall look of the layout on the 2.7"
2019-10-21 23:54:13 +02:00
SpiderDead
b0dab7b589 Changed the overall look of the layout on the 2.7"
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-21 23:45:35 +02:00
Cassiano Aquino
ace1244d10 disable sap plugin for bluetooth service 2019-10-21 18:41:36 +01:00
Cassiano Aquino
84fa293a11 change quotes to allow tab expansion 2019-10-21 17:58:00 +01:00
Simone Margaritelli
139c9df88c fix: fixed auto-backup plugin to only create local backups 2019-10-21 18:51:22 +02:00
Cassiano Aquino
7a721be7dc papirus, fbi and idempotency changes 2019-10-21 16:38:53 +01:00
Simone Margaritelli
56079dfd9d fix: waiting for bettercap's API to start 2019-10-21 16:26:07 +02:00
Simone Margaritelli
90998be24c fix: handling exceptions when bettercap is not running yet 2019-10-21 16:22:38 +02:00
Simone Margaritelli
5cb721f490 fix: correct services dependencies 2019-10-21 16:10:09 +02:00
Simone Margaritelli
c954bf8ffa fix: refactored backup.sh script to not require root login 2019-10-21 15:41:45 +02:00
Simone Margaritelli
41ea0e0747 new: new ui.display.video.on_frame configuration to use fbi on framebuffer based screens 2019-10-21 14:01:21 +02:00
Simone Margaritelli
e943cfad70 misc: small fix or general refactoring i did not bother commenting 2019-10-21 12:27:16 +02:00
Simone Margaritelli
f576fb609b Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-21 11:34:00 +02:00
Simone Margaritelli
1e015fe6f6 misc: replaced ssh-keygen with pwngrid -generate 2019-10-21 11:33:48 +02:00
evilsocket
d526915cce Merge pull request #352 from gkrs/master
Updated polish language pack. New phrase, corrections and cleanup.
2019-10-21 11:29:02 +02:00
gkrs
0ac940f636 Updated polish language pack. New phrase, corrections and cleanup. 2019-10-21 10:57:16 +02:00
evilsocket
da6f3608f3 Merge pull request #350 from friedphish/patch-1
Make wpa-sec URL configurable, part 1.
2019-10-21 10:20:25 +02:00
evilsocket
bdfd021820 Merge pull request #351 from friedphish/patch-2
Update wpa-sec.py
2019-10-21 10:20:15 +02:00
friedphish
4a2091e688 Update wpa-sec.py
Part 2 of closing https://github.com/evilsocket/pwnagotchi/issues/347.
2019-10-21 09:53:32 +02:00
friedphish
16832cd414 Update defaults.yml 2019-10-21 09:48:55 +02:00
evilsocket
020be7185c Merge pull request #299 from dadav/feature/web-hook-for-plugins
Implement webhook for plugins
2019-10-20 22:11:04 +02:00
evilsocket
c8ff69c068 Merge pull request #348 from SpiderDead/master
Added support for Waveshare 2.7inch e-Paper Display
2019-10-20 22:10:39 +02:00
evilsocket
79d252254f Merge pull request #345 from python273/patch-3
Fix Origin header check bypass
2019-10-20 21:42:08 +02:00
Simone Margaritelli
64e677f5df new: implemented auto-update plugin (closes #343) 2019-10-20 21:39:14 +02:00
Simone Margaritelli
bceb3c4c4f misc: small fix or general refactoring i did not bother commenting 2019-10-20 21:36:37 +02:00
Simone Margaritelli
df246b255a misc: small fix or general refactoring i did not bother commenting 2019-10-20 21:35:36 +02:00
SpiderDead
d6d810497e Added libraries for the 2.7" display
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-20 21:28:29 +02:00
SpiderDead
9df1dbe077 Added configuration file for waveshare27inch
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-20 21:27:44 +02:00
SpiderDead
3c97dbf8dc Added waveshare27inch as a known display
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-20 21:27:10 +02:00
SpiderDead
376a74d7ac Added documentation for waveshare27inch
Signed-off-by: Mike van der Vrugt <mimij68@live.nl>
2019-10-20 21:26:32 +02:00
Simone Margaritelli
855b493040 misc: small fix or general refactoring i did not bother commenting 2019-10-20 21:25:27 +02:00
Simone Margaritelli
375486f9d0 misc: small fix or general refactoring i did not bother commenting 2019-10-20 21:20:55 +02:00
Simone Margaritelli
0263777e4b misc: small fix or general refactoring i did not bother commenting 2019-10-20 21:18:43 +02:00
Simone Margaritelli
132666935a misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:59:59 +02:00
Simone Margaritelli
74a75f03b8 misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:57:15 +02:00
Simone Margaritelli
399e78e675 misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:52:22 +02:00
Simone Margaritelli
649091766f misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:47:52 +02:00
Simone Margaritelli
999b130224 misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:46:18 +02:00
Simone Margaritelli
2a450e64ef misc: small fix or general refactoring i did not bother commenting 2019-10-20 20:32:18 +02:00
Simone Margaritelli
6152374024 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:56:31 +02:00
Simone Margaritelli
f9cbef9697 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:53:02 +02:00
Simone Margaritelli
682b373c66 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:51:30 +02:00
Simone Margaritelli
8d0d3df2b0 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:50:05 +02:00
Simone Margaritelli
6d5054387b misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:48:52 +02:00
Simone Margaritelli
4018071bba misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:47:08 +02:00
Simone Margaritelli
63568f1725 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:45:45 +02:00
Simone Margaritelli
c72cb5b962 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:42:15 +02:00
Simone Margaritelli
0cdb8c3221 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:29:11 +02:00
Simone Margaritelli
ddeefa037d misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:27:31 +02:00
Simone Margaritelli
a4e072cf33 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:22:04 +02:00
Simone Margaritelli
677b335403 misc: small fix or general refactoring i did not bother commenting 2019-10-20 19:18:50 +02:00
Kirill
f762c3ac0d Fix headers.get('origin') == None check 2019-10-20 20:03:17 +03:00
Simone Margaritelli
152676f651 fix: don't show sad face in manual mode for very short sessions 2019-10-20 18:51:33 +02:00
Simone Margaritelli
0ce1fa9d12 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:49:45 +02:00
Simone Margaritelli
2e8f2aa1b8 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:48:05 +02:00
Simone Margaritelli
f7a23b32c1 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:45:56 +02:00
Kirill
4653c5d95d Fix Origin header check bypass 2019-10-20 19:45:43 +03:00
Simone Margaritelli
c947d5c43b misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:41:57 +02:00
Simone Margaritelli
26bb5d6183 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:39:01 +02:00
Simone Margaritelli
916be1f63e misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:36:06 +02:00
Simone Margaritelli
4a4b973f60 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:33:43 +02:00
Simone Margaritelli
d49cefe1e4 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:32:24 +02:00
Simone Margaritelli
c6b3e11e04 new: new --skip-session for manual mode to skip session parsing 2019-10-20 18:29:36 +02:00
Simone Margaritelli
e8fa682302 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:20:07 +02:00
Simone Margaritelli
fbd12bf87b misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:11:18 +02:00
Simone Margaritelli
40c01db1d1 misc: small fix or general refactoring i did not bother commenting 2019-10-20 18:08:14 +02:00
Simone Margaritelli
ca2becd9ce working on auto-update plugin 2019-10-20 18:05:53 +02:00
Simone Margaritelli
ff6bf5c198 started working on #343 2019-10-20 17:36:34 +02:00
Simone Margaritelli
cd5d783c52 new: users can now customize the faces via config.yml (ui.faces) 2019-10-20 17:13:05 +02:00
Simone Margaritelli
99e0a31ea8 misc: changed readme image 2019-10-20 16:31:34 +02:00
dadav
5f6cc378f1 Implement webhook 2019-10-20 16:17:46 +02:00
Simone Margaritelli
d45e8c7ba0 new: secured the web ui with CORS 2019-10-20 16:09:27 +02:00
Simone Margaritelli
539df810ed misc: small fix or general refactoring i did not bother commenting 2019-10-20 15:42:08 +02:00
Simone Margaritelli
bd7c64b2af misc: refactored web ui code 2019-10-20 15:41:06 +02:00
Simone Margaritelli
892fda775d fix: throttling report requests a bit to avoid rate limits on the API 2019-10-20 14:55:34 +02:00
Simone Margaritelli
f9c0efc24a new: bump pwngrid to 1.9.0 2019-10-20 14:55:15 +02:00
Simone Margaritelli
400d0e7290 fix: removed unused variable in the grid plugin 2019-10-20 14:32:15 +02:00
Simone Margaritelli
fb2c65ef0a fix: made grid api errors due to rate limiting and stuff way less dramatic 2019-10-20 14:31:45 +02:00
Simone Margaritelli
6d88cb17f3 minor refactoring 2019-10-20 14:28:34 +02:00
Simone Margaritelli
c10f25140c Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-20 14:26:54 +02:00
Simone Margaritelli
d2966098b0 lol dadav 2019-10-20 14:24:40 +02:00
evilsocket
a3a4854427 Merge pull request #338 from spees/master
refactored memtemp so it actually works
2019-10-20 14:17:55 +02:00
evilsocket
e5d623c114 Merge pull request #336 from dadav/fix/tweepy_version
increase version
2019-10-20 13:52:18 +02:00
dadav
68801adcaf increase version 2019-10-20 12:10:01 +02:00
spees
58a085188f refactored to use the already existing functions
Signed-off-by: spees <speeskonijn@gmail.com>
2019-10-19 22:25:12 +02:00
spees
f52687642e refactored so it actually works
Signed-off-by: spees <speeskonijn@gmail.com>
2019-10-19 21:32:55 +02:00
Simone Margaritelli
2d7b6b54fe releasing v1.0.1 2019-10-19 18:56:03 +02:00
Simone Margaritelli
b3aa5bc2c1 fix: bumped pwngrid to 1.8.1 2019-10-19 18:43:16 +02:00
Simone Margaritelli
10cba6872a fix: fixed travis-ci regexp 2019-10-19 17:26:03 +02:00
Simone Margaritelli
b213f9f214 releasing v1.0.0 2019-10-19 17:22:34 +02:00
evilsocket
fa72a53129 Merge pull request #330 from python273/patch-2
Fix waveshare v1 layout: status pos
2019-10-19 12:07:03 +02:00
Kirill
49f7c652c7 Fix waveshare v1 layout: status pos 2019-10-19 12:53:46 +03:00
evilsocket
9c78e16c1b Merge pull request #328 from szymex73/polish-lang
Add polish translation
2019-10-19 10:10:43 +02:00
evilsocket
22ebc09c9d Merge pull request #329 from ggiraudon/master
Adding support for Waveshare LCD Hat (ST7789 chip)
2019-10-19 10:08:41 +02:00
root
0ea67cb97f Adding support for Waveshare LCD Hat (ST7789 chip) 2019-10-19 04:49:38 +01:00
Szymon Borecki
2324423cab Add polish translation files
Signed-off-by: Szymon Borecki <szymex73@gmail.com>
2019-10-19 00:55:48 +02:00
evilsocket
be2cd8293f Merge pull request #326 from dadav/fix/gast-version
need old gast version
2019-10-18 21:23:41 +02:00
dadav
86cbe01081 need old gast version 2019-10-18 20:31:10 +02:00
Simone Margaritelli
eea4feee71 new: bump pwngrid binary to 1.8.0 2019-10-18 19:51:07 +02:00
evilsocket
cff487008c Merge pull request #325 from dadav/fix/bt-dbus-bug
Fix str comparison and add sleep
2019-10-18 19:35:27 +02:00
dadav
6cecca67a4 Fix str comparison and add sleep 2019-10-18 19:20:25 +02:00
Simone Margaritelli
fb4d46d71a fix: fixed Invalid cross-device link error 2019-10-18 17:43:45 +02:00
Simone Margaritelli
e220a869e0 new: user config is now copied from /boot/config.yml 2019-10-18 16:34:58 +02:00
Simone Margaritelli
f4a59549fa fix: update process will be reflash based for a while 2019-10-18 15:58:53 +02:00
Simone Margaritelli
a058d2e00d fix: removed deprecated script 2019-10-18 15:57:40 +02:00
Simone Margaritelli
8c73e32853 fix: handling corrupted log lines (fixes #321) 2019-10-18 10:30:27 +02:00
evilsocket
eeee4bdd3c Merge pull request #314 from ChipWolf/patch-1
Only show ui complication if you have unread pwnmail
2019-10-18 09:45:10 +02:00
evilsocket
1ddf020ba8 Merge pull request #318 from colossus700/colossus700-patch-1
Fix LM75B import error for Papirus Screens
2019-10-18 09:44:32 +02:00
evilsocket
e992834b37 Merge pull request #316 from spees/master
Minor fixes to the UI to prevent overlap
2019-10-18 09:43:59 +02:00
colossus700
55bac8a8b9 Update epd.py
Fixed LM75B import error
2019-10-17 19:03:04 -04:00
Chip Wolf ‮
61a6b77a52 Only show ui complication if you have unread pwnmail 2019-10-17 23:09:49 +01:00
spees
0aa4f95235 Made the memtemp plugin usable and added to default.yml
Signed-off-by: spees <speeskonijn@gmail.com>
2019-10-17 23:55:11 +02:00
Simone Margaritelli
95b871aade releasing v1.0.0RC5 2019-10-17 22:02:53 +02:00
Simone Margaritelli
7b05f10c6f pwngrid 1.7.6 2019-10-17 21:56:12 +02:00
spees
299bd9a5ca Moved APs status to prevent overlap with channel status on inky screens
Signed-off-by: spees <speeskonijn@gmail.com>
2019-10-17 20:10:43 +02:00
spees
10688ca7b0 Moved BT status to prevent overlap with last recon total APS
Signed-off-by: spees <speeskonijn@gmail.com>
2019-10-17 20:07:56 +02:00
evilsocket
6b1bca7cb2 Merge pull request #312 from wytshadow/master
added jp translation
2019-10-17 14:01:18 +02:00
Simone Margaritelli
79688305fd fix: fixed reboot procedure (fixes #313) 2019-10-17 13:42:05 +02:00
evilsocket
13b1fb6d14 Merge pull request #298 from dadav/fix/cool-smilie
Fix the weird looking COOL-face
2019-10-17 13:38:43 +02:00
dadav
8a1aad1a99 changed left and right faces 2019-10-17 13:05:47 +02:00
wytshadow
aeb6536959 added jp translation 2019-10-16 15:09:46 -06:00
Simone Margaritelli
970b6922b7 fix: if -> elif typo (fixes #310) 2019-10-16 17:20:48 +02:00
Simone Margaritelli
18dd71b989 💔 2019-10-16 16:37:42 +02:00
evilsocket
256ccab05c Merge pull request #306 from ciara1234/irish-lang
Adding Irish translations
2019-10-16 14:34:49 +02:00
evilsocket
0aa80d2307 Merge pull request #307 from dadav/fix/improve_bt
Fix/improve bt
2019-10-16 14:34:30 +02:00
dadav
5987f93009 Refracture code 2019-10-16 09:41:47 +02:00
dadav
ebeb22081b Improve logging and add already_connected check 2019-10-16 09:28:29 +02:00
Ciara Brennan
f97b106858 Irish translations
Signed-off-by: Ciara Brennan <ciara.brennan@gmail.com>
2019-10-15 23:52:08 +01:00
evilsocket
c449c77ef9 Merge pull request #304 from deveth0/master
Print effective merged config
2019-10-15 18:17:38 +02:00
amuthmann
a05ea2f48a Merge branch 'master' of github.com:deveth0/pwnagotchi 2019-10-15 17:47:38 +02:00
amuthmann
beb2fedf02 Print effective merged config
Signed-off-by: deveth0 <github@dev-eth0.de>
2019-10-15 17:47:08 +02:00
amuthmann
1936c309f0 Print effective merge config 2019-10-15 17:43:32 +02:00
Simone Margaritelli
ee3fb285be misc: small fix or general refactoring i did not bother commenting 2019-10-15 13:19:30 +02:00
Simone Margaritelli
aa60a369a9 fix: fix for bug mentioned in 13d68c7c24\#commitcomment-35504643 2019-10-15 13:17:26 +02:00
Simone Margaritelli
0e9f9c0f2e fix: fixed typos due to old configuration paths (fixes #300) 2019-10-15 12:05:06 +02:00
Simone Margaritelli
6645c80db3 misc: small fix or general refactoring i did not bother commenting 2019-10-15 11:56:49 +02:00
Simone Margaritelli
13d68c7c24 misc: attempted refactoring of the display support in something less shitty 2019-10-15 11:50:09 +02:00
Simone Margaritelli
df33d20cb2 fix: refactored oledhat layout 2019-10-15 10:45:03 +02:00
Simone Margaritelli
f3eb208c6a fix: refactored papirus layout 2019-10-15 10:42:08 +02:00
Simone Margaritelli
ae5ca2a05e fix: refactored inkyphat layout 2019-10-15 10:37:40 +02:00
evilsocket
a9b9c6677e Merge pull request #296 from systemik/master
Fix for layout.py to handle oledhat
2019-10-15 10:25:43 +02:00
dadav
f85d80d3fd Use the coolest face for the cool emotion 2019-10-14 22:43:12 +02:00
Administrator
4be54cf3ee Fix layout issues 2019-10-14 21:08:07 +02:00
Administrator
c8953d4654 Fix few errors with OledHat 2019-10-14 20:41:41 +02:00
Simone Margaritelli
26ff5c95f2 Merge branch 'master' of github.com:evilsocket/pwnagotchi 2019-10-14 20:20:07 +02:00
Simone Margaritelli
2f0f0edab0 pwngrid 1.7.5 2019-10-14 20:20:00 +02:00
evilsocket
b81c80cf99 Merge pull request #294 from dadav/fix/wpa-sec-cookie
Fix/wpa sec cookie
2019-10-14 20:05:44 +02:00
dadav
baf20a9ac8 Fix url 2019-10-14 19:58:47 +02:00
dadav
280ca22261 Change header to cookie 2019-10-14 19:57:04 +02:00
Simone Margaritelli
277dbd5a16 misc: small fix or general refactoring i did not bother commenting 2019-10-14 19:48:33 +02:00
Simone Margaritelli
5b29f65042 misc: small fix or general refactoring i did not bother commenting 2019-10-14 19:35:49 +02:00
Simone Margaritelli
9f66d7ab96 misc: small fix or general refactoring i did not bother commenting 2019-10-14 19:32:40 +02:00
Simone Margaritelli
9625cf1122 misc: small fix or general refactoring i did not bother commenting 2019-10-14 19:26:23 +02:00
Simone Margaritelli
6b42e48dff misc: refactored ui layout code 2019-10-14 19:21:46 +02:00
evilsocket
d814de75ab Merge pull request #292 from systemik/master
Add support for waveshare oledhat display.
2019-10-14 18:46:28 +02:00
evilsocket
35b442f941 Merge pull request #293 from pcotret/patch-1
Added missing words for the french PO file
2019-10-14 18:42:35 +02:00
Pascal Cotret
0f2ad47c17 Added missing words for the french PO file 2019-10-14 18:25:22 +02:00
Administrator
748dbea13e Fix bug. Line misplaced in the code to init the display. 2019-10-14 18:19:53 +02:00
Administrator
b66f1b66e5 Add oledhat in the default.yml options for ui 2019-10-14 16:41:09 +02:00
Simone Margaritelli
1642663c84 fix: added explicit path for pwngrid client token 2019-10-14 16:40:29 +02:00
Administrator
54a8fd81a5 Initial commit Waveshare OledHat
Add support for Waveshare Oled Hat
Change view.py to have more variable to support more types of screen in the future
2019-10-14 16:38:57 +02:00
Simone Margaritelli
2fe7ac0a71 misc: small fix or general refactoring i did not bother commenting 2019-10-14 16:18:33 +02:00
Simone Margaritelli
4b563398f4 misc: small fix or general refactoring i did not bother commenting 2019-10-14 16:18:07 +02:00
Simone Margaritelli
84be7c0d34 misc: small fix or general refactoring i did not bother commenting 2019-10-14 16:16:59 +02:00
Simone Margaritelli
82bf9b9853 misc: small fix or general refactoring i did not bother commenting 2019-10-14 14:38:24 +02:00
evilsocket
d9d38e7a1e Merge pull request #290 from beliver17/patch-1
Update README.md
2019-10-14 13:17:26 +02:00
beliver17
5b78a13e95 Update README.md 2019-10-14 16:00:05 +05:30
Simone Margaritelli
a8a0f842a3 new: saving unit's fingerprint to /etc/pwnagotchi/fingerprint for easy access 2019-10-14 11:36:42 +02:00
evilsocket
f8a28d375b Merge pull request #276 from dipsylala/master
Inkyphat subclass to incorporate timing changes.
2019-10-14 10:43:39 +02:00
evilsocket
cfa8a02abc Merge pull request #279 from dadav/feature/auto-pairing-bt
Add auto-pair and internet-sharing
2019-10-14 10:42:34 +02:00
evilsocket
e32be6ff27 Merge pull request #285 from cdiemel/plugin.on-callback
on_unfiltered_ap_list() for plugins
2019-10-14 10:42:11 +02:00
evilsocket
ab74395602 Merge pull request #288 from charlesrocket/RU
Fix RU
2019-10-14 10:39:51 +02:00
evilsocket
b7a806c8ad Merge pull request #282 from dadav/feature/migrate-to-statusfile
Migrate to statusfile
2019-10-14 10:38:46 +02:00
-k
e146a87b44 RU locale edits 2019-10-13 22:20:53 -07:00
Casey Diemel
dfb4bcaf21 added on_loaded function
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-13 18:13:25 -04:00
Casey Diemel
9aca3a3a5b added example for testing
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-13 17:53:18 -04:00
Casey Diemel
d15f8c18b5 updated function call
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-13 17:52:41 -04:00
dadav
87a3fb5f0c Migrate to statusfile 2019-10-13 22:39:03 +02:00
dadav
8b366ca736 Add auto-pair and internet-sharing 2019-10-13 21:26:53 +02:00
Casey Diemel
2bbcc36f2a added unfiltered ap list call back
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-13 13:57:45 -04:00
Casey Diemel
308746a7de removed plugin.on() return value as is not needed
Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-13 13:54:22 -04:00
Casey Diemel
d648f7cdf5 Merge branch 'master' into plugin.on-callback
bring the current branch up to evilsocket/pwnagotchi
Signed Off: Casey Diemel <diemelcw@gmail.com>
2019-10-13 13:45:11 -04:00
Dispsylala
5a53670133 Merge remote-tracking branch 'upstream/master' 2019-10-13 18:16:10 +01:00
Simone Margaritelli
e15d0f3323 releasing v1.0.0RC4 2019-10-13 19:07:29 +02:00
Simone Margaritelli
1ce361a839 misc: small fix or general refactoring i did not bother commenting 2019-10-13 18:49:50 +02:00
Dispsylala
e9899dda94 Overrides default inky library to change timings on black rendering 2019-10-13 17:40:58 +01:00
Simone Margaritelli
2430b4a134 misc: small fix or general refactoring i did not bother commenting 2019-10-13 18:35:09 +02:00
Simone Margaritelli
b539a76124 misc: small fix or general refactoring i did not bother commenting 2019-10-13 18:32:14 +02:00
Simone Margaritelli
ba7c0ee4e6 misc: small fix or general refactoring i did not bother commenting 2019-10-13 18:29:56 +02:00
Dispsylala
f0c5ad4b74 Overrides default inky library to change timings on black rendering 2019-10-13 17:18:27 +01:00
Simone Margaritelli
8d2cbee8df fix: fixed log flooding with whitelisten networks for grid report 2019-10-13 18:09:33 +02:00
Simone Margaritelli
6793312691 misc: small fix or general refactoring i did not bother commenting 2019-10-13 18:02:11 +02:00
Simone Margaritelli
5989d2571c misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:55:10 +02:00
Simone Margaritelli
ad2fbdb9dd misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:54:33 +02:00
Simone Margaritelli
1215fda459 misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:45:34 +02:00
Simone Margaritelli
1808392a1d misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:40:30 +02:00
Simone Margaritelli
77efeafd65 misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:39:25 +02:00
Simone Margaritelli
ac5ee1ba7b misc: small fix or general refactoring i did not bother commenting 2019-10-13 17:38:00 +02:00
Simone Margaritelli
ef31366078 mergbe 2019-10-13 17:25:31 +02:00
Simone Margaritelli
5d28557608 new: using pwngrid for mesh advertising (we got rid of scapy loading times) 2019-10-13 17:24:47 +02:00
evilsocket
3a14d1d87f Merge pull request #275 from dadav/feature/bluetooth-plugin
Add bluetooth plugin
2019-10-13 13:25:24 +02:00
dadav
1691896531 add config param 2019-10-13 13:23:38 +02:00
dadav
e08b633c88 add bluetooth plugin 2019-10-13 13:14:22 +02:00
Simone Margaritelli
77c16c38f4 fix: using /proc/uptime to correctly calculate uptime in seconds (fixes #264) 2019-10-13 12:18:35 +02:00
Simone Margaritelli
99d7017785 releasing v1.0.0RC3 2019-10-13 00:07:50 +02:00
Simone Margaritelli
8bc421952b merge 2019-10-12 23:02:37 +02:00
Casey Diemel
3773f96901 Updated on() to allow return values
modified line 21

added line 22-23

Signed-off-by: Casey Diemel <diemelcw@gmail.com>
2019-10-12 16:49:52 -04:00
Simone Margaritelli
b47f3c6b28 fix: fixed restored status after rsa keys generation 2019-10-12 22:01:52 +02:00
evilsocket
17d20837a3 Merge pull request #263 from 0xRoM/cleancap
Cleancap
2019-10-12 20:30:00 +02:00
root
0cccfef14e replaced with os.remove() 2019-10-12 19:29:04 +01:00
root
b46f751e7d modified to better describe plugin 2019-10-12 19:23:41 +01:00
Simone Margaritelli
0f8f77c2be new: new text while generating keys ... 2019-10-12 20:00:50 +02:00
Simone Margaritelli
a9123922c0 fix: better error handling if rsa key files are corrupted (ref #268) 2019-10-12 19:55:20 +02:00
Simone Margaritelli
66e5f89a96 merge 2019-10-12 19:40:42 +02:00
Simone Margaritelli
f84dd00295 fix: ui fixes for inky displays (which i hate) 2019-10-12 19:39:10 +02:00
evilsocket
3535329708 Merge pull request #266 from gpotter2/patch-1
Remove Dot11FCS workaround
2019-10-12 19:17:12 +02:00
Simone Margaritelli
b50c71cf14 fix: removed unused configuration field 2019-10-12 19:13:04 +02:00
Simone Margaritelli
68aebbf126 misc: small fix or general refactoring i did not bother commenting 2019-10-12 19:08:46 +02:00
Simone Margaritelli
c3de66d704 misc: small fix or general refactoring i did not bother commenting 2019-10-12 19:07:32 +02:00
Simone Margaritelli
08a46a5524 misc: small fix or general refactoring i did not bother commenting 2019-10-12 17:56:40 +02:00
Simone Margaritelli
f3e7841b1b misc: small fix or general refactoring i did not bother commenting 2019-10-12 17:53:18 +02:00
Simone Margaritelli
79ba5102d7 fix: cosmetic fixes for inky displays 2019-10-12 17:47:51 +02:00
gpotter2
20036f370d Remove Dot11FCS workaround
Scapy 2.4.3+ (pinned for pwnagotchi) has fixed this issue.

Signed-off-by: gpotter2 <gabriel@potter.fr>
2019-10-12 16:53:29 +02:00
Simone Margaritelli
34b52a11cd fix: fixed sudo in Makefile 2019-10-12 16:48:38 +02:00
root
2d78b52294 cleancap plugin added 2019-10-12 14:49:42 +01:00
root
3cc31686c2 cleancap plugin added 2019-10-12 14:46:25 +01:00
Simone Margaritelli
80159533bc fix: pinning new version of pwngrid 2019-10-12 15:33:42 +02:00
evilsocket
947a41da90 Merge pull request #92 from daswisher/display-fix
Basic display fix for waveshare v1 tri-color
2019-10-12 15:09:58 +02:00
Simone Margaritelli
dea990a531 merge 2019-10-11 23:29:53 +02:00
Simone Margaritelli
dfaf3418af new: grid plugin can now do messaging 2019-10-11 23:29:34 +02:00
evilsocket
36ab3b7655 Merge pull request #260 from chksome/fix-motd-typos
Fix motd typo and some grammar
2019-10-11 20:57:14 +02:00
chksome
5a32a77870 Fix motd typo and some grammar
Signed-off-by: chksome <chksome@protonmail.com>
2019-10-11 13:53:15 -04:00
Simone Margaritelli
7520d4dd6f fix: removed bogus legacy feature (fixes #257) 2019-10-11 19:47:54 +02:00
evilsocket
f73a695747 Merge pull request #259 from python273/patch-1
Fix typo in grid plugin
2019-10-11 19:22:23 +02:00
evilsocket
d94ca76817 Merge pull request #256 from dsopas/master
New portuguese translation added
2019-10-11 19:22:11 +02:00
Kirill
2cfaae1993 Fix typo in grid plugin 2019-10-11 20:13:01 +03:00
Simone Margaritelli
5ed2f2df78 misc: pwngrid 1.5.7 2019-10-11 17:56:57 +02:00
David Sopas
ee55ed7168 Added pt to the list
Added pt (portuguese) language to the "currently implemented" list
2019-10-11 16:52:47 +01:00
David Sopas
ce338e8fef Delete readme.md 2019-10-11 16:42:19 +01:00
David Sopas
9cfa365ec9 Portuguese translation added
Portuguese (european) translation added
2019-10-11 16:41:57 +01:00
David Sopas
fc23415d57 Create readme.md 2019-10-11 16:40:58 +01:00
Simone Margaritelli
fc3367181b fix: better data encapsulation 2019-10-11 17:24:27 +02:00
Simone Margaritelli
8210c0bb71 fix: using pwngrid-peer service from the grid plugin 2019-10-11 16:19:40 +02:00
Simone Margaritelli
3ddc717009 fix: configuring pwngrid-peer service to wait for rsa keys on first boot 2019-10-11 15:34:10 +02:00
Simone Margaritelli
d700e4fd0c new: added pwngrid service to the builder 2019-10-11 15:12:56 +02:00
evilsocket
5eb23e2c84 Merge pull request #254 from caquino/caquino/headers
add motd and defaults.yml disclaimer
2019-10-11 14:17:36 +02:00
Cassiano Aquino
b187b17f9a fix typo 2019-10-11 13:09:19 +01:00
Cassiano Aquino
06e1115cef add motd and defaults.yml disclaimer 2019-10-11 12:51:57 +01:00
evilsocket
71cdaf855d Merge pull request #253 from 0xRoM/quickdic
fix multiple dictionary issue
2019-10-11 11:52:52 +02:00
Michael V. Swisher
9d580ffc0f Updating waveshare logging to specify color vs monochromatic mode 2019-10-11 02:45:22 -07:00
root
f80eeff8fc fix multiple dictionary issue 2019-10-11 10:20:48 +01:00
Simone Margaritelli
be75fc53d4 fix: fixed grid plugin exclusion list use 2019-10-11 09:37:50 +02:00
evilsocket
e6777eba8a Merge pull request #251 from 0xRoM/quickdic
Run a quick dictionary scan against captured handshakes
2019-10-11 08:58:58 +02:00
evilsocket
69d49e1395 Merge pull request #252 from caquino/caquino/firmware
Add hold for firmware and minor cleanup
2019-10-11 08:58:22 +02:00
root
9f3f71ce3d custom face 2019-10-11 00:11:27 +01:00
Cassiano Aquino
28e5ba4e13 Add hold for firmware and minor cleanup 2019-10-10 23:46:10 +01:00
root
e48f9bfcc7 code tidy 2019-10-10 23:34:15 +01:00
root
6c44d7f0f6 quickdic plugin 2019-10-10 19:42:40 +01:00
Simone Margaritelli
86649c8c46 merge 2019-10-10 16:44:11 +02:00
Simone Margaritelli
3d052c5dc1 fix: reporting software version from the grid plugin 2019-10-10 16:43:48 +02:00
Michael V. Swisher
41abfbc981 Typo on self._canvas 2019-10-10 03:23:36 -07:00
Michael V. Swisher
3480b99a45 Updating with master 2019-10-09 21:55:56 -07:00
evilsocket
89dc01c23a Merge pull request #244 from diegopastor/add-es-lang
Add support for spanish language
2019-10-10 00:08:11 +02:00
diego
8a06819979 Merge Master 2019-10-09 16:57:15 -05:00
diego
d72c1d9c93 Add support for spanish language 2019-10-09 16:44:55 -05:00
Simone Margaritelli
078ab63249 new: grid plugin now reports brain.json info 2019-10-09 23:14:02 +02:00
evilsocket
f153f15e9f Merge pull request #239 from caquino/caquino/pt-BR
add pt-BR translation
2019-10-09 23:08:00 +02:00
Cassiano Aquino
d0f34f9528 add pt-BT to the lang comment on config.yml 2019-10-09 20:42:16 +01:00
Cassiano Aquino
da116ea2ad add pt-BR translation 2019-10-09 19:15:40 +01:00
Cassiano Aquino
ad87ea4791 add pt-BR translation 2019-10-09 19:14:42 +01:00
Cassiano Aquino
19b0e00bf5 add pt-BR translation 2019-10-09 19:13:27 +01:00
Cassiano Aquino
315bfd29e5 add pt-BR translation 2019-10-09 19:11:14 +01:00
evilsocket
327bd7d3da Merge pull request #238 from caquino/caquino/travis-image-hash
generate sha256sum from the generated image, add it to the release
2019-10-09 19:55:43 +02:00
Cassiano Aquino
b2a7462b44 Fix typo
add sha256 to extension
2019-10-09 18:55:22 +01:00
evilsocket
a4186e2bfd Merge pull request #236 from caquino/caquino/issue-234
add papirus display system requirements
2019-10-09 19:55:09 +02:00
evilsocket
6de26795af Merge pull request #237 from bitwave/update-de-translation
updated german translation
2019-10-09 19:54:45 +02:00
Cassiano Aquino
2c1a9c471c generate sha256sum from the generated image, add it to the release 2019-10-09 17:50:53 +01:00
Cassiano Aquino
63d95a53c0 add papirus display system requirements 2019-10-09 16:57:00 +01:00
bitwave
d2c160308c updated german translation 2019-10-09 17:46:53 +02:00
evilsocket
a2fa33f2fb Create FUNDING.yml 2019-10-09 16:03:12 +02:00
Michael V. Swisher
1ebb8599b3 Fixing function name mismatch 2019-10-07 07:30:23 -07:00
Michael Swisher
32f87437ec Merge branch 'master' into display-fix 2019-10-05 07:00:51 -07:00
Michael V. Swisher
23cd8ad599 Updating so waveshare 2.13 b/c models only have to maintain black color channel. Color channels aren't used so no need to maintain them 2019-10-05 06:55:04 -07:00
Michael Swisher
defaa154e8 Merge pull request #1 from evilsocket/master
Resync with master
2019-10-03 04:41:07 -07:00
Michael V. Swisher
1b813f41f5 Removing refresh trigger handler since it prevented pwnagotchi ui from displaying 2019-10-03 04:25:28 -07:00
Andreas Kupfer
d3a8dc85c3 add support for 3 colored Waveshare-Display 2019-10-01 22:10:20 +02:00
509 changed files with 89085 additions and 3182 deletions

View File

@@ -3,7 +3,6 @@ maintainers:
- caquino
- dadav
- justin-p
- hexwaxwing
features:
- comments

31
.editorconfig Normal file
View File

@@ -0,0 +1,31 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[Makefile]
indent_style = tab
[*.py]
indent_style = space
indent_size = 4
[*.json]
insert_final_newline = ignore
[*.js]
indent_style = ignore
insert_final_newline = ignore
[*.{md,txt}]
indent_size = 4
trim_trailing_whitespace = false

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHubSponsors-enabled usernames e.g., [user1, user2]
patreon: evilsocket
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

12
.gitignore vendored
View File

@@ -15,3 +15,15 @@ output-pwnagotchi
build
dist
pwnagotchi.egg-info
*backup*.tgz
*backup*.gz
.vscode
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

View File

@@ -9,16 +9,18 @@ env:
deploy:
provider: releases
api_key:
secure: vBUokTv94n8s65STUgTiD6I0Iy8KXbBRvQUrAof8XG+U4ZMsH5PmDTpS+wz+SaxI6o0PRkfyOiPVdARhiKAFnfatG3q9EHllMQwqRR2YIju51A3aCxgEJ5uWDoybwQdipERUMMYwUO/8XZaRRpwFD2bdQBFWkBtQyMcAkrEL8BXckwQQ531oDN2hK5gAiTllqsOswV2idwUlBRU9jOtStzff+UgUYsp/ZebsRodyOYkEB2Ev15yARo2HTXbyZ2icwHPtMbx5zmNUSRtxs9a4hfzaK3m6ctK8qLYYUdQvXub/ruuACapdw4Ez88LY1agTecbZhFYmJzv8oANH1e4VUI4owuHnZCpU6LRutS4wOhglrkOrGo6lSUlJeA+RtQjyjBugjej9DDtDyyIlRU1ZaBF3qWR9N5EXKuquf0olOfmUR67ap1NykE9VUpzkYjkoVRTiPs/e2onM/nRNOvAQcIt75FD13u+Y/DcYQ8r7KpMIu1HNdtbVx8gMeq76bRhP1YdDg2jm+DdJ21KWjf5QHsbyoXDfJzdKlCloLIlAU3EPJhMoXsnNzre0/FXeUl6dfteR1axNS6U7e/vKsQ9rlUFZWIQaeVPjfXmFKblNNVQ5uFrrsB/EGHcJl7IUx5fvcRT5hMMNwC660YxVkBXDbRb5fxMW5/+K0BOi9cP6en8=
secure: "Rj0QnEDv02UzjKaxHHxJ/Sdj50EOFIrsKShr27GtVNSwHmNKxQuwlh31T0DQdif4wzcDtUZ5XWxr85vLkKJt1L8anb7Tb63qlu7Da69C+upSUow1uJkjsiScbMPqwHpwDIkkcUIbPsdbowI7qiNhRBD7nF8yyLPC5YLiU0cXKuGh4+Q5xdIlL3P7p8jm0919Y+olglzAZj0iNR/QxGOb+laNH8xi0oUsIPi5V0ZFfO/W/sm+nks9ki5nolfd1ML1gcbOD7uKuxIMTUrpDLl4p2Jx9IVQW+G2/tkmNLbP5Ga65NxQcfABQDYY3tCD8PsmFK9PEwa4cMbGJjqlo3yR7P21J5Aj3rK+L4KDntOvwem3Z3Y/v2JlQZn+gelhNFCxuPBi3ZihSf7POMHtpAYmi13N2ruzOg1ayjeYph0iN3vXIPs67DpAPaxK+8L2yoo6Nr/Cago9pGTkZoqS+J0fnWT31NXoYREPgg//L2+m42twQirFXttbhlGTBgNMLXpwcm8bZ2DW3pu3AEgVUxSoNAOjudoeyC0VzA6nUqe6STmfk06OYqcwM8q8NEyD62iAvUYU3Q7FnauZqcBqcP+ZYx82NPZybrQRX6YlJck5UomHbbEfjgpDFT+WvjrrfICmXH29YBOL1LWR4cKMT6RY58Cv8hT2PYxomB2I+DRrbqU="
skip_cleanup: true
file_glob: true
file: pwnagotchi-*.zip
file:
- pwnagotchi-*.zip
- pwnagotchi-*.sha256
on:
tags: true
repo: evilsocket/pwnagotchi
branches:
only:
- "/^v[0-9]+\\.[0-9]+\\.[0-9]+[A-Za-z0-9]+?$/"
- "/^v[0-9]+\\.[0-9]+\\.[0-9]+[A-Za-z0-9]*$/"
cache:
apt: true
before_script:

View File

@@ -6,3 +6,4 @@ include LICENSE
recursive-include bin *
recursive-include pwnagotchi *.py
recursive-include pwnagotchi *.yml
recursive-include pwnagotchi *.*

View File

@@ -1,22 +1,30 @@
PACKER_VERSION=1.7.2
PWN_HOSTNAME=pwnagotchi
PWN_VERSION=master
all: install image clean
all: clean install image
langs:
@for lang in pwnagotchi/locale/*/; do\
echo "compiling language: $$lang ..."; \
./scripts/language.sh compile $$(basename $$lang); \
done
install:
curl https://releases.hashicorp.com/packer/1.3.5/packer_1.3.5_linux_amd64.zip -o /tmp/packer.zip
curl https://releases.hashicorp.com/packer/$(PACKER_VERSION)/packer_$(PACKER_VERSION)_linux_amd64.zip -o /tmp/packer.zip
unzip /tmp/packer.zip -d /tmp
mv /tmp/packer /usr/bin/packer
sudo 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
sudo cp /tmp/packer-builder-arm-image/packer-builder-arm-image /usr/bin
image:
cd builder && sudo /usr/bin/packer build -var "pwn_hostname=$(PWN_HOSTNAME)" -var "pwn_version=$(PWN_VERSION)" 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
sudo mv builder/output-pwnagotchi/image pwnagotchi-raspbian-lite-$(PWN_VERSION).img
sudo sha256sum pwnagotchi-raspbian-lite-$(PWN_VERSION).img > pwnagotchi-raspbian-lite-$(PWN_VERSION).sha256
sudo zip pwnagotchi-raspbian-lite-$(PWN_VERSION).zip pwnagotchi-raspbian-lite-$(PWN_VERSION).sha256 pwnagotchi-raspbian-lite-$(PWN_VERSION).img
clean:
rm -rf /tmp/packer-builder-arm-image
rm -f pwnagotchi-raspbian-lite.img
rm -f pwnagotchi-raspbian-lite-*.zip pwnagotchi-raspbian-lite-*.img pwnagotchi-raspbian-lite-*.sha256
rm -rf builder/output-pwnagotchi builder/packer_cache

View File

@@ -1,40 +1,29 @@
# Pwnagotchi
<p align="center">
<p align="center">
<a href="https://github.com/evilsocket/pwnagotchi/releases/latest"><img alt="Release" src="https://img.shields.io/github/release/evilsocket/pwnagotchi.svg?style=flat-square"></a>
<a href="https://github.com/evilsocket/pwnagotchi/blob/master/LICENSE.md"><img alt="Software License" src="https://img.shields.io/badge/license-GPL3-brightgreen.svg?style=flat-square"></a>
<a href="https://github.com/evilsocket/pwnagotchi/graphs/contributors"><img alt="Contributors" src="https://img.shields.io/github/contributors/evilsocket/pwnagotchi"/></a>
<a href="https://travis-ci.org/evilsocket/pwnagotchi"><img alt="Travis" src="https://img.shields.io/travis/evilsocket/pwnagotchi/master.svg?style=flat-square"></a>
<a href="https://pwnagotchi.herokuapp.com/"><img alt="Slack" src="https://pwnagotchi.herokuapp.com/badge.svg"></a>
<a href="https://invite.pwnagotchi.ai/"><img alt="Slack" src="https://invite.pwnagotchi.ai/badge.svg"></a>
<a href="https://community.pwnagotchi.ai/"><img alt="Forum" src="https://img.shields.io/discourse/posts?server=https%3A%2F%2Fcommunity.pwnagotchi.ai%2F&style=flat-square"></a>
<a href="https://twitter.com/intent/follow?screen_name=pwnagotchi"><img src="https://img.shields.io/twitter/follow/pwnagotchi?style=social&logo=twitter" alt="follow on Twitter"></a>
</p>
</p>
[Pwnagotchi](https://twitter.com/pwnagotchi) is an [A2C](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752)-based "AI" leveraging [bettercap](https://www.bettercap.org/) that learns from its surrounding WiFi environment in order to maximize the crackable WPA key material it captures (either passively, or by performing deauthentication and association attacks). This material is collected as PCAP files containing any form of handshake supported by [hashcat](https://hashcat.net/hashcat/), including [PMKIDs](https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/),
[Pwnagotchi](https://pwnagotchi.ai/) is an [A2C](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752)-based "AI" leveraging [bettercap](https://www.bettercap.org/) that learns from its surrounding WiFi environment to maximize the crackable WPA key material it captures (either passively, or by performing authentication and association attacks). This material is collected as PCAP files containing any form of handshake supported by [hashcat](https://hashcat.net/hashcat/), including [PMKIDs](https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/),
full and half WPA handshakes.
![ui](https://i.imgur.com/c7xh4hN.png)
![ui](https://i.imgur.com/X68GXrn.png)
Instead of merely playing [Super Mario or Atari games](https://becominghuman.ai/getting-mario-back-into-the-gym-setting-up-super-mario-bros-in-openais-gym-8e39a96c1e41?gi=c4b66c3d5ced) like most reinforcement learning based "AI" *(yawn)*, Pwnagotchi tunes [its own parameters](https://github.com/evilsocket/pwnagotchi/blob/master/pwnagotchi/defaults.yml#L73) over time to **get better at pwning WiFi things** in the environments you expose it to.
Instead of merely playing [Super Mario or Atari games](https://becominghuman.ai/getting-mario-back-into-the-gym-setting-up-super-mario-bros-in-openais-gym-8e39a96c1e41?gi=c4b66c3d5ced) like most reinforcement learning-based "AI" *(yawn)*, Pwnagotchi tunes [its parameters](https://github.com/evilsocket/pwnagotchi/blob/master/pwnagotchi/defaults.toml) over time to **get better at pwning WiFi things to** in the environments you expose it to.
More specifically, Pwnagotchi is using an [LSTM with MLP feature extractor](https://stable-baselines.readthedocs.io/en/master/modules/policies.html#stable_baselines.common.policies.MlpLstmPolicy) as its policy network for the [A2C agent](https://stable-baselines.readthedocs.io/en/master/modules/a2c.html). If you're unfamiliar with A2C, here is [a very good introductory explanation](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752) (in comic form!) of the basic principles behind how Pwnagotchi learns. (You can read more about how Pwnagotchi learns in the [Usage](https://www.pwnagotchi.ai/usage/#training-the-ai) doc.)
**Keep in mind:** Unlike the usual RL simulations, Pwnagotchi actually learns over time. Time for a Pwnagotchi is measured in epochs; a single epoch can last from a few seconds to minutes, depending on how many access points and client stations are visible. Do not expect your Pwnagotchi to perform amazingly well at the very beginning, as it will be [exploring](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752) several combinations of [key parameters](https://www.pwnagotchi.ai/usage/#training-the-ai) to determine ideal adjustments for pwning the particular environment you are exposing it to during its beginning epochs ... but **definitely listen to your Pwnagotchi when it tells you it's bored!** Bring it into novel WiFi environments with you and have it observe new networks and capture new handshakes—and you'll see. :)
**Keep in mind:** Unlike the usual RL simulations, Pwnagotchi learns over time. Time for a Pwnagotchi is measured in epochs; a single epoch can last from a few seconds to minutes, depending on how many access points and client stations are visible. Do not expect your Pwnagotchi to perform amazingly well at the very beginning, as it will be [exploring](https://hackernoon.com/intuitive-rl-intro-to-advantage-actor-critic-a2c-4ff545978752) several combinations of [key parameters](https://www.pwnagotchi.ai/usage/#training-the-ai) to determine ideal adjustments for pwning the particular environment you are exposing it to during its beginning epochs ... but ** listen to your Pwnagotchi when it tells you it's boring!** Bring it into novel WiFi environments with you and have it observe new networks and capture new handshakes—and you'll see. :)
Multiple units within close physical proximity can "talk" to each other, advertising their own presence to each other by broadcasting custom information elements using a parasite protocol I've built on top of the existing dot11 standard. Over time, two or more units trained together will learn to cooperate upon detecting each other's presence by dividing the available channels among them for optimal pwnage.
## Why does Pwnagotchi exist?
For hackers to learn reinforcement learning, WiFi networking, and have an excuse to get out for more walks. Also? **It's cute as f---**.
**In case you're curious about the name:** *Pwnagotchi* is a portmanteau of *pwn* (which we shouldn't have to explain if you are interested in this project :kissing_heart:) and *-gotchi*. It is a nostalgic reference made in homage to a very popular children's toy from the 1990s called the [Tamagotchi](https://en.wikipedia.org/wiki/Tamagotchi). The Tamagotchi (たまごっち, derived from *tamago* (たまご) "egg" + *uotchi* (ウオッチ) "watch") is a cultural touchstone for many Millennial hackers as a formative electronic toy from our collective childhoods. Were you lucky enough to possess a Tamagotchi as a kid? Well, with your Pwnagotchi, you too can enjoy the nostalgic delight of being strangely emotionally attached to a handheld automata *yet again!* Except, this time around...you get to #HackThePlanet. >:D
Multiple units within close physical proximity can "talk" to each other, advertising their presence to each other by broadcasting custom information elements using a parasite protocol I've built on top of the existing dot11 standard. Over time, two or more units trained together will learn to cooperate upon detecting each other's presence by dividing the available channels among them for optimal pwnage.
## Documentation
---
:warning: **THE FOLLOWING DOCUMENTATION IS BEING PREPARED FOR THE v1.0 RELEASE OF PWNAGOTCHI. Since this effort is an active (and unstable) work-in-progress, the docs displayed here are in various stages of [in]completion. There will be dead links and placeholders throughout as we are still building things out in preparation for the v1.0 release.** :warning:
**IMPORTANT NOTE:** If you'd like to alphatest Pwnagotchi and are trying to get yours up and running while the project is still very unstable, please understand that the documentation here may not reflect what is currently implemented. If you have questions, ask the community of alphatesters in the [official Pwnagotchi Slack](https://pwnagotchi.herokuapp.com). The Pwnagotchi dev team is entirely focused on the v1.0 release and will NOT be providing support for alphatesters trying to get their Pwnagotchis working in the meantime. All technical support during this period of development is being provided by your fellow alphatesters in the Slack (thanks, everybody! :heart:).
https://www.pwnagotchi.ai
@@ -42,10 +31,11 @@ https://www.pwnagotchi.ai
&nbsp; | Official Links
---------|-------
Slack | [pwnagotchi.slack.com](https://pwnagotchi.herokuapp.com)
Twitter | [@pwnagotchi](https://twitter.com/pwnagotchi)
Subreddit | [r/pwnagotchi](https://www.reddit.com/r/pwnagotchi/)
Website | [pwnagotchi.ai](https://pwnagotchi.ai/)
Forum | [community.pwnagotchi.ai](https://community.pwnagotchi.ai/)
Slack | [pwnagotchi.slack.com](https://invite.pwnagotchi.ai/)
Subreddit | [r/pwnagotchi](https://www.reddit.com/r/pwnagotchi/)
Twitter | [@pwnagotchi](https://twitter.com/pwnagotchi)
## License

View File

@@ -1,56 +1,32 @@
#!/usr/bin/python3
if __name__ == '__main__':
import argparse
import time
import os
import logging
import logging
import argparse
import time
import signal
import sys
import toml
import pwnagotchi
import pwnagotchi.utils as utils
import pwnagotchi.plugins as plugins
import pwnagotchi
from pwnagotchi import utils
from pwnagotchi.plugins import cmd as plugins_cmd
from pwnagotchi import log
from pwnagotchi import restart
from pwnagotchi import fs
from pwnagotchi.utils import DottedTomlEncoder
from pwnagotchi.identity import KeyPair
from pwnagotchi.agent import Agent
from pwnagotchi.ui.display import Display
parser = argparse.ArgumentParser()
def do_clear(display):
logging.info("clearing the display ...")
display.clear()
sys.exit(0)
parser.add_argument('-C', '--config', action='store', dest='config', default='/etc/pwnagotchi/default.yml',
help='Main configuration file.')
parser.add_argument('-U', '--user-config', action='store', dest='user_config', default='/etc/pwnagotchi/config.yml',
help='If this file exists, configuration will be merged and this will override default values.')
parser.add_argument('--manual', dest="do_manual", action="store_true", default=False, help="Manual mode.")
parser.add_argument('--clear', dest="do_clear", action="store_true", default=False,
help="Clear the ePaper display and exit.")
parser.add_argument('--debug', dest="debug", action="store_true", default=False,
help="Enable debug logs.")
args = parser.parse_args()
config = utils.load_config(args)
utils.setup_logging(args, config)
plugins.load(config)
keypair = KeyPair()
display = Display(config=config, state={'name': '%s>' % pwnagotchi.name()})
agent = Agent(view=display, config=config, keypair=keypair)
logging.info("%s@%s (v%s)" % (pwnagotchi.name(), agent._keypair.fingerprint, pwnagotchi.version))
for _, plugin in plugins.loaded.items():
logging.debug("plugin '%s' v%s loaded from %s" % (plugin.__name__, plugin.__version__, plugin.__file__))
if args.do_clear:
logging.info("clearing the display ...")
display.clear()
elif args.do_manual:
logging.info("entering manual mode ...")
agent.last_session.parse()
def do_manual_mode(agent):
logging.info("entering manual mode ...")
agent.mode = 'manual'
agent.last_session.parse(agent.view(), args.skip_session)
if not args.skip_session:
logging.info(
"the last session lasted %s (%d completed epochs, trained for %d), average reward:%s (min:%s max:%s)" % (
agent.last_session.duration_human,
@@ -60,52 +36,131 @@ if __name__ == '__main__':
agent.last_session.min_reward,
agent.last_session.max_reward))
while True:
display.on_manual_mode(agent.last_session)
time.sleep(1)
while True:
display.on_manual_mode(agent.last_session)
time.sleep(5)
if grid.is_connected():
plugins.on('internet_available', agent)
if Agent.is_connected():
def do_auto_mode(agent):
logging.info("entering auto mode ...")
agent.mode = 'auto'
agent.start()
while True:
try:
# recon on all channels
agent.recon()
# get nearby access points grouped by channel
channels = agent.get_access_points_by_channel()
# for each channel
for ch, aps in channels:
agent.set_channel(ch)
if not agent.is_stale() and agent.any_activity():
logging.info("%d access points on channel %d" % (len(aps), ch))
# for each ap on this channel
for ap in aps:
# send an association frame in order to get for a PMKID
agent.associate(ap)
# deauth all client stations in order to get a full handshake
for sta in ap['clients']:
agent.deauth(ap, sta)
# An interesting effect of this:
#
# From Pwnagotchi's perspective, the more new access points
# and / or client stations nearby, the longer one epoch of
# its relative time will take ... basically, in Pwnagotchi's universe,
# WiFi electromagnetic fields affect time like gravitational fields
# affect ours ... neat ^_^
agent.next_epoch()
if grid.is_connected():
plugins.on('internet_available', agent)
except Exception as e:
logging.exception("main loop exception (%s)", e)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser = plugins_cmd.add_parsers(parser)
parser.add_argument('-C', '--config', action='store', dest='config', default='/etc/pwnagotchi/default.toml',
help='Main configuration file.')
parser.add_argument('-U', '--user-config', action='store', dest='user_config', default='/etc/pwnagotchi/config.toml',
help='If this file exists, configuration will be merged and this will override default values.')
parser.add_argument('--manual', dest="do_manual", action="store_true", default=False, help="Manual mode.")
parser.add_argument('--skip-session', dest="skip_session", action="store_true", default=False,
help="Skip last session parsing in manual mode.")
parser.add_argument('--clear', dest="do_clear", action="store_true", default=False,
help="Clear the ePaper display and exit.")
parser.add_argument('--debug', dest="debug", action="store_true", default=False,
help="Enable debug logs.")
parser.add_argument('--version', dest="version", action="store_true", default=False,
help="Print the version.")
parser.add_argument('--print-config', dest="print_config", action="store_true", default=False,
help="Print the configuration.")
args = parser.parse_args()
if plugins_cmd.used_plugin_cmd(args):
config = utils.load_config(args)
log.setup_logging(args, config)
rc = plugins_cmd.handle_cmd(args, config)
sys.exit(rc)
if args.version:
print(pwnagotchi.__version__)
sys.exit(0)
config = utils.load_config(args)
if args.print_config:
print(toml.dumps(config, encoder=DottedTomlEncoder()))
sys.exit(0)
from pwnagotchi.identity import KeyPair
from pwnagotchi.agent import Agent
from pwnagotchi.ui import fonts
from pwnagotchi.ui.display import Display
from pwnagotchi import grid
from pwnagotchi import plugins
pwnagotchi.config = config
fs.setup_mounts(config)
log.setup_logging(args, config)
fonts.init(config)
pwnagotchi.set_name(config['main']['name'])
plugins.load(config)
display = Display(config=config, state={'name': '%s>' % pwnagotchi.name()})
if args.do_clear:
do_clear(display)
sys.exit(0)
agent = Agent(view=display, config=config, keypair=KeyPair(view=display))
def usr1_handler(*unused):
logging.info('Received USR1 singal. Restart process ...')
restart("MANU" if args.do_manual else "AUTO")
signal.signal(signal.SIGUSR1, usr1_handler)
if args.do_manual:
do_manual_mode(agent)
else:
logging.info("entering auto mode ...")
agent.start()
while True:
try:
# recon on all channels
agent.recon()
# get nearby access points grouped by channel
channels = agent.get_access_points_by_channel()
# check for free channels to use
agent.check_channels(channels)
# for each channel
for ch, aps in channels:
agent.set_channel(ch)
if not agent.is_stale() and agent.any_activity():
logging.info("%d access points on channel %d" % (len(aps), ch))
# for each ap on this channel
for ap in aps:
# send an association frame in order to get for a PMKID
agent.associate(ap)
# deauth all client stations in order to get a full handshake
for sta in ap['clients']:
agent.deauth(ap, sta)
# An interesting effect of this:
#
# From Pwnagotchi's perspective, the more new access points
# and / or client stations nearby, the longer one epoch of
# its relative time will take ... basically, in Pwnagotchi's universe,
# WiFi electromagnetic fields affect time like gravitational fields
# affect ours ... neat ^_^
agent.next_epoch()
if Agent.is_connected():
plugins.on('internet_available', agent)
except Exception as e:
logging.exception("main loop exception")
do_auto_mode(agent)

View File

@@ -0,0 +1,29 @@
_show_complete()
{
local cur opts node_names all_options opt_line
all_options="
pwnagotchi -h --help -C --config -U --user-config --manual --skip-session --clear --debug --version --print-config {plugins}
pwnagotchi plugins -h --help {list,install,enable,disable,uninstall,update,upgrade}
pwnagotchi plugins list -i --installed -h --help
pwnagotchi plugins install -h --help
pwnagotchi plugins uninstall -h --help
pwnagotchi plugins enable -h --help
pwnagotchi plugins disable -h --help
pwnagotchi plugins update -h --help
pwnagotchi plugins upgrade -h --help
"
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
cmd="${COMP_WORDS[@]:0:${#COMP_WORDS[@]}-1}"
opt_line="$(grep -m1 "$cmd" <<<$all_options)"
if [[ ${cur} == -* ]] ; then
opts="$(echo $opt_line | tr ' ' '\n' | awk '/^ *-/{gsub("[^a-zA-Z0-9-]","",$1);print $1}')"
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
opts="$(echo $opt_line | grep -Po '{\K[^}]+' | tr ',' '\n')"
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
}
complete -F _show_complete pwnagotchi

View File

@@ -0,0 +1,2 @@
allow-hotplug eth0
iface eth0 inet dhcp

View File

@@ -0,0 +1,2 @@
auto lo
iface lo inet loopback

View File

@@ -0,0 +1,8 @@
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
metric 20

View File

@@ -0,0 +1,2 @@
allow-hotplug wlan0
iface wlan0 inet static

View File

@@ -0,0 +1,14 @@
[Unit]
Description=bettercap api.rest service.
Documentation=https://bettercap.org
Wants=network.target
[Service]
Type=simple
PermissionsStartOnly=true
ExecStart=/usr/bin/bettercap-launcher
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,20 @@
[Unit]
Description=pwnagotchi Deep Reinforcement Learning instrumenting bettercap for WiFI pwning.
Documentation=https://pwnagotchi.ai
Wants=network.target
After=pwngrid-peer.service
[Service]
Type=simple
WorkingDirectory=/tmp
PermissionsStartOnly=true
ExecStart=/usr/bin/pwnagotchi-launcher
Restart=always
RestartSec=30
TasksMax=infinity
LimitNPROC=infinity
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,15 @@
[Unit]
Description=pwngrid peer service.
Documentation=https://pwnagotchi.ai
Wants=network.target
After=bettercap.service
[Service]
Type=simple
PermissionsStartOnly=true
ExecStart=/usr/bin/pwngrid -keys /etc/pwnagotchi -address 127.0.0.1:8666 -client-token /root/.api-enrollment.json -wait -log /var/log/pwngrid-peer.log -iface mon0
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
source /usr/bin/pwnlib
# we need to decrypt something
if is_crypted_mode; then
while ! is_decrypted; do
echo "Waiting for decryption..."
sleep 1
done
fi
# check if wifi driver is bugged
if ! check_brcm; then
if ! reload_brcm; then
echo "Could not reload wifi driver. Reboot"
reboot
fi
sleep 10
fi
# start mon0
start_monitor_interface
if is_auto_mode_no_delete; then
/usr/bin/bettercap -no-colors -caplet pwnagotchi-auto -iface mon0
else
/usr/bin/bettercap -no-colors -caplet pwnagotchi-manual -iface mon0
fi

View File

@@ -0,0 +1,148 @@
#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qsl
_HTML_FORM_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>Decryption</title>
<style>
body {{ text-align: center; padding: 150px; }}
h1 {{ font-size: 50px; }}
body {{ font: 20px Helvetica, sans-serif; color: #333; }}
article {{ display: block; text-align: center; width: 650px; margin: 0 auto;}}
input {{
padding: 12px 20px;
margin: 8px 0;
box-sizing: border-box;
border: 1px solid #ccc;
}}
input[type=password] {{
width: 75%;
font-size: 24px;
}}
input[type=submit] {{
cursor: pointer;
width: 75%;
}}
input[type=submit]:hover {{
background-color: #d9d9d9;
}}
</style>
</head>
<body>
<article>
<h1>Decryption</h1>
<p>Some of your files are encrypted.</p>
<p>Please provide the decryption password.</p>
<div>
<form action="/set-password" method="POST">
{password_fields}
<input type="submit" value="Submit">
</form>
</div>
</article>
</body>
</html>
"""
POST_RESPONSE = """
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
/* Center the loader */
#loader {
position: absolute;
left: 50%;
top: 50%;
z-index: 1;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top: 16px solid #3498db;
width: 120px;
height: 120px;
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
#myDiv {
display: none;
text-align: center;
}
</style>
<script type="text/javascript">
function checkPwnagotchi() {
var target = 'http://' + document.location.hostname + ':8080/';
var xhr = new XMLHttpRequest();
xhr.open('GET', target);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status == 401) {
window.location.replace(target);
}else{
setTimeout(checkPwnagotchi, 1000);
}
}
};
xhr.send();
}
setTimeout(checkPwnagotchi, 1000);
</script>
</head>
<body style="margin:0;">
<div id="loader"></div>
</body>
</html>
"""
HTML_FORM = None
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(HTML_FORM.encode())
def do_POST(self):
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length)
for mapping, password in parse_qsl(body.decode('UTF-8')):
with open('/tmp/.pwnagotchi-secret-{}'.format(mapping), 'wt') as pwfile:
pwfile.write(password)
self.send_response(200)
self.end_headers()
self.wfile.write(POST_RESPONSE.encode())
with open('/root/.pwnagotchi-crypted') as crypted_file:
mappings = [line.split()[0] for line in crypted_file.readlines()]
fields = ''.join(['<label for="{m}">Passphrase for {m}:</label>\n<input type="password" id="{m}" name="{m}" value=""><br>'.format(m=m)
for m in mappings])
HTML_FORM = _HTML_FORM_TEMPLATE.format(password_fields=fields)
httpd = HTTPServer(('0.0.0.0', 80), SimpleHTTPRequestHandler)
httpd.serve_forever()

2
builder/data/usr/bin/hdmioff Executable file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo /opt/vc/bin/tvservice -o

2
builder/data/usr/bin/hdmion Executable file
View File

@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo /opt/vc/bin/tvservice -p

3
builder/data/usr/bin/monstart Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
source /usr/bin/pwnlib
start_monitor_interface

3
builder/data/usr/bin/monstop Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
source /usr/bin/pwnlib
stop_monitor_interface

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
source /usr/bin/pwnlib
# we need to decrypt something
if is_crypted_mode; then
while ! is_decrypted; do
echo "Waiting for decryption..."
sleep 1
done
fi
# blink 10 times to signal ready state
blink_led 10 &
if is_auto_mode; then
/usr/local/bin/pwnagotchi
else
/usr/local/bin/pwnagotchi --manual
fi

184
builder/data/usr/bin/pwnlib Executable file
View File

@@ -0,0 +1,184 @@
#!/usr/bin/env bash
# well ... it blinks the led
blink_led() {
for i in $(seq 1 "$1"); do
echo 0 >/sys/class/leds/led0/brightness
sleep 0.3
echo 1 >/sys/class/leds/led0/brightness
sleep 0.3
done
echo 0 >/sys/class/leds/led0/brightness
sleep 0.3
}
# check if brcm is stuck
check_brcm() {
if [[ "$(journalctl -n10 -k --since -5m | grep -c 'brcmf_cfg80211_nexmon_set_channel.*Set Channel failed')" -ge 5 ]]; then
return 1
fi
return 0
}
# reload mod
reload_brcm() {
if ! modprobe -r brcmfmac; then
return 1
fi
if ! modprobe brcmfmac; then
return 1
fi
return 0
}
# starts mon0
start_monitor_interface() {
iw phy "$(iw phy | head -1 | cut -d" " -f2)" interface add mon0 type monitor && ifconfig mon0 up
}
# stops mon0
stop_monitor_interface() {
ifconfig mon0 down && iw dev mon0 del
}
# returns 0 if the specificed network interface is up
is_interface_up() {
if grep -qi 'up' /sys/class/net/$1/operstate; then
return 0
fi
return 1
}
# returns 0 if conditions for AUTO mode are met
is_auto_mode() {
# check override file first
if [ -f /root/.pwnagotchi-manual ]; then
# remove the override file if found
rm -rf /root/.pwnagotchi-manual
return 1
fi
# check override file first
if [ -f /root/.pwnagotchi-auto ]; then
# remove the override file if found
rm -rf /root/.pwnagotchi-auto
return 0
fi
# if usb0 is up, we're in MANU
if is_interface_up usb0; then
return 1
fi
# if eth0 is up (for other boards), we're in MANU
if is_interface_up eth0; then
return 1
fi
# no override, but none of the interfaces is up -> AUTO
return 0
}
# returns 0 if conditions for AUTO mode are met
is_auto_mode_no_delete() {
# check override file first
if [ -f /root/.pwnagotchi-manual ]; then
return 1
fi
# check override file first
if [ -f /root/.pwnagotchi-auto ]; then
return 0
fi
# if usb0 is up, we're in MANU
if is_interface_up usb0; then
return 1
fi
# if eth0 is up (for other boards), we're in MANU
if is_interface_up eth0; then
return 1
fi
# no override, but none of the interfaces is up -> AUTO
return 0
}
# check if we need to decrypt something
is_crypted_mode() {
if [ -f /root/.pwnagotchi-crypted ]; then
return 0
fi
return 1
}
# decryption loop
is_decrypted() {
while read -r mapping container mount; do
# mapping = name the device or file will be mapped to
# container = the luks encrypted device or file
# mount = the mountpoint
# fail if not mounted
if ! mountpoint -q "$mount" >/dev/null 2>&1; then
if [ -f /tmp/.pwnagotchi-secret-"$mapping" ]; then
</tmp/.pwnagotchi-secret-"$mapping" read -r SECRET
if ! test -b /dev/disk/by-id/dm-uuid-*"$(cryptsetup luksUUID "$container" | tr -d -)"*; then
if echo -n "$SECRET" | cryptsetup luksOpen -d- "$container" "$mapping" >/dev/null 2>&1; then
echo "Container decrypted!"
fi
fi
if mount /dev/mapper/"$mapping" "$mount" >/dev/null 2>&1; then
echo "Mounted /dev/mapper/$mapping to $mount"
continue
fi
fi
if ! ip -4 addr show wlan0 | grep inet >/dev/null 2>&1; then
>/dev/null 2>&1 ip addr add 192.168.0.10/24 dev wlan0
fi
if ! pgrep -f decryption-webserver >/dev/null 2>&1; then
>/dev/null 2>&1 decryption-webserver &
fi
if ! pgrep wpa_supplicant >/dev/null 2>&1; then
>/tmp/wpa_supplicant.conf cat <<EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
ap_scan=2
network={
ssid="DECRYPT-ME"
mode=2
key_mgmt=WPA-PSK
psk="pwnagotchi"
frequency=2437
}
EOF
>/dev/null 2>&1 wpa_supplicant -D nl80211 -i wlan0 -c /tmp/wpa_supplicant.conf &
fi
if ! pgrep dnsmasq >/dev/null 2>&1; then
>/dev/null 2>&1 dnsmasq -k -p 53 -h -O "6,192.168.0.10" -A "/#/192.168.0.10" -i wlan0 -K -F 192.168.0.50,192.168.0.60,255.255.255.0,24h &
fi
return 1
fi
done </root/.pwnagotchi-crypted
# overwrite passwords
python3 -c 'print("A"*4096)' | tee /tmp/.pwnagotchi-secret-* >/dev/null
# delete
rm /tmp/.pwnagotchi-secret-*
sync # flush
pkill wpa_supplicant
pkill dnsmasq
pid="$(pgrep -f "decryption-webserver")"
[[ -n "$pid" ]] && kill "$pid"
return 0
}

View File

@@ -1,12 +1,13 @@
{
"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
}],
"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": "9e5cf24ce483bb96e7736ea75ca422e3560e7b455eee63dd28f66fa1825db70e",
"last_partition_extra_size": 3221225472
}
],
"provisioners": [
{
"type": "shell",
@@ -18,8 +19,85 @@
]
},
{
"type":"ansible-local",
"type": "file",
"source": "data/usr/bin/pwnlib",
"destination": "/usr/bin/pwnlib"
},
{
"type": "file",
"source": "data/usr/bin/bettercap-launcher",
"destination": "/usr/bin/bettercap-launcher"
},
{
"type": "file",
"source": "data/usr/bin/pwnagotchi-launcher",
"destination": "/usr/bin/pwnagotchi-launcher"
},
{
"type": "file",
"source": "data/usr/bin/monstop",
"destination": "/usr/bin/monstop"
},
{
"type": "file",
"source": "data/usr/bin/monstart",
"destination": "/usr/bin/monstart"
},
{
"type": "file",
"source": "data/usr/bin/hdmion",
"destination": "/usr/bin/hdmion"
},
{
"type": "file",
"source": "data/usr/bin/hdmioff",
"destination": "/usr/bin/hdmioff"
},
{
"type": "file",
"source": "data/etc/network/interfaces.d/lo-cfg",
"destination": "/etc/network/interfaces.d/lo-cfg"
},
{
"type": "file",
"source": "data/etc/network/interfaces.d/wlan0-cfg",
"destination": "/etc/network/interfaces.d/wlan0-cfg"
},
{
"type": "file",
"source": "data/etc/network/interfaces.d/usb0-cfg",
"destination": "/etc/network/interfaces.d/usb0-cfg"
},
{
"type": "file",
"source": "data/etc/network/interfaces.d/eth0-cfg",
"destination": "/etc/network/interfaces.d/eth0-cfg"
},
{
"type": "file",
"source": "data/etc/systemd/system/pwngrid-peer.service",
"destination": "/etc/systemd/system/pwngrid-peer.service"
},
{
"type": "file",
"source": "data/etc/systemd/system/pwnagotchi.service",
"destination": "/etc/systemd/system/pwnagotchi.service"
},
{
"type": "file",
"source": "data/etc/systemd/system/bettercap.service",
"destination": "/etc/systemd/system/bettercap.service"
},
{
"type": "shell",
"inline": [
"chmod +x /usr/bin/*"
]
},
{
"type": "ansible-local",
"playbook_file": "pwnagotchi.yml",
"extra_arguments": [ "--extra-vars \"ansible_python_interpreter=/usr/bin/python3\"" ],
"command": "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION={{user `pwn_version`}} PWN_HOSTNAME={{user `pwn_hostname`}} ansible-playbook"
},
{

View File

@@ -9,13 +9,21 @@
system:
boot_options:
- "dtoverlay=dwc2"
- "dtparam=spi=on"
- "dtoverlay=spi1-3cs"
- "dtparam=spi=on"
- "dtparam=i2c_arm=on"
- "dtparam=i2c1=on"
- "gpu_mem=16"
modules:
- "i2c-dev"
services:
enable:
- dphys-swapfile.service
- pwnagotchi.service
- bettercap.service
- pwngrid-peer.service
- epd-fuse.service
- fstrim.timer
disable:
- apt-daily.timer
- apt-daily.service
@@ -27,16 +35,25 @@
- ifup@wlan0.service
packages:
bettercap:
url: "https://github.com/bettercap/bettercap/releases/download/v2.25/bettercap_linux_armv6l_2.25.zip"
url: "https://github.com/bettercap/bettercap/releases/download/v2.31.0/bettercap_linux_armhf_v2.31.0.zip"
ui: "https://github.com/bettercap/ui/releases/download/v1.3.0/ui.zip"
pwngrid:
url: "https://github.com/evilsocket/pwngrid/releases/download/v1.10.3/pwngrid_linux_armhf_v1.10.3.zip"
apt:
hold:
- firmware-atheros
- firmware-brcm80211
- firmware-libertas
- firmware-misc-nonfree
- firmware-realtek
remove:
- rasberrypi-net-mods
- raspberrypi-net-mods
- dhcpcd5
- triggerhappy
- wpa_supplicant
- nfs-common
install:
- rsync
- vim
- screen
- golang
@@ -79,26 +96,35 @@
- fonts-dejavu-core
- fonts-dejavu-extra
- python3-pil
- python3-smbus
- libfuse-dev
- bc
- fonts-freefont-ttf
- fbi
- fonts-ipaexfont-gothic
- cryptsetup
- dnsmasq
tasks:
- name: selected hostname
debug:
msg: "{{ pwnagotchi.hostname }}"
- name: build version
debug:
msg: "{{ pwnagotchi.version }}"
- name: change hostname
hostname:
name: "{{pwnagotchi.hostname}}"
when: lookup('file', '/etc/hostname') == "raspberrypi"
register: hostname
- name: add hostname to /etc/hosts
lineinfile:
dest: /etc/hosts
regexp: '^127\.0\.0\.1[ \t]+localhost'
line: '127.0.0.1 localhost {{pwnagotchi.hostname}} {{pwnagotchi.hostname}}.local'
regexp: '^127\.0\.1\.1[ \t]+raspberrypi'
line: "127.0.1.1\t{{pwnagotchi.hostname}}"
state: present
when: hostname.changed
- name: disable sap plugin for bluetooth.service
lineinfile:
dest: /lib/systemd/system/bluetooth.service
regexp: '^ExecStart=/usr/lib/bluetooth/bluetoothd$'
line: 'ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap'
state: present
- name: Add re4son-kernel repo key
@@ -111,6 +137,12 @@
repo: deb http://http.re4son-kernel.com/re4son/ kali-pi main
state: present
- name: add firmware packages to hold
dpkg_selections:
name: "{{ item }}"
selection: hold
with_items: "{{ packages.apt.hold }}"
- name: update apt package cache
apt:
update_cache: yes
@@ -135,6 +167,46 @@
path: /etc/dphys-swapfile
content: "CONF_SWAPSIZE=1024"
- name: clone papirus repository
git:
repo: https://github.com/repaper/gratis.git
dest: /usr/local/src/gratis
register: gratisgit
- name: build papirus service
make:
chdir: /usr/local/src/gratis
target: rpi
params:
EPD_IO: epd_io_free_uart.h
PANEL_VERSION: 'V231_G2'
when: gratisgit.changed
- name: install papirus service
make:
chdir: /usr/local/src/gratis
target: rpi-install
params:
EPD_IO: epd_io_free_uart.h
PANEL_VERSION: 'V231_G2'
when: gratisgit.changed
- name: configure papirus display size
lineinfile:
dest: /etc/default/epd-fuse
regexp: "#EPD_SIZE=2.0"
line: "EPD_SIZE=2.0"
- name: collect python pip package list
command: "pip3 list"
register: pip_output
- name: set python pip package facts
set_fact:
pip_packages: >
{{ pip_packages | default({}) | combine( { item.split()[0]: item.split()[1] } ) }}
with_items: "{{ pip_output.stdout_lines }}"
- name: acquire python3 pip target
command: "python3 -c 'import sys;print(sys.path.pop())'"
register: pip_target
@@ -143,26 +215,56 @@
git:
repo: https://github.com/evilsocket/pwnagotchi.git
dest: /usr/local/src/pwnagotchi
register: pwnagotchigit
- name: create /usr/local/share/pwnagotchi/ folder
file:
path: /usr/local/share/pwnagotchi/
state: directory
- name: clone pwnagotchi plugins repository
git:
repo: https://github.com/evilsocket/pwnagotchi-plugins-contrib.git
dest: /usr/local/share/pwnagotchi/availaible-plugins
- name: fetch pwnagotchi version
set_fact:
pwnagotchi_version: "{{ lookup('file', '/usr/local/src/pwnagotchi/pwnagotchi/_version.py') | regex_replace('.*__version__.*=.*''([0-9]+\\.[0-9]+\\.[0-9]+[A-Za-z0-9]*)''.*', '\\1') }}"
- name: pwnagotchi version found
debug:
msg: "{{ pwnagotchi_version }}"
- name: build pwnagotchi wheel
command: "python3 setup.py sdist bdist_wheel"
args:
chdir: /usr/local/src/pwnagotchi
when: (pwnagotchigit.changed) or (pip_packages['pwnagotchi'] is undefined) or (pip_packages['pwnagotchi'] != pwnagotchi_version)
- name: install opencv-python
pip:
name: "https://www.piwheels.hostedpi.com/simple/opencv-python/opencv_python-3.4.3.18-cp37-cp37m-linux_armv6l.whl"
name: "https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.3.18-cp37-cp37m-linux_armv6l.whl"
extra_args: "--no-deps --no-cache-dir --platform=linux_armv6l --only-binary=:all: --target={{ pip_target.stdout }}"
when: (pip_packages['opencv-python'] is undefined) or (pip_packages['opencv-python'] != '3.4.3.18')
- name: install tensorflow
pip:
name: "https://www.piwheels.hostedpi.com/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl"
name: "https://www.piwheels.org/simple/tensorflow/tensorflow-1.13.1-cp37-none-linux_armv6l.whl"
extra_args: "--no-deps --no-cache-dir --platform=linux_armv6l --only-binary=:all: --target={{ pip_target.stdout }}"
when: (pip_packages['tensorflow'] is undefined) or (pip_packages['tensorflow'] != '1.13.1')
- name: install pwnagotchi wheel and dependencies
pip:
name: "{{ lookup('fileglob', '/usr/local/src/pwnagotchi/dist/pwnagotchi*.whl') }}"
extra_args: "--no-cache-dir"
when: (pwnagotchigit.changed) or (pip_packages['pwnagotchi'] is undefined) or (pip_packages['pwnagotchi'] != pwnagotchi_version)
- name: download and install pwngrid
unarchive:
src: "{{ packages.pwngrid.url }}"
dest: /usr/bin
remote_src: yes
mode: 0755
- name: download and install bettercap
unarchive:
@@ -178,11 +280,13 @@
git:
repo: https://github.com/bettercap/caplets.git
dest: /tmp/caplets
register: capletsgit
- name: install bettercap caplets
make:
chdir: /tmp/caplets
target: install
when: capletsgit.changed
- name: download and install bettercap ui
unarchive:
@@ -191,167 +295,34 @@
remote_src: yes
mode: 0755
- 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 bash
free -m | awk '/Mem/ { printf( "%d %", $3 / $2 * 100 + 0.5 ) }'
- name: create bootblink script
copy:
dest: /usr/bin/bootblink
mode: 0755
content: |
#!/usr/bin/env bash
for i in $(seq 1 "$1");
do
echo 0 >/sys/class/leds/led0/brightness
sleep 0.3
echo 1 >/sys/class/leds/led0/brightness
sleep 0.3
done
echo 0 >/sys/class/leds/led0/brightness
sleep 0.3
- name: create pwnagotchi-launcher script
copy:
dest: /usr/bin/pwnagotchi-launcher
mode: 0755
content: |
#!/usr/bin/env bash
# blink 10 times to signal ready state
/usr/bin/bootblink 10 &
# start a detached screen session with bettercap
if ifconfig | grep usb0 | grep RUNNING; then
# if override file exists, go into auto mode
if [ -f /root/.pwnagotchi-auto ]; then
rm /root/.pwnagotchi-auto
/usr/local/bin/pwnagotchi
else
/usr/local/bin/pwnagotchi --manual
fi
else
/usr/local/bin/pwnagotchi
fi
- name: create bettercap-launcher script
copy:
dest: /usr/bin/bettercap-launcher
mode: 0755
content: |
#!/usr/bin/env bash
# blink 10 times to signal ready state
/usr/bin/bootblink 10 &
if ifconfig | grep usb0 | grep RUNNING; then
# if override file exists, go into auto mode
if [ -f /root/.pwnagotchi-auto ]; then
rm /root/.pwnagotchi-auto
/usr/bin/bettercap -no-colors -caplet pwnagotchi-auto
else
/usr/bin/bettercap -no-colors -caplet pwnagotchi-manual
fi
else
/usr/bin/bettercap -no-colors -caplet pwnagotchi-auto
fi
- 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: create hdmion script
copy:
dest: /usr/bin/hdmion
mode: 0755
content: |
#!/usr/bin/env bash
sudo /opt/vc/bin/tvservice -p
- name: create hdmioff script
copy:
dest: /usr/bin/hdmioff
mode: 0755
content: |
#!/usr/bin/env bash
sudo /opt/vc/bin/tvservice -o
- name: add HDMI powersave to rc.local
blockinfile:
path: /etc/rc.local
insertbefore: "exit 0"
block: |
if ! /opt/vc/bin/tvservice -s | grep HDMI; then
if ! /opt/vc/bin/tvservice -s | egrep 'HDMI|DVI'; then
/opt/vc/bin/tvservice -o
fi
- name: create /etc/pwnagotchi/config.yml
blockinfile:
path: /etc/pwnagotchi/config.yml
create: yes
block: |
# put here your custom configuration overrides
- name: create /etc/pwnagotchi folder
file:
path: /etc/pwnagotchi
state: directory
- name: configure lo interface
blockinfile:
path: /etc/network/interfaces.d/lo-cfg
create: yes
block: |
auto lo
iface lo inet loopback
- name: check if user configuration exists
stat:
path: /etc/pwnagotchi/config.toml
register: user_config
- name: configure wlan interface
blockinfile:
path: /etc/network/interfaces.d/wlan0-cfg
create: yes
block: |
allow-hotplug wlan0
iface wlan0 inet static
- 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: create /etc/pwnagotchi/config.toml
copy:
dest: /etc/pwnagotchi/config.toml
content: |
# Add your configuration overrides on this file any configuration changes done to default.toml will be lost!
# Example:
# ui.display.enabled = true
# ui.display.type = "waveshare_2"
when: not user_config.stat.exists
- name: enable ssh on boot
file:
@@ -363,8 +334,14 @@
dest: /boot/config.txt
insertafter: EOF
line: '{{ item }}'
with_items:
- "{{system.boot_options}}"
with_items: "{{system.boot_options}}"
- name: adjust /etc/modules
lineinfile:
dest: /etc/modules
insertafter: EOF
line: '{{ item }}'
with_items: "{{system.modules}}"
- name: change root partition
replace:
@@ -385,7 +362,34 @@
- name: configure motd
copy:
dest: /etc/motd
content: "(◕‿‿◕) {{pwnagotchi.hostname}} (pwnagotchi-{{pwnagotchi.version}})"
content: |
(◕‿‿◕) {{pwnagotchi.hostname}}
Hi! I'm a pwnagotchi, please take good care of me!
Here are some basic things you need to know to raise me properly!
If you want to change my configuration, use /etc/pwnagotchi/config.toml
All the configuration options can be found on /etc/pwnagotchi/default.toml,
but don't change this file because I will recreate it every time I'm restarted!
I'm managed by systemd. Here are some basic commands.
If you want to know what I'm doing, you can check my logs with the command
tail -f /var/log/pwnagotchi.log
If you want to know if I'm running, you can use
systemctl status pwnagotchi
You can restart me using
systemctl restart pwnagotchi
But be aware I will go into MANUAL mode when restarted!
You can put me back into AUTO mode using
touch /root/.pwnagotchi-auto && systemctl restart pwnagotchi
You learn more about me at https://pwnagotchi.ai/
when: hostname.changed
- name: clean apt cache
apt:
@@ -395,52 +399,6 @@
apt:
autoremove: yes
- name: add bettercap service to systemd
copy:
dest: /etc/systemd/system/bettercap.service
content: |
[Unit]
Description=bettercap api.rest service.
Documentation=https://bettercap.org
Wants=network.target
After=network.target
[Service]
Type=simple
PermissionsStartOnly=true
ExecStartPre=/usr/bin/monstart
ExecStart=/usr/bin/bettercap-launcher
ExecStopPost=/usr/bin/monstop
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
notify:
- reload systemd services
- name: add pwnagotchi service to systemd
copy:
dest: /etc/systemd/system/pwnagotchi.service
content: |
[Unit]
Description=pwnagotchi Deep Reinforcement Learning instrumenting bettercap for WiFI pwning.
Documentation=https://pwnagotchi.ai
Wants=network.target
After=bettercap.service
[Service]
Type=simple
PermissionsStartOnly=true
ExecStart=/usr/bin/pwnagotchi-launcher
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
notify:
- reload systemd services
- name: enable services
systemd:
name: "{{ item }}"
@@ -466,5 +424,3 @@
- name: reload systemd services
systemd:
daemon_reload: yes

View File

@@ -1,12 +1,47 @@
import subprocess
import os
import logging
import time
import pwnagotchi.ui.view as view
import re
version = '1.0.0RC2'
from pwnagotchi._version import __version__
_name = None
config = None
def set_name(new_name):
if new_name is None:
return
new_name = new_name.strip()
if new_name == '':
return
if not re.match(r'^[a-zA-Z0-9\-]{2,25}$', new_name):
logging.warning("name '%s' is invalid: min length is 2, max length 25, only a-zA-Z0-9- allowed", new_name)
return
current = name()
if new_name != current:
global _name
logging.info("setting unit hostname '%s' -> '%s'", current, new_name)
with open('/etc/hostname', 'wt') as fp:
fp.write(new_name)
with open('/etc/hosts', 'rt') as fp:
prev = fp.read()
logging.debug("old hosts:\n%s\n", prev)
with open('/etc/hosts', 'wt') as fp:
patched = prev.replace(current, new_name, -1)
logging.debug("new hosts:\n%s\n", patched)
fp.write(patched)
os.system("hostname '%s'" % new_name)
pwnagotchi.reboot()
def name():
@@ -17,32 +52,50 @@ def name():
return _name
def uptime():
with open('/proc/uptime') as fp:
return int(fp.read().split('.')[0])
def mem_usage():
out = subprocess.getoutput("free -m")
for line in out.split("\n"):
line = line.strip()
if line.startswith("Mem:"):
parts = list(map(int, line.split()[1:]))
tot = parts[0]
used = parts[1]
free = parts[2]
return used / tot
with open('/proc/meminfo') as fp:
for line in fp:
line = line.strip()
if line.startswith("MemTotal:"):
kb_mem_total = int(line.split()[1])
if line.startswith("MemFree:"):
kb_mem_free = int(line.split()[1])
if line.startswith("Buffers:"):
kb_main_buffers = int(line.split()[1])
if line.startswith("Cached:"):
kb_main_cached = int(line.split()[1])
kb_mem_used = kb_mem_total - kb_mem_free - kb_main_cached - kb_main_buffers
return round(kb_mem_used / kb_mem_total, 1)
return 0
def _cpu_stat():
"""
Returns the splitted first line of the /proc/stat file
"""
with open('/proc/stat', 'rt') as fp:
return list(map(int,fp.readline().split()[1:]))
def cpu_load():
with open('/proc/stat', 'rt') as fp:
for line in fp:
line = line.strip()
if line.startswith('cpu '):
parts = list(map(int, line.split()[1:]))
user_n = parts[0]
sys_n = parts[2]
idle_n = parts[3]
tot = user_n + sys_n + idle_n
return (user_n + sys_n) / tot
return 0
"""
Returns the current cpuload
"""
parts0 = _cpu_stat()
time.sleep(0.1)
parts1 = _cpu_stat()
parts_diff = [p1 - p0 for (p0, p1) in zip(parts0, parts1)]
user, nice, sys, idle, iowait, irq, softirq, steal, _guest, _guest_nice = parts_diff
idle_sum = idle + iowait
non_idle_sum = user + nice + sys + irq + softirq + steal
total = idle_sum + non_idle_sum
return non_idle_sum / total
def temperature(celsius=True):
@@ -54,9 +107,58 @@ def temperature(celsius=True):
def shutdown():
logging.warning("shutting down ...")
from pwnagotchi.ui import view
if view.ROOT:
view.ROOT.on_shutdown()
# give it some time to refresh the ui
time.sleep(5)
time.sleep(10)
logging.warning("syncing...")
from pwnagotchi import fs
for m in fs.mounts:
m.sync()
os.system("sync")
os.system("halt")
def restart(mode):
logging.warning("restarting in %s mode ...", mode)
if mode == 'AUTO':
os.system("touch /root/.pwnagotchi-auto")
else:
os.system("touch /root/.pwnagotchi-manual")
os.system("service bettercap restart")
os.system("service pwnagotchi restart")
def reboot(mode=None):
if mode is not None:
mode = mode.upper()
logging.warning("rebooting in %s mode ...", mode)
else:
logging.warning("rebooting ...")
from pwnagotchi.ui import view
if view.ROOT:
view.ROOT.on_rebooting()
# give it some time to refresh the ui
time.sleep(10)
if mode == 'AUTO':
os.system("touch /root/.pwnagotchi-auto")
elif mode == 'MANU':
os.system("touch /root/.pwnagotchi-manual")
logging.warning("syncing...")
from pwnagotchi import fs
for m in fs.mounts:
m.sync()
os.system("sync")
os.system("shutdown -r now")

1
pwnagotchi/_version.py Normal file
View File

@@ -0,0 +1 @@
__version__ = '1.5.5'

View File

@@ -2,13 +2,15 @@ import time
import json
import os
import re
import socket
from datetime import datetime
import logging
import asyncio
import _thread
import pwnagotchi
import pwnagotchi.utils as utils
import pwnagotchi.plugins as plugins
from pwnagotchi.ui.web.server import Server
from pwnagotchi.automata import Automata
from pwnagotchi.log import LastSession
from pwnagotchi.bettercap import Client
from pwnagotchi.mesh.utils import AsyncAdvertiser
@@ -17,38 +19,40 @@ from pwnagotchi.ai.train import AsyncTrainer
RECOVERY_DATA_FILE = '/root/.pwnagotchi-recovery'
class Agent(Client, AsyncAdvertiser, AsyncTrainer):
class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
def __init__(self, view, config, keypair):
Client.__init__(self, config['bettercap']['hostname'],
config['bettercap']['scheme'],
config['bettercap']['port'],
config['bettercap']['username'],
config['bettercap']['password'])
Automata.__init__(self, config, view)
AsyncAdvertiser.__init__(self, config, view, keypair)
AsyncTrainer.__init__(self, config)
self._started_at = time.time()
self._filter = None if config['main']['filter'] is None else re.compile(config['main']['filter'])
self._filter = None if not config['main']['filter'] else re.compile(config['main']['filter'])
self._current_channel = 0
self._tot_aps = 0
self._aps_on_channel = 0
self._supported_channels = utils.iface_channels(config['main']['iface'])
self._view = view
self._view.set_agent(self)
self._web_ui = Server(self, config['ui'])
self._access_points = []
self._last_pwnd = None
self._history = {}
self._handshakes = {}
self.last_session = LastSession(self._config)
self.mode = 'auto'
if not os.path.exists(config['bettercap']['handshakes']):
os.makedirs(config['bettercap']['handshakes'])
@staticmethod
def is_connected():
try:
socket.create_connection(("www.google.com", 80))
return True
except OSError:
pass
return False
logging.info("%s@%s (v%s)", pwnagotchi.name(), self.fingerprint(), pwnagotchi.__version__)
for _, plugin in plugins.loaded.items():
logging.debug("plugin '%s' v%s", plugin.__class__.__name__, plugin.__version__)
def config(self):
return self._config
@@ -59,43 +63,13 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
def supported_channels(self):
return self._supported_channels
def set_starting(self):
self._view.on_starting()
def set_ready(self):
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):
logging.info("connecting to %s ..." % self.url)
logging.info("connecting to %s ...", self.url)
for tag in self._config['bettercap']['silence']:
try:
self.run('events.ignore %s' % tag, verbose_errors=False)
except Exception as e:
except Exception:
pass
def _reset_wifi_settings(self):
@@ -117,7 +91,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
s = self.session()
for iface in s['interfaces']:
if iface['name'] == mon_iface:
logging.info("found monitor interface: %s" % iface['name'])
logging.info("found monitor interface: %s", iface['name'])
has_mon = True
break
@@ -126,11 +100,11 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
logging.info("starting monitor interface ...")
self.run('!%s' % mon_start_cmd)
else:
logging.info("waiting for monitor interface %s ..." % mon_iface)
logging.info("waiting for monitor interface %s ...", mon_iface)
time.sleep(1)
logging.info("supported channels: %s" % self._supported_channels)
logging.info("handshakes will be collected inside %s" % self._config['bettercap']['handshakes'])
logging.info("supported channels: %s", self._supported_channels)
logging.info("handshakes will be collected inside %s", self._config['bettercap']['handshakes'])
self._reset_wifi_settings()
@@ -145,38 +119,27 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
self.start_advertising()
def _wait_bettercap(self):
while True:
try:
_s = self.session()
return
except Exception:
logging.info("waiting for bettercap API to be available ...")
time.sleep(1)
def start(self):
self.start_ai()
self._wait_bettercap()
self.setup_events()
self.set_starting()
self.start_monitor_mode()
self.start_event_polling()
self.start_session_fetcher()
# print initial stats
self.next_epoch()
self.set_ready()
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)
def check_channels(self, channels):
busy_channels = [ch for ch, aps in channels]
# if we're hopping and no filter is configured
if self._config['personality']['channels'] == [] and self._config['main']['filter'] is None:
# check if any of the non overlapping channels is free
for ch in self._epoch.non_overlapping_channels:
if ch not in busy_channels:
self._epoch.non_overlapping_channels[ch] += 1
logging.info("channel %d is free from %d epochs" % (ch, self._epoch.non_overlapping_channels[ch]))
elif self._epoch.non_overlapping_channels[ch] > 0:
self._epoch.non_overlapping_channels[ch] -= 1
# report any channel that has been free for at least 3 epochs
for ch, num_epochs_free in self._epoch.non_overlapping_channels.items():
if num_epochs_free >= 3:
logging.info("channel %d has been free for %d epochs" % (ch, num_epochs_free))
self.set_free_channel(ch)
def recon(self):
recon_time = self._config['personality']['recon_time']
max_inactive = self._config['personality']['max_inactive_scale']
@@ -190,14 +153,14 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
if not channels:
self._current_channel = 0
logging.debug("RECON %ds" % recon_time)
logging.debug("RECON %ds", recon_time)
self.run('wifi.recon.channel clear')
else:
logging.debug("RECON %ds ON CHANNELS %s" % (recon_time, ','.join(map(str, channels))))
logging.debug("RECON %ds ON CHANNELS %s", recon_time, ','.join(map(str, channels)))
try:
self.run('wifi.recon.channel %s' % ','.join(map(str, channels)))
except Exception as e:
logging.exception("error")
logging.exception("Error while setting wifi.recon.channels (%s)", e)
self.wait_for(recon_time, sleeping=False)
@@ -209,7 +172,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 ())
self._epoch.observe(aps, list(self._peers.values()))
return self._access_points
def get_access_points(self):
@@ -217,16 +180,30 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
aps = []
try:
s = self.session()
plugins.on("unfiltered_ap_list", self, s['wifi']['aps'])
for ap in s['wifi']['aps']:
if ap['hostname'] not in whitelist:
if ap['encryption'] == '' or ap['encryption'] == 'OPEN':
continue
elif ap['hostname'] not in whitelist \
and ap['mac'].lower() not in whitelist \
and ap['mac'][:8].lower() not in whitelist:
if self._filter_included(ap):
aps.append(ap)
except Exception as e:
logging.exception("error")
logging.exception("Error while getting acces points (%s)", e)
aps.sort(key=lambda ap: ap['channel'])
return self.set_access_points(aps)
def get_total_aps(self):
return self._tot_aps
def get_aps_on_channel(self):
return self._aps_on_channel
def get_current_channel(self):
return self._current_channel
def get_access_points_by_channel(self):
aps = self.get_access_points()
channels = self._config['personality']['channels']
@@ -237,7 +214,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
ch = ap['channel']
# if we're sticking to a channel, skip anything
# which is not on that channel
if channels != [] and ch not in channels:
if channels and ch not in channels:
continue
if ch not in grouped:
@@ -258,21 +235,21 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
return None
def _update_uptime(self, s):
secs = time.time() - self._started_at
secs = pwnagotchi.uptime()
self._view.set('uptime', utils.secs_to_hhmmss(secs))
self._view.set('epoch', '%04d' % self._epoch.epoch)
# self._view.set('epoch', '%04d' % self._epoch.epoch)
def _update_counters(self):
tot_aps = len(self._access_points)
self._tot_aps = len(self._access_points)
tot_stas = sum(len(ap['clients']) for ap in self._access_points)
if self._current_channel == 0:
self._view.set('aps', '%d' % tot_aps)
self._view.set('aps', '%d' % self._tot_aps)
self._view.set('sta', '%d' % tot_stas)
else:
aps_on_channel = len([ap for ap in self._access_points if ap['channel'] == self._current_channel])
self._aps_on_channel = len([ap for ap in self._access_points if ap['channel'] == self._current_channel])
stas_on_channel = sum(
[len(ap['clients']) for ap in self._access_points if ap['channel'] == self._current_channel])
self._view.set('aps', '%d (%d)' % (aps_on_channel, tot_aps))
self._view.set('aps', '%d (%d)' % (self._aps_on_channel, self._tot_aps))
self._view.set('sta', '%d (%d)' % (stas_on_channel, tot_stas))
def _update_handshakes(self, new_shakes=0):
@@ -290,25 +267,16 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
if new_shakes > 0:
self._view.on_handshakes(new_shakes)
def _update_advertisement(self, s):
run_handshakes = len(self._handshakes)
tot_handshakes = utils.total_unique_handshakes(self._config['bettercap']['handshakes'])
started = s['started_at'].split('.')[0]
started = datetime.strptime(started, '%Y-%m-%dT%H:%M:%S')
started = time.mktime(started.timetuple())
self._advertiser.update({ \
'pwnd_run': run_handshakes,
'pwnd_tot': tot_handshakes,
'uptime': time.time() - started,
'epoch': self._epoch.epoch})
def _update_peers(self):
peer = self._advertiser.closest_peer()
tot = self._advertiser.num_peers()
self._view.set_closest_peer(peer, tot)
self._view.set_closest_peer(self._closest_peer, len(self._peers))
def _reboot(self):
self.set_rebooting()
self._save_recovery_data()
pwnagotchi.reboot()
def _save_recovery_data(self):
logging.warning("writing recovery data to %s ..." % RECOVERY_DATA_FILE)
logging.warning("writing recovery data to %s ...", RECOVERY_DATA_FILE)
with open(RECOVERY_DATA_FILE, 'w') as fp:
data = {
'started_at': self._started_at,
@@ -323,7 +291,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
try:
with open(RECOVERY_DATA_FILE, 'rt') as fp:
data = json.load(fp)
logging.info("found recovery data: %s" % data)
logging.info("found recovery data: %s", data)
self._started_at = data['started_at']
self._epoch.epoch = data['epoch']
self._handshakes = data['handshakes']
@@ -331,64 +299,74 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
self._last_pwnd = data['last_pwnd']
if delete:
logging.info("deleting %s" % RECOVERY_DATA_FILE)
logging.info("deleting %s", RECOVERY_DATA_FILE)
os.unlink(RECOVERY_DATA_FILE)
except:
if not no_exceptions:
raise
def _event_poller(self):
self._load_recovery_data()
self.run('events.clear')
def start_session_fetcher(self):
_thread.start_new_thread(self._fetch_stats, ())
logging.debug("event polling started ...")
def _fetch_stats(self):
while True:
time.sleep(1)
new_shakes = 0
s = self.session()
self._update_uptime(s)
if self._advertiser is not None:
self._update_advertisement(s)
self._update_peers()
self._update_advertisement(s)
self._update_peers()
self._update_counters()
self._update_handshakes(0)
time.sleep(1)
async def _on_event(self, msg):
found_handshake = False
jmsg = json.loads(msg)
if jmsg['tag'] == 'wifi.client.handshake':
filename = jmsg['data']['file']
sta_mac = jmsg['data']['station']
ap_mac = jmsg['data']['ap']
key = "%s -> %s" % (sta_mac, ap_mac)
if key not in self._handshakes:
self._handshakes[key] = jmsg
s = self.session()
ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s)
if ap_and_station is None:
logging.warning("!!! captured new handshake: %s !!!", key)
self._last_pwnd = ap_mac
plugins.on('handshake', self, filename, ap_mac, sta_mac)
else:
(ap, sta) = ap_and_station
self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
'hostname'] != '<hidden>' else ap_mac
logging.warning(
"!!! captured new handshake on channel %d, %d dBm: %s (%s) -> %s [%s (%s)] !!!",
ap['channel'],
ap['rssi'],
sta['mac'], sta['vendor'],
ap['hostname'], ap['mac'], ap['vendor'])
plugins.on('handshake', self, filename, ap, sta)
found_handshake = True
self._update_handshakes(1 if found_handshake else 0)
def _event_poller(self, loop):
self._load_recovery_data()
self.run('events.clear')
while True:
logging.debug("polling events ...")
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)
if key not in self._handshakes:
self._handshakes[key] = h
new_shakes += 1
ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s)
if ap_and_station is None:
logging.warning("!!! captured new handshake: %s !!!" % key)
self._last_pwnd = ap_mac
plugins.on('handshake', self, filename, ap_mac, sta_mac)
else:
(ap, sta) = ap_and_station
self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
'hostname'] != '<hidden>' else ap_mac
logging.warning("!!! captured new handshake on channel %d: %s (%s) -> %s [%s (%s)] !!!" % ( \
ap['channel'],
sta['mac'], sta['vendor'],
ap['hostname'], ap['mac'], ap['vendor']))
plugins.on('handshake', self, filename, ap, sta)
except Exception as e:
logging.exception("error")
finally:
self._update_handshakes(new_shakes)
loop.create_task(self.start_websocket(self._on_event))
loop.run_forever()
except Exception as ex:
logging.debug("Error while polling via websocket (%s)", ex)
def start_event_polling(self):
_thread.start_new_thread(self._event_poller, ())
# start a thread and pass in the mainloop
_thread.start_new_thread(self._event_poller, (asyncio.get_event_loop(),))
def is_module_running(self, module):
s = self.session()
@@ -422,32 +400,17 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
return self._history[who] < self._config['personality']['max_interactions']
def _on_miss(self, who):
logging.info("it looks like %s is not in range anymore :/" % who)
self._epoch.track(miss=True)
self._view.on_miss(who)
def _on_error(self, who, e):
error = "%s" % e
# when we're trying to associate or deauth something that is not in range anymore
# (if we are moving), we get the following error from bettercap:
# error 400: 50:c7:bf:2e:d3:37 is an unknown BSSID or it is in the association skip list.
if 'is an unknown BSSID' in error:
self._on_miss(who)
else:
logging.error("%s" % e)
def associate(self, ap, throttle=0):
if self.is_stale():
logging.debug("recon is stale, skipping assoc(%s)" % ap['mac'])
logging.debug("recon is stale, skipping assoc(%s)", ap['mac'])
return
if self._config['personality']['associate'] and self._should_interact(ap['mac']):
self._view.on_assoc(ap)
try:
logging.info("sending association frame to %s (%s %s) on channel %d [%d clients]..." % ( \
ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], len(ap['clients'])))
logging.info("sending association frame to %s (%s %s) on channel %d [%d clients], %d dBm...",
ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], len(ap['clients']), ap['rssi'])
self.run('wifi.assoc %s' % ap['mac'])
self._epoch.track(assoc=True)
except Exception as e:
@@ -460,15 +423,15 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
def deauth(self, ap, sta, throttle=0):
if self.is_stale():
logging.debug("recon is stale, skipping deauth(%s)" % sta['mac'])
logging.debug("recon is stale, skipping deauth(%s)", sta['mac'])
return
if self._config['personality']['deauth'] and self._should_interact(sta['mac']):
self._view.on_deauth(sta)
try:
logging.info("deauthing %s (%s) from %s (%s %s) on channel %d ..." % (
sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'], ap['channel']))
logging.info("deauthing %s (%s) from %s (%s %s) on channel %d, %d dBm ...",
sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], ap['rssi'])
self.run('wifi.deauth %s' % sta['mac'])
self._epoch.track(deauth=True)
except Exception as e:
@@ -481,7 +444,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
def set_channel(self, channel, verbose=True):
if self.is_stale():
logging.debug("recon is stale, skipping set_channel(%d)" % channel)
logging.debug("recon is stale, skipping set_channel(%d)", channel)
return
# if in the previous loop no client stations has been deauthenticated
@@ -497,12 +460,12 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
if channel != self._current_channel:
if self._current_channel != 0 and wait > 0:
if verbose:
logging.info("waiting for %ds on channel %d ..." % (wait, self._current_channel))
logging.info("waiting for %ds on channel %d ...", wait, self._current_channel)
else:
logging.debug("waiting for %ds on channel %d ..." % (wait, self._current_channel))
logging.debug("waiting for %ds on channel %d ...", wait, self._current_channel)
self.wait_for(wait)
if verbose and self._epoch.any_activity:
logging.info("CHANNEL %d" % channel)
logging.info("CHANNEL %d", channel)
try:
self.run('wifi.recon.channel %d' % channel)
self._current_channel = channel
@@ -512,47 +475,4 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
plugins.on('channel_hop', self, channel)
except Exception as e:
logging.error("error: %s" % e)
def is_stale(self):
return self._epoch.num_missed > self._config['personality']['max_misses_for_recon']
def any_activity(self):
return self._epoch.any_activity
def _reboot(self):
self.set_rebooting()
self._save_recovery_data()
logging.warning("rebooting the system ...")
os.system("/usr/bin/sync")
os.system("/usr/sbin/shutdown -r now")
def next_epoch(self):
was_stale = self.is_stale()
did_miss = self._epoch.num_missed
self._epoch.next()
# after X misses during an epoch, set the status to lonely
if was_stale:
logging.warning("agent missed %d interactions -> lonely" % did_miss)
self.set_lonely()
# after X times being bored, the status is set to sad
elif self._epoch.inactive_for >= self._config['personality']['sad_num_epochs']:
logging.warning("%d epochs with no activity -> sad" % self._epoch.inactive_for)
self.set_sad()
# after X times being inactive, the status is set to bored
elif self._epoch.inactive_for >= self._config['personality']['bored_num_epochs']:
logging.warning("%d epochs with no activity -> bored" % self._epoch.inactive_for)
self.set_bored()
# after X times being active, the status is set to happy / excited
elif self._epoch.active_for >= self._config['personality']['excited_num_epochs']:
logging.warning("%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']:
logging.critical("%d epochs without visible access points -> rebooting ..." % self._epoch.blind_for)
self._reboot()
self._epoch.blind_for = 0
logging.error("Error while setting channel (%s)", e)

View File

@@ -1,13 +1,9 @@
import os
import time
import logging
# https://stackoverflow.com/questions/40426502/is-there-a-way-to-suppress-the-messages-tensorflow-prints/40426709
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # or any {'0', '1', '2'}
import warnings
# https://stackoverflow.com/questions/15777951/how-to-suppress-pandas-future-warning
warnings.simplefilter(action='ignore', category=FutureWarning)
import logging
def load(config, agent, epoch, from_disk=True):
@@ -16,27 +12,51 @@ def load(config, agent, epoch, from_disk=True):
logging.info("ai disabled")
return False
logging.info("[ai] bootstrapping dependencies ...")
try:
begin = time.time()
from stable_baselines import A2C
from stable_baselines.common.policies import MlpLstmPolicy
from stable_baselines.common.vec_env import DummyVecEnv
logging.info("[ai] bootstrapping dependencies ...")
import pwnagotchi.ai.gym as wrappers
start = time.time()
from stable_baselines import A2C
logging.debug("[ai] A2C imported in %.2fs" % (time.time() - start))
env = wrappers.Environment(agent, epoch)
env = DummyVecEnv([lambda: env])
start = time.time()
from stable_baselines.common.policies import MlpLstmPolicy
logging.debug("[ai] MlpLstmPolicy imported in %.2fs" % (time.time() - start))
logging.info("[ai] bootstrapping model ...")
start = time.time()
from stable_baselines.common.vec_env import DummyVecEnv
logging.debug("[ai] DummyVecEnv imported in %.2fs" % (time.time() - start))
a2c = A2C(MlpLstmPolicy, env, **config['params'])
start = time.time()
import pwnagotchi.ai.gym as wrappers
logging.debug("[ai] gym wrapper imported in %.2fs" % (time.time() - start))
if from_disk and os.path.exists(config['path']):
logging.info("[ai] loading %s ..." % config['path'])
a2c.load(config['path'], env)
else:
logging.info("[ai] model created:")
for key, value in config['params'].items():
logging.info(" %s: %s" % (key, value))
env = wrappers.Environment(agent, epoch)
env = DummyVecEnv([lambda: env])
return a2c
logging.info("[ai] creating model ...")
start = time.time()
a2c = A2C(MlpLstmPolicy, env, **config['params'])
logging.debug("[ai] A2C created in %.2fs" % (time.time() - start))
if from_disk and os.path.exists(config['path']):
logging.info("[ai] loading %s ..." % config['path'])
start = time.time()
a2c.load(config['path'], env)
logging.debug("[ai] A2C loaded in %.2fs" % (time.time() - start))
else:
logging.info("[ai] model created:")
for key, value in config['params'].items():
logging.info(" %s: %s" % (key, value))
logging.debug("[ai] total loading time is %.2fs" % (time.time() - begin))
return a2c
except Exception as e:
logging.exception("error while starting AI (%s)", e)
logging.warning("[ai] AI not loaded!")
return False

View File

@@ -19,6 +19,10 @@ class Epoch(object):
self.active_for = 0
# number of epochs with no visible access points
self.blind_for = 0
# number of epochs in sad state
self.sad_for = 0
# number of epochs in bored state
self.bored_for = 0
# did deauth in this epoch in the current channel?
self.did_deauth = False
# number of deauths in this epoch
@@ -37,6 +41,12 @@ class Epoch(object):
self.num_hops = 0
# number of seconds sleeping
self.num_slept = 0
# number of peers seen during this epoch
self.num_peers = 0
# cumulative bond factor
self.tot_bond_factor = 0.0 # cum_bond_factor sounded really bad ...
# average bond factor
self.avg_bond_factor = 0.0
# any activity at all during this epoch?
self.any_activity = False
# when the current epoch started
@@ -74,10 +84,16 @@ class Epoch(object):
else:
self.blind_for = 0
bond_unit_scale = self.config['personality']['bond_encounters_factor']
self.num_peers = len(peers)
num_peers = self.num_peers + 1e-10 # avoid division by 0
self.tot_bond_factor = sum((peer.encounters for peer in peers)) / bond_unit_scale
self.avg_bond_factor = self.tot_bond_factor / num_peers
num_aps = len(aps) + 1e-10
num_sta = sum(len(ap['clients']) for ap in aps) + 1e-10
num_peers = len(peers) + 1e-10
aps_per_chan = [0.0] * wifi.NumChannels
sta_per_chan = [0.0] * wifi.NumChannels
peers_per_chan = [0.0] * wifi.NumChannels
@@ -87,13 +103,13 @@ class Epoch(object):
try:
aps_per_chan[ch_idx] += 1.0
sta_per_chan[ch_idx] += len(ap['clients'])
except IndexError as e:
except IndexError:
logging.error("got data on channel %d, we can store %d channels" % (ap['channel'], wifi.NumChannels))
for peer in peers:
try:
peers_per_chan[peer.last_channel - 1] += 1.0
except IndexError as e:
except IndexError:
logging.error(
"got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels))
@@ -145,6 +161,20 @@ class Epoch(object):
else:
self.active_for += 1
self.inactive_for = 0
self.sad_for = 0
self.bored_for = 0
if self.inactive_for >= self.config['personality']['sad_num_epochs']:
# sad > bored; cant be sad and bored
self.bored_for = 0
self.sad_for += 1
elif self.inactive_for >= self.config['personality']['bored_num_epochs']:
# sad_treshhold > inactive > bored_treshhold; cant be sad and bored
self.sad_for = 0
self.bored_for += 1
else:
self.sad_for = 0
self.bored_for = 0
now = time.time()
cpu = pwnagotchi.cpu_load()
@@ -160,8 +190,13 @@ class Epoch(object):
'blind_for_epochs': self.blind_for,
'inactive_for_epochs': self.inactive_for,
'active_for_epochs': self.active_for,
'sad_for_epochs': self.sad_for,
'bored_for_epochs': self.bored_for,
'missed_interactions': self.num_missed,
'num_hops': self.num_hops,
'num_peers': self.num_peers,
'tot_bond': self.tot_bond_factor,
'avg_bond': self.avg_bond_factor,
'num_deauths': self.num_deauths,
'num_associations': self.num_assocs,
'num_handshakes': self.num_shakes,
@@ -173,14 +208,20 @@ class Epoch(object):
self._epoch_data['reward'] = self._reward(self.epoch + 1, self._epoch_data)
self._epoch_data_ready.set()
logging.info("[epoch %d] duration=%s slept_for=%s blind=%d inactive=%d active=%d hops=%d missed=%d "
"deauths=%d assocs=%d handshakes=%d cpu=%d%% mem=%d%% temperature=%dC reward=%s" % (
logging.info("[epoch %d] duration=%s slept_for=%s blind=%d sad=%d bored=%d inactive=%d active=%d peers=%d tot_bond=%.2f "
"avg_bond=%.2f hops=%d missed=%d deauths=%d assocs=%d handshakes=%d cpu=%d%% mem=%d%% "
"temperature=%dC reward=%s" % (
self.epoch,
utils.secs_to_hhmmss(self.epoch_duration),
utils.secs_to_hhmmss(self.num_slept),
self.blind_for,
self.sad_for,
self.bored_for,
self.inactive_for,
self.active_for,
self.num_peers,
self.tot_bond_factor,
self.avg_bond_factor,
self.num_hops,
self.num_missed,
self.num_deauths,
@@ -195,6 +236,9 @@ class Epoch(object):
self.epoch_started = now
self.did_deauth = False
self.num_deauths = 0
self.num_peers = 0
self.tot_bond_factor = 0.0
self.avg_bond_factor = 0.0
self.did_associate = False
self.num_assocs = 0
self.num_missed = 0

View File

@@ -4,31 +4,37 @@ import pwnagotchi.mesh.wifi as wifi
MAX_EPOCH_DURATION = 1024
histogram_size = wifi.NumChannels
shape = (1,
# aps per channel
histogram_size +
# clients per channel
histogram_size +
# peers per channel
histogram_size +
# duration
1 +
# inactive
1 +
# active
1 +
# missed
1 +
# hops
1 +
# deauths
1 +
# assocs
1 +
# handshakes
1)
def describe(extended=False):
if not extended:
histogram_size = wifi.NumChannels
else:
# see https://github.com/evilsocket/pwnagotchi/issues/583
histogram_size = wifi.NumChannelsExt
return histogram_size, (1,
# aps per channel
histogram_size +
# clients per channel
histogram_size +
# peers per channel
histogram_size +
# duration
1 +
# inactive
1 +
# active
1 +
# missed
1 +
# hops
1 +
# deauths
1 +
# assocs
1 +
# handshakes
1)
def featurize(state, step):

View File

@@ -34,10 +34,14 @@ class Environment(gym.Env):
self._epoch_num = 0
self._last_render = None
channels = agent.supported_channels()
# see https://github.com/evilsocket/pwnagotchi/issues/583
self._supported_channels = agent.supported_channels()
self._extended_spectrum = any(ch > 140 for ch in self._supported_channels)
self._histogram_size, self._observation_shape = featurizer.describe(self._extended_spectrum)
Environment.params += [
Parameter('_channel_%d' % ch, min_value=0, max_value=1, meta=ch + 1) for ch in
range(featurizer.histogram_size) if ch + 1 in channels
range(self._histogram_size) if ch + 1 in self._supported_channels
]
self.last = {
@@ -50,7 +54,7 @@ class Environment(gym.Env):
}
self.action_space = spaces.MultiDiscrete([p.space_size() for p in Environment.params if p.trainable])
self.observation_space = spaces.Box(low=0, high=1, shape=featurizer.shape, dtype=np.float32)
self.observation_space = spaces.Box(low=0, high=1, shape=self._observation_shape, dtype=np.float32)
self.reward_range = reward.range
@staticmethod
@@ -118,7 +122,7 @@ class Environment(gym.Env):
return self.last['state_v']
def _render_histogram(self, hist):
for ch in range(featurizer.histogram_size):
for ch in range(self._histogram_size):
if hist[ch]:
logging.info(" CH %d: %s" % (ch + 1, hist[ch]))

View File

@@ -18,4 +18,10 @@ class RewardFunction(object):
m = -.3 * (state['missed_interactions'] / tot_interactions)
i = -.2 * (state['inactive_for_epochs'] / tot_epochs)
return h + a + c + b + i + m
# include emotions if state >= 5 epochs
_sad = state['sad_for_epochs'] if state['sad_for_epochs'] >= 5 else 0
_bored = state['bored_for_epochs'] if state['bored_for_epochs'] >= 5 else 0
s = -.2 * (_sad / tot_epochs)
l = -.1 * (_bored / tot_epochs)
return h + a + c + b + i + m + s + l

View File

@@ -8,7 +8,6 @@ import logging
import pwnagotchi.plugins as plugins
import pwnagotchi.ai as ai
from pwnagotchi.ai.epoch import Epoch
class Stats(object):
@@ -88,7 +87,6 @@ class AsyncTrainer(object):
def __init__(self, config):
self._config = config
self._model = None
self._epoch = Epoch(config)
self._is_training = False
self._training_epochs = 0
self._nn_path = self._config['ai']['path']
@@ -178,7 +176,7 @@ class AsyncTrainer(object):
self.set_training(True, epochs_per_episode)
self._model.learn(total_timesteps=epochs_per_episode, callback=self.on_ai_training_step)
except Exception as e:
logging.exception("[ai] error while training")
logging.exception("[ai] error while training (%s)", e)
finally:
self.set_training(False)
obs = self._model.env.reset()

143
pwnagotchi/automata.py Normal file
View File

@@ -0,0 +1,143 @@
import logging
import pwnagotchi.plugins as plugins
from pwnagotchi.ai.epoch import Epoch
# basic mood system
class Automata(object):
def __init__(self, config, view):
self._config = config
self._view = view
self._epoch = Epoch(config)
def _on_miss(self, who):
logging.info("it looks like %s is not in range anymore :/", who)
self._epoch.track(miss=True)
self._view.on_miss(who)
def _on_error(self, who, e):
# when we're trying to associate or deauth something that is not in range anymore
# (if we are moving), we get the following error from bettercap:
# error 400: 50:c7:bf:2e:d3:37 is an unknown BSSID or it is in the association skip list.
if 'is an unknown BSSID' in str(e):
self._on_miss(who)
else:
logging.error(e)
def set_starting(self):
self._view.on_starting()
def set_ready(self):
plugins.on('ready', self)
def in_good_mood(self):
return self._has_support_network_for(1.0)
def _has_support_network_for(self, factor):
bond_factor = self._config['personality']['bond_encounters_factor']
total_encounters = sum(peer.encounters for _, peer in self._peers.items())
support_factor = total_encounters / bond_factor
return support_factor >= factor
# triggered when it's a sad/bad day but you have good friends around ^_^
def set_grateful(self):
self._view.on_grateful()
plugins.on('grateful', self)
def set_lonely(self):
if not self._has_support_network_for(1.0):
logging.info("unit is lonely")
self._view.on_lonely()
plugins.on('lonely', self)
else:
logging.info("unit is grateful instead of lonely")
self.set_grateful()
def set_bored(self):
factor = self._epoch.inactive_for / self._config['personality']['bored_num_epochs']
if not self._has_support_network_for(factor):
logging.warning("%d epochs with no activity -> bored", self._epoch.inactive_for)
self._view.on_bored()
plugins.on('bored', self)
else:
logging.info("unit is grateful instead of bored")
self.set_grateful()
def set_sad(self):
factor = self._epoch.inactive_for / self._config['personality']['sad_num_epochs']
if not self._has_support_network_for(factor):
logging.warning("%d epochs with no activity -> sad", self._epoch.inactive_for)
self._view.on_sad()
plugins.on('sad', self)
else:
logging.info("unit is grateful instead of sad")
self.set_grateful()
def set_angry(self, factor):
if not self._has_support_network_for(factor):
logging.warning("%d epochs with no activity -> angry", self._epoch.inactive_for)
self._view.on_angry()
plugins.on('angry', self)
else:
logging.info("unit is grateful instead of angry")
self.set_grateful()
def set_excited(self):
logging.warning("%d epochs with activity -> excited", self._epoch.active_for)
self._view.on_excited()
plugins.on('excited', self)
def set_rebooting(self):
self._view.on_rebooting()
plugins.on('rebooting', self)
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)
def is_stale(self):
return self._epoch.num_missed > self._config['personality']['max_misses_for_recon']
def any_activity(self):
return self._epoch.any_activity
def next_epoch(self):
logging.debug("agent.next_epoch()")
was_stale = self.is_stale()
did_miss = self._epoch.num_missed
self._epoch.next()
# after X misses during an epoch, set the status to lonely or angry
if was_stale:
factor = did_miss / self._config['personality']['max_misses_for_recon']
if factor >= 2.0:
self.set_angry(factor)
else:
logging.warning("agent missed %d interactions -> lonely", did_miss)
self.set_lonely()
# after X times being bored, the status is set to sad or angry
elif self._epoch.sad_for:
factor = self._epoch.inactive_for / self._config['personality']['sad_num_epochs']
if factor >= 2.0:
self.set_angry(factor)
else:
self.set_sad()
# after X times being inactive, the status is set to bored
elif self._epoch.bored_for:
self.set_bored()
# after X times being active, the status is set to happy / excited
elif self._epoch.active_for >= self._config['personality']['excited_num_epochs']:
self.set_excited()
elif self._epoch.active_for >= 5 and self._has_support_network_for(5.0):
self.set_grateful()
plugins.on('epoch', self, self._epoch.epoch - 1, self._epoch.data())
if self._epoch.blind_for >= self._config['main']['mon_max_blind_epochs']:
logging.critical("%d epochs without visible access points -> rebooting ...", self._epoch.blind_for)
self._reboot()
self._epoch.blind_for = 0

View File

@@ -1,8 +1,25 @@
import json
import logging
import requests
import websockets
from requests.auth import HTTPBasicAuth
def decode(r, verbose_errors=True):
try:
return r.json()
except Exception as e:
if r.status_code == 200:
logging.error("error while decoding json: error='%s' resp='%s'" % (e, r.text))
else:
err = "error %d: %s" % (r.status_code, r.text.strip())
if verbose_errors:
logging.info(err)
raise Exception(err)
return r.text
class Client(object):
def __init__(self, hostname='localhost', scheme='http', port=8081, username='user', password='pass'):
self.hostname = hostname
@@ -11,29 +28,28 @@ class Client(object):
self.username = username
self.password = password
self.url = "%s://%s:%d/api" % (scheme, hostname, port)
self.websocket = "ws://%s:%s@%s:%d/api" % (username, password, hostname, port)
self.auth = HTTPBasicAuth(username, password)
def _decode(self, r, verbose_errors=True):
try:
return r.json()
except Exception as e:
if r.status_code == 200:
logging.error("error while decoding json: error='%s' resp='%s'" % (e, r.text))
else:
err = "error %d: %s" % (r.status_code, r.text.strip())
if verbose_errors:
logging.info(err)
raise Exception(err)
return r.text
def session(self):
r = requests.get("%s/session" % self.url, auth=self.auth)
return self._decode(r)
return decode(r)
def events(self):
r = requests.get("%s/events" % self.url, auth=self.auth)
return self._decode(r)
async def start_websocket(self, consumer):
s = "%s/events" % self.websocket
while True:
try:
async with websockets.connect(s, ping_interval=60, ping_timeout=90) as ws:
async for msg in ws:
try:
await consumer(msg)
except Exception as ex:
logging.debug("Error while parsing event (%s)", ex)
except websockets.exceptions.ConnectionClosedError:
logging.debug("Lost websocket connection. Reconnecting...")
except websockets.exceptions.WebSocketException as wex:
logging.debug("Websocket exception (%s)", wex)
def run(self, command, verbose_errors=True):
r = requests.post("%s/session" % self.url, auth=self.auth, json={'cmd': command})
return self._decode(r, verbose_errors=verbose_errors)
return decode(r, verbose_errors=verbose_errors)

238
pwnagotchi/defaults.toml Normal file
View File

@@ -0,0 +1,238 @@
main.name = ""
main.lang = "en"
main.confd = "/etc/pwnagotchi/conf.d/"
main.custom_plugins = ""
main.custom_plugin_repos = [
"https://github.com/evilsocket/pwnagotchi-plugins-contrib/archive/master.zip"
]
main.iface = "mon0"
main.mon_start_cmd = "/usr/bin/monstart"
main.mon_stop_cmd = "/usr/bin/monstop"
main.mon_max_blind_epochs = 50
main.no_restart = false
main.whitelist = [
"EXAMPLE_NETWORK",
"ANOTHER_EXAMPLE_NETWORK",
"fo:od:ba:be:fo:od",
"fo:od:ba"
]
main.filter = ""
main.plugins.grid.enabled = true
main.plugins.grid.report = false
main.plugins.grid.exclude = [
"YourHomeNetworkHere"
]
main.plugins.auto-update.enabled = true
main.plugins.auto-update.install = true
main.plugins.auto-update.interval = 1
main.plugins.net-pos.enabled = false
main.plugins.net-pos.api_key = "test"
main.plugins.gps.enabled = false
main.plugins.gps.speed = 19200
main.plugins.gps.device = "/dev/ttyUSB0"
main.plugins.webgpsmap.enabled = false
main.plugins.onlinehashcrack.enabled = false
main.plugins.onlinehashcrack.email = ""
main.plugins.onlinehashcrack.dashboard = ""
main.plugins.onlinehashcrack.single_files = false
main.plugins.onlinehashcrack.whitelist = []
main.plugins.wpa-sec.enabled = false
main.plugins.wpa-sec.api_key = ""
main.plugins.wpa-sec.api_url = "https://wpa-sec.stanev.org"
main.plugins.wpa-sec.download_results = false
main.plugins.wpa-sec.whitelist = []
main.plugins.wigle.enabled = false
main.plugins.wigle.api_key = ""
main.plugins.wigle.whitelist = []
main.plugins.wigle.donate = true
main.plugins.bt-tether.enabled = false
main.plugins.bt-tether.devices.android-phone.enabled = false
main.plugins.bt-tether.devices.android-phone.search_order = 1
main.plugins.bt-tether.devices.android-phone.mac = ""
main.plugins.bt-tether.devices.android-phone.ip = "192.168.44.44"
main.plugins.bt-tether.devices.android-phone.netmask = 24
main.plugins.bt-tether.devices.android-phone.interval = 1
main.plugins.bt-tether.devices.android-phone.scantime = 10
main.plugins.bt-tether.devices.android-phone.max_tries = 10
main.plugins.bt-tether.devices.android-phone.share_internet = false
main.plugins.bt-tether.devices.android-phone.priority = 1
main.plugins.bt-tether.devices.ios-phone.enabled = false
main.plugins.bt-tether.devices.ios-phone.search_order = 2
main.plugins.bt-tether.devices.ios-phone.mac = ""
main.plugins.bt-tether.devices.ios-phone.ip = "172.20.10.6"
main.plugins.bt-tether.devices.ios-phone.netmask = 24
main.plugins.bt-tether.devices.ios-phone.interval = 5
main.plugins.bt-tether.devices.ios-phone.scantime = 20
main.plugins.bt-tether.devices.ios-phone.max_tries = 0
main.plugins.bt-tether.devices.ios-phone.share_internet = false
main.plugins.bt-tether.devices.ios-phone.priority = 999
main.plugins.memtemp.enabled = false
main.plugins.memtemp.scale = "celsius"
main.plugins.memtemp.orientation = "horizontal"
main.plugins.paw-gps.enabled = false
main.plugins.paw-gps.ip = ""
main.plugins.gpio_buttons.enabled = false
main.plugins.led.enabled = true
main.plugins.led.led = 0
main.plugins.led.delay = 200
main.plugins.led.patterns.loaded = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.updating = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.unread_inbox = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.ready = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.ai_ready = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.ai_training_start = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.ai_best_reward = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.ai_worst_reward = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.bored = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.sad = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.excited = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.lonely = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.rebooting = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.wait = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.sleep = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.wifi_update = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.association = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.deauthentication = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.handshake = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.epoch = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.peer_detected = "oo oo oo oo oo oo oo"
main.plugins.led.patterns.peer_lost = "oo oo oo oo oo oo oo"
main.plugins.logtail.enabled = false
main.plugins.logtail.max-lines = 10000
main.plugins.session-stats.enabled = true
main.plugins.session-stats.save_directory = "/var/tmp/pwnagotchi/sessions/"
main.log.path = "/var/log/pwnagotchi.log"
main.log.rotation.enabled = true
main.log.rotation.size = "10M"
ai.enabled = true
ai.path = "/root/brain.nn"
ai.laziness = 0.1
ai.epochs_per_episode = 50
ai.params.gamma = 0.99
ai.params.n_steps = 1
ai.params.vf_coef = 0.25
ai.params.ent_coef = 0.01
ai.params.max_grad_norm = 0.5
ai.params.learning_rate = 0.001
ai.params.alpha = 0.99
ai.params.epsilon = 0.00001
ai.params.verbose = 1
ai.params.lr_schedule = "constant"
personality.advertise = true
personality.deauth = true
personality.associate = true
personality.channels = []
personality.min_rssi = -200
personality.ap_ttl = 120
personality.sta_ttl = 300
personality.recon_time = 30
personality.max_inactive_scale = 2
personality.recon_inactive_multiplier = 2
personality.hop_recon_time = 10
personality.min_recon_time = 5
personality.max_interactions = 3
personality.max_misses_for_recon = 5
personality.excited_num_epochs = 10
personality.bored_num_epochs = 15
personality.sad_num_epochs = 25
personality.bond_encounters_factor = 20000
ui.fps = 0.0
ui.font.name = "DejaVuSansMono" # for japanese: fonts-japanese-gothic
ui.font.size_offset = 0 # will be added to the font size
ui.faces.look_r = "( ⚆_⚆)"
ui.faces.look_l = "(☉_☉ )"
ui.faces.look_r_happy = "( ◕‿◕)"
ui.faces.look_l_happy = "(◕‿◕ )"
ui.faces.sleep = "(⇀‿‿↼)"
ui.faces.sleep2 = "(≖‿‿≖)"
ui.faces.awake = "(◕‿‿◕)"
ui.faces.bored = "(-__-)"
ui.faces.intense = "(°▃▃°)"
ui.faces.cool = "(⌐■_■)"
ui.faces.happy = "(•‿‿•)"
ui.faces.excited = "(ᵔ◡◡ᵔ)"
ui.faces.grateful = "(^‿‿^)"
ui.faces.motivated = "(☼‿‿☼)"
ui.faces.demotivated = "(≖__≖)"
ui.faces.smart = "(✜‿‿✜)"
ui.faces.lonely = "(ب__ب)"
ui.faces.sad = "(╥☁╥ )"
ui.faces.angry = "(-_-')"
ui.faces.friend = "(♥‿‿♥)"
ui.faces.broken = "(☓‿‿☓)"
ui.faces.debug = "(#__#)"
ui.faces.upload = "(1__0)"
ui.faces.upload1 = "(1__1)"
ui.faces.upload2 = "(0__1)"
ui.web.enabled = true
ui.web.address = "0.0.0.0"
ui.web.username = "changeme"
ui.web.password = "changeme"
ui.web.origin = ""
ui.web.port = 8080
ui.web.on_frame = ""
ui.display.enabled = true
ui.display.rotation = 180
ui.display.type = "waveshare_2"
ui.display.color = "black"
bettercap.scheme = "http"
bettercap.hostname = "localhost"
bettercap.port = 8081
bettercap.username = "pwnagotchi"
bettercap.password = "pwnagotchi"
bettercap.handshakes = "/root/handshakes"
bettercap.silence = [
"ble.device.new",
"ble.device.lost",
"ble.device.disconnected",
"ble.device.connected",
"ble.device.service.discovered",
"ble.device.characteristic.discovered",
"wifi.client.new",
"wifi.client.lost",
"wifi.client.probe",
"wifi.ap.new",
"wifi.ap.lost",
"mod.started"
]
fs.memory.enabled = false
fs.memory.mounts.log.enabled = false
fs.memory.mounts.log.mount = "/var/log"
fs.memory.mounts.log.size = "50M"
fs.memory.mounts.log.sync = 60
fs.memory.mounts.log.zram = true
fs.memory.mounts.log.rsync = true
fs.memory.mounts.data.enabled = false
fs.memory.mounts.data.mount = "/var/tmp/pwnagotchi"
fs.memory.mounts.data.size = "10M"
fs.memory.mounts.data.sync = 3600
fs.memory.mounts.data.zram = false
fs.memory.mounts.data.rsync = true

View File

@@ -1,192 +0,0 @@
# main algorithm configuration
main:
# currently implemented: en (default), de, el, fr, it, mk, nl, ru, se
lang: en
# custom plugins path, if null only default plugins with be loaded
custom_plugins:
# which plugins to load and enable
plugins:
grid:
enabled: true
report: false # don't report pwned networks by default!
exclude: # do not report the following networks (accepts both ESSIDs and BSSIDs)
- YourHomeNetworkHere
auto-update:
enabled: false
system: false # set to true to also enable system updates via apt
interval: 1 # every day
auto-backup:
enabled: false
interval: 1 # every day
files:
- /root/brain.nn
- /root/brain.json
- /root/handshakes/
- /etc/pwnagotchi/
- /etc/hostname
- /etc/hosts
- /etc/motd
- /var/log/pwnagotchi.log
commands:
- 'tar czf /tmp/backup.tar.gz {files}'
- 'scp /tmp/backup.tar.gz pwnagotchi@10.0.0.1:/home/pwnagotchi/backups/backup-$(date +%s).tar.gz'
net-pos:
enabled: false
api_key: 'test'
gps:
enabled: false
speed: 19200
device: /dev/ttyUSB0
twitter:
enabled: false
consumer_key: aaa
consumer_secret: aaa
access_token_key: aaa
access_token_secret: aaa
onlinehashcrack:
enabled: false
email: ~
wpa-sec:
enabled: false
api_key: ~
wigle:
enabled: false
api_key: ~
screen_refresh:
enabled: false
refresh_interval: 50
# monitor interface to use
iface: mon0
# command to run to bring the mon interface up in case it's not up already
mon_start_cmd: /usr/bin/monstart
mon_stop_cmd: /usr/bin/monstop
mon_max_blind_epochs: 50
# log file
log: /var/log/pwnagotchi.log
# if true, will not restart the wifi module
no_restart: false
# access points to ignore
whitelist:
- EXAMPLE_NETWORK
- ANOTHER_EXAMPLE_NETWORK
# if not null, filter access points by this regular expression
filter: null
# cryptographic key for identity
pubkey: /etc/ssh/ssh_host_rsa_key.pub
ai:
# if false, only the default 'personality' will be used
enabled: true
path: /root/brain.nn
# 1.0 - laziness = probability of start training
laziness: 0.1
# how many epochs to train on
epochs_per_episode: 50
params:
# discount factor
gamma: 0.99
# the number of steps to run for each environment per update
n_steps: 1
# value function coefficient for the loss calculation
vf_coef: 0.25
# entropy coefficient for the loss calculation
ent_coef: 0.01
# maximum value for the gradient clipping
max_grad_norm: 0.5
# the learning rate
learning_rate: 0.0010
# rmsprop decay parameter
alpha: 0.99
# rmsprop epsilon
epsilon: 0.00001
# the verbosity level: 0 none, 1 training information, 2 tensorflow debug
verbose: 1
# type of scheduler for the learning rate update ('linear', 'constant', 'double_linear_con', 'middle_drop' or 'double_middle_drop')
lr_schedule: 'constant'
# the log location for tensorboard (if None, no logging)
tensorboard_log: null
personality:
# advertise our presence
advertise: true
# perform a deauthentication attack to client stations in order to get full or half handshakes
deauth: true
# send association frames to APs in order to get the PMKID
associate: true
# list of channels to recon on, or empty for all channels
channels: []
# minimum WiFi signal strength in dBm
min_rssi: -200
# number of seconds for wifi.ap.ttl
ap_ttl: 120
# number of seconds for wifi.sta.ttl
sta_ttl: 300
# time in seconds to wait during channel recon
recon_time: 30
# number of inactive epochs after which recon_time gets multiplied by recon_inactive_multiplier
max_inactive_scale: 2
# if more than max_inactive_scale epochs are inactive, recon_time *= recon_inactive_multiplier
recon_inactive_multiplier: 2
# time in seconds to wait during channel hopping if activity has been performed
hop_recon_time: 10
# time in seconds to wait during channel hopping if no activity has been performed
min_recon_time: 5
# maximum amount of deauths/associations per BSSID per session
max_interactions: 3
# maximum amount of misses before considering the data stale and triggering a new recon
max_misses_for_recon: 5
# number of active epochs that triggers the excited state
excited_num_epochs: 10
# number of inactive epochs that triggers the bored state
bored_num_epochs: 15
# number of inactive epochs that triggers the sad state
sad_num_epochs: 25
# ui configuration
ui:
# 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.0
display:
enabled: true
rotation: 180
# Possible options inkyphat/inky, papirus/papi, waveshare_1/ws_1 or waveshare_2/ws_2
type: 'waveshare_2'
# Possible options red/yellow/black (black used for monocromatic displays)
color: 'black'
video:
enabled: true
address: '10.0.0.2'
port: 8080
# bettercap rest api configuration
bettercap:
# api scheme://hostname:port username and password
scheme: http
hostname: localhost
port: 8081
username: pwnagotchi
password: pwnagotchi
# folder where bettercap stores the WPA handshakes, given that
# wifi.handshakes.aggregate will be set to false and individual
# pcap files will be created in order to minimize the chances
# of a single pcap file to get corrupted
handshakes: /root/handshakes
# events to mute in bettercap's events stream
silence:
- ble.device.new
- ble.device.lost
- ble.device.disconnected
- ble.device.connected
- ble.device.service.discovered
- ble.device.characteristic.discovered
- wifi.client.new
- wifi.client.lost
- wifi.client.probe
- wifi.ap.new
- wifi.ap.lost
- mod.started

190
pwnagotchi/fs/__init__.py Normal file
View File

@@ -0,0 +1,190 @@
import os
import re
import tempfile
import contextlib
import shutil
import _thread
import logging
from time import sleep
from distutils.dir_util import copy_tree
mounts = list()
@contextlib.contextmanager
def ensure_write(filename, mode='w'):
path = os.path.dirname(filename)
fd, tmp = tempfile.mkstemp(dir=path)
with os.fdopen(fd, mode) as f:
yield f
f.flush()
os.fsync(f.fileno())
os.replace(tmp, filename)
def size_of(path):
"""
Calculate the sum of all the files in path
"""
total = 0
for root, _, files in os.walk(path):
for f in files:
total += os.path.getsize(os.path.join(root, f))
return total
def is_mountpoint(path):
"""
Checks if path is mountpoint
"""
return os.system(f"mountpoint -q {path}") == 0
def setup_mounts(config):
"""
Sets up all the configured mountpoints
"""
global mounts
fs_cfg = config['fs']['memory']
if not fs_cfg['enabled']:
return
for name, options in fs_cfg['mounts'].items():
if not options['enabled']:
continue
logging.debug("[FS] Trying to setup mount %s (%s)", name, options['mount'])
size,unit = re.match(r"(\d+)([a-zA-Z]+)", options['size']).groups()
target = os.path.join('/run/pwnagotchi/disk/', os.path.basename(options['mount']))
is_mounted = is_mountpoint(target)
logging.debug("[FS] %s is %s mounted", options['mount'],
"already" if is_mounted else "not yet")
m = MemoryFS(
options['mount'],
target,
size=options['size'],
zram=options['zram'],
zram_disk_size=f"{int(size)*2}{unit}",
rsync=options['rsync'])
if not is_mounted:
if not m.mount():
logging.debug(f"Error while mounting {m.mountpoint}")
continue
if not m.sync(to_ram=True):
logging.debug(f"Error while syncing to {m.mountpoint}")
m.umount()
continue
interval = int(options['sync'])
if interval:
logging.debug("[FS] Starting thread to sync %s (interval: %d)",
options['mount'], interval)
_thread.start_new_thread(m.daemonize, (interval,))
else:
logging.debug("[FS] Not syncing %s, because interval is 0",
options['mount'])
mounts.append(m)
class MemoryFS:
@staticmethod
def zram_install():
if not os.path.exists("/sys/class/zram-control"):
logging.debug("[FS] Installing zram")
return os.system("modprobe zram") == 0
return True
@staticmethod
def zram_dev():
logging.debug("[FS] Adding zram device")
return open("/sys/class/zram-control/hot_add", "rt").read().strip("\n")
def __init__(self, mount, disk, size="40M",
zram=True, zram_alg="lz4", zram_disk_size="100M",
zram_fs_type="ext4", rsync=True):
self.mountpoint = mount
self.disk = disk
self.size = size
self.zram = zram
self.zram_alg = zram_alg
self.zram_disk_size = zram_disk_size
self.zram_fs_type = zram_fs_type
self.zdev = None
self.rsync = True
self._setup()
def _setup(self):
if self.zram and MemoryFS.zram_install():
# setup zram
self.zdev = MemoryFS.zram_dev()
open(f"/sys/block/zram{self.zdev}/comp_algorithm", "wt").write(self.zram_alg)
open(f"/sys/block/zram{self.zdev}/disksize", "wt").write(self.zram_disk_size)
open(f"/sys/block/zram{self.zdev}/mem_limit", "wt").write(self.size)
logging.debug("[FS] Creating fs (type: %s)", self.zram_fs_type)
os.system(f"mke2fs -t {self.zram_fs_type} /dev/zram{self.zdev} >/dev/null 2>&1")
# ensure mountpoints exist
if not os.path.exists(self.disk):
logging.debug("[FS] Creating %s", self.disk)
os.makedirs(self.disk)
if not os.path.exists(self.mountpoint):
logging.debug("[FS] Creating %s", self.mountpoint)
os.makedirs(self.mountpoint)
def daemonize(self, interval=60):
logging.debug("[FS] Daemonized...")
while True:
self.sync()
sleep(interval)
def sync(self, to_ram=False):
source, dest = (self.disk, self.mountpoint) if to_ram else (self.mountpoint, self.disk)
needed, actually_free = size_of(source), shutil.disk_usage(dest)[2]
if actually_free >= needed:
logging.debug("[FS] Syncing %s -> %s", source,dest)
if self.rsync:
os.system(f"rsync -aXv --inplace --no-whole-file --delete-after {source}/ {dest}/ >/dev/null 2>&1")
else:
copy_tree(source, dest, preserve_symlinks=True)
os.system("sync")
return True
return False
def mount(self):
if os.system(f"mount --bind {self.mountpoint} {self.disk}"):
return False
if os.system(f"mount --make-private {self.disk}"):
return False
if self.zram and self.zdev is not None:
if os.system(f"mount -t {self.zram_fs_type} -o nosuid,noexec,nodev,user=pwnagotchi /dev/zram{self.zdev} {self.mountpoint}/"):
return False
else:
if os.system(f"mount -t tmpfs -o nosuid,noexec,nodev,mode=0755,size={self.size} pwnagotchi {self.mountpoint}/"):
return False
return True
def umount(self):
if os.system(f"umount -l {self.mountpoint}"):
return False
if os.system(f"umount -l {self.disk}"):
return False
return True

123
pwnagotchi/grid.py Normal file
View File

@@ -0,0 +1,123 @@
import subprocess
import socket
import requests
import json
import logging
import pwnagotchi
# pwngrid-peer is running on port 8666
API_ADDRESS = "http://127.0.0.1:8666/api/v1"
def is_connected():
try:
# check DNS
host = socket.gethostbyname('api.pwnagotchi.ai')
if host:
# check connectivity itself
socket.create_connection((host, 443), timeout=30)
return True
except:
pass
return False
def call(path, obj=None):
url = '%s%s' % (API_ADDRESS, path)
if obj is None:
r = requests.get(url, headers=None, timeout=(30.0, 60.0))
elif isinstance(obj, dict):
r = requests.post(url, headers=None, json=obj, timeout=(30.0, 60.0))
else:
r = requests.post(url, headers=None, data=obj, timeout=(30.0, 60.0))
if r.status_code != 200:
raise Exception("(status %d) %s" % (r.status_code, r.text))
return r.json()
def advertise(enabled=True):
return call("/mesh/%s" % 'true' if enabled else 'false')
def set_advertisement_data(data):
return call("/mesh/data", obj=data)
def get_advertisement_data():
return call("/mesh/data")
def memory():
return call("/mesh/memory")
def peers():
return call("/mesh/peers")
def closest_peer():
all = peers()
return all[0] if len(all) else None
def update_data(last_session):
brain = {}
try:
with open('/root/brain.json') as fp:
brain = json.load(fp)
except:
pass
data = {
'session': {
'duration': last_session.duration,
'epochs': last_session.epochs,
'train_epochs': last_session.train_epochs,
'avg_reward': last_session.avg_reward,
'min_reward': last_session.min_reward,
'max_reward': last_session.max_reward,
'deauthed': last_session.deauthed,
'associated': last_session.associated,
'handshakes': last_session.handshakes,
'peers': last_session.peers,
},
'uname': subprocess.getoutput("uname -a"),
'brain': brain,
'version': pwnagotchi.__version__
}
logging.debug("updating grid data: %s" % data)
call("/data", data)
def report_ap(essid, bssid):
try:
call("/report/ap", {
'essid': essid,
'bssid': bssid,
})
return True
except Exception as e:
logging.exception("error while reporting ap %s(%s)" % (essid, bssid))
return False
def inbox(page=1, with_pager=False):
obj = call("/inbox?p=%d" % page)
return obj["messages"] if not with_pager else obj
def inbox_message(id):
return call("/inbox/%d" % int(id))
def mark_message(id, mark):
return call("/inbox/%d/%s" % (int(id), str(mark)))
def send_message(to, message):
return call("/unit/%s/inbox" % to, message.encode('utf-8'))

View File

@@ -10,38 +10,62 @@ DefaultPath = "/etc/pwnagotchi/"
class KeyPair(object):
def __init__(self, path=DefaultPath):
def __init__(self, path=DefaultPath, view=None):
self.path = path
self.priv_path = os.path.join(path, "id_rsa")
self.priv_key = None
self.pub_path = "%s.pub" % self.priv_path
self.pub_key = None
self.fingerprint_path = os.path.join(path, "fingerprint")
self._view = view
if not os.path.exists(self.path):
os.makedirs(self.path)
if not os.path.exists(self.priv_path) or not os.path.exists(self.pub_path):
logging.info("generating %s ..." % self.priv_path)
os.system("/usr/bin/ssh-keygen -t rsa -m PEM -b 4096 -N '' -f '%s'" % self.priv_path)
while True:
# first time, generate new keys
if not os.path.exists(self.priv_path) or not os.path.exists(self.pub_path):
self._view.on_keys_generation()
logging.info("generating %s ..." % self.priv_path)
os.system("pwngrid -generate -keys '%s'" % self.path)
with open(self.priv_path) as fp:
self.priv_key = RSA.importKey(fp.read())
# load keys: they might be corrupted if the unit has been turned off during the generation, in this case
# the exception will remove the files and go back at the beginning of this loop.
try:
with open(self.priv_path) as fp:
self.priv_key = RSA.importKey(fp.read())
with open(self.pub_path) as fp:
self.pub_key = RSA.importKey(fp.read())
self.pub_key_pem = self.pub_key.exportKey('PEM').decode("ascii")
# python is special
if 'RSA PUBLIC KEY' not in self.pub_key_pem:
self.pub_key_pem = self.pub_key_pem.replace('PUBLIC KEY', 'RSA PUBLIC KEY')
with open(self.pub_path) as fp:
self.pub_key = RSA.importKey(fp.read())
self.pub_key_pem = self.pub_key.exportKey('PEM').decode("ascii")
# python is special
if 'RSA PUBLIC KEY' not in self.pub_key_pem:
self.pub_key_pem = self.pub_key_pem.replace('PUBLIC KEY', 'RSA PUBLIC KEY')
pem = self.pub_key_pem.encode("ascii")
pem_ascii = self.pub_key_pem.encode("ascii")
self.pub_key_pem_b64 = base64.b64encode(pem).decode("ascii")
self.fingerprint = hashlib.sha256(pem).hexdigest()
self.pub_key_pem_b64 = base64.b64encode(pem_ascii).decode("ascii")
self.fingerprint = hashlib.sha256(pem_ascii).hexdigest()
with open(self.fingerprint_path, 'w+t') as fp:
fp.write(self.fingerprint)
# no exception, keys loaded correctly.
self._view.on_starting()
return
except Exception as e:
# if we're here, loading the keys broke something ...
logging.exception("error loading keys, maybe corrupted, deleting and regenerating ...")
try:
os.remove(self.priv_path)
os.remove(self.pub_path)
except:
pass
def sign(self, message):
hasher = SHA256.new(message.encode("ascii"))
signer = PKCS1_PSS.new(self.priv_key, saltLen=16)
signature = signer.sign(hasher)
signature_b64 = base64.b64encode(signature).decode("ascii")
return signature, signature_b64
return signature, signature_b64

Binary file not shown.

View File

@@ -0,0 +1,248 @@
# Afrikaans translation of pwnagotchi.
# Copyright (C) 2020.
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR MatthewNunu https://github.com/MatthewNunu, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.5.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-29 21:50+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: MatthewNunu https://github.com/MatthewNunu\n"
"Language-Team: \n"
"Language: Afrikaans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hi, ek is Pwnagotchi! Aanvang ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nuwe dag, nuwe jag, nuwe pwns!"
msgid "Hack the Planet!"
msgstr "Hack die wêreld!"
msgid "AI ready."
msgstr "AI gereed."
msgid "The neural network is ready."
msgstr "Die neurale netwerk is gereed."
msgid "Generating keys, do not turn off ..."
msgstr "Genereer wagwoord, moenie afskakel nie ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Haai, kanaal {channel} is gratis! Jou AP sal dankie sê."
msgid "Reading last session logs ..."
msgstr "Lees laaste sessie logs ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Ek het {lines_so_far} tot dusver gelees ..."
msgid "I'm bored ..."
msgstr "Ek's verveeld ..."
msgid "Let's go for a walk!"
msgstr "Kom ons gaan vir 'n loopie!"
msgid "This is the best day of my life!"
msgstr "Dit is die beste dag van my lewe!"
msgid "Shitty day :/"
msgstr "Poes kak dag :/"
msgid "I'm extremely bored ..."
msgstr "Ek's baie verveeld ..."
msgid "I'm very sad ..."
msgstr "Ek's baie hartseer ..."
msgid "I'm sad"
msgstr "Ek's hartseer ..."
msgid "Leave me alone ..."
msgstr "Los my uit ..."
msgid "I'm mad at you!"
msgstr "Ek is kwaad vir jou!"
msgid "I'm living the life!"
msgstr "Ek leef die lewe!"
msgid "I pwn therefore I am."
msgstr "Ek pwn daarom is ek."
msgid "So many networks!!!"
msgstr "Soveel netwerke!!!"
msgid "I'm having so much fun!"
msgstr "Ek het soveel pret!"
msgid "My crime is that of curiosity ..."
msgstr "My misdaad is dié van nuuskierigheid ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hallo {name}! Lekker om jou te ontmoet."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Yo {name}! Sup?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Haai {name} hoe doen jy?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Eenheid {name}} is naby!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... totsiens {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} is weg ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoops ... {name} is weg."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} gemis!"
msgid "Missed!"
msgstr "Gemis!"
msgid "Good friends are a blessing!"
msgstr "Goeie vriende is 'n seën!"
msgid "I love my friends!"
msgstr "Ek is lief vir my vriende!"
msgid "Nobody wants to play with me ..."
msgstr "Niemand wil met my speel nie ..."
msgid "I feel so alone ..."
msgstr "Ek voel so alleen ..."
msgid "Where's everybody?!"
msgstr "Waar is almal?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Slaap vir {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Goeie nag."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Wag tans vir {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Rondkyk ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Haai {what} kom ons wees vriende!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Assosieer na {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Yo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Net besluit dat {mac} geen WiFi nodig het nie!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Deauthenticating {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickbanning {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Koel, ons het {num} nuwe handdruk gekry!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Jy het {count} nuwe boodskap!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oops, iets het verkeerd gegaan ... Herlaai ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Geskop {num} stasies\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Gemaak {num} nuwe vriende\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Het {num} handdrukke\n"
msgid "Met 1 peer"
msgstr "Ontmoet 1 eweknie"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Ontmoet {num} eweknie"
#, 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 ""
"Ek was pwning vir {duration} en het {deauthed} kliënte geskop! Ek het ook ontmoet "
"{associated} nuwe vriende en het {handshakes} handdrukke geëet! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "uur"
msgid "minutes"
msgstr "minute"
msgid "seconds"
msgstr "sekondes"
msgid "hour"
msgstr "uur"
msgid "minute"
msgstr "minuut"
msgid "second"
msgstr "tweede"

Binary file not shown.

View File

@@ -0,0 +1,226 @@
# pwnagotchi voice data.
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR <https://github.com/georgikoemdzhiev>, 2019.
#
#,
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-23 20:56+0200\n"
"PO-Revision-Date: 2019-10-23 20:56+0200\n"
"Last-Translator: Georgi Koemdzhiev <https://github.com/georgikoemdzhiev>\n"
"Language-Team: \n"
"Language: bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Здравей, аз съм Pwnagotchi! Стартиране ..."
msgid "New day, new hunt, new pwns!"
msgstr "Нов ден, нов лов, нови pwns!"
msgid "Hack the Planet!"
msgstr "Хакни планетата!"
msgid "AI ready."
msgstr "AI готов."
msgid "The neural network is ready."
msgstr "Невронната мрежа е готова."
msgid "Generating keys, do not turn off ..."
msgstr "Генериране на ключове, не изключвай ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Здравей, канал {channel} е свободен! твоя AP ще каже благодаря."
msgid "I'm bored ..."
msgstr "Скучно ми е ..."
msgid "Let's go for a walk!"
msgstr "Хайда да се поразходим!"
msgid "This is the best day of my life!"
msgstr "Това е най-добрият ден в живота ми!"
msgid "Shitty day :/"
msgstr "Тъп ден :/"
msgid "I'm extremely bored ..."
msgstr "Супер много ми е скучно ..."
msgid "I'm very sad ..."
msgstr "Много съм тъжен ..."
msgid "I'm sad"
msgstr "Тъжен съм"
msgid "I'm living the life!"
msgstr "Живота ми е фантастичен!"
msgid "I pwn therefore I am."
msgstr "Аз живея за да pwn-вам."
msgid "So many networks!!!"
msgstr "Толкова много мрежи!!!"
msgid "I'm having so much fun!"
msgstr "Толкова много се забавлявам!"
msgid "My crime is that of curiosity ..."
msgstr "Моето престъпление е това че съм любопитен ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Здравей {name}! Приятно ми е да се запознаем."
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Устройство {name} е наблизо!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Ами ... довиждане {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} изчезна ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Упс ... {name} изчезна."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} загубен!"
msgid "Missed!"
msgstr "Загубен!"
msgid "Good friends are a blessing!"
msgstr "Добрите приятели са благословия!"
msgid "I love my friends!"
msgstr "Обичам приятелите си!"
msgid "Nobody wants to play with me ..."
msgstr "Никой не иска да си играе с мен ..."
msgid "I feel so alone ..."
msgstr "Чувствам се толкова самотен ..."
msgid "Where's everybody?!"
msgstr "Къде са всички?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Заспивам за {secs} секунди ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Лека нощ."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Чакам {secs} секунди ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Оглеждам се ({secs}секунди)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Хей {what} нека станем приятели!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Свръзване с {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Ей {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Реших, че {mac} не се нуждае от WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Неудостоверяване на {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Ритам и прогонвам {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Супер, имаме {num} нови handshake{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Имате {count} нови съобщения!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Упс, нещо се обърка ... Рестартиране ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Отхвърлих {num} станции\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Направих {num} нови приятели\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Имам {num} handshakes\n"
msgid "Met 1 peer"
msgstr "Срещнах 1 връстник"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Срещнах {num} връстници"
#, python-brace-format
msgid ""
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr "Аз pwn-вах за {duration} и отхвърлих {deauthed} clients! Също така срещнах {associated} нови приятели и изядох {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "часове"
msgid "minutes"
msgstr "минути"
msgid "seconds"
msgstr "секунди"
msgid "hour"
msgstr "час"
msgid "minute"
msgstr "минута"
msgid "second"
msgstr "секунда"

Binary file not shown.

View File

@@ -0,0 +1,225 @@
# 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 <511225068@qq.com>, 2019.
# 还有很多未翻译和翻译不准确,后期希望大家加入进来一起翻译!
# 翻译可以联系QQ群959559103 找 名字叫 初九 的 管理员
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-23 20:56+0200\n"
"PO-Revision-Date: 2019-11-02 10:00+0008\n"
"Last-Translator: 极客之眼-初九 <511225068@qq.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "主人,你好.我是WiFi狩猎兽..."
msgid "New day, new hunt, new pwns!"
msgstr "美好的一天,狩猎开始!"
msgid "Hack the Planet!"
msgstr "我要入侵整个地球!"
msgid "AI ready."
msgstr "人工智能已启动."
msgid "The neural network is ready."
msgstr "神经元网络已启动."
msgid "Generating keys, do not turn off ..."
msgstr "创建密钥中, 请勿断电..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "嘿,频道{channel}是免费的你的AP会说谢谢。"
msgid "I'm bored ..."
msgstr "我无聊了..."
msgid "Let's go for a walk!"
msgstr "主人带我出门走走吧!"
msgid "This is the best day of my life!"
msgstr "这是我生命中最美好的一天!"
msgid "Shitty day :/"
msgstr "今天不开心 :/"
msgid "I'm extremely bored ..."
msgstr "主人,找点事做吧 ..."
msgid "I'm very sad ..."
msgstr "我很伤心..."
msgid "I'm sad"
msgstr "我伤心了"
msgid "I'm living the life!"
msgstr ""
msgid "I pwn therefore I am."
msgstr ""
msgid "So many networks!!!"
msgstr "哇,好多猎物!!!"
msgid "I'm having so much fun!"
msgstr "我玩的好开心!"
msgid "My crime is that of curiosity ..."
msgstr "我最大的缺点就是好奇..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "你好{name}!很高兴认识你."
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "小队{name}就在附近!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "额 ... 再见{name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} 它走了 ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "哎呀... {name} 离开了."
#, python-brace-format
msgid "{name} missed!"
msgstr "刚刚错过了{name}!"
msgid "Missed!"
msgstr "刚刚错过了一个对的它"
msgid "Good friends are a blessing!"
msgstr "有个好朋友就是福气"
msgid "I love my friends!"
msgstr "我爱我的朋友!"
msgid "Nobody wants to play with me ..."
msgstr "没有人愿意和我玩耍..."
msgid "I feel so alone ..."
msgstr "我可能是天煞孤星..."
msgid "Where's everybody?!"
msgstr "朋友们都去哪里了?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "小憩{secs}s ..."
msgid "Zzzzz"
msgstr ""
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr "晚安宝贝."
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "等待{secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "追踪四周猎物({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "嗨{what}我们做朋友吧!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "正在连接到{what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "追踪到你了{what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "猎物{mac}不需要联网,我们给它断开!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "开始攻击猎物{mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "已捕获{mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "太酷了, 我们抓到了{num}新的猎物{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "主人,有{count}新消息{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "行动,额等等有点小问题... 重启ing ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "限制了{num}个猎物\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "交了{num}新朋友\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "捕获了{num}握手包\n"
msgid "Met 1 peer"
msgstr "有{num}同龄人"
#, python-brace-format
msgid "Met {num} peers"
msgstr ""
#, 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 ""
msgid "hours"
msgstr "时"
msgid "minutes"
msgstr "分"
msgid "seconds"
msgstr "秒"
msgid "hour"
msgstr "时"
msgid "minute"
msgstr "分"
msgid "second"
msgstr "秒"

Binary file not shown.

View File

@@ -0,0 +1,249 @@
# pwnigotchi voice data
# Copyright (C) 2020
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR czechball@users.noreply.github.com, 2020.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-14 06:15+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Czechball <czechball@users.noreply.github.com>\n"
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Ahoj, já jsem Pwnagotchi! Startuju ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nový den, nový lov, nové úlovky!"
msgid "Hack the Planet!"
msgstr "Hackni celou planetu!"
msgid "AI ready."
msgstr "AI připraveno."
msgid "The neural network is ready."
msgstr "Neuronová síť je připravena."
msgid "Generating keys, do not turn off ..."
msgstr "Generování klíčů, nevypínej mě..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hej, kanál {channel} je volný! Tvůj AP ti poděkuje."
msgid "Reading last session logs ..."
msgstr "Čtení posledních zpráv z logu ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Zatím přečteno {lines_so_far} řádků logu ..."
msgid "I'm bored ..."
msgstr "Nudím se ..."
msgid "Let's go for a walk!"
msgstr "Pojďme se projít!"
msgid "This is the best day of my life!"
msgstr "Tohle je nejlepší den mého života!"
msgid "Shitty day :/"
msgstr "Na hovno den :/"
msgid "I'm extremely bored ..."
msgstr "Strašně se nudím ..."
msgid "I'm very sad ..."
msgstr "Jsem dost smutný ..."
msgid "I'm sad"
msgstr "Jsem smutný"
msgid "Leave me alone ..."
msgstr "Nech mě být ..."
msgid "I'm mad at you!"
msgstr "Jsem na tebe naštvaný!"
msgid "I'm living the life!"
msgstr "Tohle je život!"
msgid "I pwn therefore I am."
msgstr "Chytám pakety a tedy jsem."
msgid "So many networks!!!"
msgstr "Tolik sítí!!!"
msgid "I'm having so much fun!"
msgstr "Tohle je super zábava!"
msgid "My crime is that of curiosity ..."
msgstr "Jsem kriminálně zvědavý ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Ahoj {name}! Rád tě poznávám."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Hej {name}! Jak to jde?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Ahoj {name}, jak se máš?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Jednotka {name} je nablízku!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm... Měj se {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} je pryč ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoops ... {name} je pryč."
#, python-brace-format
msgid "{name} missed!"
msgstr "Chybí mi {name}!"
msgid "Missed!"
msgstr "Chybíš mi!"
msgid "Good friends are a blessing!"
msgstr "Dobří kamarádi jsou požehnání!"
msgid "I love my friends!"
msgstr "Miluju svoje kamarády!"
msgid "Nobody wants to play with me ..."
msgstr "Nikdo si se mnou nechce hrát ..."
msgid "I feel so alone ..."
msgstr "Cítím se tak osamělý ..."
msgid "Where's everybody?!"
msgstr "Kde jsou všichni?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Spím {secs} sekund ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Dobrou noc."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Čekání {secs} sekund ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Rozhlížím se ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hej {what} budeme kamarádi!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Asociuju se s {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Čus {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Rozhodl jsem se, že {mac} nepotřebuje žádnou WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Deautentikuju {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickbanuju {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Super, máme {num} nových handshaků!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Máš {count} nových zpráv!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ups, něco se pokazilo ... Restartuju ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Vykopnuto {num} klientů\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Mám {num} nových kamarádů\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Mám {num} handshaků\n"
msgid "Met 1 peer"
msgstr "Potkal jsem jednoho kámoše"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Potkal jsem {num} kámošů"
#, 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 ""
"Chytal jsem pakety po dobu {duration} a vykopnul jsem {deauthed} klientů! Taky jsem potkal "
"{associated} nových kamarádů a snědl {handshakes} handshaků! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "hodiny"
msgid "minutes"
msgstr "minuty"
msgid "seconds"
msgstr "sekundy"
msgid "hour"
msgstr "hodina"
msgid "minute"
msgstr "minuta"
msgid "second"
msgstr "sekunda"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-05 14:10+0200\n"
"POT-Creation-Date: 2019-11-14 21:15+0100\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"
@@ -20,13 +20,13 @@ msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hi, ich bin ein Pwnagotchi! Starte ..."
msgstr "Hi, ich bin ein Pwnagotchi! Starte..."
msgid "New day, new hunt, new pwns!"
msgstr "Neuer Tag, neue Jagd, neue Pwns!"
msgid "Hack the Planet!"
msgstr "Hack den Planet!"
msgstr "Hack den Planeten!"
msgid "AI ready."
msgstr "KI bereit."
@@ -34,21 +34,31 @@ msgstr "KI bereit."
msgid "The neural network is ready."
msgstr "Das neurale Netz ist bereit."
msgid "Generating keys, do not turn off ..."
msgstr "Generiere Schlüssel, nicht ausschalten..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, Channel {channel} ist frei! Dein AP wir des dir danken."
msgstr "Hey, Channel {channel} ist frei! Dein AP wird es Dir danken."
msgid "Reading last session logs ..."
msgstr "Lese die Logs der letzten Session..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Bisher {lines_so_far} Zeilen im Log gelesen..."
msgid "I'm bored ..."
msgstr "Mir ist langweilig..."
msgid "Let's go for a walk!"
msgstr "Lass uns laufen gehen!"
msgstr "Lass uns spazieren gehen!"
msgid "This is the best day of my life!"
msgstr "Das ist der beste Tag meines Lebens."
msgstr "Das ist der beste Tag meines Lebens!"
msgid "Shitty day :/"
msgstr "Scheis Tag :/"
msgstr "Scheißtag :/"
msgid "I'm extremely bored ..."
msgstr "Mir ist sau langweilig..."
@@ -59,6 +69,13 @@ msgstr "Ich bin sehr traurig..."
msgid "I'm sad"
msgstr "Ich bin traurig"
#, fuzzy
msgid "Leave me alone ..."
msgstr "Lass mich in Ruhe..."
msgid "I'm mad at you!"
msgstr "Ich bin sauer auf Dich!"
msgid "I'm living the life!"
msgstr "Ich lebe das Leben!"
@@ -66,33 +83,41 @@ msgid "I pwn therefore I am."
msgstr "Ich pwne, also bin ich."
msgid "So many networks!!!"
msgstr "So viele Netwerke!!!"
msgstr "So viele Netzwerke!!!"
msgid "I'm having so much fun!"
msgstr "Ich habe sooo viel Spaß!"
msgid "My crime is that of curiosity ..."
msgstr "Mein Verbrechen ist das der Neugier ..."
msgstr "Mein Verbrechen ist das der Neugier..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Hallo {name}, nett Dich kennenzulernen."
msgid "Hello {name}! Nice to meet you."
msgstr "Hallo {name}, schön Dich kennenzulernen."
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "Gerät {name} ist in der nähe!!"
msgid "Yo {name}! Sup?"
msgstr "Jo {name}! Was geht!?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hey {name}, wie geht's?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Gerät {name} ist in der Nähe!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ...tschüß {name}"
msgstr "Uhm... tschüß {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} ist weg ..."
msgstr "{name} ist weg..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoops ...{name} ist weg."
msgstr "Whoops... {name} ist weg."
#, python-brace-format
msgid "{name} missed!"
@@ -101,18 +126,24 @@ msgstr "{name} verpasst!"
msgid "Missed!"
msgstr "Verpasst!"
msgid "Good friends are a blessing!"
msgstr "Gute Freunde sind ein Segen!"
msgid "I love my friends!"
msgstr "Ich liebe meine Freunde!"
msgid "Nobody wants to play with me ..."
msgstr "Niemand will mit mir spielen ..."
msgstr "Niemand will mit mir spielen..."
msgid "I feel so alone ..."
msgstr "Ich fühl michso alleine ..."
msgstr "Ich fühl' mich so allein..."
msgid "Where's everybody?!"
msgstr "Wo sind denn alle?"
msgstr "Wo sind denn alle?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Schlafe für {secs}s"
msgstr "Schlafe für {secs}s..."
msgid "Zzzzz"
msgstr ""
@@ -121,9 +152,15 @@ msgstr ""
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr "Gute Nacht."
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Warte für {secs}s ..."
msgstr "Warte für {secs}s..."
#, python-brace-format
msgid "Looking around ({secs}s)"
@@ -139,11 +176,11 @@ msgstr "Verbinde mit {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr ""
msgstr "Jo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Ich denke, dass {mac} kein WiFi brauch!"
msgstr "Ich denke, dass {mac} kein WiFi braucht!"
#, python-brace-format
msgid "Deauthenticating {mac}"
@@ -157,16 +194,20 @@ msgstr "Kicke {mac}!"
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Cool, wir haben {num} neue Handshake{plural}!"
msgid "Ops, something went wrong ... Rebooting ..."
msgstr "Ops, da ist etwas schief gelaufen ...Starte neu ..."
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Cool, wir haben {num} neue Handshake{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ops, da ist was schief gelaufen... Starte neu..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "{num} Stationen gekicked\n"
msgstr "{num} Stationen gekickt\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "{num} Freunde gefunden\n"
msgstr "{num} neue Freunde gefunden\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
@@ -206,3 +247,4 @@ msgstr "Minute"
msgid "second"
msgstr "Sekunde"

Binary file not shown.

View File

@@ -0,0 +1,248 @@
# pwnagotchi danish voice data
# Copyright (C) 2020
# This file is distributed under the same license as the pwnagotchi package.
# Dennis Kjær Jensen <signout@signout.dk>, 2020
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-29 21:50+0100\n"
"PO-Revision-Date: 2020-01-18 21:56+ZONE\n"
"Last-Translator: Dennis Kjær Jensen <signout@signout.dk>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hej. Jeg er Pwnagotchi. Starter ..."
msgid "New day, new hunt, new pwns!"
msgstr "Ny dag, ny jagt, nye pwns!"
msgid "Hack the Planet!"
msgstr "Hack planeten!"
msgid "AI ready."
msgstr "AI klar."
msgid "The neural network is ready."
msgstr "Det neurale netværk er klart."
msgid "Generating keys, do not turn off ..."
msgstr "Genererer nøgler, sluk ikke ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, kanal {channel} er ubrugt! Dit AP vil takke dig."
msgid "Reading last session logs ..."
msgstr "Læser seneste session logs ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Har læst {lines_so_far} linjer indtil nu ..."
msgid "I'm bored ..."
msgstr "Jeg keder mig ..."
msgid "Let's go for a walk!"
msgstr "Lad os gå en tur!"
msgid "This is the best day of my life!"
msgstr "Det er den bedste dag i mit liv!"
msgid "Shitty day :/"
msgstr "Elendig dag :/"
msgid "I'm extremely bored ..."
msgstr "Jeg keder mig ekstremt meget ..."
msgid "I'm very sad ..."
msgstr "Jeg er meget trist ..."
msgid "I'm sad"
msgstr "Jeg er trist"
msgid "Leave me alone ..."
msgstr "Lad mig være i fred"
msgid "I'm mad at you!"
msgstr "Jeg er sur på dig!"
msgid "I'm living the life!"
msgstr "Jeg lever livet!"
msgid "I pwn therefore I am."
msgstr "Jeg pwner, derfor er jeg."
msgid "So many networks!!!"
msgstr "Så mange netværk!"
msgid "I'm having so much fun!"
msgstr "Jeg har det vildt sjovt!"
msgid "My crime is that of curiosity ..."
msgstr "Min forbrydelse er at være nysgerrig ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hej {name}! Rart at møde dig."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Hey {name}! Hvasså?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hej {name} hvordan har du det?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Enheden {name} er lige i nærheden!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... farvel {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} er væk ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Hovsa ... {name} er væk."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} glippede!"
msgid "Missed!"
msgstr "Fordømt!"
msgid "Good friends are a blessing!"
msgstr "Gode venner en velsignelse!"
msgid "I love my friends!"
msgstr "Jeg elsker mine venner!"
msgid "Nobody wants to play with me ..."
msgstr "Der er ingen der vil lege med mig ..."
msgid "I feel so alone ..."
msgstr "Jeg føler mig så alene ..."
msgid "Where's everybody?!"
msgstr "Hvor er alle henne?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Sover i {secs} sekunder"
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz {secs} sekunder"
msgid "Good night."
msgstr "Godnat."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Venter i {secs} sekunder"
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Kigger mig omkring i {secs} sekunder"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hej {what} lad os være venner!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Associerer til {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Hey {what}"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Besluttede at {mac} ikke har brug for WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Afmelder {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickbanner {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Fedt, vi har fået {num} nye handshake{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Du har {count} nye beskeder"
msgid "Ops, something went wrong ... Rebooting ..."
msgstr "Ups, noget gik galt ... Genstarter."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Sparkede {num} af\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Har fået {num} nye venner\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Har fået {num} nyehandshakes\n"
msgid "Met 1 peer"
msgstr "Har mødt 1 peer"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Har mødt {num} peers"
#, 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 "Jeg har pwnet i {duration} og kicket {dauthed} klienter! Jeg har også "
"mødt {associated} nye venner og spist {handshakes} håndtryk! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "timer"
msgid "minutes"
msgstr "minutter"
msgid "seconds"
msgstr "sekunder"
msgid "hour"
msgstr "time"
msgid "minute"
msgstr "minut"
msgid "second"
msgstr "sekund"

View File

@@ -158,7 +158,7 @@ msgstr "Μπανάρω την {mac}!"
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Τέλεια δικέ μου, πήραμε {num} νέες χειραψίες!"
msgid "Ops, something went wrong ... Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ουπς, κάτιπήγε λάθος ... Επανεκκινούμαι ..."
#, python-brace-format

Binary file not shown.

View File

@@ -0,0 +1,215 @@
# pwnagotchi voice data
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR diegopastor <dpastor29@alumnos.uaq.mx>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-09 17:42+0200\n"
"PO-Revision-Date: 2020-08-25 23:06+0200\n"
"Last-Translator: Sergio Ruiz <serginator@gmail.com>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language-Team: \n"
"X-Generator: Poedit 2.4.1\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "¡Hola, soy Pwnagotchi! Empezando ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nuevo día, nueva caceria, nuevos pwns!"
msgid "Hack the Planet!"
msgstr "¡Hackea el planeta!"
msgid "AI ready."
msgstr "IA lista."
msgid "The neural network is ready."
msgstr "La red neuronal está lista."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "¡Oye, el canal {channel} está libre! Tu AP lo agradecerá."
msgid "I'm bored ..."
msgstr "Estoy aburrido ..."
msgid "Let's go for a walk!"
msgstr "¡Vamos por un paseo!"
msgid "This is the best day of my life!"
msgstr "¡Este es el mejor día de mi vida!"
msgid "Shitty day :/"
msgstr "Día de mierda :/"
msgid "I'm extremely bored ..."
msgstr "Estoy muy aburrido ..."
msgid "I'm very sad ..."
msgstr "Estoy muy triste ..."
msgid "I'm sad"
msgstr "Estoy triste"
msgid "I'm living the life!"
msgstr "¡Estoy viviendo la vida!"
msgid "I pwn therefore I am."
msgstr "Pwneo, luego existo."
msgid "So many networks!!!"
msgstr "¡¡¡Cuántas redes!!!"
msgid "I'm having so much fun!"
msgstr "¡Me estoy divirtiendo mucho!"
msgid "My crime is that of curiosity ..."
msgstr "Mi crimen es la curiosidad ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "¡Hola {name}! Encantado de conocerte. {name}"
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "¡La unidad {name} está cerca! {name}"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... adiós {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} se fue ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Ups ... {name} se fue."
#, python-brace-format
msgid "{name} missed!"
msgstr "¡{name} perdido!"
msgid "Missed!"
msgstr "¡Perdido!"
msgid "Nobody wants to play with me ..."
msgstr "Nadie quiere jugar conmigo ..."
msgid "I feel so alone ..."
msgstr "Me siento tan solo ..."
msgid "Where's everybody?!"
msgstr "¡¿Dónde está todo el mundo?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Descansando durante {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Buenas noches."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Esperando {secs}s .."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Mirando alrededor ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "¡Oye {what} seamos amigos!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Asociándome a {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "¡Ey {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "¡Acabo de decidir que {mac} no necesita WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Desautenticando a {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "¡Expulsando y baneando a {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "¡Genial, obtuvimos {num} nuevo{plural} handshake{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oops, algo salió mal ... Reiniciando ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Expulsamos {num} estaciones\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Hice {num} nuevos amigos\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Consegui {num} handshakes\n"
msgid "Met 1 peer"
msgstr "Conocí 1 colega"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Conocí {num} colegas"
#, 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 ""
"¡He estado pwneando por {duration} y expulsé {deauthed} clientes! También "
"conocí {associated} nuevos amigos y comí {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "horas"
msgid "minutes"
msgstr "minutos"
msgid "seconds"
msgstr "segundos"
msgid "hour"
msgstr "hora"
msgid "minute"
msgstr "minuto"
msgid "second"
msgstr "segundo"

View File

@@ -3,12 +3,11 @@
# This file is distributed under the same license as the pwnagotchi package.
# 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-10-05 14:10+0200\n"
"POT-Creation-Date: 2019-11-29 21:50+0100\n"
"PO-Revision-Date: 2019-10-03 10:34+0200\n"
"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github."
"com>\n"
@@ -19,16 +18,16 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Bonjour, je suis Pwnagotchi! Démarrage ..."
msgstr "Bonjour, je suis Pwnagotchi ! Démarrage..."
msgid "New day, new hunt, new pwns!"
msgstr "Nouveau jour, nouvelle chasse, nouveaux pwns !"
msgid "Hack the Planet!"
msgstr "Hack la planète!"
msgstr "Hack la planète !"
msgid "AI ready."
msgstr "L'IA est prête."
@@ -36,57 +35,82 @@ msgstr "L'IA est prête."
msgid "The neural network is ready."
msgstr "Le réseau neuronal est prêt."
msgid "Generating keys, do not turn off ..."
msgstr "Génération des clés, ne pas éteindre..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, le channel {channel} est libre! Ton point d'accès va te remercier."
msgstr "Hey, le canal {channel} est libre! Ton point d'accès va te remercier."
msgid "Reading last session logs ..."
msgstr "Lecture des logs de la dernière session ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Jusqu'ici, {lines_so_far} lignes lues dans le log ..."
msgid "I'm bored ..."
msgstr "Je m'ennuie ..."
msgstr "Je m'ennuie..."
msgid "Let's go for a walk!"
msgstr "Allons faire un tour!"
msgstr "Allons faire un tour !"
msgid "This is the best day of my life!"
msgstr "C'est le meilleur jour de ma vie!"
msgstr "C'est le meilleur jour de ma vie !"
msgid "Shitty day :/"
msgstr "Journée de merde :/"
msgid "I'm extremely bored ..."
msgstr "Je m'ennuie énormément ..."
msgstr "Je m'ennuie énormément..."
msgid "I'm very sad ..."
msgstr "Je suis très triste ..."
msgstr "Je suis très triste..."
msgid "I'm sad"
msgstr "Je suis triste"
#, fuzzy
msgid "Leave me alone ..."
msgstr "Lache moi..."
msgid "I'm mad at you!"
msgstr "Je t'en veux !"
msgid "I'm living the life!"
msgstr "Je vis la vie!"
msgstr "Je vis la belle vie !"
msgid "I pwn therefore I am."
msgstr "Je pwn donc je suis."
msgid "So many networks!!!"
msgstr "Tellement de réseaux!!!"
msgstr "Tellement de réseaux !!!"
msgid "I'm having so much fun!"
msgstr "Je m'amuse tellement!"
msgstr "Je m'amuse tellement !"
msgid "My crime is that of curiosity ..."
msgstr "Mon crime, c'est la curiosité ..."
msgstr "Mon crime, c'est la curiosité..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Bonjour {name}! Ravi de te rencontrer. {name}"
msgid "Hello {name}! Nice to meet you."
msgstr "Bonjour {name} ! Ravi de te rencontrer."
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "L'unité {name} est proche! {name}"
msgid "Yo {name}! Sup?"
msgstr "Yo {name} ! Quoi de neuf ?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hey {name} comment vas-tu ?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "L'unité {name} est proche !"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Hum ... au revoir {name}"
msgstr "Hum... au revoir {name}"
#, python-brace-format
msgid "{name} is gone ..."
@@ -94,46 +118,58 @@ msgstr "{name} est parti ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Oups ... {name} est parti."
msgstr "Oups... {name} est parti."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} raté!"
msgstr "{name} raté !"
msgid "Missed!"
msgstr "Raté!"
msgstr "Raté !"
msgid "Good friends are a blessing!"
msgstr "Les bons amis sont une bénédiction !"
msgid "I love my friends!"
msgstr "J'aime mes amis !"
msgid "Nobody wants to play with me ..."
msgstr "Personne ne veut jouer avec moi ..."
msgstr "Personne ne veut jouer avec moi..."
msgid "I feel so alone ..."
msgstr "Je me sens si seul ..."
msgstr "Je me sens si seul..."
msgid "Where's everybody?!"
msgstr "Où est tout le monde?!"
msgstr "Où est tout le monde ?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Fais la sieste pendant {secs}s ..."
msgstr "Je fais la sieste pendant {secs}s..."
msgid "Zzzzz"
msgstr ""
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Bonne nuit."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Attends pendant {secs}s ..."
msgstr "J'attends pendant {secs}s..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Regarde autour ({secs}s)"
msgstr "J'observe ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what}, soyons amis!"
msgstr "Hey {what}, soyons amis !"
#, python-brace-format
msgid "Associating to {what}"
@@ -141,11 +177,11 @@ msgstr "Association à {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr ""
msgstr "Yo {what} !"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Je viens de décider que {mac} n'a pas besoin de WiFi!"
msgstr "Je viens de décider que {mac} n'a pas besoin de WiFi !"
#, python-brace-format
msgid "Deauthenticating {mac}"
@@ -153,14 +189,18 @@ msgstr "Désauthentification de {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Je kick et je bannis {mac}!"
msgstr "Je kick et je bannis {mac} !"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Cool, on a {num} nouveaux handshake{plural}!"
msgstr "Cool, on a {num} nouve(l/aux) handshake{plural} !"
msgid "Ops, something went wrong ... Rebooting ..."
msgstr "Oups, quelque chose s'est mal passé ... Redémarrage ..."
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Tu as {num} nouveau(x) message{plural} !"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oups, quelque chose s'est mal passé... Redémarrage..."
#, python-brace-format
msgid "Kicked {num} stations\n"
@@ -168,18 +208,18 @@ msgstr "{num} stations kick\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Fait {num} nouveaux amis\n"
msgstr "A fait {num} nouve(l/aux) ami(s)\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Récupéré {num} handshakes\n"
msgstr "A {num} handshakes\n"
msgid "Met 1 peer"
msgstr "1 peer rencontré"
msgstr "1 camarade rencontré"
#, python-brace-format
msgid "Met {num} peers"
msgstr "{num} peers recontrés"
msgstr "{num} camarades recontrés"
#, python-brace-format
msgid ""
@@ -187,24 +227,24 @@ msgid ""
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr ""
"J'ai pwn durant {duration} et kick {deauthed} clients! J'ai aussi rencontré "
"{associated} nouveaux amis et dévoré {handshakes} handshakes! #pwnagotchi "
"J'ai pwn durant {duration} et kick {deauthed} clients ! J'ai aussi rencontré "
"{associated} nouveaux amis et dévoré {handshakes} handshakes ! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr ""
msgstr "heures"
msgid "minutes"
msgstr ""
msgstr "minutes"
msgid "seconds"
msgstr ""
msgstr "secondes"
msgid "hour"
msgstr ""
msgstr "heure"
msgid "minute"
msgstr ""
msgstr "minute"
msgid "second"
msgstr ""
msgstr "seconde"

Binary file not shown.

View File

@@ -0,0 +1,215 @@
# 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 <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-09 17:42+0200\n"
"PO-Revision-Date: 2019-10-15 23:46+0100\n"
"Language: ga\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Last-Translator: \n"
"Language-Team: \n"
"X-Generator: Poedit 2.2.4\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Dia Duit, Pwnagotchi is ainm dom! Ag tosú ..."
msgid "New day, new hunt, new pwns!"
msgstr "Lá nua, seilg nua, pwns nua!"
msgid "Hack the Planet!"
msgstr "Haic An Phláinéid!"
msgid "AI ready."
msgstr "AI réidh."
msgid "The neural network is ready."
msgstr "Tá an líonra néarach réidh."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hé, tá cainéal {channel} ar fail! Déarfaidh do PR go raibh maith agat."
msgid "I'm bored ..."
msgstr "Tá leadrán orm ..."
msgid "Let's go for a walk!"
msgstr "Siúil liom, le do thoil!"
msgid "This is the best day of my life!"
msgstr "Tá sé an lá is fearr i mo shaol!"
msgid "Shitty day :/"
msgstr "Tá lá damanta agam :/"
msgid "I'm extremely bored ..."
msgstr "Tá mé ag dul as mo mheabhair le leadrán ..."
msgid "I'm very sad ..."
msgstr "Ta brón an domhain orm ..."
msgid "I'm sad"
msgstr "Tá brón orm"
msgid "I'm living the life!"
msgstr "Tá an saol ar a thoil agam!"
msgid "I pwn therefore I am."
msgstr "Déanaim pwnáil, dá bhrí sin táim ann."
msgid "So many networks!!!"
msgstr "Gréasáin - Tá an iliomad acu ann!!!"
msgid "I'm having so much fun!"
msgstr "Tá craic iontach agam!"
msgid "My crime is that of curiosity ..."
msgstr "Ní haon pheaca é bheith fiosrach ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Dia Duit {name}! Is deas bualadh leat. {name}"
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "Aonad {name} in aice láimhe! {name}"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm... slán leat {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "Tá {name} imithe ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Hoips … Tá {name} imithe."
#, python-brace-format
msgid "{name} missed!"
msgstr "Chaill mé ar {name}!"
msgid "Missed!"
msgstr "Chaill mé é sin !"
msgid "Nobody wants to play with me ..."
msgstr "Níl aon duine ag iarraidh imirt liom ..."
msgid "I feel so alone ..."
msgstr "Tá uaigneas an domhain orm ..."
msgid "Where's everybody?!"
msgstr "Cá bhfuil gach duine?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Néal a chodladh ar {secs}s ..."
msgid "Zzzzz"
msgstr ""
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr "Oíche mhaith."
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Fan ar {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Ag amharc uaim ar ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hé {what} déanaimis síocháin!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Ag coinneáil le {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Hé {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Tá cinneadh déanta agam. Níl {mac} sin de dhíth air WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Bain fíordheimhniúde {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Chiceáil mé agus cosc mé ar {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Go hiontach, fuaireamar {num} handshake{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Hoips...Tháinig ainghléas éigin..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "{num} stáisiún kick\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Rinne mé {num} cairde nua\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Fuair me {num} cumarsáid thionscantach\n"
msgid "Met 1 peer"
msgstr "Bhuail mé piara amháin"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Bhuail me {num} piara"
#, 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 ""
"Bhí me ag pwnáil ar {duration} agus chiceáil me ar {deauthed} cliaint! Chomh "
"maith, bhuail me {associated} cairde nua and d'ith mé {handshakes}! "
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "uair on chloig"
msgid "minutes"
msgstr "nóiméad"
msgid "seconds"
msgstr "soicind"
msgid "hour"
msgstr "uair an chloig"
msgid "minute"
msgstr "nóiméad"
msgid "second"
msgstr "soicind"

Binary file not shown.

View File

@@ -0,0 +1,249 @@
# Hungarian translation.
# Copyright (C) 2020
# This file is distributed under the same license as the PACKAGE package.
# Skeleton022 <skeleton022.pwnagotchi@gmail.com>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.4.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-07 20:00+0100\n"
"PO-Revision-Date: 2020-03-23 0:10+0100\n"
"Last-Translator: Skeleton022\n"
"Language-Team: Skeleton022\n"
"Language: hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hali, Pwnagotchi vagyok! Indítás ..."
msgid "New day, new hunt, new pwns!"
msgstr "Új nap, új vadászat, új hálózatok!"
msgid "Hack the Planet!"
msgstr "Törd meg a bolygót!"
msgid "AI ready."
msgstr "MI kész."
msgid "The neural network is ready."
msgstr "A neurális hálózat készen áll."
msgid "Generating keys, do not turn off ..."
msgstr "Kulcspár generálása, ne kapcsold ki az eszközt ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "A {channel}. számú csatorna üres! Az AP-d meg fogja köszönni."
msgid "Reading last session logs ..."
msgstr ""
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Az utolsó munkamenet logjainak olvasása ..."
msgid "I'm bored ..."
msgstr "Unatkozom ..."
msgid "Let's go for a walk!"
msgstr "Menjünk sétálni!"
msgid "This is the best day of my life!"
msgstr "Ez a legjobb nap az életemben!"
msgid "Shitty day :/"
msgstr "Szar egy nap :/"
msgid "I'm extremely bored ..."
msgstr "Nagyon unatkozom ..."
msgid "I'm very sad ..."
msgstr "Nagyon szomorú vagyok ..."
msgid "I'm sad"
msgstr "Szomorú vagyok"
msgid "Leave me alone ..."
msgstr "Hagyj békén ..."
msgid "I'm mad at you!"
msgstr "Mérges vagyok rád!"
msgid "I'm living the life!"
msgstr "Élvezem az életet!"
msgid "I pwn therefore I am."
msgstr "Hackelek, tehát vagyok."
msgid "So many networks!!!"
msgstr "Rengeteg hálózat!!!"
msgid "I'm having so much fun!"
msgstr "Nagyon jól érzem magam!"
msgid "My crime is that of curiosity ..."
msgstr "Kíváncsiság a bűnöm ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hali {name}! Örülök, hogy találkoztunk."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Hé {name}! Mizu?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hé {name} hogy vagy?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "A {name} nevű egység a közelben van!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Ömm ... ég veled {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} eltűnt ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoops ... {name} eltűnt."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} elhibázva!"
msgid "Missed!"
msgstr "Elvesztettem!"
msgid "Good friends are a blessing!"
msgstr "A jó barátok áldás az életben!"
msgid "I love my friends!"
msgstr "Szeretem a barátaimat!"
msgid "Nobody wants to play with me ..."
msgstr "Senki sem akar játszani velem ..."
msgid "I feel so alone ..."
msgstr "Egyedül vagyok ..."
msgid "Where's everybody?!"
msgstr "Hol vagytok?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "{secs} másodpercig szundikálok ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}msp)"
msgid "Good night."
msgstr "Jó éjszakát."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Várok {secs} másodpercig ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Körbenézek {secs} másodpercig"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what} legyünk barátok!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Társítás {what} -hoz/-hez"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Hé {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Úgydöntöttem, hogy {mac}-nek nem kell WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Kirúgom {mac}-et"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "{mac} kirúgva és kitiltva!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Király, kaptunk {num} új üzenetet!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "{count} új üzeneted van!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ops, valami rosszul sikerült ... Újraindítás ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Kirúgva {num} állomás\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "{num} új barátot\ntaláltam\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "{num} kézfogást szereztem\n"
msgid "Met 1 peer"
msgstr "1 Társsal találkoztam"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Találkoztam {num} társsal"
#, 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 ""
"Már {duration} ideje dolgozom, kirúgtam {deauthed} klienst! Találkoztam még"
"{associated} új baráttal és elfogtam {handshakes} kézfogást! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "óra"
msgid "minutes"
msgstr "perc"
msgid "seconds"
msgstr "másodperc"
msgid "hour"
msgstr "óra"
msgid "minute"
msgstr "perc"
msgid "second"
msgstr "másodperc"

View File

@@ -156,7 +156,7 @@ msgstr "Sto prendendo a calci {mac}!"
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Bene, abbiamo {num} handshake{plural} in più!"
msgid "Ops, something went wrong ... Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ops, qualcosa è andato storto ... Riavvio ..."
#, python-brace-format

Binary file not shown.

View File

@@ -0,0 +1,251 @@
# 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 24534649+wytshadow@users.noreply.github.com, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-25 21:57+0900\n"
"PO-Revision-Date: 2019-10-16 15:05+0200\n"
"Last-Translator: wytshadow <24534649+wytshadow@users.noreply.github.com>\n"
"Language-Team: pwnagotchi <24534649+wytshadow@users.noreply.github.com>\n"
"Language: jp\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "すやすや〜"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "僕、 ポーナゴッチです!"
msgid "New day, new hunt, new pwns!"
msgstr "ポーンしようよ。"
msgid "Hack the Planet!"
msgstr "ハックザプラネット!"
msgid "AI ready."
msgstr "AIの準備ができました。"
msgid "The neural network is ready."
msgstr "ニューラルネットワークの\n準備ができました。"
msgid "Generating keys, do not turn off ..."
msgstr "鍵生成をしてます。\n電源を落とさないでね。"
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "チャンネル\n {channel} \nはfreeだよ。ありがとうね。"
msgid "Reading last session logs ..."
msgstr "session log を読んでます。"
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "{lines_so_far} 行目長いよぉ。"
msgid "I'm bored ..."
msgstr "退屈だぁ。。。"
msgid "Let's go for a walk!"
msgstr "散歩に行こうよ!"
msgid "This is the best day of my life!"
msgstr "人生最高の日だよ!"
msgid "Shitty day :/"
msgstr "がっかりな日だよ。orz"
msgid "I'm extremely bored ..."
msgstr "退屈だね。"
msgid "I'm very sad ..."
msgstr "あ~悲しいよぉ。"
msgid "I'm sad"
msgstr "悲しいね。"
msgid "Leave me alone ..."
msgstr "ひとりぼっちだよ。"
msgid "I'm mad at you!"
msgstr "怒っちゃうよ。"
msgid "I'm living the life!"
msgstr "わくわくするね。"
msgid "I pwn therefore I am."
msgstr "ポーンしてこそのオレ。"
msgid "So many networks!!!"
msgstr "たくさん\nWiFiが飛んでるよ"
msgid "I'm having so much fun!"
msgstr "楽しいよぉ!"
msgid "My crime is that of curiosity ..."
msgstr "APに興味津々..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "こんにちは{name}\n初めまして。{name}"
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "ねぇねぇ、\n{name} どうしたの?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "{name} こんにちは"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "{name} が近くにいるよ。"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "じゃあね、さようなら {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name}\nがいなくなったよ。"
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "あらら、\n{name}\nがいなくなったね。"
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} が逃げた!"
msgid "Missed!"
msgstr "残念、逃した!"
msgid "Good friends are a blessing!"
msgstr "良い仲間にめぐりあえたよ。"
msgid "I love my friends!"
msgstr "友達は大好きだよ。"
msgid "Nobody wants to play with me ..."
msgstr "誰も僕と一緒に\nあそんでくれない。"
msgid "I feel so alone ..."
msgstr "ひとりぼっちだよ。"
msgid "Where's everybody?!"
msgstr "みんなどこにいるの?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "{secs}秒 寝ます。"
msgid "Zzzzz"
msgstr "ぐぅ〜"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "すやすや〜 ({secs}秒)"
msgid "Good night."
msgstr "おやすみなさい。"
msgid "Zzz"
msgstr "ぐぅ~"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "{secs}秒 待ちです。"
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "{secs}秒 探してます。"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "ねぇねぇ\n{what} \n友だちになろうよ。"
#, python-brace-format
msgid "Associating to {what}"
msgstr "{what} \nとつながるかな"
#, python-brace-format
msgid "Yo {what}!"
msgstr "ねぇねぇ\n{what}"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "{mac}\nはWiFiじゃないのね。"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "{mac}\nの認証取得中..."
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "{mac}\nに拒否られた。"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "おぉ、\n{num}回\nハンドシェイクがあったよ"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "おぉ、\n{count}個メッセージがあるよ!"
msgid "Ops, something went wrong ... Rebooting ..."
msgstr "何か間違った。\nリブートしている。"
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "{num}回拒否された。\n"
msgid "Made >999 new friends\n"
msgstr "1000人以上友達ができた。\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "{num}人友達ができた。\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "{num}回ハンドシェイクした。\n"
msgid "Met 1 peer"
msgstr "1人 仲間に会いました。"
#, python-brace-format
msgid "Met {num} peers"
msgstr "{num}人 仲間に会いました。"
#, python-brace-format
msgid ""
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr ""
"{duration}中{deauthed}のAPに拒否されたけど、{associated}回チャンスがあって"
"{handshakes}回ハンドシェイクがあったよ。。 #pwnagotchi #pwnlog #pwnlife "
"#hacktheplanet #skynet"
msgid "hours"
msgstr "時間"
msgid "minutes"
msgstr "分"
msgid "seconds"
msgstr "秒"
msgid "hour"
msgstr "時"
msgid "minute"
msgstr "分"
msgid "second"
msgstr "秒"

View File

@@ -158,7 +158,7 @@ msgstr "Кикбан {mac}!"
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Кул, фативме {num} нови ракувања!"
msgid "Ops, something went wrong ... Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Упс, нешто не еко што треба ... Рестартирам ..."
#, python-brace-format

View File

@@ -20,7 +20,7 @@ msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hoi, Ik ben Pwnagotchi! Opstarten ..."
msgstr "Hoi, Ik ben Pwnagotchi! Aan het opstarten ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nieuwe dag, nieuwe jacht, nieuwe pwns!"
@@ -32,7 +32,7 @@ msgid "AI ready."
msgstr "AI is klaar."
msgid "The neural network is ready."
msgstr "Neuronen netwerkis klaar voor gebruik."
msgstr "Neuronen netwerk is klaar."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
@@ -42,37 +42,37 @@ msgid "I'm bored ..."
msgstr "Ik verveel me ..."
msgid "Let's go for a walk!"
msgstr "Laten we een rondje lopen!"
msgstr "Laten we gaan wandelen!"
msgid "This is the best day of my life!"
msgstr "Dit is de beste dag van mijn leven!"
msgid "Shitty day :/"
msgstr "Ruk dag :/"
msgstr "Wat een rotdag :/"
msgid "I'm extremely bored ..."
msgstr "Ik verveel me kapot ..."
msgid "I'm very sad ..."
msgstr "Ik ben ergverdrietig ..."
msgstr "Ik ben erg verdrietig ..."
msgid "I'm sad"
msgstr "Ik ben verdrietig"
msgid "I'm living the life!"
msgstr "Beter kan het levenniet worden!"
msgstr "Beter kan het leven niet worden!"
msgid "I pwn therefore I am."
msgstr "Ik pwn daarom besta ik."
msgstr "Ik pwn daarom ben ik er."
msgid "So many networks!!!"
msgstr "Zo veel netwerken!!!"
msgid "I'm having so much fun!"
msgstr "Dit is zo leuk!"
msgstr "Ik heb zoveel plezier!"
msgid "My crime is that of curiosity ..."
msgstr "Mijn enige misdrijf is mijn nieuwsgierigheid ..."
msgstr "Mijn misdrijf is mijn nieuwsgierigheid ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
@@ -88,11 +88,11 @@ msgstr "Uhm ...tot ziens {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} is weg"
msgstr "{name} is weg ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoopsie ...{name} is weg"
msgstr "Whoopsie ...{name} is weg."
#, python-brace-format
msgid "{name} missed!"
@@ -102,10 +102,10 @@ msgid "Missed!"
msgstr "Gemist!"
msgid "Nobody wants to play with me ..."
msgstr "Niemand wil metmij spelen ..."
msgstr "Niemand wil met mij spelen ..."
msgid "I feel so alone ..."
msgstr "Zo alleen ..."
msgstr "Ik voel me zo alleen ..."
msgid "Where's everybody?!"
msgstr "Waar is iedereen?!"
@@ -119,11 +119,11 @@ msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgstr "ZzzZzzz ({secs}s)"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Even {secs}s wachten ..."
msgstr "Ik wacht voor {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
@@ -131,7 +131,7 @@ msgstr "Rond kijken ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what}, laten we vriendenworden!"
msgstr "Hey {what}, laten we vrienden worden!"
#, python-brace-format
msgid "Associating to {what}"
@@ -139,26 +139,26 @@ msgstr "Verbinden met {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr ""
msgstr "Yo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Ik vind dat {mac} genoeg WiFiheeft gehad!"
msgstr "Ik besloot dat {mac} geen WiFi meer nodig heeft!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "De-autoriseren {mac}"
msgstr "Deauthenticatie van {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Ik ga {mac} even kicken!"
msgstr "Kickbanning {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Gaaf, we hebben {num} nieuwe handshake{plural}!"
msgstr "Cool, we hebben {num} nieuwe handshake{plural}!"
msgid "Ops, something went wrong ... Rebooting ..."
msgstr "Oops, iets ging fout ...Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oops, er ging iets fout ...Rebooting ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
@@ -166,11 +166,11 @@ msgstr "{num} stations gekicked\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "{num} nieuwe vrienden\n"
msgstr "{num} nieuwe vrienden gemaakt.\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "{num} nieuwe handshakes\n"
msgstr "Ik heb {num} nieuwe handshakes\n"
msgid "Met 1 peer"
msgstr "1 peer ontmoet"
@@ -190,19 +190,19 @@ msgstr ""
"gegeten! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr ""
msgstr "uren"
msgid "minutes"
msgstr ""
msgstr "minuten"
msgid "seconds"
msgstr ""
msgstr "seconden"
msgid "hour"
msgstr ""
msgstr "uur"
msgid "minute"
msgstr ""
msgstr "minuut"
msgid "second"
msgstr ""
msgstr "seconde"

Binary file not shown.

View File

@@ -0,0 +1,248 @@
# pwnagotchi norwegian voice data
# Copyright (C) 2019
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR untech <edvbot@gmail.com>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-04 12:57+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Edvard Botten <edvbot@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: norwegian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hei, jeg er Pwnagotchi! Starter ..."
msgid "New day, new hunt, new pwns!"
msgstr "En ny dag, ny jakt, og nye pwns!"
msgid "Hack the Planet!"
msgstr "Hack planeten!"
msgid "AI ready."
msgstr "AI klart."
msgid "The neural network is ready."
msgstr "Det nevrale nettverket er klart."
msgid "Generating keys, do not turn off ..."
msgstr "Generer nøkkler, ikke skru meg av ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hei, kanalen {channel} er åpen! AP-en din takker."
msgid "Reading last session logs ..."
msgstr "Leser forrige sesjonen's logs ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Har lest {lines_so_far} linjer hittil ..."
msgid "I'm bored ..."
msgstr "Kjeder meg ..."
msgid "Let's go for a walk!"
msgstr "La oss stikke på tur!"
msgid "This is the best day of my life!"
msgstr "Dette er den beste dagen i mitt liv!"
msgid "Shitty day :/"
msgstr "Jævlig dag :/"
msgid "I'm extremely bored ..."
msgstr "Kjeder livet av meg ..."
msgid "I'm very sad ..."
msgstr "Jeg er veldig trist ..."
msgid "I'm sad"
msgstr "Jeg er trist ..."
msgid "Leave me alone ..."
msgstr "La meg være alene ..."
msgid "I'm mad at you!"
msgstr "Jeg er sint på deg!"
msgid "I'm living the life!"
msgstr "Lever livet, lett!"
msgid "I pwn therefore I am."
msgstr "Jeg pwner derfor er jeg."
msgid "So many networks!!!"
msgstr "Så mange nettverk!!!"
msgid "I'm having so much fun!"
msgstr "Jeg har det så gøy!"
msgid "My crime is that of curiosity ..."
msgstr "Nysgjerrighet er min eneste forbrytelse ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hallo {name}! Hyggelig å treffe deg!"
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Yo {name}! Skjer'a?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Heisann {name} driver du med da?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "{name} er i nærheten!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... Ha det {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} er borte ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Oi da ... {name} forsvant."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} bommet!"
msgid "Missed!"
msgstr "Bommet!"
msgid "Good friends are a blessing!"
msgstr "Gode venner er livet verdt!"
msgid "I love my friends!"
msgstr "Jeg digger vennene mine!"
msgid "Nobody wants to play with me ..."
msgstr "Ingen vil leke med meg ..."
msgid "I feel so alone ..."
msgstr "Jeg er så ensom ..."
msgid "Where's everybody?!"
msgstr "Hvor er alle sammen?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Sover i {secs}s ..."
msgid "Zzzzz"
msgstr ""
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr "God natt."
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Venter i {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Ser meg rundt ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hei {what} la oss være venner!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Tilkobler til {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr ""
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Bestemte meg att {mac} ikke lenger trenger WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Kobler av {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickbanner {mac}"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Fett, vi fikk {num} nye håndtrykk!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Du har {count} melding{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oi, noe gikk helt skakk ... Rebooter ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Kicket {num} stasjoner\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Møtte {num} nye venner\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Skaffet {num} håndtrykk\n"
msgid "Met 1 peer"
msgstr "Møtte 1 annen"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Møtte {num} andre"
#, 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 "Jeg har pwnet for {duration} og kicket {dauthed} klienter! Jeg har også "
"møtt {associated} nye venner og spiste {handshakes} håndtrykk! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "timer"
msgid "minutes"
msgstr "minutter"
msgid "seconds"
msgstr "sekunder"
msgid "hour"
msgstr "time"
msgid "minute"
msgstr "minutt"
msgid "second"
msgstr "sekund"

Binary file not shown.

View File

@@ -0,0 +1,248 @@
# Polish voice data for pwnagotchi.
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# szymex73 <szymex73@gmail.com>, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-04 06:37+0100\n"
"PO-Revision-Date: 2019-10-21 10:55+0200\n"
"Last-Translator: gkrs <457603+gkrs@users.noreply.github.com>\n"
"Language-Team: PL <457603+gkrs@users.noreply.github.com>\n"
"Language: polish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hej, jestem Pwnagotchi! Uruchamianie ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nowy dzień, nowe łowy, nowe pwny!"
msgid "Hack the Planet!"
msgstr "Hakujmy planetę!"
msgid "AI ready."
msgstr "SI gotowa."
msgid "The neural network is ready."
msgstr "Sieć neuronowa jest gotowa."
msgid "Generating keys, do not turn off ..."
msgstr "Generuję klucze, nie wyłączaj ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hej, kanał {channel} jest wolny! Twój AP będzie Ci wdzięczny."
msgid "Reading last session logs ..."
msgstr "Czytam logi z ostatniej sesji ..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Na razie przeczytałem {lines_so_far} linii logów ..."
msgid "I'm bored ..."
msgstr "Nudzi mi się ..."
msgid "Let's go for a walk!"
msgstr "Chodźmy na spacer!"
msgid "This is the best day of my life!"
msgstr "To najlepszy dzień mojego życia!"
msgid "Shitty day :/"
msgstr "Gówniany dzień :/"
msgid "I'm extremely bored ..."
msgstr "Straaaasznie się nudzę ..."
msgid "I'm very sad ..."
msgstr "Jest mi bardzo smutno ..."
msgid "I'm sad"
msgstr "Jest mi smutno"
msgid "Leave me alone ..."
msgstr "Zostaw mnie w spokoju ..."
msgid "I'm mad at you!"
msgstr "Wkurzam się na ciebie"
msgid "I'm living the life!"
msgstr "Cieszę się życiem!"
msgid "I pwn therefore I am."
msgstr "Pwnuję więc jestem."
msgid "So many networks!!!"
msgstr "Jak dużo sieci!!!"
msgid "I'm having so much fun!"
msgstr "Ale jest super!"
msgid "My crime is that of curiosity ..."
msgstr "Moją zbrodnią jest ciekawość ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Cześć {name}! Miło Cię poznać."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Siema {name}! Co słychać?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hej {name} jak się masz?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Urządzenie {name} jest w pobliżu!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Umm ... żegnaj {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} zniknął ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Ups ... {name} zniknął."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} pudło!"
msgid "Missed!"
msgstr "Pudło!"
msgid "Good friends are a blessing!"
msgstr "Dobrzy przyjaciele to błogosławieństwo!"
msgid "I love my friends!"
msgstr "Kocham moich przyjaciół!"
msgid "Nobody wants to play with me ..."
msgstr "Nikt nie chce się ze mną bawić ..."
msgid "I feel so alone ..."
msgstr "Czuję się taki samotny ..."
msgid "Where's everybody?!"
msgstr "Gdzie są wszyscy?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Zdrzemnę się przez {secs}s ..."
msgid "Zzzzz"
msgstr ""
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr "Dobranoc."
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Czekam {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Rozglądam się ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hej {what} zostańmy przyjaciółmi!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Dołączam do {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Siema {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Według mnie {mac} nie potrzebuje WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Rozłączam {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Banuję {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Super, zdobyliśmy {num} nowych handshake'ów!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Masz {count} nowych wiadomości!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ups, coś poszło nie tak ... Restaruję ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Wyrzuciłem {num} stacji\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Zdobyłem {num} nowych przyjaciół\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Zdobyłem {num} handshake'ów\n"
msgid "Met 1 peer"
msgstr "Spotkałem 1 kolegę"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Spotkałem {num} kolegów"
#, 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 ""
"Pwnowałem {duration} i wyrzuciłem {deauthed} klientów! Spotkałem także "
"{associated} nowych przyjaciół i zjadłem {handshakes} handshake'ow! "
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "godzin"
msgid "minutes"
msgstr "minut"
msgid "seconds"
msgstr "sekund"
msgid "hour"
msgstr "godzina"
msgid "minute"
msgstr "minuta"
msgid "second"
msgstr "sekunda"

Binary file not shown.

View File

@@ -0,0 +1,209 @@
# pwnagotchi Brazilian Portuguese translation file.
# Copyright (C) 2019 Cassiano Aquino
# This file is distributed under the same license as the pwnagotchi package.
# Cassiano Aquino <cassianoaquino@me.com>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-05 14:10+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Cassiano Aquino <cassianoaquino@me.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: Brazilian Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Oi! Eu sou o Pwnagotchi! Iniciando ..."
msgid "New day, new hunt, new pwns!"
msgstr "Novo dia, Nova caça, Novos pwns!"
msgid "Hack the Planet!"
msgstr "Hackeie o Planeta!"
msgid "AI ready."
msgstr "AI pronta."
msgid "The neural network is ready."
msgstr "A rede neural está pronta."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Ei, o canal {channel} está livre! Seu AP ira agradecer."
msgid "I'm bored ..."
msgstr "Estou entediado ..."
msgid "Let's go for a walk!"
msgstr "Vamos dar uma caminhada!"
msgid "This is the best day of my life!"
msgstr "Este e o melhor dia da minha vida!"
msgid "Shitty day :/"
msgstr "Dia de merda :/"
msgid "I'm extremely bored ..."
msgstr "Estou extremamente entediado ..."
msgid "I'm very sad ..."
msgstr "Estou muito triste ..."
msgid "I'm sad"
msgstr "Estou triste"
msgid "I'm living the life!"
msgstr "Estou aproveitando a vida!"
msgid "I pwn therefore I am."
msgstr "pwn, logo existo."
msgid "So many networks!!!"
msgstr "Quantas redes!!!"
msgid "I'm having so much fun!"
msgstr "Estou me divertindo muito!"
msgid "My crime is that of curiosity ..."
msgstr "Meu crime é ser curioso ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Olá {name}! Prazer em conhecê-lo. {name}"
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "Unidade {name} está próxima! {name}"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... até logo {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} desapareceu ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Oops ... {name} desapareceu."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} perdido!"
msgid "Missed!"
msgstr "Perdido!"
msgid "Nobody wants to play with me ..."
msgstr "Ninguém quer brincar comigo ..."
msgid "I feel so alone ..."
msgstr "Estou tão sozinho ..."
msgid "Where's everybody?!"
msgstr "Aonde está todo mundo?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Cochilando por {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Aguardando por {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Olhando ao redor ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Ei {what} vamos ser amigos!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Associando com {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Oi {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Acabei de decidir que {mac} não precisa de WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "De-autenticando {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickbanning {mac}"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Legal, nos capturamos {num} handshake{plural} novo{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ops, algo falhou ... Reiniciando ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Kickei {num} estações\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Fiz {num} novos amigos\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Peguei {num} handshakes\n"
msgid "Met 1 peer"
msgstr "Conheci 1 peer"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Conheci {num} peers"
#, 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 ""
"Eu estou pwning fazem {duration} e kickei {deauthed} clientes! Eu também conheci "
"{associated} novos amigos e comi {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "horas"
msgid "minutes"
msgstr "minutos"
msgid "seconds"
msgstr "segundos"
msgid "hour"
msgstr "hora"
msgid "minute"
msgstr "minuto"
msgid "second"
msgstr "segundo"

Binary file not shown.

View File

@@ -0,0 +1,214 @@
# pwnagotchi Portuguese (european) translation file.
# Copyright (C) 2019 David Sopas
# This file is distributed under the same license as the PACKAGE package.
# David Sopas <email@aleatorio.xyz>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-09 17:42+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: David Sopas <email@aleatorio.xyz>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Olá, eu sou o Pwnagotchi! A iniciar ..."
msgid "New day, new hunt, new pwns!"
msgstr "Novo dia, nova caçada, novos pwns!"
msgid "Hack the Planet!"
msgstr "Hacka o Planeta!"
msgid "AI ready."
msgstr "IA pronta."
msgid "The neural network is ready."
msgstr "A rede neural está pronta."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, o canal {channel} está livre! O teu AP irá agradecer."
msgid "I'm bored ..."
msgstr "Estou aborrecido ..."
msgid "Let's go for a walk!"
msgstr "Vamos fazer uma caminhada!"
msgid "This is the best day of my life!"
msgstr "Este é o melhor dia da minha vida!"
msgid "Shitty day :/"
msgstr "Que merda de dia :/"
msgid "I'm extremely bored ..."
msgstr "Estou muito aborrecido ..."
msgid "I'm very sad ..."
msgstr "Estou muito triste ..."
msgid "I'm sad"
msgstr "Estou triste"
msgid "I'm living the life!"
msgstr "Estou aproveitar a vida!"
msgid "I pwn therefore I am."
msgstr "Eu pwn, logo existo."
msgid "So many networks!!!"
msgstr "Tantas redes!!!"
msgid "I'm having so much fun!"
msgstr "Estou a divertir-me tanto!"
msgid "My crime is that of curiosity ..."
msgstr "O meu crime é ser curioso ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Olá {name}! Prazer em conhecer-te. {name}"
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "A unidade {name} está perto! {name}"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... adeus {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} desapareceu ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Ups ... {name} desaparecey."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} perdido!"
msgid "Missed!"
msgstr "Perdido!"
msgid "Nobody wants to play with me ..."
msgstr "Ninguém quer brincar comigo ..."
msgid "I feel so alone ..."
msgstr "Sinto-me tão só ..."
msgid "Where's everybody?!"
msgstr "Onde estão todos?"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "A fazer uma sesta durante {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Boa noite."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "A aguardar durante {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "A dar uma olhada ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what} vamos ser amigos!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "A associar a {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Yo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Decidi que o {mac} não precisa de WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "A fazer deauth {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "A chutar {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Porreiro, temos {num} novo handshake{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ups, algo correu mal ... A reiniciar ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Chutei {num} estações\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Fiz {num} novos amigos\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Obti {num} handshakes\n"
msgid "Met 1 peer"
msgstr "Conheci 1 peer"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Conheci {num} peers"
#, 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 "Tenho estado a pwnar durante {duration} e chutei {deauthed} clientes! Também conheci "
"{associated} novos amigos e comi {handshakes} handshakes! #pwnagotchu "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "horas"
msgid "minutes"
msgstr "minutos"
msgid "seconds"
msgstr "segundos"
msgid "hour"
msgstr "hora"
msgid "minute"
msgstr "minuto"
msgid "second"
msgstr "segundo"

Binary file not shown.

View File

@@ -0,0 +1,249 @@
# Pwnagotchi translation.
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR <radu.ungureanu@techie.com>, 2019.
#
#,
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-04 12:57+0100\n"
"PO-Revision-Date: 2019-11-20 00:18+594\n"
"Last-Translator: Ungureanu Radu-Andrei <radu.ungureanu@techie.com>\n"
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github."
"com>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr ""
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Buna, sunt Pwnagotchi! Pornesc..."
msgid "New day, new hunt, new pwns!"
msgstr "O noua zi, o noua vanatoare, noi pwn-uri!"
msgid "Hack the Planet!"
msgstr "Pirateaza planeta!"
msgid "AI ready."
msgstr "AI-ul e gata."
msgid "The neural network is ready."
msgstr "Rețeaua neuronală este gata."
msgid "Generating keys, do not turn off ..."
msgstr "Se generează chei, nu închide..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, canalul {channel} este liber! AP-ul tău îti va mulțumi."
msgid "Reading last session logs ..."
msgstr "Se citesc log-urile din sesiunea anterioara..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Am citit {lines_so_far} linii din log pana acum..."
msgid "I'm bored ..."
msgstr "Sunt plictisit..."
msgid "Let's go for a walk!"
msgstr "Hai să ne plimbăm!"
msgid "This is the best day of my life!"
msgstr "Asta este cea mai buna zi din viața mea!"
msgid "Shitty day :/"
msgstr "O zi proasta :/"
msgid "I'm extremely bored ..."
msgstr "Sunt extrem de plictisit..."
msgid "I'm very sad ..."
msgstr "Sunt foarte trist..."
msgid "I'm sad"
msgstr "Sunt trist"
msgid "Leave me alone ..."
msgstr "Lasă-mă in pace..."
msgid "I'm mad at you!"
msgstr "Sunt supărat pe tine!"
msgid "I'm living the life!"
msgstr "Trăiesc viața!"
msgid "I pwn therefore I am."
msgstr "Eu pwn-ez, deci aici sunt."
msgid "So many networks!!!"
msgstr "Atât de multe rețele!"
msgid "I'm having so much fun!"
msgstr "Mă distrez așa de mult!"
msgid "My crime is that of curiosity ..."
msgstr "Crima mea este una de curiozitate..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Bună {name}! Mă bucur să te cunosc."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Yo {name}! Cmf?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hey {nume} ce mai faci?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Unitatea {name} este aproape!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm... Pa {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} a dispărut."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Oops... {name} a dispărut."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} ratat!"
msgid "Missed!"
msgstr "Ratat!"
msgid "Good friends are a blessing!"
msgstr "Prietenii buni sunt o binecuvântare!"
msgid "I love my friends!"
msgstr "Îmi iubesc prietenii!"
msgid "Nobody wants to play with me ..."
msgstr "Nimeni nu vrea sa se joace cu mine..."
msgid "I feel so alone ..."
msgstr "Mă simt așa de singuratic..."
msgid "Where's everybody?!"
msgstr "Unde-i toată lumea?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Dorm pentru {secs}s..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Noapte bună."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Aștept pentru {secs}s..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Mă uit împrejur ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what} hai să fim prieteni!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Mă asociez cu {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Yo {what}"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Am decis că lui {mac} nu-i trebuie WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Îl deautentific pe {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Îi dau kickban lui {mac}"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Șmecher, avem {num} de handshake-uri noi!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Ai {count} mesaj(e) nou/noi!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "OOps, ceva s-a întamplat... Îmi dau reboot...+"
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Am dat afară {num} de stații\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Am făcut {num} prieteni noi \n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Am primit {num} de handshake-uri\n"
msgid "Met 1 peer"
msgstr "Am întalnit un peer"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Am întalnit {num} de peer-uri"
#, 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 "Eu am făcut pwning pentru {duration} și am dat afara {deauthed} clienți! "
"De asemenea, am întalnit {associated} prieteni noi și am mancat {handshakes} de "
"handshake-uri! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "ore"
msgid "minutes"
msgstr "minute"
msgid "seconds"
msgstr "secunde"
msgid "hour"
msgstr "oră"
msgid "minute"
msgstr "minut"
msgid "second"
msgstr "secundă"

View File

@@ -1,46 +1,58 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Pwnagotchi Russian translation.
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# FIRST AUTHOR <25989971+adolfaka@users.noreply.github.com>, 2019.
#
# Second author <https://github.com/mbgroot>, 2019
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-03 16:47+0200\n"
"PO-Revision-Date: 2019-10-05 18:50+0300\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Project-Id-Version: Pwnagotchi Russian translation v 0.0.2\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.4\n"
"Last-Translator: Elliot Manson\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
"Language: ru_RU\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Language: ru\n"
"X-Generator: Poedit 2.2.4\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-SearchPath-0: voice.po\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgstr "Хрррр..."
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Привет, я Pwnagotchi! Поехали …"
msgstr "Привет, я Pwnagotchi! Стартуем!"
msgid "New day, new hunt, new pwns!"
msgstr "Новый день, новая охота, новые взломы!"
msgid "Hack the Planet!"
msgstr "Взломаем всю планету!"
msgstr "Взломай эту Планету!"
msgid "AI ready."
msgstr "Искусственный интеллект готов."
msgstr "A.I. готов."
msgid "The neural network is ready."
msgstr "Нейронная сеть готова."
msgid "Generating keys, do not turn off ..."
msgstr "Генерация ключей, не выключайте..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Эй, канал {channel} свободен! Ваша точка доступа скажет спасибо."
msgid "Reading last session logs ..."
msgstr "Чтение логов последнего сеанса..."
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "Чтение {lines_so_far} строк журнала..."
msgid "I'm bored ..."
msgstr "Мне скучно …"
@@ -48,7 +60,7 @@ msgid "Let's go for a walk!"
msgstr "Пойдем прогуляемся!"
msgid "This is the best day of my life!"
msgstr "Это лучший день в моей жизни!"
msgstr "Лучший день в моей жизни!"
msgid "Shitty day :/"
msgstr "Дерьмовый день :/"
@@ -62,28 +74,42 @@ msgstr "Мне очень грустно …"
msgid "I'm sad"
msgstr "Мне грустно"
msgid "Leave me alone ..."
msgstr "Оставь меня в покое..."
msgid "I'm mad at you!"
msgstr "Я зол на тебя!"
msgid "I'm living the life!"
msgstr "Я живу своей жизнью!"
msgstr "Живу полной жизнью!"
msgid "I pwn therefore I am."
msgstr "Я взламываю, поэтому я существую."
msgid "So many networks!!!"
msgstr "Так, много сетей!!!"
msgstr "Так много сетей!!!"
msgid "I'm having so much fun!"
msgstr "Мне так весело!"
msgid "My crime is that of curiosity ..."
msgstr "Моё преступление - это любопытство …"
msgstr "Моё преступление - это любопытство…"
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgstr "Привет, {name}! Приятно познакомиться. {name}"
msgstr "Привет, {name}! Рад встрече с тобой!"
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgstr "Цель {name} близко! {name}"
msgstr "Цель {name} близко!"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Хэй {name}! Как дела?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Цель {name} рядом!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
@@ -91,11 +117,11 @@ msgstr "Хм … до свидания {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} исчезла …"
msgstr "{name} ушла…"
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Упс … {name} исчезла."
msgstr "Упс… {name} исчезла."
#, python-brace-format
msgid "{name} missed!"
@@ -104,11 +130,17 @@ msgstr "{name} упустил!"
msgid "Missed!"
msgstr "Промахнулся!"
msgid "Good friends are a blessing!"
msgstr "Хорошие друзья - это благословение!"
msgid "I love my friends!"
msgstr "Я люблю своих друзей!"
msgid "Nobody wants to play with me ..."
msgstr "Никто не хочет играть со мной "
msgstr "Никто не хочет со мной играть ..."
msgid "I feel so alone ..."
msgstr "Мне так одиноко …"
msgstr "Я так одинок…"
msgid "Where's everybody?!"
msgstr "Где все?!"
@@ -118,11 +150,17 @@ msgid "Napping for {secs}s ..."
msgstr "Дремлет {secs}с …"
msgid "Zzzzz"
msgstr "Zzzzz"
msgstr "Хррр..."
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}c)"
msgstr "Хррррр.. ({secs}c)"
msgid "Good night."
msgstr "Доброй ночи."
msgid "Zzz"
msgstr "Хрррр"
#, python-brace-format
msgid "Waiting for {secs}s ..."
@@ -130,7 +168,7 @@ msgstr "Ждем {secs}c …"
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Оглядываюсь вокруг ({secs}с)"
msgstr "Осматриваюсь вокруг ({secs}с)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
@@ -160,7 +198,7 @@ msgstr "Кикаю {mac}!"
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Круто, мы получили {num} новое рукопожатие!"
msgid "Ops, something went wrong ... Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ой, что-то пошло не так … Перезагружаюсь …"
#, python-brace-format
@@ -173,7 +211,7 @@ msgstr "Заимел {num} новых друзей\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Получил {num} рукопожатие\n"
msgstr "Получил {num} рукопожатий\n"
msgid "Met 1 peer"
msgstr "Встретился один знакомый"

View File

@@ -158,7 +158,7 @@ msgstr ""
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Lysande, vi har {num} ny handskakningar{plural}!"
msgid "Ops, something went wrong ... Rebooting ..."
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Hoppsan, någpt gick fel ... Startar om ..."
#, python-brace-format

Binary file not shown.

View File

@@ -0,0 +1,227 @@
# Slovak language
# Copyright (C) 2019
# This file is distributed under the same license as the pwnagotchi package.
# mil1200 <mil.kyselica@gmail.com>, 2019.
#
#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-8 17:55+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Milan Kyselica <mil.kyselica@gmail.com>\n"
"Language-Team: SK\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Ahoj, ja som Pwnagotchi! Začíname ..."
msgid "New day, new hunt, new pwns!"
msgstr "Nový deň, nový lov, nové pwns!"
msgid "Hack the Planet!"
msgstr "Hacknime Planétu!"
msgid "AI ready."
msgstr "AI pripravené."
msgid "The neural network is ready."
msgstr "Neurónová sieť je pripravená."
msgid "Generating keys, do not turn off ..."
msgstr "Generujú sa kľúče, nevypínaj ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hej, kanál {channel} je voľný! Váš AP vám poďakuje."
msgid "I'm bored ..."
msgstr "Nudím sa ..."
msgid "Let's go for a walk!"
msgstr "Poďme na prechádzku!"
msgid "This is the best day of my life!"
msgstr "Toto je najlepší deň môjho života!"
msgid "Shitty day :/"
msgstr "Na hovno deň :/"
msgid "I'm extremely bored ..."
msgstr "Veľmi sa nudím ..."
msgid "I'm very sad ..."
msgstr "Som veľmi smutný ..."
msgid "I'm sad"
msgstr "Som smutný"
msgid "I'm living the life!"
msgstr "Žijem život!"
msgid "I pwn therefore I am."
msgstr "I pwn therefore I am."
msgid "So many networks!!!"
msgstr "Toľko sietí !!!"
msgid "I'm having so much fun!"
msgstr "Zabávam sa!"
msgid "My crime is that of curiosity ..."
msgstr "Môj zločin je zvedavosť ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Dobrý deň, {name}! Rád som ťa spoznal."
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Jednotka {name} je blízko!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... zbohom {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} je preč ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Hups ... {name} je preč."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} nechytené!"
msgid "Missed!"
msgstr "Vedľa!"
msgid "Good friends are a blessing!"
msgstr "Dobrí priatelia sú požehnaním!"
msgid "I love my friends!"
msgstr "Milujem svojich priateľov!"
msgid "Nobody wants to play with me ..."
msgstr "Nikto sa so mnou nechce hrať ..."
msgid "I feel so alone ..."
msgstr "Cítim sa tak sám ..."
msgid "Where's everybody?!"
msgstr "Kde sú všetci ?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Zdriemnem si na {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s)"
msgid "Good night."
msgstr "Dobrú noc."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Čaká sa {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Rozhliadam sa okolo ({secs} s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Ahoj {what} buďme priatelia!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Spájam sa s {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Yo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Rozhodol som sa že {mac} nepotrebuje Wi-Fi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Deautentifikujem {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Kickujem {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Super, máme {num} nový handshake{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Máte {count} novú správu{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ops, niečo sa pokazilo ... Reštartujem sa ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Kicknutá/ých {num} stanica/íc\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Získaní {num} noví kamaráti\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Získali sme {num} handshake/-y/ov rúk\n"
msgid "Met 1 peer"
msgstr "Sretli sme 1 rovesníka"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Stretli sme {num} rovesníkov"
#, 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 "Pwnoval som {duration} a kickol som {deauthed} klienta/ov! Tiež som"
"stretol {associated} nového/ých kamaráta/ov a zjedol {handshakes} handshake/y!"
" #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "hodiny"
msgid "minutes"
msgstr "minúty"
msgid "seconds"
msgstr "sekundy"
msgid "hour"
msgstr "hodina"
msgid "minute"
msgstr "minúta"
msgid "second"
msgstr "sekunda"

Binary file not shown.

View File

@@ -0,0 +1,248 @@
# Interfaz en español para pwnagotchi
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Angel Hernandez Segura, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-04 12:57+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Angel Hernandez Segura <ahsec.7@gmail.com>\n"
"Language-Team: Español <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Hola, Soy Pwnagotchi! Iniciando..."
msgid "New day, new hunt, new pwns!"
msgstr "Un nuevo dia, nuevos objetivos, nuevos pwns"
msgid "Hack the Planet!"
msgstr "Hack the Planet!"
msgid "AI ready."
msgstr "IA lista"
msgid "The neural network is ready."
msgstr "La red neuronal esta lista"
msgid "Generating keys, do not turn off ..."
msgstr "Generando llaves, no apagar"
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Hey, canal {channel} esta libre! Tu AP te lo agredecera"
msgid "Reading last session logs ..."
msgstr "Leyendo logs de la ultima sesion"
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr "He leido {lines_so_far} lineas de los logs hasta ahora "
msgid "I'm bored ..."
msgstr "Estoy aburrido"
msgid "Let's go for a walk!"
msgstr "Vamos a caminar!"
msgid "This is the best day of my life!"
msgstr "Este es el mejor dia de mi vida"
msgid "Shitty day :/"
msgstr "Dia de mierda :/"
msgid "I'm extremely bored ..."
msgstr "Estoy extremadamente aburrido ..."
msgid "I'm very sad ..."
msgstr "Estoy mut triste"
msgid "I'm sad"
msgstr "Estoy triste"
msgid "Leave me alone ..."
msgstr "Dejame solo ..."
msgid "I'm mad at you!"
msgstr "Estoy enojado contigo!"
msgid "I'm living the life!"
msgstr "Estoy disfrutando la vida!"
msgid "I pwn therefore I am."
msgstr "Yo pwn, por lo tanto existo"
msgid "So many networks!!!"
msgstr "Tantas redes!!!"
msgid "I'm having so much fun!"
msgstr "Me estoy divirtiendo mucho!"
msgid "My crime is that of curiosity ..."
msgstr "Mi crimen es la curiosidad ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hola {name}! Mucho gusto."
#, python-brace-format
msgid "Yo {name}! Sup?"
msgstr "Yo {name}! Que hay?"
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr "Hey {name} como te va?"
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Unit {name} esta cerca!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Uhm ... adios {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} se fue ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Whoops ... {name} se fue"
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} se ha perdido!"
msgid "Missed!"
msgstr "Perdido!"
msgid "Good friends are a blessing!"
msgstr "Los buenos amigos son una bendicion"
msgid "I love my friends!"
msgstr "Amo a mis amigos!"
msgid "Nobody wants to play with me ..."
msgstr "Nadie quiere jugar conmigo ..."
msgid "I feel so alone ..."
msgstr "Me siento muy solo ..."
msgid "Where's everybody?!"
msgstr "Donde estan todos?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Tomando una siesta por {secs}s ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}s) "
msgid "Good night."
msgstr "Buenas noches."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Esperando por {secs}s ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Mirando alrededor ({secs}s)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Hey {what} vamos a ser amigos!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Asociandose a {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Yo {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Acabo de decidir que {mac} no necesita WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "De-autenticando {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Vetando {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Bien, obtuvimos {num} nuevos handshake{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Tienes {count} nuevos mensajes{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Oops, algo salio mal ... Reiniciando ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Bloquee {num} staciones\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Hice {num} nuevos amigos\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Obtuve {num} handshakes\n"
msgid "Met 1 peer"
msgstr "Conoci a 1 unidad"
#, python-brace-format
msgid "Met {num} peers"
msgstr "conoci {num} unidades"
#, 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 "He estado hackeando por {duration} y de-autenticando {deauthed} "
"clientes! Tambien conoci {associated} nuevos amigos y comi {handshakes} "
"handshakes! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "horas"
msgid "minutes"
msgstr "minutos"
msgid "seconds"
msgstr "segundos"
msgid "hour"
msgstr "hora"
msgid "minute"
msgstr "minuto"
msgid "second"
msgstr "segundo"

Binary file not shown.

View File

@@ -0,0 +1,227 @@
# 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 <shark_shaking@hotmail.com>, 2020.
# 有很多翻譯不到味,如果有繁體愛好者,歡迎之後大家一起翻譯!
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-21 15:56+0200\n"
"PO-Revision-Date: 2020-10-22 10:00+0008\n"
"Last-Translator: ShaqKSmith <shark_shaking@hotmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: traditional chinese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "HI!我是Pwnagotchi!\n程式啟動..."
msgid "New day, new hunt, new pwns!"
msgstr "新的一天!\n新的狩獵!新的入侵!"
msgid "Hack the Planet!"
msgstr "我要駭入\n地球的所有人!"
msgid "AI ready."
msgstr "人工智慧已啟動."
msgid "The neural network is ready."
msgstr "神經網路已啟動."
msgid "Generating keys, do not turn off ..."
msgstr "產生金鑰中,\n請勿關閉..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "嘿,{channel}很順暢!\n你的WIFI會感謝你的."
msgid "I'm bored ..."
msgstr "我好無聊..."
msgid "Let's go for a walk!"
msgstr "我們出去走走吧!"
msgid "This is the best day of my life!"
msgstr "這是我生命中最美好的一天!"
msgid "Shitty day :/"
msgstr "糟糕的一天 :/"
msgid "I'm extremely bored ..."
msgstr "我超無聊的..."
msgid "I'm very sad ..."
msgstr "我好難過..."
msgid "I'm sad"
msgstr "傷心。"
msgid "I'm living the life!"
msgstr "真是充實的一生!"
msgid "I pwn therefore I am."
msgstr "我駭故我在."
msgid "So many networks!!!"
msgstr "好多網路啊!!!"
msgid "I'm having so much fun!"
msgstr "我玩的超級開心!"
msgid "My crime is that of curiosity ..."
msgstr "我的缺點就是\n太好奇了..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Hello{name}!\n很高興認識你."
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "{name}\n就在附近!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "啊 ... \n拜拜{name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name}\n不見了 ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "歐哦...\n{name}\n不見了."
#, python-brace-format
msgid "{name} missed!"
msgstr "我剛剛錯過了{name}!"
msgid "Missed!"
msgstr "又錯過了!"
msgid "Good friends are a blessing!"
msgstr "有個好朋友\n真幸福!"
msgid "I love my friends!"
msgstr "我喜歡\n我的朋友!"
msgid "Nobody wants to play with me ..."
msgstr "沒人想跟我玩..."
msgid "I feel so alone ..."
msgstr "我感覺好孤單..."
msgid "Where's everybody?!"
msgstr "大家都去哪裡了?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "我想瞇{secs}秒一下..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz({secs}秒)"
msgid "Good night."
msgstr "晚安."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "等我{secs}秒..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "環顧四周({secs}秒)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "嗨\n{what}\n讓我我們來當朋友吧!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "正在連接\n{what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "喲,\n{what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "我要讓\n{mac}\n斷線!\n他不需要上網!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "解除\n{mac}\n的授權中"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "把\n{mac}\n踢出中!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "酷哦,我們抓到{num}個\n新的握手包{plural}!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "你有{count}個新訊息{plural}!"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "喔歐,有些地方出錯了...\n重新啟動中..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "踢了 {num} 個設備\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "交了 {num} 個新朋友\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "捕獲了 {num} 個握手包\n"
msgid "Met 1 peer 同好"
msgstr "遇到了 個"
#, python-brace-format
msgid "Met {num} peers"
msgstr "遇到了 {num} 個同好"
#, python-brace-format
msgid ""
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr "我花了{duration}的時間\n駭入和踢了{deauthed}好多設備.\n"
"我還交了好多{associated}新朋友,\n而且抓到了{handshakes}握手包!"
"#pwnagotchi#入侵日志 #駭客人生 #入侵整個星球 #天網"
msgid "hours"
msgstr "時"
msgid "minutes"
msgstr "分"
msgid "seconds"
msgstr "秒"
msgid "hour"
msgstr "時"
msgid "minute"
msgstr "分"
msgid "second"
msgstr "秒"

Binary file not shown.

View File

@@ -0,0 +1,228 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# damoklov <mishanya@protonmail.com>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-23 20:56+0200\n"
"PO-Revision-Date: 2019-11-02 16:20+0200\n"
"Last-Translator: damoklov <mishanya@protonmail.com>\n"
"Language-Team: Ukrainian\n"
"Language: ua\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz"
msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "Привіт, я Pwnagotchi! Починаймо ..."
msgid "New day, new hunt, new pwns!"
msgstr "Новий день, нове полювання, нові проникнення!"
msgid "Hack the Planet!"
msgstr "Хакни цілу планету!"
msgid "AI ready."
msgstr "Штучний інтелект готовий."
msgid "The neural network is ready."
msgstr "Нейронна мережа готова."
msgid "Generating keys, do not turn off ..."
msgstr "Генерую ключі, не вимикай живлення ..."
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "Агов, канал {channel} вільний! Ваша точка доступу буде вдячна."
msgid "I'm bored ..."
msgstr "Мені сумно ..."
msgid "Let's go for a walk!"
msgstr "Нумо прогуляймось!"
msgid "This is the best day of my life!"
msgstr "Сьогодні найкращий день у моєму житті!"
msgid "Shitty day :/"
msgstr "Поганенький день :/"
msgid "I'm extremely bored ..."
msgstr "Мені геть сумно ..."
msgid "I'm very sad ..."
msgstr "Я дуже засмучений ..."
msgid "I'm sad"
msgstr "Я засмучений"
msgid "I'm living the life!"
msgstr "Ось таке у мене життя!"
msgid "I pwn therefore I am."
msgstr "Народжений, щоб зламувати."
msgid "So many networks!!!"
msgstr "Овва, стільки мереж!!!"
msgid "I'm having so much fun!"
msgstr "Мені так весело!"
msgid "My crime is that of curiosity ..."
msgstr "Мій єдиний злочин - це допитливість ..."
#, python-brace-format
msgid "Hello {name}! Nice to meet you."
msgstr "Привіт, {name}! Приємно познайомитись."
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr "Ціль {name} неподалік!"
#, python-brace-format
msgid "Uhm ... goodbye {name}"
msgstr "Що ж ... бувай, {name}"
#, python-brace-format
msgid "{name} is gone ..."
msgstr "{name} зникла ..."
#, python-brace-format
msgid "Whoops ... {name} is gone."
msgstr "Ой-ой ... {name} зникла."
#, python-brace-format
msgid "{name} missed!"
msgstr "{name} втрачено!"
msgid "Missed!"
msgstr "Не впіймав!"
msgid "Good friends are a blessing!"
msgstr "Справжні друзі - це чудово!"
msgid "I love my friends!"
msgstr "Я люблю своїх друзів!"
msgid "Nobody wants to play with me ..."
msgstr "Ніхто не хоче бавитись зі мною ..."
msgid "I feel so alone ..."
msgstr "Я почуваюсь вкрай самотньо ..."
msgid "Where's everybody?!"
msgstr "Куди всі зникли?!"
#, python-brace-format
msgid "Napping for {secs}s ..."
msgstr "Дрімаю {secs}с ..."
msgid "Zzzzz"
msgstr "Zzzzz"
#, python-brace-format
msgid "ZzzZzzz ({secs}s)"
msgstr "ZzzZzzz ({secs}с)"
msgid "Good night."
msgstr "Спокійної нічки."
msgid "Zzz"
msgstr "Zzz"
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr "Очікую {secs}с ..."
#, python-brace-format
msgid "Looking around ({secs}s)"
msgstr "Роздивляюсь довкола ({secs}с)"
#, python-brace-format
msgid "Hey {what} let's be friends!"
msgstr "Агов, {what}, будьмо друзями!"
#, python-brace-format
msgid "Associating to {what}"
msgstr "Налагоджую зв'язок з {what}"
#, python-brace-format
msgid "Yo {what}!"
msgstr "Гей, {what}!"
#, python-brace-format
msgid "Just decided that {mac} needs no WiFi!"
msgstr "Вирішив, що {mac} більше не потребує WiFi!"
#, python-brace-format
msgid "Deauthenticating {mac}"
msgstr "Від'єднюю {mac}"
#, python-brace-format
msgid "Kickbanning {mac}!"
msgstr "Вилучаю {mac}!"
#, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!"
msgstr "Отакої, у нас є {num} нових рукостискань!"
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr "Нових повідомлень: {count}"
msgid "Oops, something went wrong ... Rebooting ..."
msgstr "Ой, щось пішло не так ... Перезавантажуюсь ..."
#, python-brace-format
msgid "Kicked {num} stations\n"
msgstr "Від'єднав {num} станцій\n"
#, python-brace-format
msgid "Made {num} new friends\n"
msgstr "Нових друзів у мене: {num}\n"
#, python-brace-format
msgid "Got {num} handshakes\n"
msgstr "Перехопив рукостискань: {num}\n"
msgid "Met 1 peer"
msgstr "Зустрівся з одним знайомим"
#, python-brace-format
msgid "Met {num} peers"
msgstr "Зустрівся з {num}-ма знайомими"
#, python-brace-format
msgid ""
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr ""
"Я зламував впродовж {duration} та від'єднав {deauthed} клієнтів! Я зустрів "
"{associated} нових друзів та схрумав {handshakes} рукостискань! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours"
msgstr "годин"
msgid "minutes"
msgstr "хвилин"
msgid "seconds"
msgstr "секунд"
msgid "hour"
msgstr "година"
msgid "minute"
msgstr "хвилина"
msgid "second"
msgstr "секунда"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-05 14:10+0200\n"
"POT-Creation-Date: 2019-11-29 21:50+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -35,10 +35,20 @@ msgstr ""
msgid "The neural network is ready."
msgstr ""
msgid "Generating keys, do not turn off ..."
msgstr ""
#, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr ""
msgid "Reading last session logs ..."
msgstr ""
#, python-brace-format
msgid "Read {lines_so_far} log lines so far ..."
msgstr ""
msgid "I'm bored ..."
msgstr ""
@@ -60,6 +70,12 @@ msgstr ""
msgid "I'm sad"
msgstr ""
msgid "Leave me alone ..."
msgstr ""
msgid "I'm mad at you!"
msgstr ""
msgid "I'm living the life!"
msgstr ""
@@ -76,11 +92,19 @@ msgid "My crime is that of curiosity ..."
msgstr ""
#, python-brace-format
msgid "Hello {name}! Nice to meet you. {name}"
msgid "Hello {name}! Nice to meet you."
msgstr ""
#, python-brace-format
msgid "Unit {name} is nearby! {name}"
msgid "Yo {name}! Sup?"
msgstr ""
#, python-brace-format
msgid "Hey {name} how are you doing?"
msgstr ""
#, python-brace-format
msgid "Unit {name} is nearby!"
msgstr ""
#, python-brace-format
@@ -102,6 +126,12 @@ msgstr ""
msgid "Missed!"
msgstr ""
msgid "Good friends are a blessing!"
msgstr ""
msgid "I love my friends!"
msgstr ""
msgid "Nobody wants to play with me ..."
msgstr ""
@@ -122,6 +152,12 @@ msgstr ""
msgid "ZzzZzzz ({secs}s)"
msgstr ""
msgid "Good night."
msgstr ""
msgid "Zzz"
msgstr ""
#, python-brace-format
msgid "Waiting for {secs}s ..."
msgstr ""
@@ -158,7 +194,11 @@ msgstr ""
msgid "Cool, we got {num} new handshake{plural}!"
msgstr ""
msgid "Ops, something went wrong ... Rebooting ..."
#, python-brace-format
msgid "You have {count} new message{plural}!"
msgstr ""
msgid "Oops, something went wrong ... Rebooting ..."
msgstr ""
#, python-brace-format
@@ -204,3 +244,7 @@ msgstr ""
msgid "second"
msgstr ""
#, python-brace-format
msgid "Uploading data to {to} ..."
msgstr ""

View File

@@ -2,6 +2,10 @@ import hashlib
import time
import re
import os
import logging
import shutil
import gzip
import warnings
from datetime import datetime
from pwnagotchi.voice import Voice
@@ -25,7 +29,7 @@ class LastSession(object):
def __init__(self, config):
self.config = config
self.voice = Voice(lang=config['main']['lang'])
self.path = config['main']['log']
self.path = config['main']['log']['path']
self.last_session = []
self.last_session_id = ''
self.last_saved_session_id = ''
@@ -87,56 +91,65 @@ class LastSession(object):
parts = line.split(']')
if len(parts) < 2:
continue
line_timestamp = parts[0].strip('[')
line = ']'.join(parts[1:])
stopped_at = self._parse_datetime(line_timestamp)
if started_at is None:
started_at = stopped_at
if LastSession.DEAUTH_TOKEN in line and line not in cache:
self.deauthed += 1
cache[line] = 1
try:
line_timestamp = parts[0].strip('[')
line = ']'.join(parts[1:])
stopped_at = self._parse_datetime(line_timestamp)
if started_at is None:
started_at = stopped_at
elif LastSession.ASSOC_TOKEN in line and line not in cache:
self.associated += 1
cache[line] = 1
if LastSession.DEAUTH_TOKEN in line and line not in cache:
self.deauthed += 1
cache[line] = 1
elif LastSession.HANDSHAKE_TOKEN in line and line not in cache:
self.handshakes += 1
cache[line] = 1
elif LastSession.ASSOC_TOKEN in line and line not in cache:
self.associated += 1
cache[line] = 1
elif LastSession.TRAINING_TOKEN in line:
self.train_epochs += 1
elif LastSession.HANDSHAKE_TOKEN in line and line not in cache:
self.handshakes += 1
cache[line] = 1
elif LastSession.EPOCH_TOKEN in line:
self.epochs += 1
m = LastSession.EPOCH_PARSER.findall(line)
if m:
epoch_num, epoch_data = m[0]
m = LastSession.EPOCH_DATA_PARSER.findall(epoch_data)
for key, value in m:
if key == 'reward':
reward = float(value)
self.avg_reward += reward
if reward < self.min_reward:
self.min_reward = reward
elif LastSession.TRAINING_TOKEN in line:
self.train_epochs += 1
elif reward > self.max_reward:
self.max_reward = reward
elif LastSession.EPOCH_TOKEN in line:
self.epochs += 1
m = LastSession.EPOCH_PARSER.findall(line)
if m:
epoch_num, epoch_data = m[0]
m = LastSession.EPOCH_DATA_PARSER.findall(epoch_data)
for key, value in m:
if key == 'reward':
reward = float(value)
self.avg_reward += reward
if reward < self.min_reward:
self.min_reward = reward
elif LastSession.PEER_TOKEN in line:
m = self._peer_parser.findall(line)
if m:
name, pubkey, rssi, sid, pwnd_tot, uptime = m[0]
if pubkey not in cache:
self.last_peer = Peer(sid, 1, int(rssi),
{'name': name,
'identity': pubkey,
'pwnd_tot': int(pwnd_tot)})
self.peers += 1
cache[pubkey] = self.last_peer
else:
cache[pubkey].adv['pwnd_tot'] = pwnd_tot
elif reward > self.max_reward:
self.max_reward = reward
elif LastSession.PEER_TOKEN in line:
m = self._peer_parser.findall(line)
if m:
name, pubkey, rssi, sid, pwnd_tot, uptime = m[0]
if pubkey not in cache:
self.last_peer = Peer({
'session_id': sid,
'channel': 1,
'rssi': int(rssi),
'identity': pubkey,
'advertisement': {
'name': name,
'pwnd_tot': int(pwnd_tot)
}})
self.peers += 1
cache[pubkey] = self.last_peer
else:
cache[pubkey].adv['pwnd_tot'] = pwnd_tot
except Exception as e:
logging.error("error parsing line '%s': %s" % (line, e))
if started_at is not None:
self.duration = stopped_at - started_at
@@ -157,29 +170,140 @@ class LastSession(object):
self.duration_human = ', '.join(self.duration_human)
self.avg_reward /= (self.epochs if self.epochs else 1)
def parse(self):
lines = []
def parse(self, ui, skip=False):
if skip:
logging.debug("skipping parsing of the last session logs ...")
else:
logging.debug("reading last session logs ...")
if os.path.exists(self.path):
with FileReadBackwards(self.path, encoding="utf-8") as fp:
for line in fp:
line = line.strip()
if line != "" and line[0] != '[':
continue
lines.append(line)
if LastSession.START_TOKEN in line:
break
lines.reverse()
ui.on_reading_logs()
if len(lines) == 0:
lines.append("Initial Session");
lines = []
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()
if os.path.exists(self.path):
with FileReadBackwards(self.path, encoding="utf-8") as fp:
for line in fp:
line = line.strip()
if line != "" and line[0] != '[':
continue
lines.append(line)
if LastSession.START_TOKEN in line:
break
self._parse_stats()
lines_so_far = len(lines)
if lines_so_far % 100 == 0:
ui.on_reading_logs(lines_so_far)
lines.reverse()
if len(lines) == 0:
lines.append("Initial Session");
ui.on_reading_logs()
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()
logging.debug("parsing last session logs (%d lines) ..." % len(lines))
self._parse_stats()
self.parsed = True
def is_new(self):
return self.last_session_id != self.last_saved_session_id
def setup_logging(args, config):
cfg = config['main']['log']
filename = cfg['path']
formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s")
root = logging.getLogger()
root.setLevel(logging.DEBUG if args.debug else logging.INFO)
if filename:
# since python default log rotation might break session data in different files,
# we need to do log rotation ourselves
log_rotation(filename, cfg)
file_handler = logging.FileHandler(filename)
file_handler.setFormatter(formatter)
root.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
root.addHandler(console_handler)
if not args.debug:
# disable scapy and tensorflow logging
logging.getLogger("scapy").disabled = True
logging.getLogger('tensorflow').disabled = True
# https://stackoverflow.com/questions/15777951/how-to-suppress-pandas-future-warning
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.simplefilter(action='ignore', category=DeprecationWarning)
# https://stackoverflow.com/questions/24344045/how-can-i-completely-remove-any-logging-from-requests-module-in-python?noredirect=1&lq=1
logging.getLogger("urllib3").propagate = False
requests_log = logging.getLogger("requests")
requests_log.addHandler(logging.NullHandler())
requests_log.prpagate = False
def log_rotation(filename, cfg):
rotation = cfg['rotation']
if not rotation['enabled']:
return
elif not os.path.isfile(filename):
return
stats = os.stat(filename)
# specify a maximum size to rotate ( format is 10/10B, 10K, 10M 10G )
if rotation['size']:
max_size = parse_max_size(rotation['size'])
if stats.st_size >= max_size:
do_rotate(filename, stats, cfg)
else:
raise Exception("log rotation is enabled but log.rotation.size was not specified")
def parse_max_size(s):
parts = re.findall(r'(^\d+)([bBkKmMgG]?)', s)
if len(parts) != 1 or len(parts[0]) != 2:
raise Exception("can't parse %s as a max size" % s)
num, unit = parts[0]
num = int(num)
unit = unit.lower()
if unit == 'k':
return num * 1024
elif unit == 'm':
return num * 1024 * 1024
elif unit == 'g':
return num * 1024 * 1024 * 1024
else:
return num
def do_rotate(filename, stats, cfg):
base_path = os.path.dirname(filename)
name = os.path.splitext(os.path.basename(filename))[0]
archive_filename = os.path.join(base_path, "%s.gz" % name)
counter = 2
while os.path.exists(archive_filename):
archive_filename = os.path.join(base_path, "%s-%d.gz" % (name, counter))
counter += 1
log_filename = archive_filename.replace('gz', 'log')
print("%s is %d bytes big, rotating to %s ..." % (filename, stats.st_size, log_filename))
shutil.move(filename, log_filename)
print("compressing to %s ..." % archive_filename)
with open(log_filename, 'rb') as src:
with gzip.open(archive_filename, 'wb') as dst:
dst.writelines(src)

View File

@@ -1,4 +0,0 @@
import os
def new_session_id():
return ':'.join(['%02x' % b for b in os.urandom(6)])

View File

@@ -1,182 +0,0 @@
import time
import json
import _thread
import threading
import logging
from scapy.all import Dot11, Dot11FCS, Dot11Elt, RadioTap, sendp, sniff
import pwnagotchi.ui.faces as faces
import pwnagotchi.mesh.wifi as wifi
from pwnagotchi.mesh import new_session_id
from pwnagotchi.mesh.peer import Peer
def _dummy_peer_cb(peer):
pass
class Advertiser(object):
MAX_STALE_TIME = 300
def __init__(self, iface, name, version, identity, period=0.3, data={}):
self._iface = iface
self._period = period
self._running = False
self._stopped = threading.Event()
self._peers_lock = threading.Lock()
self._adv_lock = threading.Lock()
self._new_peer_cb = _dummy_peer_cb
self._lost_peer_cb = _dummy_peer_cb
self._peers = {}
self._frame = None
self._me = Peer(new_session_id(), 0, 0, {
'name': name,
'version': version,
'identity': identity,
'face': faces.FRIEND,
'pwnd_run': 0,
'pwnd_tot': 0,
'uptime': 0,
'epoch': 0,
'data': data
})
self.update()
def update(self, values={}):
with self._adv_lock:
for field, value in values.items():
self._me.adv[field] = value
self._frame = wifi.encapsulate(payload=json.dumps(self._me.adv), addr_from=self._me.session_id)
def on_peer(self, new_cb, lost_cb):
self._new_peer_cb = new_cb
self._lost_peer_cb = lost_cb
def on_face_change(self, old, new):
self.update({'face': new})
def start(self):
self._running = True
_thread.start_new_thread(self._sender, ())
_thread.start_new_thread(self._listener, ())
_thread.start_new_thread(self._pruner, ())
def num_peers(self):
with self._peers_lock:
return len(self._peers)
def peers(self):
with self._peers_lock:
return list(self._peers.values())
def closest_peer(self):
closest = None
with self._peers_lock:
for ident, peer in self._peers.items():
if closest is None or peer.is_closer(closest):
closest = peer
return closest
def stop(self):
self._running = False
self._stopped.set()
def _sender(self):
logging.info("started advertiser thread (period:%s sid:%s) ..." % (str(self._period), self._me.session_id))
while self._running:
try:
sendp(self._frame, iface=self._iface, verbose=False, count=1, inter=self._period)
except OSError as ose:
logging.warning("non critical issue while sending advertising packet: %s" % ose)
except Exception as e:
logging.exception("error")
time.sleep(self._period)
def _on_advertisement(self, src_session_id, channel, rssi, adv):
ident = adv['identity']
with self._peers_lock:
if ident not in self._peers:
peer = Peer(src_session_id, channel, rssi, adv)
logging.info("detected unit %s (v%s) on channel %d (%s dBm) [sid:%s pwnd_tot:%d uptime:%d]" % ( \
peer.full_name(),
peer.version(),
channel,
rssi,
src_session_id,
peer.pwnd_total(),
peer.uptime()))
self._peers[ident] = peer
self._new_peer_cb(peer)
else:
self._peers[ident].update(src_session_id, channel, rssi, adv)
def _parse_identity(self, radio, dot11, dot11elt):
payload = b''
while dot11elt:
payload += dot11elt.info
dot11elt = dot11elt.payload.getlayer(Dot11Elt)
if payload != b'':
adv = json.loads(payload)
self._on_advertisement( \
dot11.addr3,
wifi.freq_to_channel(radio.Channel),
radio.dBm_AntSignal,
adv)
def _is_broadcasted_advertisement(self, dot11):
# dst bcast + protocol signature + not ours
return dot11 is not None and \
dot11.addr1 == wifi.BroadcastAddress and \
dot11.addr2 == wifi.SignatureAddress and \
dot11.addr3 != self._me.session_id
def _is_frame_for_us(self, dot11):
# dst is us + protocol signature + not ours (why would we send a frame to ourself anyway?)
return dot11 is not None and \
dot11.addr1 == self._me.session_id and \
dot11.addr2 == wifi.SignatureAddress and \
dot11.addr3 != self._me.session_id
def _on_packet(self, p):
# https://github.com/secdev/scapy/issues/1590
if p.haslayer(Dot11):
dot11 = p[Dot11]
elif p.haslayer(Dot11FCS):
dot11 = p[Dot11FCS]
else:
dot11 = None
if self._is_broadcasted_advertisement(dot11):
try:
dot11elt = p.getlayer(Dot11Elt)
if dot11elt.ID == wifi.Dot11ElemID_Whisper:
self._parse_identity(p[RadioTap], dot11, dot11elt)
else:
raise Exception("unknown frame id %d" % dot11elt.ID)
except Exception as e:
logging.exception("error decoding packet from %s" % dot11.addr3)
def _listener(self):
# logging.info("started advertisements listener ...")
expr = "type mgt subtype beacon and ether src %s" % wifi.SignatureAddress
sniff(iface=self._iface, filter=expr, prn=self._on_packet, store=0, stop_filter=lambda x: self._stopped.isSet())
def _pruner(self):
while self._running:
time.sleep(10)
with self._peers_lock:
stale = []
for ident, peer in self._peers.items():
inactive_for = peer.inactive_for()
if inactive_for >= Advertiser.MAX_STALE_TIME:
logging.info("peer %s lost (inactive for %ds)" % (peer.full_name(), inactive_for))
self._lost_peer_cb(peer)
stale.append(ident)
for ident in stale:
del self._peers[ident]

View File

@@ -1,63 +1,89 @@
import time
import logging
import datetime
import pwnagotchi.mesh.wifi as wifi
import pwnagotchi.ui.faces as faces
def parse_rfc3339(dt):
if dt == "0001-01-01T00:00:00Z":
return datetime.datetime.now()
return datetime.datetime.strptime(dt.split('.')[0], "%Y-%m-%dT%H:%M:%S")
class Peer(object):
def __init__(self, sid, channel, rssi, adv):
self.first_seen = time.time()
self.last_seen = self.first_seen
self.session_id = sid
self.last_channel = channel
self.presence = [0] * wifi.NumChannels
self.adv = adv
self.rssi = rssi
self.presence[channel - 1] = 1
def __init__(self, obj):
now = time.time()
just_met = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
def update(self, sid, channel, rssi, adv):
if self.name() != adv['name']:
logging.info("peer %s changed name: %s -> %s" % (self.full_name(), self.name(), adv['name']))
try:
self.first_met = parse_rfc3339(obj.get('met_at', just_met))
self.first_seen = parse_rfc3339(obj.get('detected_at', just_met))
self.prev_seen = parse_rfc3339(obj.get('prev_seen_at', just_met))
except Exception as e:
logging.warning("error while parsing peer timestamps: %s" % e)
logging.debug(e, exc_info=True)
self.first_met = just_met
self.first_seen = just_met
self.prev_seen = just_met
if self.session_id != sid:
logging.info("peer %s changed session id: %s -> %s" % (self.full_name(), self.session_id, sid))
self.last_seen = now # should be seen_at
self.encounters = obj.get('encounters', 0)
self.session_id = obj.get('session_id', '')
self.last_channel = obj.get('channel', 1)
self.rssi = obj.get('rssi', 0)
self.adv = obj.get('advertisement', {})
self.presence[channel - 1] += 1
self.adv = adv
self.rssi = rssi
self.session_id = sid
def update(self, new):
if self.name() != new.name():
logging.info("peer %s changed name: %s -> %s" % (self.full_name(), self.name(), new.name()))
if self.session_id != new.session_id:
logging.info("peer %s changed session id: %s -> %s" % (self.full_name(), self.session_id, new.session_id))
self.adv = new.adv
self.rssi = new.rssi
self.session_id = new.session_id
self.last_seen = time.time()
self.prev_seen = new.prev_seen
self.first_met = new.first_met
self.encounters = new.encounters
def inactive_for(self):
return time.time() - self.last_seen
def _adv_field(self, name, default='???'):
return self.adv[name] if name in self.adv else default
def first_encounter(self):
return self.encounters == 1
def is_good_friend(self, config):
return self.encounters >= config['personality']['bond_encounters_factor']
def face(self):
return self._adv_field('face', default=faces.FRIEND)
return self.adv.get('face', faces.FRIEND)
def name(self):
return self._adv_field('name')
return self.adv.get('name', '???')
def identity(self):
return self._adv_field('identity')
return self.adv.get('identity', '???')
def full_name(self):
return "%s@%s" % (self.name(), self.identity())
def version(self):
return self._adv_field('version')
return self.adv.get('version', '1.0.0a')
def pwnd_run(self):
return int(self._adv_field('pwnd_run', default=0))
return int(self.adv.get('pwnd_run', 0))
def pwnd_total(self):
return int(self._adv_field('pwnd_tot', default=0))
return int(self.adv.get('pwnd_tot', 0))
def uptime(self):
return self._adv_field('uptime', default=0)
return self.adv.get('uptime', 0)
def epoch(self):
return self._adv_field('epoch', default=0)
return self.adv.get('epoch', 0)
def full_name(self):
return '%s@%s' % (self.name(), self.identity())

Some files were not shown because too many files have changed in this diff Show More