Compare commits

..

14 Commits

Author SHA1 Message Date
bac62bc4aa Fix for pwnlib 2024-01-17 23:17:48 +01:00
f7a5f2a554 Update build 2024-01-17 21:55:27 +01:00
6921fd14a3 Update Makefile 2024-01-17 20:46:03 +01:00
0dbd611ed5 zramswap 2024-01-17 20:42:28 +01:00
18b9093f70 Version 2.7.2 2024-01-17 20:11:38 +01:00
26913016b9 Changed from dphys-swapfile to zram-tools
Fix on auto-update.py
2024-01-17 19:55:07 +01:00
0786b6757e Changed from dphys-swapfile to zram-tools
Fix on auto-update.py
2024-01-17 19:53:36 +01:00
0f4eda8039 Changed from ext4 to f2fs
Changed from dphys-swapfile to zram-tools
Fix on auto-update.py
2024-01-17 19:51:38 +01:00
1672a35f09 Changed MAC check for whitelist upto last 2 characters. 2024-01-17 18:28:53 +01:00
80e7e6c550 Changed MAC check for whitelist upto last 2 characters. 2024-01-17 18:26:45 +01:00
ca274036ab Version 2.7.1 2024-01-17 18:23:15 +01:00
649e8a4222 Small fixes 2024-01-17 18:22:57 +01:00
63f0a761c1 Added a skip for hostnames/mac addresses on whitelist 2024-01-17 18:22:42 +01:00
8a64918b55 Added Hebrew language 2024-01-16 10:45:47 +01:00
12 changed files with 151 additions and 170 deletions

View File

@ -48,15 +48,11 @@ $(PACKER):
rm $(PACKER).zip rm $(PACKER).zip
chmod +x $@ chmod +x $@
SDIST := dist/pwnagotchi-$(PWN_VERSION).tar.gz
$(SDIST): setup.py pwnagotchi
python3 setup.py sdist
# Building the image requires packer, but don't rebuild the image just because packer updated. # Building the image requires packer, but don't rebuild the image just because packer updated.
pwnagotchi: | $(PACKER) pwnagotchi: | $(PACKER)
# If the packer or ansible files are updated, rebuild the image. # If the packer or ansible files are updated, rebuild the image.
pwnagotchi: $(SDIST) builder/pwnagotchi.json.pkr.hcl builder/raspberrypi64.yml $(shell find builder/data -type f) pwnagotchi: builder/pwnagotchi.json.pkr.hcl builder/raspberrypi64.yml $(shell find builder/data -type f)
cd builder && $(PACKER) init pwnagotchi.json.pkr.hcl && sudo $(UNSHARE) $(PACKER) build -var "pwn_hostname=$(PWN_HOSTNAME)" -var "pwn_version=$(PWN_VERSION)" pwnagotchi.json.pkr.hcl cd builder && $(PACKER) init pwnagotchi.json.pkr.hcl && sudo $(UNSHARE) $(PACKER) build -var "pwn_hostname=$(PWN_HOSTNAME)" -var "pwn_version=$(PWN_VERSION)" pwnagotchi.json.pkr.hcl

View File

@ -176,8 +176,12 @@ def pwnagotchi_cli():
os.system("rm /root/.auto-update && systemctl restart pwnagotchi") os.system("rm /root/.auto-update && systemctl restart pwnagotchi")
os.system("systemctl restart pwnagotchi") os.system("systemctl restart pwnagotchi")
print("Okay, give me a couple minutes. Just watch pwnlog while you wait.") print("Okay, give me a couple minutes. Just watch pwnlog while you wait.")
print("Okay, guess not!") elif user_input.lower() in ('n', 'no'):
print("You are currently on the latest release, v%s." % pwnagotchi.__version__) print("Okay, guess not!")
else:
print("Invalid input.")
else:
print("You are currently on the latest release, v%s." % pwnagotchi.__version__)
sys.exit(0) sys.exit(0)
config = utils.load_config(args) config = utils.load_config(args)

View File

@ -0,0 +1,15 @@
# Specifies amount of zram devices to create.
# By default, zramswap-start will use all available cores.
#CORES=1
# Specifies the amount of RAM that should be used for zram
# based on a percentage the total amount of available memory
PERCENTAGE=60
# Specifies a static amount of RAM that should be used for
# the ZRAM devices, this is in MiB
#ALLOCATION=256
# Specifies the priority for the swap devices, see swapon(2)
# for more details.
#PRIORITY=100

View File

@ -1,26 +0,0 @@
# /etc/dphys-swapfile - user settings for dphys-swapfile package
# author Neil Franklin, last modification 2010.05.05
# copyright ETH Zuerich Physics Departement
# use under either modified/non-advertising BSD or GPL license
# this file is sourced with . so full normal sh syntax applies
# the default settings are added as commented out CONF_*=* lines
# where we want the swapfile to be, this is the default
#CONF_SWAPFILE=/var/swap
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=2048
# set size to computed value, this times RAM size, dynamically adapts,
# guarantees that there is enough swap without wasting disk space on excess
#CONF_SWAPFACTOR=2
# restrict size (computed and absolute!) to maximally this limit
# can be set to empty for no limit, but beware of filled partitions!
# this is/was a (outdated?) 32bit kernel limit (in MBytes), do not overrun it
# but is also sensible on 64bit to prevent filling /var or even / partition
#CONF_MAXSWAP=2048

View File

@ -56,7 +56,7 @@ stop_monitor_interface() {
ifconfig wlan0 up ifconfig wlan0 up
} }
# returns 0 if the specificed network interface is up # returns 0 if the specified network interface is up
is_interface_up() { is_interface_up() {
if grep -qi 'up' /sys/class/net/"$1"/operstate; then if grep -qi 'up' /sys/class/net/"$1"/operstate; then
return 0 return 0

View File

@ -23,21 +23,17 @@
services: services:
enable: enable:
- bettercap.service - bettercap.service
- dphys-swapfile.service
- fstrim.timer - fstrim.timer
- pwnagotchi.service - pwnagotchi.service
- pwngrid-peer.service - pwngrid-peer.service
- zramswap.service
disable: disable:
- apt-daily-upgrade.service - apt-daily-upgrade.service
- apt-daily-upgrade.timer - apt-daily-upgrade.timer
- apt-daily.service - apt-daily.service
- apt-daily.timer - apt-daily.timer
- avahi-daemon.service
- avahi-daemon.socket
- bluetooth.service - bluetooth.service
- ifup@wlan0.service - ifup@wlan0.service
- triggerhappy.service
- wpa_supplicant.service
packages: packages:
caplets: caplets:
source: "https://github.com/jayofelony/caplets.git" source: "https://github.com/jayofelony/caplets.git"
@ -61,6 +57,7 @@
- libpcap0.8-dbg - libpcap0.8-dbg
remove: remove:
- avahi-daemon - avahi-daemon
- dhpys-swapfile
- nfs-common - nfs-common
- triggerhappy - triggerhappy
- wpasupplicant - wpasupplicant
@ -73,7 +70,6 @@
- build-essential - build-essential
- curl - curl
- dkms - dkms
- dphys-swapfile
- fbi - fbi
- flex - flex
- fonts-dejavu - fonts-dejavu
@ -161,17 +157,62 @@
- wl - wl
- xxd - xxd
- zlib1g-dev - zlib1g-dev
- zram-tools
environment: environment:
ARCHFLAGS: "-arch aarch64" ARCHFLAGS: "-arch aarch64"
QEMU_UNAME: "{{ kernel.full }}" QEMU_UNAME: "{{ kernel.full }}"
tasks: tasks:
# First we install and remove unnecessary packages
- name: install packages
apt:
name: "{{ packages.apt.install }}"
state: present
update_cache: yes
install_recommends: false
- name: remove unnecessary apt packages
apt:
name: "{{ packages.apt.remove }}"
state: absent
purge: yes
register: removed
# Now we set up /boot/firmware
- name: Create pi user - name: Create pi user
copy: copy:
dest: /boot/firmware/userconf dest: /boot/firmware/userconf
content: | content: |
pi:$6$3jNr0GA9KIyt4hmM$efeVIopdMQ8DGgEPCWWlbx3mJJNAYci1lEXGdlky0xPyjqwKNbwTL5SrCcpb4144C4IvzWjn7Iv.QjqmU7iyT/ pi:$6$3jNr0GA9KIyt4hmM$efeVIopdMQ8DGgEPCWWlbx3mJJNAYci1lEXGdlky0xPyjqwKNbwTL5SrCcpb4144C4IvzWjn7Iv.QjqmU7iyT/
- name: enable ssh on boot
file:
path: /boot/firmware/ssh
state: touch
- name: adjust /boot/firmware/config.txt
lineinfile:
dest: /boot/firmware/config.txt
insertafter: EOF
line: '{{ item }}'
with_items: "{{ system.boot_options }}"
- name: change root partition
replace:
dest: /boot/firmware/cmdline.txt
backup: no
regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+"
replace: "root=/dev/mmcblk0p2"
- name: configure /boot/firmware/cmdline.txt
lineinfile:
path: /boot/firmware/cmdline.txt
backrefs: True
state: present
backup: no
regexp: '(.*)$'
line: '\1 modules-load=dwc2,g_ether'
- name: change hostname - name: change hostname
lineinfile: lineinfile:
dest: /etc/hostname dest: /etc/hostname
@ -189,6 +230,7 @@
state: present state: present
when: hostname.changed when: hostname.changed
# Now we disable sap and a2dp, we don't use them on rpi
- name: disable sap plugin for bluetooth.service - name: disable sap plugin for bluetooth.service
lineinfile: lineinfile:
dest: /lib/systemd/system/bluetooth.service dest: /lib/systemd/system/bluetooth.service
@ -196,19 +238,6 @@
line: 'ExecStart=/usr/libexec/bluetooth/bluetoothd --noplugin=sap,a2dp' line: 'ExecStart=/usr/libexec/bluetooth/bluetoothd --noplugin=sap,a2dp'
state: present state: present
- name: configure dphys-swapfile
lineinfile:
path: /etc/dphys-swapfile
regexp: "^CONF_SWAPSIZE=.*$"
line: "CONF_SWAPSIZE=2048"
- name: install packages
apt:
name: "{{ packages.apt.install }}"
state: present
update_cache: yes
install_recommends: false
########################################### ###########################################
# #
# libpcap v1.9 - build from source # libpcap v1.9 - build from source
@ -477,41 +506,6 @@
state: absent state: absent
path: /etc/update-motd.d/10-uname path: /etc/update-motd.d/10-uname
- name: enable ssh on boot
file:
path: /boot/firmware/ssh
state: touch
- name: adjust /boot/config.txt
lineinfile:
dest: /boot/firmware/config.txt
insertafter: EOF
line: '{{ item }}'
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:
dest: /boot/firmware/cmdline.txt
backup: no
regexp: "root=PARTUUID=[a-zA-Z0-9\\-]+"
replace: "root=/dev/mmcblk0p2"
- name: configure /boot/cmdline.txt
lineinfile:
path: /boot/cmdline.txt
backrefs: True
state: present
backup: no
regexp: '(.*)$'
line: '\1 modules-load=dwc2,g_ether'
- name: Add pwnlog alias - name: Add pwnlog alias
lineinfile: lineinfile:
dest: /home/pi/.bashrc dest: /home/pi/.bashrc
@ -563,13 +557,6 @@
group: pi group: pi
recurse: true recurse: true
- name: remove unnecessary apt packages
apt:
name: "{{ packages.apt.remove }}"
state: absent
purge: yes
register: removed
- name: clean apt cache - name: clean apt cache
apt: apt:
autoclean: true autoclean: true

View File

@ -1 +1 @@
__version__ = '2.7.0' __version__ = '2.7.2'

View File

@ -184,13 +184,15 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
for ap in s['wifi']['aps']: for ap in s['wifi']['aps']:
if ap['encryption'] == '' or ap['encryption'] == 'OPEN': if ap['encryption'] == '' or ap['encryption'] == 'OPEN':
continue continue
elif ap['hostname'] in whitelist or ap['mac'][:8].lower() in whitelist:
continue
elif ap['hostname'] not in whitelist \ elif ap['hostname'] not in whitelist \
and ap['mac'].lower() not in whitelist \ and ap['mac'].lower() not in whitelist \
and ap['mac'][:8].lower() not in whitelist: and ap['mac'][:8].lower() not in whitelist:
if self._filter_included(ap): if self._filter_included(ap):
aps.append(ap) aps.append(ap)
except Exception as e: except Exception as e:
logging.exception("Error while getting acces points (%s)", e) logging.exception("Error while getting access points (%s)", e)
aps.sort(key=lambda ap: ap['channel']) aps.sort(key=lambda ap: ap['channel'])
return self.set_access_points(aps) return self.set_access_points(aps)

View File

@ -10,7 +10,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-16 21:51+0100\n" "POT-Creation-Date: 2023-11-16 21:51+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: neo0oen \n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: Hebrew\n" "Language: Hebrew\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -18,240 +18,242 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz" msgid "ZzzzZZzzzzZzzz"
msgstr "" msgstr "ZzzzZZzzzzZzzz"
msgid "Hi, I'm Pwnagotchi! Starting ..." msgid "Hi, I'm Pwnagotchi! Starting ..."
msgstr "" msgstr "שלום, אני פוונגוטצ'י! מתחיל . . ."
msgid "New day, new hunt, new pwns!" msgid "New day, new hunt, new pwns!"
msgstr "" msgstr "יום חדש, ציד חדש, ניצחונות חדשים !"
msgid "Hack the Planet!" msgid "Hack the Planet!"
msgstr "" msgstr "פרוץ לכדור הארץ !"
msgid "AI ready." msgid "AI ready."
msgstr "" msgstr "הבינה המלאחות'ית מוכנה"
msgid "The neural network is ready." msgid "The neural network is ready."
msgstr "" msgstr "הרשת הניורולוגית העצבית מוכנה."
msgid "Generating keys, do not turn off ..." msgid "Generating keys, do not turn off ..."
msgstr "" msgstr "יוצר מפתחות, בבקשה אל תכבה אותי"
#, python-brace-format #, python-brace-format
msgid "Hey, channel {channel} is free! Your AP will say thanks." msgid "Hey, channel {channel} is free! Your AP will say thanks."
msgstr "" msgstr "היי , הערוץ {channel}פנוי ,נקודת הגישה שלך אומרת תודה "
msgid "Reading last session logs ..." msgid "Reading last session logs ..."
msgstr "" msgstr ". . . קורא לוגים מאז ההפעלה האחרונה"
#, python-brace-format #, python-brace-format
msgid "Read {lines_so_far} log lines so far ..." msgid "Read {lines_so_far} log lines so far ..."
msgstr "" msgstr "קראתי {lines_so_far} שורות מהלוג עד עכשיו . . ."
msgid "I'm bored ..." msgid "I'm bored ..."
msgstr "" msgstr "אני משועמם . . ."
msgid "Let's go for a walk!" msgid "Let's go for a walk!"
msgstr "" msgstr "בוא ניצא לטיול! "
msgid "This is the best day of my life!" msgid "This is the best day of my life!"
msgstr "" msgstr "זה היום הכי טוב בחיי!"
msgid "Shitty day :/" msgid "Shitty day :/"
msgstr "" msgstr "יום מחורבן :/"
msgid "I'm extremely bored ..." msgid "I'm extremely bored ..."
msgstr "" msgstr "אני משועמם בטירוף . . ."
msgid "I'm very sad ..." msgid "I'm very sad ..."
msgstr "" msgstr "אני עצוב נורא . . ."
msgid "I'm sad" msgid "I'm sad"
msgstr "" msgstr "אני עצוב"
msgid "Leave me alone ..." msgid "Leave me alone ..."
msgstr "" msgstr "עזוב אותי בשקט . . ."
msgid "I'm mad at you!" msgid "I'm mad at you!"
msgstr "" msgstr "אני כועס עלייך!"
msgid "I'm living the life!" msgid "I'm living the life!"
msgstr "" msgstr "אני חי את החיים!"
msgid "I pwn therefore I am." msgid "I pwn therefore I am."
msgstr "" msgstr "אני שולט לכן אני כאן."
msgid "So many networks!!!" msgid "So many networks!!!"
msgstr "" msgstr "כל כך הרבה רשתות! ! !"
msgid "I'm having so much fun!" msgid "I'm having so much fun!"
msgstr "" msgstr "אני כל כך נהנה ועושה הרבה כיף!"
msgid "My crime is that of curiosity ..." msgid "My crime is that of curiosity ..."
msgstr "" msgstr "הפשע שלי הוא הסקרנות . . ."
#, python-brace-format #, python-brace-format
msgid "Hello {name}! Nice to meet you." msgid "Hello {name}! Nice to meet you."
msgstr "" msgstr "שלום {name}! נעים להכיר אותך."
#, python-brace-format #, python-brace-format
msgid "Yo {name}! Sup?" msgid "Yo {name}! Sup?"
msgstr "" msgstr "יו {name}! מה קורה?"
#, python-brace-format #, python-brace-format
msgid "Hey {name} how are you doing?" msgid "Hey {name} how are you doing?"
msgstr "" msgstr "היי {name} איך אתה מסתדר?"
#, python-brace-format #, python-brace-format
msgid "Unit {name} is nearby!" msgid "Unit {name} is nearby!"
msgstr "" msgstr "יחידה {name} בקרבת מקום!"
#, python-brace-format #, python-brace-format
msgid "Uhm ... goodbye {name}" msgid "Uhm ... goodbye {name}"
msgstr "" msgstr "אוף ... להתראות {name}"
#, python-brace-format #, python-brace-format
msgid "{name} is gone ..." msgid "{name} is gone ..."
msgstr "" msgstr "{name} נעלם ..."
#, python-brace-format #, python-brace-format
msgid "Whoops ... {name} is gone." msgid "Whoops ... {name} is gone."
msgstr "" msgstr "אופס ... {name} נעלם ."
#, python-brace-format #, python-brace-format
msgid "{name} missed!" msgid "{name} missed!"
msgstr "" msgstr "{name} התפספס!"
msgid "Missed!" msgid "Missed!"
msgstr "" msgstr "התפספס!"
msgid "Good friends are a blessing!" msgid "Good friends are a blessing!"
msgstr "" msgstr "חברים טובים זאת ברכה!"
msgid "I love my friends!" msgid "I love my friends!"
msgstr "" msgstr "אני אוהב את החברים שלי!"
msgid "Nobody wants to play with me ..." msgid "Nobody wants to play with me ..."
msgstr "" msgstr "אף אחד לא רוצה לשחק אית . . ."
msgid "I feel so alone ..." msgid "I feel so alone ..."
msgstr "" msgstr "אני מרגיש כל כך לבד . . ."
msgid "Where's everybody?!" msgid "Where's everybody?!"
msgstr "" msgstr "לאיפה כולם נעלמו?!"
#, python-brace-format #, python-brace-format
msgid "Napping for {secs}s ..." msgid "Napping for {secs}s ..."
msgstr "" msgstr "מנמנם למשך {secs}שניות ..."
msgid "Zzzzz" msgid "Zzzzz"
msgstr "" msgstr "Zzzzz"
#, python-brace-format #, python-brace-format
msgid "ZzzZzzz ({secs}s)" msgid "ZzzZzzz ({secs}s)"
msgstr "" msgstr "ZzzZzzz ({secs}s)"
msgid "Good night." msgid "Good night."
msgstr "" msgstr "לילה טוב"
msgid "Zzz" msgid "Zzz"
msgstr "" msgstr "Zzz"
#, python-brace-format #, python-brace-format
msgid "Waiting for {secs}s ..." msgid "Waiting for {secs}s ..."
msgstr "" msgstr "מחכה ל {secs}שניות ..."
#, python-brace-format #, python-brace-format
msgid "Looking around ({secs}s)" msgid "Looking around ({secs}s)"
msgstr "" msgstr "מסתכל מסביב ({secs}שניות)"
#, python-brace-format #, python-brace-format
msgid "Hey {what} let's be friends!" msgid "Hey {what} let's be friends!"
msgstr "" msgstr "היי {what} בוא נהיה חברים!"
#, python-brace-format #, python-brace-format
msgid "Associating to {what}" msgid "Associating to {what}"
msgstr "" msgstr "מקשר את עצמי אל {what}"
#, python-brace-format #, python-brace-format
msgid "Yo {what}!" msgid "Yo {what}!"
msgstr "" msgstr "יו יו {what}!"
#, python-brace-format #, python-brace-format
msgid "Just decided that {mac} needs no WiFi!" msgid "Just decided that {mac} needs no WiFi!"
msgstr "" msgstr "בדיוק החלטתי ש {mac} לא צריך חיבור אלחוטי"
#, python-brace-format #, python-brace-format
msgid "Deauthenticating {mac}" msgid "Deauthenticating {mac}"
msgstr "" msgstr "מסכל את האימות של {mac}"
#, python-brace-format #, python-brace-format
msgid "Kickbanning {mac}!" msgid "Kickbanning {mac}!"
msgstr "" msgstr "מוציא איסור על/מעיף {mac}!"
#, python-brace-format #, python-brace-format
msgid "Cool, we got {num} new handshake{plural}!" msgid "Cool, we got {num} new handshake{plural}!"
msgstr "" msgstr "מגניב!, הצלחנו להשיג {num} לחיצות ידיים חדשות{plural}!"
#, python-brace-format #, python-brace-format
msgid "You have {count} new message{plural}!" msgid "You have {count} new message{plural}!"
msgstr "" msgstr "יש לך {count} הודעות חדשות{plural}!"
msgid "Oops, something went wrong ... Rebooting ..." msgid "Oops, something went wrong ... Rebooting ..."
msgstr "" msgstr "אופס!, משהו לא קרה כשורה ... מאתחל ..."
#, python-brace-format #, python-brace-format
msgid "Uploading data to {to} ..." msgid "Uploading data to {to} ..."
msgstr "" msgstr "מעלה נתונים ל {to} ..."
#, python-brace-format #, python-brace-format
msgid "Downloading from {name} ..." msgid "Downloading from {name} ..."
msgstr "" msgstr "מוריד נתונים מ {name} ..."
#, python-brace-format #, python-brace-format
msgid "Kicked {num} stations\n" msgid "Kicked {num} stations\n"
msgstr "" msgstr "העפתי {num} תחנות\n"
msgid "Made >999 new friends\n" msgid "Made >999 new friends\n"
msgstr "" msgstr "הכרתי >999 חברים חדשים\n"
#, python-brace-format #, python-brace-format
msgid "Made {num} new friends\n" msgid "Made {num} new friends\n"
msgstr "" msgstr "הכרתי {num} חברים חדשים\n"
#, python-brace-format #, python-brace-format
msgid "Got {num} handshakes\n" msgid "Got {num} handshakes\n"
msgstr "" msgstr "השגתי {num} לחיצות ידיים\n"
msgid "Met 1 peer" msgid "Met 1 peer"
msgstr "" msgstr "פגשתי שותף 1 "
#, python-brace-format #, python-brace-format
msgid "Met {num} peers" msgid "Met {num} peers"
msgstr "" msgstr "פגשתי {num} שותפים"
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met " "I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi " "{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet" "#pwnlog #pwnlife #hacktheplanet #skynet"
msgstr "" msgstr "אני שלטתי במשך {duration} והצלחתי להעיף {deauthed} משתמשים! בדרך גם פגשתי "
"{associated} חברים חדשים ואכלתי {handshakes} לחיצות ידיים #pwnagotchi "
"#pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours" msgid "hours"
msgstr "" msgstr "שעות"
msgid "minutes" msgid "minutes"
msgstr "" msgstr "דקות"
msgid "seconds" msgid "seconds"
msgstr "" msgstr "שניות"
msgid "hour" msgid "hour"
msgstr "" msgstr "שעה"
msgid "minute" msgid "minute"
msgstr "" msgstr "דקה"
msgid "second" msgid "second"
msgstr "" msgstr "שניה"

View File

@ -212,7 +212,7 @@ class AutoUpdate(plugins.Plugin):
if install(display, update): if install(display, update):
num_installed += 1 num_installed += 1
else: else:
prev_status = '%d new update%c available!' % (num_updates, 's' if num_updates > 1 else '') prev_status = '%d new update%s available!' % (num_updates, 's' if num_updates > 1 else '')
logging.info("[update] done") logging.info("[update] done")

View File

@ -2,11 +2,12 @@ from . import SH1106
from . import config from . import config
# Display resolution # Display resolution
EPD_WIDTH = 64 EPD_WIDTH = 64
EPD_HEIGHT = 128 EPD_HEIGHT = 128
disp = SH1106.SH1106() disp = SH1106.SH1106()
class EPD(object): class EPD(object):
def __init__(self): def __init__(self):