Compare commits

...

2 Commits

Author SHA1 Message Date
litoral05 8feb5213cf Finishes controllers tab + adds Manual to settings 2026-05-18 12:18:38 +01:00
litoral05 d9b4c081ce Finished controllers UI 2026-05-15 08:54:51 +01:00
30 changed files with 4475 additions and 415 deletions
@@ -0,0 +1,45 @@
# Details
Date : 2026-05-18 12:10:57
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src
Total : 30 files, 7309 codes, 2 comments, 1032 blanks, all 8343 lines
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
| [src/app/App.tsx](/src/app/App.tsx) | TypeScript JSX | 36 | 0 | 9 | 45 |
| [src/app/routes.tsx](/src/app/routes.tsx) | TypeScript JSX | 260 | 0 | 46 | 306 |
| [src/components/activity/ActivityLogs.tsx](/src/components/activity/ActivityLogs.tsx) | TypeScript JSX | 288 | 0 | 51 | 339 |
| [src/components/controllers/ControllersRoute.tsx](/src/components/controllers/ControllersRoute.tsx) | TypeScript JSX | 1,927 | 0 | 308 | 2,235 |
| [src/components/dashboard/IpPoolChart.tsx](/src/components/dashboard/IpPoolChart.tsx) | TypeScript JSX | 117 | 0 | 17 | 134 |
| [src/components/dashboard/MetricCard.tsx](/src/components/dashboard/MetricCard.tsx) | TypeScript JSX | 78 | 0 | 11 | 89 |
| [src/components/dashboard/NetworkTrafficChart.tsx](/src/components/dashboard/NetworkTrafficChart.tsx) | TypeScript JSX | 217 | 0 | 35 | 252 |
| [src/components/layout/AppShell.tsx](/src/components/layout/AppShell.tsx) | TypeScript JSX | 26 | 0 | 4 | 30 |
| [src/components/layout/Sidebar.tsx](/src/components/layout/Sidebar.tsx) | TypeScript JSX | 88 | 0 | 11 | 99 |
| [src/components/layout/TopBar.tsx](/src/components/layout/TopBar.tsx) | TypeScript JSX | 95 | 0 | 7 | 102 |
| [src/components/login/LoginScreen.tsx](/src/components/login/LoginScreen.tsx) | TypeScript JSX | 165 | 0 | 27 | 192 |
| [src/components/provisioning/ProvisioningWizard.tsx](/src/components/provisioning/ProvisioningWizard.tsx) | TypeScript JSX | 1,707 | 0 | 283 | 1,990 |
| [src/components/settings/BackendSettings.tsx](/src/components/settings/BackendSettings.tsx) | TypeScript JSX | 1,272 | 0 | 70 | 1,342 |
| [src/components/udp2raw/Udp2rawConfig.tsx](/src/components/udp2raw/Udp2rawConfig.tsx) | TypeScript JSX | 369 | 0 | 52 | 421 |
| [src/components/ui/Badge.tsx](/src/components/ui/Badge.tsx) | TypeScript JSX | 38 | 0 | 5 | 43 |
| [src/components/ui/Button.tsx](/src/components/ui/Button.tsx) | TypeScript JSX | 38 | 0 | 7 | 45 |
| [src/components/ui/Card.tsx](/src/components/ui/Card.tsx) | TypeScript JSX | 20 | 0 | 3 | 23 |
| [src/components/ui/Progress.tsx](/src/components/ui/Progress.tsx) | TypeScript JSX | 21 | 0 | 2 | 23 |
| [src/components/ui/Select.tsx](/src/components/ui/Select.tsx) | TypeScript JSX | 71 | 0 | 10 | 81 |
| [src/components/ui/StatusDot.tsx](/src/components/ui/StatusDot.tsx) | TypeScript JSX | 16 | 0 | 1 | 17 |
| [src/main.tsx](/src/main.tsx) | TypeScript JSX | 16 | 0 | 5 | 21 |
| [src/services/activityLogService.ts](/src/services/activityLogService.ts) | TypeScript | 62 | 0 | 14 | 76 |
| [src/services/apiClient.ts](/src/services/apiClient.ts) | TypeScript | 80 | 0 | 13 | 93 |
| [src/services/loginApi.ts](/src/services/loginApi.ts) | TypeScript | 15 | 0 | 2 | 17 |
| [src/services/vpnApi.ts](/src/services/vpnApi.ts) | TypeScript | 27 | 0 | 4 | 31 |
| [src/services/vpsApi.ts](/src/services/vpsApi.ts) | TypeScript | 142 | 2 | 20 | 164 |
| [src/styles/globals.css](/src/styles/globals.css) | PostCSS | 28 | 0 | 5 | 33 |
| [src/types/activity.ts](/src/types/activity.ts) | TypeScript | 20 | 0 | 2 | 22 |
| [src/types/api.ts](/src/types/api.ts) | TypeScript | 46 | 0 | 6 | 52 |
| [src/types/provisioning.ts](/src/types/provisioning.ts) | TypeScript | 24 | 0 | 2 | 26 |
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
@@ -0,0 +1,15 @@
# Diff Details
Date : 2026-05-18 12:10:57
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
@@ -0,0 +1,2 @@
"filename", "language", "", "comment", "blank", "total"
"Total", "-", , 0, 0, 0
1 filename language comment blank total
2 Total - 0 0 0
@@ -0,0 +1,19 @@
# Diff Summary
Date : 2026-05-18 12:10:57
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
@@ -0,0 +1,22 @@
Date : 2026-05-18 12:10:57
Directory : c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
Languages
+----------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------+------------+------------+------------+------------+------------+
+----------+------------+------------+------------+------------+------------+
Directories
+------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+------+------------+------------+------------+------------+------------+
+------+------------+------------+------------+------------+------------+
Files
+----------+----------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+----------+----------+------------+------------+------------+------------+
| Total | | 0 | 0 | 0 | 0 |
+----------+----------+------------+------------+------------+------------+
@@ -0,0 +1,32 @@
"filename", "language", "TypeScript", "PostCSS", "TypeScript JSX", "comment", "blank", "total"
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx", "TypeScript JSX", 0, 0, 36, 0, 9, 45
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx", "TypeScript JSX", 0, 0, 260, 0, 46, 306
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx", "TypeScript JSX", 0, 0, 288, 0, 51, 339
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx", "TypeScript JSX", 0, 0, 1927, 0, 308, 2235
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx", "TypeScript JSX", 0, 0, 117, 0, 17, 134
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx", "TypeScript JSX", 0, 0, 78, 0, 11, 89
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx", "TypeScript JSX", 0, 0, 217, 0, 35, 252
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx", "TypeScript JSX", 0, 0, 26, 0, 4, 30
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx", "TypeScript JSX", 0, 0, 88, 0, 11, 99
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx", "TypeScript JSX", 0, 0, 95, 0, 7, 102
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx", "TypeScript JSX", 0, 0, 165, 0, 27, 192
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx", "TypeScript JSX", 0, 0, 1707, 0, 283, 1990
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx", "TypeScript JSX", 0, 0, 1272, 0, 70, 1342
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx", "TypeScript JSX", 0, 0, 369, 0, 52, 421
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx", "TypeScript JSX", 0, 0, 38, 0, 5, 43
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx", "TypeScript JSX", 0, 0, 38, 0, 7, 45
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx", "TypeScript JSX", 0, 0, 20, 0, 3, 23
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx", "TypeScript JSX", 0, 0, 21, 0, 2, 23
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx", "TypeScript JSX", 0, 0, 71, 0, 10, 81
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx", "TypeScript JSX", 0, 0, 16, 0, 1, 17
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx", "TypeScript JSX", 0, 0, 16, 0, 5, 21
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts", "TypeScript", 62, 0, 0, 0, 14, 76
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts", "TypeScript", 80, 0, 0, 0, 13, 93
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts", "TypeScript", 15, 0, 0, 0, 2, 17
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts", "TypeScript", 27, 0, 0, 0, 4, 31
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts", "TypeScript", 142, 0, 0, 2, 20, 164
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css", "PostCSS", 0, 28, 0, 0, 5, 33
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts", "TypeScript", 20, 0, 0, 0, 2, 22
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts", "TypeScript", 46, 0, 0, 0, 6, 52
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts", "TypeScript", 24, 0, 0, 0, 2, 26
"Total", "-", 416, 28, 6865, 2, 1032, 8343
1 filename language TypeScript PostCSS TypeScript JSX comment blank total
2 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx TypeScript JSX 0 0 36 0 9 45
3 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx TypeScript JSX 0 0 260 0 46 306
4 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx TypeScript JSX 0 0 288 0 51 339
5 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx TypeScript JSX 0 0 1927 0 308 2235
6 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx TypeScript JSX 0 0 117 0 17 134
7 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx TypeScript JSX 0 0 78 0 11 89
8 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx TypeScript JSX 0 0 217 0 35 252
9 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx TypeScript JSX 0 0 26 0 4 30
10 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx TypeScript JSX 0 0 88 0 11 99
11 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx TypeScript JSX 0 0 95 0 7 102
12 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx TypeScript JSX 0 0 165 0 27 192
13 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx TypeScript JSX 0 0 1707 0 283 1990
14 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx TypeScript JSX 0 0 1272 0 70 1342
15 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx TypeScript JSX 0 0 369 0 52 421
16 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx TypeScript JSX 0 0 38 0 5 43
17 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx TypeScript JSX 0 0 38 0 7 45
18 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx TypeScript JSX 0 0 20 0 3 23
19 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx TypeScript JSX 0 0 21 0 2 23
20 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx TypeScript JSX 0 0 71 0 10 81
21 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx TypeScript JSX 0 0 16 0 1 17
22 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx TypeScript JSX 0 0 16 0 5 21
23 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts TypeScript 62 0 0 0 14 76
24 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts TypeScript 80 0 0 0 13 93
25 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts TypeScript 15 0 0 0 2 17
26 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts TypeScript 27 0 0 0 4 31
27 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts TypeScript 142 0 0 2 20 164
28 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css PostCSS 0 28 0 0 5 33
29 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts TypeScript 20 0 0 0 2 22
30 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts TypeScript 46 0 0 0 6 52
31 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts TypeScript 24 0 0 0 2 26
32 Total - 416 28 6865 2 1032 8343
File diff suppressed because one or more lines are too long
@@ -0,0 +1,38 @@
# Summary
Date : 2026-05-18 12:10:57
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src
Total : 30 files, 7309 codes, 2 comments, 1032 blanks, all 8343 lines
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| TypeScript JSX | 21 | 6,865 | 0 | 964 | 7,829 |
| TypeScript | 8 | 416 | 2 | 63 | 481 |
| PostCSS | 1 | 28 | 0 | 5 | 33 |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| . | 30 | 7,309 | 2 | 1,032 | 8,343 |
| . (Files) | 1 | 16 | 0 | 5 | 21 |
| app | 2 | 296 | 0 | 55 | 351 |
| components | 18 | 6,553 | 0 | 904 | 7,457 |
| components\\activity | 1 | 288 | 0 | 51 | 339 |
| components\\controllers | 1 | 1,927 | 0 | 308 | 2,235 |
| components\\dashboard | 3 | 412 | 0 | 63 | 475 |
| components\\layout | 3 | 209 | 0 | 22 | 231 |
| components\\login | 1 | 165 | 0 | 27 | 192 |
| components\\provisioning | 1 | 1,707 | 0 | 283 | 1,990 |
| components\\settings | 1 | 1,272 | 0 | 70 | 1,342 |
| components\\udp2raw | 1 | 369 | 0 | 52 | 421 |
| components\\ui | 6 | 204 | 0 | 28 | 232 |
| services | 5 | 326 | 2 | 53 | 381 |
| styles | 1 | 28 | 0 | 5 | 33 |
| types | 3 | 90 | 0 | 10 | 100 |
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
@@ -0,0 +1,71 @@
Date : 2026-05-18 12:10:57
Directory : c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src
Total : 30 files, 7309 codes, 2 comments, 1032 blanks, all 8343 lines
Languages
+----------------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------------+------------+------------+------------+------------+------------+
| TypeScript JSX | 21 | 6,865 | 0 | 964 | 7,829 |
| TypeScript | 8 | 416 | 2 | 63 | 481 |
| PostCSS | 1 | 28 | 0 | 5 | 33 |
+----------------+------------+------------+------------+------------+------------+
Directories
+-------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+-------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| . | 30 | 7,309 | 2 | 1,032 | 8,343 |
| . (Files) | 1 | 16 | 0 | 5 | 21 |
| app | 2 | 296 | 0 | 55 | 351 |
| components | 18 | 6,553 | 0 | 904 | 7,457 |
| components\activity | 1 | 288 | 0 | 51 | 339 |
| components\controllers | 1 | 1,927 | 0 | 308 | 2,235 |
| components\dashboard | 3 | 412 | 0 | 63 | 475 |
| components\layout | 3 | 209 | 0 | 22 | 231 |
| components\login | 1 | 165 | 0 | 27 | 192 |
| components\provisioning | 1 | 1,707 | 0 | 283 | 1,990 |
| components\settings | 1 | 1,272 | 0 | 70 | 1,342 |
| components\udp2raw | 1 | 369 | 0 | 52 | 421 |
| components\ui | 6 | 204 | 0 | 28 | 232 |
| services | 5 | 326 | 2 | 53 | 381 |
| styles | 1 | 28 | 0 | 5 | 33 |
| types | 3 | 90 | 0 | 10 | 100 |
+-------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
Files
+-------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+-------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx | TypeScript JSX | 36 | 0 | 9 | 45 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx | TypeScript JSX | 260 | 0 | 46 | 306 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx | TypeScript JSX | 288 | 0 | 51 | 339 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx | TypeScript JSX | 1,927 | 0 | 308 | 2,235 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx | TypeScript JSX | 117 | 0 | 17 | 134 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx | TypeScript JSX | 78 | 0 | 11 | 89 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx | TypeScript JSX | 217 | 0 | 35 | 252 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx | TypeScript JSX | 26 | 0 | 4 | 30 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx | TypeScript JSX | 88 | 0 | 11 | 99 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx | TypeScript JSX | 95 | 0 | 7 | 102 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx | TypeScript JSX | 165 | 0 | 27 | 192 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx | TypeScript JSX | 1,707 | 0 | 283 | 1,990 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx | TypeScript JSX | 1,272 | 0 | 70 | 1,342 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx | TypeScript JSX | 369 | 0 | 52 | 421 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx | TypeScript JSX | 38 | 0 | 5 | 43 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx | TypeScript JSX | 38 | 0 | 7 | 45 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx | TypeScript JSX | 20 | 0 | 3 | 23 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx | TypeScript JSX | 21 | 0 | 2 | 23 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx | TypeScript JSX | 71 | 0 | 10 | 81 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx | TypeScript JSX | 16 | 0 | 1 | 17 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx | TypeScript JSX | 16 | 0 | 5 | 21 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts | TypeScript | 62 | 0 | 14 | 76 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts | TypeScript | 80 | 0 | 13 | 93 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts | TypeScript | 15 | 0 | 2 | 17 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts | TypeScript | 27 | 0 | 4 | 31 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts | TypeScript | 142 | 2 | 20 | 164 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css | PostCSS | 28 | 0 | 5 | 33 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts | TypeScript | 20 | 0 | 2 | 22 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts | TypeScript | 46 | 0 | 6 | 52 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts | TypeScript | 24 | 0 | 2 | 26 |
| Total | | 7,309 | 2 | 1,032 | 8,343 |
+-------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
@@ -0,0 +1,28 @@
# Details
Date : 2026-05-18 12:12:03
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src-tauri
Total : 13 files, 1139 codes, 0 comments, 220 blanks, all 1359 lines
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
| [src-tauri/build.rs](/src-tauri/build.rs) | Rust | 1 | 0 | 1 | 2 |
| [src-tauri/capabilities/default.json](/src-tauri/capabilities/default.json) | JSON | 11 | 0 | 0 | 11 |
| [src-tauri/icons/android/mipmap-anydpi-v26/ic\_launcher.xml](/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml) | XML | 5 | 0 | 0 | 5 |
| [src-tauri/icons/android/values/ic\_launcher\_background.xml](/src-tauri/icons/android/values/ic_launcher_background.xml) | XML | 4 | 0 | 0 | 4 |
| [src-tauri/src/commands/controllers.rs](/src-tauri/src/commands/controllers.rs) | Rust | 127 | 0 | 20 | 147 |
| [src-tauri/src/commands/files.rs](/src-tauri/src/commands/files.rs) | Rust | 12 | 0 | 0 | 12 |
| [src-tauri/src/commands/mod.rs](/src-tauri/src/commands/mod.rs) | Rust | 5 | 0 | 0 | 5 |
| [src-tauri/src/commands/network.rs](/src-tauri/src/commands/network.rs) | Rust | 12 | 0 | 1 | 13 |
| [src-tauri/src/commands/router.rs](/src-tauri/src/commands/router.rs) | Rust | 679 | 0 | 162 | 841 |
| [src-tauri/src/commands/ssh.rs](/src-tauri/src/commands/ssh.rs) | Rust | 179 | 0 | 32 | 211 |
| [src-tauri/src/lib.rs](/src-tauri/src/lib.rs) | Rust | 62 | 0 | 3 | 65 |
| [src-tauri/src/main.rs](/src-tauri/src/main.rs) | Rust | 4 | 0 | 1 | 5 |
| [src-tauri/tauri.conf.json](/src-tauri/tauri.conf.json) | JSON | 38 | 0 | 0 | 38 |
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
@@ -0,0 +1,58 @@
# Diff Details
Date : 2026-05-18 12:12:03
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src-tauri
Total : 43 files, -6170 codes, -2 comments, -812 blanks, all -6984 lines
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
| [src-tauri/build.rs](/src-tauri/build.rs) | Rust | 1 | 0 | 1 | 2 |
| [src-tauri/capabilities/default.json](/src-tauri/capabilities/default.json) | JSON | 11 | 0 | 0 | 11 |
| [src-tauri/icons/android/mipmap-anydpi-v26/ic\_launcher.xml](/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml) | XML | 5 | 0 | 0 | 5 |
| [src-tauri/icons/android/values/ic\_launcher\_background.xml](/src-tauri/icons/android/values/ic_launcher_background.xml) | XML | 4 | 0 | 0 | 4 |
| [src-tauri/src/commands/controllers.rs](/src-tauri/src/commands/controllers.rs) | Rust | 127 | 0 | 20 | 147 |
| [src-tauri/src/commands/files.rs](/src-tauri/src/commands/files.rs) | Rust | 12 | 0 | 0 | 12 |
| [src-tauri/src/commands/mod.rs](/src-tauri/src/commands/mod.rs) | Rust | 5 | 0 | 0 | 5 |
| [src-tauri/src/commands/network.rs](/src-tauri/src/commands/network.rs) | Rust | 12 | 0 | 1 | 13 |
| [src-tauri/src/commands/router.rs](/src-tauri/src/commands/router.rs) | Rust | 679 | 0 | 162 | 841 |
| [src-tauri/src/commands/ssh.rs](/src-tauri/src/commands/ssh.rs) | Rust | 179 | 0 | 32 | 211 |
| [src-tauri/src/lib.rs](/src-tauri/src/lib.rs) | Rust | 62 | 0 | 3 | 65 |
| [src-tauri/src/main.rs](/src-tauri/src/main.rs) | Rust | 4 | 0 | 1 | 5 |
| [src-tauri/tauri.conf.json](/src-tauri/tauri.conf.json) | JSON | 38 | 0 | 0 | 38 |
| [src/app/App.tsx](/src/app/App.tsx) | TypeScript JSX | -36 | 0 | -9 | -45 |
| [src/app/routes.tsx](/src/app/routes.tsx) | TypeScript JSX | -260 | 0 | -46 | -306 |
| [src/components/activity/ActivityLogs.tsx](/src/components/activity/ActivityLogs.tsx) | TypeScript JSX | -288 | 0 | -51 | -339 |
| [src/components/controllers/ControllersRoute.tsx](/src/components/controllers/ControllersRoute.tsx) | TypeScript JSX | -1,927 | 0 | -308 | -2,235 |
| [src/components/dashboard/IpPoolChart.tsx](/src/components/dashboard/IpPoolChart.tsx) | TypeScript JSX | -117 | 0 | -17 | -134 |
| [src/components/dashboard/MetricCard.tsx](/src/components/dashboard/MetricCard.tsx) | TypeScript JSX | -78 | 0 | -11 | -89 |
| [src/components/dashboard/NetworkTrafficChart.tsx](/src/components/dashboard/NetworkTrafficChart.tsx) | TypeScript JSX | -217 | 0 | -35 | -252 |
| [src/components/layout/AppShell.tsx](/src/components/layout/AppShell.tsx) | TypeScript JSX | -26 | 0 | -4 | -30 |
| [src/components/layout/Sidebar.tsx](/src/components/layout/Sidebar.tsx) | TypeScript JSX | -88 | 0 | -11 | -99 |
| [src/components/layout/TopBar.tsx](/src/components/layout/TopBar.tsx) | TypeScript JSX | -95 | 0 | -7 | -102 |
| [src/components/login/LoginScreen.tsx](/src/components/login/LoginScreen.tsx) | TypeScript JSX | -165 | 0 | -27 | -192 |
| [src/components/provisioning/ProvisioningWizard.tsx](/src/components/provisioning/ProvisioningWizard.tsx) | TypeScript JSX | -1,707 | 0 | -283 | -1,990 |
| [src/components/settings/BackendSettings.tsx](/src/components/settings/BackendSettings.tsx) | TypeScript JSX | -1,272 | 0 | -70 | -1,342 |
| [src/components/udp2raw/Udp2rawConfig.tsx](/src/components/udp2raw/Udp2rawConfig.tsx) | TypeScript JSX | -369 | 0 | -52 | -421 |
| [src/components/ui/Badge.tsx](/src/components/ui/Badge.tsx) | TypeScript JSX | -38 | 0 | -5 | -43 |
| [src/components/ui/Button.tsx](/src/components/ui/Button.tsx) | TypeScript JSX | -38 | 0 | -7 | -45 |
| [src/components/ui/Card.tsx](/src/components/ui/Card.tsx) | TypeScript JSX | -20 | 0 | -3 | -23 |
| [src/components/ui/Progress.tsx](/src/components/ui/Progress.tsx) | TypeScript JSX | -21 | 0 | -2 | -23 |
| [src/components/ui/Select.tsx](/src/components/ui/Select.tsx) | TypeScript JSX | -71 | 0 | -10 | -81 |
| [src/components/ui/StatusDot.tsx](/src/components/ui/StatusDot.tsx) | TypeScript JSX | -16 | 0 | -1 | -17 |
| [src/main.tsx](/src/main.tsx) | TypeScript JSX | -16 | 0 | -5 | -21 |
| [src/services/activityLogService.ts](/src/services/activityLogService.ts) | TypeScript | -62 | 0 | -14 | -76 |
| [src/services/apiClient.ts](/src/services/apiClient.ts) | TypeScript | -80 | 0 | -13 | -93 |
| [src/services/loginApi.ts](/src/services/loginApi.ts) | TypeScript | -15 | 0 | -2 | -17 |
| [src/services/vpnApi.ts](/src/services/vpnApi.ts) | TypeScript | -27 | 0 | -4 | -31 |
| [src/services/vpsApi.ts](/src/services/vpsApi.ts) | TypeScript | -142 | -2 | -20 | -164 |
| [src/styles/globals.css](/src/styles/globals.css) | PostCSS | -28 | 0 | -5 | -33 |
| [src/types/activity.ts](/src/types/activity.ts) | TypeScript | -20 | 0 | -2 | -22 |
| [src/types/api.ts](/src/types/api.ts) | TypeScript | -46 | 0 | -6 | -52 |
| [src/types/provisioning.ts](/src/types/provisioning.ts) | TypeScript | -24 | 0 | -2 | -26 |
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
@@ -0,0 +1,45 @@
"filename", "language", "JSON", "Rust", "XML", "TypeScript", "PostCSS", "TypeScript JSX", "comment", "blank", "total"
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs", "Rust", 0, 1, 0, 0, 0, 0, 0, 1, 2
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json", "JSON", 11, 0, 0, 0, 0, 0, 0, 0, 11
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml", "XML", 0, 0, 5, 0, 0, 0, 0, 0, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml", "XML", 0, 0, 4, 0, 0, 0, 0, 0, 4
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs", "Rust", 0, 127, 0, 0, 0, 0, 0, 20, 147
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs", "Rust", 0, 12, 0, 0, 0, 0, 0, 0, 12
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs", "Rust", 0, 5, 0, 0, 0, 0, 0, 0, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs", "Rust", 0, 12, 0, 0, 0, 0, 0, 1, 13
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs", "Rust", 0, 679, 0, 0, 0, 0, 0, 162, 841
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs", "Rust", 0, 179, 0, 0, 0, 0, 0, 32, 211
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs", "Rust", 0, 62, 0, 0, 0, 0, 0, 3, 65
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs", "Rust", 0, 4, 0, 0, 0, 0, 0, 1, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json", "JSON", 38, 0, 0, 0, 0, 0, 0, 0, 38
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -36, 0, -9, -45
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -260, 0, -46, -306
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -288, 0, -51, -339
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -1927, 0, -308, -2235
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -117, 0, -17, -134
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -78, 0, -11, -89
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -217, 0, -35, -252
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -26, 0, -4, -30
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -88, 0, -11, -99
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -95, 0, -7, -102
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -165, 0, -27, -192
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -1707, 0, -283, -1990
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -1272, 0, -70, -1342
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -369, 0, -52, -421
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -38, 0, -5, -43
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -38, 0, -7, -45
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -20, 0, -3, -23
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -21, 0, -2, -23
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -71, 0, -10, -81
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -16, 0, -1, -17
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx", "TypeScript JSX", 0, 0, 0, 0, 0, -16, 0, -5, -21
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts", "TypeScript", 0, 0, 0, -62, 0, 0, 0, -14, -76
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts", "TypeScript", 0, 0, 0, -80, 0, 0, 0, -13, -93
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts", "TypeScript", 0, 0, 0, -15, 0, 0, 0, -2, -17
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts", "TypeScript", 0, 0, 0, -27, 0, 0, 0, -4, -31
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts", "TypeScript", 0, 0, 0, -142, 0, 0, -2, -20, -164
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css", "PostCSS", 0, 0, 0, 0, -28, 0, 0, -5, -33
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts", "TypeScript", 0, 0, 0, -20, 0, 0, 0, -2, -22
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts", "TypeScript", 0, 0, 0, -46, 0, 0, 0, -6, -52
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts", "TypeScript", 0, 0, 0, -24, 0, 0, 0, -2, -26
"Total", "-", 49, 1081, 9, -416, -28, -6865, -2, -812, -6984
1 filename language JSON Rust XML TypeScript PostCSS TypeScript JSX comment blank total
2 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs Rust 0 1 0 0 0 0 0 1 2
3 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json JSON 11 0 0 0 0 0 0 0 11
4 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml XML 0 0 5 0 0 0 0 0 5
5 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml XML 0 0 4 0 0 0 0 0 4
6 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs Rust 0 127 0 0 0 0 0 20 147
7 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs Rust 0 12 0 0 0 0 0 0 12
8 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs Rust 0 5 0 0 0 0 0 0 5
9 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs Rust 0 12 0 0 0 0 0 1 13
10 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs Rust 0 679 0 0 0 0 0 162 841
11 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs Rust 0 179 0 0 0 0 0 32 211
12 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs Rust 0 62 0 0 0 0 0 3 65
13 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs Rust 0 4 0 0 0 0 0 1 5
14 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json JSON 38 0 0 0 0 0 0 0 38
15 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx TypeScript JSX 0 0 0 0 0 -36 0 -9 -45
16 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx TypeScript JSX 0 0 0 0 0 -260 0 -46 -306
17 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx TypeScript JSX 0 0 0 0 0 -288 0 -51 -339
18 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx TypeScript JSX 0 0 0 0 0 -1927 0 -308 -2235
19 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx TypeScript JSX 0 0 0 0 0 -117 0 -17 -134
20 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx TypeScript JSX 0 0 0 0 0 -78 0 -11 -89
21 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx TypeScript JSX 0 0 0 0 0 -217 0 -35 -252
22 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx TypeScript JSX 0 0 0 0 0 -26 0 -4 -30
23 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx TypeScript JSX 0 0 0 0 0 -88 0 -11 -99
24 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx TypeScript JSX 0 0 0 0 0 -95 0 -7 -102
25 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx TypeScript JSX 0 0 0 0 0 -165 0 -27 -192
26 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx TypeScript JSX 0 0 0 0 0 -1707 0 -283 -1990
27 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx TypeScript JSX 0 0 0 0 0 -1272 0 -70 -1342
28 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx TypeScript JSX 0 0 0 0 0 -369 0 -52 -421
29 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx TypeScript JSX 0 0 0 0 0 -38 0 -5 -43
30 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx TypeScript JSX 0 0 0 0 0 -38 0 -7 -45
31 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx TypeScript JSX 0 0 0 0 0 -20 0 -3 -23
32 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx TypeScript JSX 0 0 0 0 0 -21 0 -2 -23
33 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx TypeScript JSX 0 0 0 0 0 -71 0 -10 -81
34 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx TypeScript JSX 0 0 0 0 0 -16 0 -1 -17
35 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx TypeScript JSX 0 0 0 0 0 -16 0 -5 -21
36 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts TypeScript 0 0 0 -62 0 0 0 -14 -76
37 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts TypeScript 0 0 0 -80 0 0 0 -13 -93
38 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts TypeScript 0 0 0 -15 0 0 0 -2 -17
39 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts TypeScript 0 0 0 -27 0 0 0 -4 -31
40 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts TypeScript 0 0 0 -142 0 0 -2 -20 -164
41 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css PostCSS 0 0 0 0 -28 0 0 -5 -33
42 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts TypeScript 0 0 0 -20 0 0 0 -2 -22
43 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts TypeScript 0 0 0 -46 0 0 0 -6 -52
44 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts TypeScript 0 0 0 -24 0 0 0 -2 -26
45 Total - 49 1081 9 -416 -28 -6865 -2 -812 -6984
@@ -0,0 +1,52 @@
# Diff Summary
Date : 2026-05-18 12:12:03
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src-tauri
Total : 43 files, -6170 codes, -2 comments, -812 blanks, all -6984 lines
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| Rust | 9 | 1,081 | 0 | 220 | 1,301 |
| JSON | 2 | 49 | 0 | 0 | 49 |
| XML | 2 | 9 | 0 | 0 | 9 |
| PostCSS | 1 | -28 | 0 | -5 | -33 |
| TypeScript | 8 | -416 | -2 | -63 | -481 |
| TypeScript JSX | 21 | -6,865 | 0 | -964 | -7,829 |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| . | 43 | -6,170 | -2 | -812 | -6,984 |
| . (Files) | 2 | 39 | 0 | 1 | 40 |
| .. | 30 | -7,309 | -2 | -1,032 | -8,343 |
| ..\\src | 30 | -7,309 | -2 | -1,032 | -8,343 |
| ..\\src (Files) | 1 | -16 | 0 | -5 | -21 |
| ..\\src\\app | 2 | -296 | 0 | -55 | -351 |
| ..\\src\\components | 18 | -6,553 | 0 | -904 | -7,457 |
| ..\\src\\components\\activity | 1 | -288 | 0 | -51 | -339 |
| ..\\src\\components\\controllers | 1 | -1,927 | 0 | -308 | -2,235 |
| ..\\src\\components\\dashboard | 3 | -412 | 0 | -63 | -475 |
| ..\\src\\components\\layout | 3 | -209 | 0 | -22 | -231 |
| ..\\src\\components\\login | 1 | -165 | 0 | -27 | -192 |
| ..\\src\\components\\provisioning | 1 | -1,707 | 0 | -283 | -1,990 |
| ..\\src\\components\\settings | 1 | -1,272 | 0 | -70 | -1,342 |
| ..\\src\\components\\udp2raw | 1 | -369 | 0 | -52 | -421 |
| ..\\src\\components\\ui | 6 | -204 | 0 | -28 | -232 |
| ..\\src\\services | 5 | -326 | -2 | -53 | -381 |
| ..\\src\\styles | 1 | -28 | 0 | -5 | -33 |
| ..\\src\\types | 3 | -90 | 0 | -10 | -100 |
| capabilities | 1 | 11 | 0 | 0 | 11 |
| icons | 2 | 9 | 0 | 0 | 9 |
| icons\\android | 2 | 9 | 0 | 0 | 9 |
| icons\\android\\mipmap-anydpi-v26 | 1 | 5 | 0 | 0 | 5 |
| icons\\android\\values | 1 | 4 | 0 | 0 | 4 |
| src | 8 | 1,080 | 0 | 219 | 1,299 |
| src (Files) | 2 | 66 | 0 | 4 | 70 |
| src\\commands | 6 | 1,014 | 0 | 215 | 1,229 |
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
@@ -0,0 +1,98 @@
Date : 2026-05-18 12:12:03
Directory : c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri
Total : 43 files, -6170 codes, -2 comments, -812 blanks, all -6984 lines
Languages
+----------------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------------+------------+------------+------------+------------+------------+
| Rust | 9 | 1,081 | 0 | 220 | 1,301 |
| JSON | 2 | 49 | 0 | 0 | 49 |
| XML | 2 | 9 | 0 | 0 | 9 |
| PostCSS | 1 | -28 | 0 | -5 | -33 |
| TypeScript | 8 | -416 | -2 | -63 | -481 |
| TypeScript JSX | 21 | -6,865 | 0 | -964 | -7,829 |
+----------------+------------+------------+------------+------------+------------+
Directories
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| . | 43 | -6,170 | -2 | -812 | -6,984 |
| . (Files) | 2 | 39 | 0 | 1 | 40 |
| .. | 30 | -7,309 | -2 | -1,032 | -8,343 |
| ..\src | 30 | -7,309 | -2 | -1,032 | -8,343 |
| ..\src (Files) | 1 | -16 | 0 | -5 | -21 |
| ..\src\app | 2 | -296 | 0 | -55 | -351 |
| ..\src\components | 18 | -6,553 | 0 | -904 | -7,457 |
| ..\src\components\activity | 1 | -288 | 0 | -51 | -339 |
| ..\src\components\controllers | 1 | -1,927 | 0 | -308 | -2,235 |
| ..\src\components\dashboard | 3 | -412 | 0 | -63 | -475 |
| ..\src\components\layout | 3 | -209 | 0 | -22 | -231 |
| ..\src\components\login | 1 | -165 | 0 | -27 | -192 |
| ..\src\components\provisioning | 1 | -1,707 | 0 | -283 | -1,990 |
| ..\src\components\settings | 1 | -1,272 | 0 | -70 | -1,342 |
| ..\src\components\udp2raw | 1 | -369 | 0 | -52 | -421 |
| ..\src\components\ui | 6 | -204 | 0 | -28 | -232 |
| ..\src\services | 5 | -326 | -2 | -53 | -381 |
| ..\src\styles | 1 | -28 | 0 | -5 | -33 |
| ..\src\types | 3 | -90 | 0 | -10 | -100 |
| capabilities | 1 | 11 | 0 | 0 | 11 |
| icons | 2 | 9 | 0 | 0 | 9 |
| icons\android | 2 | 9 | 0 | 0 | 9 |
| icons\android\mipmap-anydpi-v26 | 1 | 5 | 0 | 0 | 5 |
| icons\android\values | 1 | 4 | 0 | 0 | 4 |
| src | 8 | 1,080 | 0 | 219 | 1,299 |
| src (Files) | 2 | 66 | 0 | 4 | 70 |
| src\commands | 6 | 1,014 | 0 | 215 | 1,229 |
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
Files
+--------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+--------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs | Rust | 1 | 0 | 1 | 2 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json | JSON | 11 | 0 | 0 | 11 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml | XML | 5 | 0 | 0 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml | XML | 4 | 0 | 0 | 4 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs | Rust | 127 | 0 | 20 | 147 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs | Rust | 12 | 0 | 0 | 12 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs | Rust | 5 | 0 | 0 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs | Rust | 12 | 0 | 1 | 13 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs | Rust | 679 | 0 | 162 | 841 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs | Rust | 179 | 0 | 32 | 211 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs | Rust | 62 | 0 | 3 | 65 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs | Rust | 4 | 0 | 1 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json | JSON | 38 | 0 | 0 | 38 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\App.tsx | TypeScript JSX | -36 | 0 | -9 | -45 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\app\routes.tsx | TypeScript JSX | -260 | 0 | -46 | -306 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\activity\ActivityLogs.tsx | TypeScript JSX | -288 | 0 | -51 | -339 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\controllers\ControllersRoute.tsx | TypeScript JSX | -1,927 | 0 | -308 | -2,235 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\IpPoolChart.tsx | TypeScript JSX | -117 | 0 | -17 | -134 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\MetricCard.tsx | TypeScript JSX | -78 | 0 | -11 | -89 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\dashboard\NetworkTrafficChart.tsx | TypeScript JSX | -217 | 0 | -35 | -252 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\AppShell.tsx | TypeScript JSX | -26 | 0 | -4 | -30 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\Sidebar.tsx | TypeScript JSX | -88 | 0 | -11 | -99 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\layout\TopBar.tsx | TypeScript JSX | -95 | 0 | -7 | -102 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\login\LoginScreen.tsx | TypeScript JSX | -165 | 0 | -27 | -192 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\provisioning\ProvisioningWizard.tsx | TypeScript JSX | -1,707 | 0 | -283 | -1,990 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\settings\BackendSettings.tsx | TypeScript JSX | -1,272 | 0 | -70 | -1,342 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\udp2raw\Udp2rawConfig.tsx | TypeScript JSX | -369 | 0 | -52 | -421 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Badge.tsx | TypeScript JSX | -38 | 0 | -5 | -43 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Button.tsx | TypeScript JSX | -38 | 0 | -7 | -45 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Card.tsx | TypeScript JSX | -20 | 0 | -3 | -23 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Progress.tsx | TypeScript JSX | -21 | 0 | -2 | -23 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\Select.tsx | TypeScript JSX | -71 | 0 | -10 | -81 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\components\ui\StatusDot.tsx | TypeScript JSX | -16 | 0 | -1 | -17 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\main.tsx | TypeScript JSX | -16 | 0 | -5 | -21 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\activityLogService.ts | TypeScript | -62 | 0 | -14 | -76 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\apiClient.ts | TypeScript | -80 | 0 | -13 | -93 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\loginApi.ts | TypeScript | -15 | 0 | -2 | -17 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpnApi.ts | TypeScript | -27 | 0 | -4 | -31 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\services\vpsApi.ts | TypeScript | -142 | -2 | -20 | -164 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\styles\globals.css | PostCSS | -28 | 0 | -5 | -33 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\activity.ts | TypeScript | -20 | 0 | -2 | -22 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\api.ts | TypeScript | -46 | 0 | -6 | -52 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src\types\provisioning.ts | TypeScript | -24 | 0 | -2 | -26 |
| Total | | -6,170 | -2 | -812 | -6,984 |
+--------------------------------------------------------------------------------------------------------------------------------------------+----------------+------------+------------+------------+------------+
@@ -0,0 +1,15 @@
"filename", "language", "JSON", "Rust", "XML", "comment", "blank", "total"
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs", "Rust", 0, 1, 0, 0, 1, 2
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json", "JSON", 11, 0, 0, 0, 0, 11
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml", "XML", 0, 0, 5, 0, 0, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml", "XML", 0, 0, 4, 0, 0, 4
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs", "Rust", 0, 127, 0, 0, 20, 147
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs", "Rust", 0, 12, 0, 0, 0, 12
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs", "Rust", 0, 5, 0, 0, 0, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs", "Rust", 0, 12, 0, 0, 1, 13
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs", "Rust", 0, 679, 0, 0, 162, 841
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs", "Rust", 0, 179, 0, 0, 32, 211
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs", "Rust", 0, 62, 0, 0, 3, 65
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs", "Rust", 0, 4, 0, 0, 1, 5
"c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json", "JSON", 38, 0, 0, 0, 0, 38
"Total", "-", 49, 1081, 9, 0, 220, 1359
1 filename language JSON Rust XML comment blank total
2 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs Rust 0 1 0 0 1 2
3 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json JSON 11 0 0 0 0 11
4 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml XML 0 0 5 0 0 5
5 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml XML 0 0 4 0 0 4
6 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs Rust 0 127 0 0 20 147
7 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs Rust 0 12 0 0 0 12
8 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs Rust 0 5 0 0 0 5
9 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs Rust 0 12 0 0 1 13
10 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs Rust 0 679 0 0 162 841
11 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs Rust 0 179 0 0 32 211
12 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs Rust 0 62 0 0 3 65
13 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs Rust 0 4 0 0 1 5
14 c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json JSON 38 0 0 0 0 38
15 Total - 49 1081 9 0 220 1359
@@ -0,0 +1 @@
{"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/tauri.conf.json":{"language":"JSON","code":38,"comment":0,"blank":0},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/main.rs":{"language":"Rust","code":4,"comment":0,"blank":1},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/ssh.rs":{"language":"Rust","code":179,"comment":0,"blank":32},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/network.rs":{"language":"Rust","code":12,"comment":0,"blank":1},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/mod.rs":{"language":"Rust","code":5,"comment":0,"blank":0},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/lib.rs":{"language":"Rust","code":62,"comment":0,"blank":3},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/files.rs":{"language":"Rust","code":12,"comment":0,"blank":0},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/router.rs":{"language":"Rust","code":679,"comment":0,"blank":162},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/icons/android/values/ic_launcher_background.xml":{"language":"XML","code":4,"comment":0,"blank":0},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/src/commands/controllers.rs":{"language":"Rust","code":127,"comment":0,"blank":20},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/capabilities/default.json":{"language":"JSON","code":11,"comment":0,"blank":0},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/build.rs":{"language":"Rust","code":1,"comment":0,"blank":1},"file:///c%3A/Users/User/Desktop/Projetos/Deployed/LR%20OpenWRT%20Tool/Frontend/lr-openwrt-tool/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml":{"language":"XML","code":5,"comment":0,"blank":0}}
@@ -0,0 +1,32 @@
# Summary
Date : 2026-05-18 12:12:03
Directory c:\\Users\\User\\Desktop\\Projetos\\Deployed\\LR OpenWRT Tool\\Frontend\\lr-openwrt-tool\\src-tauri
Total : 13 files, 1139 codes, 0 comments, 220 blanks, all 1359 lines
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| Rust | 9 | 1,081 | 0 | 220 | 1,301 |
| JSON | 2 | 49 | 0 | 0 | 49 |
| XML | 2 | 9 | 0 | 0 | 9 |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| . | 13 | 1,139 | 0 | 220 | 1,359 |
| . (Files) | 2 | 39 | 0 | 1 | 40 |
| capabilities | 1 | 11 | 0 | 0 | 11 |
| icons | 2 | 9 | 0 | 0 | 9 |
| icons\\android | 2 | 9 | 0 | 0 | 9 |
| icons\\android\\mipmap-anydpi-v26 | 1 | 5 | 0 | 0 | 5 |
| icons\\android\\values | 1 | 4 | 0 | 0 | 4 |
| src | 8 | 1,080 | 0 | 219 | 1,299 |
| src (Files) | 2 | 66 | 0 | 4 | 70 |
| src\\commands | 6 | 1,014 | 0 | 215 | 1,229 |
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
@@ -0,0 +1,48 @@
Date : 2026-05-18 12:12:03
Directory : c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri
Total : 13 files, 1139 codes, 0 comments, 220 blanks, all 1359 lines
Languages
+----------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------+------------+------------+------------+------------+------------+
| Rust | 9 | 1,081 | 0 | 220 | 1,301 |
| JSON | 2 | 49 | 0 | 0 | 49 |
| XML | 2 | 9 | 0 | 0 | 9 |
+----------+------------+------------+------------+------------+------------+
Directories
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| . | 13 | 1,139 | 0 | 220 | 1,359 |
| . (Files) | 2 | 39 | 0 | 1 | 40 |
| capabilities | 1 | 11 | 0 | 0 | 11 |
| icons | 2 | 9 | 0 | 0 | 9 |
| icons\android | 2 | 9 | 0 | 0 | 9 |
| icons\android\mipmap-anydpi-v26 | 1 | 5 | 0 | 0 | 5 |
| icons\android\values | 1 | 4 | 0 | 0 | 4 |
| src | 8 | 1,080 | 0 | 219 | 1,299 |
| src (Files) | 2 | 66 | 0 | 4 | 70 |
| src\commands | 6 | 1,014 | 0 | 215 | 1,229 |
+--------------------------------------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
Files
+--------------------------------------------------------------------------------------------------------------------------------------------+----------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+--------------------------------------------------------------------------------------------------------------------------------------------+----------+------------+------------+------------+------------+
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\build.rs | Rust | 1 | 0 | 1 | 2 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\capabilities\default.json | JSON | 11 | 0 | 0 | 11 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\mipmap-anydpi-v26\ic_launcher.xml | XML | 5 | 0 | 0 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\icons\android\values\ic_launcher_background.xml | XML | 4 | 0 | 0 | 4 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\controllers.rs | Rust | 127 | 0 | 20 | 147 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\files.rs | Rust | 12 | 0 | 0 | 12 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\mod.rs | Rust | 5 | 0 | 0 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\network.rs | Rust | 12 | 0 | 1 | 13 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\router.rs | Rust | 679 | 0 | 162 | 841 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\commands\ssh.rs | Rust | 179 | 0 | 32 | 211 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\lib.rs | Rust | 62 | 0 | 3 | 65 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\src\main.rs | Rust | 4 | 0 | 1 | 5 |
| c:\Users\User\Desktop\Projetos\Deployed\LR OpenWRT Tool\Frontend\lr-openwrt-tool\src-tauri\tauri.conf.json | JSON | 38 | 0 | 0 | 38 |
| Total | | 1,139 | 0 | 220 | 1,359 |
+--------------------------------------------------------------------------------------------------------------------------------------------+----------+------------+------------+------------+------------+
+147
View File
@@ -0,0 +1,147 @@
use ssh2::Session;
use std::{
io::Read,
net::{TcpStream, ToSocketAddrs},
time::Duration,
};
fn run_vps_command(
password: &str,
command: &str,
) -> Result<String, String> {
let address = "146.59.230.190:22";
let socket_address = address
.to_socket_addrs()
.map_err(|error| {
format!(
"failed to resolve VPS address: {}",
error
)
})?
.next()
.ok_or_else(|| {
format!(
"failed to resolve VPS address {}",
address
)
})?;
let tcp = TcpStream::connect_timeout(
&socket_address,
Duration::from_secs(8),
)
.map_err(|error| {
format!(
"failed to connect to VPS SSH: {}",
error
)
})?;
let _ = tcp.set_read_timeout(Some(
Duration::from_secs(30),
));
let _ = tcp.set_write_timeout(Some(
Duration::from_secs(30),
));
let mut session = Session::new()
.map_err(|error| {
format!(
"failed to create VPS SSH session: {}",
error
)
})?;
session.set_tcp_stream(tcp);
session.handshake().map_err(|error| {
format!(
"VPS SSH handshake failed: {}",
error
)
})?;
session
.userauth_password("lr-vpn", password)
.map_err(|error| {
format!(
"VPS SSH authentication failed: {}",
error
)
})?;
if !session.authenticated() {
return Err(
"VPS SSH authentication failed"
.into(),
);
}
let mut channel = session
.channel_session()
.map_err(|error| {
format!(
"failed to open VPS SSH channel: {}",
error
)
})?;
channel
.exec(command)
.map_err(|error| {
format!(
"failed to execute VPS command: {}",
error
)
})?;
let mut stdout = String::new();
channel
.read_to_string(&mut stdout)
.map_err(|error| {
format!(
"failed to read VPS command output: {}",
error
)
})?;
channel.wait_close().ok();
let exit_status = channel
.exit_status()
.map_err(|error| {
format!(
"failed to read VPS command exit status: {}",
error
)
})?;
if exit_status != 0 {
return Err(format!(
"VPS command failed with exit code {}:\n{}",
exit_status,
stdout
));
}
Ok(stdout)
}
#[tauri::command]
pub async fn list_controller_clients(
password: String,
) -> Result<String, String> {
if password.trim().is_empty() {
return Err(
"VPS password is required".into(),
);
}
run_vps_command(
&password,
"sudo /usr/local/sbin/lr-controllers-list",
)
}
+1
View File
@@ -2,3 +2,4 @@ pub mod files;
pub mod network; pub mod network;
pub mod router; pub mod router;
pub mod ssh; pub mod ssh;
pub mod controllers;
+195 -324
View File
@@ -2,17 +2,25 @@ use ssh2::Session;
use std::process::Command; use std::process::Command;
use std::{ use std::{
fs::File, fs::File,
io::{ Read, Write }, io::{Read, Write},
net::{ TcpStream, ToSocketAddrs }, net::{TcpStream, ToSocketAddrs},
path::Path, path::{Path, PathBuf},
thread, thread,
time::Duration, time::Duration,
}; };
use tauri::{AppHandle, Manager};
fn delay() { fn delay() {
thread::sleep(Duration::from_millis(350)); thread::sleep(Duration::from_millis(350));
} }
fn resource_path(app: &AppHandle, relative_path: &str) -> Result<PathBuf, String> {
app.path()
.resource_dir()
.map_err(|error| format!("failed to resolve resource directory: {}", error))
.map(|resource_dir| resource_dir.join("resources").join(relative_path))
}
#[tauri::command] #[tauri::command]
pub async fn detect_router(ip: String) -> Result<bool, String> { pub async fn detect_router(ip: String) -> Result<bool, String> {
delay(); delay();
@@ -64,9 +72,12 @@ fn run_system_ssh(ip: &str, command: &str) -> Result<String, String> {
return Ok(format!("{}{}", stdout, stderr)); return Ok(format!("{}{}", stdout, stderr));
} }
Err( Err(format!(
format!("system ssh failed with status {:?}:\n{}\n{}", output.status.code(), stderr, stdout) "system ssh failed with status {:?}:\n{}\n{}",
) output.status.code(),
stderr,
stdout
))
} }
fn open_router_session(ip: &str, password: &str) -> Result<Session, String> { fn open_router_session(ip: &str, password: &str) -> Result<Session, String> {
@@ -78,20 +89,20 @@ fn open_router_session(ip: &str, password: &str) -> Result<Session, String> {
.next() .next()
.ok_or_else(|| format!("failed to resolve router address {}", address))?; .ok_or_else(|| format!("failed to resolve router address {}", address))?;
let tcp = TcpStream::connect_timeout(&socket_address, Duration::from_secs(8)).map_err(|error| let tcp = TcpStream::connect_timeout(&socket_address, Duration::from_secs(8))
format!("failed to connect to SSH on {}: {}", ip, error) .map_err(|error| format!("failed to connect to SSH on {}: {}", ip, error))?;
)?;
let _ = tcp.set_read_timeout(Some(Duration::from_secs(30))); let _ = tcp.set_read_timeout(Some(Duration::from_secs(30)));
let _ = tcp.set_write_timeout(Some(Duration::from_secs(30))); let _ = tcp.set_write_timeout(Some(Duration::from_secs(30)));
let mut session = Session::new().map_err(|error| let mut session =
format!("failed to create SSH session: {}", error) Session::new().map_err(|error| format!("failed to create SSH session: {}", error))?;
)?;
session.set_tcp_stream(tcp); session.set_tcp_stream(tcp);
session.handshake().map_err(|error| format!("SSH handshake failed for {}: {}", ip, error))?; session
.handshake()
.map_err(|error| format!("SSH handshake failed for {}: {}", ip, error))?;
authenticate_router(&session, password).map_err(|error| format!("root@{}: {}", ip, error))?; authenticate_router(&session, password).map_err(|error| format!("root@{}: {}", ip, error))?;
@@ -102,11 +113,10 @@ fn scp_file_from_disk(
session: &Session, session: &Session,
local_path: &str, local_path: &str,
remote_path: &str, remote_path: &str,
mode: i32 mode: i32,
) -> Result<(), String> { ) -> Result<(), String> {
let mut local_file = File::open(local_path).map_err(|error| let mut local_file =
format!("failed to open {}: {}", local_path, error) File::open(local_path).map_err(|error| format!("failed to open {}: {}", local_path, error))?;
)?;
let file_size = local_file let file_size = local_file
.metadata() .metadata()
@@ -135,12 +145,7 @@ fn scp_file_from_disk(
Ok(()) Ok(())
} }
fn scp_string( fn scp_string(session: &Session, content: &str, remote_path: &str, mode: i32) -> Result<(), String> {
session: &Session,
content: &str,
remote_path: &str,
mode: i32
) -> Result<(), String> {
let bytes = content.as_bytes(); let bytes = content.as_bytes();
let mut remote_file = session let mut remote_file = session
@@ -260,9 +265,15 @@ pub async fn verify_router(ip: String) -> Result<bool, String> {
} }
#[tauri::command] #[tauri::command]
pub async fn upload_firmware_to_router(ip: String, password: String) -> Result<String, String> { pub async fn upload_firmware_to_router(
let local_firmware_path = app: AppHandle,
"resources/firmware/openwrt-23.05.5-zbt-we826-16m-litoral-golden-sysupgrade.bin"; ip: String,
password: String,
) -> Result<String, String> {
let local_firmware_path = resource_path(
&app,
"firmware/openwrt-23.05.5-zbt-we826-16m-litoral-golden-sysupgrade.bin",
)?;
let remote_firmware_path = "/tmp/firmware.bin"; let remote_firmware_path = "/tmp/firmware.bin";
@@ -270,16 +281,11 @@ pub async fn upload_firmware_to_router(ip: String, password: String) -> Result<S
return Err("router IP is required".into()); return Err("router IP is required".into());
} }
/*
* FACTORY / FRESH OPENWRT PATH
* Uses system scp when no password is set.
*/
if password.trim().is_empty() { if password.trim().is_empty() {
let target = format!("root@{}:{}", ip, remote_firmware_path); let target = format!("root@{}:{}", ip, remote_firmware_path);
let local_firmware_path_string = local_firmware_path.to_string_lossy().to_string();
let output = std::process::Command let output = Command::new("scp")
::new("scp")
.args([ .args([
"-O", "-O",
"-o", "-o",
@@ -288,103 +294,80 @@ pub async fn upload_firmware_to_router(ip: String, password: String) -> Result<S
"ConnectTimeout=10", "ConnectTimeout=10",
"-o", "-o",
"StrictHostKeyChecking=accept-new", "StrictHostKeyChecking=accept-new",
local_firmware_path, &local_firmware_path_string,
&target, &target,
]) ])
.output() .output()
.map_err(|error| { format!("failed to run system scp: {}", error) })?; .map_err(|error| format!("failed to run system scp: {}", error))?;
if output.status.success() { if output.status.success() {
return Ok( return Ok(format!(
format!("Firmware uploaded to {}:{} using system scp", ip, remote_firmware_path) "Firmware uploaded to {}:{} using system scp",
); ip, remote_firmware_path
));
} }
return Err( return Err(format!(
format!( "system scp failed:\n{}\n{}",
"system scp failed:\n{}\n{}", String::from_utf8_lossy(&output.stderr),
String::from_utf8_lossy(&output.stderr), String::from_utf8_lossy(&output.stdout)
String::from_utf8_lossy(&output.stdout) ));
)
);
} }
/* let session = open_router_session(&ip, &password)?;
* PASSWORD SSH PATH
*/
let address = format!("{}:22", ip); let mut local_file = File::open(&local_firmware_path).map_err(|error| {
format!(
let socket_address = address "failed to open local firmware file {}: {}",
.to_socket_addrs() local_firmware_path.display(),
.map_err(|error| { format!("failed to resolve router address: {}", error) })? error
.next() )
.ok_or_else(|| { format!("failed to resolve router address {}", address) })?;
let tcp = TcpStream::connect_timeout(&socket_address, Duration::from_secs(8)).map_err(|error| {
format!("failed to connect to SSH on {}: {}", ip, error)
})?;
tcp
.set_read_timeout(Some(Duration::from_secs(30)))
.map_err(|error| { format!("failed to set read timeout: {}", error) })?;
tcp
.set_write_timeout(Some(Duration::from_secs(30)))
.map_err(|error| { format!("failed to set write timeout: {}", error) })?;
let mut session = Session::new().map_err(|error| {
format!("failed to create SSH session: {}", error)
})?;
session.set_tcp_stream(tcp);
session.handshake().map_err(|error| { format!("SSH handshake failed for {}: {}", ip, error) })?;
session
.userauth_password("root", &password)
.map_err(|error| { format!("SSH authentication failed for root@{}: {}", ip, error) })?;
if !session.authenticated() {
return Err(format!("SSH authentication failed for root@{}", ip));
}
let mut local_file = File::open(local_firmware_path).map_err(|error| {
format!("failed to open local firmware file {}: {}", local_firmware_path, error)
})?; })?;
let firmware_size = local_file let firmware_size = local_file
.metadata() .metadata()
.map_err(|error| { format!("failed to read firmware metadata: {}", error) })? .map_err(|error| format!("failed to read firmware metadata: {}", error))?
.len(); .len();
let mut buffer = Vec::new(); let mut buffer = Vec::new();
local_file local_file
.read_to_end(&mut buffer) .read_to_end(&mut buffer)
.map_err(|error| { format!("failed to read firmware file: {}", error) })?; .map_err(|error| format!("failed to read firmware file: {}", error))?;
let mut remote_file = session let mut remote_file = session
.scp_send(Path::new(remote_firmware_path), 0o644, firmware_size, None) .scp_send(Path::new(remote_firmware_path), 0o644, firmware_size, None)
.map_err(|error| { .map_err(|error| {
format!("failed to start SCP upload to {}: {}", remote_firmware_path, error) format!(
"failed to start SCP upload to {}: {}",
remote_firmware_path, error
)
})?; })?;
remote_file remote_file
.write_all(&buffer) .write_all(&buffer)
.map_err(|error| { format!("failed to upload firmware via SCP: {}", error) })?; .map_err(|error| format!("failed to upload firmware via SCP: {}", error))?;
remote_file.send_eof().map_err(|error| { format!("failed to send SCP EOF: {}", error) })?; remote_file
.send_eof()
.map_err(|error| format!("failed to send SCP EOF: {}", error))?;
remote_file.wait_eof().map_err(|error| { format!("failed waiting for SCP EOF: {}", error) })?; remote_file
.wait_eof()
.map_err(|error| format!("failed waiting for SCP EOF: {}", error))?;
remote_file.close().map_err(|error| { format!("failed closing SCP channel: {}", error) })?; remote_file
.close()
.map_err(|error| format!("failed closing SCP channel: {}", error))?;
remote_file remote_file
.wait_close() .wait_close()
.map_err(|error| { format!("failed waiting for SCP close: {}", error) })?; .map_err(|error| format!("failed waiting for SCP close: {}", error))?;
Ok(format!("Firmware uploaded to {}:{} ({} bytes)", ip, remote_firmware_path, firmware_size)) Ok(format!(
"Firmware uploaded to {}:{} ({} bytes)",
ip, remote_firmware_path, firmware_size
))
} }
#[tauri::command] #[tauri::command]
@@ -399,22 +382,26 @@ pub async fn flash_router_sysupgrade(ip: String, password: String) -> Result<Str
let output = run_system_ssh(&ip, flash_command); let output = run_system_ssh(&ip, flash_command);
return match output { return match output {
Ok(output) => Ok(output) => Ok(format!(
Ok(format!("sysupgrade command submitted on {} using system ssh. {}", ip, output)), "sysupgrade command submitted on {} using system ssh. {}",
ip, output
)),
Err(error) => { Err(error) => {
let lowered = error.to_lowercase(); let lowered = error.to_lowercase();
if if lowered.contains("commencing upgrade")
lowered.contains("commencing upgrade") || || lowered.contains("closing all shell sessions")
lowered.contains("closing all shell sessions") || || lowered.contains("connection failed")
lowered.contains("connection failed") || || lowered.contains("connection reset")
lowered.contains("connection reset") || || lowered.contains("broken pipe")
lowered.contains("broken pipe") || || lowered.contains("closed")
lowered.contains("closed") || || lowered.contains("disconnect")
lowered.contains("disconnect") || || lowered.contains("sysupgrade")
lowered.contains("sysupgrade")
{ {
Ok(format!("sysupgrade started on {}; SSH disconnected as expected.", ip)) Ok(format!(
"sysupgrade started on {}; SSH disconnected as expected.",
ip
))
} else { } else {
Err(error) Err(error)
} }
@@ -422,40 +409,15 @@ pub async fn flash_router_sysupgrade(ip: String, password: String) -> Result<Str
}; };
} }
let address = format!("{}:22", ip); let session = open_router_session(&ip, &password)?;
let socket_address = address
.to_socket_addrs()
.map_err(|error| { format!("failed to resolve router address: {}", error) })?
.next()
.ok_or_else(|| { format!("failed to resolve router address {}", address) })?;
let tcp = TcpStream::connect_timeout(&socket_address, Duration::from_secs(8)).map_err(|error| {
format!("failed to connect to SSH on {}: {}", ip, error)
})?;
tcp.set_read_timeout(Some(Duration::from_secs(8))).ok();
tcp.set_write_timeout(Some(Duration::from_secs(8))).ok();
let mut session = Session::new().map_err(|error| {
format!("failed to create SSH session: {}", error)
})?;
session.set_tcp_stream(tcp);
session.handshake().map_err(|error| { format!("SSH handshake failed for {}: {}", ip, error) })?;
authenticate_router(&session, &password).map_err(|error| {
format!("root@{}: {}", ip, error)
})?;
let mut channel = session let mut channel = session
.channel_session() .channel_session()
.map_err(|error| { format!("failed to open SSH channel: {}", error) })?; .map_err(|error| format!("failed to open SSH channel: {}", error))?;
channel channel
.exec(flash_command) .exec(flash_command)
.map_err(|error| { format!("failed to start sysupgrade: {}", error) })?; .map_err(|error| format!("failed to start sysupgrade: {}", error))?;
let mut output = String::new(); let mut output = String::new();
let _ = channel.read_to_string(&mut output); let _ = channel.read_to_string(&mut output);
@@ -463,17 +425,20 @@ pub async fn flash_router_sysupgrade(ip: String, password: String) -> Result<Str
let lowered = output.to_lowercase(); let lowered = output.to_lowercase();
if if lowered.contains("commencing upgrade")
lowered.contains("commencing upgrade") || || lowered.contains("closing all shell sessions")
lowered.contains("closing all shell sessions") || || lowered.contains("sysupgrade")
lowered.contains("sysupgrade")
{ {
return Ok( return Ok(format!(
format!("sysupgrade started on {}; router should reboot shortly. {}", ip, output) "sysupgrade started on {}; router should reboot shortly. {}",
); ip, output
));
} }
Ok(format!("sysupgrade command submitted on {}. Router should reboot shortly. {}", ip, output)) Ok(format!(
"sysupgrade command submitted on {}. Router should reboot shortly. {}",
ip, output
))
} }
#[tauri::command] #[tauri::command]
@@ -489,14 +454,10 @@ pub async fn reconnect_router_after_flash(ip: String, password: String) -> Resul
if password.trim().is_empty() { if password.trim().is_empty() {
match run_system_ssh(&ip, "ubus call system board") { match run_system_ssh(&ip, "ubus call system board") {
Ok(output) => { Ok(output) => {
return Ok( return Ok(format!(
format!( "Router reconnected after flash on attempt {}/{} using system ssh.\n{}",
"Router reconnected after flash on attempt {}/{} using system ssh.\n{}", attempt, max_attempts, output
attempt, ));
max_attempts,
output
)
);
} }
Err(_) => { Err(_) => {
thread::sleep(wait_between_attempts); thread::sleep(wait_between_attempts);
@@ -505,93 +466,24 @@ pub async fn reconnect_router_after_flash(ip: String, password: String) -> Resul
} }
} }
let address = format!("{}:22", ip); match open_router_session(&ip, &password) {
Ok(session) => match run_ssh_command(&session, "ubus call system board") {
let socket_address = match address.to_socket_addrs() { Ok(output) => {
Ok(mut addresses) => return Ok(format!(
match addresses.next() { "Router reconnected after flash on attempt {}/{}.\n{}",
Some(socket_address) => socket_address, attempt, max_attempts, output
None => { ));
thread::sleep(wait_between_attempts);
continue;
}
} }
Err(_) => { Err(_) => thread::sleep(wait_between_attempts),
thread::sleep(wait_between_attempts); },
continue; Err(_) => thread::sleep(wait_between_attempts),
}
};
let tcp = match TcpStream::connect_timeout(&socket_address, Duration::from_secs(4)) {
Ok(tcp) => tcp,
Err(_) => {
thread::sleep(wait_between_attempts);
continue;
}
};
let _ = tcp.set_read_timeout(Some(Duration::from_secs(8)));
let _ = tcp.set_write_timeout(Some(Duration::from_secs(8)));
let mut session = match Session::new() {
Ok(session) => session,
Err(_) => {
thread::sleep(wait_between_attempts);
continue;
}
};
session.set_tcp_stream(tcp);
if session.handshake().is_err() {
thread::sleep(wait_between_attempts);
continue;
} }
if authenticate_router(&session, &password).is_err() {
thread::sleep(wait_between_attempts);
continue;
}
let mut channel = match session.channel_session() {
Ok(channel) => channel,
Err(_) => {
thread::sleep(wait_between_attempts);
continue;
}
};
if channel.exec("ubus call system board").is_err() {
thread::sleep(wait_between_attempts);
continue;
}
let mut output = String::new();
if channel.read_to_string(&mut output).is_err() {
thread::sleep(wait_between_attempts);
continue;
}
let _ = channel.wait_close();
return Ok(
format!(
"Router reconnected after flash on attempt {}/{}.\n{}",
attempt,
max_attempts,
output
)
);
} }
Err( Err(format!(
format!( "Router did not become reachable over SSH at {} after {} attempts. Replug Ethernet and retry.",
"Router did not become reachable over SSH at {} after {} attempts. Replug Ethernet and retry.", ip, max_attempts
ip, ))
max_attempts
)
)
} }
#[tauri::command] #[tauri::command]
@@ -604,66 +496,28 @@ pub async fn check_router_after_flash(ip: String, password: String) -> Result<St
return run_system_ssh(&ip, "ubus call system board"); return run_system_ssh(&ip, "ubus call system board");
} }
let address = format!("{}:22", ip); let session = open_router_session(&ip, &password)?;
run_ssh_command(&session, "ubus call system board")
let socket_address = address
.to_socket_addrs()
.map_err(|error| format!("failed to resolve router address: {}", error))?
.next()
.ok_or_else(|| format!("failed to resolve router address {}", address))?;
let tcp = TcpStream::connect_timeout(&socket_address, Duration::from_secs(4)).map_err(|error|
format!("SSH not ready at {}: {}", ip, error)
)?;
let _ = tcp.set_read_timeout(Some(Duration::from_secs(8)));
let _ = tcp.set_write_timeout(Some(Duration::from_secs(8)));
let mut session = Session::new().map_err(|error|
format!("failed to create SSH session: {}", error)
)?;
session.set_tcp_stream(tcp);
session.handshake().map_err(|error| format!("SSH handshake failed: {}", error))?;
authenticate_router(&session, &password).map_err(|error| format!("root@{}: {}", ip, error))?;
let mut channel = session
.channel_session()
.map_err(|error| format!("failed to open SSH channel: {}", error))?;
channel
.exec("ubus call system board")
.map_err(|error| format!("failed to run ubus: {}", error))?;
let mut output = String::new();
channel
.read_to_string(&mut output)
.map_err(|error| format!("failed to read router info: {}", error))?;
let _ = channel.wait_close();
Ok(output)
} }
#[tauri::command] #[tauri::command]
pub async fn upload_provisioning_bundle( pub async fn upload_provisioning_bundle(
app: AppHandle,
ip: String, ip: String,
password: String, password: String,
env_content: String env_content: String,
) -> Result<String, String> { ) -> Result<String, String> {
if ip.trim().is_empty() { if ip.trim().is_empty() {
return Err("router IP is required".into()); return Err("router IP is required".into());
} }
let local_script_path = "resources/provisioning/provision.sh"; let local_script_path = resource_path(&app, "provisioning/provision.sh")?;
let remote_script_path = "/tmp/provision.sh"; let remote_script_path = "/tmp/provision.sh";
let remote_env_path = "/tmp/router.env"; let remote_env_path = "/tmp/router.env";
if password.trim().is_empty() { if password.trim().is_empty() {
let script_target = format!("root@{}:{}", ip, remote_script_path); let script_target = format!("root@{}:{}", ip, remote_script_path);
let local_script_path_string = local_script_path.to_string_lossy().to_string();
let script_upload = Command::new("scp") let script_upload = Command::new("scp")
.args([ .args([
@@ -676,37 +530,41 @@ pub async fn upload_provisioning_bundle(
"StrictHostKeyChecking=no", "StrictHostKeyChecking=no",
"-o", "-o",
"UserKnownHostsFile=NUL", "UserKnownHostsFile=NUL",
local_script_path, &local_script_path_string,
&script_target, &script_target,
]) ])
.output() .output()
.map_err(|error| format!("failed to run scp for provision.sh: {}", error))?; .map_err(|error| format!("failed to run scp for provision.sh: {}", error))?;
if !script_upload.status.success() { if !script_upload.status.success() {
return Err( return Err(format!(
format!( "failed to upload provision.sh:\n{}\n{}",
"failed to upload provision.sh:\n{}\n{}", String::from_utf8_lossy(&script_upload.stderr),
String::from_utf8_lossy(&script_upload.stderr), String::from_utf8_lossy(&script_upload.stdout)
String::from_utf8_lossy(&script_upload.stdout) ));
)
);
} }
let env_command = format!( let env_command = format!(
"cat > {} <<'EOF'\n{}\nEOF\nchmod +x {}", "cat > {} <<'EOF'\n{}\nEOF\nchmod +x {}",
remote_env_path, remote_env_path, env_content, remote_script_path
env_content,
remote_script_path
); );
run_system_ssh(&ip, &env_command)?; run_system_ssh(&ip, &env_command)?;
return Ok(format!("uploaded provision.sh and router.env to {} using system ssh/scp", ip)); return Ok(format!(
"uploaded provision.sh and router.env to {} using system ssh/scp",
ip
));
} }
let session = open_router_session(&ip, &password)?; let session = open_router_session(&ip, &password)?;
scp_file_from_disk(&session, local_script_path, remote_script_path, 0o755)?; scp_file_from_disk(
&session,
local_script_path.to_string_lossy().as_ref(),
remote_script_path,
0o755,
)?;
scp_string(&session, &env_content, remote_env_path, 0o600)?; scp_string(&session, &env_content, remote_env_path, 0o600)?;
@@ -716,16 +574,21 @@ pub async fn upload_provisioning_bundle(
} }
#[tauri::command] #[tauri::command]
pub async fn upload_udp2raw_setup_script(ip: String, password: String) -> Result<String, String> { pub async fn upload_udp2raw_setup_script(
app: AppHandle,
ip: String,
password: String,
) -> Result<String, String> {
if ip.trim().is_empty() { if ip.trim().is_empty() {
return Err("router IP is required".into()); return Err("router IP is required".into());
} }
let local_script_path = "resources/udp2raw/setup_udp2raw.sh"; let local_script_path = resource_path(&app, "udp2raw/setup_udp2raw.sh")?;
let remote_script_path = "/tmp/setup_udp2raw.sh"; let remote_script_path = "/tmp/setup_udp2raw.sh";
if password.trim().is_empty() { if password.trim().is_empty() {
let target = format!("root@{}:{}", ip, remote_script_path); let target = format!("root@{}:{}", ip, remote_script_path);
let local_script_path_string = local_script_path.to_string_lossy().to_string();
let output = Command::new("scp") let output = Command::new("scp")
.args([ .args([
@@ -738,20 +601,18 @@ pub async fn upload_udp2raw_setup_script(ip: String, password: String) -> Result
"StrictHostKeyChecking=no", "StrictHostKeyChecking=no",
"-o", "-o",
"UserKnownHostsFile=NUL", "UserKnownHostsFile=NUL",
local_script_path, &local_script_path_string,
&target, &target,
]) ])
.output() .output()
.map_err(|error| format!("failed to run scp for setup_udp2raw.sh: {}", error))?; .map_err(|error| format!("failed to run scp for setup_udp2raw.sh: {}", error))?;
if !output.status.success() { if !output.status.success() {
return Err( return Err(format!(
format!( "failed to upload setup_udp2raw.sh:\n{}\n{}",
"failed to upload setup_udp2raw.sh:\n{}\n{}", String::from_utf8_lossy(&output.stderr),
String::from_utf8_lossy(&output.stderr), String::from_utf8_lossy(&output.stdout)
String::from_utf8_lossy(&output.stdout) ));
)
);
} }
run_system_ssh(&ip, "chmod +x /tmp/setup_udp2raw.sh")?; run_system_ssh(&ip, "chmod +x /tmp/setup_udp2raw.sh")?;
@@ -761,7 +622,12 @@ pub async fn upload_udp2raw_setup_script(ip: String, password: String) -> Result
let session = open_router_session(&ip, &password)?; let session = open_router_session(&ip, &password)?;
scp_file_from_disk(&session, local_script_path, remote_script_path, 0o755)?; scp_file_from_disk(
&session,
local_script_path.to_string_lossy().as_ref(),
remote_script_path,
0o755,
)?;
run_ssh_command(&session, "chmod +x /tmp/setup_udp2raw.sh")?; run_ssh_command(&session, "chmod +x /tmp/setup_udp2raw.sh")?;
@@ -791,8 +657,7 @@ pub async fn check_udp2raw_router_status(ip: String, password: String) -> Result
return Err("router IP is required".into()); return Err("router IP is required".into());
} }
let command = let command = r#"
r#"
echo "== udp2raw binary ==" echo "== udp2raw binary =="
if command -v udp2raw >/dev/null 2>&1; then if command -v udp2raw >/dev/null 2>&1; then
command -v udp2raw command -v udp2raw
@@ -899,12 +764,7 @@ pub async fn test_udp2raw_tunnel(ip: String, password: String) -> Result<String,
return run_ssh_command(&session, command); return run_ssh_command(&session, command);
} }
Err(error) => { Err(error) => {
last_error = format!( last_error = format!("SSH attempt {}/5 failed: {}", attempt, error);
"SSH attempt {}/5 failed: {}",
attempt,
error
);
thread::sleep(Duration::from_secs(2)); thread::sleep(Duration::from_secs(2));
} }
} }
@@ -914,16 +774,21 @@ pub async fn test_udp2raw_tunnel(ip: String, password: String) -> Result<String,
} }
#[tauri::command] #[tauri::command]
pub async fn upload_udp2raw_binary(ip: String, password: String) -> Result<String, String> { pub async fn upload_udp2raw_binary(
app: AppHandle,
ip: String,
password: String,
) -> Result<String, String> {
if ip.trim().is_empty() { if ip.trim().is_empty() {
return Err("router IP is required".into()); return Err("router IP is required".into());
} }
let local_binary_path = "resources/udp2raw/udp2raw"; let local_binary_path = resource_path(&app, "udp2raw/udp2raw")?;
let remote_binary_path = "/usr/bin/udp2raw"; let remote_binary_path = "/usr/bin/udp2raw";
if password.trim().is_empty() { if password.trim().is_empty() {
let target = format!("root@{}:{}", ip, remote_binary_path); let target = format!("root@{}:{}", ip, remote_binary_path);
let local_binary_path_string = local_binary_path.to_string_lossy().to_string();
let output = Command::new("scp") let output = Command::new("scp")
.args([ .args([
@@ -936,25 +801,23 @@ pub async fn upload_udp2raw_binary(ip: String, password: String) -> Result<Strin
"StrictHostKeyChecking=no", "StrictHostKeyChecking=no",
"-o", "-o",
"UserKnownHostsFile=NUL", "UserKnownHostsFile=NUL",
local_binary_path, &local_binary_path_string,
&target, &target,
]) ])
.output() .output()
.map_err(|error| { format!("failed to run scp for udp2raw binary: {}", error) })?; .map_err(|error| format!("failed to run scp for udp2raw binary: {}", error))?;
if !output.status.success() { if !output.status.success() {
return Err( return Err(format!(
format!( "failed to upload udp2raw binary:\n{}\n{}",
"failed to upload udp2raw binary:\n{}\n{}", String::from_utf8_lossy(&output.stderr),
String::from_utf8_lossy(&output.stderr), String::from_utf8_lossy(&output.stdout)
String::from_utf8_lossy(&output.stdout) ));
)
);
} }
run_system_ssh( run_system_ssh(
&ip, &ip,
"chmod +x /usr/bin/udp2raw && /usr/bin/udp2raw --help >/dev/null 2>&1 || true" "chmod +x /usr/bin/udp2raw && /usr/bin/udp2raw --help >/dev/null 2>&1 || true",
)?; )?;
return Ok("uploaded udp2raw binary to /usr/bin/udp2raw".into()); return Ok("uploaded udp2raw binary to /usr/bin/udp2raw".into());
@@ -962,9 +825,17 @@ pub async fn upload_udp2raw_binary(ip: String, password: String) -> Result<Strin
let session = open_router_session(&ip, &password)?; let session = open_router_session(&ip, &password)?;
scp_file_from_disk(&session, local_binary_path, remote_binary_path, 0o755)?; scp_file_from_disk(
&session,
local_binary_path.to_string_lossy().as_ref(),
remote_binary_path,
0o755,
)?;
run_ssh_command(&session, "chmod +x /usr/bin/udp2raw && ls -l /usr/bin/udp2raw")?; run_ssh_command(
&session,
"chmod +x /usr/bin/udp2raw && ls -l /usr/bin/udp2raw",
)?;
Ok("uploaded udp2raw binary to /usr/bin/udp2raw".into()) Ok("uploaded udp2raw binary to /usr/bin/udp2raw".into())
} }
+3 -1
View File
@@ -23,6 +23,7 @@ use commands::{
upload_udp2raw_binary upload_udp2raw_binary
}, },
ssh::{ inspect_router_with_password, probe_router_ssh, remove_known_host }, ssh::{ inspect_router_with_password, probe_router_ssh, remove_known_host },
controllers::{ list_controller_clients}
}; };
#[cfg_attr(mobile, tauri::mobile_entry_point)] #[cfg_attr(mobile, tauri::mobile_entry_point)]
@@ -54,7 +55,8 @@ pub fn run() {
run_udp2raw_setup, run_udp2raw_setup,
test_udp2raw_tunnel, test_udp2raw_tunnel,
check_udp2raw_router_status, check_udp2raw_router_status,
upload_udp2raw_binary upload_udp2raw_binary,
list_controller_clients
] ]
) )
.run(tauri::generate_context!()) .run(tauri::generate_context!())
+3
View File
@@ -30,6 +30,9 @@
"targets": "all", "targets": "all",
"icon": [ "icon": [
"icons/icon.ico" "icons/icon.ico"
],
"resources": [
"resources/**/*"
] ]
} }
} }
+5
View File
@@ -18,6 +18,7 @@ import { BackendSettings } from '@/components/settings/BackendSettings';
import { ActivityLogs } from '@/components/activity/ActivityLogs'; import { ActivityLogs } from '@/components/activity/ActivityLogs';
import { Card } from '@/components/ui/Card'; import { Card } from '@/components/ui/Card';
import { Udp2rawConfig } from '@/components/udp2raw/Udp2rawConfig'; import { Udp2rawConfig } from '@/components/udp2raw/Udp2rawConfig';
import { ControllersRoute } from '@/components/controllers/ControllersRoute';
import { vpnApi } from '@/services/vpnApi'; import { vpnApi } from '@/services/vpnApi';
import { vpsApi } from '@/services/vpsApi'; import { vpsApi } from '@/services/vpsApi';
@@ -281,6 +282,10 @@ export function RouteView({
return <DashboardRoute />; return <DashboardRoute />;
} }
if (active === 'Controladores') {
return <ControllersRoute />;
}
if (active === 'Provisionamento') { if (active === 'Provisionamento') {
return <ProvisioningWizard />; return <ProvisioningWizard />;
} }
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -5,12 +5,14 @@ import {
RadioTower, RadioTower,
Settings, Settings,
Wrench, Wrench,
Router
} from 'lucide-react'; } from 'lucide-react';
import logoIcon from '@/assets/logo-icon.png'; import logoIcon from '@/assets/logo-icon.png';
const items = [ const items = [
['Painel', Gauge], ['Painel', Gauge],
['Controladores', Router],
['Configuração UDP2RAW', RadioTower], ['Configuração UDP2RAW', RadioTower],
['Provisionamento', Wrench], ['Provisionamento', Wrench],
['Registos de Atividade', FileClock], ['Registos de Atividade', FileClock],
@@ -57,18 +59,16 @@ export function Sidebar({
key={label} key={label}
type="button" type="button"
onClick={() => onSelect(label)} onClick={() => onSelect(label)}
className={`group flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left text-sm font-semibold transition-all duration-200 ${ className={`group flex w-full items-center gap-3 rounded-2xl px-4 py-3 text-left text-sm font-semibold transition-all duration-200 ${isActive
isActive
? 'border border-blue-500/20 bg-blue-500/15 text-white shadow-[0_0_25px_rgba(59,130,246,0.12)]' ? 'border border-blue-500/20 bg-blue-500/15 text-white shadow-[0_0_25px_rgba(59,130,246,0.12)]'
: 'border border-transparent text-slate-300 hover:border-white/5 hover:bg-white/[0.035] hover:text-white' : 'border border-transparent text-slate-300 hover:border-white/5 hover:bg-white/[0.035] hover:text-white'
}`} }`}
> >
<div <div
className={`rounded-xl p-2 transition ${ className={`rounded-xl p-2 transition ${isActive
isActive
? 'bg-blue-500/10 text-blue-300' ? 'bg-blue-500/10 text-blue-300'
: 'bg-white/[0.03] text-slate-400 group-hover:text-slate-200' : 'bg-white/[0.03] text-slate-400 group-hover:text-slate-200'
}`} }`}
> >
<Icon size={17} /> <Icon size={17} />
</div> </div>
File diff suppressed because it is too large Load Diff
+7 -4
View File
@@ -14,11 +14,13 @@ type ButtonProps =
const variants: Record<ButtonVariant, string> = { const variants: Record<ButtonVariant, string> = {
primary: primary:
'bg-blue-500 text-white hover:bg-blue-400', 'border border-white/10 bg-white/[0.035] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] hover:border-blue-400/30 hover:bg-blue-500/10 hover:text-blue-50',
secondary: secondary:
'border border-white/10 bg-white/[0.04] text-slate-200 hover:bg-white/[0.08]', 'border border-white/10 bg-white/[0.02] text-slate-200 hover:bg-white/[0.05] hover:text-white',
danger: danger:
'border border-red-500/20 bg-red-500/10 text-red-300 hover:bg-red-500/20', 'border border-red-500/20 bg-red-500/10 text-red-300 hover:border-red-400/30 hover:bg-red-500/20 hover:text-red-100',
}; };
export function Button({ export function Button({
@@ -31,7 +33,8 @@ export function Button({
<button <button
{...props} {...props}
className={clsx( className={clsx(
'inline-flex items-center justify-center gap-2 rounded-xl px-4 py-2 text-sm font-semibold transition disabled:cursor-not-allowed disabled:opacity-50', 'inline-flex items-center justify-center gap-2 rounded-2xl px-4 py-3 text-sm font-black tracking-[-0.01em] transition-all duration-200 disabled:cursor-not-allowed disabled:opacity-50',
'backdrop-blur-sm',
variants[variant], variants[variant],
className, className,
)} )}
+4 -4
View File
@@ -1,9 +1,9 @@
import type { AppSettings } from '@/types/api'; import type { AppSettings } from '@/types/api';
const defaults: AppSettings = { const defaults: AppSettings = { // FOR DEBUG AND DEV PURPOSES ONLY ==========================>
backendUrl: 'http://146.59.230.190:8080', backendUrl: 'http://localhost:8080',// FOR DEBUG AND DEV PURPOSES ONLY ==========================>
apiKey: apiKey:// FOR DEBUG AND DEV PURPOSES ONLY ==========================>
'b8184608fcab419da2ce9a220ee6017daaff637b627e43ebac31b6b7c3344349', 'dev-api-key',// FOR DEBUG AND DEV PURPOSES ONLY ==========================>
}; };
const SETTINGS_KEY = const SETTINGS_KEY =
+149 -17
View File
@@ -1,31 +1,163 @@
import { apiRequest } from './apiClient'; import { apiRequest } from "./apiClient";
import type { import type { NetworkTrafficResponse, VpsHealth } from "@/types/api";
NetworkTrafficResponse,
VpsHealth, export type ControllerClient = {
} from '@/types/api'; id: string;
name: string;
file: string;
path: string;
controller_count: number;
modified_at: string;
};
export type ControllerClientsResponse = {
clients: ControllerClient[];
};
export type ControllerClientFileResponse = {
content: string;
};
export type RouterFirewallRule = {
id: string;
name: string;
proto: string;
srcZone: string;
destZone: string;
externalPort: string;
internalIp: string;
internalPort: string;
target: string;
};
export type RouterFirewallRulesResponse = {
ok: boolean;
routerHost: string;
rules: RouterFirewallRule[];
fetchedAt: string;
};
export const vpsApi = { export const vpsApi = {
health: () => health: () => apiRequest<VpsHealth>("/api/vps/health"),
apiRequest<VpsHealth>(
'/api/vps/health',
),
networkTraffic: () => networkTraffic: () =>
apiRequest<NetworkTrafficResponse>( apiRequest<NetworkTrafficResponse>("/api/vps/network-traffic"),
'/api/vps/network-traffic',
),
udp2rawTraffic: () => udp2rawTraffic: () =>
apiRequest<NetworkTrafficResponse>( apiRequest<NetworkTrafficResponse>("/api/vps/udp2raw-traffic"),
'/api/vps/udp2raw-traffic',
),
rollbackLastBackup: () => rollbackLastBackup: () =>
apiRequest<{ restored: boolean }>( apiRequest<{ restored: boolean }>(
'/api/vps/wireguard/rollback-last-backup', "/api/vps/wireguard/rollback-last-backup",
{ {
method: 'POST', method: "POST",
}, },
), ),
// ALL clients
listControllerClients: () =>
apiRequest<ControllerClientsResponse>("/api/vps/controllers/clients"),
// ONE client's .txt content
readControllerClient: (clientId: string) =>
apiRequest<ControllerClientFileResponse>(
`/api/vps/controllers/clients/${encodeURIComponent(clientId)}`,
),
updateControllerClient: (clientId: string, content: string) =>
apiRequest<ControllerClientFileResponse>(
`/api/vps/controllers/clients/${encodeURIComponent(clientId)}`,
{
method: "POST",
body: JSON.stringify({ content }),
},
),
createControllerClient: (name: string, password: string) =>
apiRequest<ControllerClientFileResponse>(`/api/vps/controllers/clients`, {
method: "POST",
body: JSON.stringify({
name,
password,
}),
}),
deleteControllerClient: (clientId: string) =>
apiRequest<ControllerClientFileResponse>(`/api/vps/controllers/clients`, {
method: "DELETE",
body: JSON.stringify({ clientId }),
}),
getRouterFirewallRules: (routerHost: string, routerPassword: string) =>
apiRequest<RouterFirewallRulesResponse>(
"/api/vps/controllers/routers/firewall/rules",
{
method: "POST",
body: JSON.stringify({
routerHost,
routerPassword,
}),
},
),
createRouterFirewallRule: (
routerHost: string,
routerPassword: string,
rule: RouterFirewallRule,
) =>
apiRequest<{
ok: boolean;
routerHost: string;
rule: RouterFirewallRule;
deletedId: string | null;
fetchedAt: string;
}>("/api/vps/controllers/routers/firewall/rules/create", {
method: "POST",
body: JSON.stringify({
routerHost,
routerPassword,
...rule,
}),
}),
updateRouterFirewallRule: (
routerHost: string,
routerPassword: string,
rule: RouterFirewallRule,
) =>
apiRequest<{
ok: boolean;
routerHost: string;
rule: RouterFirewallRule;
deletedId: string | null;
fetchedAt: string;
}>("/api/vps/controllers/routers/firewall/rules/update", {
method: "POST",
body: JSON.stringify({
routerHost,
routerPassword,
...rule,
}),
}),
deleteRouterFirewallRule: (
routerHost: string,
routerPassword: string,
id: string,
) =>
apiRequest<{
ok: boolean;
routerHost: string;
rule: null;
deletedId: string;
fetchedAt: string;
}>("/api/vps/controllers/routers/firewall/rules", {
method: "DELETE",
body: JSON.stringify({
routerHost,
routerPassword,
id,
}),
}),
}; };