# Network Manager — веб-панель управления сетью для Alpine Linux

Простая веб-панель для настройки сетевых интерфейсов на Alpine Linux.
Написана на Go (бэкенд) + чистый HTML/CSS/JS (фронтенд), без внешних зависимостей.

## Возможности

- Вкл/выкл/рестарт интерфейса (`ifup` / `ifdown`)
- Статистика трафика (rx/tx байт и пакетов) из `/proc/net/dev`
- Текущий IP (v4 и v6), маска сети, шлюз
- Режим DHCP или статический IP
- Редактирование всех параметров (IP, маска, шлюз, DNS)
- **Настройки применяются только после нажатия «Применить»**
- Автообновление данных каждые 10 секунд

## Структура проекта

```
alpine-router/
├── main.go              — точка входа, HTTP-роутинг
├── go.mod
├── handlers/
│   └── api.go           — REST-обработчики
├── network/
│   ├── interfaces.go    — чтение состояния интерфейсов
│   ├── config.go        — парсинг/запись /etc/network/interfaces
│   └── apply.go         — применение конфига (ifup/ifdown)
├── public/
│   ├── index.html
│   ├── style.css
│   └── app.js
└── alpine-init/
    └── network-manager  — OpenRC-скрипт
```

## Быстрый запуск (разработка, Linux/macOS)

```bash
cd alpine-router
go run .
# открыть http://localhost:8080
```

> На не-Alpine системе панель запустится, но ifup/ifdown не сработают —
> зато статистика и отображение интерфейсов будут работать.

---

## Деплой на Alpine Linux

### 1. Установить зависимости

```sh
apk add go git ifupdown
```

> Если `ifupdown` уже включён в базовой системе — пропустить.

### 2. Собрать бинарник

```sh
# На самом роутере или кросс-компиляцией:
cd alpine-router
go build -o network-manager .
```

Кросс-компиляция с x86_64 → ARM (например, для Raspberry Pi):

```sh
GOOS=linux GOARCH=arm64 go build -o network-manager .
```

### 3. Установить файлы

```sh
# Бинарник
install -m 755 network-manager /usr/local/bin/network-manager

# Фронтенд (панель ищет папку ./public относительно cwd)
mkdir -p /usr/local/share/network-manager
cp -r public/ /usr/local/share/network-manager/public
```

Если хотите запускать из `/usr/local/share/network-manager`:

```sh
cd /usr/local/share/network-manager && network-manager
```

Либо укажите путь к public через переменную окружения:

```sh
# Добавьте в OpenRC-скрипт:
directory="/usr/local/share/network-manager"
```

### 4. Настроить автозапуск (OpenRC)

```sh
cp alpine-init/network-manager /etc/init.d/network-manager
chmod +x /etc/init.d/network-manager

rc-service network-manager start
rc-update add network-manager default
```

### 5. Открыть панель

```
http://<IP-роутера>:8080
```

Порт можно изменить переменной окружения:

```sh
PORT=8888 network-manager
```

---

## API

| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/api/interfaces` | Список всех интерфейсов со статистикой |
| GET | `/api/interfaces/{name}` | Статистика одного интерфейса |
| POST | `/api/interfaces/{name}/up` | Поднять интерфейс |
| POST | `/api/interfaces/{name}/down` | Опустить интерфейс |
| POST | `/api/interfaces/{name}/restart` | Рестарт интерфейса |
| GET | `/api/config/{name}` | Получить конфиг (pending или из файла) |
| POST | `/api/config/{name}` | Сохранить конфиг как pending |
| DELETE | `/api/config/{name}` | Удалить pending конфиг |
| GET | `/api/pending` | Список интерфейсов с pending изменениями |
| POST | `/api/apply` | Записать pending конфиги и перезапустить интерфейсы |

---

## Формат `/etc/network/interfaces`

Панель читает и пишет стандартный Debian/Alpine формат:

```
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 8.8.8.8 1.1.1.1
```

Перед каждой записью создаётся резервная копия `/etc/network/interfaces.bak`.

---

## Требования

- Alpine Linux (или любой Linux с `/proc/net/dev` и `/sys/class/net`)
- Go 1.21+
- `ifupdown` или `busybox` с поддержкой `ifup`/`ifdown`
