Compare commits

..

55 Commits

Author SHA1 Message Date
92cd5d3fdb Merge pull request #47 from jayofelony/dev
removed blind bug check from fix_services.py
2024-02-04 18:09:33 +01:00
99caa7a973 removed blind bug check from fix_services.py 2024-02-04 18:08:31 +01:00
a94e7eef02 Merge pull request #46 from jayofelony/dev
Dev to master
2024-02-04 18:04:44 +01:00
1cefae55d1 moved the majority of logging to debug 2024-02-04 17:48:22 +01:00
c5ee1df855 unused function 2024-02-04 17:44:05 +01:00
d142840307 Revert "Testing pcapng fileformat"
This reverts commit 7040be2d30.
2024-02-04 17:42:56 +01:00
e558146e28 moves the majority of logging to debug 2024-02-04 17:42:40 +01:00
11a3330153 small fix 2024-02-04 17:42:22 +01:00
53b2dd8628 update build for latest kernel 2024-02-04 17:42:10 +01:00
6381f9443b remove blind bug, as its not a blind bug anymore. 2024-02-04 17:41:57 +01:00
fa7e87b974 remove blind bug, as its not a blind bug anymore.
delayed hopping channels by .2 seconds to give firmware time to get ready for hopping.
2024-02-04 17:41:41 +01:00
cca2ff2da4 Merge pull request #45 from wpa-2/patch-1
MOTD updated
2024-02-03 17:09:03 +01:00
78415b3137 Update 01-motd
Maybe a good idea to point people to the new wiki instead. 


Signed-off-by: wpa-2 <9049886+wpa-2@users.noreply.github.com>
2024-02-03 15:13:44 +00:00
34284aa1bc Change to seemoo-lab nexmon 2024-02-01 13:50:51 +01:00
56ebb60662 Change to seemoo-lab nexmon 2024-02-01 13:26:20 +01:00
84f6624844 Change to seemoo-lab nexmon 2024-02-01 13:04:06 +01:00
3bcbb0ce9a Version 2.8.1 2024-01-29 22:52:16 +01:00
e01e457992 Remove bettercap client settings, so you cannot mess it up. 2024-01-29 22:24:20 +01:00
1780859889 Merge pull request #37 from Ravioli5/patch-1
Update 01-motd
2024-01-29 16:15:12 +01:00
fdd98bb37a Update 01-motd
-fixed grammar (added a word)

Signed-off-by: Ravioli5 <157115073+Ravioli5@users.noreply.github.com>
2024-01-29 13:33:47 +05:30
86991304a5 Merge remote-tracking branch 'origin/dev' into dev 2024-01-28 22:12:20 +01:00
4f62759d6d Revert grid name 2024-01-28 22:12:06 +01:00
7b7ba02aad Changed setup.py 2024-01-28 22:12:06 +01:00
7040be2d30 Testing pcapng fileformat 2024-01-28 22:12:05 +01:00
d0617ccfaf Revert grid name 2024-01-28 22:08:17 +01:00
a0b5078b64 Changed setup.py 2024-01-28 22:05:14 +01:00
54c1ffd63c Updated wiglewifi version to 1.6 2024-01-28 22:02:57 +01:00
7530709d0c Updated wiglewifi version to 1.6 2024-01-28 21:46:50 +01:00
a9a6fd424b Small changes/fixes for debugging 2024-01-28 21:46:22 +01:00
8c97301992 Readability changes for webgpsmap.py 2024-01-28 21:45:53 +01:00
91eaa22188 Fix for waveshare2in13b_V4.py implementation 2024-01-28 21:44:19 +01:00
31a4af4c21 sudo pwnagotchi plugins update
`sudo pwnagotchi plugins list`

Do not work, somehow I forgot to remove a test I did.
2024-01-28 21:44:04 +01:00
dceeaff1fb Next update will be 2.8.0 2024-01-28 21:43:17 +01:00
c0241dc8df Update README.md 2024-01-27 16:11:59 +01:00
8f405f4ab2 Merge pull request #35 from Kal-Toh/patch-1
Update README.md
2024-01-27 16:11:19 +01:00
bd79e71563 Update README.md
This is a small change to address questions I had about the installation process.

Signed-off-by: Rory <104321806+Kal-Toh@users.noreply.github.com>
2024-01-27 14:03:40 +00:00
7f662585aa Merge pull request #34 from findingmoist/master
Update 01-motd
2024-01-27 10:03:24 +01:00
d23ff8d47a Update 01-motd
* Changed face so it shows
* updated python3 version so $_version shows the update number

Signed-off-by: findingmoist <128169791+findingmoist@users.noreply.github.com>
2024-01-26 18:56:40 -05:00
04435229fe Update build for RPi5 2024-01-26 15:28:04 +01:00
42e236bafe Update build for RPi5 2024-01-26 10:45:18 +01:00
5081b72695 Merge remote-tracking branch 'origin/master' 2024-01-25 23:48:49 +01:00
652740f050 Version 2.7.9
Add Esperanzo language
Updated Pt-Br language
Updated Italian language
2024-01-25 23:48:41 +01:00
1b6b12bdf5 Add Esperanzo language
Updated Pt-Br language
Updated Italian language
2024-01-25 23:48:06 +01:00
c610335a34 Add Esperanzo language
Edited Pt-Br language
2024-01-25 22:23:01 +01:00
6c39ed97dd Update build for Pi 5 users
Version 2.7.8
2024-01-25 21:38:04 +01:00
967f1663c6 Update build for Pi 5 users
Version 2.7.8
2024-01-25 17:51:15 +01:00
ffe1e90ccd Update build for Pi 5 users
Version 2.7.8
2024-01-25 17:49:17 +01:00
f2d2bcbfdf Update build for Pi 5 users
Version 2.7.8
2024-01-25 17:30:15 +01:00
bfc0795fb8 Update build for Pi 5 users
Version 2.7.8
2024-01-25 16:31:35 +01:00
1a55afd74a Update build for Pi 5 users
Version 2.7.8
2024-01-25 15:16:33 +01:00
1594e7c129 Update build for Pi 5 users
Version 2.7.8
2024-01-24 15:51:09 +01:00
a244e70a1c Update build for Pi 5 users
Version 2.7.8
2024-01-24 11:00:32 +01:00
d35d5d6c3c Update build for Pi 5 users
Version 2.7.8
2024-01-24 10:51:02 +01:00
7aacf9fb44 Update build for Pi 5 users
Version 2.7.8
2024-01-24 10:24:01 +01:00
dde6fa4c2a Update build for Pi 5 users 2024-01-24 01:47:23 +01:00
29 changed files with 362 additions and 288 deletions

21
.idea/deployment.xml generated
View File

@ -1,4 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="PublishConfigData" filePermissions="493" folderPermissions="493" remoteFilesAllowedToDisappearOnAutoupload="false" /> <component name="PublishConfigData" serverName="pwnagotchi" filePermissions="493" folderPermissions="493" remoteFilesAllowedToDisappearOnAutoupload="false" confirmBeforeUploading="false">
<option name="confirmBeforeUploading" value="false" />
<serverData>
<paths name="pwnagotchi">
<serverdata>
<mappings>
<mapping deploy="/usr/local/lib/python3.11/dist-packages/pwnagotchi" local="$PROJECT_DIR$/pwnagotchi" web="/" />
<mapping deploy="/usr/local/bin" local="$PROJECT_DIR$/bin" />
<mapping local="" />
</mappings>
<excludedPaths>
<excludedPath local="true" path="$PROJECT_DIR$/venv" />
<excludedPath local="true" path="$PROJECT_DIR$/pwnagotchi.egg-info" />
<excludedPath local="true" path="$PROJECT_DIR$/dist" />
<excludedPath local="true" path="$PROJECT_DIR$/builder/packer-builder-arm" />
</excludedPaths>
</serverdata>
</paths>
</serverData>
</component>
</project> </project>

View File

@ -7,9 +7,12 @@ It seems the Pi 5 is unable to run in monitor mode, will keep you updated on thi
If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.6.4) and make sure you download the `armhf` version. If you are using an older 32-bit version Raspberry Pi, ZeroWH, use this [fork](https://github.com/jayofelony/pwnagotchi-torch/releases/tag/v2.6.4) and make sure you download the `armhf` version.
--- ---
Download latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.7.3), and let it auto-update from here on out. Download the latest image file [here](https://github.com/jayofelony/pwnagotchi-bookworm/releases/tag/v2.7.9), and let it auto-update from here on out.
**Use RPi imager to flash, please don't flash a new user as this will mess with logs created.** **Use RPi imager to flash, please don't flash a new user as this will mess with logs created.**
- Select `Use Custom Image`
- Browse for the downloaded image file
- Select No under `Use OS Customization`
SSH credentials are `pi/raspberry`. SSH credentials are `pi/raspberry`.

View File

@ -1 +0,0 @@
hcxtools

View File

@ -50,6 +50,7 @@ def pwnagotchi_cli():
agent.mode = 'auto' agent.mode = 'auto'
agent.start() agent.start()
config = agent.config()
while True: while True:
try: try:
@ -59,6 +60,7 @@ def pwnagotchi_cli():
channels = agent.get_access_points_by_channel() channels = agent.get_access_points_by_channel()
# for each channel # for each channel
for ch, aps in channels: for ch, aps in channels:
time.sleep(0.2) # This is to make sure it doesn't error (https://github.com/seemoo-lab/nexmon/issues/596)
agent.set_channel(ch) agent.set_channel(ch)
if not agent.is_stale() and agent.any_activity(): if not agent.is_stale() and agent.any_activity():
@ -66,6 +68,9 @@ def pwnagotchi_cli():
# for each ap on this channel # for each ap on this channel
for ap in aps: for ap in aps:
if ap['mac'][:13].lower in config['main']['whitelist'] or ap['hostname'] in config['main']['whitelist']:
logging.info(f"Found your MAC address {ap['mac']} - {config['main']['whitelist']}")
continue
# send an association frame in order to get for a PMKID # send an association frame in order to get for a PMKID
agent.associate(ap) agent.associate(ap)
# deauth all client stations in order to get a full handshake # deauth all client stations in order to get a full handshake

View File

@ -1,8 +1,8 @@
#!/bin/sh #!/bin/sh
_hostname=$(hostname) _hostname=$(hostname)
_version=$(cut -d"'" -f2 < /usr/local/lib/python3.9/dist-packages/pwnagotchi/_version.py) _version=$(cut -d"'" -f2 < /usr/local/lib/python3.11/dist-packages/pwnagotchi/_version.py)
echo echo
echo "(◕‿‿◕) $_hostname" echo "(☉_☉ ) $_hostname"
echo echo
echo " Hi! I'm a pwnagotchi $_version, please take good care of me!" echo " Hi! I'm a pwnagotchi $_version, please take good care of me!"
echo " Here are some basic things you need to know to raise me properly!" echo " Here are some basic things you need to know to raise me properly!"
@ -30,4 +30,4 @@ echo
echo " You can restart me using" echo " You can restart me using"
echo " pwnkill" echo " pwnkill"
echo echo
echo " You learn more about me at https://pwnagotchi.ai/" echo " You can learn more about me at https://pwnagotchi.org/"

View File

@ -9,15 +9,6 @@ if is_crypted_mode; then
done done
fi 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 mon0
start_monitor_interface start_monitor_interface

View File

@ -13,14 +13,6 @@ blink_led() {
sleep 0.3 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 mod
reload_brcm() { reload_brcm() {
if ! modprobe -r brcmfmac; then if ! modprobe -r brcmfmac; then

View File

@ -74,6 +74,10 @@ build {
inline = ["chmod +x /usr/bin/*"] inline = ["chmod +x /usr/bin/*"]
} }
provisioner "shell" {
inline = ["dpkg --add-architecture armhf"]
}
provisioner "file" { provisioner "file" {
destination = "/etc/systemd/system/" destination = "/etc/systemd/system/"
sources = [ sources = [
@ -91,7 +95,11 @@ build {
inline = ["chmod +x /etc/update-motd.d/*"] inline = ["chmod +x /etc/update-motd.d/*"]
} }
provisioner "shell" { provisioner "shell" {
inline = ["apt-get -y --allow-releaseinfo-change update", "apt-get -y dist-upgrade", "apt-get install -y --no-install-recommends ansible"] inline = [
"apt-get -y --allow-releaseinfo-change update",
"apt-get -y dist-upgrade",
"apt-get install -y --no-install-recommends ansible"
]
} }
provisioner "ansible-local" { provisioner "ansible-local" {
command = "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION=${var.pwn_version} PWN_HOSTNAME=${var.pwn_hostname} ansible-playbook" command = "ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 PWN_VERSION=${var.pwn_version} PWN_HOSTNAME=${var.pwn_hostname} ansible-playbook"

View File

@ -6,8 +6,8 @@
vars: vars:
kernel: kernel:
min: "6.1" min: "6.1"
full: "6.1.0-rpi7-rpi-v8" full: "6.1.0-rpi8-rpi-v8"
full_pi5: "6.1.0-rpi7-rpi-2712" full_pi5: "6.1.0-rpi8-rpi-2712"
pwnagotchi: pwnagotchi:
hostname: "{{ lookup('env', 'PWN_HOSTNAME') | default('pwnagotchi', true) }}" hostname: "{{ lookup('env', 'PWN_HOSTNAME') | default('pwnagotchi', true) }}"
version: "{{ lookup('env', 'PWN_VERSION') | default('pwnagotchi-torch', true) }}" version: "{{ lookup('env', 'PWN_VERSION') | default('pwnagotchi-torch', true) }}"
@ -52,13 +52,20 @@
- libpcap0.8-dev_1.9.1-4_arm64.deb - libpcap0.8-dev_1.9.1-4_arm64.deb
- libpcap0.8_1.9.1-4_arm64.deb - libpcap0.8_1.9.1-4_arm64.deb
hold: hold:
- firmware-atheros
- firmware-brcm80211
- firmware-libertas
- firmware-misc-nonfree
- firmware-realtek
- libpcap-dev - libpcap-dev
- libpcap0.8 - libpcap0.8
- libpcap0.8-dev
- libpcap0.8-dbg - libpcap0.8-dbg
- libpcap0.8-dev
remove: remove:
- avahi-daemon - avahi-daemon
- dhpys-swapfile - dhpys-swapfile
- libcurl-ocaml-dev
- libssl-ocaml-dev
- nfs-common - nfs-common
- triggerhappy - triggerhappy
- wpasupplicant - wpasupplicant
@ -72,6 +79,11 @@
- curl - curl
- dkms - dkms
- fbi - fbi
- firmware-atheros
- firmware-brcm80211
- firmware-libertas
- firmware-misc-nonfree
- firmware-realtek
- flex - flex
- fonts-dejavu - fonts-dejavu
- fonts-dejavu-core - fonts-dejavu-core
@ -90,7 +102,9 @@
- libbz2-dev - libbz2-dev
- libc-ares-dev - libc-ares-dev
- libc6-dev - libc6-dev
- libc6:armhf
- libcap-dev - libcap-dev
- libcurl-ocaml-dev
- libdbus-1-dev - libdbus-1-dev
- libdbus-glib-1-dev - libdbus-glib-1-dev
- libeigen3-dev - libeigen3-dev
@ -103,7 +117,10 @@
- libgmp3-dev - libgmp3-dev
- libgstreamer1.0-0 - libgstreamer1.0-0
- libhdf5-dev - libhdf5-dev
- libisl23:armhf
- liblapack-dev - liblapack-dev
- libmpc3:armhf
- libmpfr6:armhf
- libncursesw5-dev - libncursesw5-dev
- libnetfilter-queue-dev - libnetfilter-queue-dev
- libopenblas-dev - libopenblas-dev
@ -117,34 +134,31 @@
- libraspberrypi0 - libraspberrypi0
- libsqlite3-dev - libsqlite3-dev
- libssl-dev - libssl-dev
- libssl-ocaml-dev
- libstdc++6:armhf
- libswscale5 - libswscale5
- libtiff6 - libtiff6
- libtool - libtool
- libusb-1.0-0-dev - libusb-1.0-0-dev
- lsof - lsof
- make - make
- python3-yaml
- python3-dbus - python3-dbus
- python3-flask - python3-flask
- python3-flask-cors - python3-flask-cors
- python3-flaskext.wtf - python3-flaskext.wtf
- python3-gast - python3-gast
- python3-pil - python3-pil
- python3-pip
- python3-pycryptodome - python3-pycryptodome
- python3-requests - python3-requests
- python3-scapy - python3-scapy
- python3-setuptools
- python3-smbus
- python3-smbus2 - python3-smbus2
- python3-spidev - python3-spidev
- python3-tweepy - python3-tweepy
- python3-werkzeug - python3-werkzeug
- firmware-atheros - python3-yaml
- firmware-brcm80211
- firmware-libertas
- firmware-misc-nonfree
- firmware-realtek
- python3-pip
- python3-setuptools
- python3-smbus
- qpdf - qpdf
- raspberrypi-kernel-headers - raspberrypi-kernel-headers
- rsync - rsync
@ -160,12 +174,9 @@
- xxd - xxd
- zlib1g-dev - zlib1g-dev
- zram-tools - zram-tools
environment:
ARCHFLAGS: "-arch aarch64"
QEMU_UNAME: "{{ kernel.full }}"
tasks: tasks:
# First we install and remove unnecessary packages # First we install packages
- name: install packages - name: install packages
apt: apt:
name: "{{ packages.apt.install }}" name: "{{ packages.apt.install }}"
@ -173,13 +184,6 @@
update_cache: yes update_cache: yes
install_recommends: false 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 # Now we set up /boot/firmware
- name: Create pi user - name: Create pi user
copy: copy:
@ -273,35 +277,129 @@
dest: /usr/local/lib/libpcap.so.0.8 dest: /usr/local/lib/libpcap.so.0.8
state: link state: link
# install latest hcxtools
- name: clone hcxtools
git:
repo: https://github.com/ZerBea/hcxtools.git
dest: /usr/local/src/hcxtools
- name: install hcxtools
shell: "make && make install"
args:
executable: /bin/bash
chdir: /usr/local/src/hcxtools
- name: remove hcxtools directory
file:
state: absent
path: /usr/local/src/hcxtools
# Install nexmon to fix wireless scanning (takes 2.5G of space) # Install nexmon to fix wireless scanning (takes 2.5G of space)
- name: symlink 1
file:
src: "/usr/lib/arm-linux-gnueabihf/libisl.so.23.2.0"
dest: "/usr/lib/arm-linux-gnueabihf/libisl.so.10"
state: link
- name: symlink 2
file:
src: "/usr/lib/arm-linux-gnueabihf/libmpfr.so.6.2.0"
dest: "/usr/lib/arm-linux-gnueabihf/libmpfr.so.4"
state: link
- name: clone nexmon repository - name: clone nexmon repository
git: git:
repo: https://github.com/DrSchottky/nexmon.git repo: https://github.com/seemoo-lab/nexmon.git
dest: /usr/local/src/nexmon dest: /usr/local/src/nexmon
- name: make firmware # FIRST WE BUILD DRIVER FOR RPi5
- name: make firmware, RPi5
shell: "source ./setup_env.sh && make" shell: "source ./setup_env.sh && make"
args: args:
executable: /bin/bash executable: /bin/bash
chdir: /usr/local/src/nexmon/ chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full_pi5 }}"
ARCHFLAGS: "-arch aarch64"
- name: make firmware patch (bcm43455c0) - name: make firmware patch (bcm43455c0), RPi5
shell: "source ./setup_env.sh && cd /usr/local/src/nexmon/patches/bcm43455c0/7_45_206/nexmon/ && make" shell: "source ./setup_env.sh && cd /usr/local/src/nexmon/patches/bcm43455c0/7_45_206/nexmon/ && make"
args: args:
executable: /bin/bash executable: /bin/bash
chdir: /usr/local/src/nexmon/ chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full_pi5 }}"
ARCHFLAGS: "-arch aarch64"
- name: install new firmware (bcm43455c0) - name: copy modified driver, RPi5
copy:
src: "/usr/local/src/nexmon/patches/driver/brcmfmac_{{ kernel.min }}.y-nexmon/brcmfmac.ko"
dest: "/usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko"
environment:
QEMU_UNAME: "{{ kernel.full_pi5 }}"
ARCHFLAGS: "-arch aarch64"
- name: Delete the modified driver, RPi5
file:
state: absent
path: '/usr/local/src/nexmon/patches/driver/brcmfmac_{{ kernel.min }}.y-nexmon/brcmfmac.ko'
- name: backup original driver, RPi5
command: "mv /usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz /usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz.orig"
- name: load brcmfmac drivers
command: "/sbin/depmod {{ kernel.full_pi5 }}"
environment:
QEMU_UNAME: "{{ kernel.full_pi5 }}"
- name: Delete nexmon content & directory
file:
state: absent
path: /usr/local/src/nexmon/
# NOW WE BUILD DRIVERS FOR RPi4, RPizero2w and RPi3
- name: clone nexmon repository
git:
repo: https://github.com/seemoo-lab/nexmon.git
dest: /usr/local/src/nexmon
- name: make firmware, RPi4
shell: "source ./setup_env.sh && make"
args:
executable: /bin/bash
chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full }}"
ARCHFLAGS: "-arch aarch64"
- name: make firmware patch (bcm43455c0), RPi4
shell: "source ./setup_env.sh && cd /usr/local/src/nexmon/patches/bcm43455c0/7_45_206/nexmon/ && make"
args:
executable: /bin/bash
chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full }}"
ARCHFLAGS: "-arch aarch64"
- name: install new firmware (bcm43455c0), RPi4 RPi5
copy: copy:
src: /usr/local/src/nexmon/patches/bcm43455c0/7_45_206/nexmon/brcmfmac43455-sdio.bin src: /usr/local/src/nexmon/patches/bcm43455c0/7_45_206/nexmon/brcmfmac43455-sdio.bin
dest: /usr/lib/firmware/brcm/brcmfmac43455-sdio.bin dest: /usr/lib/firmware/brcm/brcmfmac43455-sdio.bin
follow: true follow: true
# NOW WE BUILD DRIVERS FOR RPiZero2W, RPi 3
- name: make firmware patch (bcm43436b0) - name: make firmware patch (bcm43436b0)
shell: "source ./setup_env.sh && cd /usr/local/src/nexmon/patches/bcm43436b0/9_88_4_65/nexmon/ && make" shell: "source ./setup_env.sh && cd /usr/local/src/nexmon/patches/bcm43436b0/9_88_4_65/nexmon/ && make"
args: args:
executable: /bin/bash executable: /bin/bash
chdir: /usr/local/src/nexmon/ chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full }}"
ARCHFLAGS: "-arch aarch64"
- name: install new firmware (bcm43436b0) - name: install new firmware (bcm43436b0)
copy: copy:
@ -314,6 +412,17 @@
args: args:
executable: /bin/bash executable: /bin/bash
chdir: /usr/local/src/nexmon/ chdir: /usr/local/src/nexmon/
environment:
QEMU_UNAME: "{{ kernel.full }}"
ARCHFLAGS: "-arch aarch64"
- name: copy modified driver, RPi4
copy:
src: "/usr/local/src/nexmon/patches/driver/brcmfmac_{{ kernel.min }}.y-nexmon/brcmfmac.ko"
dest: "/usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko"
environment:
QEMU_UNAME: "{{ kernel.full }}"
ARCHFLAGS: "-arch aarch64"
- name: install new firmware (bcm43430a1) - name: install new firmware (bcm43430a1)
copy: copy:
@ -344,21 +453,10 @@
- name: backup original driver - name: backup original driver
command: "mv /usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz /usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz.orig" command: "mv /usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz /usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz.orig"
- name: backup original driver, RPi5 - name: load brcmfmac drivers
command: "mv /usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz /usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko.xz.orig" command: "/sbin/depmod {{ kernel.full }}"
environment:
- name: copy modified driver QEMU_UNAME: "{{ kernel.full }}"
copy:
src: "/usr/local/src/nexmon/patches/driver/brcmfmac_{{ kernel.min }}.y-nexmon/brcmfmac.ko"
dest: "/usr/lib/modules/{{ kernel.full }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko"
- name: copy modified driver, RPi5
copy:
src: "/usr/local/src/nexmon/patches/driver/brcmfmac_{{ kernel.min }}.y-nexmon/brcmfmac.ko"
dest: "/usr/lib/modules/{{ kernel.full_pi5 }}/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko"
- name : load brcmfmac drivers
command: "/sbin/depmod -a"
# To shrink the final image, remove the nexmon directory (takes 2.5G of space) post build and installation # To shrink the final image, remove the nexmon directory (takes 2.5G of space) post build and installation
- name: Delete nexmon content & directory - name: Delete nexmon content & directory
@ -567,11 +665,6 @@
group: pi group: pi
recurse: true recurse: true
- name: clean apt cache
apt:
autoclean: true
when: removed.changed
- name: remove pre-collected packages zip - name: remove pre-collected packages zip
file: file:
path: /root/go_pkgs.tgz path: /root/go_pkgs.tgz
@ -592,11 +685,6 @@
state: absent state: absent
path: /root/.cache/pip path: /root/.cache/pip
- name: remove dependencies that are no longer required
apt:
autoremove: yes
when: removed.changed
- name: remove ssh keys - name: remove ssh keys
file: file:
state: absent state: absent
@ -609,6 +697,24 @@
args: args:
executable: /bin/bash executable: /bin/bash
# Now we remove packages
- name: remove unnecessary apt packages
apt:
name: "{{ packages.apt.remove }}"
state: absent
purge: yes
register: removed
- name: remove dependencies that are no longer required
apt:
autoremove: yes
when: removed.changed
- name: clean apt cache
apt:
autoclean: true
when: removed.changed
handlers: handlers:
- name: reload systemd services - name: reload systemd services
systemd: systemd:

View File

@ -1 +1 @@
__version__ = '2.7.7' __version__ = '2.8.1'

View File

@ -21,17 +21,17 @@ RECOVERY_DATA_FILE = '/root/.pwnagotchi-recovery'
class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer): class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
def __init__(self, view, config, keypair): def __init__(self, view, config, keypair):
Client.__init__(self, config['bettercap']['hostname'], Client.__init__(self,
config['bettercap']['scheme'], "127.0.0.1" if "hostname" not in config['bettercap'] else config['bettercap']['hostname'],
config['bettercap']['port'], "http" if "scheme" not in config['bettercap'] else config['bettercap']['scheme'],
config['bettercap']['username'], 8081 if "port" not in config['bettercap'] else config['bettercap']['port'],
config['bettercap']['password']) "pwnagotchi" if "username" not in config['bettercap'] else config['bettercap']['username'],
"pwnagotchi" if "password" not in config['bettercap'] else config['bettercap']['password'])
Automata.__init__(self, config, view) Automata.__init__(self, config, view)
AsyncAdvertiser.__init__(self, config, view, keypair) AsyncAdvertiser.__init__(self, config, view, keypair)
AsyncTrainer.__init__(self, config) AsyncTrainer.__init__(self, config)
self._started_at = time.time() self._started_at = time.time()
self._filter = None if not config['main']['filter'] else re.compile(config['main']['filter'])
self._current_channel = 0 self._current_channel = 0
self._tot_aps = 0 self._tot_aps = 0
self._aps_on_channel = 0 self._aps_on_channel = 0
@ -164,11 +164,6 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
self.wait_for(recon_time, sleeping=False) self.wait_for(recon_time, sleeping=False)
def _filter_included(self, ap):
return self._filter is None or \
self._filter.match(ap['hostname']) is not None or \
self._filter.match(ap['mac']) is not None
def set_access_points(self, aps): def set_access_points(self, aps):
self._access_points = aps self._access_points = aps
plugins.on('wifi_update', self, aps) plugins.on('wifi_update', self, aps)
@ -184,12 +179,9 @@ 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: elif ap['hostname'] in whitelist or ap['mac'][:13].lower() in whitelist or ap['mac'].lower() in whitelist:
continue continue
elif ap['hostname'] not in whitelist \ else:
and ap['mac'].lower() not in whitelist \
and ap['mac'][:8].lower() not in whitelist:
if self._filter_included(ap):
aps.append(ap) aps.append(ap)
except Exception as e: except Exception as e:
logging.exception("Error while getting access points (%s)", e) logging.exception("Error while getting access points (%s)", e)
@ -433,7 +425,6 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
if self.is_stale(): 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 return
if throttle == -1 and "throttle_a" in self._config['personality']: if throttle == -1 and "throttle_a" in self._config['personality']:
throttle = self._config['personality']['throttle_a'] throttle = self._config['personality']['throttle_a']

View File

@ -198,11 +198,6 @@ ui.display.enabled = false
ui.display.rotation = 180 ui.display.rotation = 180
ui.display.type = "waveshare_4" ui.display.type = "waveshare_4"
bettercap.scheme = "http"
bettercap.hostname = "localhost"
bettercap.port = 8081
bettercap.username = "pwnagotchi"
bettercap.password = "pwnagotchi"
bettercap.handshakes = "/root/handshakes" bettercap.handshakes = "/root/handshakes"
bettercap.silence = [ bettercap.silence = [
"ble.device.new", "ble.device.new",

View File

@ -1,14 +1,13 @@
# SOME DESCRIPTIVE TITLE. # Pwnagotchi display English to Esperanto.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR MADE THIS IN YEAR 2024.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-16 21:10+0100\n" "POT-Creation-Date: 2024-01-25 23:40+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: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,218 +17,219 @@ 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 "Sal, mi estas Pwnagotchi! Komencante…"
msgid "New day, new hunt, new pwns!" msgid "New day, new hunt, new pwns!"
msgstr "" msgstr "Nova tago, nova ĉaso, nova wifi!"
msgid "Hack the Planet!" msgid "Hack the Planet!"
msgstr "" msgstr "Eniru la elektronikon!"
msgid "AI ready." msgid "AI ready."
msgstr "" msgstr "Mi pretas."
msgid "The neural network is ready." msgid "The neural network is ready."
msgstr "" msgstr "La elektronika reto estas preta."
msgid "Generating keys, do not turn off ..." msgid "Generating keys, do not turn off ..."
msgstr "" msgstr "Mi generas ŝlosilojn, ne malŝaltu min!"
#, 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 "Hej, kanalo {channel} disponeblas! Via alirpunkto dankos vin"
msgid "Reading last session logs ..." msgid "Reading last session logs ..."
msgstr "" msgstr "Legante protokolojn de antaŭa sesio…"
#, 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 "legi {lines_so_far} liniojn ĝis nun…"
msgid "I'm bored ..." msgid "I'm bored ..."
msgstr "" msgstr "Mi enuas…"
msgid "Let's go for a walk!" msgid "Let's go for a walk!"
msgstr "" msgstr "Ni iru promeni!"
msgid "This is the best day of my life!" msgid "This is the best day of my life!"
msgstr "" msgstr "Plej bona tago de mia vivo!"
msgid "Shitty day :/" msgid "Shitty day :/"
msgstr "" msgstr "Terura tago :/"
msgid "I'm extremely bored ..." msgid "I'm extremely bored ..."
msgstr "" msgstr "mi estas tre enuigita…"
msgid "I'm very sad ..." msgid "I'm very sad ..."
msgstr "" msgstr "Mi estas tre malĝoja…"
msgid "I'm sad" msgid "I'm sad"
msgstr "" msgstr "Mi estas malfeliĉa"
msgid "Leave me alone ..." msgid "Leave me alone ..."
msgstr "" msgstr "Lasu min sola…"
msgid "I'm mad at you!" msgid "I'm mad at you!"
msgstr "" msgstr "Mi koleras kontraŭ vi!"
msgid "I'm living the life!" msgid "I'm living the life!"
msgstr "" msgstr "Mi ĝuas la vivon!"
msgid "I pwn therefore I am." msgid "I pwn therefore I am."
msgstr "" msgstr "Mi eniras tial mi estas."
msgid "So many networks!!!" msgid "So many networks!!!"
msgstr "" msgstr "Tiom da ludiloj!"
msgid "I'm having so much fun!" msgid "I'm having so much fun!"
msgstr "" msgstr "Mi tre amuzas!"
msgid "My crime is that of curiosity ..." msgid "My crime is that of curiosity ..."
msgstr "" msgstr "Scivolemo estas mia krimo…"
#, python-brace-format #, python-brace-format
msgid "Hello {name}! Nice to meet you." msgid "Hello {name}! Nice to meet you."
msgstr "" msgstr "Sal {name}! Mi ĝojas renkonti vin."
#, python-brace-format #, python-brace-format
msgid "Yo {name}! Sup?" msgid "Yo {name}! Sup?"
msgstr "" msgstr "Hej {name}! Sal?"
#, python-brace-format #, python-brace-format
msgid "Hey {name} how are you doing?" msgid "Hey {name} how are you doing?"
msgstr "" msgstr "Sal {name}! Kiel vi fartas?"
#, python-brace-format #, python-brace-format
msgid "Unit {name} is nearby!" msgid "Unit {name} is nearby!"
msgstr "" msgstr "Iu estas proksime! Ĝia nomo estas {name}."
#, python-brace-format #, python-brace-format
msgid "Uhm ... goodbye {name}" msgid "Uhm ... goodbye {name}"
msgstr "" msgstr "Adiaŭ {name}"
#, python-brace-format #, python-brace-format
msgid "{name} is gone ..." msgid "{name} is gone ..."
msgstr "" msgstr "{name} malaperis…"
#, python-brace-format #, python-brace-format
msgid "Whoops ... {name} is gone." msgid "Whoops ... {name} is gone."
msgstr "" msgstr "Hups… {name} malaperis…"
#, python-brace-format #, python-brace-format
msgid "{name} missed!" msgid "{name} missed!"
msgstr "" msgstr "{name} mankis!"
msgid "Missed!" msgid "Missed!"
msgstr "" msgstr "Maltrafis!"
msgid "Good friends are a blessing!" msgid "Good friends are a blessing!"
msgstr "" msgstr "Bonaj amikoj estas beno!"
msgid "I love my friends!" msgid "I love my friends!"
msgstr "" msgstr "Mi amas miajn amikojn!"
msgid "Nobody wants to play with me ..." msgid "Nobody wants to play with me ..."
msgstr "" msgstr "Neniu volas ludi kun mi..."
msgid "I feel so alone ..." msgid "I feel so alone ..."
msgstr "" msgstr "Mi estas tiel sola..."
msgid "Where's everybody?!" msgid "Where's everybody?!"
msgstr "" msgstr "KIE ĈIUJ ESTAS?!"
#, python-brace-format #, python-brace-format
msgid "Napping for {secs}s ..." msgid "Napping for {secs}s ..."
msgstr "" msgstr "Dormeto por {sec}j…"
msgid "Zzzzz" msgid "Zzzzz"
msgstr "" msgstr "Zzzzz"
#, python-brace-format #, python-brace-format
msgid "ZzzZzzz ({secs}s)" msgid "ZzzZzzz ({secs}s)"
msgstr "" msgstr "ZzzZzzz ({sec}j)"
msgid "Good night." msgid "Good night."
msgstr "" msgstr "Bonan nokton"
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 "Atendas {sec}j…"
#, python-brace-format #, python-brace-format
msgid "Looking around ({secs}s)" msgid "Looking around ({secs}s)"
msgstr "" msgstr "Ĉirkaŭrigardante ({sec}j)"
#, python-brace-format #, python-brace-format
msgid "Hey {what} let's be friends!" msgid "Hey {what} let's be friends!"
msgstr "" msgstr "Hej {what}, ni estu amikoj!"
#, python-brace-format #, python-brace-format
msgid "Associating to {what}" msgid "Associating to {what}"
msgstr "" msgstr "asociante al {what}"
#, python-brace-format #, python-brace-format
msgid "Yo {what}!" msgid "Yo {what}!"
msgstr "" msgstr "Hej {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 "Ĵus decidis, ke {mac} ne bezonas konekton!"
#, python-brace-format #, python-brace-format
msgid "Deauthenticating {mac}" msgid "Deauthenticating {mac}"
msgstr "" msgstr "Malaŭtentigi {mac}"
#, python-brace-format #, python-brace-format
msgid "Kickbanning {mac}!" msgid "Kickbanning {mac}!"
msgstr "" msgstr "Forigante {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 "Mirinda, ni havas {num} novajn manpremojn!"
#, python-brace-format #, python-brace-format
msgid "You have {count} new message{plural}!" msgid "You have {count} new message{plural}!"
msgstr "" msgstr "Vi nun havas {num} novajn mesaĝojn"
msgid "Oops, something went wrong ... Rebooting ..." msgid "Oops, something went wrong ... Rebooting ..."
msgstr "" msgstr "Lo okazis... Rekomencante…"
#, python-brace-format #, python-brace-format
msgid "Uploading data to {to} ..." msgid "Uploading data to {to} ..."
msgstr "" msgstr "alŝuti datumojn al {to}…"
#, python-brace-format #, python-brace-format
msgid "Downloading from {name} ..." msgid "Downloading from {name} ..."
msgstr "" msgstr "Elŝutu de {name}…"
#, python-brace-format #, fuzzy, python-brace-format
msgid "Kicked {num} stations\n" msgid "Kicked {num} stations\n"
msgstr "" msgstr "Forigita de {num} stacioj"
#, fuzzy
msgid "Made >999 new friends\n" msgid "Made >999 new friends\n"
msgstr "" msgstr "Faris pli ol 999 novajn amikojn!"
#, python-brace-format #, fuzzy, python-brace-format
msgid "Made {num} new friends\n" msgid "Made {num} new friends\n"
msgstr "" msgstr "faris (nombro) novajn amikojn"
#, python-brace-format #, fuzzy, python-brace-format
msgid "Got {num} handshakes\n" msgid "Got {num} handshakes\n"
msgstr "" msgstr "Ricevis {num} novajn manpremojn"
msgid "Met 1 peer" msgid "Met 1 peer"
msgstr "" msgstr "Renkontita unu kolego"
#, python-brace-format #, python-brace-format
msgid "Met {num} peers" msgid "Met {num} peers"
msgstr "" msgstr "renkontitajn {num} kolegojn"
#, python-brace-format #, python-brace-format
msgid "" msgid ""
@ -237,21 +237,24 @@ msgid ""
"{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 ""
"Mi pwning dum {duration} kaj piedbatis {deauthed} klientojn!Mi ankaŭ "
"renkontis {associated} novajn amikojn kaj manĝis {handshakes} manpremojn!"
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
msgid "hours" msgid "hours"
msgstr "" msgstr "horror"
msgid "minutes" msgid "minutes"
msgstr "" msgstr "minutoj"
msgid "seconds" msgid "seconds"
msgstr "" msgstr "sekundoj"
msgid "hour" msgid "hour"
msgstr "" msgstr "horo"
msgid "minute" msgid "minute"
msgstr "" msgstr "minuto"
msgid "second" msgid "second"
msgstr "" msgstr "dua"

View File

@ -16,7 +16,7 @@ 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 "Ciao! Piacere Pwnagotchi! Caricamento ..." msgstr "Ciao! Piacere Pwnagotchi! Caricamento ..."
@ -25,7 +25,7 @@ msgid "New day, new hunt, new pwns!"
msgstr "Nuovo giorno...nuovi handshakes!!!" msgstr "Nuovo giorno...nuovi handshakes!!!"
msgid "Hack the Planet!" msgid "Hack the Planet!"
msgstr "" msgstr "Hack il Pianeta"
msgid "AI ready." msgid "AI ready."
msgstr "IA pronta." msgstr "IA pronta."
@ -34,18 +34,18 @@ msgid "The neural network is ready."
msgstr "La rete neurale è pronta." msgstr "La rete neurale è pronta."
msgid "Generating keys, do not turn off ..." msgid "Generating keys, do not turn off ..."
msgstr "" msgstr "Generazione di chiavi, non spegnere"
#, 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 "Hey, il canale {channel} è libero! Il tuo AP ringrazia." msgstr "Hey, il canale {channel} è libero! Il tuo AP ringrazia."
msgid "Reading last session logs ..." msgid "Reading last session logs ..."
msgstr "" msgstr "Lettura dei log dell'ultima sessione ..."
#, 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 "Leggi le righe di log {lines_so_far} finora ..."
msgid "I'm bored ..." msgid "I'm bored ..."
msgstr "Che noia ..." msgstr "Che noia ..."
@ -54,7 +54,7 @@ msgid "Let's go for a walk!"
msgstr "Andiamo a fare una passeggiata!" msgstr "Andiamo a fare una passeggiata!"
msgid "This is the best day of my life!" msgid "This is the best day of my life!"
msgstr "Questo è il più bel giorno della mia vita!!!!" msgstr "Questo e il miglior giorno della mia vita!!!!"
msgid "Shitty day :/" msgid "Shitty day :/"
msgstr "Giorno di merda :/" msgstr "Giorno di merda :/"
@ -72,22 +72,22 @@ msgid "Leave me alone ..."
msgstr "Mi sento così solo..." msgstr "Mi sento così solo..."
msgid "I'm mad at you!" msgid "I'm mad at you!"
msgstr "" msgstr "sono arabiata con te"
msgid "I'm living the life!" msgid "I'm living the life!"
msgstr "Mi sento vivo!" msgstr "sono viva la vita!"
msgid "I pwn therefore I am." msgid "I pwn therefore I am."
msgstr "Pwn ergo sum." msgstr "Pwn ergo sum."
msgid "So many networks!!!" msgid "So many networks!!!"
msgstr "Qui è pieno di reti!" msgstr "Qui pieno di reti!"
msgid "I'm having so much fun!" msgid "I'm having so much fun!"
msgstr "Mi sto divertendo tantissimo!" msgstr "Mi sto divertendo tantissimo!"
msgid "My crime is that of curiosity ..." msgid "My crime is that of curiosity ..."
msgstr "" msgstr "Il mio crimine ? quello della curiosit?"
#, python-brace-format #, python-brace-format
msgid "Hello {name}! Nice to meet you." msgid "Hello {name}! Nice to meet you."
@ -95,15 +95,15 @@ msgstr "Ciao {name}! E' un piacere."
#, python-brace-format #, python-brace-format
msgid "Yo {name}! Sup?" msgid "Yo {name}! Sup?"
msgstr "" msgstr "Yo {name} Come va"
#, python-brace-format #, python-brace-format
msgid "Hey {name} how are you doing?" msgid "Hey {name} how are you doing?"
msgstr "" msgstr "Ehi {name} come stai?"
#, python-brace-format #, python-brace-format
msgid "Unit {name} is nearby!" msgid "Unit {name} is nearby!"
msgstr "L'Unità {name} è vicina!" msgstr "L'Unit {name} e vicina!"
#, python-brace-format #, python-brace-format
msgid "Uhm ... goodbye {name}" msgid "Uhm ... goodbye {name}"
@ -111,30 +111,30 @@ msgstr "Uhm ... addio {name}, mi mancherai..."
#, python-brace-format #, python-brace-format
msgid "{name} is gone ..." msgid "{name} is gone ..."
msgstr "{name} se n'è andato ..." msgstr "{name} se andato ..."
#, python-brace-format #, python-brace-format
msgid "Whoops ... {name} is gone." msgid "Whoops ... {name} is gone."
msgstr "Whoops ...{name} se n'è andato." msgstr "Whoops ...{name} se andato."
#, python-brace-format #, python-brace-format
msgid "{name} missed!" msgid "{name} missed!"
msgstr "{name} è scomparso..." msgstr "{name} scomparso..."
msgid "Missed!" msgid "Missed!"
msgstr "Ehi! Dove sei andato!?" msgstr "Ehi! Dove sei andato!?"
msgid "Good friends are a blessing!" msgid "Good friends are a blessing!"
msgstr "" msgstr "Buoni amici sono una benedizione"
msgid "I love my friends!" msgid "I love my friends!"
msgstr "" msgstr "Amo i miei amici"
msgid "Nobody wants to play with me ..." msgid "Nobody wants to play with me ..."
msgstr "Nessuno vuole giocare con me..." msgstr "Nessuno vuole giocare con me..."
msgid "I feel so alone ..." msgid "I feel so alone ..."
msgstr "Mi sento così solo..." msgstr "Mi sento cos solo..."
msgid "Where's everybody?!" msgid "Where's everybody?!"
msgstr "Dove sono tutti?!" msgstr "Dove sono tutti?!"
@ -144,17 +144,17 @@ msgid "Napping for {secs}s ..."
msgstr "Schiaccio un pisolino per {secs}s ..." msgstr "Schiaccio un pisolino per {secs}s ..."
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 "Buona notte"
msgid "Zzz" msgid "Zzz"
msgstr "" msgstr "Zzz"
#, python-brace-format #, python-brace-format
msgid "Waiting for {secs}s ..." msgid "Waiting for {secs}s ..."
@ -182,7 +182,7 @@ msgstr "Ho appena deciso che {mac} non necessita di WiFi!"
#, python-brace-format #, python-brace-format
msgid "Deauthenticating {mac}" msgid "Deauthenticating {mac}"
msgstr "" msgstr "Annullamento dell'autenticazione {mac}"
#, python-brace-format #, python-brace-format
msgid "Kickbanning {mac}!" msgid "Kickbanning {mac}!"
@ -201,11 +201,11 @@ msgstr "Ops, qualcosa è andato storto ... Riavvio ..."
#, python-brace-format #, python-brace-format
msgid "Uploading data to {to} ..." msgid "Uploading data to {to} ..."
msgstr "" msgstr "Caricamento dei dati in {to}"
#, python-brace-format #, python-brace-format
msgid "Downloading from {name} ..." msgid "Downloading from {name} ..."
msgstr "" msgstr "Scaricamento da {name} ..."
#, python-brace-format #, python-brace-format
msgid "Kicked {num} stations\n" msgid "Kicked {num} stations\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: Portuguese (Brazil)\n" "Language: Portuguese (Brazil)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
msgid "ZzzzZZzzzzZzzz" msgid "ZzzzZZzzzzZzzz"

View File

@ -3,12 +3,12 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
#, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-17 15:46+0100\n" "POT-Creation-Date: 2024-01-25 23:40+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: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@ -19,6 +19,10 @@ class AircrackOnly(plugins.Plugin):
def __init__(self): def __init__(self):
self.text_to_set = "" self.text_to_set = ""
self.options = dict()
def on_ready(self):
return
def on_loaded(self): def on_loaded(self):
logging.info("aircrackonly plugin loaded") logging.info("aircrackonly plugin loaded")

View File

@ -130,7 +130,7 @@ def install(display, update):
source_path = "%s-%s" % (source_path, update['available']) source_path = "%s-%s" % (source_path, update['available'])
# setup.py is going to install data files for us # setup.py is going to install data files for us
os.system("cd %s && pip3 install . --no-cache-dir --break-system-packages" % source_path) os.system("cd %s && pip3 install . --break-system-packages" % source_path)
return True return True

View File

@ -27,10 +27,9 @@ class FixServices(plugins.Plugin):
def __init__(self): def __init__(self):
self.options = dict() self.options = dict()
self.pattern = re.compile(r'brcmf_cfg80211_nexmon_set_channel.*?Set Channel failed') self.pattern1 = re.compile(r'wifi error while hopping to channel')
self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern2 = re.compile(r'Firmware has halted or crashed')
self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern3 = re.compile(r'error 400: could not find interface wlan0mon')
self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon')
self.isReloadingMon = False self.isReloadingMon = False
self.connection = None self.connection = None
self.LASTTRY = 0 self.LASTTRY = 0
@ -46,22 +45,10 @@ class FixServices(plugins.Plugin):
last_lines = self.get_last_lines('journalctl', ['-n10', '-k'], 10) last_lines = self.get_last_lines('journalctl', ['-n10', '-k'], 10)
try: try:
cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True) cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True)
logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output)) logging.debug("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output))
if ",UP," in str(cmd_output): if ",UP," in str(cmd_output):
logging.info("wlan0mon is up.") logging.info("wlan0mon is up.")
if len(self.pattern.findall(last_lines)) >= 3:
if hasattr(agent, 'view'):
display = agent.view()
display.set('status', 'Blind-Bug detected. Restarting.')
display.update(force=True)
logging.info('[Fix_Services] Blind-Bug detected. Restarting.')
try:
self._tryTurningItOffAndOnAgain(agent)
except Exception as err:
logging.warning("[Fix_Services turnOffAndOn] %s" % repr(err))
else:
logging.info("[Fix_Services] Logs look good!") logging.info("[Fix_Services] Logs look good!")
except Exception as err: except Exception as err:
@ -121,21 +108,8 @@ class FixServices(plugins.Plugin):
logging.debug("[Fix_Services]**** checking") logging.debug("[Fix_Services]**** checking")
# Look for pattern 1 # Look for pattern 1
if len(self.pattern.findall(last_lines)) >= 3: if len(self.pattern1.findall(other_last_lines)) >= 5:
logging.info("[Fix_Services]**** Should trigger a reload of the wlan0mon device:\n%s" % last_lines) logging.debug("[Fix_Services]**** Should trigger a reload of the wlan0mon device:\n%s" % last_lines)
if hasattr(agent, 'view'):
display = agent.view()
display.set('status', 'Blind-Bug detected. Restarting.')
display.update(force=True)
logging.info('[Fix_Services] Blind-Bug detected. Restarting.')
try:
self._tryTurningItOffAndOnAgain(agent)
except Exception as err:
logging.warning("[Fix_Services] TTOAOA: %s" % repr(err))
# Look for pattern 2
elif len(self.pattern2.findall(other_last_lines)) >= 5:
logging.info("[Fix_Services]**** Should trigger a reload of the wlan0mon device:\n%s" % last_lines)
if hasattr(agent, 'view'): if hasattr(agent, 'view'):
display = agent.view() display = agent.view()
display.set('status', 'Wifi channel stuck. Restarting recon.') display.set('status', 'Wifi channel stuck. Restarting recon.')
@ -157,8 +131,8 @@ class FixServices(plugins.Plugin):
except Exception as err: except Exception as err:
logging.error("[Fix_Services wifi.recon flip] %s" % repr(err)) logging.error("[Fix_Services wifi.recon flip] %s" % repr(err))
# Look for pattern 3 # Look for pattern 2
elif len(self.pattern3.findall(other_last_lines)) >= 1: elif len(self.pattern2.findall(other_last_lines)) >= 1:
logging.info("[Fix_Services] Firmware has halted or crashed. Restarting wlan0mon.") logging.info("[Fix_Services] Firmware has halted or crashed. Restarting wlan0mon.")
if hasattr(agent, 'view'): if hasattr(agent, 'view'):
display = agent.view() display = agent.view()
@ -167,12 +141,12 @@ class FixServices(plugins.Plugin):
try: try:
# Run the monstart command to restart wlan0mon # Run the monstart command to restart wlan0mon
cmd_output = subprocess.check_output("monstart", shell=True) cmd_output = subprocess.check_output("monstart", shell=True)
logging.info("[Fix_Services monstart]: %s" % repr(cmd_output)) logging.debug("[Fix_Services monstart]: %s" % repr(cmd_output))
except Exception as err: except Exception as err:
logging.error("[Fix_Services monstart]: %s" % repr(err)) logging.error("[Fix_Services monstart]: %s" % repr(err))
# Look for pattern 4 # Look for pattern 3
elif len(self.pattern4.findall(other_other_last_lines)) >= 3: elif len(self.pattern3.findall(other_other_last_lines)) >= 3:
logging.info("[Fix_Services] wlan0 is down!") logging.info("[Fix_Services] wlan0 is down!")
if hasattr(agent, 'view'): if hasattr(agent, 'view'):
display = agent.view() display = agent.view()
@ -181,7 +155,7 @@ class FixServices(plugins.Plugin):
try: try:
# Run the monstart command to restart wlan0mon # Run the monstart command to restart wlan0mon
cmd_output = subprocess.check_output("monstart", shell=True) cmd_output = subprocess.check_output("monstart", shell=True)
logging.info("[Fix_Services monstart]: %s" % repr(cmd_output)) logging.debug("[Fix_Services monstart]: %s" % repr(cmd_output))
except Exception as err: except Exception as err:
logging.error("[Fix_Services monstart]: %s" % repr(err)) logging.error("[Fix_Services monstart]: %s" % repr(err))
@ -237,7 +211,7 @@ class FixServices(plugins.Plugin):
# is it up? # is it up?
try: try:
cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True) cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True)
logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output)) logging.debug("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output))
if ",UP," in str(cmd_output): if ",UP," in str(cmd_output):
logging.info("wlan0mon is up. Skip reset?") logging.info("wlan0mon is up. Skip reset?")
# not reliable, so don't skip just yet # not reliable, so don't skip just yet
@ -309,11 +283,9 @@ class FixServices(plugins.Plugin):
# stop looping and get back to recon # stop looping and get back to recon
break break
else: else:
logging.info( logging.debug("[Fix_Services set wifi.interfaceface wlan0mon] failed? %s" % repr(result))
"[Fix_Services set wifi.interfaceface wlan0mon] failed? %s" % repr(result))
except Exception as err: except Exception as err:
logging.info( logging.debug("[Fix_Services set wifi.interface wlan0mon] except: %s" % repr(err))
"[Fix_Services set wifi.interface wlan0mon] except: %s" % repr(err))
except Exception as cerr: # except Exception as cerr: #
if not display: if not display:
print("failed loading wlan0mon attempt #%s: %s" % (tries, repr(cerr))) print("failed loading wlan0mon attempt #%s: %s" % (tries, repr(cerr)))
@ -362,7 +334,7 @@ class FixServices(plugins.Plugin):
"face": faces.HAPPY}) "face": faces.HAPPY})
else: else:
print("I can see again") print("I can see again")
logging.info("[Fix_Services] wifi.recon on") logging.debug("[Fix_Services] wifi.recon on")
self.LASTTRY = time.time() + 120 # 2-minute pause until next time. self.LASTTRY = time.time() + 120 # 2-minute pause until next time.
else: else:
logging.error("[Fix_Services] wifi.recon did not start up") logging.error("[Fix_Services] wifi.recon did not start up")
@ -378,7 +350,7 @@ class FixServices(plugins.Plugin):
try: try:
logging.info("[Fix_Services] unloaded") logging.info("[Fix_Services] unloaded")
except Exception as err: except Exception as err:
logging.info("[Fix_Services] unload err %s " % repr(err)) logging.error("[Fix_Services] unload err %s " % repr(err))
pass pass

View File

@ -20,6 +20,7 @@ class GPS(plugins.Plugin):
def __init__(self): def __init__(self):
self.running = False self.running = False
self.coordinates = None self.coordinates = None
self.options = dict()
def on_loaded(self): def on_loaded(self):
logging.info(f"gps plugin loaded for {self.options['device']}") logging.info(f"gps plugin loaded for {self.options['device']}")

View File

@ -117,7 +117,6 @@ class NetPos(plugins.Plugin):
except OSError as os_e: except OSError as os_e:
logging.error("NET-POS: %s", os_e) logging.error("NET-POS: %s", os_e)
def _get_netpos(self, agent): def _get_netpos(self, agent):
aps = agent.get_access_points() aps = agent.get_access_points()
netpos = dict() netpos = dict()

View File

@ -1,9 +1,10 @@
import sys
import pwnagotchi.plugins as plugins import pwnagotchi.plugins as plugins
import logging import logging
import os import os
import json import json
import re import re
import datetime
from flask import Response from flask import Response
from functools import lru_cache from functools import lru_cache
from dateutil.parser import parse from dateutil.parser import parse
@ -22,6 +23,7 @@ from dateutil.parser import parse
''' '''
class Webgpsmap(plugins.Plugin): class Webgpsmap(plugins.Plugin):
__author__ = 'https://github.com/xenDE and https://github.com/dadav' __author__ = 'https://github.com/xenDE and https://github.com/dadav'
__version__ = '1.4.0' __version__ = '1.4.0'
@ -103,7 +105,7 @@ class Webgpsmap(plugins.Plugin):
response_status = 200 response_status = 200
response_mimetype = "application/xhtml+xml" response_mimetype = "application/xhtml+xml"
response_header_contenttype = 'text/html' response_header_contenttype = 'text/html'
response_header_contentdisposition = 'attachment; filename=webgpsmap.html'; response_header_contentdisposition = 'attachment; filename=webgpsmap.html'
except Exception as error: except Exception as error:
logging.error(f"[webgpsmap] on_webhook offlinemap: error: {error}") logging.error(f"[webgpsmap] on_webhook offlinemap: error: {error}")
return return
@ -149,7 +151,6 @@ class Webgpsmap(plugins.Plugin):
def _get_pos_from_file(self, path): def _get_pos_from_file(self, path):
return PositionFile(path) return PositionFile(path)
def load_gps_from_dir(self, gpsdir, newest_only=False): def load_gps_from_dir(self, gpsdir, newest_only=False):
""" """
Parses the gps-data from disk Parses the gps-data from disk
@ -160,13 +161,9 @@ class Webgpsmap(plugins.Plugin):
logging.info(f"[webgpsmap] scanning {handshake_dir}") logging.info(f"[webgpsmap] scanning {handshake_dir}")
all_files = os.listdir(handshake_dir) all_files = os.listdir(handshake_dir)
#print(all_files) # print(all_files)
all_pcap_files = [os.path.join(handshake_dir, filename) all_pcap_files = [os.path.join(handshake_dir, filename) for filename in all_files if filename.endswith('.pcap')]
for filename in all_files
if filename.endswith('.pcap')
]
all_geo_or_gps_files = [] all_geo_or_gps_files = []
for filename_pcap in all_pcap_files: for filename_pcap in all_pcap_files:
filename_base = filename_pcap[:-5] # remove ".pcap" filename_base = filename_pcap[:-5] # remove ".pcap"
@ -300,7 +297,6 @@ class PositionFile:
return parsed_ssid.groups()[0] return parsed_ssid.groups()[0]
return None return None
def json(self): def json(self):
""" """
returns the parsed json returns the parsed json

View File

@ -52,10 +52,10 @@ def _transform_wigle_entry(gps_data, pcap_data, plugin_version):
""" """
dummy = StringIO() dummy = StringIO()
# write kismet header # write kismet header
dummy.write(f"WigleWifi-1.4,appRelease={plugin_version},model=pwnagotchi,release={__pwnagotchi_version__}," dummy.write(f"WigleWifi-1.6,appRelease={plugin_version},model=pwnagotchi,release={__pwnagotchi_version__},"
f"device={pwnagotchi.name()},display=kismet,board=RaspberryPi,brand=pwnagotchi\n") f"device={pwnagotchi.name()},display=kismet,board=RaspberryPi,brand=pwnagotchi,star=Sol,body=3,subBody=0\n")
dummy.write("MAC,SSID,AuthMode,FirstSeen,Channel,RSSI,CurrentLatitude," dummy.write(
"CurrentLongitude,AltitudeMeters,AccuracyMeters,Type\n") "MAC,SSID,AuthMode,FirstSeen,Channel,RSSI,CurrentLatitude,CurrentLongitude,AltitudeMeters,AccuracyMeters,Type\n")
writer = csv.writer(dummy, delimiter=",", quoting=csv.QUOTE_NONE, escapechar="\\") writer = csv.writer(dummy, delimiter=",", quoting=csv.QUOTE_NONE, escapechar="\\")
writer.writerow([ writer.writerow([
@ -89,7 +89,7 @@ def _send_to_wigle(lines, api_key, donate=True, timeout=30):
headers = {'Authorization': f"Basic {api_key}", headers = {'Authorization': f"Basic {api_key}",
'Accept': 'application/json'} 'Accept': 'application/json'}
data = {'donate': 'on' if donate else 'false'} data = {'donate': 'on' if donate else 'false'}
payload = {'file': (pwnagotchi.name()+".csv", dummy), 'type': 'multipart/form-data'} payload = {'file': (pwnagotchi.name() + ".csv", dummy, 'multipart/form-data', {'Expires': '0'})}
try: try:
res = requests.post('https://api.wigle.net/api/v2/file/upload', res = requests.post('https://api.wigle.net/api/v2/file/upload',
data=data, data=data,
@ -104,10 +104,10 @@ def _send_to_wigle(lines, api_key, donate=True, timeout=30):
class Wigle(plugins.Plugin): class Wigle(plugins.Plugin):
__author__ = 'Dadav and fixed by Jayofelony' __author__ = "Dadav and updated by Jayofelony"
__version__ = '3.0.0' __version__ = "3.0.1"
__license__ = 'GPL3' __license__ = "GPL3"
__description__ = 'This plugin automatically uploads collected wifis to wigle.net' __description__ = "This plugin automatically uploads collected WiFi to wigle.net"
def __init__(self): def __init__(self):
self.ready = False self.ready = False
@ -121,15 +121,15 @@ class Wigle(plugins.Plugin):
logging.debug("WIGLE: api_key isn't set. Can't upload to wigle.net") logging.debug("WIGLE: api_key isn't set. Can't upload to wigle.net")
return return
if not 'donate' in self.options: if 'donate' not in self.options:
self.options['donate'] = True self.options['donate'] = False
self.ready = True self.ready = True
logging.info("WIGLE: ready") logging.info("WIGLE: ready")
def on_internet_available(self, agent): def on_internet_available(self, agent):
""" """
Called in manual mode when there's internet connectivity Called when there's internet connectivity
""" """
if not self.ready or self.lock.locked(): if not self.ready or self.lock.locked():
return return
@ -143,7 +143,7 @@ class Wigle(plugins.Plugin):
all_files = os.listdir(handshake_dir) all_files = os.listdir(handshake_dir)
all_gps_files = [os.path.join(handshake_dir, filename) all_gps_files = [os.path.join(handshake_dir, filename)
for filename in all_files for filename in all_files
if filename.endswith('.gps.json') or filename.endswith('.paw-gps.json') or filename.endswith('.geo.json')] if filename.endswith('.gps.json') or filename.endswith('.geo.json')]
all_gps_files = remove_whitelisted(all_gps_files, config['main']['whitelist']) all_gps_files = remove_whitelisted(all_gps_files, config['main']['whitelist'])
new_gps_files = set(all_gps_files) - set(reported) - set(self.skip) new_gps_files = set(all_gps_files) - set(reported) - set(self.skip)
@ -154,8 +154,6 @@ class Wigle(plugins.Plugin):
for gps_file in new_gps_files: for gps_file in new_gps_files:
if gps_file.endswith('.gps.json'): if gps_file.endswith('.gps.json'):
pcap_filename = gps_file.replace('.gps.json', '.pcap') pcap_filename = gps_file.replace('.gps.json', '.pcap')
if gps_file.endswith('.paw-gps.json'):
pcap_filename = gps_file.replace('.paw-gps.json', '.pcap')
if gps_file.endswith('.geo.json'): if gps_file.endswith('.geo.json'):
pcap_filename = gps_file.replace('.geo.json', '.pcap') pcap_filename = gps_file.replace('.geo.json', '.pcap')
if not os.path.exists(pcap_filename): if not os.path.exists(pcap_filename):

View File

@ -7,7 +7,7 @@ from PIL import Image
class Waveshare213bV4(DisplayImpl): class Waveshare213bV4(DisplayImpl):
def __init__(self, config): def __init__(self, config):
super(Waveshare213bV4, self).__init__(config, 'waveshare213inb_v4') super(Waveshare213bV4, self).__init__(config, 'waveshare2in13b_v4')
def layout(self): def layout(self):
if self.config['color'] == 'black': if self.config['color'] == 'black':

View File

@ -153,8 +153,7 @@ class View(object):
self.set('uptime', last_session.duration) self.set('uptime', last_session.duration)
self.set('channel', '-') self.set('channel', '-')
self.set('aps', "%d" % last_session.associated) self.set('aps', "%d" % last_session.associated)
self.set('shakes', '%d (%s)' % (last_session.handshakes, \ self.set('shakes', '%d (%s)' % (last_session.handshakes, utils.total_unique_handshakes(self._config['bettercap']['handshakes'])))
utils.total_unique_handshakes(self._config['bettercap']['handshakes'])))
self.set_closest_peer(last_session.last_peer, last_session.peers) self.set_closest_peer(last_session.last_peer, last_session.peers)
self.update() self.update()

View File

@ -30,13 +30,6 @@ def install_file(source_filename, dest_filename):
def install_system_files(): def install_system_files():
f = open("apt_packages.txt", "r")
for x in f:
if x == "":
continue
os.system(f"apt-get install {x}")
f.close()
setup_path = os.path.dirname(__file__) setup_path = os.path.dirname(__file__)
data_path = os.path.join(setup_path, "builder/data") data_path = os.path.join(setup_path, "builder/data")