Иконки сетевого статуса

Автор I.A.N.A., 19 декабря 2024, 12:03:39

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

I.A.N.A.

Добрый день уважаемое сообщество. Вопрос по иконкам.

По дефолту, в чистом свежеустановленном XFCE значок сети статичный. А у LXDE возле часов мониторчики мигают, как это было в старой доброй WindowsXP.

Скачал на xfce  иконпак, распаковал в /home/.icons, применил.  В иконках (png и svg форматов) есть такие файлы, как "network-receive.png" и "network-recive.png" и для передачи "network-transmit.png" но почему то всегда один статичный значок отображается. Как заставить систему мигать значками сетевого статуса? В каких случаях xfce к этим значкам обращается?

ogost

Предположу, что нужно смотреть в сторону network-manager-gnome, который содержит апплет для отображения состояния сети.

I.A.N.A.

Цитата: ogost от 20 декабря 2024, 03:33:37Предположу, что нужно смотреть в сторону network-manager-gnome, который содержит апплет для отображения состояния сети.
Так хоть бы знать куда смотреть и что крутить, с какой стороны подступиться))

ogost

Я им давно не пользуюсь, но у него иконки были где-то /usr/share, емнип. Ставить его я разумеется не буду.
Посмотрите это у вас он, или может что-то другое? В Дебиане оно вроде как по умолчанию.

I.A.N.A.

Цитата: ogost от 20 декабря 2024, 11:09:30Я им давно не пользуюсь, но у него иконки были где-то /usr/share, емнип. Ставить его я разумеется не буду.
Посмотрите это у вас он, или может что-то другое? В Дебиане оно вроде как по умолчанию.
Да, в дебиане NM по дефолту, и все иконки берутся с текущей темы иконок.

dzhoser

По стандартам freedesktop.org (XDG) правильный путь ~/.local/share/icons/, .~/.icons - старый вариант. Насколько я понимаю основные DE ищут иконки в обоих директориях.

Чтобы не запариваться, можно сделать .icons/ ссылкой .local/share/icons/
Скорее всего в основной теме нет какого-то значка вот анимация и не работает.
Ubuntu->Linux mint->Astra Linux SE->Debian 12
Для новичков

I.A.N.A.

Цитата: dzhoser от 20 декабря 2024, 11:24:03Скорее всего в основной теме нет какого-то значка вот анимация и не работает.
Да мне бы хоть одну тему иконок рабочую, где анимация работает, увидеть. Тогда можно бы наковырять суть проблемы, доустановить отсутствующие значки. Тоже подозреваю что где то тут "собака зарыта", а чтобы проверять нужна рабочая тема где все присутствует и работает. Чтобы было с чем сравнивать.

Цитата: dzhoser от 20 декабря 2024, 11:24:03Чтобы не запариваться, можно сделать .icons/ ссылкой .local/share/icons/
Хорошая идея, так и попробую сделать.



I.A.N.A.

В общем поковырял, не помогает ничего. Все время берется статичный значок для индикации сети....

I.A.N.A.

Посидел поразмыслил как решить эту проблему. Для любителей визуализации и ретро, придумал решение в виде небольшого скрипта на питоне. Что делает скрипт? При запуске в трее у часов создаются те самые старые добрые иконки сетевого статуса, какие мы все привыкли видеть в православной  WindowsXP. Можно в конфиге подрегулировать частоту смены и порядок смены иконок. Ну и конечно указать свои иконки, какие вам больше нравятся.  Тестировал на XFCE, Debian 12,  не знаю как будет работать в других окружениях и версиях.

required packages:  python3 python3-gi python3-gi-cairo gir1.2-gtk-3.0 python3-psutil

Копируем код в файлик например с именем network.py кладем сам файлик куда удобно и запускаем командой python3 network.py

 
Код:

import gi
import psutil
import time
import threading
import random
import subprocess
from gi.repository import Gtk, GLib
import socket
import os
import requests

class NetworkMonitor:
    def __init__(self):
        # Configuration for custom icons (здесь указываем полные пути к вашим иконкам в форматах png\svg)
        self.icon_paths = {
            "icon1": "/home/isdn/.icons/01_rx.svg",
            "icon2": "/home/isdn/.icons/02_tx.svg",
            "icon3": "/home/isdn/.icons/03_idle.svg",
            "icon4": "/home/isdn/.icons/04_both.svg"
        }

        # Error icon
        self.error_icon_path = "/home/isdn/.icons/5_error.svg"  # Icon for error state

        # About dialog text configuration
        self.about_text = """
Network Monitor
Version 1.0
Displays traffic and switches icons
"""

        # Additional network details configuration
        self.show_network_details = True  # Toggle for showing IP, subnet, gateway, and DNS (вкл\откл отображение в Tooltip IP, Mask, DNS, Gateway, WAN IP)

        # Create StatusIcon for the application
        self.tray_icon = Gtk.StatusIcon()
        self.tray_icon.set_from_file(self.icon_paths["icon1"])
        self.tray_icon.set_tooltip_text("Network Monitor")
        self.tray_icon.connect("popup-menu", self.show_menu)
        self.tray_icon.connect("activate", self.open_nm_connection_editor)

        # Initialize variables
        self.stop_thread = False
        self.icon_list = list(self.icon_paths.values())
        self.switch_interval = 2.0          # Interval for automatic switching (in seconds) Интервал переключения (в секундах)
        self.random_order = True            # Set to True for random icon switching    (Случайное переключение. Если False, иконки будут отображаться по порядку 1,2,3,4)
        self.pause_switching = True         # Pause switching if the interface is DOWN (Остановить отображение если eth0 DOWN)

        # Traffic monitoring
        self.selected_interface = "eth0"  # Default interface.  Ваш Основной NET интерфейс. Можно запускать 2 копии программы если интерфейсов более одного.
        self.total_rx = 0
        self.total_tx = 0
        self.rx_speed = 0
        self.tx_speed = 0

        # Start threads
        self.switch_thread = threading.Thread(target=self.switch_icons)
        self.switch_thread.start()

        self.traffic_thread = threading.Thread(target=self.monitor_traffic)
        self.traffic_thread.start()

    def switch_icons(self):
        """Automatically switch icons at a set interval."""
        while not self.stop_thread:
            if self.pause_switching:
                time.sleep(self.switch_interval)
                continue

            if self.random_order:
                icon_path = random.choice(self.icon_list)
            else:
                icon_path = self.icon_list.pop(0)
                self.icon_list.append(icon_path)

            GLib.idle_add(self.tray_icon.set_from_file, icon_path)
            time.sleep(self.switch_interval)

    def monitor_traffic(self):
        """Monitor network traffic for the selected interface."""
        prev_counters = psutil.net_io_counters(pernic=True)
        while not self.stop_thread:
            time.sleep(1)
            current_counters = psutil.net_io_counters(pernic=True)

            # Check if the interface is available and UP
            interface_stats = psutil.net_if_stats()
            if (self.selected_interface in current_counters and
                self.selected_interface in interface_stats and
                interface_stats[self.selected_interface].isup):

                self.pause_switching = False  # Resume icon switching

                prev = prev_counters.get(self.selected_interface, psutil._common.snetio(*([0] * 8)))
                curr = current_counters[self.selected_interface]

                self.rx_speed = (curr.bytes_recv - prev.bytes_recv) / 1024
                self.tx_speed = (curr.bytes_sent - prev.bytes_sent) / 1024
                self.total_rx += curr.bytes_recv - prev.bytes_recv
                self.total_tx += curr.bytes_sent - prev.bytes_sent

                tooltip = (f"Interface: {self.selected_interface}\n"
                           f"Download Speed: {self.rx_speed:.2f} KB/s\n"
                           f"Upload Speed: {self.tx_speed:.2f} KB/s\n"
                           f"Total Download: {self.total_rx / (1024 * 1024):.2f} MB\n"
                           f"Total Upload: {self.total_tx / (1024 * 1024):.2f} MB")

                if self.show_network_details:
                    network_details = self.get_network_details()
                    tooltip += network_details

                public_ip = self.get_public_ip()
                if public_ip:
                    tooltip += f"\nPublic IP: {public_ip}"
                else:
                    tooltip += "\nPublic IP: No Internet Access"

                GLib.idle_add(self.tray_icon.set_tooltip_text, tooltip)
            else:
                # Pause icon switching and set error icon if the interface is DOWN
                self.pause_switching = True
                GLib.idle_add(self.tray_icon.set_from_file, self.error_icon_path)
                GLib.idle_add(self.tray_icon.set_tooltip_text, f"Error: {self.selected_interface} is disconnected or DOWN")

            prev_counters = current_counters

    def get_network_details(self):
        """Retrieve IP address, subnet mask, gateway, and DNS server for the default interface."""
        try:
            addresses = psutil.net_if_addrs()[self.selected_interface]
            ip_address = None
            subnet_mask = None

            for addr in addresses:
                if addr.family == socket.AF_INET:
                    ip_address = addr.address
                    subnet_mask = addr.netmask

            gateway = "Unknown"
            try:
                with os.popen("ip route | grep default") as route_output:
                    for line in route_output:
                        if "default" in line and self.selected_interface in line:
                            gateway = line.split()[2]
                            break
            except Exception:
                gateway = "Unknown"

            dns_servers = "Unknown"
            try:
                with open("/etc/resolv.conf", "r") as resolv:
                    lines = resolv.readlines()
                    dns_servers = ", ".join([line.split()[1] for line in lines if line.startswith("nameserver")])
            except FileNotFoundError:
                pass

            details = (f"\nIP Address: {ip_address}\n"
                       f"Subnet Mask: {subnet_mask}\n"
                       f"Gateway: {gateway}\n"
                       f"DNS Servers: {dns_servers}")
            return details
        except Exception as e:
            return f"\nError retrieving network details: {e}"

    def get_public_ip(self):
        """Retrieve the public IP address."""
        try:
            response = requests.get("https://api.ipify.org", timeout=5)
            if response.status_code == 200:
                return response.text.strip()
        except requests.RequestException:
            pass
        return None

    def open_nm_connection_editor(self, widget):
        """Open the Network Manager connection editor."""
        try:
            subprocess.Popen(["nm-connection-editor"])
        except FileNotFoundError:
            print("nm-connection-editor not found. Please install it.")

    def show_menu(self, icon, button, time):
        """Show right-click menu."""
        menu = Gtk.Menu()

        about_item = Gtk.MenuItem(label="About")
        about_item.connect("activate", self.show_about_dialog)
        menu.append(about_item)

        quit_item = Gtk.MenuItem(label="Exit")
        quit_item.connect("activate", self.quit_application)
        menu.append(quit_item)

        menu.show_all()
        menu.popup(None, None, None, None, button, time)

    def show_about_dialog(self, widget):
        """Display an About dialog."""
        about_dialog = Gtk.MessageDialog(
            None,
            Gtk.DialogFlags.MODAL,
            Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK,
            self.about_text
        )
        about_dialog.run()
        about_dialog.destroy()

    def quit_application(self, widget):
        """Quit the application."""
        self.stop_thread = True
        self.switch_thread.join()
        self.traffic_thread.join()
        Gtk.main_quit()

if __name__ == "__main__":
    app = NetworkMonitor()
    Gtk.main()


Ну и скачать готовое.

network.zip