Compare commits
1054 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9650d3cf5 | ||
|
|
3c959a7920 | ||
|
|
5e170da542 | ||
|
|
63932fb5bc | ||
|
|
741c0f9ede | ||
|
|
08abbabaad | ||
|
|
65c8f81afd | ||
|
|
80958c2e3f | ||
|
|
233873704d | ||
|
|
90322c4747 | ||
|
|
57e6a330be | ||
|
|
0f86b05ce5 | ||
|
|
9dd3a0a2d1 | ||
|
|
20f847c6d8 | ||
|
|
8cd20ab343 | ||
|
|
de5dfa9d06 | ||
|
|
19fe6d53d5 | ||
|
|
37fa7fe8a8 | ||
|
|
5ec13d89ec | ||
|
|
a0a5410af9 | ||
|
|
b234e1c859 | ||
|
|
cd761a058f | ||
|
|
bf137a9755 | ||
|
|
81cfa72b72 | ||
|
|
c15b5bba5c | ||
|
|
c7913c389f | ||
|
|
fc8d17788a | ||
|
|
ff72b45f7c | ||
|
|
692cf9305d | ||
|
|
790e98d8a7 | ||
|
|
0bd985282f | ||
|
|
1e75eeab4c | ||
|
|
a0d34876cc | ||
|
|
c14fa5606d | ||
|
|
aab910f68a | ||
|
|
b9a7516eb8 | ||
|
|
5cf453d4fb | ||
|
|
ff40a5acc0 | ||
|
|
7e2559c229 | ||
|
|
64d6f8be92 | ||
|
|
c91e428e77 | ||
|
|
ee35f35794 | ||
|
|
7492a07244 | ||
|
|
3f3143452e | ||
|
|
e2e5a10e7e | ||
|
|
85335bcdbb | ||
|
|
93420b1f86 | ||
|
|
b7d60ea818 | ||
|
|
0551cd1eea | ||
|
|
b86f1d75b5 | ||
|
|
89fb5c9b3b | ||
|
|
f5d8a9fc8c | ||
|
|
973cd60893 | ||
|
|
da0130da4b | ||
|
|
c8e494596e | ||
|
|
baec65fde7 | ||
|
|
9f5884c4e7 | ||
|
|
4767dec6b8 | ||
|
|
536ef9ec46 | ||
|
|
fd162ff98a | ||
|
|
0ed24dac0a | ||
|
|
e434a686c6 | ||
|
|
138a899e34 | ||
|
|
ae7533cec0 | ||
|
|
55e398dd10 | ||
|
|
fdd199935a | ||
|
|
346a22f2f6 | ||
|
|
5d64433be0 | ||
|
|
1a3cf49c00 | ||
|
|
9dd456bd2c | ||
|
|
1b9d4223c5 | ||
|
|
2a4ac2f2be | ||
|
|
a2f3666134 | ||
|
|
1435ecac67 | ||
|
|
897112e466 | ||
|
|
31e1116483 | ||
|
|
7da9bf03a3 | ||
|
|
8ad63ba07d | ||
|
|
a3702fed94 | ||
|
|
3e3e8fa797 | ||
|
|
f3b64748aa | ||
|
|
257e46df55 | ||
|
|
3c856c010a | ||
|
|
f87ea210c7 | ||
|
|
d433d8e956 | ||
|
|
879d7b674b | ||
|
|
21d47f5d0d | ||
|
|
e7d5c1e5fe | ||
|
|
5c08b06ace | ||
|
|
bb10b865f9 | ||
|
|
557eb8d09e | ||
|
|
a69ce7b85d | ||
|
|
b5649e3c7b | ||
|
|
1ebae57f48 | ||
|
|
6c619bf6f7 | ||
|
|
cfb4bbe907 | ||
|
|
c708718e78 | ||
|
|
1a02d34e85 | ||
|
|
dcf785b900 | ||
|
|
88bbae7c84 | ||
|
|
9485b5adfb | ||
|
|
e2d475100e | ||
|
|
22d3169d07 | ||
|
|
ebe7b9e9e6 | ||
|
|
78c18aa100 | ||
|
|
bd9f68bb27 | ||
|
|
1e693abfc4 | ||
|
|
e4a64a11bd | ||
|
|
43c57f00d0 | ||
|
|
122bb29e99 | ||
|
|
bc8f95d30c | ||
|
|
be4e0acdfc | ||
|
|
79c47015f4 | ||
|
|
d4b590a9fc | ||
|
|
e018fe2995 | ||
|
|
4aad8c12f8 | ||
|
|
93c45d7157 | ||
|
|
695f1593c6 | ||
|
|
eb7b7b57ab | ||
|
|
e8e8260856 | ||
|
|
50b576134a | ||
|
|
2476a36661 | ||
|
|
2aa984b147 | ||
|
|
16de261477 | ||
|
|
9dfc574bde | ||
|
|
9072c37589 | ||
|
|
095a71bc8f | ||
|
|
2b057d339c | ||
|
|
1e0552cc13 | ||
|
|
eea0bf66db | ||
|
|
0741b396ef | ||
|
|
865f3eabd8 | ||
|
|
f5ba9b524d | ||
|
|
654253c953 | ||
|
|
1711cbfe2d | ||
|
|
71c20e159d | ||
|
|
205c143782 | ||
|
|
ed7c919201 | ||
|
|
842014160b | ||
|
|
2a0f464c63 | ||
|
|
c412f025ca | ||
|
|
299371b38c | ||
|
|
d57c38bb3d | ||
|
|
59231739a2 | ||
|
|
7ba6941aed | ||
|
|
95f9b348cd | ||
|
|
ebeeb6c3a5 | ||
|
|
07367a2ca3 | ||
|
|
3d848a70c7 | ||
|
|
c5d1cd919a | ||
|
|
c08b70a38d | ||
|
|
add9800f42 | ||
|
|
1395dd9fb5 | ||
|
|
12b89f7e24 | ||
|
|
0ab5ca32a6 | ||
|
|
19f42e60ba | ||
|
|
a5b952f18c | ||
|
|
80de181827 | ||
|
|
44856f9c04 | ||
|
|
40c6c65ee5 | ||
|
|
6cb4439d59 | ||
|
|
03970f985e | ||
|
|
31a94b779f | ||
|
|
f9a400c34c | ||
|
|
5cea39c9c0 | ||
|
|
99cd07658e | ||
|
|
11fcaa2538 | ||
|
|
8af961ff3f | ||
|
|
10ee4a17a5 | ||
|
|
f029fa1cc8 | ||
|
|
bbe0ba0389 | ||
|
|
7084c69171 | ||
|
|
3ada622bd0 | ||
|
|
93d08de2ab | ||
|
|
64da64105e | ||
|
|
3e448b123b | ||
|
|
bedbebbe04 | ||
|
|
4b3d876fbd | ||
|
|
d52709cb72 | ||
|
|
ed53e59a00 | ||
|
|
0fcf089d39 | ||
|
|
25abc1b59b | ||
|
|
516eef0431 | ||
|
|
5df5bdef59 | ||
|
|
4eddad5bf4 | ||
|
|
794bfcc25c | ||
|
|
0f56f06937 | ||
|
|
78a87c4ed0 | ||
|
|
af41eed26c | ||
|
|
5169ac32a1 | ||
|
|
1e7c50b0fe | ||
|
|
31f7521501 | ||
|
|
a29e700b83 | ||
|
|
04c45bd39f | ||
|
|
524bf1f676 | ||
|
|
ee63f3fe0d | ||
|
|
295db87113 | ||
|
|
1f54292fbc | ||
|
|
eea4e2642c | ||
|
|
8b81501b44 | ||
|
|
148f3198ce | ||
|
|
b7417a07ad | ||
|
|
844311f4e8 | ||
|
|
da45606f64 | ||
|
|
cf0cc4cc17 | ||
|
|
edd8fd0fbc | ||
|
|
05c3613d3f | ||
|
|
ebbbebf352 | ||
|
|
ea478ae5e6 | ||
|
|
be57534b2a | ||
|
|
7c11f0fa38 | ||
|
|
a3b05c3760 | ||
|
|
04a91b2bb7 | ||
|
|
1d81a20e6f | ||
|
|
989ec68666 | ||
|
|
5401e2729b | ||
|
|
5c6bb2fa0d | ||
|
|
858e02f7c6 | ||
|
|
dd65bd5744 | ||
|
|
6ba1bdb7de | ||
|
|
b7e3263b38 | ||
|
|
4830d54229 | ||
|
|
85911c8ff4 | ||
|
|
296891ca67 | ||
|
|
7d0762ff35 | ||
|
|
127d9e6196 | ||
|
|
6c58281c2e | ||
|
|
beeeb4bd33 | ||
|
|
9aa1462e17 | ||
|
|
6637d9c954 | ||
|
|
f1344f16fa | ||
|
|
abbaa1c11f | ||
|
|
87a10a721b | ||
|
|
2230df591e | ||
|
|
2898805514 | ||
|
|
c906ccda91 | ||
|
|
d1101aee47 | ||
|
|
39157360ef | ||
|
|
e4a34ecd2b | ||
|
|
d444ad31ce | ||
|
|
06a11f43ea | ||
|
|
fdcf12fb86 | ||
|
|
59682f6840 | ||
|
|
949052d00c | ||
|
|
e7fd39112e | ||
|
|
028c4a9cb4 | ||
|
|
274f954b8a | ||
|
|
e44bceaed5 | ||
|
|
9fe8d8a3b4 | ||
|
|
ab59d529ec | ||
|
|
7581e4f63a | ||
|
|
8f15579136 | ||
|
|
2b9323ac98 | ||
|
|
8676b7ccde | ||
|
|
cd43935656 | ||
|
|
f6a08fc3d4 | ||
|
|
166af4ce8d | ||
|
|
7943977ff5 | ||
|
|
2e407d9e8f | ||
|
|
04cf16cc94 | ||
|
|
fa6df3cff8 | ||
|
|
0476689c25 | ||
|
|
ce2d955c86 | ||
|
|
d62a1f077a | ||
|
|
14a1d61bb1 | ||
|
|
069522febe | ||
|
|
28df1e6aaf | ||
|
|
bdcef1a37e | ||
|
|
1580810597 | ||
|
|
d4c724e79c | ||
|
|
361952ec5a | ||
|
|
c2a4713024 | ||
|
|
8c60e98852 | ||
|
|
10371e8411 | ||
|
|
053bcff11c | ||
|
|
841bd16701 | ||
|
|
657e6e2f8d | ||
|
|
89ea7c02c6 | ||
|
|
297b9158e1 | ||
|
|
0ab1f9e19a | ||
|
|
25b54d1f62 | ||
|
|
854ef20826 | ||
|
|
bed4e6a152 | ||
|
|
a379054f5b | ||
|
|
b5e933ba12 | ||
|
|
9afed6e43b | ||
|
|
015ce23fe2 | ||
|
|
6dcf09a2f6 | ||
|
|
7391df9f7b | ||
|
|
6032667ea7 | ||
|
|
8ae8d6aa27 | ||
|
|
b281652009 | ||
|
|
82e9a4a8ef | ||
|
|
f9baa603f4 | ||
|
|
f1a553aac6 | ||
|
|
61df3ec581 | ||
|
|
8ffc07a110 | ||
|
|
a794170adf | ||
|
|
6c28c14e7c | ||
|
|
a1b17a238b | ||
|
|
53f41a9434 | ||
|
|
2223050523 | ||
|
|
eb7282201b | ||
|
|
396416ad29 | ||
|
|
9c76c9f79c | ||
|
|
c4adb03c50 | ||
|
|
1d8beb9222 | ||
|
|
e6644ad3ec | ||
|
|
dce40cb9fb | ||
|
|
d6cf983b93 | ||
|
|
0b350b686e | ||
|
|
fa7d2534bf | ||
|
|
3a2afa4bf4 | ||
|
|
57c9c5b23f | ||
|
|
facc6619e2 | ||
|
|
6b0a65c427 | ||
|
|
fb489adc66 | ||
|
|
45c03aee45 | ||
|
|
41cfdcdc00 | ||
|
|
e14475afb0 | ||
|
|
64a3c348bd | ||
|
|
c57513618b | ||
|
|
b114de1fd9 | ||
|
|
ed0276b61e | ||
|
|
6998f11967 | ||
|
|
956fcf65ed | ||
|
|
e32844d2f2 | ||
|
|
3dca9da5e3 | ||
|
|
5a060722a1 | ||
|
|
f3dac743d1 | ||
|
|
a07ed7ee85 | ||
|
|
d54722cf03 | ||
|
|
ba09964eaa | ||
|
|
c0f73a8112 | ||
|
|
06b6ef2889 | ||
|
|
602f0648e0 | ||
|
|
7e2f05866c | ||
|
|
acfc48c82c | ||
|
|
2b8257d866 | ||
|
|
a3bcb3c491 | ||
|
|
658b936a01 | ||
|
|
9b1443423e | ||
|
|
4848ba78d9 | ||
|
|
d16d43de9d | ||
|
|
fa36fb788c | ||
|
|
276214da98 | ||
|
|
1c94328dbd | ||
|
|
7f51fdcfa1 | ||
|
|
541cb2e1b1 | ||
|
|
2396f226dd | ||
|
|
58c26ea055 | ||
|
|
413f869424 | ||
|
|
e1ab0b3ef7 | ||
|
|
0cb7b6c96a | ||
|
|
3f0c899f17 | ||
|
|
a25efc6dd6 | ||
|
|
8038fc9472 | ||
|
|
17c3dc4914 | ||
|
|
2e53da32d1 | ||
|
|
57aefdf332 | ||
|
|
9edbe8affc | ||
|
|
033dacf8be | ||
|
|
b82246595f | ||
|
|
277950fc51 | ||
|
|
0261b8e210 | ||
|
|
445b4de69e | ||
|
|
3b60a3a1ae | ||
|
|
5103e2c229 | ||
|
|
e9dc7de2e8 | ||
|
|
c7d04ddbcf | ||
|
|
af5aecd127 | ||
|
|
ecc297a112 | ||
|
|
1067211033 | ||
|
|
64c3de0450 | ||
|
|
20986852de | ||
|
|
2239aa6c25 | ||
|
|
908789230b | ||
|
|
eb74d7fc14 | ||
|
|
519822c971 | ||
|
|
9be6af6477 | ||
|
|
5838f8be95 | ||
|
|
da8098752e | ||
|
|
0fcd4502bd | ||
|
|
9e768f5be7 | ||
|
|
50fa0677d9 | ||
|
|
3641d2360e | ||
|
|
9eab7640c4 | ||
|
|
8feb7c585f | ||
|
|
654efdc503 | ||
|
|
46b01bcb93 | ||
|
|
4895a61af3 | ||
|
|
c820e2e8f5 | ||
|
|
c9c7f0ada6 | ||
|
|
3069e508f5 | ||
|
|
62601fc4ad | ||
|
|
5d05ede3e6 | ||
|
|
c3982bf747 | ||
|
|
ef97013051 | ||
|
|
07d37cd9b0 | ||
|
|
6b3bed69d3 | ||
|
|
f99f45505d | ||
|
|
7caf1f841a | ||
|
|
8ea45f5295 | ||
|
|
a57669a6e0 | ||
|
|
80a0b889c1 | ||
|
|
57f508f15c | ||
|
|
b732a87409 | ||
|
|
c2b97cbabd | ||
|
|
645e779d7c | ||
|
|
b6a9c788bf | ||
|
|
8bd5c59186 | ||
|
|
22b9ec5a1a | ||
|
|
ed2f6f90eb | ||
|
|
609e118a7a | ||
|
|
8ed1456e02 | ||
|
|
75002f93d3 | ||
|
|
84fb663e09 | ||
|
|
7f051938d0 | ||
|
|
913a1f72b6 | ||
|
|
cb7eeb7d46 | ||
|
|
92c58efd63 | ||
|
|
f5acab8ad8 | ||
|
|
9b2c6b8838 | ||
|
|
33e6fffd5d | ||
|
|
c61caed1af | ||
|
|
474da8f3f0 | ||
|
|
0ed510cfd8 | ||
|
|
5e884dc675 | ||
|
|
fcde1a275e | ||
|
|
bcd804403a | ||
|
|
ef1c3c9674 | ||
|
|
7d995f0735 | ||
|
|
89342ba9ee | ||
|
|
b18bcc7692 | ||
|
|
55d6513853 | ||
|
|
d11972c07d | ||
|
|
b2c798a934 | ||
|
|
200e4c806c | ||
|
|
d96b3519b2 | ||
|
|
6f5c514be3 | ||
|
|
89fe57fbc1 | ||
|
|
f168726778 | ||
|
|
69ff580d4c | ||
|
|
6dfa82bafa | ||
|
|
63c0850352 | ||
|
|
49d1480e15 | ||
|
|
0dd75db4d7 | ||
|
|
2773fc4f83 | ||
|
|
8fc140c16a | ||
|
|
c7a740d51f | ||
|
|
611ae2f154 | ||
|
|
326503bcf9 | ||
|
|
ad4adc742f | ||
|
|
7befc97ab7 | ||
|
|
28f98c159b | ||
|
|
e7ff1a7954 | ||
|
|
f93b8b2e10 | ||
|
|
c64c351a85 | ||
|
|
75c5ec1215 | ||
|
|
7b3a08ef25 | ||
|
|
ef660d49c3 | ||
|
|
bcf4bcc5af | ||
|
|
e8f8296d53 | ||
|
|
c360c80291 | ||
|
|
8b62207b8b | ||
|
|
1a92514253 | ||
|
|
725490c87e | ||
|
|
f811c0a543 | ||
|
|
a26a81beec | ||
|
|
cb5b3d3a8d | ||
|
|
26ee74be6e | ||
|
|
0d1c32a453 | ||
|
|
ab0c9dfeb9 | ||
|
|
0ebd391cd2 | ||
|
|
a0b077b54e | ||
|
|
d78fcd6ae3 | ||
|
|
a397048ea4 | ||
|
|
e4da6c9379 | ||
|
|
be1cdec6fa | ||
|
|
5df4822ef0 | ||
|
|
1a89a14ee3 | ||
|
|
97f7770d98 | ||
|
|
0327f8818a | ||
|
|
b03c6aec57 | ||
|
|
3c9a035249 | ||
|
|
4b075cffe7 | ||
|
|
b85c308e78 | ||
|
|
9e58c8c572 | ||
|
|
5cc08030ce | ||
|
|
50699ed01f | ||
|
|
486e245c14 | ||
|
|
cd9105d0a9 | ||
|
|
99e9f5ca68 | ||
|
|
f35550663d | ||
|
|
39eb7fff1e | ||
|
|
fa6748fe79 | ||
|
|
2c12e625b4 | ||
|
|
49daed828b | ||
|
|
a3359dbec4 | ||
|
|
c8bae60060 | ||
|
|
0f8253241e | ||
|
|
ed9c0c2a2c | ||
|
|
3c5db004c4 | ||
|
|
5eac1e000f | ||
|
|
b42d6feaa0 | ||
|
|
d61d9b1789 | ||
|
|
2c7e14afcd | ||
|
|
58ade8948c | ||
|
|
10e08093c6 | ||
|
|
58bc8bf6ce | ||
|
|
b1e10567f6 | ||
|
|
1a464630f2 | ||
|
|
4aea02e215 | ||
|
|
b1b8d6f090 | ||
|
|
0de1406b5c | ||
|
|
e068b360a4 | ||
|
|
385deb254b | ||
|
|
b28f9ed422 | ||
|
|
117e0366e5 | ||
|
|
6759aa3267 | ||
|
|
aab506fb58 | ||
|
|
b111bbf926 | ||
|
|
8d58f1fe91 | ||
|
|
20871ba401 | ||
|
|
fb121c1df4 | ||
|
|
80888ae910 | ||
|
|
84c74fbb2a | ||
|
|
9caeb0cfdf | ||
|
|
796c02adfb | ||
|
|
0812182fd2 | ||
|
|
8368c3d102 | ||
|
|
dca50f42c7 | ||
|
|
1944c24fe7 | ||
|
|
f136334414 | ||
|
|
c5f99ad701 | ||
|
|
62b3bc6a6a | ||
|
|
e7fe2b808f | ||
|
|
a85f0003e3 | ||
|
|
d6142f7498 | ||
|
|
63661dea5b | ||
|
|
499a798d3e | ||
|
|
23da070784 | ||
|
|
5efc4975c6 | ||
|
|
013262c694 | ||
|
|
12d8d2d2fc | ||
|
|
af83432fdb | ||
|
|
34d3ea9ef0 | ||
|
|
9c2ebd53d7 | ||
|
|
fc569b50d4 | ||
|
|
06873f5054 | ||
|
|
420ee4ac65 | ||
|
|
2659bc1440 | ||
|
|
ded7af9fe3 | ||
|
|
75dd81adcd | ||
|
|
b749199f55 | ||
|
|
731e9be82b | ||
|
|
22844b430e | ||
|
|
dbfb3176f5 | ||
|
|
0591afa80f | ||
|
|
be2f5a9f15 | ||
|
|
633ceb6136 | ||
|
|
7610f3633d | ||
|
|
acf2437020 | ||
|
|
f28733d94d | ||
|
|
8398d73b61 | ||
|
|
46876228ba | ||
|
|
7de5e4db8b | ||
|
|
33273bf83c | ||
|
|
719b3e5705 | ||
|
|
ae5fd47f72 | ||
|
|
57f9728867 | ||
|
|
b07118b298 | ||
|
|
e669ecacf3 | ||
|
|
725032d31f | ||
|
|
ea05fd58c1 | ||
|
|
1ecdc1249c | ||
|
|
b016f6fefe | ||
|
|
8c64b65942 | ||
|
|
e0e1250592 | ||
|
|
64694a1ead | ||
|
|
7c1c33ecdc | ||
|
|
48303fce62 | ||
|
|
67cac33779 | ||
|
|
7c9229e9c9 | ||
|
|
f8b5cc98b2 | ||
|
|
ddde35ec1c | ||
|
|
df7c51d303 | ||
|
|
96de41e4f0 | ||
|
|
eb63964a90 | ||
|
|
00942ba48f | ||
|
|
9735085328 | ||
|
|
367dec4024 | ||
|
|
3200b3bc10 | ||
|
|
e98035e418 | ||
|
|
477d43b675 | ||
|
|
01d7730ffb | ||
|
|
d69227a8f1 | ||
|
|
7e6fa9fcbd | ||
|
|
a58ef98a9c | ||
|
|
5805c94c8a | ||
|
|
df0afdc7be | ||
|
|
5bf12e4e7d | ||
|
|
c9f22aa0c7 | ||
|
|
8c91357fbb | ||
|
|
4a0265ef25 | ||
|
|
d392be05a2 | ||
|
|
824825860f | ||
|
|
0a4261bba4 | ||
|
|
93e76e27d7 | ||
|
|
9812b76138 | ||
|
|
988a323757 | ||
|
|
29fc5c669d | ||
|
|
fbc3c8cede | ||
|
|
11f341366b | ||
|
|
2414498846 | ||
|
|
1977f48eb1 | ||
|
|
dc1c5763aa | ||
|
|
14e16a9d18 | ||
|
|
4505a5a97a | ||
|
|
f076240832 | ||
|
|
086d1c03cf | ||
|
|
c6fab002be | ||
|
|
48be1a9eda | ||
|
|
59e3f45e70 | ||
|
|
294a205dfd | ||
|
|
80500b6ede | ||
|
|
06d9cf2292 | ||
|
|
b7a3ad7044 | ||
|
|
b6df0fb1a8 | ||
|
|
42e0d4330d | ||
|
|
cfae2c3418 | ||
|
|
fd314b5187 | ||
|
|
f6a680730f | ||
|
|
0164f4a9d7 | ||
|
|
b37b4559b0 | ||
|
|
81d9e12c8d | ||
|
|
5aa4450691 | ||
|
|
144b81eab7 | ||
|
|
c2e4d39117 | ||
|
|
5397edc14d | ||
|
|
82d7c28fd7 | ||
|
|
b3159d683c | ||
|
|
56d6190fa3 | ||
|
|
b59d2149b8 | ||
|
|
3ca4ce9c80 | ||
|
|
c3a6b33b33 | ||
|
|
de964eb64a | ||
|
|
e421d84033 | ||
|
|
76e02d691d | ||
|
|
e7a8668420 | ||
|
|
b71da10a80 | ||
|
|
a73f8bf8da | ||
|
|
eae55beccc | ||
|
|
2b9c76efe1 | ||
|
|
b1b3abeb2f | ||
|
|
8d028ad705 | ||
|
|
50098bd092 | ||
|
|
6f45cfc60c | ||
|
|
d3030b8815 | ||
|
|
12e97c6b9a | ||
|
|
a6797d8608 | ||
|
|
640aac54f5 | ||
|
|
89e7ae9593 | ||
|
|
80cc4ec265 | ||
|
|
ffb187dd84 | ||
|
|
48117cc0d6 | ||
|
|
a4c236979f | ||
|
|
73e9748631 | ||
|
|
d46289e59d | ||
|
|
55ab809d5c | ||
|
|
6843668193 | ||
|
|
c6a2f697b8 | ||
|
|
02340feb70 | ||
|
|
42e1030f85 | ||
|
|
221b6349f1 | ||
|
|
ac1dbe4e46 | ||
|
|
75c4b50d96 | ||
|
|
20955e1a8f | ||
|
|
4fa8b8c4ef | ||
|
|
bf29cd42d6 | ||
|
|
d85ecb0d12 | ||
|
|
27519a3966 | ||
|
|
50480b85dd | ||
|
|
14d236cac7 | ||
|
|
220bd6798e | ||
|
|
2003f5a946 | ||
|
|
7e75df6334 | ||
|
|
b4775ae1e7 | ||
|
|
fec1b3f323 | ||
|
|
50aeaa957e | ||
|
|
9a59102f92 | ||
|
|
6b13738ea7 | ||
|
|
3c2dc0dbfb | ||
|
|
243f0034f3 | ||
|
|
1dfe20b0c9 | ||
|
|
d6cffb367f | ||
|
|
2561fccce5 | ||
|
|
3933936aa9 | ||
|
|
12f628aa5d | ||
|
|
5ed95dcd36 | ||
|
|
47ef80cc44 | ||
|
|
832beeef22 | ||
|
|
6598eb9a48 | ||
|
|
4e36f539ef | ||
|
|
93a7da0018 | ||
|
|
622694f405 | ||
|
|
01c5de3620 | ||
|
|
5e1248cc00 | ||
|
|
efecdff59d | ||
|
|
3c5deccb84 | ||
|
|
8e12daf1c7 | ||
|
|
008da18727 | ||
|
|
f108cc86da | ||
|
|
f2b2a25a19 | ||
|
|
82a1a7e5c7 | ||
|
|
e4b61e2667 | ||
|
|
cd4d1ca37b | ||
|
|
d238de9fb1 | ||
|
|
4b07e8bbb6 | ||
|
|
2cb169eff5 | ||
|
|
b53b455719 | ||
|
|
cf51d1f5d7 | ||
|
|
296fd71b5a | ||
|
|
4f17e61e8a | ||
|
|
95126b7c36 | ||
|
|
d2b6e75483 | ||
|
|
320660945c | ||
|
|
a0d02b2aa5 | ||
|
|
19cf64a6f0 | ||
|
|
01017040e3 | ||
|
|
9c7f5ff771 | ||
|
|
3718a06ea9 | ||
|
|
2950d2ce9f | ||
|
|
4f59d0867d | ||
|
|
ee98c7a653 | ||
|
|
af902dae57 | ||
|
|
0e23c6ac61 | ||
|
|
30362bb72e | ||
|
|
dd7f86bfa0 | ||
|
|
b231a06ee8 | ||
|
|
d86a042070 | ||
|
|
b0e34a802d | ||
|
|
3460b88167 | ||
|
|
2668370450 | ||
|
|
42e1e748a3 | ||
|
|
0c620a06f7 | ||
|
|
bae7b0400c | ||
|
|
b87083e6b1 | ||
|
|
db4d81863b | ||
|
|
2c15bc4127 | ||
|
|
f7a8e77cc5 | ||
|
|
7c16bd31a2 | ||
|
|
d5d23c8c60 | ||
|
|
3948557da8 | ||
|
|
8057d49be0 | ||
|
|
22bfb9deef | ||
|
|
c9f4560cf9 | ||
|
|
6dee27e5a5 | ||
|
|
9ddea01f12 | ||
|
|
8a8790d49b | ||
|
|
e74b8d27b6 | ||
|
|
a38d254877 | ||
|
|
3ca4e19199 | ||
|
|
0b3b1e4ed4 | ||
|
|
b068b631be | ||
|
|
9bdac0edbf | ||
|
|
56604f702f | ||
|
|
25bdc36183 | ||
|
|
fa7582135e | ||
|
|
40e94e45a2 | ||
|
|
e119d51d08 | ||
|
|
7c63a5e52f | ||
|
|
3a46c7eb27 | ||
|
|
80bda24b5f | ||
|
|
5f3f4c1a73 | ||
|
|
1bdfc1962a | ||
|
|
ff9245c31d | ||
|
|
085e7c80e7 | ||
|
|
9a13133a5f | ||
|
|
1baeeb99db | ||
|
|
8f1223c55b | ||
|
|
64ad2f6b80 | ||
|
|
39282d51ac | ||
|
|
76c3f7e94e | ||
|
|
2a14d59a45 | ||
|
|
d848e18bc0 | ||
|
|
3430118f09 | ||
|
|
e0c7ffbb12 | ||
|
|
ec669a701e | ||
|
|
8da84e8d64 | ||
|
|
90e94a14fb | ||
|
|
f33262d262 | ||
|
|
2e137b4e07 | ||
|
|
634bc0744d | ||
|
|
8cbca4430a | ||
|
|
6c166908a1 | ||
|
|
42ebb687f8 | ||
|
|
d9761e771f | ||
|
|
2575b79c8b | ||
|
|
6009098c9c | ||
|
|
2946e48321 | ||
|
|
8256a84efe | ||
|
|
c2da5c56b8 | ||
|
|
ef64014100 | ||
|
|
2bb5d332ff | ||
|
|
54d71c7cc9 | ||
|
|
14437f2984 | ||
|
|
928ee52a7e | ||
|
|
82d87db762 | ||
|
|
f26507e540 | ||
|
|
dcd32b9162 | ||
|
|
d59eb03f40 | ||
|
|
d096b36434 | ||
|
|
5624401fcf | ||
|
|
8c4992bf9a | ||
|
|
a4984dc477 | ||
|
|
c2676f9fda | ||
|
|
9bb3820e82 | ||
|
|
72ccaf754f | ||
|
|
da0d387ae0 | ||
|
|
e06fe9146c | ||
|
|
e5eb3ab297 | ||
|
|
012589b848 | ||
|
|
43a2c4870e | ||
|
|
8fe10e6314 | ||
|
|
cab6c0cefb | ||
|
|
07c2c2b9ac | ||
|
|
a4f8cfa287 | ||
|
|
1bafee59c8 | ||
|
|
e8f9608372 | ||
|
|
d8904f7ac8 | ||
|
|
8f8e4334b9 | ||
|
|
293e009321 | ||
|
|
5d53f1f605 | ||
|
|
87212bb25f | ||
|
|
7076c83185 | ||
|
|
ccbf4defe8 | ||
|
|
c3c3de01e0 | ||
|
|
7efe658503 | ||
|
|
88301c97eb | ||
|
|
e68a04ee5b | ||
|
|
655fa96c67 | ||
|
|
ce5d09ed2e | ||
|
|
e34a7c032a | ||
|
|
88ef46b2d4 | ||
|
|
d5f8cdda7d | ||
|
|
4fbaccc0f2 | ||
|
|
b4dd34355e | ||
|
|
2b02e6ee29 | ||
|
|
a262a89e13 | ||
|
|
50233460b2 | ||
|
|
8776fc1356 | ||
|
|
cd793c8e67 | ||
|
|
9a6c5896dd | ||
|
|
43e96a8708 | ||
|
|
38702d03ac | ||
|
|
335fa1b003 | ||
|
|
91140642ef | ||
|
|
eb0c7fbf68 | ||
|
|
d8af423a9c | ||
|
|
8693d4cae9 | ||
|
|
960a3ebe14 | ||
|
|
1105caed16 | ||
|
|
f35bb19f5a | ||
|
|
eee7816a50 | ||
|
|
58bb740e48 | ||
|
|
1101bc9477 | ||
|
|
6fd750e4e1 | ||
|
|
55d7cb0fec | ||
|
|
cc5901ffb0 | ||
|
|
e9c8be78ad | ||
|
|
779ce0e568 | ||
|
|
c351d2e8d4 | ||
|
|
dc2849f296 | ||
|
|
b10d259390 | ||
|
|
aac46f97ce | ||
|
|
46e4857a35 | ||
|
|
35a0a91a02 | ||
|
|
cd164793cc | ||
|
|
56f35f5068 | ||
|
|
e83a622152 | ||
|
|
6cdc0c14df | ||
|
|
d7fb478794 | ||
|
|
2c2bf18562 | ||
|
|
5faf6fb419 | ||
|
|
b1f946e1e6 | ||
|
|
bcea3e1a97 | ||
|
|
bcda186cbe | ||
|
|
02215c87eb | ||
|
|
024e97f138 | ||
|
|
c56c7609cc | ||
|
|
d723b37622 | ||
|
|
b461bf4ef7 | ||
|
|
6e8bb4c2ea | ||
|
|
0446f6302e | ||
|
|
a0b0c0ba19 | ||
|
|
cb0a62396f | ||
|
|
3315994356 | ||
|
|
c3798ff102 | ||
|
|
43c0df086a | ||
|
|
98745805d3 | ||
|
|
1dbdf425d6 | ||
|
|
b3d05332e5 | ||
|
|
98fb02282b | ||
|
|
536d789535 | ||
|
|
d0284a0603 | ||
|
|
4d433b633f | ||
|
|
388844f2bc | ||
|
|
2fc63daf23 | ||
|
|
c9bc3e9447 | ||
|
|
4a754cdae5 | ||
|
|
1bb1d528f4 | ||
|
|
770d9bfe4a | ||
|
|
8e3aa0407a | ||
|
|
acb756a871 | ||
|
|
85e6319760 | ||
|
|
66ffb5ebca | ||
|
|
e548138b9f | ||
|
|
2a5a2693ce | ||
|
|
efee89dcc1 | ||
|
|
74894b519f | ||
|
|
1a08a88b9e | ||
|
|
e3e0e62d77 | ||
|
|
235264ed1e | ||
|
|
a5aa3d550d | ||
|
|
79b5429a01 | ||
|
|
45dd94e5d5 | ||
|
|
e0d5970643 | ||
|
|
1fc11cd49f | ||
|
|
e5be488b3f | ||
|
|
77ba2e1362 | ||
|
|
89aa38ecc1 | ||
|
|
0c35577a68 | ||
|
|
cd9e244efd | ||
|
|
ae876484a4 | ||
|
|
7720bba5dc | ||
|
|
d1b1f078aa | ||
|
|
8839ed5932 | ||
|
|
c5987778b6 | ||
|
|
abe9ff5b2c | ||
|
|
e231600b88 | ||
|
|
3ccad7a564 | ||
|
|
8cf034ed29 | ||
|
|
9784092c7f | ||
|
|
ef3fe4dd52 | ||
|
|
7530fb0e23 | ||
|
|
49211719f0 | ||
|
|
430e53820a | ||
|
|
170772eb7c | ||
|
|
6f1d795c60 | ||
|
|
3d1178bd16 | ||
|
|
17f2421836 | ||
|
|
c61a5bedcf | ||
|
|
a318a15cad | ||
|
|
f430587965 | ||
|
|
de3b0c7ffc | ||
|
|
689f54cdc3 | ||
|
|
cee24e0b6c | ||
|
|
2e713bf1d0 | ||
|
|
d774901b6d | ||
|
|
7d7f3df226 | ||
|
|
07c2cd1af4 | ||
|
|
ddd28a0607 | ||
|
|
fa92df6567 | ||
|
|
76a3efe039 | ||
|
|
601ed15f20 | ||
|
|
2a3b505dff | ||
|
|
9550227672 | ||
|
|
89c0750463 | ||
|
|
0fa71362b8 | ||
|
|
d8df097e83 | ||
|
|
67c20cabc3 | ||
|
|
5867961383 | ||
|
|
649e280ce1 | ||
|
|
9d982eff1b | ||
|
|
6ac8225b19 | ||
|
|
55ed3c4ae0 | ||
|
|
5d0804639c | ||
|
|
6edb623b9c | ||
|
|
8c2a1e17d9 | ||
|
|
2a2f96d726 | ||
|
|
ec705df38b | ||
|
|
cb20fad13b | ||
|
|
969cae0343 | ||
|
|
f9652258e9 | ||
|
|
6bb891f830 | ||
|
|
4659d2c941 | ||
|
|
8644818949 | ||
|
|
de62956c40 | ||
|
|
3547aec75f | ||
|
|
21b5d775d2 | ||
|
|
0973bc538e | ||
|
|
bf2c4b87ab | ||
|
|
b03087c1c5 | ||
|
|
b814a856d0 | ||
|
|
f6b69a63e2 | ||
|
|
df499ea33c | ||
|
|
007611c429 | ||
|
|
12bf4c7bcc | ||
|
|
5b05be24ad | ||
|
|
f50e3d4e92 | ||
|
|
7177cdd51d | ||
|
|
a71f16ee37 | ||
|
|
070e31ef19 | ||
|
|
42df2b255a | ||
|
|
52027c65b3 | ||
|
|
a2f2bce3ab | ||
|
|
ebcf6fa49b | ||
|
|
c14c762bde | ||
|
|
fd50ab7deb | ||
|
|
0db7521bee | ||
|
|
3adfa2c268 | ||
|
|
e27610a199 | ||
|
|
bd43a16975 | ||
|
|
eb56126224 | ||
|
|
7945fce65d | ||
|
|
8a7ddfbb47 | ||
|
|
03163e424f | ||
|
|
d5b7023927 | ||
|
|
884aca149a | ||
|
|
1836567f97 | ||
|
|
78f71abd31 | ||
|
|
0f63497847 | ||
|
|
8a1e472fed | ||
|
|
3831b5a50a | ||
|
|
3756e1a327 | ||
|
|
c9eb866acd | ||
|
|
55530c05f9 | ||
|
|
422997be9b | ||
|
|
13ff086412 | ||
|
|
298b5ac03e | ||
|
|
e9af2efbd1 | ||
|
|
4027970975 | ||
|
|
0ca7116167 | ||
|
|
1474cf424b | ||
|
|
b763d75703 | ||
|
|
a0501d88ec | ||
|
|
f62d94ba61 | ||
|
|
e99d855284 | ||
|
|
31b78ff106 | ||
|
|
ae0c45a716 | ||
|
|
0105844410 | ||
|
|
07e8395536 | ||
|
|
6c8fc093af | ||
|
|
95a7dcc7fc | ||
|
|
c54156ca1e | ||
|
|
941a8ef661 | ||
|
|
fc79ffc956 | ||
|
|
8e86343942 | ||
|
|
bb87e65745 | ||
|
|
d1989acd5c | ||
|
|
e5bc4ad41b | ||
|
|
927bdc2f2b | ||
|
|
2ff57d8272 |
28
.github/ISSUE_TEMPLATE/i-have-an-issue.md
vendored
@@ -7,24 +7,19 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the issue**
|
||||
## Describe the issue
|
||||
|
||||
> When submitting an issue ❗[enable debug](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEBUG_TIPS.md)❗ and [have a look at the docs](https://github.com/jokob-sk/Pi.Alert/tree/main/docs)
|
||||
|
||||
**Paste last few lines from `pialert.log`**
|
||||
[describe your issue]
|
||||
|
||||
> You can use `tail -20 /home/pi/pialert/front/log/pialert.log`
|
||||
## Paste your `pialert.conf` (remove personal info)
|
||||
|
||||
```
|
||||
paste_here
|
||||
```
|
||||
|
||||
**Paste your `pialert.conf` (remove personal info)**
|
||||
|
||||
```
|
||||
paste_here
|
||||
```
|
||||
|
||||
**Paste your `docker-compose.yml` and `.env` (remove personal info)**
|
||||
## Paste your `docker-compose.yml` and `.env` (remove personal info)
|
||||
|
||||
`docker-compose.yml`
|
||||
|
||||
@@ -38,5 +33,14 @@ paste_here
|
||||
paste_here
|
||||
```
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
## Screenshots
|
||||
|
||||
[If applicable, add screenshots to help explain your problem.]
|
||||
|
||||
## Paste last few lines from `pialert.log`
|
||||
|
||||
> You can use `tail -100 /home/pi/pialert/front/log/pialert.log`
|
||||
|
||||
```bash
|
||||
|
||||
# paste code below
|
||||
|
||||
25
.github/workflows/docker_cache-cleaner.yml
vendored
Executable file
@@ -0,0 +1,25 @@
|
||||
name: ci-package-cleaner
|
||||
|
||||
on:
|
||||
|
||||
workflow_dispatch: # manual option
|
||||
|
||||
schedule:
|
||||
- cron: '15 22 * * 1' # every Monday 10.15pm UTC (~11.15am Tuesday NZT)
|
||||
|
||||
jobs:
|
||||
|
||||
package-cleaner:
|
||||
name: package-cleaner
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
|
||||
- uses: actions/delete-package-versions@v4
|
||||
with:
|
||||
package-name: pi.alert
|
||||
package-type: container
|
||||
min-versions-to-keep: 0
|
||||
delete-only-untagged-versions: true
|
||||
31
.github/workflows/docker_dev.yml
vendored
@@ -14,7 +14,13 @@ on:
|
||||
jobs:
|
||||
docker_dev:
|
||||
runs-on: ubuntu-latest
|
||||
if: contains(github.event.head_commit.message, 'PUSHPROD') != 'True'
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
if: >
|
||||
contains(github.event.head_commit.message, 'PUSHPROD') != 'True' &&
|
||||
github.repository == 'jokob-sk/Pi.Alert'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
@@ -26,9 +32,16 @@ jobs:
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Set up dynamic build ARGs
|
||||
id: getargs
|
||||
id: getargs
|
||||
run: echo "version=$(cat ./stable/VERSION)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get release version
|
||||
id: get_version
|
||||
run: echo "::set-output name=version::${{ 'Dev' }}"
|
||||
|
||||
- name: Create .VERSION file
|
||||
run: echo "${{ steps.get_version.outputs.version }}" >> .VERSION
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
@@ -47,6 +60,13 @@ jobs:
|
||||
type=semver,pattern={{major}}
|
||||
type=sha
|
||||
|
||||
- name: Log in to Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: jokob-sk
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v2
|
||||
@@ -54,6 +74,10 @@ jobs:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
# # Disable this after use
|
||||
# - name: Prune Docker Builder
|
||||
# run: docker builder prune --force
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
@@ -62,3 +86,6 @@ jobs:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
# # ⚠ disable cache if build is failing to download debian packages
|
||||
# cache-from: type=registry,ref=ghcr.io/jokob-sk/pi.alert:buildcache
|
||||
# cache-to: type=registry,ref=ghcr.io/jokob-sk/pi.alert:buildcache,mode=max
|
||||
|
||||
22
.github/workflows/docker_prod.yml
vendored
@@ -17,6 +17,10 @@ on:
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
@@ -31,6 +35,13 @@ jobs:
|
||||
id: getargs
|
||||
run: echo "version=$(cat ./stable/VERSION)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get release version
|
||||
id: get_version
|
||||
run: echo "::set-output name=version::${GITHUB_REF#refs/tags/}"
|
||||
|
||||
- name: Create .VERSION file
|
||||
run: echo "${{ steps.get_version.outputs.version }}" >> .VERSION
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
@@ -46,6 +57,14 @@ jobs:
|
||||
type=ref,event=branch,suffix=-{{ sha }}
|
||||
type=ref,event=pr
|
||||
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') }}
|
||||
|
||||
- name: Log in to Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: jokob-sk
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v2
|
||||
@@ -61,3 +80,6 @@ jobs:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
# # ⚠ disable cache if build is failing to download debian packages
|
||||
# cache-from: type=registry,ref=ghcr.io/jokob-sk/pi.alert:buildcache
|
||||
# cache-to: type=registry,ref=ghcr.io/jokob-sk/pi.alert:buildcache,mode=max
|
||||
|
||||
14
.gitignore
vendored
@@ -1,8 +1,20 @@
|
||||
.vscode
|
||||
.DS_Store
|
||||
config/*
|
||||
config/pialert.conf
|
||||
db/*
|
||||
db/pialert.db
|
||||
front/log/*
|
||||
front/plugins/**/*.log
|
||||
front/api/*
|
||||
**/plugins/**/*.log
|
||||
**/%40eaDir/
|
||||
**/@eaDir/
|
||||
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
**/last_result.log
|
||||
**/script.log
|
||||
**/pialert.conf_bak
|
||||
**/pialert.db_bak
|
||||
50
Dockerfile
@@ -1,20 +1,15 @@
|
||||
FROM debian:bullseye-slim
|
||||
FROM debian:bookworm-slim
|
||||
|
||||
# default UID and GID
|
||||
ENV USER=pi USER_ID=1000 USER_GID=1000 TZ=Europe/London PORT=20211
|
||||
ENV USER=pi USER_ID=1000 USER_GID=1000 PORT=20211
|
||||
#TZ=Europe/London
|
||||
|
||||
# Todo, figure out why using a workdir instead of full paths don't work
|
||||
# Todo, do we still need all these packages? I can already see sudo which isn't needed
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install --no-install-recommends tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools python3 iproute2 nmap python3-pip zip -y \
|
||||
&& pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi \
|
||||
&& update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \
|
||||
&& apt-get clean autoclean \
|
||||
&& apt-get autoremove \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /var/www/html \
|
||||
&& ln -s /home/pi/pialert/front /var/www/html
|
||||
RUN apt-get update
|
||||
RUN apt-get install sudo -y
|
||||
|
||||
|
||||
# create pi user and group
|
||||
# add root and www-data to pi group so they can r/w files and db
|
||||
@@ -30,19 +25,26 @@ RUN groupadd --gid "${USER_GID}" "${USER}" && \
|
||||
|
||||
COPY --chmod=775 --chown=${USER_ID}:${USER_GID} . /home/pi/pialert/
|
||||
|
||||
# Pi.Alert
|
||||
RUN rm /etc/nginx/sites-available/default \
|
||||
&& ln -s /home/pi/pialert/install/default /etc/nginx/sites-available/default \
|
||||
&& sed -ie 's/listen 80/listen '${PORT}'/g' /etc/nginx/sites-available/default \
|
||||
# run the hardware vendors update
|
||||
&& /home/pi/pialert/back/update_vendors.sh \
|
||||
# Create a backup of the pialert.conf to be used if the user didn't supply a configuration file
|
||||
&& cp /home/pi/pialert/config/pialert.conf /home/pi/pialert/back/pialert.conf_bak \
|
||||
# Create a backup of the pialert.db to be used if the user didn't supply a database
|
||||
&& cp /home/pi/pialert/db/pialert.db /home/pi/pialert/back/pialert.db_bak \
|
||||
# Create a buildtimestamp.txt to later check if a new version was released
|
||||
&& date +%s > /home/pi/pialert/front/buildtimestamp.txt
|
||||
|
||||
ENTRYPOINT ["tini", "--"]
|
||||
# ❗ IMPORTANT - if you modify this file modify the /install/install_dependecies.sh file as well ❗
|
||||
|
||||
RUN apt-get install -y \
|
||||
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
|
||||
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools \
|
||||
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
|
||||
|
||||
# Alternate dependencies
|
||||
RUN apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
|
||||
RUN phpenmod -v 8.2 sqlite3
|
||||
|
||||
# Setup virtual python environment and use pip3 to install packages
|
||||
RUN apt-get install -y python3-venv
|
||||
RUN python3 -m venv myenv
|
||||
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet"
|
||||
|
||||
# Create a buildtimestamp.txt to later check if a new version was released
|
||||
RUN date +%s > /home/pi/pialert/front/buildtimestamp.txt
|
||||
|
||||
CMD ["/home/pi/pialert/dockerfiles/start.sh"]
|
||||
|
||||
|
||||
|
||||
134
README.md
@@ -1,101 +1,91 @@
|
||||
# Pi.Alert
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
# 💻🔍 Network security scanner & notification framework
|
||||
|
||||
💻🔍 WIFI / LAN intruder detector.
|
||||
Get visibility of what's going on on your WIFI/LAN network. Scan for devices, port changes and get alerts if unknown devices or changes are found. Write your own [Plugins](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins#readme) with auto-generated UI and in-build notification system.
|
||||
|
||||
Scans for devices connected to your WIFI / LAN and alerts you if new and unknown devices are found.
|
||||
|
||||
![Main screen][main]
|
||||
|
||||
# 🐳 Docker image
|
||||
[](https://github.com/jokob-sk/Pi.Alert/actions/workflows/docker_prod.yml)
|
||||
[](https://github.com/jokob-sk/Pi.Alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
|
||||
🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/pi.alert) | 📄 [Dockerfile](https://github.com/jokob-sk/Pi.Alert/blob/main/Dockerfile) | 📚 [Docker instructions](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md) | 🆕 [Release notes](https://github.com/jokob-sk/Pi.Alert/releases)
|
||||
| 🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/pi.alert) | 📑 [Docker guide](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md) |🆕 [Release notes](https://github.com/jokob-sk/Pi.Alert/releases) | 📚 [All Docs](https://github.com/jokob-sk/Pi.Alert/tree/main/docs) |
|
||||
|----------------------|----------------------| ----------------------| ----------------------|
|
||||
|
||||
## 🔍 Scan Methods
|
||||
The system continuously scans the network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Scanning methods are:
|
||||
- **Method 1: arp-scan**. The arp-scan system utility is used to search
|
||||
for devices on the network using arp frames.
|
||||
- **Method 2: Pi-hole**. This method is optional and complementary to
|
||||
method 1. If the Pi-hole DNS server is active, Pi.Alert examines its
|
||||
activity looking for active devices using DNS that have not been
|
||||
detected by method 1.
|
||||
- **Method 3. dnsmasq**. This method is optional and complementary to the
|
||||
previous methods. If the DHCP server dnsmasq is active, Pi.Alert
|
||||
examines the DHCP leases (addresses assigned) to find active devices
|
||||
that were not discovered by the other methods.
|
||||
## Why PiAlert❓
|
||||
|
||||
## 🧩 Integrations
|
||||
- [Apprise](https://hub.docker.com/r/caronc/apprise), [Pushsafer](https://www.pushsafer.com/), [NTFY](https://ntfy.sh/)
|
||||
- [Webhooks](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md) ([sample JSON](docs/webhook_json_sample.json))
|
||||
- Home Assistant via [MQTT](https://www.home-assistant.io/integrations/mqtt/) - discovery ~10s per device, use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices
|
||||
- [API endpoint](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md)
|
||||
- [Plugin system](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins) for custom script monitoring
|
||||
Most of us don't know what's going on on our home network, but we want our family and data to be safe. _Command-line tools_ are great, but the output can be _hard to understand_ and action if you are not a network specialist.
|
||||
|
||||
# 📥 Installation
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
PiAlert gives you peace of mind. _Visualize and immediately report 📬_ what is going on in your network - this is the first step to enhance your _network security 🔐_.
|
||||
|
||||
⚠ Only tested as a [docker container - follow these instructions here](dockerfiles/README.md).
|
||||
> Check out [leiweibau's fork](https://github.com/leiweibau/Pi.Alert/) if you want to install Pi.Alert on the server directly or original instructions for [pucherot's original code](https://github.com/pucherot/Pi.Alert/)
|
||||
_PiAlert combines several network and other scanning tools 🔍 with notifications 📧 into one user-friendly package 📦_. You get an overview of network device Sessions, Connected devices, Events, Presence, Down alerts, and IPs. You can schedule Nmap scans to detect changes in device ports and visualize your Network topology (even with undetectable, dummy devices).
|
||||
|
||||
# 📑 Features
|
||||
- Display:
|
||||
- Sessions, Connected devices, Favorites, Events, Presence, Concurrent devices, Down alerts, IP's
|
||||
- Manual Nmap scans, Optional speedtest for Device "Internet"
|
||||
- Simple Network relationship display
|
||||
- Maintenance tasks and Settings like:
|
||||
- Theme Selection (blue, red, green, yellow, black, purple) and Light/Dark-Mode Switch
|
||||
- DB maintenance, Backup, Restore tools and CSV Export / Import
|
||||
- Simple login Support
|
||||
- 🌟(Experimental) [Plugin system](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins)
|
||||
- Create custom plugins with automatically generated settings and UI.
|
||||
- Monitor anything for changes
|
||||
- Check the [instructions](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins) carefully if you are up for a challenge! Current plugins include:
|
||||
- Detecting Rogue DHCP servers via NMAP
|
||||
- Monitoring HTTP status changes of domains/URLs
|
||||
- Import devices from DHCP.leases files, a UniFi controller, or an SNMP enabled router
|
||||
Setup a _kill switch ☠_ for your network via a smart plug with the available [Home Assistant](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/HOME_ASSISTANT.md) integration. Implement custom automations with the [CSV device Exports 📤](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/csv_backup), [Webhooks](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md), or [API endpoints](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md) features.
|
||||
|
||||
| ![Screen 1][screen1] | ![Screen 2][screen2] | ![Screen 5][screen5] |
|
||||
Extend the app if you want to create your own scanner [Plugin](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins#readme) and handle the results and notifications in PiAlert.
|
||||
|
||||
Looking forward to your contributions if you decide to share your work with the community ❤.
|
||||
|
||||
| ![Main screen][main] | ![Screen 1][screen1] | ![Screen 5][screen5] |
|
||||
|----------------------|----------------------| ----------------------|
|
||||
| ![Screen 3][screen3] | ![Screen 4][screen4] | ![Screen 6][screen6] |
|
||||
| ![Screen 8][screen8] | ![Report 2][report2] | ![Screen 9][screen9] |
|
||||
|
||||
## Scan Methods, Notifications, Integration, Extension system
|
||||
|
||||
| Features | Details |
|
||||
|-------------|-------------|
|
||||
| 🔍 | The app scans your network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Discovery & scan methods include: **arp-scan**. **Pi-hole - DB import**, **Pi-hole - DHCP leases import**, **Generic DHCP leases import**. **UNIFI controller import**, **SNMP-enabled router import**. Check the [Plugins](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins#readme) docs for more info on individual scans. |
|
||||
|📧 | Send notifications to more than 80+ services, including Telegram via [Apprise](https://hub.docker.com/r/caronc/apprise), or use [Pushsafer](https://www.pushsafer.com/), or [NTFY](https://ntfy.sh/). |
|
||||
|🧩 | Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/HOME_ASSISTANT.md), read [API endpoints](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md), or use [Webhooks](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md) to setup custom automation flows. |
|
||||
|➕ | Build your own scanners with the [Plugin system](https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins#readme) |
|
||||
|
||||
|
||||
## Installation & Documentation
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
|
||||
| Docs | Link |
|
||||
|-------------|-------------|
|
||||
| 📥🐳 | [Docker instructions](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md)
|
||||
| 📥💻 | [HW install (experimental 🧪)](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/HW_INSTALL.md) |
|
||||
| 📚 | [All Documentation](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/README.md) (App Usage and Configuration) |
|
||||
|
||||
> Other Alternatives
|
||||
>
|
||||
> - Check out [leiweibau's on HW installed fork](https://github.com/leiweibau/Pi.Alert/) (maintained)
|
||||
> - Check instructions for [pucherot's original code](https://github.com/pucherot/Pi.Alert/) (unmaintained)
|
||||
> - [WatchYourLAN](https://github.com/aceberg/WatchYourLAN) - Lightweight network IP scanner with web GUI (Open source)
|
||||
> - [Fing](https://www.fing.com/) - Network scanner app for your Internet security (Commercial, Phone App, Proprietary hardware)
|
||||
|
||||
### 🔗 Other Alternatives
|
||||
## ❤ Support me
|
||||
|
||||
- [WatchYourLAN](https://github.com/aceberg/WatchYourLAN) - Lightweight network IP scanner with web GUI (Open source)
|
||||
- [Fing](https://www.fing.com/) - Network scanner app for your Internet security (Commercial, Phone App, Proprietary hardware)
|
||||
Get:
|
||||
- Regular updates to keep your data and family safe 🔄
|
||||
- Better and more functionality➕
|
||||
- I don't get burned out and the app survives longer🔥🤯
|
||||
- Quicker and better support with issues 🆘
|
||||
- Less grumpy me 😄
|
||||
|
||||
### 📚 Documentation
|
||||
| [](https://github.com/sponsors/jokob-sk) | [](https://www.buymeacoffee.com/jokobsk) | [](https://www.patreon.com/user?u=84385063) |
|
||||
| --- | --- | --- |
|
||||
|
||||
- Initial Docker Setup: [Docker instructions](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md)
|
||||
- App Usage and Configuration: [All Documentation](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/README.md)
|
||||
- Bitcoin: `1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM`
|
||||
- Ethereum: `0x6e2749Cb42F4411bc98501406BdcD82244e3f9C7`
|
||||
|
||||
> 📧 Email me at [jokob@duck.com](mailto:jokob@duck.com?subject=PiAlert) if you want to get in touch or if I should add other sponsorship platforms.
|
||||
|
||||
## Everything else
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
|
||||
### License
|
||||
GPL 3.0 | [Read more here](LICENSE.txt) | Source of the [animated GIF (Loading Animation)](https://commons.wikimedia.org/wiki/File:Loading_Animation.gif) | Source of the [selfhosted Fonts](https://github.com/adobe-fonts/source-sans)
|
||||
> GPL 3.0 | [Read more here](LICENSE.txt) | Source of the [animated GIF (Loading Animation)](https://commons.wikimedia.org/wiki/File:Loading_Animation.gif) | Source of the [selfhosted Fonts](https://github.com/adobe-fonts/source-sans)
|
||||
|
||||
### 🥇 Special thanks
|
||||
### Special thanks
|
||||
|
||||
This code is a collaborative body of work, with special thanks to:
|
||||
This code is a collaborative body of work, with special thanks to:
|
||||
|
||||
- 🏆 [pucherot/Pi.Alert](https://github.com/pucherot/Pi.Alert) is the original creator od PiAlert
|
||||
- [leiweibau](https://github.com/leiweibau/Pi.Alert): Dark mode (and much more)
|
||||
- [Macleykun](https://github.com/Macleykun): Help with Dockerfile clean-up
|
||||
- [Final-Hawk](https://github.com/Final-Hawk): Help with NTFY, styling and other fixes
|
||||
- [TeroRERO](https://github.com/terorero): Spanish translation
|
||||
- Please see the [Git contributors](https://github.com/jokob-sk/Pi.Alert/graphs/contributors) for a full list of people and their contributions to the project
|
||||
|
||||
## ☕ Support me
|
||||
|
||||
<a href="https://github.com/sponsors/jokob-sk" target="_blank"><img src="https://i.imgur.com/X6p5ACK.png" alt="Sponsor Me on GitHub" style="height: 30px !important;width: 117px !important;" width="150px" ></a>
|
||||
<a href="https://www.buymeacoffee.com/jokobsk" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 117px !important;" width="117px" height="30px" ></a>
|
||||
<a href="https://www.patreon.com/user?u=84385063" target="_blank"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Patreon_logo_with_wordmark.svg/512px-Patreon_logo_with_wordmark.svg.png" alt="Support me on patreon" style="height: 30px !important;width: 117px !important;" width="117px" ></a>
|
||||
|
||||
BTC: 1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM
|
||||
> [pucherot/Pi.Alert](https://github.com/pucherot/Pi.Alert) (the original creator of PiAlert), [leiweibau](https://github.com/leiweibau/Pi.Alert): Dark mode (and much more), [Macleykun](https://github.com/Macleykun) (Help with Dockerfile clean-up) [Final-Hawk](https://github.com/Final-Hawk) (Help with NTFY, styling and other fixes), [TeroRERO](https://github.com/terorero) (Spanish translations), [Data-Monkey](https://github.com/Data-Monkey), (Split-up of the python.py file and more), [cvc90](https://github.com/cvc90) (Spanish translation and various UI work) to name a few...
|
||||
>
|
||||
> Please see the [Git contributors](https://github.com/jokob-sk/Pi.Alert/graphs/contributors) for a full list of people and their contributions to the project
|
||||
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
[main]: ./docs/img/devices_split.png "Main screen"
|
||||
@@ -106,7 +96,7 @@ BTC: 1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM
|
||||
[screen5]: ./docs/img/network.png "Screen 5"
|
||||
[screen6]: ./docs/img/settings.png "Screen 6"
|
||||
[screen7]: ./docs/img/help_faq.png "Screen 7"
|
||||
[screen8]: ./docs/img/plugins_webmon.png "Screen 8"
|
||||
[screen8]: ./docs/img/plugins_rogue_dhcp.png "Screen 8"
|
||||
[screen9]: ./docs/img/device_nmap.png "Screen 9"
|
||||
[report1]: ./docs/img/4_report_1.jpg "Report sample 1"
|
||||
[report2]: ./docs/img/4_report_2.jpg "Report sample 2"
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
#
|
||||
# Scan multiple interfaces (eth1 and eth0):
|
||||
# SCAN_SUBNETS = [ '192.168.1.0/24 --interface=eth1', '192.168.1.0/24 --interface=eth0' ]
|
||||
|
||||
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth1']
|
||||
PRINT_LOG=False
|
||||
|
||||
TIMEZONE='Europe/Berlin'
|
||||
PIALERT_WEB_PROTECTION=False
|
||||
PIALERT_WEB_PASSWORD='8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'
|
||||
INCLUDED_SECTIONS=['internet','new_devices','down_devices','events']
|
||||
SCAN_CYCLE_MINUTES=5
|
||||
DAYS_TO_KEEP_EVENTS=90
|
||||
# Used for generating links in emails. Make sure not to add a trailing slash!
|
||||
REPORT_DASHBOARD_URL='http://pi.alert'
|
||||
@@ -93,25 +93,6 @@ DDNS_PASSWORD='A0000000B0000000C0000000D0000000'
|
||||
DDNS_UPDATE_URL='https://api.dynu.com/nic/update?'
|
||||
|
||||
|
||||
# PiHole
|
||||
#---------------------------
|
||||
# if enabled you need to map '/etc/pihole/pihole-FTL.db' in docker-compose.yml
|
||||
PIHOLE_ACTIVE=False
|
||||
# if enabled you need to map '/etc/pihole/dhcp.leases' in docker-compose.yml
|
||||
DHCP_ACTIVE=False
|
||||
|
||||
|
||||
# Pholus
|
||||
#---------------------------
|
||||
PHOLUS_ACTIVE=False
|
||||
PHOLUS_TIMEOUT=120
|
||||
PHOLUS_FORCE=False
|
||||
PHOLUS_DAYS_DATA=7
|
||||
PHOLUS_RUN='once'
|
||||
PHOLUS_RUN_TIMEOUT=600
|
||||
PHOLUS_RUN_SCHD='0 4 * * *'
|
||||
|
||||
|
||||
#-------------------IMPORTANT INFO-------------------#
|
||||
# This file is ingested by a python script, so if #
|
||||
# modified it needs to use python syntax #
|
||||
4354
back/pialert.py
@@ -4,7 +4,7 @@
|
||||
#
|
||||
# repot_template.html - Back module. Template to email reporting in HTML format
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
|
||||
# Puche 2021 GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<html>
|
||||
<head></head>
|
||||
@@ -12,7 +12,7 @@
|
||||
<font face=sans-serif>
|
||||
<table align=center width=100% cellpadding=0 cellspacing=0 style="border-radius: 5px;">
|
||||
<tr>
|
||||
<td bgcolor=#EFB956 align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#000000; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
<td bgcolor=#3c8dbc align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#ffffff; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
Pi.Alert Report
|
||||
</td>
|
||||
</tr>
|
||||
@@ -23,7 +23,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table width=100% border=0 bgcolor=#FFD966 cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#404040">
|
||||
<table width=100% border=0 bgcolor=#00c0ef cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#404040">
|
||||
<tr>
|
||||
<td width=100%> Report Date: <b>2023-01-30 22:17</b> </td>
|
||||
</tr>
|
||||
@@ -46,6 +46,7 @@
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Event Type</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Device name</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Comments</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Device Vendor</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://192.168.1.1:20211/deviceDetails.php?mac=00:00:00:ef:a5:6c">00:00:00:ef:a5:6c</a></td>
|
||||
@@ -54,6 +55,7 @@
|
||||
<td>New Device</td>
|
||||
<td>(name not found)</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://192.168.1.1:20211/deviceDetails.php?mac=00:00:00:ef:a5:6c">00:00:00:ef:a5:6c</a></td>
|
||||
@@ -62,6 +64,7 @@
|
||||
<td>New Device</td>
|
||||
<td>(name not found)</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
@@ -83,6 +86,7 @@
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Event Type</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Device name</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Comments</th>
|
||||
<th width='120px' style='color:#F0F0F0' bgcolor='#909090' >Device Vendor</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://192.168.1.1:20211/deviceDetails.php?mac=00:00:00:ef:a5:6c">00:00:00:ef:a5:6c</a></td>
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# repot_template.html - Back module. Template to email reporting in HTML format
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# report_template.html - Back module. Template to email reporting in HTML format #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<html>
|
||||
|
||||
@@ -16,37 +21,45 @@
|
||||
<font face=sans-serif>
|
||||
<table align=center width=100% cellpadding=0 cellspacing=0 style="border-radius: 5px;">
|
||||
<tr>
|
||||
<td bgcolor=#EFB956 align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#000000; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
<td bgcolor=#3c8dbc align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#ffffff; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
Pi.Alert Report
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<table width=100% border=0 bgcolor=#FFD966 cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#404040"> <tr>
|
||||
<td width=100%> Report Date: <b><REPORT_DATE></b> </td>
|
||||
<table width=100% border=0 bgcolor=#4b99d3 cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#ffffff"> <tr>
|
||||
<td width=100% bgcolor="#3c8dbc"> Report Date: <b><REPORT_DATE></b> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td bgcolor=#F5F5F5 height=200 valign=top style="padding: 10px">
|
||||
<td height=200 valign=top style="padding: 10px">
|
||||
|
||||
<INTERNET_TABLE>
|
||||
|
||||
<NEW_DEVICES_TABLE>
|
||||
<DOWN_DEVICES_TABLE>
|
||||
<EVENTS_TABLE>
|
||||
<PORTS_TABLE>
|
||||
<EVENTS_TABLE>
|
||||
<PLUGINS_TABLE>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<table width=100% bgcolor=#46802e cellpadding=5px cellspacing=0 style="font-size: 13px; font-weight: bold; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px;">
|
||||
<table width=100% bgcolor=#3c8dbc cellpadding=5px cellspacing=0 style="font-size: 13px; font-weight: bold; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px;">
|
||||
<tr>
|
||||
<td width=50% style="text-align:center"> Pi.Alert - <SERVER_NAME></td>
|
||||
<td width=50% style="text-align:center;color: white;" bgcolor="#3c8dbc">
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert" target="_blank" style="color: white">Pi.Alert</a>
|
||||
<a href=".." target="_blank" style="color: white"> (<SERVER_NAME>)</a>
|
||||
<br><span style="display:inline-block;color: white; transform: rotate(180deg)">©</span>2020 Puche (2022+
|
||||
<a style="color: white" href="mailto:jokob@duck.com?subject=PiAlert">jokob-sk</a>) | <b>Built on: <BUILD_PIALERT> </b> | <b> Version: <VERSION_PIALERT> </b> |
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/docs" target="_blank" style="color: white">
|
||||
<span>Docs <i class="fa fa-circle-question"></i>
|
||||
</a><span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
@@ -54,4 +67,4 @@
|
||||
</table>
|
||||
</font>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
Report Date: <REPORT_DATE>
|
||||
Server: <SERVER_NAME>
|
||||
|
||||
<SECTION_NEW_DEVICES>
|
||||
<SECTION_DEVICES_DOWN>
|
||||
<SECTION_EVENTS>
|
||||
<SECTION_INTERNET>
|
||||
<PORTS_TABLE>
|
||||
<NEW_DEVICES_TABLE>
|
||||
<DOWN_DEVICES_TABLE>
|
||||
<EVENTS_TABLE>
|
||||
<PLUGINS_TABLE>
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# repot_template.html - Back module. Template to email reporting in HTML format
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# report_template_new_version - Back module. Template to email reporting in text #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<html>
|
||||
|
||||
@@ -16,7 +21,7 @@
|
||||
<font face=sans-serif>
|
||||
<table align=center width=100% cellpadding=0 cellspacing=0 style="border-radius: 5px;">
|
||||
<tr>
|
||||
<td bgcolor=#EFB956 align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#000000; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
<td bgcolor=#3c8dbc align=center style="padding: 20px 10px 10px 10px; font-size: 30px; font-weight: bold; color:#ffffff; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
|
||||
Pi.Alert Report
|
||||
</td>
|
||||
</tr>
|
||||
@@ -25,37 +30,45 @@
|
||||
<a style="color:#ffffff;cursor:pointer;" href="https://github.com/jokob-sk/Pi.Alert/releases">🆕 New version available 🆕</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<table width=100% border=0 bgcolor=#FFD966 cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#404040"> <tr>
|
||||
<td width=100%> Report Date: <b><REPORT_DATE></b> </td>
|
||||
<table width=100% border=0 bgcolor=#4b99d3 cellpadding=5px cellspacing=0 style="border-collapse: collapse; font-size: 15px; text-align:center; color:#ffffff"> <tr>
|
||||
<td width=100% bgcolor="#3c8dbc"> Report Date: <b><REPORT_DATE></b> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td bgcolor=#F5F5F5 height=200 valign=top style="padding: 10px">
|
||||
|
||||
<INTERNET_TABLE>
|
||||
<NEW_DEVICES_TABLE>
|
||||
<DOWN_DEVICES_TABLE>
|
||||
<EVENTS_TABLE>
|
||||
<PORTS_TABLE>
|
||||
<PLUGINS_TABLE>
|
||||
<td height=200 valign=top style="padding: 10px">
|
||||
|
||||
<NEW_DEVICES_TABLE>
|
||||
<DOWN_DEVICES_TABLE>
|
||||
<EVENTS_TABLE>
|
||||
<PLUGINS_TABLE>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<table width=100% bgcolor=#46802e cellpadding=5px cellspacing=0 style="font-size: 13px; font-weight: bold; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px;">
|
||||
<table width=100% bgcolor=#3c8dbc cellpadding=5px cellspacing=0 style="font-size: 13px; font-weight: bold; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px;">
|
||||
<tr>
|
||||
<td width=50% style="text-align:center"> Pi.Alert - <SERVER_NAME></td>
|
||||
<td width=50% style="text-align:center;color: white;" bgcolor="#3c8dbc">
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert" target="_blank" style="color: white">Pi.Alert</a>
|
||||
<a href=".." target="_blank" style="color: white"> (<SERVER_NAME>)</a>
|
||||
<br><span style="display:inline-block;color: white; transform: rotate(180deg)">©</span>2020 Puche (2022+
|
||||
<a style="color: white" href="mailto:jokob@duck.com?subject=PiAlert">jokob-sk</a>) | <b>Built on: <BUILD_PIALERT> </b> | <b> Version: <VERSION_PIALERT> </b> |
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/docs" target="_blank" style="color: white">
|
||||
<span>Docs <i class="fa fa-circle-question"></i>
|
||||
</a><span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</font>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/bin/sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
@@ -14,19 +15,21 @@
|
||||
# /usr/share/ieee-data
|
||||
# /var/lib/ieee-data
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
echo "---------------------------------------------------------"
|
||||
echo "[INSTALL] Run update_vendors.sh"
|
||||
echo "---------------------------------------------------------"
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
echo Updating... /usr/share/ieee-data/
|
||||
cd /usr/share/ieee-data/
|
||||
cd /usr/share/ieee-data/ || { echo "could not enter /usr/share/ieee-data directory"; exit 1; }
|
||||
|
||||
sudo mkdir -p 2_backup
|
||||
sudo cp *.txt 2_backup
|
||||
sudo cp *.csv 2_backup
|
||||
sudo cp -- *.txt 2_backup
|
||||
sudo cp -- *.csv 2_backup
|
||||
echo ""
|
||||
echo Download Start
|
||||
echo ""
|
||||
sudo curl $1 -LO https://standards-oui.ieee.org/iab/iab.csv \
|
||||
sudo curl "$1" -LO https://standards-oui.ieee.org/iab/iab.csv \
|
||||
-LO https://standards-oui.ieee.org/iab/iab.txt \
|
||||
-LO https://standards-oui.ieee.org/oui28/mam.csv \
|
||||
-LO https://standards-oui.ieee.org/iab/iab.txt \
|
||||
@@ -42,15 +45,18 @@ echo Download Finished
|
||||
# ----------------------------------------------------------------------
|
||||
echo ""
|
||||
echo Updating... /usr/share/arp-scan/
|
||||
cd /usr/share/arp-scan
|
||||
cd /usr/share/arp-scan || { echo "could not enter /usr/share/arp-scan directory"; exit 1; }
|
||||
|
||||
sudo mkdir -p 2_backup
|
||||
sudo cp *.txt 2_backup
|
||||
sudo cp -- *.txt 2_backup
|
||||
|
||||
# Update from /usb/lib/ieee-data
|
||||
sudo get-iab -v
|
||||
sudo get-oui -v
|
||||
|
||||
# make files readable
|
||||
sudo chmod +r /usr/share/arp-scan/ieee-oui.txt
|
||||
|
||||
# Update from ieee website
|
||||
# sudo get-iab -v -u http://standards-oui.ieee.org/iab/iab.txt
|
||||
# sudo get-oui -v -u http://standards-oui.ieee.org/oui/oui.txt
|
||||
|
||||
@@ -1,87 +1,76 @@
|
||||
[
|
||||
{
|
||||
"headers": {
|
||||
"host": "192.168.1.82:5678",
|
||||
"user-agent": "curl/7.74.0",
|
||||
"accept": "*/*",
|
||||
"content-type": "application/json",
|
||||
"content-length": "872"
|
||||
},
|
||||
"params": {},
|
||||
"query": {},
|
||||
"body": {
|
||||
"username": "Pi.Alert",
|
||||
"text": "There are new notifications",
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Pi.Alert Notifications",
|
||||
"title_link": "",
|
||||
"text": {
|
||||
"internet": [],
|
||||
"new_devices": [{
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.1",
|
||||
"Event Type": "New Device",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null
|
||||
}],
|
||||
"down_devices": [],
|
||||
"events": [{
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.92",
|
||||
"Event Type": "Disconnected",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null
|
||||
}, {
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.150",
|
||||
"Event Type": "Disconnected",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null
|
||||
}],
|
||||
"ports": [{
|
||||
"new": {
|
||||
"Name": "New device",
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Port": "22/tcp",
|
||||
"State": "open",
|
||||
"Service": "ssh",
|
||||
"Extra": ""
|
||||
}
|
||||
}, {
|
||||
"new": {
|
||||
"Name": "New device",
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Port": "53/tcp",
|
||||
"State": "open",
|
||||
"Service": "domain",
|
||||
"Extra": ""
|
||||
}
|
||||
}, {
|
||||
"new": {
|
||||
"Name": "New device",
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Port": "80/tcp",
|
||||
"State": "open",
|
||||
"Service": "http",
|
||||
"Extra": ""
|
||||
}
|
||||
}, {
|
||||
"new": {
|
||||
"Name": "New device",
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Port": "443/tcp",
|
||||
"State": "open",
|
||||
"Service": "https",
|
||||
"Extra": ""
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
||||
{
|
||||
"headers": {
|
||||
"host": "192.168.1.82:5678",
|
||||
"user-agent": "curl/7.74.0",
|
||||
"accept": "*/*",
|
||||
"content-type": "application/json",
|
||||
"content-length": "872"
|
||||
},
|
||||
"params": {},
|
||||
"query": {},
|
||||
"body": {
|
||||
"username": "Pi.Alert",
|
||||
"text": "There are new notifications",
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Pi.Alert Notifications",
|
||||
"title_link": "",
|
||||
"text": {
|
||||
"internet": [],
|
||||
"new_devices": [
|
||||
{
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.1",
|
||||
"Event Type": "New Device",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null,
|
||||
"Device Vendor": null
|
||||
}
|
||||
],
|
||||
"down_devices": [],
|
||||
"events": [
|
||||
{
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.92",
|
||||
"Event Type": "Disconnected",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null,
|
||||
"Device Vendor": null
|
||||
},
|
||||
{
|
||||
"MAC": "74:ac:74:ac:74:ac",
|
||||
"Datetime": "2023-01-30 22:15:09",
|
||||
"IP": "192.168.1.150",
|
||||
"Event Type": "Disconnected",
|
||||
"Device name": "(name not found)",
|
||||
"Comments": null,
|
||||
"Device Vendor": null
|
||||
}
|
||||
],
|
||||
"plugins": [
|
||||
{
|
||||
"Index": 138,
|
||||
"Plugin": "INTRSPD",
|
||||
"Object_PrimaryID": "Speedtest",
|
||||
"Object_SecondaryID": "2023-10-08 02:01:16+02:00",
|
||||
"DateTimeCreated": "2023-10-08 02:01:16",
|
||||
"DateTimeChanged": "2023-10-08 02:32:15",
|
||||
"Watched_Value1": "-1",
|
||||
"Watched_Value2": "-1",
|
||||
"Watched_Value3": "null",
|
||||
"Watched_Value4": "null",
|
||||
"Status": "missing-in-last-scan",
|
||||
"Extra": "null",
|
||||
"UserData": "null",
|
||||
"ForeignKey": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
2
config/.gitignore
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
2
db/.gitignore
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
@@ -2,43 +2,60 @@ version: "3"
|
||||
services:
|
||||
pialert:
|
||||
privileged: true
|
||||
build: .
|
||||
build:
|
||||
dockerfile: Dockerfile
|
||||
context: .
|
||||
cache_from:
|
||||
- type=registry,ref=docker.io/jokob-sk/pi.alert:buildcache
|
||||
container_name: pialert
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
# restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_LOCATION}/pialert2/config:/home/pi/pialert/config
|
||||
# - ${APP_DATA_LOCATION}/pialert/db/pialert.db:/home/pi/pialert/db/pialert.db
|
||||
- ${APP_DATA_LOCATION}/pialert2/db:/home/pi/pialert/db
|
||||
# - ${APP_DATA_LOCATION}/pialert_dev/config:/home/pi/pialert/config
|
||||
- ${APP_DATA_LOCATION}/pialert/config:/home/pi/pialert/config
|
||||
# - ${APP_DATA_LOCATION}/pialert_dev/db:/home/pi/pialert/db
|
||||
- ${APP_DATA_LOCATION}/pialert/db:/home/pi/pialert/db
|
||||
# (optional) useful for debugging if you have issues setting up the container
|
||||
- ${LOGS_LOCATION}:/home/pi/pialert/front/log
|
||||
# ---------------------------------------------------------------------------
|
||||
# DELETE START anyone trying to use this file: comment out / delete BELOW lines, they are only for development purposes
|
||||
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/dhcp1.leases:/mnt/dhcp1.leases
|
||||
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/dhcp2.leases:/mnt/dhcp2.leases
|
||||
- ${DEV_LOCATION}/back/pialert.py:/home/pi/pialert/back/pialert.py
|
||||
- ${DEV_LOCATION}/back/report_template.html:/home/pi/pialert/back/report_template.html
|
||||
- ${DEV_LOCATION}/back/report_template_new_version.html:/home/pi/pialert/back/report_template_new_version.html
|
||||
- ${DEV_LOCATION}/back/report_template.txt:/home/pi/pialert/back/report_template.txt
|
||||
- ${DEV_LOCATION}/pholus:/home/pi/pialert/pholus
|
||||
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/dhcp2.leases:/mnt/dhcp2.leases
|
||||
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/pihole_dhcp_full.leases:/etc/pihole/dhcp.leases
|
||||
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/pihole_dhcp_2.leases:/etc/pihole/dhcp2.leases
|
||||
- ${APP_DATA_LOCATION}/pihole/etc-pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.db
|
||||
- ${DEV_LOCATION}/pialert:/home/pi/pialert/pialert
|
||||
- ${DEV_LOCATION}/dockerfiles:/home/pi/pialert/dockerfiles
|
||||
- ${APP_DATA_LOCATION}/pialert/php.ini:/etc/php/7.4/fpm/php.ini
|
||||
# - ${DEV_LOCATION}/front/api:/home/pi/pialert/front/api
|
||||
- ${APP_DATA_LOCATION}/pialert/php.ini:/etc/php/8.2/fpm/php.ini
|
||||
- ${DEV_LOCATION}/install:/home/pi/pialert/install
|
||||
- ${DEV_LOCATION}/front/css:/home/pi/pialert/front/css
|
||||
- ${DEV_LOCATION}/front/lib/AdminLTE:/home/pi/pialert/front/lib/AdminLTE
|
||||
- ${DEV_LOCATION}/front/js:/home/pi/pialert/front/js
|
||||
- ${DEV_LOCATION}/front/php:/home/pi/pialert/front/php
|
||||
- ${DEV_LOCATION}/dockerfiles/start.sh:/home/pi/pialert/dockerfiles/start.sh
|
||||
- ${DEV_LOCATION}/dockerfiles/user-mapping.sh:/home/pi/pialert/dockerfiles/user-mapping.sh
|
||||
- ${DEV_LOCATION}/install/install.sh:/home/pi/pialert/install/install.sh
|
||||
- ${DEV_LOCATION}/install/install_dependencies.sh:/home/pi/pialert/install/install_dependencies.sh
|
||||
- ${DEV_LOCATION}/front/api:/home/pi/pialert/front/api
|
||||
- ${DEV_LOCATION}/front/php:/home/pi/pialert/front/php
|
||||
- ${DEV_LOCATION}/front/deviceDetails.php:/home/pi/pialert/front/deviceDetails.php
|
||||
- ${DEV_LOCATION}/front/deviceDetailsTools.php:/home/pi/pialert/front/deviceDetailsTools.php
|
||||
- ${DEV_LOCATION}/front/devices.php:/home/pi/pialert/front/devices.php
|
||||
- ${DEV_LOCATION}/front/events.php:/home/pi/pialert/front/events.php
|
||||
- ${DEV_LOCATION}/front/plugins.php:/home/pi/pialert/front/plugins.php
|
||||
- ${DEV_LOCATION}/front/pluginsCore.php:/home/pi/pialert/front/pluginsCore.php
|
||||
- ${DEV_LOCATION}/front/help_faq.php:/home/pi/pialert/front/help_faq.php
|
||||
- ${DEV_LOCATION}/front/index.php:/home/pi/pialert/front/index.php
|
||||
- ${DEV_LOCATION}/front/maintenance.php:/home/pi/pialert/front/maintenance.php
|
||||
- ${DEV_LOCATION}/front/network.php:/home/pi/pialert/front/network.php
|
||||
- ${DEV_LOCATION}/front/presence.php:/home/pi/pialert/front/presence.php
|
||||
- ${DEV_LOCATION}/front/settings.php:/home/pi/pialert/front/settings.php
|
||||
- ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins
|
||||
- ${DEV_LOCATION}/front/settings.php:/home/pi/pialert/front/settings.php
|
||||
- ${DEV_LOCATION}/front/systeminfo.php:/home/pi/pialert/front/systeminfo.php
|
||||
- ${DEV_LOCATION}/front/report.php:/home/pi/pialert/front/report.php
|
||||
- ${DEV_LOCATION}/front/flows.php:/home/pi/pialert/front/flows.php
|
||||
- ${DEV_LOCATION}/front/donations.php:/home/pi/pialert/front/donations.php
|
||||
- ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins
|
||||
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
|
||||
# ---------------------------------------------------------------------------
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
- PORT=${PORT}
|
||||
|
||||
@@ -4,9 +4,10 @@
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
|
||||
# 🐳 A docker image for Pi.Alert
|
||||
# PiAlert 💻🔍 Network security scanner & notification framework
|
||||
|
||||
🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/pi.alert) | 📄 [Dockerfile](https://github.com/jokob-sk/Pi.Alert/blob/main/Dockerfile) | 📚 [Docker instructions](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md) | 🆕 [Release notes](https://github.com/jokob-sk/Pi.Alert/releases)
|
||||
| 🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/pi.alert) | 📑 [Docker guide](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md) |🆕 [Release notes](https://github.com/jokob-sk/Pi.Alert/releases) | 📚 [All Docs](https://github.com/jokob-sk/Pi.Alert/tree/main/docs) |
|
||||
|----------------------|----------------------| ----------------------| ----------------------|
|
||||
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/devices_split.png" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/devices_split.png" width="300px" />
|
||||
@@ -15,7 +16,6 @@
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/network.png" width="300px" />
|
||||
</a>
|
||||
|
||||
|
||||
## 📕 Basic Usage
|
||||
|
||||
- You will have to run the container on the host network, e.g:
|
||||
@@ -35,6 +35,7 @@ docker run -d --rm --network=host \
|
||||
| Variable | Description | Default |
|
||||
| :------------- |:-------------| -----:|
|
||||
| `PORT` |Port of the web interface | `20211` |
|
||||
| `LISTEN_ADDR` |Set the specific IP Address for the listener address for the nginx webserver (web interface). This could be useful when using multiple subnets to hide the web interface from all untrusted networks. | `0.0.0.0` |
|
||||
|`TZ` |Time zone to display stats correctly. Find your time zone [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `Europe/Berlin` |
|
||||
|`HOST_USER_GID` |User ID (UID) to map the user in the container to a server user with sufficient read&write permissions on the mapped files | `1000` |
|
||||
|`HOST_USER_ID` |User Group ID (GID) to map the user group in the container to a server user group with sufficient read&write permissions on the mapped files | `1000` |
|
||||
@@ -47,8 +48,9 @@ docker run -d --rm --network=host \
|
||||
| **Required** | `:/home/pi/pialert/db` | Folder which will contain the `pialert.db` file |
|
||||
|Optional| `:/home/pi/pialert/front/log` | Logs folder useful for debugging if you have issues setting up the container |
|
||||
|Optional| `:/etc/pihole/pihole-FTL.db` | PiHole's `pihole-FTL.db` database file. Required if you want to use PiHole |
|
||||
|Optional| `:/etc/pihole/dhcp.leases` | PiHole's `dhcp.leases` file. Required if you want to use PiHole |
|
||||
|Optional| `:/etc/pihole/dhcp.leases` | PiHole's `dhcp.leases` file. Required if you want to use PiHole `dhcp.leases` file. This has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry. (the path in the container must contain `pihole`)|
|
||||
|Optional| `:/home/pi/pialert/front/api` | A simple [API endpoint](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md) containing static (but regularly updated) json and other files. |
|
||||
|Optional| `:/home/pi/pialert/front/plugins/<plugin>/ignore_plugin` | Map a file `ignore_plugin` to ignore a plugin. Plugins can be soft-disabled via settings. More in the [Plugin docs](/front/plugins/README.md). |
|
||||
|
||||
|
||||
### Config (`pialert.conf`)
|
||||
@@ -61,44 +63,49 @@ docker run -d --rm --network=host \
|
||||
|
||||
These are the most important settings to get at least some output in your Devices screen. Usually, only one approach is used, but you should be able to combine these approaches.
|
||||
|
||||
##### For arp-scan: ENABLE_ARPSCAN, SCAN_SUBNETS
|
||||
##### For arp-scan: ARPSCAN_RUN, SCAN_SUBNETS
|
||||
|
||||
- ❗ To use the arp-scan method, you need to set the `SCAN_SUBNETS` variable.
|
||||
* The adapter will probably be `eth0` or `eth1`. (Run `iwconfig` to find your interface name(s))
|
||||
* Specify the network filter (which **significantly** speeds up the scan process). For example, the filter `192.168.1.0/24` covers IP ranges 192.168.1.0 to 192.168.1.255.
|
||||
* Examples for one and two subnets (❗ Note the `['...', '...']` format):
|
||||
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
|
||||
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0', '192.168.1.0/24 --interface=eth1 -vlan=107']`
|
||||
* More documentation on how to e.g. [setup vlans & limitations](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md)
|
||||
- ❗ To use the arp-scan method, you need to set the `SCAN_SUBNETS` variable. See the documentation on how [to setup SUBNETS, VLANs & limitations](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md)
|
||||
|
||||
##### For pihole: PIHOLE_ACTIVE, DHCP_ACTIVE
|
||||
##### For pihole: PIHOLE_RUN, DHCPLSS_RUN
|
||||
|
||||
* `PIHOLE_ACTIVE`: You need to map `:/etc/pihole/pihole-FTL.db in the docker-compose.yml` file if you enable this setting.
|
||||
* `DHCP_ACTIVE` : You need to map `:/etc/pihole/dhcp.leases in the docker-compose.yml` file if you enable this setting.
|
||||
There are 2 approaches how to get PiHole devices imported. Via the PiHole import (PIHOLE) plugin or DHCP leases (DHCPLSS) plugin.
|
||||
|
||||
**PiHole (Device sync)**
|
||||
|
||||
* `PIHOLE_RUN`: You need to map `:/etc/pihole/pihole-FTL.db` in the `docker-compose.yml` file if you enable this setting.
|
||||
|
||||
**DHCP Leases (Device import)**
|
||||
|
||||
* `DHCPLSS_RUN`: You need to map `:/etc/pihole/dhcp.leases` in the `docker-compose.yml` file if you enable this setting.
|
||||
* The above setting has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry (the path in the container must contain `pihole` as PiHole uses a different format of the `dhcp.leases` file).
|
||||
|
||||
> [!NOTE]
|
||||
> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.
|
||||
|
||||
|
||||
#### 🧭 Community guides
|
||||
|
||||
> Primarily use the official installation guides in this document and use community content as suplementary material. Open an issue if you'd like to add your link to the list 🙏
|
||||
|
||||
- 📄 [How to Install Pi.Alert on Your Synology NAS - Marius hosting (English)](https://mariushosting.com/how-to-install-pi-alert-on-your-synology-nas/) (Updated frequently)
|
||||
- 📄 [시놀/헤놀에서 네트워크 스캐너 Pi.Alert Docker로 설치 및 사용하기 (Korean)](https://blog.dalso.org/article/%EC%8B%9C%EB%86%80-%ED%97%A4%EB%86%80%EC%97%90%EC%84%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%8A%A4%EC%BA%90%EB%84%88-pi-alert-docker%EB%A1%9C-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9) (July 2023)
|
||||
- ▶ [Pi.Alert auf Synology & Docker by - Jürgen Barth (German)](https://www.youtube.com/watch?v=-ouvA2UNu-A) (March 2023)
|
||||
- ▶ [Top Docker Container for Home Server Security - VirtualizationHowto (English)](https://www.youtube.com/watch?v=tY-w-enLF6Q) (March 2023)
|
||||
- ▶ [Pi.Alert or WatchYourLAN can alert you to unknown devices appearing on your WiFi or LAN network - Danie van der Merwe (English)](https://www.youtube.com/watch?v=v6an9QG2xF0) (November 2022)
|
||||
|
||||
> Ordered by last update time.
|
||||
|
||||
### **Common issues**
|
||||
|
||||
💡 Before creating a new issue, please check if a similar issue was [already resolved](https://github.com/jokob-sk/Pi.Alert/issues?q=is%3Aissue+is%3Aclosed).
|
||||
|
||||
**Permissions**
|
||||
⚠ Check also common issues and [debugging tips](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEBUG_TIPS.md).
|
||||
|
||||
* If facing issues (AJAX errors, can't write to DB, empty screen, etc,) make sure permissions are set correctly, and check the logs under `/home/pi/pialert/front/log`.
|
||||
* To solve permission issues you can try setting the owner and group of the `pialert.db` by executing the following on the host system: `docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db`.
|
||||
* Map to local User and Group IDs. Specify the enviroment variables `HOST_USER_ID` and `HOST_USER_GID` if needed.
|
||||
* If still facing issues, try to map the pialert.db file (⚠ not folder) to `:/home/pi/pialert/db/pialert.db` (see Examples below for details)
|
||||
> [!NOTE]
|
||||
> You can bulk-update devices via the [CSV import method](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEVICES_BULK_EDITING.md).
|
||||
|
||||
**Container restarts / crashes**
|
||||
|
||||
* Check the logs for details. Often a required setting for a notification method is missing.
|
||||
|
||||
**unable to resolve host**
|
||||
|
||||
* Check that your `SCAN_SUBNETS` variable is using the correct mask and `--interface` as outlined in the instructions above.
|
||||
|
||||
|
||||
Docker-compose examples can be found below.
|
||||
|
||||
## 📄 Examples
|
||||
## 📄 docker-compose.yml Examples
|
||||
|
||||
### Example 1
|
||||
|
||||
@@ -107,6 +114,8 @@ version: "3"
|
||||
services:
|
||||
pialert:
|
||||
container_name: pialert
|
||||
# use the below line if you want to test the latest dev image
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: "jokobsk/pi.alert:latest"
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
@@ -133,6 +142,8 @@ Example by [SeimuS](https://github.com/SeimusS).
|
||||
container_name: PiAlert
|
||||
hostname: PiAlert
|
||||
privileged: true
|
||||
# use the below line if you want to test the latest dev image
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: jokobsk/pi.alert:latest
|
||||
environment:
|
||||
- TZ=Europe/Bratislava
|
||||
@@ -154,6 +165,8 @@ version: "3"
|
||||
services:
|
||||
pialert:
|
||||
container_name: pialert
|
||||
# use the below line if you want to test the latest dev image
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: "jokobsk/pi.alert:latest"
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
@@ -198,6 +211,8 @@ Courtesy of [pbek](https://github.com/pbek). The volume `pialert_db` is used by
|
||||
|
||||
```yaml
|
||||
pialert:
|
||||
# use the below line if you want to test the latest dev image
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: jokobsk/pi.alert
|
||||
ports:
|
||||
- "80:20211/tcp"
|
||||
@@ -220,10 +235,19 @@ Big thanks to <a href="https://github.com/Macleykun">@Macleykun</a> for help and
|
||||
<img src="https://avatars.githubusercontent.com/u/26381427?size=50">
|
||||
</a>
|
||||
|
||||
## ☕ Support me
|
||||
## ❤ Support me
|
||||
|
||||
<a href="https://github.com/sponsors/jokob-sk" target="_blank"><img src="https://i.imgur.com/X6p5ACK.png" alt="Sponsor Me on GitHub" style="height: 30px !important;width: 117px !important;" width="150px" ></a>
|
||||
<a href="https://www.buymeacoffee.com/jokobsk" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 117px !important;" width="117px" height="30px" ></a>
|
||||
<a href="https://www.patreon.com/user?u=84385063" target="_blank"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Patreon_logo_with_wordmark.svg/512px-Patreon_logo_with_wordmark.svg.png" alt="Support me on patreon" style="height: 30px !important;width: 117px !important;" width="117px" ></a>
|
||||
Get:
|
||||
- Regular updates to keep your data and family safe 🔄
|
||||
- Better and more functionality➕
|
||||
- I don't get burned out and the app survives longer🔥🤯
|
||||
- Quicker and better support with issues 🆘
|
||||
- Less grumpy me 😄
|
||||
|
||||
BTC: 1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM
|
||||
| [](https://github.com/sponsors/jokob-sk) | [](https://www.buymeacoffee.com/jokobsk) | [](https://www.patreon.com/user?u=84385063) |
|
||||
| --- | --- | --- |
|
||||
|
||||
- Bitcoin: `1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM`
|
||||
- Ethereum: `0x6e2749Cb42F4411bc98501406BdcD82244e3f9C7`
|
||||
|
||||
> 📧 Email me at [jokob@duck.com](mailto:jokob@duck.com?subject=PiAlert) if you want to get in touch or if I should add other sponsorship platforms.
|
||||
232
dockerfiles/README_ES.md
Executable file
@@ -0,0 +1,232 @@
|
||||
[](https://github.com/jokob-sk/Pi.Alert/actions/workflows/docker_prod.yml)
|
||||
[](https://github.com/jokob-sk/Pi.Alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
[](https://hub.docker.com/r/jokobsk/pi.alert)
|
||||
|
||||
# 🐳 Una imagen docker para Pi.Alert
|
||||
|
||||
🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/pi.alert) | 📑 [Instrucciones para Docker](https://github.com/jokob-sk/Pi.Alert/blob/main/dockerfiles/README.md) | 🆕 [Release notes](https://github.com/jokob-sk/Pi.Alert/releases) | 📚 [Todos los Docs](https://github.com/jokob-sk/Pi.Alert/tree/main/docs)
|
||||
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/devices_split.png" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/devices_split.png" width="300px" />
|
||||
</a>
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/network.png" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/network.png" width="300px" />
|
||||
</a>
|
||||
|
||||
|
||||
## 📕 Uso básico
|
||||
|
||||
- Tendrás que ejecutar el contenedor en la red del host, por ejemplo:
|
||||
|
||||
```yaml
|
||||
docker run -d --rm --network=host \
|
||||
-v local/path/pialert/config:/home/pi/pialert/config \
|
||||
-v local/path/pialert/db:/home/pi/pialert/db \
|
||||
-e TZ=Europe/Berlin \
|
||||
-e PORT=20211 \
|
||||
jokobsk/pi.alert:latest
|
||||
```
|
||||
- El escaneo inicial puede tardar hasta 15 minutos (con 50 dispositivos y MQTT). Los siguientes pueden durar entre 3 y 5 minutos, así que espere a que se ejecuten todos los escaneos.
|
||||
|
||||
### Variables de entorno Docker
|
||||
|
||||
| Variable | Descripción | Predeterminado |
|
||||
| :------------- |:-------------| -----:|
|
||||
| `PORT` |Puerto de la interfaz web | `20211` |
|
||||
|`TZ` |Zona horaria para mostrar correctamente las estadísticas. Encuentre su zona horaria [aquí](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `Europe/Berlin` |
|
||||
|`HOST_USER_GID` |ID de usuario (UID) para asignar el usuario del contenedor a un usuario del servidor con suficientes permisos de lectura y escritura en los archivos asignados | `1000` |
|
||||
|`HOST_USER_ID` |ID de grupo de usuarios (GID) para asignar el grupo de usuarios del contenedor a un grupo de usuarios del servidor con suficientes permisos de lectura y escritura en los archivos asignados | `1000` |
|
||||
|
||||
### Rutas Docker
|
||||
|
||||
| | Ruta | Descripción |
|
||||
| :------------- | :------------- |:-------------|
|
||||
| **Obligatorio** | `:/home/pi/pialert/config` | Carpeta que contendrá el archivo `pialert.conf` (para más detalles, véase más abajo) |
|
||||
| **Obligatorio** | `:/home/pi/pialert/db` | Carpeta que contendrá el archivo `pialert.db` |
|
||||
|Opcional| `:/home/pi/pialert/front/log` | Carpeta de registros útil para depurar si tiene problemas al configurar el contenedor |
|
||||
|Opcional| `:/etc/pihole/pihole-FTL.db` | Archivo de base de datos `pihole-FTL.db` de PiHole. Necesario si desea utilizar PiHole |
|
||||
|Opcional| `:/etc/pihole/dhcp.leases` | Archivo `dhcp.leases` de PiHole. Obligatorio si desea utilizar el archivo `dhcp.leases` de PiHole. Tiene que coincidir con la correspondiente entrada de configuración `DHCPLSS_paths_to_check`. (La ruta en el contenedor debe contener `pihole`)|
|
||||
|Opcional| `:/home/pi/pialert/front/api` | Una simple [API endpoint](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md) que contiene archivos json estáticos (pero actualizados regularmente) y otros archivos. |
|
||||
|
||||
|
||||
### Configurar (`pialert.conf`)
|
||||
|
||||
- Si no está disponible, la aplicación genera un archivo `pialert.conf` y `pialert.db` por defecto en la primera ejecución.
|
||||
- La forma preferida es gestionar la configuración a través de la sección "Configuración" de la interfaz de usuario.
|
||||
- Puede modificar [pialert.conf](https://github.com/jokob-sk/Pi.Alert/tree/main/config) directamente, si es necesario.
|
||||
|
||||
#### Ajustes importantes
|
||||
|
||||
Estos son los ajustes más importantes para obtener al menos alguna salida en la pantalla de tus Dispositivos. Por lo general, sólo se utiliza un enfoque, pero usted debe ser capaz de combinar estos enfoques.
|
||||
|
||||
##### Para arp-scan: ARPSCAN_RUN, SCAN_SUBNETS
|
||||
|
||||
- ❗ Para usar el método arp-scan, necesitas configurar la variable `SCAN_SUBNETS`. Consulte la documentación sobre cómo [configurar SUBNETS, VLANs y limitaciones](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md)
|
||||
|
||||
##### Para pihole: PIHOLE_RUN, DHCPLSS_RUN
|
||||
|
||||
Hay dos maneras de importar dispositivos PiHole. A través del plugin de importación PiHole (PIHOLE) o del plugin DHCP leases (DHCPLSS).
|
||||
|
||||
**PiHole (Sincronización de dispositivos)**
|
||||
|
||||
* `PIHOLE_RUN`: Necesitas mapear `:/etc/pihole/pihole-FTL.db` en el fichero `docker-compose.yml` si activas esta opción.
|
||||
|
||||
**DHCP Leases (Importación de dispositivos)**
|
||||
|
||||
* `DHCPLSS_RUN`: Es necesario mapear `:/etc/pihole/dhcp.leases` en el fichero `docker-compose.yml` si se activa esta opción.
|
||||
* La configuración anterior tiene que coincidir con una entrada de configuración correspondiente `DHCPLSS_paths_to_check` (la ruta en el contenedor debe contener `pihole` ya que PiHole utiliza un formato diferente del archivo `dhcp.leases`).
|
||||
|
||||
> Se recomienda utilizar el mismo intervalo de programación para todos los plugins responsables de descubrir nuevos dispositivos.
|
||||
|
||||
### **Problemas comunes**
|
||||
|
||||
💡 Antes de crear una nueva incidencia, comprueba si ya se ha resuelto una [incidencia similar](https://github.com/jokob-sk/Pi.Alert/issues?q=is%3Aissue+is%3Aclosed).
|
||||
|
||||
⚠ Compruebe también los problemas comunes y los [consejos de depuración](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEBUG_TIPS.md).
|
||||
|
||||
## 📄 Ejemplos
|
||||
|
||||
### Ejemplo 1
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
services:
|
||||
pialert:
|
||||
container_name: pialert
|
||||
# Utilice la siguiente línea si desea probar la última imagen de desarrollo
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: "jokobsk/pi.alert:latest"
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- local/path/pialert/config:/home/pi/pialert/config
|
||||
- local/path/pialert/db:/home/pi/pialert/db
|
||||
# (optional) useful for debugging if you have issues setting up the container
|
||||
- local/path/logs:/home/pi/pialert/front/log
|
||||
environment:
|
||||
- TZ=Europe/Berlin
|
||||
- HOST_USER_ID=1000
|
||||
- HOST_USER_GID=1000
|
||||
- PORT=20211
|
||||
```
|
||||
|
||||
Para ejecutar el contenedor ejecute: `sudo docker-compose up -d`
|
||||
|
||||
### Ejemplo 2
|
||||
|
||||
Ejemplo de [SeimuS](https://github.com/SeimusS).
|
||||
|
||||
```yaml
|
||||
pialert:
|
||||
container_name: PiAlert
|
||||
hostname: PiAlert
|
||||
privileged: true
|
||||
# Utilice la siguiente línea si desea probar la última imagen de desarrollo
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: jokobsk/pi.alert:latest
|
||||
environment:
|
||||
- TZ=Europe/Bratislava
|
||||
restart: always
|
||||
volumes:
|
||||
- ./pialert/pialert_db:/home/pi/pialert/db
|
||||
- ./pialert/pialert_config:/home/pi/pialert/config
|
||||
network_mode: host
|
||||
```
|
||||
|
||||
Para ejecutar el contenedor ejecute: `sudo docker-compose up -d`
|
||||
|
||||
### Ejemplo 3
|
||||
|
||||
`docker-compose.yml`
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
services:
|
||||
pialert:
|
||||
container_name: pialert
|
||||
# Utilice la siguiente línea si desea probar la última imagen de desarrollo
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: "jokobsk/pi.alert:latest"
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_LOCATION}/pialert/config:/home/pi/pialert/config
|
||||
- ${APP_DATA_LOCATION}/pialert/db/pialert.db:/home/pi/pialert/db/pialert.db
|
||||
# (optional) useful for debugging if you have issues setting up the container
|
||||
- ${LOGS_LOCATION}:/home/pi/pialert/front/log
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
- HOST_USER_ID=${HOST_USER_ID}
|
||||
- HOST_USER_GID=${HOST_USER_GID}
|
||||
- PORT=${PORT}
|
||||
```
|
||||
|
||||
`.env` file
|
||||
|
||||
```yaml
|
||||
#VARIABLES DE RUTA GLOBAL
|
||||
|
||||
APP_DATA_LOCATION=/path/to/docker_appdata
|
||||
APP_CONFIG_LOCATION=/path/to/docker_config
|
||||
LOGS_LOCATION=/path/to/docker_logs
|
||||
|
||||
#VARIABLES DE ENTORNO
|
||||
|
||||
TZ=Europe/Paris
|
||||
HOST_USER_ID=1000
|
||||
HOST_USER_GID=1000
|
||||
PORT=20211
|
||||
|
||||
#VARIABLES DE DESARROLLO
|
||||
|
||||
DEV_LOCATION=/path/to/local/source/code
|
||||
```
|
||||
|
||||
Para ejecutar el contenedor ejecute: `sudo docker-compose --env-file /path/to/.env up`
|
||||
|
||||
### Example 4
|
||||
|
||||
Por cortesía de [pbek](https://github.com/pbek). El volumen `pialert_db` es utilizado por el directorio db. Los dos archivos de configuración se montan directamente desde una carpeta local a sus lugares en la carpeta config. Puedes hacer una copia de seguridad de la carpeta `docker-compose.yaml` y de la carpeta docker volumes.
|
||||
|
||||
|
||||
```yaml
|
||||
pialert:
|
||||
# Utilice la siguiente línea si desea probar la última imagen de desarrollo
|
||||
# image: "jokobsk/pi.alert_dev:latest"
|
||||
image: jokobsk/pi.alert
|
||||
ports:
|
||||
- "80:20211/tcp"
|
||||
environment:
|
||||
- TZ=Europe/Vienna
|
||||
networks:
|
||||
local:
|
||||
ipv4_address: 192.168.1.2
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- pialert_db:/home/pi/pialert/db
|
||||
- ./pialert/pialert.conf:/home/pi/pialert/config/pialert.conf
|
||||
```
|
||||
|
||||
## 🏅 Reconocimientos
|
||||
|
||||
Muchas gracias a <a href="https://github.com/Macleykun">@Macleykun</a> por ayudarme en consejos y trucos para Dockerfile(s):
|
||||
|
||||
<a href="https://github.com/Macleykun">
|
||||
<img src="https://avatars.githubusercontent.com/u/26381427?size=50">
|
||||
</a>
|
||||
|
||||
Muchas gracias a <a href="https://github.com/cvc90">@cvc90</a> por ayudarme y realizar esta traduccion:
|
||||
|
||||
<a href="https://github.com/cvc90">
|
||||
<img src="https://avatars.githubusercontent.com/u/76731844?size=50">
|
||||
</a>
|
||||
|
||||
## ☕ Apóyame
|
||||
|
||||
<a href="https://github.com/sponsors/jokob-sk" target="_blank"><img src="https://i.imgur.com/X6p5ACK.png" alt="Sponsor Me on GitHub" style="height: 30px !important;width: 117px !important;" width="150px" ></a>
|
||||
<a href="https://www.buymeacoffee.com/jokobsk" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 117px !important;" width="117px" height="30px" ></a>
|
||||
<a href="https://www.patreon.com/user?u=84385063" target="_blank"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Patreon_logo_with_wordmark.svg/512px-Patreon_logo_with_wordmark.svg.png" alt="Support me on patreon" style="height: 30px !important;width: 117px !important;" width="117px" ></a>
|
||||
|
||||
BTC: 1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM
|
||||
@@ -1,31 +1,141 @@
|
||||
#!/bin/sh
|
||||
/home/pi/pialert/dockerfiles/user-mapping.sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "---------------------------------------------------------"
|
||||
echo "[INSTALL] Run start.sh"
|
||||
echo "---------------------------------------------------------"
|
||||
|
||||
|
||||
INSTALL_DIR=/home/pi # Specify the installation directory here
|
||||
|
||||
# DO NOT CHANGE ANYTHING BELOW THIS LINE!
|
||||
WEB_UI_DIR=/var/www/html/pialert
|
||||
NGINX_CONFIG_FILE=/etc/nginx/conf.d/pialert.conf
|
||||
OUI_FILE="/usr/share/arp-scan/ieee-oui.txt" # Define the path to ieee-oui.txt and ieee-iab.txt
|
||||
# DO NOT CHANGE ANYTHING ABOVE THIS LINE!
|
||||
|
||||
# if custom variables not set we do not need to do anything
|
||||
if [ -n "${TZ}" ]; then
|
||||
FILECONF=/home/pi/pialert/config/pialert.conf
|
||||
FILECONF=$INSTALL_DIR/pialert/config/pialert.conf
|
||||
if [ -f "$FILECONF" ]; then
|
||||
sed -ie "s|Europe/Berlin|${TZ}|g" /home/pi/pialert/config/pialert.conf
|
||||
sed -ie "s|Europe/Berlin|${TZ}|g" $INSTALL_DIR/pialert/config/pialert.conf
|
||||
else
|
||||
sed -ie "s|Europe/Berlin|${TZ}|g" /home/pi/pialert/back/pialert.conf_bak
|
||||
sed -ie "s|Europe/Berlin|${TZ}|g" $INSTALL_DIR/pialert/back/pialert.conf_bak
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${PORT}" ]; then
|
||||
sed -ie 's/listen 20211/listen '${PORT}'/g' /etc/nginx/sites-available/default
|
||||
fi
|
||||
|
||||
# I hope this will fix DB permission issues going forward
|
||||
FILEDB=/home/pi/pialert/db/pialert.db
|
||||
if [ -f "$FILEDB" ]; then
|
||||
chown -R www-data:www-data /home/pi/pialert/db/pialert.db
|
||||
# Check if script is run as root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo "This script must be run as root. Please use 'sudo'."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
chmod -R a+rw /home/pi/pialert/front/log
|
||||
chmod -R a+rw /home/pi/pialert/config
|
||||
# Run setup scripts
|
||||
echo "[INSTALL] Run setup scripts"
|
||||
|
||||
/etc/init.d/php7.4-fpm start
|
||||
"$INSTALL_DIR/pialert/dockerfiles/user-mapping.sh"
|
||||
"$INSTALL_DIR/pialert/install/install_dependencies.sh" # if modifying this file transfer the chanegs into the root Dockerfile as well!
|
||||
|
||||
echo "[INSTALL] Setup NGINX"
|
||||
|
||||
# Remove default NGINX site if it is symlinked, or backup it otherwise
|
||||
if [ -L /etc/nginx/sites-enabled/default ] ; then
|
||||
echo "Disabling default NGINX site, removing sym-link in /etc/nginx/sites-enabled"
|
||||
sudo rm /etc/nginx/sites-enabled/default
|
||||
elif [ -f /etc/nginx/sites-enabled/default ]; then
|
||||
echo "Disabling default NGINX site, moving config to /etc/nginx/sites-available"
|
||||
sudo mv /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default.bkp_pialert
|
||||
fi
|
||||
|
||||
# Clear existing directories and files
|
||||
if [ -d $WEB_UI_DIR ]; then
|
||||
echo "Removing existing PiAlert web-UI"
|
||||
sudo rm -R $WEB_UI_DIR
|
||||
fi
|
||||
|
||||
if [ -f $NGINX_CONFIG_FILE ]; then
|
||||
echo "Removing existing PiAlert NGINX config"
|
||||
sudo rm $NGINX_CONFIG_FILE
|
||||
fi
|
||||
|
||||
# create symbolic link to the pialert install directory
|
||||
ln -s $INSTALL_DIR/pialert/front $WEB_UI_DIR
|
||||
# create symbolic link to NGINX configuaration coming with PiAlert
|
||||
sudo ln -s "$INSTALL_DIR/pialert/install/pialert.conf" /etc/nginx/conf.d/pialert.conf
|
||||
|
||||
# Use user-supplied port if set
|
||||
if [ -n "${PORT}" ]; then
|
||||
echo "Setting webserver to user-supplied port ($PORT)"
|
||||
sudo sed -i 's/listen 20211/listen '"$PORT"'/g' /etc/nginx/conf.d/pialert.conf
|
||||
fi
|
||||
|
||||
# Change web interface address if set
|
||||
if [ -n "${LISTEN_ADDR}" ]; then
|
||||
echo "Setting webserver to user-supplied address ($LISTEN_ADDR)"
|
||||
sed -ie 's/listen /listen '"${LISTEN_ADDR}":'/g' /etc/nginx/conf.d/pialert.conf
|
||||
fi
|
||||
|
||||
# Run the hardware vendors update at least once
|
||||
echo "[INSTALL] Run the hardware vendors update"
|
||||
|
||||
# Check if ieee-oui.txt or ieee-iab.txt exist
|
||||
if [ -f "$OUI_FILE" ]; then
|
||||
echo "The file ieee-oui.txt exists. Skipping update_vendors.sh..."
|
||||
else
|
||||
echo "The file ieee-oui.txt does not exist. Running update_vendors..."
|
||||
|
||||
# Run the update_vendors.sh script
|
||||
if [ -f "$INSTALL_DIR/pialert/back/update_vendors.sh" ]; then
|
||||
"$INSTALL_DIR/pialert/back/update_vendors.sh"
|
||||
else
|
||||
echo "update_vendors.sh script not found in $INSTALL_DIR."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fixing file permissions
|
||||
echo "[INSTALL] Fixing file permissions"
|
||||
|
||||
|
||||
chmod -R a+rwx $WEB_UI_DIR
|
||||
chmod -R a+rw $INSTALL_DIR/pialert/front/log
|
||||
chmod -R a+rwx $INSTALL_DIR
|
||||
|
||||
FILEDB=$INSTALL_DIR/pialert/db/pialert.db
|
||||
|
||||
if [ -f "$FILEDB" ]; then
|
||||
chown -R www-data:www-data $INSTALL_DIR/pialert/db/pialert.db
|
||||
fi
|
||||
|
||||
echo "[INSTALL] Copy starter pialert.db and pialert.conf if they don't exist"
|
||||
|
||||
# Copy starter pialert.db and pialert.conf if they don't exist
|
||||
cp -n "$INSTALL_DIR/pialert/back/pialert.conf" "$INSTALL_DIR/pialert/config/pialert.conf"
|
||||
cp -n "$INSTALL_DIR/pialert/back/pialert.db" "$INSTALL_DIR/pialert/db/pialert.db"
|
||||
|
||||
|
||||
chmod -R a+rwx $INSTALL_DIR # second time after we copied the files
|
||||
chmod -R a+rw $INSTALL_DIR/pialert/config
|
||||
sudo chgrp -R www-data $INSTALL_DIR/pialert
|
||||
|
||||
# Check if buildtimestamp.txt doesn't exist
|
||||
if [ ! -f "$INSTALL_DIR/pialert/front/buildtimestamp.txt" ]; then
|
||||
# Create buildtimestamp.txt
|
||||
date +%s > "$INSTALL_DIR/pialert/front/buildtimestamp.txt"
|
||||
fi
|
||||
|
||||
|
||||
# start PHP
|
||||
/etc/init.d/php8.2-fpm start
|
||||
/etc/init.d/nginx start
|
||||
|
||||
# cron -f
|
||||
python /home/pi/pialert/back/pialert.py
|
||||
# Start Nginx and your application to start at boot (if needed)
|
||||
# systemctl start nginx
|
||||
# systemctl enable nginx
|
||||
|
||||
# # systemctl enable pi-alert
|
||||
# sudo systemctl restart nginx
|
||||
|
||||
# Activate the virtual python environment
|
||||
source myenv/bin/activate
|
||||
|
||||
# Start the PiAlert python script
|
||||
python $INSTALL_DIR/pialert/pialert/
|
||||
|
||||
@@ -1,29 +1,39 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo "---------------------------------------------------------"
|
||||
echo "[INSTALL] Run user-mapping.sh"
|
||||
echo "---------------------------------------------------------"
|
||||
|
||||
if [ -z "${USER}" ]; then
|
||||
echo "We need USER to be set!"; exit 100
|
||||
fi
|
||||
|
||||
# if both not set we do not need to do anything
|
||||
if [ -z "${HOST_USER_ID}" -a -z "${HOST_USER_GID}" ]; then
|
||||
if [ -z "${HOST_USER_ID}" ] && [ -z "${HOST_USER_GID}" ]; then
|
||||
echo "Nothing to do here." ; exit 0
|
||||
fi
|
||||
|
||||
# reset user_?id to either new id or if empty old (still one of above
|
||||
# reset user_id to either new id or if empty old (still one of above
|
||||
# might not be set)
|
||||
USER_ID=${HOST_USER_ID:=$USER_ID}
|
||||
USER_GID=${HOST_USER_GID:=$USER_GID}
|
||||
|
||||
LINE=$(grep -F "${USER}" /etc/passwd)
|
||||
# replace all ':' with a space and create array
|
||||
array=( ${LINE//:/ } )
|
||||
array=( "${LINE//:/ }" )
|
||||
|
||||
# home is 5th element
|
||||
USER_HOME=${array[4]}
|
||||
|
||||
# print debug output
|
||||
echo USER_ID" ": "${USER_ID}";
|
||||
echo USER_GID : "${USER_GID}";
|
||||
echo USER_HOME: "${USER_HOME}";
|
||||
echo TZ" ": "${TZ}";
|
||||
|
||||
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*:[0-9]*/${USER}:\1:${USER_ID}:${USER_GID}/" /etc/passwd
|
||||
sed -i -e "s/^${USER}:\([^:]*\):[0-9]*/${USER}:\1:${USER_GID}/" /etc/group
|
||||
|
||||
chown -R ${USER_ID}:${USER_GID} ${USER_HOME}
|
||||
chown -R "${USER_ID}:${USER_GID} ${USER_HOME}"
|
||||
|
||||
exec su - "${USER}"
|
||||
exec su - "${USER}"
|
||||
|
||||
@@ -5,7 +5,7 @@ PiAlert comes with a simple API. These API endpoints are static files, that are
|
||||
|
||||
### When are the endpoints updated
|
||||
|
||||
Once you enable the API (`ENABLE_API` setting), the endpoints are updated when objects in the API endpoints are changed:
|
||||
The endpoints are updated when objects in the API endpoints are changed.
|
||||
|
||||
### Location of the endpoints
|
||||
|
||||
@@ -20,8 +20,7 @@ You can access the following files:
|
||||
| `notification_text.txt` | The plain text version of the last notification. |
|
||||
| `notification_text.html` | The full HTML of the last email notification. |
|
||||
| `notification_json_final.json` | The json version of the last notification (e.g. used for webhooks - [sample JSON](https://github.com/jokob-sk/Pi.Alert/blob/main/back/webhook_json_sample.json)). |
|
||||
| `table_devices.json` | The current (at the time of the last update as mentioned above on this page) state of all of the available Devices detected by the app. |
|
||||
| `table_nmap_scan.json` | The current state of the discovered ports by the regular NMAP scans. |
|
||||
| `table_devices.json` | The current (at the time of the last update as mentioned above on this page) state of all of the available Devices detected by the app. |
|
||||
| `table_pholus_scan.json` | The latest state of the [pholus](https://github.com/jokob-sk/Pi.Alert/tree/main/pholus) (A multicast DNS and DNS Service Discovery Security Assessment Tool) scan results. |
|
||||
| `table_plugins_events.json` | The list of the unprocessed (pending) notification events (plugins_events DB table). |
|
||||
| `table_plugins_history.json` | The list of notification events history. |
|
||||
@@ -29,6 +28,7 @@ You can access the following files:
|
||||
| `language_strings.json` | The content of the language_strings table, which in turn is loaded from the plugins `config.json` definitions. |
|
||||
| `table_custom_endpoint.json` | A custom endpoint generated by the SQL query specified by the `API_CUSTOM_SQL` setting. |
|
||||
| `table_settings.json` | The content of the settings table. |
|
||||
| `app_state.json` | Contains the current application state. |
|
||||
|
||||
Current/latest state of the aforementioned files depends on your settings.
|
||||
|
||||
|
||||
39
docs/DATABASE.md
Executable file
@@ -0,0 +1,39 @@
|
||||
|
||||
# A high-level description of the datbase structure
|
||||
|
||||
⚠ Disclaimer: As I'm not the original author, some of the information might be inaccurate. Feel free to submit a PR to correct anything within this page or documentation in general.
|
||||
|
||||
The MAC address is used as a foreign key in most cases.
|
||||
|
||||
## 🔍Tables overview
|
||||
|
||||
| Table name | Description | Sample data |
|
||||
|----------------------|----------------------| ----------------------|
|
||||
| CurrentScan | Result of the current scan | ![Screen1][screen1] |
|
||||
| Devices | The main devices database that also contains the Network tree mappings. If `ScanCycle` is set to `0` device is not scanned. | ![Screen2][screen2] |
|
||||
| Events | Used to collect connection/disconnection events. | ![Screen4][screen4] |
|
||||
| Online_History | Used to display the `Device presence over time` chart | ![Screen6][screen6] |
|
||||
| Parameters | Used to pass values between the frontend and backend. | ![Screen7][screen7] |
|
||||
| Pholus_Scan | Scan results of the Pholus python network penetration script. | ![Screen8][screen8] |
|
||||
| Plugins_Events | For capturing events exposed by a plugin via the `last_result.log` file. If unique then saved into the `Plugins_Objects` table. Entries are deleted once processed and stored in the `Plugins_History` and/or `Plugins_Objects` tables. | ![Screen10][screen10] |
|
||||
| Plugins_History | History of all entries from the `Plugins_Events` table | ![Screen11][screen11] |
|
||||
| Plugins_Language_Strings | Language strings colelcted from the plugin `config.json` files used for string resolution in the frontend. | ![Screen12][screen12] |
|
||||
| Plugins_Objects | Unique objects detected by individual plugins. | ![Screen13][screen13] |
|
||||
| Sessions | Used to display sessions in the charts | ![Screen15][screen15] |
|
||||
| Settings | Database representation of the sum of all settings from `pialert.conf` and plugins coming from `config.json` files. | ![Screen16][screen16] |
|
||||
|
||||
|
||||
|
||||
[screen1]: /docs/img/DATABASE/CurrentScan.png
|
||||
[screen2]: /docs/img/DATABASE/Devices.png
|
||||
[screen4]: /docs/img/DATABASE/Events.png
|
||||
[screen6]: /docs/img/DATABASE/Online_History.png
|
||||
[screen7]: /docs/img/DATABASE/Parameters.png
|
||||
[screen8]: /docs/img/DATABASE/Pholus_Scan.png
|
||||
[screen10]: /docs/img/DATABASE/Plugins_Events.png
|
||||
[screen11]: /docs/img/DATABASE/Plugins_History.png
|
||||
[screen12]: /docs/img/DATABASE/Plugins_Language_Strings.png
|
||||
[screen13]: /docs/img/DATABASE/Plugins_Objects.png
|
||||
[screen15]: /docs/img/DATABASE/Sessions.png
|
||||
[screen16]: /docs/img/DATABASE/Settings.png
|
||||
|
||||
84
docs/DEBUG_TIPS.md
Executable file
@@ -0,0 +1,84 @@
|
||||
# Debugging and troubleshooting
|
||||
|
||||
Please follow tips 1 - 4 to get a more detailed error.
|
||||
|
||||
## 1. More Logging 📃
|
||||
|
||||
When debugging an issue always set the highest log level:
|
||||
|
||||
`LOG_LEVEL='debug'`
|
||||
|
||||
|
||||
## 2. Surfacing errors when container restarts 🔁
|
||||
|
||||
Start the container via the **terminal** with a command similar to this one:
|
||||
|
||||
```bash
|
||||
docker run --rm --network=host \
|
||||
-v local/path/pialert/config:/home/pi/pialert/config \
|
||||
-v local/path/pialert/db:/home/pi/pialert/db \
|
||||
-e TZ=Europe/Berlin \
|
||||
-e PORT=20211 \
|
||||
jokobsk/pi.alert:latest
|
||||
|
||||
```
|
||||
|
||||
> ⚠ Please note, don't use the `-d` parameter so you see the error when the container crashes. Use this error in your issue description.
|
||||
|
||||
## 3. Check the _dev image and open issues ❓
|
||||
|
||||
If possible, check if your issue got fixed in the `_dev` image before opening a new issue. The container is:
|
||||
|
||||
`jokobsk/pi.alert_dev:latest`
|
||||
|
||||
> ⚠ Please backup your DB and config beforehand!
|
||||
|
||||
Please also search [open issues](https://github.com/jokob-sk/Pi.Alert/issues).
|
||||
|
||||
## 4. Disable restart behavior 🛑
|
||||
|
||||
To prevent a Docker container from automatically restarting in a Docker Compose file, specify the restart policy as `no`:
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
your-service:
|
||||
image: your-image:tag
|
||||
restart: no
|
||||
# Other service configurations...
|
||||
```
|
||||
|
||||
## 📃Common issues
|
||||
|
||||
### Permissions
|
||||
|
||||
* If facing issues (AJAX errors, can't write to DB, empty screen, etc,) make sure permissions are set correctly, and check the logs under `/home/pi/pialert/front/log`.
|
||||
* To solve permission issues you can try setting the owner and group of the `pialert.db` by executing the following on the host system: `docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db`.
|
||||
* Map to local User and Group IDs. Specify the enviroment variables `HOST_USER_ID` and `HOST_USER_GID` if needed.
|
||||
* If still facing issues, try to map the pialert.db file (⚠ not folder) to `:/home/pi/pialert/db/pialert.db` (see Examples below for details)
|
||||
|
||||
### Container restarts / crashes
|
||||
|
||||
* Check the logs for details. Often a required setting for a notification method is missing.
|
||||
|
||||
### unable to resolve host
|
||||
|
||||
* Check that your `SCAN_SUBNETS` variable is using the correct mask and `--interface` as outlined in the instructions above.
|
||||
|
||||
### Invalid JSON
|
||||
|
||||
Check the [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md) docs on how to proceed.
|
||||
|
||||
### sudo execution failing (e.g.: on arpscan) on a Raspberry Pi 4
|
||||
|
||||
> sudo: unexpected child termination condition: 0
|
||||
|
||||
Resolution based on [this issue](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-1003657581)
|
||||
|
||||
```
|
||||
wget ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.3-2_armhf.deb
|
||||
sudo dpkg -i libseccomp2_2.5.3-2_armhf.deb
|
||||
```
|
||||
|
||||
The link above will probably break in time too. Go to https://packages.debian.org/sid/armhf/libseccomp2/download to find the new version number and put that in the url.
|
||||
24
docs/DEVICES_BULK_EDITING.md
Executable file
@@ -0,0 +1,24 @@
|
||||
# 📝Bulk-edit devices via CSV Export/Import
|
||||
|
||||
> [!NOTE]
|
||||
> As always, backup everything, just in case.
|
||||
|
||||
1. In `Maintenance` > `Backup / Restore` click the `CSV Export` button.
|
||||
2. A `devices.csv` is generated in the `/config` folder
|
||||
3. Edit the `devices.csv` file however you like.
|
||||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> The file containing a list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this by acessing this URL: `<your pialert url>/php/server/devices.php?action=ExportCSV` or via the `CSV Backup` plugin. (💡 You can schedule this)
|
||||
|
||||

|
||||
|
||||
> [!NOTE]
|
||||
> Keep Linux line endings (sugegsted editors: Nano, Notepad++)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,6 +9,11 @@ To edit device information:
|
||||
- Press the "Save" button
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> [Bulk-edit devices](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEVICES_BULK_EDITING.md) by using the `CSV Export` functionality in the `Maintenance` section.
|
||||
|
||||
|
||||
![Device Details][screen1]
|
||||
|
||||
|
||||
@@ -81,9 +86,17 @@ decides to change the MAC).
|
||||
GPL 3.0
|
||||
[Read more here](../LICENSE.txt)
|
||||
|
||||
### Contact
|
||||
pi.alert.application@gmail.com
|
||||
### Contact
|
||||
|
||||
Always use the Issue tracker for the correct fork, for example:
|
||||
|
||||
[jokob-sk/Pi.Alert](https://github.com/jokob-sk/Pi.Alert/issues). Please also follow the guidelines on:
|
||||
|
||||
- ➕ [Pull Request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-pull-requests-prs)
|
||||
- 🙏 [Feature request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-feature-requests)
|
||||
- 🐛 [Issue guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-submitting-an-issue-or-bug)
|
||||
|
||||
|
||||
***Suggestions and comments are welcome***
|
||||
|
||||
|
||||
|
||||
46
docs/FRONTEND_DEVELOPMENT.md
Executable file
@@ -0,0 +1,46 @@
|
||||
# 🖼 Frontend development
|
||||
|
||||
This page contains tips for frontend development when extending PiAlert. Guiding principles are:
|
||||
|
||||
1. Maintainability
|
||||
2. Extendability
|
||||
3. Reusability
|
||||
4. Placing more functionality into Plugins and enhancing core Plugins functionality
|
||||
|
||||
That means that, when writing code, focus on reusing what's available instead of writing quick fixes. Or creating reusable functions, instead of bespoke functionaility.
|
||||
|
||||
## 🔍 Examples
|
||||
|
||||
Some examples how to apply the above:
|
||||
|
||||
> Example 1
|
||||
>
|
||||
> I want to implement a scan fucntion. Options would be:
|
||||
>
|
||||
> 1. To add a manual scan functionality to the `deviceDetails.php` page.
|
||||
> 2. To create a separate page that handles the execution of the scan.
|
||||
> 3. To create a configurable Plugin.
|
||||
>
|
||||
> From the above, number 3 would be the most appropriate solution. Then followed by number 2. Number 1 would be approved only in special circumstances.
|
||||
|
||||
> Example 2
|
||||
>
|
||||
> I want to change the behavior of the application. Options to implement this could be:
|
||||
>
|
||||
> 1. Hard-code the changes in the code.
|
||||
> 2. Implement the changes and add settings to influence the behavior in the `initialize.py` file so the user can adjust these.
|
||||
> 3. Implement the changes and add settings via a setting-only plugin.
|
||||
> 4. Implement the changes in a way so the behavior can be toggled on each plugin so the core capabilities of Plugins get extended.
|
||||
>
|
||||
> From the above, number 4 would be the most appropriate solution. Then followed by number 3. Number 1 or 2 would be approved only in special circumstances.
|
||||
|
||||
## 💡 Frontend tips
|
||||
|
||||
Some useful frontend JavaScript functions:
|
||||
|
||||
- `getDeviceDataByMacAddress(macAddress, devicesColumn)` - method to retrieve any device data (database column) based on MAC address in the frontend
|
||||
- `getString(string stringKey)` - method to retrieve translated strings in the frontend
|
||||
- `getSetting(string stringKey)` - method to retrieve settings in the frontend
|
||||
|
||||
|
||||
Check the [pialert_common.js](https://github.com/jokob-sk/Pi.Alert/blob/main-2023-06-10/front/js/pialert_common.js) file for more frontend functions.
|
||||
42
docs/HOME_ASSISTANT.md
Executable file
@@ -0,0 +1,42 @@
|
||||
# Overview
|
||||
|
||||
PiAlert comes with MQTT support, allowing you to show all detected devices as devices in Home Assistant. It also supplies a collection of stats, such as number of online devices.
|
||||
|
||||
## ⚠ Note
|
||||
|
||||
- Please note that discovery takes about ~10s per device.
|
||||
- Deleting of devices is not handled automatically. Please use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices in the broker (Home Assistant), if needed.
|
||||
|
||||
|
||||
## 🧭 Guide
|
||||
|
||||
> 💡 This guide was tested only with the Mosquitto MQTT broker
|
||||
|
||||
1. Enable Mosquitto MQTT in Home Assistant by following the [documentation](https://www.home-assistant.io/integrations/mqtt/)
|
||||
|
||||
2. Configure a user name and password on your broker.
|
||||
|
||||
3. Note down the following details that you will need to configure PiAlert:
|
||||
- MQTT host url (usually your Home Assistant IP)
|
||||
- MQTT broker port
|
||||
- User
|
||||
- Password
|
||||
|
||||
4. Ope the `PiAlert` > `Settings` > `MQTT` settings group
|
||||
- Enable MQTT
|
||||
- Fill in the details from above
|
||||
- Fill in remaining settings as per description
|
||||
|
||||
|
||||
## 📷 Screenshots
|
||||
|
||||
| ![Screen 1][sensors] | ![Screen 2][history] |
|
||||
|----------------------|----------------------|
|
||||
| ![Screen 3][list] | ![Screen 4][overview] |
|
||||
|
||||
|
||||
[sensors]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-as-Sensors.png "sensors"
|
||||
[history]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-Presence-History.png "history"
|
||||
[list]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Devices-List.png "list"
|
||||
[overview]: /docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Overview-Card.png "overview"
|
||||
|
||||
49
docs/HW_INSTALL.md
Executable file
@@ -0,0 +1,49 @@
|
||||
# How to install PiAlert on the server hardware
|
||||
|
||||
To download and install PiAlert on the hardware/server directly use `curl` or `wget` commands.
|
||||
|
||||
> [!NOTE]
|
||||
> This is an Experimental feature 🧪 and it relies on community support.
|
||||
>
|
||||
> There is no guarantee that the install script or any other script will gracefully handle other installed software.
|
||||
> Data loss is a possibility, **it is recommended to install PiAlert using the supplied Docker image**.
|
||||
|
||||
A warning to the installation method below: Piping to bash is [controversial](https://pi-hole.net/2016/07/25/curling-and-piping-to-bash) and may
|
||||
be dangerous, as you cannot see the code that's about to be executed on your system.
|
||||
|
||||
Alternatively you can download the installation script `install/install.sh` from the repository and check the code yourself (beware other scripts are
|
||||
downloaded too - only from this repo).
|
||||
|
||||
PiAlert will be installed in `home/pi/pialert/` and run on port number `20211`.
|
||||
|
||||
Some facts about what and where something will be changed/installed by the HW install setup (may not contain everything!):
|
||||
|
||||
- `/home/pi/pialert` directory will be deleted and newly created
|
||||
- `/home/pi/pialert` will contain the whole repository (downloaded by `install/install.sh`)
|
||||
- The default NGINX site `/etc/nginx/sites-enabled/default` will be disabled (sym-link deleted or backed up to `sites-available`)
|
||||
- `/var/www/html/pialert` directory will be deleted and newly created
|
||||
- `/etc/nginx/conf.d/pialert.conf` will be sym-linked to `/home/pi/pialert/install/pialert.conf`
|
||||
- Some files (IEEE device vendors info, ...) will be created in the directory where the installation script is executed
|
||||
|
||||
## Limitations
|
||||
|
||||
- No system service is provided. PiAlert must be started using `/home/pi/pialert/dockerfiles/start.sh`.
|
||||
- No checks for other running software is done.
|
||||
- Only tested to work on Debian Bookworm (Debian 12).
|
||||
- **EXPERIMENTAL** and not recommended way to install PiAlert.
|
||||
|
||||
## CURL
|
||||
|
||||
```bash
|
||||
curl -o install.sh https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/install/install.sh && sudo chmod +x install.sh && sudo ./install.sh
|
||||
```
|
||||
|
||||
## WGET
|
||||
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/install/install.sh -O install.sh && sudo chmod +x install.sh && sudo ./install.sh
|
||||
```
|
||||
|
||||
These commands will download the `install.sh` script from the GitHub repository, make it executable with `chmod`, and then run it using `./install.sh`.
|
||||
|
||||
Make sure you have the necessary permissions to execute the script.
|
||||
@@ -1,6 +1,6 @@
|
||||
## Icons overview
|
||||
|
||||
Icons are used to visually distinguish devices in the app in most of the device listing tables and the [network tree](/docs/NETWORK_TREE.md). Currently only free [Font Awesome](https://fontawesome.com/search?o=r&m=free) icons (up-to v 6.4.0) are supported (I have an unblockable [sponsorship goal](https://github.com/sponsors/jokob-sk) to add the material design icon pack).
|
||||
Icons are used to visually distinguish devices in the app in most of the device listing tables and the [network tree](/docs/NETWORK_TREE.md). Currently only free [Font Awesome](https://fontawesome.com/search?o=r&m=free) icons (up-to v 6.4.0) are supported.
|
||||
|
||||

|
||||
|
||||
@@ -8,6 +8,8 @@ Icons are used to visually distinguish devices in the app in most of the device
|
||||
|
||||
You can assign icons individually on each device in the Details tab.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
- You can click into the `Icon` field or click the Pencil (2) icon in the above screenshot to enter any text. Only [free Font Awesome](https://fontawesome.com/search?o=r&m=free) icons in the following format will work:
|
||||
@@ -18,3 +20,13 @@ You can assign icons individually on each device in the Details tab.
|
||||
- If you want to mass-apply an icon to all devices of the same device type (Field marked (4) in the above screenshot), you can click the copy button (Marked (1) in the above screenshot). A confirmation prompt is displayed. If you proceed, icons of all devices set to the same device type as the current device, will be overwritten with the current device's icon.
|
||||
|
||||
- The dropdown (3) contains all icons already used in the app for device icons. You need to navigate away or refresh the page once you add a new icon.
|
||||
|
||||
## 🌟 Pro Font Awesome icons
|
||||
|
||||
If you own the premium package of Font Awesome icons you can mount it in your Docker container the following way:
|
||||
|
||||
```yaml
|
||||
/font-awesome:/home/pi/pialert/front/lib/AdminLTE/bower_components/font-awesome:ro
|
||||
```
|
||||
|
||||
You can use the full range of Font Awesome icons afterwards.
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
Make sure you have a root device with the MAC `Internet` (No other MAC addresses are currently supported as the root node).
|
||||
|
||||
> 💡 Tip: You can add dummy devices via the [Undiscoverables plugin](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/undiscoverables/README.md)
|
||||
|
||||
> 💡 Tip: Export your configuration of the Network and Devices once in a while via the Export CSV feature under **Maintenance** -> **Backup/Restore** -> **CSV Export**.
|
||||
|
||||
## ⚡Quick setup:
|
||||
|
||||
* Go to Devices > Device Details.
|
||||
@@ -9,13 +13,18 @@ Make sure you have a root device with the MAC `Internet` (No other MAC addresses
|
||||
* Set the Type of such a device to one of the following: AP, Firewall, Gateway, PLC, Powerline, Router, Switch, USB LAN Adapter, USB WIFI Adapter and WLAN.
|
||||
* Save and go to Network where the devices you've marked as network devices (by selecting the Type as mentioned above) will show up as tabs.
|
||||
* You can now assign the Unassigend devices to the correct network node.
|
||||
* If port is empty or 0 a wifi icon is rendered, otherwise a ethernet port icon
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> [Bulk-edit devices](/docs/DEVICES_BULK_EDITING.md) by using the `CSV Export` functionality in the `Maintenance` section. You can use this to fix `Internet` node assignment issues.
|
||||
|
||||
## 🔍Detailed example:
|
||||
|
||||
In this example you will setup a device named `rapberrypi` as a `Switch` in our network.
|
||||
|
||||
### 1) Device details page
|
||||
### 1. Device details page
|
||||
|
||||
- Go to the `Devices` (1) page:
|
||||
|
||||
@@ -24,13 +33,13 @@ In this example you will setup a device named `rapberrypi` as a `Switch` in our
|
||||
- In the (2) `Details` tab navigate to the the `Type` (3) dropdown and select the type `Switch` (4).
|
||||
|
||||
> Note: Only the following device types will show up as selectable Network nodes ( = devices you can connect other devices to):
|
||||
> AP, Firewall, Gateway, PLC, Powerline, Router, Switch, USB LAN Adapter, USB WIFI Adapter and WLAN.
|
||||
> AP, Firewall, Gateway, Hypervisor, PLC, Powerline, Router, Switch, USB LAN Adapter, USB WIFI Adapter and WLAN. Custom types can be added via the `NETWORK_DEVICE_TYPES` setting.
|
||||
|
||||
- Assign a device to your root device from the `Node` (5) dropdown which has the MAC `Internet` (6) (Your name may differ, but the MAC needs to be set to `Internet` - this is done by default).
|
||||
|
||||
- Save your changes (7)
|
||||
|
||||
### 1) Network page
|
||||
### 2. Network page
|
||||
|
||||
- Navigate to your `Network` (1) page:
|
||||
|
||||
@@ -40,7 +49,7 @@ In this example you will setup a device named `rapberrypi` as a `Switch` in our
|
||||
- As we asssigned the `raspberrypi` in the previous 1) Device details page section to the `Internet` parent network node in step (6), the link is also showing up in the tree diagram (4)
|
||||
- We can now assign the device `(AppleTV)` (5) to this `raspberrypi` node, representing a network Switch in this example
|
||||
|
||||
### 1) Network page with 2 levels
|
||||
### 3. Network page with 2 levels
|
||||
|
||||
- After clicking the `Assign` button in the previous section, the `(AppleTV)` (1) device is now connected to our `raspberrypi` (2).
|
||||
|
||||
@@ -52,3 +61,4 @@ In this example you will setup a device named `rapberrypi` as a `Switch` in our
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,14 @@ decides to change the MAC).
|
||||
[Read more here](../LICENSE.txt)
|
||||
|
||||
### Contact
|
||||
pi.alert.application@gmail.com
|
||||
Always use the Issue tracker for the correct fork, for example:
|
||||
|
||||
[jokob-sk/Pi.Alert](https://github.com/jokob-sk/Pi.Alert/issues). Please also follow the guidelines on:
|
||||
|
||||
- ➕ [Pull Request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-pull-requests-prs)
|
||||
- 🙏 [Feature request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-feature-requests)
|
||||
- 🐛 [Issue guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-submitting-an-issue-or-bug)
|
||||
|
||||
|
||||
***Suggestions and comments are welcome***
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Documentation overview
|
||||
|
||||
In the app hover-over settings or fields/labels or click blue in-app ❔ (question-mark) icons to get to relevant documentation pages.
|
||||
In the app hover over settings or fields/labels or click blue in-app ❔ (question-mark) icons to get to relevant documentation pages.
|
||||
|
||||

|
||||
|
||||
@@ -14,59 +14,74 @@ There is also an in-app Help / FAQ section that should be answering frequently a
|
||||
|
||||
### 📚 Table of contents
|
||||
|
||||
#### Popular/Suggested
|
||||
#### 🐛 Debugging help & tips
|
||||
|
||||
- [API endpoints details](/docs/API.md)
|
||||
- [Plugin system details and how to develop your own](/front/plugins/README.md)
|
||||
- [Network tree map configuration](/docs/NETWORK_TREE.md)
|
||||
- [Gmail as SMTP server for sending emails](/docs/SMTP_GMAIL.md)
|
||||
- [Subnets and vlans configuration for arp-scan](/docs/SUBNETS.md)
|
||||
- [Debugging tips](/docs/DEBUG_TIPS.md)
|
||||
- [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md)
|
||||
|
||||
#### System Management
|
||||
#### 🔝 Popular/Suggested
|
||||
|
||||
- [Network treemap configuration](/docs/NETWORK_TREE.md)
|
||||
- [SMTP server config](/docs/SMTP.md)
|
||||
- [Subnets and VLANs configuration for arp-scan](/docs/SUBNETS.md)
|
||||
- [Home Assistant](/docs/HOME_ASSISTANT.md)
|
||||
- [Bulk edit devices](/docs/DEVICES_BULK_EDITING.md)
|
||||
|
||||
#### ⚙ System Management
|
||||
|
||||
- [Manage devices (legacy docs)](/docs/DEVICE_MANAGEMENT.md)
|
||||
- [Random MAC/MAC icon meaning (legacy docs)](/docs/RANDOM_MAC.md)
|
||||
- [Custom Icons configuration and support](/docs/ICONS.md)
|
||||
|
||||
#### Examples
|
||||
#### 🔎 Examples
|
||||
|
||||
- [N8N webhook example](/docs/WEBHOOK_N8N.md)
|
||||
|
||||
#### Misc
|
||||
#### ♻ Misc
|
||||
|
||||
- [New Version notifications](/docs/VERSIONS.md)
|
||||
- [Version history (legacy)](/docs/VERSIONS_HISTORY.md)
|
||||
- [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md)
|
||||
- [Reverse proxy (Nginx, Apache, SWAG)](/docs/REVERSE_PROXY.md)
|
||||
|
||||
#### 👩💻For Developers👨💻
|
||||
|
||||
- [APP code structure](/pialert/README.md)
|
||||
- [Database structure](/docs/DATABASE.md)
|
||||
- [API endpoints details](/docs/API.md)
|
||||
- [Plugin system details and how to develop your own](/front/plugins/README.md)
|
||||
- [Settings system](/docs/SETTINGS_SYSTEM.md)
|
||||
- [New Version notifications](/docs/VERSIONS.md)
|
||||
- [Frontend development tips](/docs/FRONTEND_DEVELOPMENT.md)
|
||||
- [Webhook secrets](/docs/WEBHOOK_SECRET.md)
|
||||
|
||||
Feel free to suggest or submit new docs via a PR.
|
||||
|
||||
## 👨💻 Development priorities
|
||||
|
||||
Highest to lowest:
|
||||
Priorities from highest to lowest:
|
||||
|
||||
* Fixing core functionality bugs not solvable with workarounds
|
||||
* New core functionality unlocking other opportunities (e.g.: plugins)
|
||||
* Refactoring enabling faster implementation of future functionality
|
||||
* UI improvements
|
||||
* 🔼 Fixing core functionality bugs not solvable with workarounds
|
||||
* 🔵 New core functionality unlocking other opportunities (e.g.: plugins)
|
||||
* 🔵 Refactoring enabling faster implementation of future functionality
|
||||
* 🔽 (low) UI functionality & improvements (PRs welcome 😉)
|
||||
|
||||
Design philosophy: Focus on core functionality and leverage existing apps and tools to make PiAlert integratable into other workflows.
|
||||
Design philosophy: Focus on core functionality and leverage existing apps and tools to make PiAlert integrate into other workflows.
|
||||
|
||||
Examples:
|
||||
|
||||
1. Supporting apprise makes more sense than implementing multiple individual notification gateways
|
||||
2. Implementing regular expressions support across settings for validation makes more sense than validating one setting with a specific expression.
|
||||
2. Implementing regular expression support across settings for validation makes more sense than validating one setting with a specific expression.
|
||||
|
||||
UI specific requests are low priority as the framework picked by the original developer is not very extensible (and afaik doesn't support components) and has limited mobile support. Also I argue the value proposition is smaller than working on something else.
|
||||
UI-specific requests are a low priority as the framework picked by the original developer is not very extensible (and afaik doesn't support components) and has limited mobile support. Also, I argue the value proposition is smaller than working on something else.
|
||||
|
||||
Feel free to submit PRs if interested. try to **keep the PRs small/on topic** so they are easier to review and approve.
|
||||
Feel free to submit PRs if interested. try to **keep the PRs small/on-topic** so they are easier to review and approve.
|
||||
|
||||
That being said, I'd reconsider if more people and or recurring sponsors file a request 😉.
|
||||
|
||||
## 🙏 Feature requests
|
||||
|
||||
Please be as detailed as possible with **workarounds** you considered and why a native feature is the better way. This gives me better context and will make it more likely to be implemented. Ideally a feature request should be in the format "I want to be able to do XYZ so that ZYX. I considered these approaches XYZ".
|
||||
Please be as detailed as possible with **workarounds** you considered and why a native feature is the better way. This gives me better context and will make it more likely to be implemented. Ideally, a feature request should be in the format "I want to be able to do XYZ so that ZYX. I considered these approaches XYZ".
|
||||
|
||||
## ➕ Pull-requests (PRs)
|
||||
## ➕ Pull requests (PRs)
|
||||
|
||||
If you submit a PR please:
|
||||
|
||||
@@ -76,10 +91,20 @@ If you submit a PR please:
|
||||
4. New features code should ideally be re-usable for different purposes, not be for a very narrow use-case.
|
||||
5. New functionality should ideally be implemented via the Plugins system, if possible.
|
||||
|
||||
Soem additional context:
|
||||
Suggested test cases:
|
||||
|
||||
- Blank setup with no DB or config
|
||||
- Existing DB / config
|
||||
- Sending a notification (e. g. Delete a device and wait for a scan to run) and testing all notification gateways, especially:
|
||||
- Email, Apprise (e.g. via Telegram), webhook (e.g. via Discord), MQTT (e.g. via HomeAssitant)
|
||||
- Saving settings
|
||||
- Test a couple of plugins
|
||||
- Check the Error log for anything unusual
|
||||
|
||||
Some additional context:
|
||||
|
||||
* Permanent settings/config is stored in the `pialert.conf` file
|
||||
* Currently temporary (session?) settings are stored in the `Parameters` DB table as key - value pairs. This table is wiped during a container rebuild/restart and it's values re-initialized from cookies / session data from the browser.
|
||||
* Currently temporary (session?) settings are stored in the `Parameters` DB table as key-value pairs. This table is wiped during a container rebuild/restart and its values are re-initialized from cookies/session data from the browser.
|
||||
|
||||
## 🐛 Submitting an issue or bug
|
||||
|
||||
@@ -87,5 +112,6 @@ Before submitting a new issue please spend a couple of minutes on research:
|
||||
|
||||
* Check [🛑 Common issues](https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-common-issues)
|
||||
* Check [💡 Closed issues](https://github.com/jokob-sk/Pi.Alert/issues?q=is%3Aissue+is%3Aclosed) if a similar issue was solved in the past.
|
||||
* When submitting an issue ❗[enable debug](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/DEBUG_TIPS.md)❗
|
||||
|
||||
⚠ Please follow the pre-defined issue template to resolve your issue faster.
|
||||
|
||||
479
docs/REVERSE_PROXY.md
Executable file
@@ -0,0 +1,479 @@
|
||||
# Reverse Proxy Configuration
|
||||
|
||||
> Submitted by amazing [cvc90](https://github.com/cvc90) 🙏
|
||||
|
||||
## NGINX HTTP Configuration (Direct Path)
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 80;
|
||||
server_name pi.alert;
|
||||
proxy_preserve_host on;
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at http://pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## NGINX HTTP Configuration (Sub Path)
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 80;
|
||||
server_name pi.alert;
|
||||
proxy_preserve_host on;
|
||||
location ^~ /pi.alert/ {
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
proxy_redirect ~^/(.*)$ /pi.alert/$1;
|
||||
rewrite ^/pi.alert/?(.*)$ /$1 break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at http://pi.alert/pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## NGINX HTTP Configuration (Sub Path) with module ngx_http_sub_module
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 80;
|
||||
server_name pi.alert;
|
||||
proxy_preserve_host on;
|
||||
location ^~ /pi.alert/ {
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
proxy_redirect ~^/(.*)$ /pi.alert/$1;
|
||||
rewrite ^/pi.alert/?(.*)$ /$1 break;
|
||||
sub_filter_once off;
|
||||
sub_filter_types *;
|
||||
sub_filter 'href="/' 'href="/pi.alert/';
|
||||
sub_filter '(?>$host)/css' '/pi.alert/css';
|
||||
sub_filter '(?>$host)/js' '/pi.alert/js';
|
||||
sub_filter '/img' '/pi.alert/img';
|
||||
sub_filter '/lib' '/pi.alert/lib';
|
||||
sub_filter '/php' '/pi.alert/php';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at http://pi.alert/pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
**NGINX HTTPS Configuration (Direct Path)**
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 443;
|
||||
server_name pi.alert;
|
||||
SSLEngine On;
|
||||
SSLCertificateFile /etc/ssl/certs/pi.alert.pem;
|
||||
SSLCertificateKeyFile /etc/ssl/private/pi.alert.key;
|
||||
proxy_preserve_host on;
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at https://pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
**NGINX HTTPS Configuration (Sub Path)**
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 443;
|
||||
server_name pi.alert;
|
||||
SSLEngine On;
|
||||
SSLCertificateFile /etc/ssl/certs/pi.alert.pem;
|
||||
SSLCertificateKeyFile /etc/ssl/private/pi.alert.key;
|
||||
location ^~ /pi.alert/ {
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
proxy_redirect ~^/(.*)$ /pi.alert/$1;
|
||||
rewrite ^/pi.alert/?(.*)$ /$1 break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at https://pi.alert/pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## NGINX HTTPS Configuration (Sub Path) with module ngx_http_sub_module
|
||||
|
||||
1. On your NGINX server, create a new file called /etc/nginx/sites-available/pialert
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 443;
|
||||
server_name pi.alert;
|
||||
SSLEngine On;
|
||||
SSLCertificateFile /etc/ssl/certs/pi.alert.pem;
|
||||
SSLCertificateKeyFile /etc/ssl/private/pi.alert.key;
|
||||
location ^~ /pi.alert/ {
|
||||
proxy_pass http://localhost:20211/;
|
||||
proxy_pass_reverse http://localhost:20211/;
|
||||
proxy_redirect ~^/(.*)$ /pi.alert/$1;
|
||||
rewrite ^/pi.alert/?(.*)$ /$1 break;
|
||||
sub_filter_once off;
|
||||
sub_filter_types *;
|
||||
sub_filter 'href="/' 'href="/pi.alert/';
|
||||
sub_filter '(?>$host)/css' '/pi.alert/css';
|
||||
sub_filter '(?>$host)/js' '/pi.alert/js';
|
||||
sub_filter '/img' '/pi.alert/img';
|
||||
sub_filter '/lib' '/pi.alert/lib';
|
||||
sub_filter '/php' '/pi.alert/php';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`nginx -s reload` or `systemctl restart nginx`
|
||||
|
||||
4. Once NGINX restarts, you should be able to access the proxy website at https://pi.alert/pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## Apache HTTP Configuration (Direct Path)
|
||||
|
||||
1. On your Apache server, create a new file called /etc/apache2/sites-available/pialert.conf.
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
<VirtualHost *:80>
|
||||
ServerName pi.alert
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://localhost:20211/
|
||||
ProxyPassReverse / http://localhost:20211/
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`a2ensite pialert` or `service apache2 reload`
|
||||
|
||||
4. Once Apache restarts, you should be able to access the proxy website at http://pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## Apache HTTP Configuration (Sub Path)
|
||||
|
||||
1. On your Apache server, create a new file called /etc/apache2/sites-available/pialert.conf.
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
<VirtualHost *:80>
|
||||
ServerName pi.alert
|
||||
location ^~ /pi.alert/ {
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://localhost:20211/
|
||||
ProxyPassReverse / http://localhost:20211/
|
||||
}
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`a2ensite pialert` or `service apache2 reload`
|
||||
|
||||
4. Once Apache restarts, you should be able to access the proxy website at http://pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## Apache HTTPS Configuration (Direct Path)
|
||||
|
||||
1. On your Apache server, create a new file called /etc/apache2/sites-available/pialert.conf.
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
<VirtualHost *:443>
|
||||
ServerName pi.alert
|
||||
SSLEngine On
|
||||
SSLCertificateFile /etc/ssl/certs/pi.alert.pem
|
||||
SSLCertificateKeyFile /etc/ssl/private/pi.alert.key
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://localhost:20211/
|
||||
ProxyPassReverse / http://localhost:20211/
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`a2ensite pialert` or `service apache2 reload`
|
||||
|
||||
4. Once Apache restarts, you should be able to access the proxy website at https://pi.alert/
|
||||
|
||||
<br>
|
||||
|
||||
## Apache HTTPS Configuration (Sub Path)
|
||||
|
||||
1. On your Apache server, create a new file called /etc/apache2/sites-available/pialert.conf.
|
||||
|
||||
2. In this file, paste the following code:
|
||||
|
||||
```
|
||||
<VirtualHost *:443>
|
||||
ServerName pi.alert
|
||||
SSLEngine On
|
||||
SSLCertificateFile /etc/ssl/certs/pi.alert.pem
|
||||
SSLCertificateKeyFile /etc/ssl/private/pi.alert.key
|
||||
location ^~ /pi.alert/ {
|
||||
ProxyPreserveHost On
|
||||
ProxyPass / http://localhost:20211/
|
||||
ProxyPassReverse / http://localhost:20211/
|
||||
}
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
3. Activate the new website by running the following command:
|
||||
|
||||
`a2ensite pialert` or `service apache2 reload`
|
||||
|
||||
4. Once Apache restarts, you should be able to access the proxy website at https://pi.alert/pi.alert/
|
||||
|
||||
## Reverse proxy example by using LinuxServer's SWAG container.
|
||||
|
||||
> Submitted by [s33d1ing](https://github.com/s33d1ing). 🙏
|
||||
|
||||
## [linuxserver/swag](https://github.com/linuxserver/docker-swag)
|
||||
|
||||
In the SWAG container create `/config/nginx/proxy-confs/pialert.subfolder.conf` with the following contents:
|
||||
|
||||
``` nginx
|
||||
## Version 2023/02/05
|
||||
# make sure that your pialert container is named pialert
|
||||
# pialert does not require a base url setting
|
||||
|
||||
# Since Pi.Alert uses a Host network, you may need to use the IP address of the system running Pi.Alert for $upstream_app.
|
||||
|
||||
location /pialert {
|
||||
return 301 $scheme://$host/pialert/;
|
||||
}
|
||||
|
||||
location ^~ /pialert/ {
|
||||
# enable the next two lines for http auth
|
||||
#auth_basic "Restricted";
|
||||
#auth_basic_user_file /config/nginx/.htpasswd;
|
||||
|
||||
# enable for ldap auth (requires ldap-server.conf in the server block)
|
||||
#include /config/nginx/ldap-location.conf;
|
||||
|
||||
# enable for Authelia (requires authelia-server.conf in the server block)
|
||||
#include /config/nginx/authelia-location.conf;
|
||||
|
||||
# enable for Authentik (requires authentik-server.conf in the server block)
|
||||
#include /config/nginx/authentik-location.conf;
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
|
||||
set $upstream_app pialert;
|
||||
set $upstream_port 20211;
|
||||
set $upstream_proto http;
|
||||
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
proxy_set_header Accept-Encoding "";
|
||||
|
||||
proxy_redirect ~^/(.*)$ /pialert/$1;
|
||||
rewrite ^/pialert/?(.*)$ /$1 break;
|
||||
|
||||
sub_filter_once off;
|
||||
sub_filter_types *;
|
||||
|
||||
sub_filter 'href="/' 'href="/pialert/';
|
||||
|
||||
sub_filter '(?>$host)/css' '/pialert/css';
|
||||
sub_filter '(?>$host)/js' '/pialert/js';
|
||||
|
||||
sub_filter '/img' '/pialert/img';
|
||||
sub_filter '/lib' '/pialert/lib';
|
||||
sub_filter '/php' '/pialert/php';
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Traefik
|
||||
|
||||
> Submitted by [Isegrimm](https://github.com/Isegrimm) 🙏 (based on this [discussion](https://github.com/jokob-sk/Pi.Alert/discussions/449#discussioncomment-7281442))
|
||||
|
||||
Asuming the user already has a working Traefik setup, this is what's needed to make Pi.Alert work at a URL like www.domain.com/pialert/.
|
||||
|
||||
Note: Everything in these configs assumes '**www.domain.com**' as your domainname and '**section31**' as an arbitrary name for your certificate setup. You will have to substitute these with your own.
|
||||
|
||||
Also, I use the prefix '**pialert**'. If you want to use another prefix, change it in these files: dynamic.toml and default.
|
||||
|
||||
Content of my yaml-file (this is the generic Traefik config, which defines which ports to listen on, redirect http to https and sets up the certificate process).
|
||||
It also contains Authelia, which I use for authentication.
|
||||
This part contains nothing specific to Pi.Alert.
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik
|
||||
container_name: traefik
|
||||
command:
|
||||
- "--api=true"
|
||||
- "--api.insecure=true"
|
||||
- "--api.dashboard=true"
|
||||
- "--entrypoints.web.address=:80"
|
||||
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
|
||||
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
|
||||
- "--entrypoints.websecure.address=:443"
|
||||
- "--providers.file.filename=/traefik-config/dynamic.toml"
|
||||
- "--providers.file.watch=true"
|
||||
- "--log.level=ERROR"
|
||||
- "--certificatesresolvers.section31.acme.email=postmaster@domain.com"
|
||||
- "--certificatesresolvers.section31.acme.storage=/traefik-config/acme.json"
|
||||
- "--certificatesresolvers.section31.acme.httpchallenge=true"
|
||||
- "--certificatesresolvers.section31.acme.httpchallenge.entrypoint=web"
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||
- /appl/docker/traefik/config:/traefik-config
|
||||
depends_on:
|
||||
- authelia
|
||||
restart: unless-stopped
|
||||
authelia:
|
||||
container_name: authelia
|
||||
image: authelia/authelia:latest
|
||||
ports:
|
||||
- "9091:9091"
|
||||
volumes:
|
||||
- /appl/docker/authelia:/config
|
||||
restart: u
|
||||
nless-stopped
|
||||
```
|
||||
Snippet of the dynamic.toml file (referenced in the yml-file above) that defines the config for Pi.Alert:
|
||||
The following are self-defined keywords, everything else is traefik keywords:
|
||||
- pialert-router
|
||||
- pialert-service
|
||||
- auth
|
||||
- pialert-stripprefix
|
||||
|
||||
|
||||
```toml
|
||||
[http.routers]
|
||||
[http.routers.pialert-router]
|
||||
entryPoints = ["websecure"]
|
||||
rule = "Host(`www.domain.com`) && PathPrefix(`/pialert`)"
|
||||
service = "pialert-service"
|
||||
middlewares = "auth,pialert-stripprefix"
|
||||
[http.routers.pialert-router.tls]
|
||||
certResolver = "section31"
|
||||
[[http.routers.pialert-router.tls.domains]]
|
||||
main = "www.domain.com"
|
||||
|
||||
[http.services]
|
||||
[http.services.pialert-service]
|
||||
[[http.services.pialert-service.loadBalancer.servers]]
|
||||
url = "http://internal-ip-address:20211/"
|
||||
|
||||
[http.middlewares]
|
||||
[http.middlewares.auth.forwardAuth]
|
||||
address = "http://authelia:9091/api/verify?rd=https://www.domain.com/authelia/"
|
||||
trustForwardHeader = true
|
||||
authResponseHeaders = ["Remote-User", "Remote-Groups", "Remote-Name", "Remote-Email"]
|
||||
[http.middlewares.pialert-stripprefix.stripprefix]
|
||||
prefixes = "/pialert"
|
||||
forceSlash = false
|
||||
|
||||
```
|
||||
To make Pi.Alert work with this setup I modified the default file at `/etc/nginx/sites-available/default` in the docker container by copying it to my local filesystem, adding the changes as specified by [cvc90](https://github.com/cvc90) and mounting the new file into the docker container, overwriting the original one. By mapping the file instead of changing the file in-place, the changes persist if an updated dockerimage is pulled. This is also a downside when the default file is updated, so I only use this as a temporary solution, until the dockerimage is updated with this change.
|
||||
|
||||
Default-file:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 80 default_server;
|
||||
root /var/www/html;
|
||||
index index.php;
|
||||
#rewrite /pialert/(.*) / permanent;
|
||||
add_header X-Forwarded-Prefix "/pialert" always;
|
||||
proxy_set_header X-Forwarded-Prefix "/pialert";
|
||||
|
||||
location ~* \.php$ {
|
||||
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
|
||||
fastcgi_connect_timeout 75;
|
||||
fastcgi_send_timeout 600;
|
||||
fastcgi_read_timeout 600;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Mapping the updated file (on the local filesystem at `/appl/docker/pialert/default`) into the docker container:
|
||||
|
||||
|
||||
```bash
|
||||
docker run -d --rm --network=host \
|
||||
--name=pi.alert \
|
||||
-v /appl/docker/pialert/config:/home/pi/pialert/config \
|
||||
-v /appl/docker/pialert/db:/home/pi/pialert/db \
|
||||
-v /appl/docker/pialert/default:/etc/nginx/sites-available/default \
|
||||
-e TZ=Europe/Amsterdam \
|
||||
-e PORT=20211 \
|
||||
jokobsk/pi.alert:latest
|
||||
|
||||
```
|
||||
|
||||
77
docs/SETTINGS_SYSTEM.md
Executable file
@@ -0,0 +1,77 @@
|
||||
## ⚙ Setting system
|
||||
|
||||
This is an explanation how settings are handled intended for anyone thinking about writing their own plugin or contributing to the project.
|
||||
|
||||
If you are a user of the app, settings should be described in the `Settings` section of the app. Open an issue if you'd like to clarify any of the settings.
|
||||
|
||||
### 🛢 Data storage
|
||||
|
||||
The source of truth for user-defined values is the `pialert.conf` file. Editing the file makes the App overwrite values in the `Settings` database table and in the `table_settings.json` file.
|
||||
|
||||
#### Settings database table
|
||||
|
||||
The `Settings` database table contains settings for App run purposes. The table is recreated every time the App restarts. The settings are loaded from the source-of-truth, that is the `pialert.conf` file. A high-level overview on the database structure can be found in the [database documentation](/docs/DATABASE.md).
|
||||
|
||||
#### table_settings.json
|
||||
|
||||
This is the [API endpoint](/docs/API.md) that reflects the state of the `Settings` database table. Settings can be accessed with the:
|
||||
|
||||
* `getSetting(key)` JavaScript method
|
||||
|
||||
The json file is also cached on the client-side local storage of the browser.
|
||||
|
||||
#### pialert.conf
|
||||
|
||||
> [!NOTE]
|
||||
> This is the source of truth for settings. User-defined values in this files always override default values specified in the Plugin definition.
|
||||
|
||||
The App generates two `pialert.conf` entries for every setting (Since version 23.8+). One entry is the setting value, the second is the `__metadata` associated with the setting. This `__metadata` entry contains the full setting definition in JSON format. This should helps the future extensibility of the Settings system.
|
||||
|
||||
#### Plugin settings
|
||||
|
||||
> [!NOTE]
|
||||
> This is the preferred way adding settings going forward. I'll be likely migrating all app settings into plugin-based settings.
|
||||
|
||||
Plugin settings are loaded dynamically from the `config.json` of individual plugins. If a setting isn't defined in the `pialert.conf` file, it is initialized via the `default_value` property of a setting from the `config.json` file. Check the [Plugins documentation](/front/plugins/README.md), section `⚙ Setting object structure` for details on the structure of the setting.
|
||||
|
||||
![Screen 1][screen1]
|
||||
|
||||
### Settings Process flow
|
||||
|
||||
The process flow is mostly managed by the [initialise.py](/pialert/initialise.py) file.
|
||||
|
||||
The script is responsible for reading user-defined values from a configuration file (`pialert.conf`), initializing settings, and importing them into a database. It also handles plugins and their configurations.
|
||||
|
||||
Here's a high-level description of the code:
|
||||
|
||||
1. Function Definitions:
|
||||
- `ccd`: This function is used to handle user-defined settings and configurations. It takes several parameters related to the setting's name, default value, input type, options, group, and more. It saves the settings and their metadata in different lists (`conf.mySettingsSQLsafe` and `conf.mySettings`).
|
||||
|
||||
- `importConfigs`: This function is the main entry point of the script. It imports user settings from a configuration file, processes them, and saves them to the database.
|
||||
|
||||
- `read_config_file`: This function reads the configuration file (`pialert.conf`) and returns a dictionary containing the key-value pairs from the file.
|
||||
|
||||
2. Importing Configuration and Initializing Settings:
|
||||
- The `importConfigs` function starts by checking the modification time of the configuration file to determine if it needs to be re-imported. If the file has not been modified since the last import, the function skips the import process.
|
||||
|
||||
- The function reads the configuration file using the `read_config_file` function, which returns a dictionary of settings.
|
||||
|
||||
- The script then initializes various user-defined settings using the `ccd` function, based on the values read from the configuration file. These settings are categorized into groups such as "General," "Email," "Webhooks," "Apprise," and more.
|
||||
|
||||
3. Plugin Handling:
|
||||
- The script loads and handles plugins dynamically. It retrieves plugin configurations and iterates through each plugin.
|
||||
- For each plugin, it extracts the prefix and settings related to that plugin and processes them similarly to other user-defined settings.
|
||||
- It also handles scheduling for plugins with specific `RUN_SCHD` settings.
|
||||
|
||||
4. Saving Settings to the Database:
|
||||
- The script clears the existing settings in the database and inserts the updated settings into the database using SQL queries.
|
||||
|
||||
5. Updating the API and Performing Cleanup:
|
||||
- After importing the configurations, the script updates the API to reflect the changes in the settings.
|
||||
- It saves the current timestamp to determine the next import time.
|
||||
- Finally, it logs the successful import of the new configuration.
|
||||
|
||||
|
||||
_____________________
|
||||
|
||||
[screen1]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_json_settings.png "Screen 1"
|
||||
41
docs/SMTP.md
Executable file
@@ -0,0 +1,41 @@
|
||||
# 📧 SMTP guides
|
||||
|
||||
## Using the GMX SMTP server
|
||||
|
||||
1. Go to your GMX account https://account.gmx.com
|
||||
2. Under Security Options enable 2FA (Two-factor authentication)
|
||||
3. Under Security Options generate an Application-specific password
|
||||
4. Home -> Email Settings -> POP3 & IMAP -> Enable access to this account via POP3 and IMAP
|
||||
5. In PiAlert specify these settings:
|
||||
|
||||
```python
|
||||
REPORT_MAIL=True
|
||||
SMTP_SERVER='mail.gmx.com'
|
||||
SMTP_PORT=465
|
||||
SMTP_USER='gmx_email@gmx.com'
|
||||
SMTP_PASS='<your Application-specific password>'
|
||||
SMTP_SKIP_TLS=True
|
||||
SMTP_FORCE_SSL=True
|
||||
SMTP_SKIP_LOGIN=False
|
||||
REPORT_FROM='gmx_email@gmx.com' # this has to be the same email as in SMTP_USER
|
||||
REPORT_TO='some_target_email@gmail.com'
|
||||
```
|
||||
|
||||
|
||||
## Using the Gmail SMTP server
|
||||
|
||||
1. Create an app password by following the instructions from Google, you need to Enable 2FA for this to work.
|
||||
[https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833)
|
||||
|
||||
2. Specify the following settings:
|
||||
|
||||
```python
|
||||
REPORT_MAIL=True
|
||||
SMTP_SKIP_TLS=True
|
||||
SMTP_FORCE_SSL=True
|
||||
SMTP_PORT=465
|
||||
SMTP_SERVER='smtp.gmail.com'
|
||||
SMTP_PASS='16-digit passcode from google'
|
||||
REPORT_TO='some_target_email@gmail.com'
|
||||
```
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
## Use the Gmail SMTP server
|
||||
|
||||
1) Create an app password by following the instructions from Google, you need to Enable 2FA for this to work.
|
||||
[https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833)
|
||||
|
||||
2) Specify the following settings:
|
||||
|
||||
```python
|
||||
SMTP_SKIP_TLS=True
|
||||
SMTP_FORCE_SSL=True
|
||||
SMTP_PORT=465
|
||||
SMTP_SERVER='smtp.gmail.com'
|
||||
SMTP_PASS='16-digit passcode from google'
|
||||
```
|
||||
|
||||
@@ -1,21 +1,96 @@
|
||||
## Subnets configuration
|
||||
# Subnets configuration for arp-scan
|
||||
|
||||
You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANS (see exceptions below).
|
||||
|
||||
## Examples
|
||||
|
||||
* Examples for one and two subnets (❗ Note the `['...', '...']` format):
|
||||
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
|
||||
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0', '192.168.1.0/24 --interface=eth1 -vlan=107']`
|
||||
|
||||
## Explanation
|
||||
|
||||
### Network mask
|
||||
|
||||
**Example value: `192.168.1.0/24`**
|
||||
|
||||
The arp-scan time itself depends on the number of IP addresses to check.
|
||||
The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set on the `SCAN_SUBNETS` setting.
|
||||
|
||||
For example, a `/24` mask results in 256 IPs to check, where as a `/16` mask checks around 65,536. Every IP takes a couple seconds. This means that with an incorrect configuration the arp-scan will take hours to complete instead of seconds.
|
||||
> The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set on the `SCAN_SUBNETS` setting.
|
||||
> For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536. Every IP takes a couple of seconds. This means that with an incorrect configuration, the arp-scan will take hours to complete instead of seconds.
|
||||
|
||||
Specify the network filter (which **significantly** speeds up the scan process). For example, the filter `192.168.1.0/24` covers IP ranges 192.168.1.0 to 192.168.1.255.
|
||||
|
||||
### Network interface (adapter)
|
||||
|
||||
**Example value: `--interface=eth0`**
|
||||
|
||||
The adapter will probably be `eth0` or `eth1`. (Check `System info` > `Network Hardware` or run `iwconfig` in the container to find your interface name(s))
|
||||
|
||||
> Run `iwconfig` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`).
|
||||
|
||||
### VLANs
|
||||
|
||||
**Example value: `-vlan=107`**
|
||||
|
||||
- Specify the network mask. For example, the filter `192.168.1.0/24` covers IP ranges 192.168.1.0 to 192.168.1.255
|
||||
- Run `iwconfig` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`).
|
||||
- Append e.g.: ` -vlan=107` to the interface field (e.g.: `eth0 -vlan=107`) for multiple vlans. More details in this [comment in this issue](https://github.com/jokob-sk/Pi.Alert/issues/170#issuecomment-1419902988)
|
||||
|
||||
### 🔍Example:
|
||||
|
||||
#### VLANs on a Hyper-V setup
|
||||
|
||||
> Community sourced content by [mscreations](https://github.com/mscreations) from this [discussion](https://github.com/jokob-sk/Pi.Alert/discussions/404).
|
||||
|
||||
> [!NOTE]
|
||||
> The setup this was tested on: Bare Metal -> Hyper-V on Win Server 2019 -> Ubuntu 22.04 VM -> Docker -> PiAlert.
|
||||
|
||||
**Approach 1 (may cause issues):**
|
||||
|
||||
Configure multiple network adapters in Hyper-V with distinct VLANs connected to each one using Hyper-V's network setup. However, this action can potentially lead to the Docker host's inability to handle network traffic correctly. The issue may stem from the creation of routes for network time servers or domain controllers on every interface, thereby preventing proper synchronization of the underlying Ubuntu VM. This interference can affect the performance of other applications such as Authentik.
|
||||
|
||||
**Approach 2 (working example)**
|
||||
|
||||
Network connections to switches are configured as trunk and allow all VLANs access to the server.
|
||||
|
||||
By default Hyper-V only allows untagged packets through to the VM interface and no VLAN tagged packets get through. In order to fix this follow these steps:
|
||||
|
||||
1) Run the following command in Powershell on the Hyper-V machine:
|
||||
|
||||
```shell
|
||||
Set-VMNetworkAdapterVlan -VMName <Docker VM Name> -Trunk -NativeVlanId 0 -AllowedVlanIdList "<comma separated list of vlans>"
|
||||
```
|
||||
|
||||
(There might be other ways how adjust this.)
|
||||
|
||||
2) Within the VM, set up sub-interfaces for each of the VLANs so they can be scanned. On Ubuntu 22.04 Netplan can be used.
|
||||
|
||||
In /etc/netplan/00-installer-config.yaml, add vlan definitions:
|
||||
|
||||
```
|
||||
network:
|
||||
ethernets:
|
||||
eth0:
|
||||
dhcp4: yes
|
||||
vlans:
|
||||
eth0.2:
|
||||
id: 2
|
||||
link: eth0
|
||||
addresses: [ "192.168.2.2/24" ]
|
||||
routes:
|
||||
- to: 192.168.2.0/24
|
||||
via: 192.168.1.1
|
||||
```
|
||||
|
||||
3) Run `sudo netplan apply` and the interfaces are then available to scan in PiAlert.
|
||||
4) In this case, use `192.168.2.0/24 --interface=eth0.2` in PiAlert
|
||||
|
||||
#### VLAN 🔍Example:
|
||||
|
||||

|
||||
|
||||
### Support for VLANS
|
||||
#### Support for VLANS (& exceptions)
|
||||
|
||||
Please note about the accessibility of the macvlans when they are configured on the same computer. My understanding this is a general networking behavior, but feel free to clarify via a PR/issue.
|
||||
Please note the accessibility of the macvlans when they are configured on the same computer. My understanding this is a general networking behavior, but feel free to clarify via a PR/issue.
|
||||
|
||||
- Pi.Alert does not detect the macvlan container when it is running on the same computer.
|
||||
- Pi.Alert recognizes the macvlan container when it is running on a different computer.
|
||||
|
||||
|
||||
@@ -77,4 +77,11 @@
|
||||
[Read more here](../LICENSE.txt)
|
||||
|
||||
### Contact
|
||||
pi.alert.application@gmail.com
|
||||
Always use the Issue tracker for the correct fork, for example:
|
||||
|
||||
[jokob-sk/Pi.Alert](https://github.com/jokob-sk/Pi.Alert/issues). Please also follow the guidelines on:
|
||||
|
||||
- ➕ [Pull Request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-pull-requests-prs)
|
||||
- 🙏 [Feature request guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-feature-requests)
|
||||
- 🐛 [Issue guidelines](https://github.com/jokob-sk/Pi.Alert/tree/main/docs#-submitting-an-issue-or-bug)
|
||||
|
||||
|
||||
38
docs/WEBHOOK_SECRET.md
Executable file
@@ -0,0 +1,38 @@
|
||||
# Webhook Secrets
|
||||
|
||||
## How does the signing work?
|
||||
|
||||
Pi.Alert will use the configured secret to create a hash signature of the request body. This SHA256-HMAC signature will appear in the `X-Webhook-Signature` header of each request to the webhook target URL. You can use the value of this header to validate the request was sent by Pi.Alert.
|
||||
|
||||
## Activating webhook signatures
|
||||
|
||||
All you need to do in order to add a signature to the request headers is to set the `WEBHOOK_SECRET` config value to a non-empty string.
|
||||
|
||||
## Validating webhook deliveries
|
||||
|
||||
There are a few things to keep in mind when validating the webhook delivery:
|
||||
|
||||
- Pi.Alert uses an HMAC hex digest to compute the hash
|
||||
- The signature in the `X-Webhook-Signature` header always starts with `sha256=`
|
||||
- The hash signature is generated using the configured `WEBHOOK_SECRET` and the request body.
|
||||
- Never use a plain `==` operator. Instead, consider using a method like [`secure_compare`](https://www.rubydoc.info/gems/rack/Rack%2FUtils:secure_compare) or [`crypto.timingSafeEqual`](https://nodejs.org/api/crypto.html#cryptotimingsafeequala-b), which performs a "constant time" string comparison to help mitigate certain timing attacks against regular equality operators, or regular loops in JIT-optimized languages.
|
||||
|
||||
## Testing the webhook payload validation
|
||||
|
||||
You can use the following secret and payload to verify that your implementation is working correctly.
|
||||
|
||||
`secret`: 'this is my secret'
|
||||
|
||||
`payload`: '{"test":"this is a test body"}'
|
||||
|
||||
If your implementation is correct, the signature you generated should match the following:
|
||||
|
||||
`signature`: bed21fcc34f98e94fd71c7edb75e51a544b4a3b38b069ebaaeb19bf4be8147e9
|
||||
|
||||
`X-Webhook-Signature`: sha256=bed21fcc34f98e94fd71c7edb75e51a544b4a3b38b069ebaaeb19bf4be8147e9
|
||||
|
||||
## More information
|
||||
|
||||
If you want to learn more about webhook security, take a look at [GitHub's webhook documentation](https://docs.github.com/en/webhooks/about-webhooks).
|
||||
|
||||
You can find examples for validating a webhook delivery [here](https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries#examples).
|
||||
BIN
docs/img/DATABASE/CurrentScan.png
Executable file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/img/DATABASE/DHCP_Leases.png
Executable file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
docs/img/DATABASE/Devices.png
Executable file
|
After Width: | Height: | Size: 85 KiB |
BIN
docs/img/DATABASE/Events.png
Executable file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/img/DATABASE/Nmap_Scan.png
Executable file
|
After Width: | Height: | Size: 44 KiB |
BIN
docs/img/DATABASE/Online_History.png
Executable file
|
After Width: | Height: | Size: 47 KiB |
BIN
docs/img/DATABASE/Parameters.png
Executable file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/img/DATABASE/Pholus_Scan.png
Executable file
|
After Width: | Height: | Size: 92 KiB |
BIN
docs/img/DATABASE/PiHole_Network.png
Executable file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
docs/img/DATABASE/Plugins_Events.png
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/img/DATABASE/Plugins_History.png
Executable file
|
After Width: | Height: | Size: 72 KiB |
BIN
docs/img/DATABASE/Plugins_Language_Strings.png
Executable file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/img/DATABASE/Plugins_Objects.png
Executable file
|
After Width: | Height: | Size: 65 KiB |
BIN
docs/img/DATABASE/ScanCycles.png
Executable file
|
After Width: | Height: | Size: 35 KiB |
BIN
docs/img/DATABASE/Sessions.png
Executable file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/img/DATABASE/Settings.png
Executable file
|
After Width: | Height: | Size: 52 KiB |
BIN
docs/img/DEVICES_BULK_EDITING/CSV_BACKUP_SETTINGS.png
Executable file
|
After Width: | Height: | Size: 131 KiB |
BIN
docs/img/DEVICES_BULK_EDITING/MAINTENANCE_CSV_EXPORT.png
Executable file
|
After Width: | Height: | Size: 163 KiB |
BIN
docs/img/DEVICES_BULK_EDITING/NOTEPAD++.png
Executable file
|
After Width: | Height: | Size: 55 KiB |
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-Presence-History.png
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Device-as-Sensors.png
Executable file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Devices-List.png
Executable file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/img/HOME_ASISSTANT/PiAlert-HomeAssistant-Overview-Card.png
Executable file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/img/ICONS/device_icons_preview.gif
Executable file
|
After Width: | Height: | Size: 112 KiB |
BIN
docs/img/plugins_device_details.png
Executable file
|
After Width: | Height: | Size: 202 KiB |
BIN
docs/img/plugins_rogue_dhcp.png
Executable file
|
After Width: | Height: | Size: 116 KiB |
@@ -173,6 +173,7 @@
|
||||
@media (max-width: 767px) {
|
||||
.main-header .logo {
|
||||
width: 100%;
|
||||
display:none;
|
||||
}
|
||||
|
||||
.main-header .navbar {
|
||||
@@ -459,35 +460,7 @@
|
||||
border-right: 5px solid #606060;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Spin
|
||||
----------------------------------------------------------------------------- */
|
||||
.pa_semitransparent-panel {
|
||||
position: absolute;
|
||||
width: 100%; /*calc (100% -40px);*/
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
|
||||
opacity: 0.8;
|
||||
background-color: #fff;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.pa_spinner {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 20px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: 15px;
|
||||
width: 200px;
|
||||
|
||||
background-color: #fff;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Notification float banner
|
||||
@@ -612,8 +585,24 @@ height: 50px;
|
||||
.infobox_label {
|
||||
font-size: 16px !important;
|
||||
}
|
||||
/* --------------------------------------------------------- */
|
||||
/* report */
|
||||
/* --------------------------------------------------------- */
|
||||
|
||||
/*settings*/
|
||||
#notificationData textarea{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#notificationData pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; }
|
||||
.string { color: green; }
|
||||
.number { color: darkorange; }
|
||||
.boolean { color: blue; }
|
||||
.null { color: magenta; }
|
||||
.key { color: red; }
|
||||
|
||||
/* --------------------------------------------------------- */
|
||||
/* settings */
|
||||
/* --------------------------------------------------------- */
|
||||
|
||||
@media (max-width: 767px) {
|
||||
/* hide on mobile */
|
||||
@@ -646,6 +635,57 @@ height: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
.settingswrap .metadata
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.settingswrap .enabled-disabled-icon
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
|
||||
.settings-group
|
||||
{
|
||||
font-size: 20px;
|
||||
padding-top: 7px;
|
||||
padding-bottom: 9px;
|
||||
}
|
||||
|
||||
.overview-section .small-box .icon
|
||||
{
|
||||
font-size: 38px;
|
||||
top:0px;
|
||||
}
|
||||
|
||||
.overview-section
|
||||
{
|
||||
border: solid;
|
||||
border-width: medium;
|
||||
border-width: medium;
|
||||
border-width: 1px;
|
||||
border-radius: 15px;
|
||||
margin-bottom: 3px;
|
||||
|
||||
}
|
||||
|
||||
.settings-group i{
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.overview-group
|
||||
{
|
||||
font-size: 20px;
|
||||
padding-top: 7px;
|
||||
padding-bottom: 9px;
|
||||
|
||||
}
|
||||
|
||||
.overview-group i{
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
|
||||
.table_row {
|
||||
padding: 3px;
|
||||
width:100%;
|
||||
@@ -693,6 +733,20 @@ height: 50px;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
/* Settings */
|
||||
|
||||
#settingsPage .overview-setting-value{
|
||||
display:unset;
|
||||
}
|
||||
#settingsPage .panel-title{
|
||||
/* display: inline-block; */
|
||||
/* width: 120px; */
|
||||
white-space: nowrap;
|
||||
overflow: hidden !important;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
|
||||
.settings_content {
|
||||
padding: 10px;
|
||||
/* background-color: #272c30; */
|
||||
@@ -715,8 +769,34 @@ height: 50px;
|
||||
width: auto
|
||||
}
|
||||
|
||||
.override{
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.override .override-text
|
||||
{
|
||||
float:left;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.override .override-check
|
||||
{
|
||||
float:left;
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
input[readonly] {
|
||||
/* Apply styles to the readonly input */
|
||||
background-color: #646566 !important;
|
||||
color: #000;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
/* Devices */
|
||||
#txtIconFA {
|
||||
min-width: 18px;
|
||||
}
|
||||
|
||||
.drp-edit
|
||||
{
|
||||
cursor: pointer;
|
||||
@@ -735,6 +815,15 @@ height: 50px;
|
||||
{
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.drag
|
||||
{
|
||||
cursor: move; /* fallback if grab cursor is unsupported */
|
||||
cursor: grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: -webkit-grab;
|
||||
}
|
||||
|
||||
.db_info_table_row .select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||
{
|
||||
background-color:#258744;
|
||||
@@ -761,38 +850,60 @@ height: 50px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
/* NETWORK page */
|
||||
|
||||
/* AdminLTE overrides */
|
||||
#networkTree .box
|
||||
{
|
||||
padding:2px;
|
||||
margin:2px;
|
||||
border-top:1px;
|
||||
border-top-color:grey;
|
||||
padding:0px;
|
||||
padding-top:6px;
|
||||
margin:0px;
|
||||
align-items:center;
|
||||
border-radius:20px;
|
||||
width:180px;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
justify-content:center;
|
||||
}
|
||||
#networkTree .netNodeText
|
||||
{
|
||||
top: 2px;
|
||||
margin: 2px;
|
||||
{
|
||||
position: absolute;
|
||||
}
|
||||
#networkTree .netPort
|
||||
{
|
||||
float:left;
|
||||
display:inline;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#networkTree .portBckgIcon
|
||||
{
|
||||
opacity: 0.3;
|
||||
display: initial;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#networkTree
|
||||
{
|
||||
margin-left: 16px;
|
||||
/* border: solid;
|
||||
border-color:#606060; */
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
position: relative;
|
||||
}
|
||||
#networkTree .netIcon
|
||||
{
|
||||
width: 25px;;
|
||||
float:left;
|
||||
display:inline;
|
||||
display:inline;
|
||||
text-align: center;
|
||||
}
|
||||
#networkTree .netCollapse
|
||||
{
|
||||
display: block;
|
||||
position: absolute;
|
||||
margin-left: 156px;
|
||||
top: -3px;
|
||||
margin-left: 170px;
|
||||
font-size: large;
|
||||
left: -15px;
|
||||
}
|
||||
@@ -814,28 +925,128 @@ height: 50px;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.plugin-content
|
||||
{
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
.plugin-content #tabs-content-location
|
||||
{
|
||||
margin-top: 20px;
|
||||
margin-left: 7px;
|
||||
.plugin-filters
|
||||
{
|
||||
margin: 7px;
|
||||
margin-right: 7px;
|
||||
margin-bottom: 9px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.plugin-content
|
||||
{
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
.plugin-content .left-nav{
|
||||
width: 100%;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.plugin-content #tabs-content-location
|
||||
{
|
||||
margin: 0px;
|
||||
|
||||
}
|
||||
|
||||
.plugins-description
|
||||
{
|
||||
padding-top: 20px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.login-page .login-custom
|
||||
{
|
||||
width:480px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*Hidden special button*/
|
||||
|
||||
@media (max-width: 365px) {
|
||||
#back-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 335px) {
|
||||
#next-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 300px) {
|
||||
#reload-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 300px) {
|
||||
#fullscreen-button {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 500px) {
|
||||
.header-server-time {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
#settingsPage .small-box .inner .card-title {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Spin
|
||||
----------------------------------------------------------------------------- */
|
||||
.pa_semitransparent-panel {
|
||||
position: absolute;
|
||||
width: 100%; /*calc (100% -40px);*/
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
|
||||
opacity: 0.8;
|
||||
background-color: #fff;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.pa_spinner {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 100px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: 15px;
|
||||
width: 200px;
|
||||
background-color: #fff;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
#loadingSpinner
|
||||
{
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Donations
|
||||
----------------------------------------------------------------------------- */
|
||||
.donations .box
|
||||
{
|
||||
padding:15px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.donations .box-header
|
||||
{
|
||||
color:15px;
|
||||
}
|
||||
.donations h3
|
||||
{
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# deviceDetails.php - Front module. Device management page
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# deviceDetails.php - Front module. Device management page #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<?php
|
||||
require 'php/templates/header.php';
|
||||
@@ -94,19 +99,14 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-sm-12 col-xs-12">
|
||||
<!-- <div class="box-transparent"> -->
|
||||
|
||||
|
||||
<div id="navDevice" class="nav-tabs-custom">
|
||||
<ul class="nav nav-tabs" style="fon t-size:16px;">
|
||||
<li> <a id="tabDetails" href="#panDetails" data-toggle="tab"> <?= lang('DevDetail_Tab_Details');?> </a></li>
|
||||
<?php
|
||||
if ($_REQUEST['mac'] == 'Internet') { $DevDetail_Tap_temp = "Tools"; } else { $DevDetail_Tap_temp = lang('DevDetail_Tab_Nmap');}
|
||||
?>
|
||||
<li> <a id="tabNmap" href="#panNmap" data-toggle="tab"> <?php echo $DevDetail_Tap_temp;?> </a></li>
|
||||
<li> <a id="tabTools" href="#panTools" data-toggle="tab"> <?= lang('DevDetail_Tab_Tools');?> </a></li>
|
||||
<li> <a id="tabSessions" href="#panSessions" data-toggle="tab"> <?= lang('DevDetail_Tab_Sessions');?> </a></li>
|
||||
<li> <a id="tabPresence" href="#panPresence" data-toggle="tab"> <?= lang('DevDetail_Tab_Presence');?> </a></li>
|
||||
<li> <a id="tabEvents" href="#panEvents" data-toggle="tab"> <?= lang('DevDetail_Tab_Events');?> </a></li>
|
||||
<li> <a id="tabPholus" href="#panPholus" data-toggle="tab"> <?= lang('DevDetail_Tab_Pholus');?> </a></li>
|
||||
<li> <a id="tabEvents" href="#panEvents" data-toggle="tab"> <?= lang('DevDetail_Tab_Events');?> </a></li>
|
||||
<li> <a id="tabPlugins" href="#panPlugins" data-toggle="tab"> <?= lang('DevDetail_Tab_Plugins');?> </a></li>
|
||||
|
||||
<div class="btn-group pull-right">
|
||||
<button type="button" class="btn btn-default" style="padding: 10px; min-width: 30px;"
|
||||
@@ -119,9 +119,7 @@
|
||||
id="btnNext" onclick="recordSwitch('next')"> <i class="fa fa-chevron-right"></i> </button>
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="tab-content" style="min-height: 430px;">
|
||||
|
||||
<!-- tab page 1 ------------------------------------------------------------ -->
|
||||
@@ -151,12 +149,12 @@
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="txtName" type="text" value="--">
|
||||
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtName');"></i></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Owner -->
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Owner_hover');?>">
|
||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Owner');?></label>
|
||||
<div class="col-sm-9">
|
||||
<div class="input-group">
|
||||
@@ -173,7 +171,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Type -->
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Type_hover');?>">
|
||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Type');?></label>
|
||||
<div class="col-sm-9">
|
||||
<div class="input-group">
|
||||
@@ -191,16 +189,16 @@
|
||||
</div>
|
||||
|
||||
<!-- Icon -->
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Icon_Descr');?>">
|
||||
<label class="col-sm-3 control-label">
|
||||
<?= lang('DevDetail_Icon');?>
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/ICONS.md" target="_blank"> <span><i class="fa fa-circle-question"></i></a><span>
|
||||
</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="input-group">
|
||||
<input class="form-control" title="<?= lang('DevDetail_Icon_Descr');?>" id="txtIcon" type="text" value="--">
|
||||
<span class="input-group-addon"><i class="fa" id="txtIconFA" onclick="editDrp('txtIcon');"></i></span>
|
||||
<input class="form-control" id="txtIcon" type="text" value="--">
|
||||
<span class="input-group-addon" title='<?= lang('DevDetail_button_OverwriteIcons_Tooltip');?>'><i class="fa fa-copy pointer" onclick="askOverwriteIconType();"></i></span>
|
||||
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtIcon');"></i></span>
|
||||
<div class="input-group-btn">
|
||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
<span class="fa fa-caret-down"></span>
|
||||
@@ -213,7 +211,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Vendor -->
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Vendor_hover');?>">
|
||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Vendor');?></label>
|
||||
<div class="col-sm-9">
|
||||
<input class="form-control" id="txtVendor" type="text" value="--">
|
||||
@@ -324,10 +322,10 @@
|
||||
|
||||
<!-- Network -->
|
||||
<h4 class="bottom-border-aqua"><?= lang('DevDetail_MainInfo_Network_Title');?><span class="networkPageHelp"> <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/NETWORK_TREE.md"><i class="fa fa-circle-question"></i></a><span></h4>
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Network_Node_hover');?>">
|
||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Network');?></label>
|
||||
<div class="col-sm-9">
|
||||
<div class="input-group">
|
||||
<div class="input-group parentNetworkNode">
|
||||
|
||||
<input class="form-control" id="txtNetworkNodeMac" type="text" value="--">
|
||||
<span class="input-group-addon"><i title="<?= lang('DevDetail_GoToNetworkNode');?>" class="fa fa-square-up-right pointer" onclick="goToNetworkNode('txtNetworkNodeMac');"></i></span>
|
||||
@@ -341,12 +339,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="form-group" title="<?= lang('DevDetail_Network_Port_hover');?>">
|
||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Network_Port');?></label>
|
||||
<div class="col-sm-9">
|
||||
<input class="form-control" id="txtNetworkPort" type="text" value="--">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -428,7 +428,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Randomized MAC -->
|
||||
<div class="form-group" >
|
||||
<div class="form-group" title="<?= lang('RandomMAC_hover');?>" >
|
||||
<label class="col-sm-5 control-label"><?= lang('DevDetail_EveandAl_RandomMAC');?>:</label>
|
||||
<div class="col-sm-7" style="padding-top:6px;">
|
||||
<span id="iconRandomMACinactive" data-toggle="tooltip" data-placement="right" title="Random MAC is Inactive">
|
||||
@@ -463,11 +463,35 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4 class="bottom-border-aqua"><?= lang('DevDetail_Copy_Device_Title');?></h4>
|
||||
<div class="box-body form-horizontal">
|
||||
<label class="col-sm-3 control-label">
|
||||
<?= lang('Navigation_Devices');?>
|
||||
</label>
|
||||
<div class="col-sm-9">
|
||||
<div class="input-group">
|
||||
<input class="form-control" title="<?= lang('DevDetail_Copy_Device_Tooltip');?>" id="txtFromDevice" type="text" value="--">
|
||||
<span class="input-group-addon" title='<?= lang('Gen_Copy');?>'><i class="fa fa-copy pointer" onclick="askCopyFromDevice();"></i></span>
|
||||
|
||||
<div class="input-group-btn">
|
||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
<span class="fa fa-caret-down"></span>
|
||||
</button>
|
||||
<ul id="dropdownDevices" class="dropdown-menu dropdown-menu-right">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Buttons -->
|
||||
<div class="col-xs-12">
|
||||
<div class="pull-right">
|
||||
@@ -503,126 +527,20 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- tab page "Tools" ------------------------------------------------------------ -->
|
||||
|
||||
<!-- tab page 5 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade" id="panTools">
|
||||
|
||||
|
||||
<div class="tab-pane fade" id="panNmap">
|
||||
|
||||
<?php
|
||||
if ($_REQUEST['mac'] == 'Internet') {
|
||||
?>
|
||||
<h4 class="">Online Speedtest</h4>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<button type="button" id="speedtestcli" class="btn btn-primary pa-btn" style="margin: auto;" onclick="speedtestcli()">Start Speedtest</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function speedtestcli() {
|
||||
$( "#scanoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "./php/server/speedtestcli.php",
|
||||
beforeSend: function() { $('#scanoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#scanoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
$("#scanoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<h4 class="">Nmap Scans</h4>
|
||||
<div style="width:100%; text-align: center;">
|
||||
<script>
|
||||
setTimeout(function(){
|
||||
document.getElementById('piamanualnmap_fast').innerHTML='<?= lang('DevDetail_Nmap_buttonFast');?> (' + document.getElementById('txtLastIP').value +')';
|
||||
document.getElementById('piamanualnmap_normal').innerHTML='<?= lang('DevDetail_Nmap_buttonDefault');?> (' + document.getElementById('txtLastIP').value +')';
|
||||
document.getElementById('piamanualnmap_detail').innerHTML='<?= lang('DevDetail_Nmap_buttonDetail');?> (' + document.getElementById('txtLastIP').value +')';
|
||||
document.getElementById('piamanualnmap_skipdiscovery').innerHTML='<?= lang('DevDetail_Nmap_buttonSkipDiscovery');?> (' + document.getElementById('txtLastIP').value +')';
|
||||
}, 2000);
|
||||
</script>
|
||||
|
||||
<button type="button" id="piamanualnmap_fast" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(document.getElementById('txtLastIP').value, 'fast')">Loading...</button>
|
||||
<button type="button" id="piamanualnmap_normal" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(document.getElementById('txtLastIP').value, 'normal')">Loading...</button>
|
||||
<button type="button" id="piamanualnmap_detail" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(document.getElementById('txtLastIP').value, 'detail')">Loading...</button>
|
||||
<button type="button" id="piamanualnmap_skipdiscovery" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(document.getElementById('txtLastIP').value, 'skipdiscovery')">Loading...</button>
|
||||
|
||||
<div style="text-align: left;">
|
||||
<ul style="padding:20px;">
|
||||
<li><?= lang('DevDetail_Nmap_buttonFast_text');?></li>
|
||||
<li><?= lang('DevDetail_Nmap_buttonDefault_text');?></li>
|
||||
<li><?= lang('DevDetail_Nmap_buttonDetail_text');?></li>
|
||||
<li><?= lang('DevDetail_Nmap_buttonSkipDiscovery_text');?></li>
|
||||
<li><a onclick="setCache('activeMaintenanceTab', 'tab_Logging_id')" href="/maintenance.php#tab_Logging"><?= lang('DevDetail_Nmap_resultsLink');?></a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="scanoutput" style="margin-top: 30px;"></div>
|
||||
|
||||
<script>
|
||||
function manualnmapscan(targetip, mode) {
|
||||
$( "#scanoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "./php/server/nmap_scan.php",
|
||||
data: { scan: targetip, mode: mode },
|
||||
beforeSend: function() { $('#scanoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#scanoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
console.log(data);
|
||||
$("#scanoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<h3><?= lang("DevDetail_Tab_NmapTableHeader");?></h3>
|
||||
|
||||
<div><?= lang("DevDetail_Tab_NmapTableText");?></div>
|
||||
|
||||
<table id="tableNmap" class="table table-bordered table-hover table-striped ">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Index</th>
|
||||
<th>Time</th>
|
||||
<th>Port</th>
|
||||
<th>State</th>
|
||||
<th>Service</th>
|
||||
<th>Extra (Notes)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- Comment out tbody when trying to implement better table with datatables here -->
|
||||
<!-- IDEA: Show unmatched pholus entries? -->
|
||||
<tbody id="tableNmapBody">
|
||||
<tr id="tableNmapPlc" class="text-center"><td colspan='7'><span><?= lang("DevDetail_Tab_NmapEmpty"); ?></span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
require 'deviceDetailsTools.php';
|
||||
?>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
|
||||
|
||||
<!-- tab page 3 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panPresence">
|
||||
|
||||
<!-- spinner -->
|
||||
<div id="loading" style="display: none">
|
||||
<div class="pa_semitransparent-panel"></div>
|
||||
<div class="panel panel-default pa_spinner">
|
||||
<table><td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade table-responsive" id="panPresence">
|
||||
|
||||
<!-- Calendar -->
|
||||
<div id="calendar">
|
||||
@@ -644,35 +562,24 @@
|
||||
<table id="tableEvents" class="table table-bordered table-hover table-striped ">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Event type</th>
|
||||
<th>IP</th>
|
||||
<th>Additional info</th>
|
||||
<th><?= lang("DevDetail_Tab_EventsTableDate");?></th>
|
||||
<th><?= lang("DevDetail_Tab_EventsTableEvent");?></th>
|
||||
<th><?= lang("DevDetail_Tab_EventsTableIP");?></th>
|
||||
<th><?= lang("DevDetail_Tab_EventsTableInfo");?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
<!-- tab page 6 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panPholus">
|
||||
<!-- Datatable Events -->
|
||||
<table id="tablePholus" class="table table-bordered table-hover table-striped ">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Index</th>
|
||||
<th>Info</th>
|
||||
<th>Time</th>
|
||||
<th>IP</th>
|
||||
<th>Entry Type</th>
|
||||
<th>Value</th>
|
||||
<th>Extra</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- Comment out tbody when trying to implement better table with datatables here -->
|
||||
<!-- IDEA: Show unmatched pholus entries? -->
|
||||
<tbody id="tablePholusBody">
|
||||
<tr id="tablePholusPlc" class="text-center"><td colspan='7'><span><?= lang("DevDetail_Tab_PholusEmpty"); ?></span></td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- tab page 7 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panPlugins">
|
||||
|
||||
|
||||
<?php
|
||||
// Include the other page
|
||||
include 'pluginsCore.php';
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -734,61 +641,27 @@ if ($ENABLED_DARKMODE === True) {
|
||||
return params.mac
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
function getDevicesListValue(idColumn, idValue, returnColumn)
|
||||
{
|
||||
// Read cache
|
||||
devicesListAll = JSON.parse(getCache('devicesListAll'));
|
||||
|
||||
if(emptyArr.includes(devicesListAll) || emptyArr.includes(idValue))
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
return devicesListAll.find((item) => {return item[idColumn] == idValue})[returnColumn]
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
function getDevicesList()
|
||||
{
|
||||
// Read cache
|
||||
devicesList = getCache('devicesList');
|
||||
// Read cache (skip cookie expiry check)
|
||||
devicesList = getCache('devicesListAll_JSON', true);
|
||||
|
||||
if (devicesList != '') {
|
||||
devicesList = JSON.parse (devicesList);
|
||||
} else {
|
||||
devicesList = [];
|
||||
}
|
||||
|
||||
return devicesList;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
mac = getMac() // can also be rowID!! not only mac
|
||||
var devicesList = []; // this will contain a list the database row IDs of the devices ordered by the position displayed in the UI
|
||||
var devicesListAll = []; // this will contain a list off all devices
|
||||
|
||||
|
||||
$.get('php/server/devices.php?action=getDevicesList&status=all&forceDefaultOrder', function(data) {
|
||||
|
||||
rawData = JSON.parse (data)
|
||||
|
||||
devicesListAll = rawData["data"].map(item => { return {
|
||||
"name":item[0],
|
||||
"type":item[2],
|
||||
"icon":item[3],
|
||||
"mac":item[11],
|
||||
"parentMac":item[14],
|
||||
"rowid":item[13],
|
||||
"status":item[10]
|
||||
}})
|
||||
|
||||
setCache('devicesListAll', JSON.stringify(devicesListAll))
|
||||
|
||||
// Read parameters & Initialize components
|
||||
main();
|
||||
});
|
||||
var devicesList = []; // this will contain a list the database row IDs of the devices ordered by the position displayed in the UI
|
||||
|
||||
main();
|
||||
|
||||
var pos = -1;
|
||||
var parPeriod = 'Front_Details_Period';
|
||||
@@ -807,13 +680,13 @@ if ($ENABLED_DARKMODE === True) {
|
||||
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function main () {
|
||||
// Initialize MAC
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.has ('mac') == true) {
|
||||
mac = urlParams.get ('mac');
|
||||
setCache("piaDeviceDetailsMac", mac); // set cookie
|
||||
} else {
|
||||
$('#pageTitle').html ('Device not found');
|
||||
}
|
||||
@@ -877,6 +750,11 @@ function main () {
|
||||
}
|
||||
});
|
||||
|
||||
// Show device icon as it changes
|
||||
$('#txtIcon').on('change input', function() {
|
||||
$('#txtIconFA').removeClass().addClass(`fa fa-${$(this).val()} pointer`)
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -949,6 +827,7 @@ function initializeCombos () {
|
||||
initializeCombo ( '#dropdownNetworkNodeMac', 'getNetworkNodes', 'txtNetworkNodeMac', false);
|
||||
initializeCombo ( '#dropdownIcon', 'getIcons', 'txtIcon', false);
|
||||
initializeCombo ( '#dropdownAction', 'getActions', 'txtAction', false);
|
||||
initializeCombo ( '#dropdownDevices', 'getDevices', 'txtFromDevice', false);
|
||||
|
||||
// Initialize static combos
|
||||
initializeComboSkipRepeated ();
|
||||
@@ -1084,7 +963,7 @@ function initializeDatatables () {
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle">Loading...</td>'+
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
@@ -1123,7 +1002,7 @@ function initializeDatatables () {
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle">Loading...</td>'+
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
@@ -1192,6 +1071,16 @@ function initializeCalendar () {
|
||||
duration : { month: 1 },
|
||||
buttonText : '<?= lang('Presence_CalHead_month');?>',
|
||||
columnHeaderFormat : 'D'
|
||||
},
|
||||
agendaWeek: {
|
||||
buttonText : '<?= lang('Presence_CalHead_week');?>',
|
||||
},
|
||||
agendaDay: {
|
||||
type : 'agenda',
|
||||
duration : { day: 1 },
|
||||
buttonText : '<?= lang('Presence_CalHead_day');?>',
|
||||
slotLabelFormat : 'H',
|
||||
slotDuration : '01:00:00'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1238,16 +1127,16 @@ function initializeCalendar () {
|
||||
},
|
||||
|
||||
eventRender: function (event, element) {
|
||||
$(element).tooltip({container: 'body', placement: 'right',
|
||||
$(element).tooltip({container: 'body', placement: 'bottom',
|
||||
title: event.tooltip});
|
||||
// element.attr ('title', event.tooltip); // Alternative tooltip
|
||||
},
|
||||
|
||||
loading: function( isLoading, view ) {
|
||||
if (isLoading) {
|
||||
$('#loading').show();
|
||||
showSpinner()
|
||||
} else {
|
||||
$('#loading').hide();
|
||||
hideSpinner()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1289,7 +1178,7 @@ function getDeviceData (readAllData=false) {
|
||||
$("body").css ("cursor", "progress");
|
||||
}
|
||||
|
||||
// get data from server
|
||||
// get data from server
|
||||
$.get('php/server/devices.php?action=getDeviceData&mac='+ mac + '&period='+ period, function(data) {
|
||||
|
||||
var deviceData = JSON.parse(data);
|
||||
@@ -1350,7 +1239,7 @@ function getDeviceData (readAllData=false) {
|
||||
|
||||
// Name
|
||||
if (deviceData['dev_Owner'] == null || deviceData['dev_Owner'] == '' ||
|
||||
(deviceData['dev_Name']).indexOf (deviceData['dev_Owner']) != -1 ) {
|
||||
(deviceData['dev_Name'].toString()).indexOf (deviceData['dev_Owner']) != -1 ) {
|
||||
$('#pageTitle').html (deviceData['dev_Name']);
|
||||
} else {
|
||||
$('#pageTitle').html (deviceData['dev_Name'] + ' ('+ deviceData['dev_Owner'] +')');
|
||||
@@ -1395,22 +1284,26 @@ function getDeviceData (readAllData=false) {
|
||||
history.pushState(null, '', newRelativePathQuery);
|
||||
getSessionsPresenceEvents();
|
||||
|
||||
devicesList = getDevicesList();
|
||||
devicesList = getDevicesList();
|
||||
|
||||
$('#txtMAC').val (deviceData['dev_MAC']);
|
||||
$('#txtName').val (deviceData['dev_Name']);
|
||||
$('#txtOwner').val (deviceData['dev_Owner']);
|
||||
$('#txtDeviceType').val (deviceData['dev_DeviceType']);
|
||||
$('#txtVendor').val (deviceData['dev_Vendor']);
|
||||
$('#txtIcon').val (initDefault(deviceData['dev_Icon'], 'laptop'));
|
||||
$('#txtIcon').val (initDefault(deviceData['dev_Icon'], 'laptop'));
|
||||
$('#txtIcon').trigger('change')
|
||||
|
||||
if (deviceData['dev_Favorite'] == 1) {$('#chkFavorite').iCheck('check');} else {$('#chkFavorite').iCheck('uncheck');}
|
||||
$('#txtGroup').val (deviceData['dev_Group']);
|
||||
$('#txtLocation').val (deviceData['dev_Location']);
|
||||
$('#txtComments').val (deviceData['dev_Comments']);
|
||||
$('#txtNetworkNodeMac').val (getDevicesListValue('mac', deviceData['dev_Network_Node_MAC_ADDR'] ,'name'));
|
||||
$('#txtNetworkNodeMac').val ( getDeviceDataByMacAddress(deviceData['dev_Network_Node_MAC_ADDR'], "dev_Name")) ;
|
||||
$('#txtNetworkNodeMac').attr ('data-mynodemac', deviceData['dev_Network_Node_MAC_ADDR']);
|
||||
$('#txtNetworkPort').val (deviceData['dev_Network_Node_port']);
|
||||
// disabling network node configuration if root Internet node
|
||||
toggleNetworkConfiguration(mac == 'Internet')
|
||||
|
||||
|
||||
$('#txtFirstConnection').val (deviceData['dev_FirstConnection']);
|
||||
$('#txtLastConnection').val (deviceData['dev_LastConnection']);
|
||||
@@ -1432,7 +1325,8 @@ function getDeviceData (readAllData=false) {
|
||||
}
|
||||
|
||||
// Check if device is part of the devicesList
|
||||
pos = devicesList.findIndex(item => item.rowid == deviceData['rowid']);
|
||||
pos = devicesList.findIndex(item => item.rowid == deviceData['rowid']);
|
||||
|
||||
if (pos == -1) {
|
||||
devicesList.push({"rowid" : deviceData['rowid'], "mac" : deviceData['dev_MAC'], "name": deviceData['dev_Name'], "type": deviceData['dev_DeviceType']});
|
||||
pos=0;
|
||||
@@ -1505,12 +1399,13 @@ function performSwitch(direction)
|
||||
|
||||
// get new mac from the devicesList. Don't change to the commented out line below, the mac query string in the URL isn't updated yet!
|
||||
// mac = params.mac;
|
||||
mac = devicesList[pos].mac.toString();
|
||||
|
||||
mac = devicesList[pos].dev_MAC.toString();
|
||||
|
||||
setCache("piaDeviceDetailsMac", mac);
|
||||
|
||||
getDeviceData (true);
|
||||
|
||||
// reload current tab
|
||||
reloadTab()
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -1564,6 +1459,9 @@ function setDeviceData (direction='', refreshCallback='') {
|
||||
window.onbeforeunload = null;
|
||||
somethingChanged = false;
|
||||
|
||||
// refresh API
|
||||
updateApi()
|
||||
|
||||
// Callback fuction
|
||||
if (typeof refreshCallback == 'function') {
|
||||
refreshCallback(direction);
|
||||
@@ -1571,6 +1469,25 @@ function setDeviceData (direction='', refreshCallback='') {
|
||||
});
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Calls a backend function to add a front-end event to an execution queue
|
||||
function updateApi()
|
||||
{
|
||||
|
||||
// value has to be in format event|param. e.g. run|ARPSCAN
|
||||
action = `update_api|devices`
|
||||
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "php/server/util.php",
|
||||
data: { function: "addToExecutionQueue", action: action },
|
||||
success: function(data, textStatus) {
|
||||
console.log(data)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function askSkipNotifications () {
|
||||
// Check MAC
|
||||
@@ -1623,6 +1540,29 @@ function deleteDeviceEvents () {
|
||||
$('#panDetails :input').attr('disabled', true);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function askCopyFromDevice() {
|
||||
// Ask
|
||||
showModalWarning('<?= lang('BackDevDetail_Copy_Title');?>', '<?= lang('BackDevDetail_Copy_Ask');?>',
|
||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Run');?>', 'copyFromDevice');
|
||||
}
|
||||
|
||||
function copyFromDevice() {
|
||||
|
||||
// Execute
|
||||
$.get('php/server/devices.php?action=copyFromDevice&'
|
||||
+ '&macTo=' + $('#txtMAC').val()
|
||||
+ '&macFrom=' + $('#txtFromDevice').val()
|
||||
, function(msg) {
|
||||
showMessage (msg);
|
||||
|
||||
setTimeout(function() {
|
||||
window.location.reload();
|
||||
}, 2000);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function askRunAction() {
|
||||
// Ask
|
||||
@@ -1714,36 +1654,10 @@ function deleteDevice () {
|
||||
|
||||
// Deactivate controls
|
||||
$('#panDetails :input').attr('disabled', true);
|
||||
|
||||
// refresh API
|
||||
updateApi()
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
function askDeleteDevice () {
|
||||
// Check MAC
|
||||
if (mac == '') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ask delete device
|
||||
showModalWarning ('Delete Device', 'Are you sure you want to delete this device?<br>(maybe you prefer to archive it)',
|
||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Delete');?>', 'deleteDevice');
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function deleteDevice () {
|
||||
// Check MAC
|
||||
if (mac == '') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete device
|
||||
$.get('php/server/devices.php?action=deleteDevice&mac='+ mac, function(msg) {
|
||||
showMessage (msg);
|
||||
});
|
||||
|
||||
// Deactivate controls
|
||||
$('#panDetails :input').attr('disabled', true);
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function getSessionsPresenceEvents () {
|
||||
@@ -1784,12 +1698,13 @@ function setTextValue (textElement, textValue) {
|
||||
if(textElement == "txtNetworkNodeMac")
|
||||
{
|
||||
$('#'+textElement).attr ('data-mynodemac', textValue);
|
||||
$('#'+textElement).val (getDevicesListValue('mac', textValue ,'name') );
|
||||
$('#'+textElement).val (getDeviceDataByMacAddress(textValue, "dev_Name"));
|
||||
} else
|
||||
{
|
||||
$('#'+textElement).attr ('data-myvalue', textValue);
|
||||
$('#'+textElement).val (textValue);
|
||||
}
|
||||
$('#'+textElement).trigger('change')
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -1813,102 +1728,14 @@ function initializeTabsNew () {
|
||||
// events on tab change
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||
var target = $(e.target).attr("href") // activated tab
|
||||
|
||||
// load tab data only when needed (tab change)
|
||||
if(target == "#panPholus")
|
||||
{
|
||||
loadPholus();
|
||||
}
|
||||
if(target == "#panNmap")
|
||||
{
|
||||
loadNmap();
|
||||
}
|
||||
|
||||
// if(target == "#panTools")
|
||||
// {
|
||||
// // loadTools();
|
||||
// }
|
||||
});
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function loadNmap()
|
||||
{
|
||||
$(".deviceSpecific").remove(); // remove any previous data listed in the table
|
||||
|
||||
$.get('php/server/devices.php?action=getNmap&mac='+ mac, function(data) {
|
||||
|
||||
data = sanitize(data);
|
||||
|
||||
if(data != "false" && $.trim(data) != [])
|
||||
{
|
||||
var listData = JSON.parse(data);
|
||||
var order = 1;
|
||||
|
||||
tableRows = "";
|
||||
|
||||
// for each item
|
||||
listData.forEach(function (item, index) {
|
||||
tableRows += '<tr class="deviceSpecific">\
|
||||
<td>'+item.Index+'</td>\
|
||||
<td>'+item.Time+'</td>\
|
||||
<td>\
|
||||
<a href="http://'+item.IP+':'+item.Port.split('/')[0]+'" target="_blank">'+item.Port+'</a>\
|
||||
<a href="https://'+item.IP+':'+item.Port.split('/')[0]+'" target="_blank">\
|
||||
<span style="padding-left:5px"><i class="fa fa-lock "></i></a></span>\
|
||||
</td>\
|
||||
<td>'+item.State+'</td>\
|
||||
<td>'+item.Service+'</td>\
|
||||
<td>\
|
||||
<div class="input-group">\
|
||||
<input class="form-control" id="port_'+item.Index+'" type="text" value="'+item.Extra+'">\
|
||||
<span class="input-group-addon"><i class="fa fa-save pointer" onclick="saveNmapPort('+item.Index+')"></i></span>\
|
||||
</div>\
|
||||
</td>\
|
||||
</tr>';
|
||||
});
|
||||
|
||||
$("#tableNmapBody").html($("#tableNmapBody").html()+tableRows);
|
||||
$("#tableNmapPlc").hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
// console.log("else")
|
||||
$("#tableNmapPlc").show();
|
||||
$(".deviceSpecific").remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function loadPholus()
|
||||
{
|
||||
$(".deviceSpecific").remove(); // remove any previous data listed in teh table
|
||||
|
||||
$.get('php/server/devices.php?action=getPholus&mac='+ mac, function(data) {
|
||||
|
||||
data = sanitize(data);
|
||||
|
||||
if(data != "false" && $.trim(data) != [])
|
||||
{
|
||||
var listData = JSON.parse(data);
|
||||
var order = 1;
|
||||
|
||||
tableRows = "";
|
||||
|
||||
// for each item
|
||||
listData.forEach(function (item, index) {
|
||||
tableRows += '<tr class="deviceSpecific"><td>'+item.Index+'</td><td>'+item.Info+'</td><td>'+item.Time+'</td><td>'+item.IP_v4_or_v6+'</td><td>'+item.Record_Type+'</td><td>'+item.Value+'</td><td>'+ item.Extra +'</td></tr>';
|
||||
});
|
||||
|
||||
$("#tablePholusBody").html($("#tablePholusBody").html()+tableRows);
|
||||
$("#tablePholusPlc").hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
// console.log("else")
|
||||
$("#tablePholusPlc").show();
|
||||
$(".deviceSpecific").remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
||||
@@ -1942,7 +1769,7 @@ function initTable(tableId, mac){
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle">Loading...</td>'+
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
@@ -1972,31 +1799,27 @@ window.onload = function async()
|
||||
{
|
||||
initializeTabsNew();
|
||||
|
||||
reloadTab();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
||||
function reloadTab()
|
||||
{
|
||||
// tab loaded without switching
|
||||
if(getCache("activeDevicesTab") == "tabPholus")
|
||||
{
|
||||
loadPholus();
|
||||
}
|
||||
|
||||
if(getCache("activeDevicesTab") == "tabNmap")
|
||||
{
|
||||
loadNmap();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
||||
function saveNmapPort(index)
|
||||
// Disables network configuration for the root node
|
||||
function toggleNetworkConfiguration(disable)
|
||||
{
|
||||
saveData('saveNmapPort', index, $('#port_'+index).val())
|
||||
}
|
||||
$('#txtNetworkNodeMac').prop('readonly', true ); // disable direct input as should only be selected via the dropdown
|
||||
|
||||
if(disable)
|
||||
{
|
||||
// $('#txtNetworkNodeMac').val(getString('Network_Root_Unconfigurable'));
|
||||
// $('#txtNetworkPort').val(getString('Network_Root_Unconfigurable'));
|
||||
$('#txtNetworkPort').prop('readonly', true );
|
||||
$('.parentNetworkNode .input-group-btn').hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#txtNetworkPort').prop('readonly', false );
|
||||
$('.parentNetworkNode .input-group-btn').show();
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
214
front/deviceDetailsTools.php
Executable file
@@ -0,0 +1,214 @@
|
||||
<script>
|
||||
deviceIP = getDeviceDataByMacAddress("<?php echo $_REQUEST["mac"]?>", "dev_LastIP")
|
||||
</script>
|
||||
|
||||
<?php if ($_REQUEST["mac"] == "Internet") { ?>
|
||||
|
||||
<h4 class=""><i class="fa-solid fa-globe"></i>
|
||||
<?= lang("DevDetail_Tab_Tools_Internet_Info_Title") ?>
|
||||
</h4>
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Internet_Info_Description") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<button type="button" id="internetinfo" class="btn btn-primary pa-btn" style="margin: auto;" onclick="internetinfo()">
|
||||
<?= lang("DevDetail_Tab_Tools_Internet_Info_Start") ?></button>
|
||||
<br>
|
||||
<div id="internetinfooutput" style="margin-top: 10px;"></div>
|
||||
</div>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($_REQUEST["mac"] == "Internet") { ?>
|
||||
<h4 class=""><i class="fa-solid fa-gauge-high"></i>
|
||||
<?= lang("DevDetail_Tab_Tools_Speedtest_Title") ?>
|
||||
</h4>
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Speedtest_Description") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<button type="button" id="speedtestcli" class="btn btn-primary pa-btn" style="margin: auto;" onclick="speedtestcli()">
|
||||
<?= lang("DevDetail_Tab_Tools_Speedtest_Start") ?></button>
|
||||
<br>
|
||||
<div id="speedtestoutput" style="margin-top: 10px;"></div>
|
||||
</div>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($_REQUEST["mac"] != "Internet") { ?>
|
||||
<h4 class=""><i class="fa-solid fa-route"></i>
|
||||
<?= lang("DevDetail_Tab_Tools_Traceroute_Title") ?>
|
||||
</h4>
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Traceroute_Description") ?>
|
||||
</h5>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<button type="button" id="traceroute" class="btn btn-primary pa-btn" style="margin: auto;" onclick="traceroute()">
|
||||
<?= lang("DevDetail_Tab_Tools_Traceroute_Start") ?>
|
||||
</button>
|
||||
<br>
|
||||
<div id="tracerouteoutput" style="margin-top: 10px;"></div>
|
||||
</div>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($_REQUEST["mac"] != "Internet") { ?>
|
||||
<h4 class=""><i class="fa-solid fa-magnifying-glass"></i>
|
||||
<?= lang("DevDetail_Tab_Tools_Nslookup_Title") ?>
|
||||
</h4>
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Nslookup_Description") ?>
|
||||
</h5>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<button type="button" id="nslookup" class="btn btn-primary pa-btn" style="margin: auto;" onclick="nslookup()">
|
||||
<?= lang("DevDetail_Tab_Tools_Nslookup_Start") ?>
|
||||
</button>
|
||||
<br>
|
||||
<div id="nslookupoutput" style="margin-top: 10px;"></div>
|
||||
</div>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
<h4 class=""><i class="fa-solid fa-ethernet"></i>
|
||||
<?= lang("DevDetail_Nmap_Scans") ?>
|
||||
</h4>
|
||||
<div style="width:100%; text-align: center;">
|
||||
<div>
|
||||
<?= lang("DevDetail_Nmap_Scans_desc") ?>
|
||||
</div>
|
||||
|
||||
<button type="button" id="piamanualnmap_fast" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(deviceIP, 'fast')">
|
||||
<?= lang("DevDetail_Loading") ?>
|
||||
</button>
|
||||
<button type="button" id="piamanualnmap_normal" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(deviceIP, 'normal')">
|
||||
<?= lang("DevDetail_Loading") ?>
|
||||
</button>
|
||||
<button type="button" id="piamanualnmap_detail" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(deviceIP, 'detail')">
|
||||
<?= lang("DevDetail_Loading") ?>
|
||||
</button>
|
||||
<button type="button" id="piamanualnmap_skipdiscovery" class="btn btn-primary pa-btn" style="margin-bottom: 20px; margin-left: 10px; margin-right: 10px;" onclick="manualnmapscan(deviceIP, 'skipdiscovery')">
|
||||
<?= lang("DevDetail_Loading") ?>
|
||||
</button>
|
||||
|
||||
<div style="text-align: left;">
|
||||
<ul style="padding:20px;">
|
||||
<li>
|
||||
<?= lang("DevDetail_Nmap_buttonFast_text") ?>
|
||||
</li>
|
||||
<li>
|
||||
<?= lang("DevDetail_Nmap_buttonDefault_text") ?>
|
||||
</li>
|
||||
<li>
|
||||
<?= lang("DevDetail_Nmap_buttonDetail_text") ?>
|
||||
</li>
|
||||
<li>
|
||||
<?= lang("DevDetail_Nmap_buttonSkipDiscovery_text") ?>
|
||||
</li>
|
||||
<li>
|
||||
<a onclick="setCache('activeMaintenanceTab', 'tab_Logging_id')" href="/maintenance.php#tab_Logging">
|
||||
<?= lang("DevDetail_Nmap_resultsLink") ?>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="scanoutput" style="margin-top: 30px;"></div>
|
||||
|
||||
<script>
|
||||
// ----------------------------------------------------------------
|
||||
function manualnmapscan(targetip, mode) {
|
||||
$( "#scanoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "./php/server/nmap_scan.php",
|
||||
data: { scan: targetip, mode: mode },
|
||||
beforeSend: function() { $('#scanoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#scanoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
console.log(data);
|
||||
$("#scanoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
function speedtestcli() {
|
||||
$( "#speedtestoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "./php/server/speedtestcli.php",
|
||||
beforeSend: function() { $('#speedtestoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#speedtestoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
$("#speedtestoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
function traceroute() {
|
||||
|
||||
$( "#tracerouteoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "GET",
|
||||
url: "./php/server/traceroute.php?action=get&ip=" + deviceIP + "",
|
||||
beforeSend: function() { $('#tracerouteoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#tracerouteoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
$("#tracerouteoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
function nslookup() {
|
||||
|
||||
$( "#nslookupoutput" ).empty();
|
||||
$.ajax({
|
||||
method: "GET",
|
||||
url: "./php/server/nslookup.php?action=get&ip=" + deviceIP + "",
|
||||
beforeSend: function() { $('#nslookupoutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#nslookupoutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
$("#nslookupoutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
setTimeout(function(){
|
||||
document.getElementById('piamanualnmap_fast').innerHTML='<?= lang(
|
||||
"DevDetail_Nmap_buttonFast"
|
||||
) ?> (' + deviceIP +')';
|
||||
document.getElementById('piamanualnmap_normal').innerHTML='<?= lang(
|
||||
"DevDetail_Nmap_buttonDefault"
|
||||
) ?> (' + deviceIP +')';
|
||||
document.getElementById('piamanualnmap_detail').innerHTML='<?= lang(
|
||||
"DevDetail_Nmap_buttonDetail"
|
||||
) ?> (' + deviceIP +')';
|
||||
document.getElementById('piamanualnmap_skipdiscovery').innerHTML='<?= lang(
|
||||
"DevDetail_Nmap_buttonSkipDiscovery"
|
||||
) ?> (' + deviceIP +')';
|
||||
}, 2000);
|
||||
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
function internetinfo() {
|
||||
$( "#internetinfooutput" ).empty();
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "./php/server/internetinfo.php",
|
||||
beforeSend: function() { $('#internetinfooutput').addClass("ajax_scripts_loading"); },
|
||||
complete: function() { $('#internetinfooutput').removeClass("ajax_scripts_loading"); },
|
||||
success: function(data, textStatus) {
|
||||
$("#internetinfooutput").html(data);
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
@@ -1,11 +1,16 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# devices.php - Front module. Devices list page
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# devices.php - Front module. Devices list page #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<?php
|
||||
|
||||
@@ -26,7 +31,8 @@
|
||||
<!-- Content header--------------------------------------------------------- -->
|
||||
<section class="content-header">
|
||||
<h1 id="pageTitle">
|
||||
<?= lang('Device_Title');?>
|
||||
<i class="fa fa-laptop"></i>
|
||||
<?= lang('Device_Title');?>
|
||||
</h1>
|
||||
</section>
|
||||
|
||||
@@ -36,7 +42,7 @@
|
||||
<!-- top small box 1 ------------------------------------------------------- -->
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('all');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('all');">
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner"><h3 id="devicesAll"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_AllDevices');?></p>
|
||||
@@ -48,7 +54,7 @@
|
||||
|
||||
<!-- top small box 2 ------------------------------------------------------- -->
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('connected');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('connected');">
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner"><h3 id="devicesConnected"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_Connected');?></p>
|
||||
@@ -60,7 +66,7 @@
|
||||
|
||||
<!-- top small box 3 ------------------------------------------------------- -->
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('favorites');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('favorites');">
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner"><h3 id="devicesFavorites"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_Favorites');?></p>
|
||||
@@ -72,7 +78,7 @@
|
||||
|
||||
<!-- top small box 4 ------------------------------------------------------- -->
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('new');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('new');">
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner"><h3 id="devicesNew"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_NewDevices');?></p>
|
||||
@@ -84,7 +90,7 @@
|
||||
|
||||
<!-- top small box 5 ------------------------------------------------------- -->
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('down');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('down');">
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner"><h3 id="devicesDown"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_DownAlerts');?></p>
|
||||
@@ -96,7 +102,7 @@
|
||||
|
||||
<!-- top small box 6 ------------------------------------------------------- -->
|
||||
<div class="col-lg-2 col-sm-4 col-xs-6">
|
||||
<a href="#" onclick="javascript: getDevicesList('archived');">
|
||||
<a href="#" onclick="javascript: initializeDatatable('archived');">
|
||||
<div class="small-box bg-gray top_small_box_gray_text">
|
||||
<div class="inner"><h3 id="devicesArchived"> -- </h3>
|
||||
<p class="infobox_label"><?= lang('Device_Shortcut_Archived');?></p>
|
||||
@@ -192,9 +198,30 @@
|
||||
var tableRows = 10;
|
||||
var tableOrder = [[3,'desc'], [0,'asc']];
|
||||
|
||||
var columnsStr = '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]';
|
||||
var tableColumnOrder = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17] ;
|
||||
var tableColumnHide = [];
|
||||
var columnsStr = '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]';
|
||||
var tableColumnOrder = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];
|
||||
var tableColumnVisible = tableColumnOrder;
|
||||
//initialize the table headers in the correct order
|
||||
var headersDefaultOrder = [ getString('Device_TableHead_Name'),
|
||||
getString('Device_TableHead_Owner'),
|
||||
getString('Device_TableHead_Type'),
|
||||
getString('Device_TableHead_Icon'),
|
||||
getString('Device_TableHead_Favorite'),
|
||||
getString('Device_TableHead_Group'),
|
||||
getString('Device_TableHead_FirstSession'),
|
||||
getString('Device_TableHead_LastSession'),
|
||||
getString('Device_TableHead_LastIP'),
|
||||
getString('Device_TableHead_MAC'),
|
||||
getString('Device_TableHead_Status'),
|
||||
getString('Device_TableHead_MAC_full'),
|
||||
getString('Device_TableHead_LastIPOrder'),
|
||||
getString('Device_TableHead_Rowid'),
|
||||
getString('Device_TableHead_Parent_MAC'),
|
||||
getString('Device_TableHead_Connected_Devices'),
|
||||
getString('Device_TableHead_Location'),
|
||||
getString('Device_TableHead_Vendor')
|
||||
];
|
||||
|
||||
// Read parameters & Initialize components
|
||||
main();
|
||||
@@ -203,6 +230,8 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
function main () {
|
||||
|
||||
handleLoadingDialog()
|
||||
|
||||
// get from cookie if available (need to use decodeURI as saved as part of URI in PHP)
|
||||
cookieColumnsVisibleStr = decodeURI(getCookie("Front_Devices_Columns_Visible")).replaceAll('%2C',',')
|
||||
|
||||
@@ -225,29 +254,6 @@ function main () {
|
||||
// save the columns order in the Devices page
|
||||
tableColumnOrder = numberArrayFromString(data);
|
||||
|
||||
|
||||
|
||||
//initialize the table headers in the correct order
|
||||
var headersDefaultOrder = [ '<?= lang('Device_TableHead_Name');?>',
|
||||
'<?= lang('Device_TableHead_Owner');?>',
|
||||
'<?= lang('Device_TableHead_Type');?>',
|
||||
'<?= lang('Device_TableHead_Icon');?>',
|
||||
'<?= lang('Device_TableHead_Favorite');?>',
|
||||
'<?= lang('Device_TableHead_Group');?>',
|
||||
'<?= lang('Device_TableHead_FirstSession');?>',
|
||||
'<?= lang('Device_TableHead_LastSession');?>',
|
||||
'<?= lang('Device_TableHead_LastIP');?>',
|
||||
'<?= lang('Device_TableHead_MAC');?>',
|
||||
'<?= lang('Device_TableHead_Status');?>',
|
||||
'<?= lang('Device_TableHead_MAC_full');?>',
|
||||
'<?= lang('Device_TableHead_LastIPOrder');?>',
|
||||
'<?= lang('Device_TableHead_Rowid');?>',
|
||||
'<?= lang('Device_TableHead_Parent_MAC');?>',
|
||||
'<?= lang('Device_TableHead_Connected_Devices');?>',
|
||||
'<?= lang('Device_TableHead_Location');?>',
|
||||
'<?= lang('Device_TableHead_Vendor');?>'
|
||||
];
|
||||
|
||||
html = '';
|
||||
|
||||
for(index = 0; index < tableColumnOrder.length; index++)
|
||||
@@ -282,8 +288,12 @@ function main () {
|
||||
initializeDatatable();
|
||||
|
||||
// query data
|
||||
getDevicesTotals();
|
||||
getDevicesList (deviceStatus);
|
||||
getDevicesTotals();
|
||||
|
||||
// check if dat outdated and show spinner if so
|
||||
handleLoadingDialog()
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -291,8 +301,6 @@ function main () {
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
var tableColumnHide = [];
|
||||
|
||||
// mapping the default order to the user specified one
|
||||
function mapIndx(oldIndex)
|
||||
{
|
||||
@@ -306,8 +314,78 @@ function mapIndx(oldIndex)
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Define a function to filter data based on deviceStatus
|
||||
function filterDataByStatus(data, status) {
|
||||
return data.filter(function(item) {
|
||||
switch (status) {
|
||||
case 'all':
|
||||
return true; // Include all items for 'all' status
|
||||
case 'connected':
|
||||
return item.dev_PresentLastScan === 1;
|
||||
case 'favorites':
|
||||
return item.dev_Favorite === 1;
|
||||
case 'new':
|
||||
return item.dev_NewDevice === 1;
|
||||
case 'down':
|
||||
return item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown === 1;
|
||||
case 'archived':
|
||||
return item.dev_Archived === 1;
|
||||
default:
|
||||
return true; // Include all items for unknown statuses
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function getDeviceStatus(item)
|
||||
{
|
||||
if(item.dev_PresentLastScan === 1)
|
||||
{
|
||||
return 'On-line';
|
||||
}
|
||||
else if(item.dev_PresentLastScan === 0 && item.dev_AlertDeviceDown === 1)
|
||||
{
|
||||
return 'Down';
|
||||
}
|
||||
else if(item.dev_NewDevice === 1)
|
||||
{
|
||||
return 'New';
|
||||
}
|
||||
else if(item.dev_Archived === 1)
|
||||
{
|
||||
return 'Archived';
|
||||
}
|
||||
else if(item.dev_PresentLastScan === 0)
|
||||
{
|
||||
return 'Off-line';
|
||||
}
|
||||
|
||||
return "Unknown status"
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function initializeDatatable (status) {
|
||||
|
||||
// Save status selected
|
||||
deviceStatus = status;
|
||||
|
||||
// Define color & title for the status selected
|
||||
switch (deviceStatus) {
|
||||
case 'all': tableTitle = getString('Device_Shortcut_AllDevices'); color = 'aqua'; break;
|
||||
case 'connected': tableTitle = getString('Device_Shortcut_Connected'); color = 'green'; break;
|
||||
case 'favorites': tableTitle = getString('Device_Shortcut_Favorites'); color = 'yellow'; break;
|
||||
case 'new': tableTitle = getString('Device_Shortcut_NewDevices'); color = 'yellow'; break;
|
||||
case 'down': tableTitle = getString('Device_Shortcut_DownAlerts'); color = 'red'; break;
|
||||
case 'archived': tableTitle = getString('Device_Shortcut_Archived'); color = 'gray'; break;
|
||||
default: tableTitle = getString('Device_Shortcut_Devices'); color = 'gray'; break;
|
||||
}
|
||||
|
||||
// Set title and color
|
||||
$('#tableDevicesTitle')[0].className = 'box-title text-'+ color;
|
||||
$('#tableDevicesBox')[0].className = 'box box-'+ color;
|
||||
$('#tableDevicesTitle').html (tableTitle);
|
||||
|
||||
|
||||
function initializeDatatable () {
|
||||
for(i = 0; i < tableColumnOrder.length; i++)
|
||||
{
|
||||
// hide this column if not in the tableColumnVisible variable (we need to keep the MAC address (index 11) for functionality reasons)
|
||||
@@ -317,150 +395,202 @@ function initializeDatatable () {
|
||||
}
|
||||
}
|
||||
|
||||
// If the device has a small width (mobile) only show name, ip, and status columns.
|
||||
if (window.screen.width < 400) {
|
||||
tableColumnHide = [11,12,13,1,2,4,5,6,7,9];
|
||||
}
|
||||
// else {
|
||||
// // var tableColumnHide = [11, 12, 13];
|
||||
// tableColumnHide = [11, 12, 13];
|
||||
// };
|
||||
var table=
|
||||
$('#tableDevices').DataTable({
|
||||
'paging' : true,
|
||||
'lengthChange' : true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, '<?= lang('Device_Tablelenght_all');?>']],
|
||||
'searching' : true,
|
||||
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
|
||||
// Parameters
|
||||
'pageLength' : tableRows,
|
||||
'order' : tableOrder,
|
||||
// 'order' : [[3,'desc'], [0,'asc']],
|
||||
|
||||
'columnDefs' : [
|
||||
{visible: false, targets: tableColumnHide },
|
||||
{className: 'text-center', targets: [mapIndx(3), mapIndx(4), mapIndx(9), mapIndx(10), mapIndx(15)] },
|
||||
{width: '80px', targets: [mapIndx(6), mapIndx(7), mapIndx(15)] },
|
||||
{width: '30px', targets: [mapIndx(10), mapIndx(13)] },
|
||||
{orderData: [mapIndx(12)], targets: mapIndx(8) },
|
||||
|
||||
// Device Name
|
||||
{targets: [mapIndx(0)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html ('<b class="anonymizeDev"><a href="deviceDetails.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
|
||||
} },
|
||||
|
||||
// Connected Devices
|
||||
{targets: [mapIndx(15)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html ('<b><a href="./network.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
|
||||
} },
|
||||
|
||||
// Icon
|
||||
{targets: [mapIndx(3)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<i class="fa fa-'+cellData+' " style="font-size:16px"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Full MAC
|
||||
{targets: [mapIndx(11)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<span class="anonymizeMac">'+cellData+'</span>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// IP address
|
||||
{targets: [mapIndx(12)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<span class="anonymizeIp">'+cellData+'</span>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Favorite
|
||||
{targets: [mapIndx(4)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (cellData == 1){
|
||||
$(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Dates
|
||||
{targets: [mapIndx(6), mapIndx(7)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html (translateHTMLcodes (cellData));
|
||||
} },
|
||||
|
||||
// Random MAC
|
||||
{targets: [mapIndx(9)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (cellData == 1){
|
||||
$(td).html ('<i data-toggle="tooltip" data-placement="right" title="Random MAC" style="font-size: 16px;" class="text-yellow glyphicon glyphicon-random"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Status color
|
||||
{targets: [mapIndx(10)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
switch (cellData) {
|
||||
case 'Down': color='red'; break;
|
||||
case 'New': color='yellow'; break;
|
||||
case 'On-line': color='green'; break;
|
||||
case 'Off-line': color='gray text-white'; break;
|
||||
case 'Archived': color='gray text-white'; break;
|
||||
default: color='aqua'; break;
|
||||
};
|
||||
|
||||
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[10] +'" class="badge bg-'+ color +'">'+ cellData.replace('-', '') +'</a>');
|
||||
} },
|
||||
],
|
||||
$.get('api/table_devices.json?nocache=' + Date.now(), function(result) {
|
||||
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table> <td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td> </table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Device_Tablelenght');?>",
|
||||
"search": "<?= lang('Device_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Device_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Device_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Device_Table_info');?>",
|
||||
// Filter the data based on deviceStatus
|
||||
var filteredData = filterDataByStatus(result.data, deviceStatus);
|
||||
|
||||
// Convert JSON data into the desired format
|
||||
var dataArray = {
|
||||
data: filteredData.map(function(item) {
|
||||
var originalRow = [
|
||||
item.dev_Name || "",
|
||||
item.dev_Owner || "",
|
||||
item.dev_DeviceType || "",
|
||||
item.dev_Icon || "",
|
||||
item.dev_Favorite || "",
|
||||
item.dev_Group || "",
|
||||
// ---
|
||||
item.dev_FirstConnection || "",
|
||||
item.dev_LastConnection || "",
|
||||
item.dev_LastIP || "",
|
||||
(["2", "6", "A", "E", "a", "e"].includes(item.dev_MAC[1]) ? 1 : 0) || "", // Check if randomized MAC
|
||||
getDeviceStatus(item) || "",
|
||||
item.dev_MAC || "", // hidden
|
||||
formatIPlong(item.dev_LastIP) || "", // IP orderable
|
||||
item.rowid || "",
|
||||
item.dev_Network_Node_MAC_ADDR || "",
|
||||
item.connected_devices || 0,
|
||||
item.dev_Location || "",
|
||||
item.dev_Vendor || "",
|
||||
item.dev_Network_Node_port || 0
|
||||
];
|
||||
|
||||
var newRow = [];
|
||||
|
||||
// reorder data based on user-defined columns order
|
||||
for (index = 0; index < tableColumnOrder.length; index++) {
|
||||
newRow.push(originalRow[tableColumnOrder[index]]);
|
||||
}
|
||||
|
||||
return newRow;
|
||||
})
|
||||
};
|
||||
|
||||
|
||||
// TODO displayed columns
|
||||
|
||||
|
||||
// Check if the DataTable already exists
|
||||
if ($.fn.dataTable.isDataTable('#tableDevices')) {
|
||||
// The DataTable exists, so destroy it
|
||||
var table = $('#tableDevices').DataTable();
|
||||
table.clear().destroy();
|
||||
}
|
||||
});
|
||||
|
||||
// Save cookie Rows displayed, and Parameters rows & order
|
||||
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
|
||||
setParameter (parTableRows, len);
|
||||
} );
|
||||
|
||||
$('#tableDevices').on( 'order.dt', function () {
|
||||
setParameter (parTableOrder, JSON.stringify (table.order()) );
|
||||
setCache ('devicesList', getDevicesFromTable(table) );
|
||||
} );
|
||||
var table=
|
||||
$('#tableDevices').DataTable({
|
||||
'data' : dataArray["data"],
|
||||
'paging' : true,
|
||||
'lengthChange' : true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, getString('Device_Tablelenght_all')]],
|
||||
'searching' : true,
|
||||
|
||||
$('#tableDevices').on( 'search.dt', function () {
|
||||
setCache ('devicesList', getDevicesFromTable(table) );
|
||||
} );
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
|
||||
// Parameters
|
||||
'pageLength' : tableRows,
|
||||
'order' : tableOrder,
|
||||
|
||||
'columnDefs' : [
|
||||
{visible: false, targets: tableColumnHide },
|
||||
{className: 'text-center', targets: [mapIndx(3), mapIndx(4), mapIndx(9), mapIndx(10), mapIndx(15)] },
|
||||
{width: '80px', targets: [mapIndx(6), mapIndx(7), mapIndx(15)] },
|
||||
{width: '30px', targets: [mapIndx(10), mapIndx(13)] },
|
||||
{orderData: [mapIndx(12)], targets: mapIndx(8) },
|
||||
|
||||
// Device Name
|
||||
{targets: [mapIndx(0)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
|
||||
// console.log(cellData)
|
||||
$(td).html ('<b class="anonymizeDev"><a href="deviceDetails.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
|
||||
} },
|
||||
|
||||
// Connected Devices
|
||||
{targets: [mapIndx(15)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html ('<b><a href="./network.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
|
||||
} },
|
||||
|
||||
// Icon
|
||||
{targets: [mapIndx(3)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<i class="fa fa-'+cellData+' " style="font-size:16px"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Full MAC
|
||||
{targets: [mapIndx(11)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<span class="anonymizeMac">'+cellData+'</span>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// IP address
|
||||
{targets: [mapIndx(12)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (!emptyArr.includes(cellData)){
|
||||
$(td).html ('<span class="anonymizeIp">'+cellData+'</span>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Favorite
|
||||
{targets: [mapIndx(4)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
if (cellData == 1){
|
||||
$(td).html ('<i class="fa fa-star text-yellow" style="font-size:16px"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Dates
|
||||
{targets: [mapIndx(6), mapIndx(7)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html (translateHTMLcodes (cellData));
|
||||
} },
|
||||
|
||||
// Random MAC
|
||||
{targets: [mapIndx(9)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
console.log(cellData)
|
||||
if (cellData == 1){
|
||||
$(td).html ('<i data-toggle="tooltip" data-placement="right" title="Random MAC" style="font-size: 16px;" class="text-yellow glyphicon glyphicon-random"></i>');
|
||||
} else {
|
||||
$(td).html ('');
|
||||
}
|
||||
} },
|
||||
|
||||
// Status color
|
||||
{targets: [mapIndx(10)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
|
||||
// console.log(cellData)
|
||||
switch (cellData) {
|
||||
case 'Down': color='red'; break;
|
||||
case 'New': color='yellow'; break;
|
||||
case 'On-line': color='green'; break;
|
||||
case 'Off-line': color='gray text-white'; break;
|
||||
case 'Archived': color='gray text-white'; break;
|
||||
default: color='aqua'; break;
|
||||
};
|
||||
|
||||
$(td).html ('<a href="deviceDetails.php?mac='+ rowData[mapIndx(11)] +'" class="badge bg-'+ color +'">'+ cellData.replace('-', '') +'</a>');
|
||||
} },
|
||||
],
|
||||
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table> <td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td> </table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Device_Tablelenght');?>",
|
||||
"search": "<?= lang('Device_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Device_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Device_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Device_Table_info');?>",
|
||||
}
|
||||
});
|
||||
|
||||
// Save cookie Rows displayed, and Parameters rows & order
|
||||
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
|
||||
setParameter (parTableRows, len);
|
||||
} );
|
||||
|
||||
$('#tableDevices').on( 'order.dt', function () {
|
||||
setParameter (parTableOrder, JSON.stringify (table.order()) );
|
||||
setCache ('devicesList', getDevicesFromTable(table) );
|
||||
} );
|
||||
|
||||
$('#tableDevices').on( 'search.dt', function () {
|
||||
setCache ('devicesList', getDevicesFromTable(table) );
|
||||
} );
|
||||
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -513,36 +643,27 @@ function getDevicesTotals () {
|
||||
} );
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function getDeviceColumns () {
|
||||
function handleLoadingDialog()
|
||||
{
|
||||
$.get('log/execution_queue.log?nocache=' + Date.now(), function(data) {
|
||||
|
||||
|
||||
if(data.includes("update_api|devices"))
|
||||
{
|
||||
showSpinner("devices_old")
|
||||
|
||||
setTimeout("handleLoadingDialog()", 1000);
|
||||
|
||||
} else if ($("#loadingSpinner").is(":visible"))
|
||||
{
|
||||
hideSpinner();
|
||||
location.reload();
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
function getDevicesList (status) {
|
||||
// Save status selected
|
||||
deviceStatus = status;
|
||||
|
||||
// Define color & title for the status selected
|
||||
switch (deviceStatus) {
|
||||
case 'all': tableTitle = '<?= lang('Device_Shortcut_AllDevices');?>'; color = 'aqua'; break;
|
||||
case 'connected': tableTitle = '<?= lang('Device_Shortcut_Connected');?>'; color = 'green'; break;
|
||||
case 'favorites': tableTitle = '<?= lang('Device_Shortcut_Favorites');?>'; color = 'yellow'; break;
|
||||
case 'new': tableTitle = '<?= lang('Device_Shortcut_NewDevices');?>'; color = 'yellow'; break;
|
||||
case 'down': tableTitle = '<?= lang('Device_Shortcut_DownAlerts');?>'; color = 'red'; break;
|
||||
case 'archived': tableTitle = '<?= lang('Device_Shortcut_Archived');?>'; color = 'gray'; break;
|
||||
default: tableTitle = '<?= lang('Device_Shortcut_Devices');?>'; color = 'gray'; break;
|
||||
}
|
||||
|
||||
// Set title and color
|
||||
$('#tableDevicesTitle')[0].className = 'box-title text-'+ color;
|
||||
$('#tableDevicesBox')[0].className = 'box box-'+ color;
|
||||
$('#tableDevicesTitle').html (tableTitle);
|
||||
|
||||
// Define new datasource URL and reload
|
||||
$('#tableDevices').DataTable().ajax.url(
|
||||
'php/server/devices.php?action=getDevicesList&status=' + deviceStatus).load();
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
70
front/donations.php
Executable file
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
require 'php/templates/header.php';
|
||||
?>
|
||||
<script src="js/pialert_common.js"></script>
|
||||
<div id="donationsPage" class="content-wrapper">
|
||||
<!-- Content header--------------------------------------------------------- -->
|
||||
<section class="content-header">
|
||||
<h1 id="pageTitle">
|
||||
<i class="fa fa-heart"></i>
|
||||
</h1>
|
||||
</section>
|
||||
|
||||
<!-- Main content ---------------------------------------------------------- -->
|
||||
<section class="content donations">
|
||||
<div id="donationsText" class="box box-solid"></div>
|
||||
<div class="content-header">
|
||||
<h3 class="box-title " id="donationsPlatforms"></h3>
|
||||
</div>
|
||||
<div class="box box-solid">
|
||||
<div class="box-body">
|
||||
<div class="col-sm-2">
|
||||
<a target="_blank" href="https://github.com/sponsors/jokob-sk">
|
||||
<img alt="Sponsor Me on GitHub" src="https://i.imgur.com/X6p5ACK.png" width="150px">
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<a target="_blank" href="https://www.buymeacoffee.com/jokobsk">
|
||||
<img alt="Buy Me A Coffee" src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" width="117px" height="30px">
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<a target="_blank" href="https://www.patreon.com/user?u=84385063">
|
||||
<img alt="Support me on patreon" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Patreon_logo_with_wordmark.svg/512px-Patreon_logo_with_wordmark.svg.png" width="117px">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content-header">
|
||||
<h3 class="box-title " id="donationsOthers"></h3>
|
||||
</div>
|
||||
<div class="box box-solid">
|
||||
<div class="box-body">
|
||||
<div class="col-sm-12">
|
||||
<ul>
|
||||
<li>Bitcoin: <code>1N8tupjeCK12qRVU2XrV17WvKK7LCawyZM</code></li>
|
||||
<li>Ethereum: <code>0x6e2749Cb42F4411bc98501406BdcD82244e3f9C7</code></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
</section>
|
||||
|
||||
</div> <!-- End of class="content-wrapper" -->
|
||||
|
||||
<script>
|
||||
function init()
|
||||
{
|
||||
$("#donationsText").html(getString("Donations_Text"))
|
||||
$("#pageTitle").append(getString("Donations_Title"))
|
||||
$("#donationsPlatforms").append(getString("Donations_Platforms"))
|
||||
$("#donationsOthers").append(getString("Donations_Others"))
|
||||
}
|
||||
|
||||
init();
|
||||
</script>
|
||||
|
||||
<?php
|
||||
require 'php/templates/footer.php';
|
||||
?>
|
||||
@@ -1,14 +1,19 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# events.php - Front module. Events page
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# events.php - Front module. Events page #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<?php
|
||||
require 'php/templates/header.php';
|
||||
require 'php/templates/header.php';
|
||||
?>
|
||||
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
@@ -17,7 +22,8 @@
|
||||
<!-- Content header--------------------------------------------------------- -->
|
||||
<section class="content-header">
|
||||
<h1 id="pageTitle">
|
||||
<?= lang('Events_Title');?>
|
||||
<i class="fa fa-bolt"></i>
|
||||
<?= lang('Events_Title');?>
|
||||
</h1>
|
||||
|
||||
<!-- period selector -->
|
||||
@@ -251,7 +257,7 @@ function initializeDatatable () {
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle">Loading...</td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>',
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("Events_Loading");?></td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||
|
||||
31
front/flows.php
Executable file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
require 'php/templates/header.php';
|
||||
require 'php/templates/notification.php';
|
||||
?>
|
||||
|
||||
<script src="js/pialert_common.js"></script>
|
||||
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
<div class="content-wrapper">
|
||||
|
||||
<!-- Content header--------------------------------------------------------- -->
|
||||
<section class="content-header">
|
||||
|
||||
<h1 id="pageTitle">
|
||||
<i class="fa fa-fw fa-plug"></i> <?= lang('Navigation_Flows');?>
|
||||
<span class="pageHelp"> <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins"><i class="fa fa-circle-question"></i></a><span>
|
||||
</h1>
|
||||
</section>
|
||||
|
||||
|
||||
<?php
|
||||
// require 'pluginsCore.php';
|
||||
?>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<?php
|
||||
require 'php/templates/footer.php';
|
||||
?>
|
||||
@@ -8,13 +8,17 @@
|
||||
<section class="content-header">
|
||||
<?php require 'php/templates/notification.php'; ?>
|
||||
<h1 id="pageTitle">
|
||||
<?= lang('HelpFAQ_Title');?>
|
||||
<i class="fa fa-question"></i>
|
||||
<?= lang('HelpFAQ_Title');?>
|
||||
</h1>
|
||||
</section>
|
||||
|
||||
<!-- Main content ---------------------------------------------------------- -->
|
||||
<section class="content">
|
||||
<h4><?= lang('HelpFAQ_Cat_General');?></h4>
|
||||
<h4>
|
||||
<i class="fa fa-question"></i>
|
||||
<?= lang('HelpFAQ_Cat_General');?>
|
||||
</h4>
|
||||
|
||||
<div class="panel-group" id="accordion_gen">
|
||||
<div class="panel panel-default">
|
||||
@@ -89,10 +93,26 @@
|
||||
<?= lang('HelpFAQ_Cat_General_103_text');?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h4 class="panel-title">
|
||||
<a data-toggle="collapse" data-parent="#accordion_net" href="#collapse601">
|
||||
<?= lang('HelpFAQ_Cat_Network_601_head');?></a>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="collapse601" class="panel-collapse collapse" style="font-size: 16px;">
|
||||
<div class="panel-body">
|
||||
<?= lang('HelpFAQ_Cat_Network_601_text');?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4><?= lang('Navigation_Devices');?></h4>
|
||||
<h4>
|
||||
<i class="fa fa-laptop"></i>
|
||||
<?= lang('Navigation_Devices');?>
|
||||
</h4>
|
||||
<div class="panel-group" id="accordion_dev">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -110,7 +130,8 @@
|
||||
</div>
|
||||
|
||||
|
||||
<h4><?= lang('HelpFAQ_Cat_Detail');?></h4>
|
||||
<h4>
|
||||
<i class="fa fa-info-circle"></i><?= lang('HelpFAQ_Cat_Detail');?></h4>
|
||||
<div class="panel-group" id="accordion_det">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -164,10 +185,14 @@
|
||||
<?= lang('HelpFAQ_Cat_Detail_303_text');?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4><?= lang('Navigation_Presence');?></h4>
|
||||
<h4>
|
||||
<i class="fa fa-calendar"></i>
|
||||
<?= lang('Navigation_Presence');?>
|
||||
</h4>
|
||||
<div class="panel-group" id="accordion_pre">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -197,7 +222,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4><?= lang('Navigation_Network');?></h4>
|
||||
<h4>
|
||||
<i class="fa fa-network-wired"></i><?= lang('Navigation_Network');?></h4>
|
||||
<div class="panel-group" id="accordion_net">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
@@ -211,10 +237,11 @@
|
||||
<?= lang('HelpFAQ_Cat_Network_600_text');?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
<br>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.content-wrapper -->
|
||||
|
||||
@@ -1,68 +1,51 @@
|
||||
function handleVersion(){
|
||||
//--------------------------------------------------------------
|
||||
// Handle the UI changes to show or hide notifications about a new version
|
||||
function versionUpdateUI(){
|
||||
|
||||
release_timestamp = getCookie("release_timestamp")
|
||||
isNewVersion = getCookie("isNewVersion")
|
||||
|
||||
if(release_timestamp != "")
|
||||
{
|
||||
console.log(isNewVersion)
|
||||
|
||||
build_timestamp = parseInt($('#version').attr("data-build-time").match( /\d+/g ).join(''))
|
||||
|
||||
// if the release_timestamp is older by 10 min or more as the build timestamp then there is a new release available
|
||||
if(release_timestamp > build_timestamp + 600 )
|
||||
{
|
||||
console.log("New release!")
|
||||
// handling the navigation menu icon
|
||||
$('#version').attr("class", $('#version').attr("class").replace("myhidden", ""))
|
||||
|
||||
maintenanceDiv = $('#new-version-text')
|
||||
}
|
||||
else{
|
||||
console.log("All up-to-date!")
|
||||
|
||||
maintenanceDiv = $('#current-version-text')
|
||||
}
|
||||
|
||||
// handling the maintenance section message
|
||||
if(emptyArr.includes(maintenanceDiv) == false && $(maintenanceDiv).length != 0)
|
||||
{
|
||||
$(maintenanceDiv).attr("class", $(maintenanceDiv).attr("class").replace("myhidden", ""))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
function getVersion()
|
||||
// if the release_timestamp is older by 10 min or more as the build timestamp then there is a new release available
|
||||
if(isNewVersion != "false")
|
||||
{
|
||||
release_timestamp = getCookie("release_timestamp")
|
||||
console.log("New release!")
|
||||
// handling the navigation menu icon
|
||||
$('#version').attr("class", $('#version').attr("class").replace("myhidden", ""))
|
||||
|
||||
// no cached value available
|
||||
if(release_timestamp == "")
|
||||
{
|
||||
// get parameter value
|
||||
$.get('https://api.github.com/repos/jokob-sk/Pi.Alert/releases', function(data) {
|
||||
|
||||
var releases = data;
|
||||
maintenanceDiv = $('#new-version-text')
|
||||
}
|
||||
else{
|
||||
console.log("All up-to-date!")
|
||||
|
||||
if(releases.length > 0)
|
||||
{
|
||||
release_datetime = releases[0].published_at;
|
||||
release_timestamp = new Date(release_datetime).getTime() / 1000;
|
||||
|
||||
// cache value
|
||||
setCookie("release_timestamp", release_timestamp, 30);
|
||||
|
||||
handleVersion();
|
||||
}
|
||||
});
|
||||
} else
|
||||
{
|
||||
// cache is available, just call the handler
|
||||
handleVersion()
|
||||
}
|
||||
maintenanceDiv = $('#current-version-text')
|
||||
}
|
||||
|
||||
// handling the maintenance section message
|
||||
if(emptyArr.includes(maintenanceDiv) == false && $(maintenanceDiv).length != 0)
|
||||
{
|
||||
$(maintenanceDiv).attr("class", $(maintenanceDiv).attr("class").replace("myhidden", ""))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Checks if a new version is available via the global app_state.json
|
||||
function checkIfNewVersionAvailable()
|
||||
{
|
||||
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
|
||||
|
||||
console.log(appState["isNewVersionChecked"])
|
||||
console.log(appState["isNewVersion"])
|
||||
|
||||
// cache value
|
||||
setCookie("isNewVersion", appState["isNewVersion"], 30);
|
||||
setCookie("isNewVersionChecked", appState["isNewVersionChecked"], 30);
|
||||
|
||||
versionUpdateUI();
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
// handle the dispaly of the NEW icon
|
||||
getVersion()
|
||||
checkIfNewVersionAvailable()
|
||||
@@ -11,6 +11,9 @@
|
||||
var timerRefreshData = ''
|
||||
var modalCallbackFunction = '';
|
||||
var emptyArr = ['undefined', "", undefined, null, 'null'];
|
||||
var UI_LANG = "English";
|
||||
var settingsJSON = {}
|
||||
|
||||
|
||||
// urlParams = new Proxy(new URLSearchParams(window.location.search), {
|
||||
// get: (searchParams, prop) => searchParams.get(prop.toString()),
|
||||
@@ -20,13 +23,13 @@ var emptyArr = ['undefined', "", undefined, null, 'null'];
|
||||
// -----------------------------------------------------------------------------
|
||||
// Simple session cache withe expiration managed via cookies
|
||||
// -----------------------------------------------------------------------------
|
||||
function getCache(key)
|
||||
function getCache(key, noCookie = false)
|
||||
{
|
||||
// check cache
|
||||
if(sessionStorage.getItem(key))
|
||||
{
|
||||
// check if not expired
|
||||
if(getCookie(key + '_session_expiry') != "")
|
||||
if(noCookie || getCookie(key + '_session_expiry') != "")
|
||||
{
|
||||
return sessionStorage.getItem(key);
|
||||
}
|
||||
@@ -38,8 +41,13 @@ function getCache(key)
|
||||
// -----------------------------------------------------------------------------
|
||||
function setCache(key, data, expirationMinutes='')
|
||||
{
|
||||
sessionStorage.setItem(key, data);
|
||||
setCookie (key + '_session_expiry', 'OK', expirationMinutes='')
|
||||
sessionStorage.setItem(key, data);
|
||||
|
||||
// create cookie if expiration set to handle refresh of data
|
||||
if (expirationMinutes != '')
|
||||
{
|
||||
setCookie (key + '_session_expiry', 'OK', expirationMinutes='')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +104,105 @@ function deleteAllCookies() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Get settings from the .json file generated by the python backend
|
||||
// -----------------------------------------------------------------------------
|
||||
function cacheSettings()
|
||||
{
|
||||
|
||||
$.get('api/table_settings.json', function(res) {
|
||||
|
||||
settingsJSON = res;
|
||||
|
||||
data = settingsJSON["data"];
|
||||
|
||||
data.forEach((set) => {
|
||||
setCache(`pia_set_${set.Code_Name}`, set.Value)
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
function getSetting (key) {
|
||||
|
||||
result = getCache(`pia_set_${key}`, true);
|
||||
|
||||
if (result == "")
|
||||
{
|
||||
console.log(`Setting with key "${key}" not found`)
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Get language string
|
||||
// -----------------------------------------------------------------------------
|
||||
function cacheStrings()
|
||||
{
|
||||
|
||||
// handle core strings and translations
|
||||
var allLanguages = ["en_us","es_es","de_de"]; // needs to be same as in lang.php
|
||||
|
||||
allLanguages.forEach(function (language_code) {
|
||||
|
||||
$.get(`php/templates/language/${language_code}.json`, function(res) {
|
||||
|
||||
Object.entries(res).forEach(([language, translations]) => {
|
||||
|
||||
Object.entries(translations).forEach(([key, value]) => {
|
||||
// store as key - value pairs in session
|
||||
setCache(`pia_lang_${key}_${language}`, value)
|
||||
});
|
||||
});
|
||||
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
// handle strings and translations from plugins
|
||||
$.get('api/table_plugins_language_strings.json', function(res) {
|
||||
|
||||
data = res["data"];
|
||||
|
||||
data.forEach((langString) => {
|
||||
setCache(`pia_lang_${langString.String_Key}_${langString.Language_Code}`, langString.String_Value)
|
||||
});
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
// Get translated language string
|
||||
function getString (key) {
|
||||
|
||||
UI_LANG = getSetting("UI_LANG");
|
||||
|
||||
lang_code = 'en_us';
|
||||
|
||||
switch(UI_LANG)
|
||||
{
|
||||
case 'English':
|
||||
lang_code = 'en_us';
|
||||
break;
|
||||
case 'Spanish':
|
||||
lang_code = 'es_es';
|
||||
break;
|
||||
case 'German':
|
||||
lang_code = 'de_de';
|
||||
break;
|
||||
}
|
||||
result = getCache(`pia_lang_${key}_${lang_code}`, true);
|
||||
|
||||
|
||||
if(isEmpty(result))
|
||||
{
|
||||
result = getCache(`pia_lang_${key}_en_us`, true);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Modal dialog handling
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -197,9 +304,42 @@ function showMessage (textMessage="") {
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// String utilities
|
||||
// -----------------------------------------------------------------------------
|
||||
function jsonSyntaxHighlight(json) {
|
||||
if (typeof json != 'string') {
|
||||
json = JSON.stringify(json, undefined, 2);
|
||||
}
|
||||
json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
||||
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
|
||||
var cls = 'number';
|
||||
if (/^"/.test(match)) {
|
||||
if (/:$/.test(match)) {
|
||||
cls = 'key';
|
||||
} else {
|
||||
cls = 'string';
|
||||
}
|
||||
} else if (/true|false/.test(match)) {
|
||||
cls = 'boolean';
|
||||
} else if (/null/.test(match)) {
|
||||
cls = 'null';
|
||||
}
|
||||
return '<span class="' + cls + '">' + match + '</span>';
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// General utilities
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// check if JSON object
|
||||
function isJsonObject(value) {
|
||||
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
||||
}
|
||||
|
||||
|
||||
// remove unnecessary lines from the result
|
||||
function sanitize(data)
|
||||
{
|
||||
@@ -363,12 +503,127 @@ function navigateToDeviceWithIp (ip) {
|
||||
window.open(window.location.origin +'/deviceDetails.php?mac=' + mac , "_blank");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function getNameByMacAddress(macAddress) {
|
||||
return getDeviceDataByMacAddress(macAddress, "dev_Name")
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// A function used to make the IP address orderable
|
||||
function formatIPlong(ipAddress) {
|
||||
const parts = ipAddress.split('.');
|
||||
if (parts.length !== 4) {
|
||||
throw new Error('Invalid IP address format');
|
||||
}
|
||||
return (parseInt(parts[0]) << 24) |
|
||||
(parseInt(parts[1]) << 16) |
|
||||
(parseInt(parts[2]) << 8) |
|
||||
parseInt(parts[3]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// A function to get a device property using the mac address as key and DB column nakme as parameter
|
||||
// for the value to be returned
|
||||
function getDeviceDataByMacAddress(macAddress, dbColumn) {
|
||||
|
||||
const sessionDataKey = 'devicesListAll_JSON';
|
||||
const sessionData = sessionStorage.getItem(sessionDataKey);
|
||||
|
||||
if (!sessionData) {
|
||||
console.log(`Session variable "${sessionDataKey}" not found.`);
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
const devices = JSON.parse(sessionData);
|
||||
|
||||
for (const device of devices) {
|
||||
if (device["dev_MAC"].toLowerCase() === macAddress.toLowerCase()) {
|
||||
|
||||
return device[dbColumn];
|
||||
}
|
||||
}
|
||||
|
||||
return "Unknown"; // Return a default value if MAC address is not found
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function initDeviceListAll_JSON()
|
||||
{
|
||||
|
||||
$.get('api/table_devices.json', function(data) {
|
||||
|
||||
console.log(data)
|
||||
|
||||
devicesListAll_JSON = data["data"]
|
||||
|
||||
setCache('devicesListAll_JSON', JSON.stringify(devicesListAll_JSON))
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
var devicesListAll_JSON = []; // this will contain a list off all devices
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function isEmpty(value)
|
||||
{
|
||||
return emptyArr.includes(value)
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Generate a GUID
|
||||
function getGuid() {
|
||||
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
|
||||
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
|
||||
);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Loading Spinner overlay
|
||||
// -----------------------------------------------------------------------------
|
||||
function showSpinner(stringKey='Loading')
|
||||
{
|
||||
if($("#loadingSpinner").length)
|
||||
{
|
||||
|
||||
$("#loadingSpinner").show();
|
||||
}
|
||||
else{
|
||||
html = `
|
||||
<!-- spinner -->
|
||||
<div id="loadingSpinner" style="display: block">
|
||||
<div class="pa_semitransparent-panel"></div>
|
||||
<div class="panel panel-default pa_spinner">
|
||||
<table>
|
||||
<td width="130px" align="middle">${getString(stringKey)}</td>
|
||||
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
|
||||
$(".wrapper").append(html)
|
||||
}
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
function hideSpinner()
|
||||
{
|
||||
$("#loadingSpinner").hide()
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// initialize
|
||||
// -----------------------------------------------------------------------------
|
||||
cacheSettings()
|
||||
cacheStrings()
|
||||
initDeviceListAll_JSON()
|
||||
|
||||
|
||||
console.log("init pialert_common.js")
|
||||
|
||||
|
||||
|
||||
109
front/js/settings_utils.js
Executable file
@@ -0,0 +1,109 @@
|
||||
// -------------------------------------------------------------------
|
||||
// Get all plugin prefixes of a given type
|
||||
function getPluginsByType(pluginsData, pluginType, onlyEnabled)
|
||||
{
|
||||
|
||||
var result = []
|
||||
|
||||
pluginsData.forEach((plug) => {
|
||||
|
||||
if(plug.plugin_type == pluginType)
|
||||
{
|
||||
// collect all, or if only enabled, check if NOT disabled
|
||||
if (onlyEnabled == false || (onlyEnabled && getSetting(plug.unique_prefix + '_RUN') != 'disabled')) {
|
||||
result.push(plug.unique_prefix)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Get plugin type base on prefix
|
||||
function getPluginType(pluginsData, prefix)
|
||||
{
|
||||
var result = "core"
|
||||
|
||||
pluginsData.forEach((plug) => {
|
||||
|
||||
if (plug.unique_prefix == prefix ) {
|
||||
id = plug.plugin_type;
|
||||
|
||||
// console.log(id)
|
||||
result = plug.plugin_type;
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Generate plugin HTML card based on prefixes in an array
|
||||
function pluginCards(prefixesOfEnabledPlugins, includeSettings)
|
||||
{
|
||||
html = ""
|
||||
|
||||
prefixesOfEnabledPlugins.forEach((prefix) => {
|
||||
|
||||
includeSettings_html = ''
|
||||
|
||||
includeSettings.forEach((set) => {
|
||||
|
||||
includeSettings_html += `
|
||||
<a href="#${prefix + '_' + set}" onclick="toggleAllSettings()">
|
||||
<div class="overview-setting-value pointer" title="${prefix + '_' + set}">
|
||||
<code>${getSetting(prefix + '_' + set)}</code>
|
||||
</div>
|
||||
</a>
|
||||
`
|
||||
|
||||
});
|
||||
|
||||
html += `
|
||||
|
||||
<div class="col-sm-4 ">
|
||||
<div class="small-box bg-green " >
|
||||
<div class="inner ">
|
||||
<h5 class="card-title">
|
||||
${getString(prefix+"_display_name")}
|
||||
</h5>
|
||||
${includeSettings_html}
|
||||
</div>
|
||||
<div class="icon"> ${getString(prefix+"_icon")} </div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
});
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Checks if all schedules are the same
|
||||
function schedulesAreSynchronized(prefixesOfEnabledPlugins, pluginsData)
|
||||
{
|
||||
plug_schedules = []
|
||||
|
||||
prefixesOfEnabledPlugins.forEach((prefix) => {
|
||||
pluginsData.forEach((plug) => {
|
||||
|
||||
if (plug.unique_prefix == prefix) {
|
||||
|
||||
plug_schedules.push(getSetting(prefix+"_RUN_SCHD").replace(/\s/g, "")) // replace all white characters to compare them easier
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
// Check if all plug_schedules are the same
|
||||
if (plug_schedules.length > 0) {
|
||||
const firstSchedule = plug_schedules[0];
|
||||
return plug_schedules.every((schedule) => schedule === firstSchedule);
|
||||
}
|
||||
|
||||
return true; // Return true if no schedules are found
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
<?php
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Pi.Alert
|
||||
// Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
//
|
||||
// devices.php - Front module. Server side. Manage Devices
|
||||
//------------------------------------------------------------------------------
|
||||
// Puche 2021 pi.alert.application@gmail.com GNU GPLv3
|
||||
// jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3
|
||||
// leiweibau 2022 https://github.com/leiweibau GNU GPLv3
|
||||
//------------------------------------------------------------------------------
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# maintenance.php - Front module. Server side. Maintenance #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
|
||||
// Skin selector config ----------------------------------------------------
|
||||
//
|
||||
@@ -44,7 +44,8 @@ $pia_installed_skins = array('skin-black-light',
|
||||
<section class="content-header">
|
||||
<?php require 'php/templates/notification.php'; ?>
|
||||
<h1 id="pageTitle">
|
||||
<?= lang('Maintenance_Title');?>
|
||||
<i class="fa fa-wrench"></i>
|
||||
<?= lang('Maintenance_Title');?>
|
||||
</h1>
|
||||
</section>
|
||||
|
||||
@@ -118,6 +119,30 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Table sizes -----------------------------------------------------------------
|
||||
|
||||
$tableSizesHTML = "";
|
||||
|
||||
// Open a connection to the SQLite database
|
||||
$db = new SQLite3($pia_db);
|
||||
|
||||
// Retrieve the table names from sqlite_master
|
||||
$query = "SELECT name FROM sqlite_master WHERE type='table'";
|
||||
$result = $db->query($query);
|
||||
|
||||
// Iterate over the tables and get the row counts
|
||||
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
||||
$tableName = $row['name'];
|
||||
$query = "SELECT COUNT(*) FROM $tableName";
|
||||
$countResult = $db->querySingle($query);
|
||||
$tableSizesHTML = $tableSizesHTML . "$tableName (<b>$countResult</b>), ";
|
||||
}
|
||||
|
||||
// Close the database connection
|
||||
$db->close();
|
||||
|
||||
|
||||
|
||||
|
||||
// Language selector -----------------------------------------------------------------
|
||||
|
||||
@@ -127,7 +152,10 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
<div class="col-md-12">
|
||||
<div class="box" id="Maintain-Status">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">Status</h3>
|
||||
<h3 class="box-title">
|
||||
<i class="fa fa-display"></i></i>
|
||||
<?= lang('Maintenance_Status');?>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="box-body" style="padding-bottom: 5px;">
|
||||
<div class="db_info_table">
|
||||
@@ -140,6 +168,18 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
<div class="version" id="version" data-build-time="<?php echo file_get_contents( "buildtimestamp.txt");?>"><?php echo '<span id="new-version-text" class="myhidden">' .lang('Maintenance_new_version').'</span>'.'<span id="current-version-text" class="myhidden">' .lang('Maintenance_current_version').'</span>';?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_built_on');?></div>
|
||||
<div class="db_info_table_cell">
|
||||
<?php echo date("Y-m-d", ((int)file_get_contents( "buildtimestamp.txt")));?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_Running_Version');?></div>
|
||||
<div class="db_info_table_cell">
|
||||
<?php include 'php/templates/version.php'; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_database_path');?></div>
|
||||
<div class="db_info_table_cell">
|
||||
@@ -150,7 +190,13 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_size');?></div>
|
||||
<div class="db_info_table_cell">
|
||||
<?php echo $pia_db_size;?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_rows');?></div>
|
||||
<div class="db_info_table_cell">
|
||||
<?php echo $tableSizesHTML;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_lastmod');?></div>
|
||||
@@ -173,17 +219,29 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
|
||||
<div class="nav-tabs-custom">
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active">
|
||||
<a id="tab_Settings_id" href="#tab_Settings" data-toggle="tab"><?= lang('Maintenance_Tools_Tab_UISettings');?></a>
|
||||
<li class="active">
|
||||
<a id="tab_Settings_id" href="#tab_Settings" data-toggle="tab">
|
||||
<i class="fa fa-cogs"></i>
|
||||
<?= lang('Maintenance_Tools_Tab_UISettings');?>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab"><?= lang('Maintenance_Tools_Tab_Tools');?></a>
|
||||
<a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab">
|
||||
<i class="fa fa-toolbox"></i>
|
||||
<?= lang('Maintenance_Tools_Tab_Tools');?>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a id="tab_BackupRestore_id" href="#tab_BackupRestore" data-toggle="tab"><?= lang('Maintenance_Tools_Tab_BackupRestore');?></a>
|
||||
<a id="tab_BackupRestore_id" href="#tab_BackupRestore" data-toggle="tab">
|
||||
<i class="fa fa-file-shield"></i>
|
||||
<?= lang('Maintenance_Tools_Tab_BackupRestore');?>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a id="tab_Logging_id" href="#tab_Logging" data-toggle="tab"><?= lang('Maintenance_Tools_Tab_Logging');?></a>
|
||||
<a id="tab_Logging_id" href="#tab_Logging" data-toggle="tab">
|
||||
<i class="fa fa-triangle-exclamation"></i>
|
||||
<?= lang('Maintenance_Tools_Tab_Logging');?>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
@@ -246,6 +304,7 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
<option value="15"><?= lang('Device_TableHead_Connected_Devices');?></option>
|
||||
<option value="16"><?= lang('Device_TableHead_Location');?></option>
|
||||
<option value="17"><?= lang('Device_TableHead_Vendor');?></option>
|
||||
<option value="18"><?= lang('Device_TableHead_Port');?></option>
|
||||
</select>
|
||||
<span class="input-group-addon"><i title="<?= lang('Gen_Save');?>" class="fa fa-save pointer" onclick="saveSelectedColumns();"></i></span>
|
||||
</div>
|
||||
@@ -336,9 +395,19 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
<!-- ---------------------------Logging-------------------------------------------- -->
|
||||
<div class="tab-pane" id="tab_Logging">
|
||||
<div class="db_info_table">
|
||||
<div class="log-area">
|
||||
<div class="log-area box box-solid box-primary">
|
||||
<div class="row logs-row">
|
||||
<textarea id="pialert_log" class="logs" cols="70" rows="10" wrap='off' readonly ><?php echo file_get_contents( "./log/pialert.log" ); ?>
|
||||
<textarea id="pialert_log" class="logs" cols="70" rows="10" wrap='off' readonly >
|
||||
<?php
|
||||
if(filesize("./log/pialert.log") > 2000000)
|
||||
{
|
||||
echo file_get_contents( "./log/pialert.log", false, null, -2000000);
|
||||
}
|
||||
else{
|
||||
echo file_get_contents( "./log/pialert.log" );
|
||||
}
|
||||
|
||||
?>
|
||||
</textarea>
|
||||
</div>
|
||||
<div class="row logs-row" >
|
||||
@@ -351,8 +420,8 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="log-area">
|
||||
</div>
|
||||
<div class="log-area box box-solid box-primary">
|
||||
<div class="row logs-row">
|
||||
<textarea id="pialert_front_log" class="logs" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "./log/pialert_front.log" ); ?>
|
||||
</textarea>
|
||||
@@ -367,44 +436,35 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="log-area">
|
||||
|
||||
<div class="row logs-row">
|
||||
<textarea id="pialert_pholus_lastrun_log" class="logs logs-small" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "./log/pialert_pholus_lastrun.log" ); ?>
|
||||
</textarea>
|
||||
</div>
|
||||
<div class="row logs-row" >
|
||||
<div>
|
||||
<div class="log-file">pialert_pholus_lastrun.log<div class="logs-size"><?php echo number_format((filesize("./log/pialert_pholus_lastrun.log") / 1000000),2,",",".") . ' MB';?>
|
||||
<span class="span-padding"><a href="./log/pialert_pholus_lastrun.log"><i class="fa fa-download"></i> </a></span>
|
||||
</div></div>
|
||||
<div class="log-purge">
|
||||
<button class="btn btn-primary" onclick="logManage('pialert_pholus_lastrun.log','cleanLog')"><?= lang('Gen_Purge');?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="log-area">
|
||||
|
||||
<div class="row logs-row">
|
||||
<textarea id="IP_changes_log" class="logs logs-small" cols="70" rows="10" readonly><?php echo file_get_contents( "./log/IP_changes.log" ); ?>
|
||||
</textarea>
|
||||
</div>
|
||||
<div class="row logs-row" >
|
||||
<div>
|
||||
<div class="log-file">IP_changes.log<div class="logs-size"><?php echo number_format((filesize("./log/IP_changes.log") / 1000000),2,",",".") . ' MB';?>
|
||||
<span class="span-padding"><a href="./log/IP_changes.log"><i class="fa fa-download"></i> </a></span>
|
||||
</div></div>
|
||||
<div class="log-purge">
|
||||
<button class="btn btn-primary" onclick="logManage('IP_changes.log','cleanLog')"><?= lang('Gen_Purge');?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="log-area">
|
||||
<div class="log-area box box-solid box-primary">
|
||||
<div class="row logs-row">
|
||||
<textarea id="pialert_php_log" class="logs" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "./log/pialert.php_errors.log" ); ?>
|
||||
</textarea>
|
||||
</div>
|
||||
<div class="row logs-row" >
|
||||
<div>
|
||||
<div class="log-file">pialert.php_errors.log<div class="logs-size"><?php echo number_format((filesize("./log/pialert.php_errors.log") / 1000000),2,",",".") . ' MB';?>
|
||||
<span class="span-padding"><a href="./log/pialert.php_errors.log"><i class="fa fa-download"></i> </a></span>
|
||||
</div></div>
|
||||
<div class="log-purge">
|
||||
<button class="btn btn-primary" onclick="logManage('pialert.php_errors.log','cleanLog')"><?= lang('Gen_Purge');?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="log-area box box-solid box-primary ">
|
||||
<div class="row logs-row">
|
||||
<textarea id="nginx_error_log" class="logs logs-small" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "/var/log/nginx/error.log" ); ?>
|
||||
</textarea>
|
||||
</div>
|
||||
<div class="row logs-row" >
|
||||
<div>
|
||||
<div class="log-file" title="/var/log/nginx/error.log">nginx/error.log</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="log-area box box-solid box-primary">
|
||||
<div class="row logs-row">
|
||||
<textarea id="stdout_log" class="logs logs-small" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "./log/stdout.log" ); ?>
|
||||
</textarea>
|
||||
@@ -421,7 +481,7 @@ if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="log-area">
|
||||
<div class="log-area box box-solid box-primary">
|
||||
<div class="row logs-row">
|
||||
<textarea id="stderr_log" class="logs logs-small" cols="70" rows="10" wrap='off' readonly><?php echo file_get_contents( "./log/stderr.log" ); ?>
|
||||
</textarea>
|
||||
@@ -615,7 +675,7 @@ function askExportCSV() {
|
||||
function ExportCSV()
|
||||
{
|
||||
// Execute
|
||||
openInNewTab(window.location.origin + "/php/server/devices.php?action=ExportCSV")
|
||||
openInNewTab("php/server/devices.php?action=ExportCSV")
|
||||
}
|
||||
|
||||
// Import CSV
|
||||
@@ -627,7 +687,7 @@ function askImportCSV() {
|
||||
function ImportCSV()
|
||||
{
|
||||
// Execute
|
||||
$.get('/php/server/devices.php?action=ImportCSV', function(msg) {
|
||||
$.get('php/server/devices.php?action=ImportCSV', function(msg) {
|
||||
showMessage (msg);
|
||||
});
|
||||
}
|
||||
@@ -700,12 +760,12 @@ function performLogManage() {
|
||||
showModalOk ('Result', data );
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
function scrollDown()
|
||||
{
|
||||
var areaIDs = ['pialert_log', 'pialert_front_log', 'IP_changes_log', 'stdout_log', 'stderr_log', 'pialert_pholus_log', 'pialert_pholus_lastrun_log'];
|
||||
var areaIDs = ['pialert_log', 'pialert_front_log', 'IP_changes_log', 'stdout_log', 'stderr_log', 'pialert_pholus_log', 'pialert_pholus_lastrun_log', 'pialert_php_log'];
|
||||
|
||||
for (let i = 0; i < areaIDs.length; i++) {
|
||||
|
||||
@@ -872,4 +932,4 @@ window.onload = function asyncFooter()
|
||||
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
<script src="js/pialert_common.js"></script>
|
||||
<script src="js/pialert_common.js"></script>
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
define('badge_online', '<div class="badge bg-green text-white" style="width: 60px;">Online</div>');
|
||||
define('badge_offline', '<div class="badge bg-red text-white" style="width: 60px;">Offline</div>');
|
||||
define('circle_online', '<div class="badge bg-green text-white" style="width: 10px; height: 10px; padding:2px; margin-top: -25px;"> </div>');
|
||||
define('circle_offline', '<div class="badge bg-red text-white" style="width: 10px; height: 10px; padding:2px; margin-top: -25px;"> </div>');
|
||||
define('circle_offline', '<div class="badge bg-red text-white" style="width: 10px; height: 10px; padding:2px; margin-top: -25px;"> </div>');
|
||||
|
||||
$NETWORKTYPES = getNetworkTypes();
|
||||
?>
|
||||
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
@@ -24,8 +23,7 @@
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<div id="networkTree" ></div>
|
||||
<div id="networkTree" class="drag"></div>
|
||||
|
||||
<!-- Main content ---------------------------------------------------------- -->
|
||||
<section class="content">
|
||||
@@ -267,7 +265,9 @@
|
||||
// / \
|
||||
// Smart TV (leaf) Switch 2 (node (for the PC) and leaf (for Switch 1))
|
||||
// \
|
||||
// PC (leaf)
|
||||
// PC (leaf) <------- leafs are not included in this SQL query
|
||||
|
||||
$networkDeviceTypes = str_replace("]", "",(str_replace("[", "", getSettingValue("NETWORK_DEVICE_TYPES"))));
|
||||
|
||||
$sql = "SELECT node_name, node_mac, online, node_type, node_ports_count, parent_mac, node_icon
|
||||
FROM
|
||||
@@ -279,7 +279,7 @@
|
||||
a.dev_Network_Node_MAC_ADDR as parent_mac,
|
||||
a.dev_Icon as node_icon
|
||||
FROM Devices a
|
||||
WHERE a.dev_DeviceType in ('AP', 'Gateway', 'Firewall', 'Powerline', 'Switch', 'WLAN', 'PLC', 'Router','USB LAN Adapter', 'USB WIFI Adapter', 'Internet')
|
||||
WHERE a.dev_DeviceType in (".$networkDeviceTypes.")
|
||||
) t1
|
||||
LEFT JOIN
|
||||
(
|
||||
@@ -448,6 +448,7 @@
|
||||
require 'php/templates/footer.php';
|
||||
?>
|
||||
|
||||
|
||||
<script src="lib/treeviz/index.js"></script>
|
||||
<script src="lib/treeviz/require.js"></script>
|
||||
<script src="js/pialert_common.js"></script>
|
||||
@@ -465,11 +466,16 @@
|
||||
"parentMac":item[14],
|
||||
"rowid":item[13],
|
||||
"status":item[10],
|
||||
"childrenQty":item[15]
|
||||
"childrenQty":item[15],
|
||||
"port":item[18]
|
||||
}})
|
||||
|
||||
setCache('devicesListNew', JSON.stringify(devicesListnew))
|
||||
|
||||
// init global variable
|
||||
deviceListGlobal = devicesListnew;
|
||||
|
||||
|
||||
// create tree
|
||||
initTree(getHierarchy());
|
||||
|
||||
@@ -483,20 +489,6 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
// Tree functionality
|
||||
// ---------------------------------------------------------------------------
|
||||
// ---------------------------------------------------------------------------
|
||||
function getDevicesList()
|
||||
{
|
||||
// Read cache
|
||||
devicesList = getCache('devicesListNew');
|
||||
|
||||
if (devicesList != '') {
|
||||
devicesList = JSON.parse (devicesList);
|
||||
} else {
|
||||
devicesList = [];
|
||||
}
|
||||
return devicesList;
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
var leafNodesCount = 0;
|
||||
@@ -504,6 +496,7 @@
|
||||
var parentNodesCount = 0;
|
||||
var hiddenMacs = []; // hidden children
|
||||
var hiddenChildren = [];
|
||||
var deviceListGlobal = null;
|
||||
|
||||
|
||||
|
||||
@@ -541,6 +534,7 @@
|
||||
name: node.name,
|
||||
path: path,
|
||||
mac: node.mac,
|
||||
port: node.port,
|
||||
id: node.mac,
|
||||
parentMac: node.parentMac,
|
||||
icon: node.icon,
|
||||
@@ -557,14 +551,13 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function getHierarchy()
|
||||
{
|
||||
list = getDevicesList();
|
||||
|
||||
for(i in list)
|
||||
{
|
||||
|
||||
for(i in deviceListGlobal)
|
||||
{
|
||||
if(list[i].mac == 'Internet')
|
||||
if(deviceListGlobal[i].mac == 'Internet')
|
||||
{
|
||||
return (getChildren(list[i], list, ''))
|
||||
return (getChildren(deviceListGlobal[i], deviceListGlobal, ''))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -585,8 +578,6 @@
|
||||
removeItemFromArray(hiddenMacs, parentMac)
|
||||
}
|
||||
|
||||
list = getDevicesList();
|
||||
|
||||
// updatedTree = myHierarchy;
|
||||
updatedTree = getHierarchy()
|
||||
|
||||
@@ -605,74 +596,115 @@
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Handle network node click - select correct tab in teh bottom table
|
||||
function handleNodeClick(event)
|
||||
{
|
||||
console.log(event.target.offsetParent.offsetParent)
|
||||
|
||||
const targetTabMAC = $(event.target.offsetParent.offsetParent).attr("data-mytreemacmain");
|
||||
|
||||
var targetTab = $(`a[data-mytabmac="${targetTabMAC}"]`);
|
||||
|
||||
// Simulate a click event on the target tab
|
||||
targetTab.click();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
var myTree;
|
||||
var treeAreaHeight = 600;
|
||||
var treeAreaHeight = 800;
|
||||
var emSize;
|
||||
var nodeHeight;
|
||||
var sizeCoefficient = 1
|
||||
|
||||
function initTree(myHierarchy)
|
||||
{
|
||||
{
|
||||
// calculate the font size of the leaf nodes to fit everything into the tree area
|
||||
leafNodesCount == 0 ? 1 : leafNodesCount;
|
||||
emSize = ((600/(20*leafNodesCount)).toFixed(2));
|
||||
emSize = emSize > 1 ? 1 : emSize;
|
||||
|
||||
emSize = ((treeAreaHeight/(25*leafNodesCount)).toFixed(2));
|
||||
emSize = emSize > 1 ? 1 : emSize;
|
||||
|
||||
// nodeHeight = ((emSize*100*0.30).toFixed(0))
|
||||
nodeHeight = ((emSize*100*0.30).toFixed(0))
|
||||
|
||||
$("#networkTree").attr('style', `height:${treeAreaHeight}px; width:${$('.content-header').width()}px`)
|
||||
|
||||
myTree = Treeviz.create({
|
||||
htmlId: "networkTree",
|
||||
|
||||
renderNode: nodeData => {
|
||||
renderNode: nodeData => {
|
||||
var fontSize = "font-size:"+emSize+"em;";
|
||||
|
||||
deviceIcon = (!emptyArr.includes(nodeData.data.icon )) ? "<div class='netIcon ' ><i class='fa fa-"+nodeData.data.icon +"'></i></div>" : "";
|
||||
collapseExpandIcon = nodeData.data.hiddenChildren ? "square-plus" :"square-minus";
|
||||
collapseExpandHtml = (nodeData.data.hasChildren) ? "<div class='netCollapse' style='font-size:"+emSize*2.5+"em;' data-mytreepath='"+nodeData.data.path+"' data-mytreemac='"+nodeData.data.mac+"'><i class='fa fa-"+ collapseExpandIcon +" pointer'></i></div>" : "";
|
||||
statusCss = " netStatus-" + nodeData.data.status;
|
||||
(!emptyArr.includes(nodeData.data.port )) ? port = nodeData.data.port : port = "";
|
||||
|
||||
(port == "" || port == 0 ) ? portBckgIcon = `<i class="fa fa-wifi"></i>` : portBckgIcon = `<i class="fa fa-ethernet"></i>`;
|
||||
|
||||
// Build HTML for individual nodes in the network diagram
|
||||
deviceIcon = (!emptyArr.includes(nodeData.data.icon )) ?
|
||||
`<div class="netIcon">
|
||||
<i class="fa fa-${nodeData.data.icon}"></i>
|
||||
</div>` : "";
|
||||
devicePort = `<div class="netPort"
|
||||
style="width:${emSize*sizeCoefficient}em;height:${emSize*sizeCoefficient}em">
|
||||
${port}</div>
|
||||
<div class="portBckgIcon"
|
||||
style="margin-left:-${emSize*sizeCoefficient}em;">
|
||||
${portBckgIcon}
|
||||
</div>`;
|
||||
collapseExpandIcon = nodeData.data.hiddenChildren ?
|
||||
"square-plus" : "square-minus";
|
||||
|
||||
// generate +/- icon if node has children nodes
|
||||
collapseExpandHtml = nodeData.data.hasChildren ?
|
||||
`<div class="netCollapse"
|
||||
style="font-size:${emSize*sizeCoefficient}em;top:${1/2*emSize*sizeCoefficient}em"
|
||||
data-mytreepath="${nodeData.data.path}"
|
||||
data-mytreemac="${nodeData.data.mac}">
|
||||
<i class="fa fa-${collapseExpandIcon} pointer"></i>
|
||||
</div>` : "";
|
||||
|
||||
selectedNodeMac = $(".nav-tabs-custom .active a").attr('data-mytabmac')
|
||||
|
||||
highlightedCss = nodeData.data.mac == selectedNodeMac ? " highlightedNode" : "";
|
||||
highlightedCss = nodeData.data.mac == selectedNodeMac ?
|
||||
" highlightedNode" : "";
|
||||
|
||||
return result = "<div class='box "+statusCss+" "+highlightedCss+"' data-mytreemacmain='"+nodeData.data.mac+"' \
|
||||
style='height:"+nodeData.settings.nodeHeight+"px;\
|
||||
width:180px;\
|
||||
display:flex;\
|
||||
flex-direction:column;\
|
||||
justify-content:center;\
|
||||
" + fontSize + "\
|
||||
align-items:center;\
|
||||
border-radius:5px;'\
|
||||
>\
|
||||
<div class='netNodeText '>\
|
||||
<strong>" + deviceIcon +
|
||||
"<span class='spanNetworkTree anonymizeDev'>"+nodeData.data.name+"</span>\
|
||||
</strong>"
|
||||
+collapseExpandHtml+
|
||||
"</div></div>";
|
||||
},
|
||||
// css indicating online/offline status
|
||||
statusCss = ` netStatus-${nodeData.data.status}`;
|
||||
|
||||
onNodeClick: nodeData => {
|
||||
// console.log(this)
|
||||
},
|
||||
return result = `<div class="box ${nodeData.data.hasChildren ? "pointer":""} ${statusCss} ${highlightedCss}"
|
||||
data-mytreemacmain="${nodeData.data.mac}"
|
||||
style="height:${nodeData.settings.nodeHeight}px;${fontSize}"
|
||||
>
|
||||
<div class="netNodeText">
|
||||
<strong>${devicePort} ${deviceIcon}
|
||||
<span class="spanNetworkTree anonymizeDev">${nodeData.data.name}</span>
|
||||
</strong>
|
||||
${collapseExpandHtml}
|
||||
</div>
|
||||
</div>`;
|
||||
},
|
||||
|
||||
onNodeClick: nodeData => {
|
||||
console.log(this)
|
||||
},
|
||||
mainAxisNodeSpacing: 'auto',
|
||||
// mainAxisNodeSpacing: 3,
|
||||
secondaryAxisNodeSpacing: 0.3,
|
||||
nodeHeight: nodeHeight.toString(),
|
||||
nodeHeight: nodeHeight.toString(),
|
||||
marginTop: '5',
|
||||
hasZoom: false,
|
||||
hasPan: false,
|
||||
// marginLeft: '15',
|
||||
idKey: "id",
|
||||
hasFlatData: false,
|
||||
hasFlatData: false,
|
||||
linkWidth: (nodeData) => 3,
|
||||
relationnalField: "children",
|
||||
linkColor: (nodeData) => "#ffcc80",
|
||||
onNodeClick: (nodeData) => handleNodeClick(nodeData),
|
||||
relationnalField: "children",
|
||||
});
|
||||
|
||||
myTree.refresh(myHierarchy);
|
||||
|
||||
console.log(myHierarchy)
|
||||
|
||||
myTree.refresh(myHierarchy);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -755,10 +787,18 @@
|
||||
// ---------------------------------------------------------------------------
|
||||
function updateLeaf(leafMac,nodeMac)
|
||||
{
|
||||
console.log(leafMac)
|
||||
console.log(nodeMac)
|
||||
saveData('updateNetworkLeaf', leafMac, nodeMac);
|
||||
setTimeout("location.reload();", 1000); // refresh page after 1s
|
||||
console.log(leafMac) // child
|
||||
console.log(nodeMac) // parent
|
||||
|
||||
// prevent the assignment of the Internet root node avoiding recursion when generating the network tree topology
|
||||
if(leafMac.toLowerCase().includes('internet'))
|
||||
{
|
||||
showMessage(getString('Network_Cant_Assign'))
|
||||
}
|
||||
else{
|
||||
saveData('updateNetworkLeaf', leafMac, nodeMac);
|
||||
setTimeout("location.reload();", 500); // refresh page
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ function OpenDB (...$DBPath) {
|
||||
die ('<div style="padding-left:150px">Error connecting to the database</div>');
|
||||
}
|
||||
|
||||
$db->exec('PRAGMA journal_mode = wal;');
|
||||
$db->exec('PRAGMA journal_mode = wal;');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -50,14 +50,13 @@
|
||||
case 'getOwners': getOwners(); break;
|
||||
case 'getDeviceTypes': getDeviceTypes(); break;
|
||||
case 'getGroups': getGroups(); break;
|
||||
case 'getLocations': getLocations(); break;
|
||||
case 'getPholus': getPholus(); break;
|
||||
case 'getNmap': getNmap(); break;
|
||||
case 'saveNmapPort': saveNmapPort(); break;
|
||||
case 'getLocations': getLocations(); break;
|
||||
case 'updateNetworkLeaf': updateNetworkLeaf(); break;
|
||||
case 'overwriteIconType': overwriteIconType(); break;
|
||||
case 'getIcons': getIcons(); break;
|
||||
case 'getActions': getActions(); break;
|
||||
case 'getDevices': getDevices(); break;
|
||||
case 'copyFromDevice': copyFromDevice(); break;
|
||||
case 'wakeonlan': wakeonlan(); break;
|
||||
|
||||
default: logServerConsole ('Action: '. $action); break;
|
||||
@@ -469,71 +468,66 @@ function ExportCSV() {
|
||||
// Import CSV of devices
|
||||
//------------------------------------------------------------------------------
|
||||
function ImportCSV() {
|
||||
|
||||
|
||||
$file = '../../../config/devices.csv';
|
||||
|
||||
if (file_exists($file)) {
|
||||
|
||||
global $db;
|
||||
|
||||
$skipped = "";
|
||||
$error = "";
|
||||
|
||||
// sql
|
||||
$sql = 'DELETE FROM Devices';
|
||||
|
||||
// execute sql
|
||||
$result = $db->query($sql);
|
||||
|
||||
// Read the CSV file
|
||||
$data = file_get_contents($file);
|
||||
$data = explode("\n", $data);
|
||||
$lines = explode("\n", $data);
|
||||
|
||||
$columns = getDevicesColumns();
|
||||
// Get the column headers from the first line of the CSV
|
||||
$header = str_getcsv(array_shift($lines));
|
||||
$header = array_map('trim', $header);
|
||||
|
||||
// Delete everything form the DB table
|
||||
$sql = 'DELETE FROM Devices';
|
||||
$result = $db->query($sql);
|
||||
|
||||
// Build the SQL statement
|
||||
$sql = "INSERT INTO Devices (" . implode(', ', $header) . ") VALUES ";
|
||||
|
||||
|
||||
// Parse data from CSV file line by line (max 10000 lines)
|
||||
foreach($data as $row)
|
||||
{
|
||||
// Check if not empty and skipping first line
|
||||
$rowArray = explode(',',$row);
|
||||
$index = 0;
|
||||
foreach($lines as $row) {
|
||||
$rowArray = str_getcsv($row);
|
||||
|
||||
if(count($rowArray) > 20)
|
||||
{
|
||||
$cleanMac = str_replace("\"","",$rowArray[0]);
|
||||
|
||||
if(filter_var($cleanMac , FILTER_VALIDATE_MAC) == True || $cleanMac == "Internet")
|
||||
{
|
||||
$sql = "INSERT INTO Devices (".implode(',', $columns).") VALUES (" . $row.")";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// check result
|
||||
if ($result != TRUE) {
|
||||
$error = $db->lastErrorMsg();
|
||||
// break the while loop on error
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (count($rowArray) === count($header)) {
|
||||
// Make sure the number of columns matches the header
|
||||
$rowArray = array_map(function ($value) {
|
||||
return "'" . SQLite3::escapeString(trim($value)) . "'";
|
||||
}, $rowArray);
|
||||
|
||||
$sql .= "(" . implode(', ', $rowArray) . "), ";
|
||||
} else {
|
||||
$skipped .= ($index + 1) . ",";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if($error == "")
|
||||
{
|
||||
// import succesful
|
||||
echo lang('BackDevices_DBTools_ImportCSV');
|
||||
|
||||
$index++;
|
||||
}
|
||||
else{
|
||||
// an error occurred while writing to the DB, display the last error message
|
||||
echo lang('BackDevices_DBTools_ImportCSVError')."\n\n$sql \n\n".$result;
|
||||
|
||||
// Remove the trailing comma and space from SQL
|
||||
$sql = rtrim($sql, ', ');
|
||||
|
||||
// Execute the SQL query
|
||||
$result = $db->query($sql);
|
||||
|
||||
if($error === "") {
|
||||
// Import successful
|
||||
echo lang('BackDevices_DBTools_ImportCSV') . " (Skipped lines: " . $skipped . ") ";
|
||||
} else {
|
||||
// An error occurred while writing to the DB, display the last error message
|
||||
echo lang('BackDevices_DBTools_ImportCSVError') . "\n" . $error . "\n" . $sql . "\n\n" . $result;
|
||||
}
|
||||
|
||||
} else {
|
||||
} else {
|
||||
echo lang('BackDevices_DBTools_ImportCSVMissing');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query total numbers of Devices by status
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -602,7 +596,8 @@ function getDevicesList() {
|
||||
array("dev_Network_Node_MAC_ADDR", 14, 14),
|
||||
array("connected_devices", 15, 15),
|
||||
array("dev_Location", 16, 16),
|
||||
array("dev_Vendor", 17, 17)
|
||||
array("dev_Vendor", 17, 17),
|
||||
array("dev_Network_Node_port", 18, 18)
|
||||
);
|
||||
|
||||
if($forceDefaultOrder == FALSE)
|
||||
@@ -651,12 +646,14 @@ function getDevicesList() {
|
||||
$tableData = array();
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
|
||||
$defaultOrder = array ($row['dev_Name'],
|
||||
$defaultOrder = array (
|
||||
$row['dev_Name'],
|
||||
$row['dev_Owner'],
|
||||
handleNull($row['dev_DeviceType']),
|
||||
handleNull($row['dev_Icon'], "laptop"),
|
||||
$row['dev_Favorite'],
|
||||
$row['dev_Group'],
|
||||
// ----
|
||||
formatDate ($row['dev_FirstConnection']),
|
||||
formatDate ($row['dev_LastConnection']),
|
||||
$row['dev_LastIP'],
|
||||
@@ -668,7 +665,8 @@ function getDevicesList() {
|
||||
handleNull($row['dev_Network_Node_MAC_ADDR']),
|
||||
handleNull($row['connected_devices']),
|
||||
handleNull($row['dev_Location']),
|
||||
handleNull($row['dev_Vendor'])
|
||||
handleNull($row['dev_Vendor']),
|
||||
handleNull($row['dev_Network_Node_port'])
|
||||
);
|
||||
|
||||
$newOrder = array();
|
||||
@@ -758,8 +756,13 @@ function getOwners() {
|
||||
function getNetworkNodes() {
|
||||
global $db;
|
||||
|
||||
// Device Data
|
||||
$sql = 'SELECT * FROM Devices WHERE dev_DeviceType in ( "AP", "Gateway", "Firewall", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter")';
|
||||
// Device Data
|
||||
$networkDeviceTypes = str_replace("]", "",(str_replace("[", "", getSettingValue("NETWORK_DEVICE_TYPES"))));
|
||||
|
||||
|
||||
$sql = 'SELECT * FROM Devices WHERE dev_DeviceType in ( '. $networkDeviceTypes .' )';
|
||||
|
||||
// echo $sql;
|
||||
|
||||
$result = $db->query($sql);
|
||||
|
||||
@@ -819,6 +822,36 @@ function getActions() {
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
function getDevices() {
|
||||
|
||||
global $db;
|
||||
|
||||
// Device Data
|
||||
$sql = 'select dev_MAC, dev_Name from Devices';
|
||||
|
||||
$result = $db->query($sql);
|
||||
|
||||
// arrays of rows
|
||||
$tableData = array();
|
||||
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
$name = handleNull($row['dev_Name'], "(unknown)");
|
||||
$mac = handleNull($row['dev_MAC'], "(unknown)");
|
||||
// Push row data
|
||||
$tableData[] = array('id' => $mac,
|
||||
'name' => $name );
|
||||
}
|
||||
|
||||
// Control no rows
|
||||
if (empty($tableData)) {
|
||||
$tableData = [];
|
||||
}
|
||||
|
||||
// Return json
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query the List of types
|
||||
@@ -826,8 +859,6 @@ function getActions() {
|
||||
function getDeviceTypes() {
|
||||
global $db;
|
||||
|
||||
$networkTypes = getNetworkTypes();
|
||||
|
||||
// SQL
|
||||
$sql = 'SELECT DISTINCT 9 as dev_Order, dev_DeviceType
|
||||
FROM Devices
|
||||
@@ -836,7 +867,7 @@ function getDeviceTypes() {
|
||||
"Laptop", "Mini PC", "PC", "Printer", "Server", "Singleboard Computer (SBC)", "NAS",
|
||||
"Domotic", "IP Camera", "Game Console", "SmartTV", "TV Decoder", "Virtual Assistance",
|
||||
"Clock", "House Appliance", "Phone", "Radio",
|
||||
"AP", "Gateway", "Firewall", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter" )
|
||||
"AP", "Gateway", "Firewall", "Hypervisor", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter" )
|
||||
|
||||
UNION SELECT 1 as dev_Order, "Smartphone"
|
||||
UNION SELECT 1 as dev_Order, "Tablet"
|
||||
@@ -865,6 +896,7 @@ function getDeviceTypes() {
|
||||
UNION SELECT 5 as dev_Order, "AP"
|
||||
UNION SELECT 5 as dev_Order, "Gateway"
|
||||
UNION SELECT 5 as dev_Order, "Firewall"
|
||||
UNION SELECT 5 as dev_Order, "Hypervisor"
|
||||
UNION SELECT 5 as dev_Order, "Powerline"
|
||||
UNION SELECT 5 as dev_Order, "Switch"
|
||||
UNION SELECT 5 as dev_Order, "WLAN"
|
||||
@@ -971,134 +1003,11 @@ function getLocations() {
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query the List of Pholus entries
|
||||
//------------------------------------------------------------------------------
|
||||
function getPholus() {
|
||||
global $db;
|
||||
|
||||
// SQL
|
||||
$mac = $_REQUEST['mac'];
|
||||
|
||||
if ($mac == "Internet") // Not performing data lookup for router (improvement idea for later maybe)
|
||||
{
|
||||
echo "false";
|
||||
return;
|
||||
}
|
||||
|
||||
if (false === filter_var($mac , FILTER_VALIDATE_MAC)) {
|
||||
throw new Exception('Invalid mac address');
|
||||
}
|
||||
else{
|
||||
$sql = 'SELECT * from Pholus_Scan where MAC ="'.$mac.'" and Record_Type not in ("Question")';
|
||||
|
||||
// array
|
||||
$tableData = array();
|
||||
|
||||
// execute query
|
||||
$result = $db->query($sql);
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)){
|
||||
// Push row data
|
||||
$tableData[] = array( 'Index' => $row['Index'],
|
||||
'Info' => $row['Info'],
|
||||
'Time' => $row['Time'],
|
||||
'MAC' => $row['MAC'],
|
||||
'IP_v4_or_v6' => $row['IP_v4_or_v6'],
|
||||
'Record_Type' => $row['Record_Type'],
|
||||
'Value' => $row['Value'],
|
||||
'Extra' => $row['Extra']);
|
||||
}
|
||||
|
||||
if(count($tableData) == 0)
|
||||
{
|
||||
echo "false";
|
||||
} else{
|
||||
// Return json
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query the List of Nmap entries
|
||||
//------------------------------------------------------------------------------
|
||||
function getNmap() {
|
||||
global $db;
|
||||
|
||||
// SQL
|
||||
$mac = $_REQUEST['mac'];
|
||||
|
||||
if ($mac == "Internet") // Not performing data lookup for router (improvement idea for later maybe)
|
||||
{
|
||||
echo "false";
|
||||
return;
|
||||
}
|
||||
|
||||
if (false === filter_var($mac , FILTER_VALIDATE_MAC)) {
|
||||
throw new Exception('Invalid mac address');
|
||||
}
|
||||
else{
|
||||
// $sql = 'SELECT * from Nmap_Scan where MAC ="'.$mac.'" ';
|
||||
$sql = 'select * from (select * from Nmap_Scan INNER JOIN Devices on Nmap_Scan.MAC = Devices.dev_MAC) where MAC = "'.$mac.'" ';
|
||||
|
||||
// array
|
||||
$tableData = array();
|
||||
|
||||
// execute query
|
||||
$result = $db->query($sql);
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)){
|
||||
// Push row data
|
||||
$tableData[] = array( 'Index' => $row['Index'],
|
||||
'MAC' => $row['MAC'],
|
||||
'Port' => $row['Port'],
|
||||
'Time' => $row['Time'],
|
||||
'State' => $row['State'],
|
||||
'Service' => $row['Service'],
|
||||
'IP' => $row['dev_LastIP'],
|
||||
'Extra' => $row['Extra']);
|
||||
}
|
||||
|
||||
if(count($tableData) == 0)
|
||||
{
|
||||
echo "false";
|
||||
} else{
|
||||
// Return json
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
|
||||
function saveNmapPort()
|
||||
{
|
||||
|
||||
$portIndex = $_REQUEST['id'];
|
||||
$value = $_REQUEST['value'];
|
||||
|
||||
if(is_integer((int)$portIndex))
|
||||
{
|
||||
global $db;
|
||||
// sql
|
||||
$sql = 'UPDATE Nmap_Scan SET "Extra" = "'. $value .'" WHERE "Index"=' . $portIndex ;
|
||||
// update Data
|
||||
$result = $db->query($sql);
|
||||
|
||||
// check result
|
||||
if ($result == TRUE) {
|
||||
echo 'OK';
|
||||
} else {
|
||||
echo 'KO';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
function updateNetworkLeaf()
|
||||
{
|
||||
$nodeMac = $_REQUEST['value'];
|
||||
$leafMac = $_REQUEST['id'];
|
||||
$nodeMac = $_REQUEST['value']; // parent
|
||||
$leafMac = $_REQUEST['id']; // child
|
||||
|
||||
if ((false === filter_var($nodeMac , FILTER_VALIDATE_MAC) && $nodeMac != "Internet" && $nodeMac != "") || false === filter_var($leafMac , FILTER_VALIDATE_MAC) ) {
|
||||
throw new Exception('Invalid mac address');
|
||||
@@ -1169,6 +1078,56 @@ function wakeonlan() {
|
||||
echo lang('BackDevDetail_Tools_WOL_okay');
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Copy from device
|
||||
//------------------------------------------------------------------------------
|
||||
function copyFromDevice() {
|
||||
|
||||
$MAC_FROM = $_REQUEST['macFrom'];
|
||||
$MAC_TO = $_REQUEST['macTo'];
|
||||
|
||||
if ((false === filter_var($MAC_FROM , FILTER_VALIDATE_MAC) && $MAC_FROM != "Internet" && $MAC_FROM != "") ) {
|
||||
throw new Exception('Invalid mac address');
|
||||
}
|
||||
if ((false === filter_var($MAC_TO , FILTER_VALIDATE_MAC) && $MAC_TO != "Internet" && $MAC_TO != "") ) {
|
||||
throw new Exception('Invalid mac address');
|
||||
}
|
||||
|
||||
global $db;
|
||||
|
||||
// clean-up temporary table
|
||||
$sql = "DROP TABLE temp_devices ";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// create temporary table with the source data
|
||||
$sql = "CREATE TABLE temp_devices AS SELECT * FROM Devices WHERE dev_MAC = '". $MAC_FROM . "';";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// update temporary table with the correct target MAC
|
||||
$sql = "UPDATE temp_devices SET dev_MAC = '". $MAC_TO . "';";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// delete previous entry
|
||||
$sql = "DELETE FROM Devices WHERE dev_MAC = '". $MAC_TO . "';";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// insert new entry with the correct target MAC from the temporary table
|
||||
$sql = "INSERT INTO Devices SELECT * FROM temp_devices WHERE dev_MAC = '".$MAC_TO."'";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// clean-up temporary table
|
||||
$sql = "DROP TABLE temp_devices ";
|
||||
$result = $db->query($sql);
|
||||
|
||||
// check result
|
||||
if ($result == TRUE) {
|
||||
echo 'OK';
|
||||
} else {
|
||||
echo lang('BackDevices_Device_UpdDevError');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Status Where conditions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
49
front/php/server/internetinfo.php
Executable file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
###################################################################################
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# internetinfo.php # Front module. Server side. System Information #
|
||||
###################################################################################
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob#sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
###################################################################################
|
||||
|
||||
// Get init.php
|
||||
require dirname(__FILE__).'/../server/init.php';
|
||||
|
||||
// Perform a test with the PING command
|
||||
$output = shell_exec("curl ipinfo.io");
|
||||
|
||||
// Check if there is error
|
||||
if (!isset($output) || empty($output)) {
|
||||
// Error message
|
||||
$output = lang('DevDetail_Tab_Tool_Internet_Info_Error');
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Replace "{" with ""
|
||||
$output = str_replace("{", "", $output);
|
||||
|
||||
// Replace "}" with ""
|
||||
$output = str_replace("}", "", $output);
|
||||
|
||||
// Replace "," with ""
|
||||
$output = str_replace(",", "", $output);
|
||||
|
||||
// Replace '"' with ""
|
||||
$output = str_replace('"', "", $output);
|
||||
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
|
||||
?>
|
||||
40
front/php/server/nslookup.php
Executable file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
###################################################################################
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# nslookup.php # Front module. Server side. System Information #
|
||||
###################################################################################
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob#sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
###################################################################################
|
||||
|
||||
// Get init.php
|
||||
require dirname(__FILE__).'/../server/init.php';
|
||||
|
||||
// Get IP
|
||||
$ip = $_GET['ip'];
|
||||
|
||||
// Check if IP is valid
|
||||
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
|
||||
// Error message
|
||||
$output = lang('DevDetail_Tab_Tools_Nslookup_Error');
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Test with the "nslookup" command
|
||||
$output = shell_exec("nslookup $ip");
|
||||
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
|
||||
?>
|
||||
@@ -1,10 +1,11 @@
|
||||
<?php
|
||||
require dirname(__FILE__).'/../server/init.php';
|
||||
exec('../../../back/speedtest-cli --secure --simple', $output);
|
||||
|
||||
echo '<h4>Speedtest Results</h4>';
|
||||
echo '<h4>'. lang('Speedtest_Results') .'</h4>';
|
||||
echo '<pre style="border: none;">';
|
||||
foreach($output as $line){
|
||||
echo $line . "\n";
|
||||
}
|
||||
echo '</pre>';
|
||||
?>
|
||||
?>
|
||||
|
||||
40
front/php/server/traceroute.php
Executable file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
###################################################################################
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# traceroute.php # Front module. Server side. System Information #
|
||||
###################################################################################
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
###################################################################################
|
||||
|
||||
// Get init.php
|
||||
require dirname(__FILE__).'/../server/init.php';
|
||||
|
||||
// Get IP
|
||||
$ip = $_GET['ip'];
|
||||
|
||||
// Check if IP is valid
|
||||
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
|
||||
// Error message
|
||||
$output = lang('DevDetail_Tab_Tools_Traceroute_Error');
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Test with the "Traceroute" command
|
||||
$output = shell_exec("traceroute $ip");
|
||||
|
||||
// Show the result
|
||||
echo "<pre>";
|
||||
echo $output;
|
||||
echo "</pre>";
|
||||
|
||||
?>
|
||||
@@ -13,28 +13,47 @@ require dirname(__FILE__).'/../templates/skinUI.php';
|
||||
|
||||
$FUNCTION = [];
|
||||
$SETTINGS = [];
|
||||
$ACTION = "";
|
||||
|
||||
// init request params
|
||||
if(array_key_exists('function', $_REQUEST) != FALSE)
|
||||
{
|
||||
$FUNCTION = $_REQUEST['function'];
|
||||
}
|
||||
|
||||
if(array_key_exists('settings', $_REQUEST) != FALSE)
|
||||
{
|
||||
$SETTINGS = $_REQUEST['settings'];
|
||||
}
|
||||
|
||||
|
||||
// call functions based on requested params
|
||||
if ($FUNCTION == 'savesettings')
|
||||
{
|
||||
saveSettings();
|
||||
}
|
||||
elseif ($FUNCTION == 'cleanLog')
|
||||
{
|
||||
cleanLog($SETTINGS);
|
||||
switch ($FUNCTION) {
|
||||
case 'savesettings':
|
||||
|
||||
saveSettings();
|
||||
break;
|
||||
|
||||
case 'cleanLog':
|
||||
|
||||
cleanLog($SETTINGS);
|
||||
break;
|
||||
|
||||
case 'addToExecutionQueue':
|
||||
|
||||
if(array_key_exists('action', $_REQUEST) != FALSE)
|
||||
{
|
||||
$ACTION = $_REQUEST['action'];
|
||||
}
|
||||
|
||||
addToExecutionQueue($ACTION);
|
||||
break;
|
||||
|
||||
default:
|
||||
// Handle any other cases or errors if needed
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Formatting data functions
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -195,6 +214,25 @@ function displayMessage($message, $logAlert = FALSE, $logConsole = TRUE, $logFil
|
||||
|
||||
}
|
||||
|
||||
// Adds an action to perform into the execution_queue.log file
|
||||
function addToExecutionQueue($action)
|
||||
{
|
||||
global $logFolderPath, $timestamp;
|
||||
|
||||
$logFile = 'execution_queue.log';
|
||||
$fullPath = $logFolderPath . $logFile;
|
||||
|
||||
// Open the file or skip if it can't be opened
|
||||
if ($file = fopen($fullPath, 'a')) {
|
||||
fwrite($file, "[" . $timestamp . "]|" . $action . PHP_EOL);
|
||||
fclose($file);
|
||||
displayMessage('Action "'.$action.'" added to the execution queue.', false, true, true, true);
|
||||
} else {
|
||||
displayMessage('Log file not found or couldn\'t be created.', false, true, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
function cleanLog($logFile)
|
||||
{
|
||||
@@ -202,7 +240,7 @@ function cleanLog($logFile)
|
||||
|
||||
$path = "";
|
||||
|
||||
$allowedFiles = ['pialert.log', 'pialert_front.log', 'IP_changes.log', 'stdout.log', 'stderr.log', "pialert_pholus_lastrun.log"];
|
||||
$allowedFiles = ['pialert.log', 'pialert_front.log', 'IP_changes.log', 'stdout.log', 'stderr.log', "pialert_pholus_lastrun.log", 'pialert.php_errors.log'];
|
||||
|
||||
if(in_array($logFile, $allowedFiles))
|
||||
{
|
||||
@@ -229,7 +267,7 @@ function saveSettings()
|
||||
{
|
||||
global $SETTINGS, $FUNCTION, $config_file, $fullConfPath, $configFolderPath, $timestamp;
|
||||
|
||||
// save in the file
|
||||
// save to the file
|
||||
$new_name = $config_file.'_'.$timestamp.'.backup';
|
||||
$new_location = $configFolderPath.$new_name;
|
||||
|
||||
@@ -259,56 +297,68 @@ function saveSettings()
|
||||
$txt = $txt."#-----------------AUTOGENERATED FILE-----------------#\n";
|
||||
|
||||
// collect all groups
|
||||
foreach ($SETTINGS as $setting) {
|
||||
|
||||
$decodedSettings = json_decode($SETTINGS, true);
|
||||
|
||||
foreach ($decodedSettings as $setting) {
|
||||
if( in_array($setting[0] , $groups) == false) {
|
||||
array_push($groups ,$setting[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// go thru the groups and prepare settings to write to file
|
||||
foreach($groups as $group)
|
||||
{
|
||||
$txt = $txt."\n\n# ".$group;
|
||||
$txt = $txt."\n#---------------------------\n" ;
|
||||
foreach($SETTINGS as $setting)
|
||||
{
|
||||
if($group == $setting[0])
|
||||
{
|
||||
if($setting[2] == 'text' or $setting[2] == 'password' or $setting[2] == 'readonly' or $setting[2] == 'selecttext')
|
||||
{
|
||||
$val = encode_single_quotes($setting[3]);
|
||||
$txt = $txt.$setting[1]."='".$val."'\n" ;
|
||||
} elseif($setting[2] == 'integer' or $setting[2] == 'selectinteger')
|
||||
{
|
||||
$txt = $txt.$setting[1]."=".$setting[3]."\n" ;
|
||||
} elseif($setting[2] == 'boolean')
|
||||
{
|
||||
$val = "False";
|
||||
if($setting[3] == 'true')
|
||||
{
|
||||
$val = "True";
|
||||
}
|
||||
$txt = $txt.$setting[1]."=".$val."\n" ;
|
||||
}elseif($setting[2] == 'multiselect' or $setting[2] == 'subnets' or $setting[2] == 'list')
|
||||
{
|
||||
$temp = '[';
|
||||
|
||||
if (count($setting) > 3 && is_array( $setting[3]) == True){
|
||||
foreach($setting[3] as $val)
|
||||
{
|
||||
$temp = $temp."'". encode_single_quotes($val)."',";
|
||||
foreach ($groups as $group) {
|
||||
$txt .= "\n\n# " . $group;
|
||||
$txt .= "\n#---------------------------\n";
|
||||
|
||||
foreach ($decodedSettings as $setting) {
|
||||
$settingGroup = $setting[0];
|
||||
$settingKey = $setting[1];
|
||||
$settingType = $setting[2];
|
||||
$settingValue = $setting[3];
|
||||
|
||||
if ($group == $settingGroup) {
|
||||
if ($settingType == 'text' || $settingType == 'password' || $settingType == 'readonly' || $settingType == 'text.select') {
|
||||
$val = encode_single_quotes($settingValue);
|
||||
$txt .= $settingKey . "='" . $val . "'\n";
|
||||
} elseif ($settingType == 'integer' || $settingType == 'integer.select') {
|
||||
$txt .= $settingKey . "=" . $settingValue . "\n";
|
||||
} elseif ($settingType == 'boolean' || $settingType == 'integer.checkbox') {
|
||||
|
||||
if ($settingValue === true || $settingValue === 1 || strtolower($settingValue) === 'true') {
|
||||
$val = "True";
|
||||
} else {
|
||||
$val = "False";
|
||||
}
|
||||
|
||||
$txt .= $settingKey . "=" . $val . "\n";
|
||||
} elseif ($settingType == 'text.multiselect' || $settingType == 'subnets' || $settingType == 'list') {
|
||||
$temp = '';
|
||||
|
||||
if(is_array($settingValue) == FALSE)
|
||||
{
|
||||
$settingValue = json_decode($settingValue);
|
||||
}
|
||||
|
||||
if (count($setting) > 3 && is_array($settingValue) == true) {
|
||||
foreach ($settingValue as $val) {
|
||||
$temp .= "'" . encode_single_quotes($val) . "',";
|
||||
}
|
||||
|
||||
$temp = substr_replace($temp, "", -1); // remove last comma ','
|
||||
}
|
||||
|
||||
$temp = '['.$temp.']'; // wrap brackets
|
||||
$txt .= $settingKey . "=" . $temp . "\n";
|
||||
} elseif ($settingType == 'json') {
|
||||
$txt .= $settingKey . "=" . $settingValue . "\n";
|
||||
}
|
||||
|
||||
$temp = substr_replace($temp, "", -1); // remove last comma ','
|
||||
}
|
||||
|
||||
$temp = $temp.']'; // close brackets
|
||||
$txt = $txt.$setting[1]."=".$temp."\n" ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
$txt = $txt."\n\n";
|
||||
$txt = $txt."#-------------------IMPORTANT INFO-------------------#\n";
|
||||
$txt = $txt."# This file is ingested by a python script, so if #\n";
|
||||
@@ -316,13 +366,18 @@ function saveSettings()
|
||||
$txt = $txt."#-------------------IMPORTANT INFO-------------------#\n";
|
||||
|
||||
// open new file and write the new configuration
|
||||
$newConfig = fopen($fullConfPath, "w") or die("Unable to open file!");
|
||||
fwrite($newConfig, $txt);
|
||||
fclose($newConfig);
|
||||
// Create a temporary file
|
||||
$tempConfPath = $fullConfPath . ".tmp";
|
||||
|
||||
displayMessage("<br/>Settings saved to the <code>".$config_file."</code> file.
|
||||
<br/><br/>Backup of the previous ".$config_file." created here: <br/><br/><code>".$new_name."</code><br/><br/>
|
||||
<b>Note:</b> Wait at least <b>5s</b> for the changes to reflect in the UI. (longer if for example a <a href='#state'>Scan is running</a>)",
|
||||
// Write your changes to the temporary file
|
||||
$tempConfig = fopen($tempConfPath, "w") or die("Unable to open file!");
|
||||
fwrite($tempConfig, $txt);
|
||||
fclose($tempConfig);
|
||||
|
||||
// Replace the original file with the temporary file
|
||||
rename($tempConfPath, $fullConfPath);
|
||||
|
||||
displayMessage("<br/>Settings saved to the <code>pialert.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
|
||||
FALSE, TRUE, TRUE, TRUE);
|
||||
|
||||
}
|
||||
@@ -339,6 +394,38 @@ function getString ($codeName, $default) {
|
||||
|
||||
return $default;
|
||||
}
|
||||
// -------------------------------------------------------------------------------------------
|
||||
function getSettingValue($codeName) {
|
||||
// Define the JSON endpoint URL
|
||||
$url = dirname(__FILE__).'/../../../front/api/table_settings.json';
|
||||
|
||||
// Fetch the JSON data
|
||||
$json = file_get_contents($url);
|
||||
|
||||
// Check if the JSON data was successfully fetched
|
||||
if ($json === false) {
|
||||
return 'Could not get json data';
|
||||
}
|
||||
|
||||
// Decode the JSON data
|
||||
$data = json_decode($json, true);
|
||||
|
||||
// Check if the JSON decoding was successful
|
||||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||
return 'Could not decode json data';
|
||||
}
|
||||
|
||||
// Search for the setting by Code_Name
|
||||
foreach ($data['data'] as $setting) {
|
||||
if ($setting['Code_Name'] === $codeName) {
|
||||
return $setting['Value'];
|
||||
// echo $setting['Value'];
|
||||
}
|
||||
}
|
||||
|
||||
// Return false if the setting was not found
|
||||
return 'Could not find setting '.$codeName;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -353,10 +440,39 @@ function encode_single_quotes ($val) {
|
||||
// -------------------------------------------------------------------------------------------
|
||||
|
||||
function getDateFromPeriod () {
|
||||
$period = $_REQUEST['period'];
|
||||
return '"'. date ('Y-m-d', strtotime ('+1 day -'. $period) ) .'"';
|
||||
|
||||
$periodDate = $_REQUEST['period'];
|
||||
|
||||
$periodDateSQL = "";
|
||||
$days = "";
|
||||
|
||||
switch ($periodDate) {
|
||||
case '7 days':
|
||||
$days = "7";
|
||||
break;
|
||||
case '1 month':
|
||||
$days = "30";
|
||||
break;
|
||||
case '1 year':
|
||||
$days = "365";
|
||||
break;
|
||||
case '100 years':
|
||||
$days = "3650"; //10 years
|
||||
break;
|
||||
default:
|
||||
$days = "1";
|
||||
}
|
||||
|
||||
$periodDateSQL = "-".$days." day";
|
||||
|
||||
return " date('now', '".$periodDateSQL."') ";
|
||||
|
||||
// $period = $_REQUEST['period'];
|
||||
// return '"'. date ('Y-m-d', strtotime ('+2 day -'. $period) ) .'"';
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
function quotes ($text) {
|
||||
return str_replace ('"','""',$text);
|
||||
@@ -380,16 +496,7 @@ function handleNull ($text, $default = "") {
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
|
||||
function getNetworkTypes(){
|
||||
|
||||
$array = array(
|
||||
"AP", "Gateway", "Firewall", "Powerline", "Switch", "WLAN", "PLC", "Router","USB LAN Adapter", "USB WIFI Adapter"
|
||||
);
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------------
|
||||
function getDevicesColumns(){
|
||||
|
||||
13
front/php/server/utilDB.php
Executable file
@@ -0,0 +1,13 @@
|
||||
<!-- utils needing a DB connection -->
|
||||
|
||||
<?php
|
||||
|
||||
require dirname(__FILE__).'/init.php';
|
||||
|
||||
// Action functions
|
||||
if (isset ($_REQUEST['key']))
|
||||
{
|
||||
echo lang($_REQUEST['key']);
|
||||
}
|
||||
|
||||
?>
|
||||
21
front/php/templates/build.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# build.php - Templates module Template to display the current build version #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
|
||||
$file = "/home/pi/pialert/front/buildtimestamp.txt";
|
||||
if (file_exists($file)) {
|
||||
echo date("Y-m-d", ((int)file_get_contents($file)));
|
||||
}
|
||||
else {
|
||||
echo "File not found";
|
||||
}
|
||||
?>
|
||||
@@ -1,32 +1,34 @@
|
||||
<!-- ---------------------------------------------------------------------------
|
||||
# Pi.Alert
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector
|
||||
#
|
||||
# footer.php - Front module. Common footer to all the web pages
|
||||
#-------------------------------------------------------------------------------
|
||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
||||
#--------------------------------------------------------------------------- -->
|
||||
<!--
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Pi.Alert #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# footer.php - Front module. Common footer to all the web pages #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
-->
|
||||
|
||||
<!-- Main Footer -->
|
||||
<footer class="main-footer">
|
||||
<!-- Default to the left -->
|
||||
|
||||
<!-- © 2020 Puche -->
|
||||
<span style="display:inline-block; transform: rotate(180deg)">©</span>
|
||||
|
||||
2020 Puche (2022+ <a href="mailto:jokob@duck.com?subject=PiAlert">jokob-sk</a>)
|
||||
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/docs" target="_blank">
|
||||
<span>Docs <i class="fa fa-circle-question"></i>
|
||||
</a><span>
|
||||
<!-- © 2022 jokob-sk -->
|
||||
<span style="display:inline-block; transform: rotate(180deg)">©</span>
|
||||
2020 Puche (2022+ <a href="mailto:jokob@duck.com?subject=PiAlert">jokob-sk</a>) | <b><?= lang('Maintenance_built_on');?>: </b>
|
||||
<?php include 'php/templates/build.php'; ?> | <b> Version: </b> <?php include 'php/templates/version.php'; ?> |
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/docs" target="_blank"><span>Docs <i class="fa fa-circle-question"></i></a>
|
||||
<span>
|
||||
|
||||
<!-- To the right -->
|
||||
<div class="pull-right no-hidden-xs">
|
||||
|
||||
<!-- Pi.Alert 2.50 <small>(2019-12-30)</small> -->
|
||||
<?php
|
||||
echo 'Pi.Alert';
|
||||
?>
|
||||
<!-- Pi.Alert footer with url -->
|
||||
<a href="https://github.com/jokob-sk/Pi.Alert" target="_blank">Pi.Alert</a>
|
||||
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@@ -36,9 +38,7 @@
|
||||
|
||||
</div>
|
||||
<!-- ./wrapper -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Bootstrap 3.3.7 -->
|
||||
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
|
||||
|
||||
@@ -8,15 +8,43 @@ $Pia_Graph_Device_Online = array();
|
||||
$Pia_Graph_Device_Down = array();
|
||||
$Pia_Graph_Device_Arch = array();
|
||||
|
||||
$statusesToShow = "'online', 'offline', 'archived'";
|
||||
|
||||
$statQuery = $db->query("SELECT * FROM Settings WHERE Code_Name = 'UI_PRESENCE'");
|
||||
|
||||
while($r = $statQuery->fetchArray(SQLITE3_ASSOC))
|
||||
{
|
||||
$statusesToShow = $r['Value'];
|
||||
}
|
||||
|
||||
$results = $db->query('SELECT * FROM Online_History ORDER BY Scan_Date DESC LIMIT 144');
|
||||
while ($row = $results->fetchArray()) {
|
||||
$time_raw = explode(' ', $row['Scan_Date']);
|
||||
$time = explode(':', $time_raw[1]);
|
||||
array_push($Pia_Graph_Device_Time, $time[0].':'.$time[1]);
|
||||
array_push($Pia_Graph_Device_Down, $row['Down_Devices']);
|
||||
array_push($Pia_Graph_Device_All, $row['All_Devices']);
|
||||
array_push($Pia_Graph_Device_Online, $row['Online_Devices']);
|
||||
array_push($Pia_Graph_Device_Arch, $row['Archived_Devices']);
|
||||
|
||||
while ($row = $results->fetchArray())
|
||||
{
|
||||
$time_raw = explode(' ', $row['Scan_Date']);
|
||||
$time = explode(':', $time_raw[1]);
|
||||
array_push($Pia_Graph_Device_Time, $time[0].':'.$time[1]);
|
||||
|
||||
// Offline
|
||||
if(strpos($statusesToShow, 'offline') !== false)
|
||||
{
|
||||
array_push($Pia_Graph_Device_Down, $row['Down_Devices']);
|
||||
}
|
||||
|
||||
// All
|
||||
array_push($Pia_Graph_Device_All, $row['All_Devices']);
|
||||
|
||||
// Online
|
||||
if(strpos($statusesToShow, 'online') !== false)
|
||||
{
|
||||
array_push($Pia_Graph_Device_Online, $row['Online_Devices']);
|
||||
}
|
||||
|
||||
// Archived
|
||||
if(strpos($statusesToShow, 'archived') !== false)
|
||||
{
|
||||
array_push($Pia_Graph_Device_Arch, $row['Archived_Devices']);
|
||||
}
|
||||
}
|
||||
function pia_graph_devices_data($Pia_Graph_Array) {
|
||||
$Pia_Graph_Array_rev = array_reverse($Pia_Graph_Array);
|
||||
|
||||
@@ -83,8 +83,13 @@ if ($ENABLED_DARKMODE === True) {
|
||||
<script>
|
||||
|
||||
function updateState(){
|
||||
getParam("state","Back_App_State", true)
|
||||
setTimeout("updateState()", 5000);
|
||||
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
|
||||
|
||||
document.getElementById('state').innerHTML = appState["currentState"].replaceAll('"', '');
|
||||
|
||||
setTimeout("updateState()", 1000);
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
function show_pia_servertime() {
|
||||
@@ -99,12 +104,6 @@ if ($ENABLED_DARKMODE === True) {
|
||||
setTimeout("show_pia_servertime()", 1000);
|
||||
}
|
||||
|
||||
// refresh page on focus - adds a lot of SQL queries overhead onto the DB - disabling for now
|
||||
// document.addEventListener("visibilitychange",()=>{
|
||||
// if(document.visibilityState==="visible"){
|
||||
// window.location.href = window.location.href.split('#')[0];
|
||||
// }
|
||||
// })
|
||||
|
||||
</script>
|
||||
|
||||
@@ -138,9 +137,25 @@ if ($ENABLED_DARKMODE === True) {
|
||||
<!-- Navbar Right Menu -->
|
||||
<div class="navbar-custom-menu">
|
||||
<ul class="nav navbar-nav">
|
||||
<!-- Back Button -->
|
||||
<li>
|
||||
<a id="back-button" href="javascript:history.go(-1);" role="button" span class='of-bt-icon'><i class='fa fa-arrow-left'></i></a>
|
||||
</li>
|
||||
<!-- Next Button -->
|
||||
<li>
|
||||
<a id="next-button" href="javascript:history.go(1);" role="button" span class='of-bt-icon'><i class='fa fa-arrow-right'></i></a>
|
||||
</li>
|
||||
<!-- Reload -->
|
||||
<li>
|
||||
<a id="reload-button" href='#' role="button" span class='of-bt-icon' onclick='location.reload()'><i class='fa fa-repeat'></i></a>
|
||||
</li>
|
||||
<!-- Full Screen -->
|
||||
<li>
|
||||
<a id="fullscreen-button" href='#' role="button" span class='of-bt-icon' onclick='toggleFullscreen()'><i class='fa fa-arrows-alt'></i></a>
|
||||
</li>
|
||||
<!-- Server Status -->
|
||||
<li>
|
||||
<a onclick="setCache('activeMaintenanceTab', 'tab_Logging_id')" href="/maintenance.php#tab_Logging">
|
||||
<a onclick="setCache('activeMaintenanceTab', 'tab_Logging_id')" href="maintenance.php#tab_Logging">
|
||||
<div class="header-status">
|
||||
<code id="state"></code>
|
||||
</div>
|
||||
@@ -207,23 +222,27 @@ if ($ENABLED_DARKMODE === True) {
|
||||
<ul class="sidebar-menu" data-widget="tree">
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('devices.php', 'deviceDetails.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="devices.php"><span><i class="fa fa-laptop"></i> <?= lang('Navigation_Devices');?></span></a>
|
||||
<a href="devices.php"><i class="fa fa-laptop"></i> <span><?= lang('Navigation_Devices');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('presence.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="presence.php"><i class="fa fa-calendar"></i> <?= lang('Navigation_Presence');?></span></a>
|
||||
<a href="presence.php"><i class="fa fa-calendar"></i> <span><?= lang('Navigation_Presence');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('events.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="events.php"><i class="fa fa-bolt"></i> <span><?= lang('Navigation_Events');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('report.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="report.php"><i class="fa fa-flag"></i> <span><?= lang('Navigation_Report');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('network.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="network.php"><span><i class="fa fa-fw fa-network-wired"></i> <?= lang('Navigation_Network');?></span></a>
|
||||
<a href="network.php"><i class="fa fa-fw fa-network-wired"></i> <span><?= lang('Navigation_Network');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('plugins.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="plugins.php"><span><i class="fa fa-fw fa-plug"></i> <?= lang('Navigation_Plugins');?></span></a>
|
||||
<a href="plugins.php"><i class="fa fa-fw fa-plug"></i> <span><?= lang('Navigation_Plugins');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('maintenance.php') ) ){ echo 'active'; } ?>">
|
||||
@@ -233,10 +252,18 @@ if ($ENABLED_DARKMODE === True) {
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('settings.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="settings.php"><i class="fa fa-cog"></i> <span><?= lang('Navigation_Settings');?></span></a>
|
||||
</li>
|
||||
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('help_faq.php') ) ){ echo 'active'; } ?>">
|
||||
<!-- <li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('flows.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="flows.php"><i class="fa fa-shuffle"></i> <span><?= lang('Navigation_Flows');?></span></a>
|
||||
</li> -->
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('systeminfo.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="systeminfo.php"><i class="fa fa-microchip"></i> <span><?= lang('Navigation_SystemInfo');?></span></a>
|
||||
</li>
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('help_faq.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="help_faq.php"><i class="fa fa-question"></i> <span><?= lang('Navigation_HelpFAQ');?></span></a>
|
||||
</li>
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('donations.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="donations.php"><i class="fa fa-heart"></i> <span><?= lang('Navigation_Donations');?></span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- /.sidebar-menu -->
|
||||
@@ -249,26 +276,18 @@ if ($ENABLED_DARKMODE === True) {
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
function getParam(targetId, key, skipCache = false) {
|
||||
|
||||
skipCacheQuery = "";
|
||||
function toggleFullscreen() {
|
||||
|
||||
if(skipCache)
|
||||
{
|
||||
skipCacheQuery = "&skipcache";
|
||||
if (document.fullscreenElement) {
|
||||
document.exitFullscreen();
|
||||
}
|
||||
|
||||
// get parameter value
|
||||
$.get('php/server/parameters.php?action=get&defaultValue=NULL¶meter='+ key + skipCacheQuery, function(data) {
|
||||
var result = data;
|
||||
|
||||
document.getElementById(targetId).innerHTML = result.replaceAll('"', '');
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
else {
|
||||
document.documentElement.requestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
// Update server time in the header
|
||||
@@ -276,7 +295,5 @@ if ($ENABLED_DARKMODE === True) {
|
||||
|
||||
// Update server state in the header
|
||||
updateState()
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
669
front/php/templates/language/de_de.json
Executable file
@@ -0,0 +1,669 @@
|
||||
{
|
||||
"de_de": {
|
||||
"About_Title": "Open Source Network Guard",
|
||||
"About_Design": "Designed for:",
|
||||
"About_Exit": "Sign out",
|
||||
"Gen_Delete": "Löschen",
|
||||
"Gen_Cancel": "Abbrechen",
|
||||
"Gen_Okay": "Ok",
|
||||
"Gen_Purge": "Aufräumen",
|
||||
"Gen_Backup": "Sichern",
|
||||
"Gen_Restore": "Wiederherstellen",
|
||||
"Gen_Switch": "Umschalten",
|
||||
"Gen_AreYouSure": "Sind Sie sich sicher?",
|
||||
"Login_Box": "Passwort eingeben",
|
||||
"Login_Remember": "Passwort speichern",
|
||||
"Login_Remember_small": "(für 7 Tage gültig)",
|
||||
"Login_Submit": "Anmelden",
|
||||
"Login_Psw_run": "Um das Passwort zu ändern nutze:",
|
||||
"Login_Psw_new": "neues_passwort",
|
||||
"Login_Psw_folder": "im Ordner ~/pialert/config",
|
||||
"Login_Psw_alert": "Sicherheitshinweis!",
|
||||
"Login_Psw-box": "Passwort",
|
||||
"Login_Toggle_Info": "Passwort Informationen",
|
||||
"Login_Toggle_Info_headline": "Passwort Information",
|
||||
"Login_Toggle_Alert_headline": "Passwort Warnung!",
|
||||
"Navigation_Devices": "Geräte",
|
||||
"Navigation_Presence": "Anwesenheit",
|
||||
"Navigation_Events": "Ereignisse",
|
||||
"Navigation_Report": "Bericht",
|
||||
"Navigation_Maintenance": "Wartung",
|
||||
"Navigation_Settings": "Einstellungen",
|
||||
"Navigation_SystemInfo": "Systeminfo",
|
||||
"Navigation_Network": "Netzwerk",
|
||||
"Navigation_HelpFAQ": "Hilfe / FAQ",
|
||||
"Device_Title": "Geräte",
|
||||
"Device_Shortcut_AllDevices": "Alle Geräte",
|
||||
"Device_Shortcut_Connected": "Verbunden",
|
||||
"Device_Shortcut_Favorites": "Favoriten",
|
||||
"Device_Shortcut_NewDevices": "Neue Geräte",
|
||||
"Device_Shortcut_DownAlerts": "Down Meldungen",
|
||||
"Device_Shortcut_Archived": "Archiviert",
|
||||
"Device_Shortcut_Devices": "Geräte",
|
||||
"Device_Shortcut_OnlineChart": "Gerätepräsenz im Laufe der Zeit",
|
||||
"Device_TableHead_Name": "Name",
|
||||
"Device_TableHead_Owner": "Eigentümer",
|
||||
"Device_TableHead_Type": "Typ",
|
||||
"Device_TableHead_Favorite": "Favorit",
|
||||
"Device_TableHead_Group": "Gruppe",
|
||||
"Device_TableHead_FirstSession": "Erste Sitzung",
|
||||
"Device_TableHead_LastSession": "Letzte Sitzung",
|
||||
"Device_TableHead_LastIP": "Letzte IP",
|
||||
"Device_TableHead_MAC": "MAC",
|
||||
"Device_TableHead_LastIPOrder": "Last IP Order",
|
||||
"Device_TableHead_Rowid": "Zeilennummer",
|
||||
"Device_TableHead_Status": "Status",
|
||||
"Device_TableHead_Icon": "Icon",
|
||||
"Device_TableHead_Parent_MAC": "Übergeordnete MAC",
|
||||
"Device_TableHead_Connected_Devices": "Verbundene Geräte",
|
||||
"Device_TableHead_Location": "Standort",
|
||||
"Device_TableHead_Vendor": "Hersteller",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_MAC_full": "Gesamte MAC",
|
||||
"Device_Searchbox": "Suche",
|
||||
"Device_Tablelenght": "Zeige _MENU_ Einträge",
|
||||
"Device_Tablelenght_all": "Alle",
|
||||
"Device_Table_info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
||||
"Device_Table_nav_next": "Nächste",
|
||||
"Device_Table_nav_prev": "Zurück",
|
||||
"Presence_Title": "Anwesenheit pro Gerät",
|
||||
"Presence_Loading": "Laden...",
|
||||
"Loading": "Laden...",
|
||||
"Presence_Shortcut_AllDevices": "Alle Geräte",
|
||||
"Presence_Shortcut_Connected": "Verbunden",
|
||||
"Presence_Shortcut_Favorites": "Favoriten",
|
||||
"Presence_Shortcut_NewDevices": "Neue Geräte",
|
||||
"Presence_Shortcut_DownAlerts": "Down Meldungen",
|
||||
"Presence_Shortcut_Archived": "Archiviert",
|
||||
"Presence_Shortcut_Devices": "Geräte",
|
||||
"Presence_CallHead_Devices": "Geräte",
|
||||
"Presence_CalHead_lang": "de",
|
||||
"Presence_CalHead_year": "Jahr",
|
||||
"Presence_CalHead_quarter": "Quartal",
|
||||
"Presence_CalHead_month": "Monat",
|
||||
"Presence_CalHead_week": "Woche",
|
||||
"Presence_CalHead_day": "Tag",
|
||||
"Events_Title": "Ereignisse",
|
||||
"Events_Loading": "Laden...",
|
||||
"Events_Periodselect_today": "Heute",
|
||||
"Events_Periodselect_LastWeek": "Letzte Woche",
|
||||
"Events_Periodselect_LastMonth": "Letzter Monat",
|
||||
"Events_Periodselect_LastYear": "Letztes Jahr",
|
||||
"Events_Periodselect_All": "Alle Ereignisse",
|
||||
"Events_Shortcut_AllEvents": "Alle Ereignisse",
|
||||
"Events_Shortcut_Sessions": "Sitzungen",
|
||||
"Events_Shortcut_MissSessions": "fehlende Sitzungen",
|
||||
"Events_Shortcut_VoidSessions": "beendete Sitzungen",
|
||||
"Events_Shortcut_NewDevices": "Neue Geräte",
|
||||
"Events_Shortcut_DownAlerts": "Down Meldungen",
|
||||
"Events_Shortcut_Events": "Ereignisse",
|
||||
"Events_TableHead_Order": "Order",
|
||||
"Events_TableHead_Device": "Gerät",
|
||||
"Events_TableHead_Owner": "Eigentümer",
|
||||
"Events_TableHead_Date": "Datum",
|
||||
"Events_TableHead_EventType": "Ereignis Typ",
|
||||
"Events_TableHead_Connection": "Verbindung",
|
||||
"Events_TableHead_Disconnection": "Trennung",
|
||||
"Events_TableHead_Duration": "Dauer",
|
||||
"Events_TableHead_DurationOrder": "Duration Order",
|
||||
"Events_TableHead_IP": "IP",
|
||||
"Events_TableHead_IPOrder": "IP Order",
|
||||
"Events_TableHead_AdditionalInfo": "Zusätzliche Info",
|
||||
"Events_Searchbox": "Suche",
|
||||
"Events_Tablelenght": "Zeige _MENU_ Einträge",
|
||||
"Events_Tablelenght_all": "Alle",
|
||||
"Events_Table_info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
||||
"Events_Table_nav_next": "Nächste",
|
||||
"Events_Table_nav_prev": "Zurück",
|
||||
"DevDetail_Loading": "Laden ...",
|
||||
"DevDetail_Periodselect_today": "Heute",
|
||||
"DevDetail_Periodselect_LastWeek": "Letzte Woche",
|
||||
"DevDetail_Periodselect_LastMonth": "Letzter Monat",
|
||||
"DevDetail_Periodselect_LastYear": "Letztes Jahr",
|
||||
"DevDetail_Periodselect_All": "Alle Infos",
|
||||
"DevDetail_Shortcut_CurrentStatus": "aktueller Status",
|
||||
"DevDetail_Shortcut_Sessions": "Sitzungen",
|
||||
"DevDetail_Shortcut_Presence": "Anwesenheit",
|
||||
"DevDetail_Shortcut_DownAlerts": "Down Meldungen",
|
||||
"DevDetail_Tab_Details": "Details",
|
||||
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Tools",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Title": "Internetinformationen",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Description": "Das Internet-Info-Tool zeigt Informationen über die Internetverbindung an, wie z. B. IP-Adresse, Stadt, Land, Ortsvorwahl und Zeitzone.",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Start": "Internet-Info starten",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Error": "Es ist ein Fehler aufgetreten",
|
||||
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup ist ein Befehlszeilentool zur Abfrage des Domain Name System (DNS). DNS ist ein System, das Domainnamen wie www.google.com in IP-Adressen wie 172.217.0.142 übersetzt. ",
|
||||
"DevDetail_Tab_Tools_Nslookup_Start": "Nslookup starten",
|
||||
"DevDetail_Tab_Tools_Nslookup_Error": "Fehler: IP-Adresse ist ungültig",
|
||||
"DevDetail_Tab_Tools_Speedtest_Title": "Speedtest test",
|
||||
"DevDetail_Tab_Tools_Speedtest_Description": "Das Speedtest-Tool misst die Download-Geschwindigkeit, Upload-Geschwindigkeit und Latenz der Internetverbindung.",
|
||||
"DevDetail_Tab_Tools_Speedtest_Start": "Speedtest starten",
|
||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute ist ein Netzwerkdiagnosebefehl, mit dem der Pfad verfolgt wird, den Datenpakete von einem Host zu einem anderen nehmen.<br><br>Der Befehl verwendet das Internet Control Message Protocol (ICMP), um Pakete an Zwischenknoten auf der Route zu senden, jeden Zwischenknoten Der Knoten antwortet mit einem ICMP-Timeout-Paket (TTL-Zeitüberschreitung).<br><br>Die Ausgabe des Traceroute-Befehls zeigt die IP-Adresse jedes Zwischenknotens auf der Route an.<br><br>Die Ausgabe der Traceroute Der Befehl zeigt die IP-Adresse jedes Zwischenknotens auf der Route an.<br><br>Der Befehl „traceroute“ kann zur Diagnose von Netzwerkproblemen wie Verzögerungen, Paketverlust und blockierten Routen verwendet werden.<br><br>Das ist auch möglich kann verwendet werden, um den Standort eines Zwischenknotens in einem Netzwerk zu identifizieren.",
|
||||
"DevDetail_Tab_Tools_Traceroute_Start": "Traceroute starten",
|
||||
"DevDetail_Tab_Tools_Traceroute_Error": "Fehler: IP-Adresse ist ungültig",
|
||||
"DevDetail_Tab_Nmap": "Nmap",
|
||||
"DevDetail_Tab_NmapTableIndex": "Index",
|
||||
"DevDetail_Tab_NmapTableTime": "Zeit",
|
||||
"DevDetail_Tab_NmapTablePort": "Port",
|
||||
"DevDetail_Tab_NmapTableState": "Status",
|
||||
"DevDetail_Tab_NmapTableService": "Dienst",
|
||||
"DevDetail_Tab_NmapTableExtra": "Extra",
|
||||
"DevDetail_Tab_Sessions": "Sitzungen",
|
||||
"DevDetail_Tab_Presence": "Anwesenheit",
|
||||
"DevDetail_Tab_Events": "Ereignisse",
|
||||
"DevDetail_Tab_EventsTableDate": "Datum",
|
||||
"DevDetail_Tab_EventsTableEvent": "Ereignistype",
|
||||
"DevDetail_Tab_EventsTableIP": "IP",
|
||||
"DevDetail_Tab_EventsTableInfo": "Zusätzliche Informationen",
|
||||
"DevDetail_MainInfo_Title": "Haupt Infos",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_MainInfo_Name": "Name",
|
||||
"DevDetail_MainInfo_Owner": "Eigen-­tümer",
|
||||
"DevDetail_MainInfo_Type": "Typ",
|
||||
"DevDetail_MainInfo_Vendor": "Hersteller",
|
||||
"DevDetail_MainInfo_Favorite": "Favorit",
|
||||
"DevDetail_MainInfo_Group": "Gruppe",
|
||||
"DevDetail_MainInfo_Location": "Standort",
|
||||
"DevDetail_MainInfo_Comments": "Notiz",
|
||||
"DevDetail_MainInfo_Network": "Netzwerk Knoten",
|
||||
"DevDetail_MainInfo_Network_Port": "Netzwerk Knoten Port",
|
||||
"DevDetail_SessionInfo_Title": "Sitzungsinfos",
|
||||
"DevDetail_SessionInfo_Status": "Status",
|
||||
"DevDetail_SessionInfo_FirstSession": "Erste Sitzung",
|
||||
"DevDetail_SessionInfo_LastSession": "Letzte Sitzung",
|
||||
"DevDetail_SessionInfo_LastIP": "Letzte IP",
|
||||
"DevDetail_SessionInfo_StaticIP": "Statische IP",
|
||||
"DevDetail_EveandAl_Title": "Ereignisse & Alarme einstellen",
|
||||
"DevDetail_EveandAl_ScanCycle": "Scan Abstand",
|
||||
"DevDetail_EveandAl_AlertAllEvents": "Melde alle Ereignisse",
|
||||
"DevDetail_EveandAl_AlertDown": "Melde Down",
|
||||
"DevDetail_EveandAl_Skip": "pausiere wiederhol. Meldungen für",
|
||||
"DevDetail_EveandAl_NewDevice": "Neues Gerät",
|
||||
"DevDetail_EveandAl_Archived": "Archivierung",
|
||||
"DevDetail_EveandAl_RandomMAC": "Zufällige MAC",
|
||||
"DevDetail_EveandAl_ScanCycle_a": "Gerät scannen",
|
||||
"DevDetail_EveandAl_ScanCycle_z": "Gerät nicht scannen",
|
||||
"DevDetail_button_Delete": "Lösche Gerät",
|
||||
"DevDetail_button_Reset": "Verwerfen",
|
||||
"DevDetail_button_Save": "Speichern",
|
||||
"DevDetail_button_DeleteEvents": "Lösche Events",
|
||||
"DevDetail_button_DeleteEvents_Warning": "Sind Sie sicher, dass Sie alle Ereignisse dieses Geräts löschen möchten? (dies löscht den Ereignisverlauf und die Sitzungen und könnte bei ständigen (anhaltenden) Benachrichtigungen helfen)",
|
||||
"DevDetail_SessionTable_Order": "Order",
|
||||
"DevDetail_SessionTable_Connection": "Verbindung",
|
||||
"DevDetail_SessionTable_Disconnection": "Trennung",
|
||||
"DevDetail_SessionTable_Duration": "Dauer",
|
||||
"DevDetail_SessionTable_IP": "IP",
|
||||
"DevDetail_SessionTable_Additionalinfo": "Zusätzliche Info",
|
||||
"DevDetail_Events_CheckBox": "Blende Verbindungs-Ereignisse aus",
|
||||
"DevDetail_Nmap_buttonFast": "Schneller Scan",
|
||||
"DevDetail_Nmap_buttonDefault": "Standard Scan",
|
||||
"DevDetail_Nmap_buttonDetail": "Detailierter Scan",
|
||||
"DevDetail_Nmap_buttonFast_text": "Schneller Scan: Überprüft nur die wichtigsten 100 Ports (wenige Sekunden)",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Standard Scan: Nmap scannt die ersten 1.000 Ports für jedes angeforderte Scan-Protokoll. Damit werden etwa 93 % der TCP-Ports und 49 % der UDP-Ports erfasst. (ca. 5-10 Sekunden)",
|
||||
"DevDetail_Nmap_buttonDetail_text": "Detailierter Scan: Standardscan mit aktivierter Betriebssystemerkennung, Versionserkennung, Skript-Scan und Traceroute (bis zu 30 oder mehr Sekunden)",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery": "Ohne Erreichbarkeitsprüfung",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery_text": "Ohne Erreichbarkeitsprüfung (-Pn Parameter): Standard Scan bei dem nmap annimmt, dass der Host erreichbar ist.",
|
||||
"DevDetail_Nmap_Scans": "Nmap Scans",
|
||||
"DevDetail_Tab_Plugins": "<i class=\"fa fa-plug\"></i> Plugins",
|
||||
"DevDetail_Tab_NmapTableHeader": "Scheduled scan results",
|
||||
"DevDetail_Tab_NmapTableText": "Set up a schedule in <a href=\"/settings.php#NMAP_ACTIVE\">Settings</a>",
|
||||
"DevDetail_Tab_NmapEmpty": "No ports detected with Nmap on this device.",
|
||||
"DevDetail_Owner_hover": "Who owns this device. Free text field.",
|
||||
"DevDetail_Type_hover": "The Type of the device. If you select any of the pre-defined network devices (e.g.: AP, Firewall, Router, Switch...) they will show up in the Network tree configuration as possible parent network nodes.",
|
||||
"DevDetail_Icon": "Icon",
|
||||
"DevDetail_Icon_Descr": "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
|
||||
"DevDetail_Vendor_hover": "Vendor should be auto-detected. You can overwrite or add your custom value.",
|
||||
"DevDetail_MainInfo_Network_Title": "<i class=\"fa fa-network-wired\"></i> Network",
|
||||
"DevDetail_Network_Node_hover": "Select the parent network device the current device is connected to to populate the Network tree.",
|
||||
"DevDetail_GoToNetworkNode": "Navigate to the Network page of the given node.",
|
||||
"DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
|
||||
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
|
||||
"DevDetail_button_OverwriteIcons": "Overwrite Icons",
|
||||
"DevDetail_button_OverwriteIcons_Tooltip": "Overwrite icons of all devices with the same device type",
|
||||
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
||||
"DevDetail_Nmap_resultsLink": "Nachdem ein Scan gestartet wurde, kann diese Seite verlassen werden. Resultate sind auch in der Datei <code>pialert_front.log</code> verfügbar.",
|
||||
"DevDetail_Nmap_Scans_desc": "Hier kannst du manuelle NMAP Scans starten. Reguläre automatische NMAP Scans können mit dem Services & Ports (NMAP) Plugin geplant werden. Gehe zu den <a href='/settings.php' target='_blank'>Einstellungen</a> um mehr herauszufinden.",
|
||||
"BackDevDetail_Actions_Title_Run": "Run action",
|
||||
"BackDevDetail_Actions_Not_Registered": "Action not registered: ",
|
||||
"BackDevDetail_Actions_Ask_Run": "Do you want to execute the action?",
|
||||
"BackDevDetail_Tools_WOL_okay": "The command was executed.",
|
||||
"BackDevDetail_Tools_WOL_error": "The command was NOT executed.",
|
||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||
"DevDetail_Tools_WOL_noti_text": "The Wake-on-LAN command is sent to the broadcast address. If the target is not in the subnet/vlan of Pi.Alert, the target device will not respond.",
|
||||
"DevDetail_Tools_WOL": "Send Wol command to ",
|
||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||
"DevDetail_Run_Actions_Title": "<i class=\"fa fa-play\"></i> Aktion auf Gerät ausführen",
|
||||
"DevDetail_Run_Actions_Tooltip": "Eine Aktion aus der Dropdown-Liste auf dem aktuellen Gerät ausführen.",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Details von Gerät kopieren",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
||||
"BackDevDetail_Copy_Title": "Copy details",
|
||||
"BackDevDetail_Copy_Ask": "Copy details from device from the dropdown list (Everything on this page will be overwritten)?",
|
||||
"Maintenance_Title": "Wartungswerkzeuge",
|
||||
"Maintenance_database_path": "Datenbank-Pfad",
|
||||
"Maintenance_database_size": "Datenbank-Größe",
|
||||
"Maintenance_database_lastmod": "Letzte Änderung",
|
||||
"Maintenance_database_backup": "DB Sicherungen",
|
||||
"Maintenance_database_backup_found": "Sicherungen verfügbar",
|
||||
"Maintenance_database_backup_total": "Speicherplatz insgesamt",
|
||||
"Maintenance_arp_status": "Scan Status",
|
||||
"Maintenance_arp_status_off": "ist im Moment deaktiviert",
|
||||
"Maintenance_arp_status_on": "Scan(s) sind gerade aktiv",
|
||||
"Maintenance_themeselector_lable": "Skin Auswahl",
|
||||
"Maintenance_themeselector_empty": "Skin wählen",
|
||||
"Maintenance_themeselector_text": "Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.",
|
||||
"Maintenance_themeselector_apply": "Übernehmen",
|
||||
"Maintenance_lang_selector_lable": "Sprachauswahl",
|
||||
"Maintenance_lang_selector_empty": "Sprache wählen",
|
||||
"Maintenance_lang_en_us": "Englisch (US)",
|
||||
"Maintenance_lang_de_de": "Deutsch (DE)",
|
||||
"Maintenance_lang_es_es": "Spanisch (ES)",
|
||||
"Maintenance_lang_selector_text": "Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.",
|
||||
"Maintenance_lang_selector_apply": "Übernehmen",
|
||||
"Maintenance_Tools_Tab_Settings": "Einstellungen",
|
||||
"Maintenance_Tools_Tab_Tools": "Werkzeuge",
|
||||
"Maintenance_Tools_Tab_BackupRestore": "Sicherg. / Wiederherstellg.",
|
||||
"Maintenance_Tools_Tab_Logging": "Logs",
|
||||
"Maintenance_Tool_darkmode": "Darstellungswechsel (Dunkel/Hell)",
|
||||
"Maintenance_Tool_darkmode_text": "Wechselt zwischen der hellen und der dunklen Darstellung. Wenn der Wechsel nicht richtig funktionieren sollte, versuchen Sie den Browsercache zu löschen. Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.",
|
||||
"Maintenance_Tool_darkmode_noti": "Darstellungswechsel",
|
||||
"Maintenance_Tool_darkmode_noti_text": "Wechselt zwischen der hellen und der dunklen Darstellung. Wenn die Umschaltung nicht ordentlich funktionieren sollte, versuchen Sie den Browsercache zu löschen.",
|
||||
"Maintenance_Tool_arpscansw": "arp-Scan stoppen/starten",
|
||||
"Maintenance_Tool_arpscansw_text": "Schaltet den arp-Scan an oder aus. Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird. Bereits laufende Scans werden dabei nicht beendet.",
|
||||
"Maintenance_Tool_arpscansw_noti": "arp-Scan stoppen/starten",
|
||||
"Maintenance_Tool_arpscansw_noti_text": "Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird.",
|
||||
"Maintenance_Tool_del_empty_macs": "Alle Geräte ohne MAC löschen",
|
||||
"Maintenance_Tool_del_empty_macs_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Geäte ohne MAC-Adresse werden aus der Datenbank ge­löscht.",
|
||||
"Maintenance_Tool_del_empty_macs_noti": "Geräte löschen",
|
||||
"Maintenance_Tool_del_empty_macs_noti_text": "Sind Sie sicher, dass Sie alle Geräte ohne MAC-Adresse löschen wollen?<br>(Vielleicht bevorzugen Sie eine Archivierung)",
|
||||
"Maintenance_Tool_upgrade_database_noti": "Aktualisiere Datenbank",
|
||||
"Maintenance_Tool_upgrade_database_text": "Mit dieser Schaltfläche wird die Datenbank aktualisiert, um das Diagramm der Netzwerkaktivitäten der letzten 12 Stunden zu aktivieren. Bitte sichern Sie Ihre Datenbank, falls Probleme auftreten.",
|
||||
"Maintenance_Tool_upgrade_database_noti_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen.",
|
||||
"Maintenance_Tool_del_alldev": "Alle Geräte löschen",
|
||||
"Maintenance_Tool_del_alldev_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Geräte werden in der Datenbank ge­löscht.",
|
||||
"Maintenance_Tool_del_alldev_noti": "Geräte löschen",
|
||||
"Maintenance_Tool_del_alldev_noti_text": "Sind Sie sich sicher, dass Sie alle Geräte löschen wollen?",
|
||||
"Maintenance_Tool_del_unknowndev": "Löschen der (unknown) Geräte",
|
||||
"Maintenance_Tool_del_unknowndev_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Gräte mit dem Namen (unknown) werden aus der Datenbank ge­löscht.",
|
||||
"Maintenance_Tool_del_unknowndev_noti": "Lösche (unknown) Geräte",
|
||||
"Maintenance_Tool_del_unknowndev_noti_text": "Sind Sie sicher, dass Sie alle (unknown) Geräte aus der Datenbank löschen wollen?",
|
||||
"Maintenance_Tool_del_allevents": "Alle Ereignisse löschen",
|
||||
"Maintenance_Tool_del_allevents_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Ereignisse werden aus der Datenbank ge­löscht. Dies setzt auch die Anwesenheit zu­rück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
||||
"Maintenance_Tool_del_allevents_noti": "Alle Ereignisse löschen",
|
||||
"Maintenance_Tool_del_allevents_noti_text": "Sind Sie sicher, dass Sie alle Ereignisse aus der Datenbank löschen wollen. Dies setzt die Anwesenheit aller Geräte zurück.",
|
||||
"Maintenance_Tool_backup": "DB Sicherung",
|
||||
"Maintenance_Tool_backup_text": "Die Datenbank-Sicher­ungen befinden sich im Datenbank-Ver­zeich­nis, gepackt als zip-Archive, benannt mit dem Erstellungs­datum. Es gibt keine maximale Anzahl von Backups.",
|
||||
"Maintenance_Tool_backup_noti": "DB Sicherung",
|
||||
"Maintenance_Tool_backup_noti_text": "Sind Sie sicher, dass Sie die Datenbank jetzt sichern möchten. Prüfen Sie, dass gerade keine Scans stattfinden.",
|
||||
"Maintenance_Tool_restore": "DB Wiederherstellung",
|
||||
"Maintenance_Tool_restore_text": "Das neuste Backup kann über diese Funk­tion wiederhergestellt werden. Ältere Sicher­ungen müssen manuell wieder­hergestellt wer­den. Es empfiehlt sich eine Integritäts­prüfung nach der Wieder­her­stellung zu machen, falls die Datenbank bei der Sicherung geöffnet war.",
|
||||
"Maintenance_Tool_restore_noti": "DB Wiederherstellung",
|
||||
"Maintenance_Tool_restore_noti_text": "Sind Sie sicher, dass Sie die Datenbank aus der neusten Sicherung wiederherstellen möchten? Prüfen Sie, dass gerade keine Scans stattfinden.",
|
||||
"Maintenance_Tool_purgebackup": "Sicherungen aufräumen",
|
||||
"Maintenance_Tool_purgebackup_text": "Es werden, bis auf die letzten 3 Backups, alle übrigen Backups gelöscht.",
|
||||
"Maintenance_Tool_purgebackup_noti": "Sicherungen aufräumen",
|
||||
"Maintenance_Tool_purgebackup_noti_text": "Sind Sie sicher, alle Backups, bis auf die letzten 3 löschen möchten?",
|
||||
"Maintenance_Tool_del_ActHistory": "Löschen der Netzwerkaktivität",
|
||||
"Maintenance_Tool_del_ActHistory_text": "Der Graph für die Netzwerkaktivität wird zurückgesetzt. Hierbei werden die Events nicht beeinflusst.",
|
||||
"Maintenance_Tool_del_ActHistory_noti": "Netzwerkaktivität löschen",
|
||||
"Maintenance_Tool_del_ActHistory_noti_text": "Sind Sie sicher, dass Sie die Netzwerkaktivität zurücksetzen möchten?",
|
||||
"BackDevices_Arpscan_disabled": "Automatischer Arp-Scan deaktiviert.",
|
||||
"BackDevices_Arpscan_enabled": "Automatischer Arp-Scan aktiviert.",
|
||||
"BackDevices_darkmode_disabled": "Heller Modus aktiviert.",
|
||||
"BackDevices_darkmode_enabled": "Dunkler Modus aktiviert.",
|
||||
"BackDevices_Restore_CopError": "Die originale Datenbank konnte nicht kopiert werden.",
|
||||
"BackDevices_Restore_okay": "Die Wiederherstellung wurde erfolgreich ausgeführt.",
|
||||
"BackDevices_Restore_Failed": "Die Wiederherstellung ist fehlgeschlagen. Stellen Sie das Backup manuell her.",
|
||||
"BackDevices_Backup_CopError": "Die originale Datenbank konnte nicht gesichert werden.",
|
||||
"BackDevices_Backup_okay": "Das Backup wurde erfolgreich beendet.",
|
||||
"BackDevices_Backup_Failed": "Das Backup wurde teilweise ausgeführt. Das Archiv ist entweder leer oder nicht vorhanden.",
|
||||
"BackDevices_DBTools_DelDev_a": "Gerät erfolgreich gelöscht.",
|
||||
"BackDevices_DBTools_DelDev_b": "Geräte erfolgreich gelöscht.",
|
||||
"BackDevices_DBTools_DelEvents": "Events erfolgreich gelöscht.",
|
||||
"BackDevices_DBTools_DelEventsError": "Fehler beim Löschen der Ereignisse.",
|
||||
"BackDevices_DBTools_DelDevError_a": "Fehler beim Löschen des Gerätes.",
|
||||
"BackDevices_DBTools_DelDevError_b": "Fehler beim Löschen der Geräte.",
|
||||
"BackDevices_DBTools_UpdDev": "Gerät erfolgreich aktualisiert.",
|
||||
"BackDevices_DBTools_UpdDevError": "Fehler beim Aktualisieren des Gerätes.",
|
||||
"BackDevices_DBTools_Upgrade": "Datenbank erfolgreich aktualisiert.",
|
||||
"BackDevices_DBTools_UpgradeError": "Fehler beim Aktualisieren der Datenbank.",
|
||||
"BackDevices_DBTools_Purge": "Die ältesten Backups wurden gelöscht.",
|
||||
"BackDevices_DBTools_DelActHistory": "Die Anzeige der Netzwerkaktivität wurde zurückgesetzt.",
|
||||
"BackDevices_DBTools_DelActHistoryError": "Fehler beim Zurücksetzen der Netzwerkaktivitätsanzeige.",
|
||||
"Network_Title": "Netzwerkübersicht",
|
||||
"Network_ManageDevices": "Geräte verwalten",
|
||||
"Network_ManageAdd": "Gerät hinzufügen",
|
||||
"Network_ManageEdit": "Gerät bearbeiten",
|
||||
"Network_ManageDel": "Gerät löschen",
|
||||
"Network_ManageAdd_Name": "Name des Gerätes",
|
||||
"Network_ManageAdd_Name_text": "Name ohne Sonderzeichen",
|
||||
"Network_ManageAdd_Type": "Gerätetyp",
|
||||
"Network_ManageAdd_Type_text": "-- Typ wählen --",
|
||||
"Network_ManageAdd_Port": "Portanzahl",
|
||||
"Network_ManageAdd_Port_text": "bei WLAN oder Powerline leer lassen",
|
||||
"Network_ManageAdd_Submit": "Hinzufügen",
|
||||
"Network_ManageEdit_ID": "Gerät zum Bearbeiten auswählen",
|
||||
"Network_ManageEdit_ID_text": "-- Gerät wählen --",
|
||||
"Network_ManageEdit_Name": "Neuer Name",
|
||||
"Network_ManageEdit_Name_text": "Name ohne Sonderzeichen",
|
||||
"Network_ManageEdit_Type": "Neuer Typ",
|
||||
"Network_ManageEdit_Type_text": "-- Typ wählen --",
|
||||
"Network_ManageEdit_Port": "Neue Portanzahl",
|
||||
"Network_ManageEdit_Port_text": "bei WLAN oder Powerline leer lassen",
|
||||
"Network_ManageEdit_Submit": "Speichern",
|
||||
"Network_ManageDel_Name": "Gerät zum Löschen auswählen",
|
||||
"Network_ManageDel_Name_text": "-- Gerät wählen --",
|
||||
"Network_ManageDel_Submit": "Löschen",
|
||||
"Network_Table_State": "Status",
|
||||
"Network_Table_Hostname": "Gerätename",
|
||||
"Network_Table_IP": "IP",
|
||||
"HelpFAQ_Title": "Hilfe / FAQ",
|
||||
"HelpFAQ_Cat_General": "Allgemein",
|
||||
"HelpFAQ_Cat_Detail": "Detailansicht",
|
||||
"HelpFAQ_Cat_General_100_head": "Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht überein (Zeitverschiebung).",
|
||||
"HelpFAQ_Cat_General_100_text_a": "Auf deinem PC ist für die PHP Umgebung folgende Zeitzone voreingestellt:",
|
||||
"HelpFAQ_Cat_General_100_text_b": "Sollte dies nicht die Zeitzone sein, in der du dich aufhältst, solltest du die Zeitzone in der PHP Konfigurationsdatei anpassen. Diese findest du in diesem Verzeichnis:",
|
||||
"HelpFAQ_Cat_General_100_text_c": "Suche in dieser Datei nach dem Eintrag 'date.timezone', entferne ggf. das führende ';' und trage die gewünschte Zeitzone ein. Eine Liste mit den unterstützten Zeitzonen findest du hier (<a href=\"https://www.php.net/manual/de/timezones.php\" target=\"blank\">Link</a>).",
|
||||
"HelpFAQ_Cat_General_101_head": "Mein Netzwerk scheint langsamer zu werden, Streaming ruckelt.",
|
||||
"HelpFAQ_Cat_General_101_text": "Es kann durchaus sein, das leistungsschwache Geräte mit der Art und Weise, wie Pi.Alert neue Geräte im Netzwerk erkennt, an ihre Leistungsgrenzen kommen. Dies verstärkt sich noch einmal, <br/> wenn diese Geräte per WLAN mit dem Netzwerk kommunizieren. Lösungen wären hier, wenn möglich ein Wechsel auf eine Kabelverbindung oder, falls das Geräte nur einen begrenzten Zeitraum genutzt <br/> werden soll, den arp-Scan auf der Wartungsseite zu pausieren.",
|
||||
"HelpFAQ_Cat_General_102_head": "Ich bekomme die Meldung, dass die Datenbank schreibgeschützt (read only) ist.",
|
||||
"HelpFAQ_Cat_General_102_text": "Prüfe im Pi.Alert verzeichnis ob der Ordner der Datenbank (db) die richtigen Rechte zugewiesen bekommen hat:<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (dein Username) www-data</span><br> Sollte die Berechtigung nicht stimmen, kannst du sie mit folgenden Befehlen im Terminal oder der Konsole wieder setzen:<br> <span class=\"text-danger help_faq_code\"> sudo chgrp -R www-data ~/pialert/db<br> chmod -R 770 ~/pialert/db </span><br> Wenn die Datenbank danach noch immer schreibgeschützt ist, versuche eine erneute Installation, oder das Zuückspielen eines Datenbank-Backups über die Wartungsseite.",
|
||||
"HelpFAQ_Cat_General_102docker_head": "(🐳 Docker only) Database issues (AJAX errors, read-only, not found)",
|
||||
"HelpFAQ_Cat_General_102docker_text": "Double-check you have followed the <a href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles\">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"> <li data-sourcepos=\"49:4-49:106\">Download the <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db\">original DB from GitHub</a>.</li> <li data-sourcepos=\"50:4-50:195\">Map the <code>pialert.db</code> file (<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">⚠</g-emoji> not folder) from above to <code>/home/pi/pialert/db/pialert.db</code> (see <a href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples\">Examples</a> for details).</li><li data-sourcepos=\"51:4-51:161\">If facing issues (AJAX errors, can not write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/home/pi/pialert/front/log</code>.</li> <li data-sourcepos=\"52:4-52:146\">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li> <li data-sourcepos=\"53:4-53:228\">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li></ul>",
|
||||
"HelpFAQ_Cat_General_103_head": "Die Login-Seite erscheint nicht, auch nicht nach der Passwortänderung.",
|
||||
"HelpFAQ_Cat_General_103_text": "Neben dem Passwort, muss in der Konfigurationsdatei <span class=\"text-danger help_faq_code\">~/pialert/config/pialert.conf</span> auch der Parameter <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> auf <span class=\"text-danger help_faq_code\">True</span> gesetzt sein.",
|
||||
"HelpFAQ_Cat_Device_200_head": "Ich habe, mir nicht bekannte, Geräte in meiner Liste. Nach dem Löschen tauchen diese immer wieder auf.",
|
||||
"HelpFAQ_Cat_Device_200_text": "Wenn du Pi-hole verwendest, beachte bitte, dass Pi.Alert Informationen von Pi-hole abruft. Pausiere Pi.Alert, gehe in Pi-hole auf die Settings-Seite und lösche ggf. die betreffende DHCP-Lease. Anschließend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen. Wenn ja, lösche diese dort ebenfalls. Nun kannst du Pi.Alert wieder starten. Jetzt sollte das Gerät/die Geräte nicht mehr auftauchen.",
|
||||
"HelpFAQ_Cat_Detail_300_head": "Was bedeutet ",
|
||||
"HelpFAQ_Cat_Detail_300_text_a": "meint ein Netzwerkgerät (welches den typ AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet eingestellt hat)",
|
||||
"HelpFAQ_Cat_Detail_300_text_b": "bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Gerät mit diesem Netzwerkgerät verbunden ist.",
|
||||
"HelpFAQ_Cat_Detail_301_head_a": "Wann wird nun gescannt? Bei ",
|
||||
"HelpFAQ_Cat_Detail_301_head_b": " steht 1min aber der Graph zeigt 5min - Abstände an.",
|
||||
"HelpFAQ_Cat_Detail_301_text": "Den zeitlichen Abstand zwischen den Scans legt der \"Cronjob\" fest, welcher standardmäßig auf 5min eingestellt ist. Die Benennung \"1min\" bezieht sich auf die zu erwartende Dauer des Scans. Abhängig vor der Netzwerkkonfiguration kann diese Zeitangabe variieren. Um den Cronjob zu bearbeiten, kannst du im Terminal/der Konsole <span class=\"text-danger help_faq_code\">crontab -e</span> eingeben und den Intervall ändern.",
|
||||
"HelpFAQ_Cat_Detail_302_head_a": "Was bedeutet ",
|
||||
"HelpFAQ_Cat_Detail_302_head_b": " und warum kann ich das nicht auswählen?",
|
||||
"HelpFAQ_Cat_Detail_302_text": "Einige moderne Geräte generieren aus Datenschutzgründen zufällige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden können und welche sich mit jeder neuen Verbindung ändern. Pi.Alert erkennt, ob es sich um eine solche zufällige MAC-Adresse handelt und aktiviert dieses \"Feld\" automatisch. Um das Verhalten abzustellen, musst du in deinem Endgerät schauen, wie du die MAC-Adressen-Generierung deaktivierst.",
|
||||
"HelpFAQ_Cat_Detail_303_head": "Was ist Nmap und wozu dient es?",
|
||||
"HelpFAQ_Cat_Detail_303_text": "Nmap ist ein Netzwerkscanner mit vielfältigen Möglichkeiten.<br> Wenn ein neues Gerät in deiner Liste auftaucht, hast du die Möglichkeit über den Nmap-Scan genauere Informationen über das Gerät zu erhalten.",
|
||||
"HelpFAQ_Cat_Presence_400_head": "Geräte werden mit einer gelben Markierung und dem Hinweis \"missing Event\" angezeigt.",
|
||||
"HelpFAQ_Cat_Presence_400_text": "Wenn dies geschieht hast du die Möglickeit, bei dem betreffenden Gerät (Detailsansicht) die Events zu löschen. Eine andere Möglichkeit wäre, das Gerät einzuschalten und zu warten, bis Pi.Alert mit dem nächsten Scan das Gerät als \"Online\" erkennt und anschließend das Gerät einfach wieder ausschalten. Nun sollte Pi.Alert mit dem nächsten Scan den Zustand des Gerätes ordentlich in der Datenbank vermerken.",
|
||||
"HelpFAQ_Cat_Presence_401_head": "Ein Gerät wird als Anwesend angezeigt, obwohl es \"Offline\" ist.",
|
||||
"HelpFAQ_Cat_Presence_401_text": "Wenn dies geschieht hast du die Möglickeit, bei dem betreffenden Gerät (Detailsansicht) die Events zu löschen. Eine andere Möglichkeit wäre, das Gerät einzuschalten und zu warten, bis Pi.Alert mit dem nächsten Scan das Gerät als \"Online\" erkennt und anschließend das Gerät einfach wieder ausschalten. Nun sollte Pi.Alert mit dem nächsten Scan den Zustand des Gerätes ordentlich in der Datenbank vermerken.",
|
||||
"HelpFAQ_Cat_Network_600_head": "Was bringt mir diese Seite?",
|
||||
"HelpFAQ_Cat_Network_600_text": "Diese Seite soll dir die Möglichkeit bieten, die Belegung deiner Netzwerkgeräte abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen, sie ggf. mit einer Portanzahl versehen und bereits erkannte Geräte diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Gerätes. So ist es dir möglich, schnell festzustellen an welchem Port ein Host angeschlossen und ob er online ist.",
|
||||
"REPORT_TITLE": "Bericht",
|
||||
"REPORT_ERROR": "Die gesuchte Seite ist vorübergehend nicht verfügbar. Bitte versuchen Sie es nach ein paar Sekunden erneut",
|
||||
"SYSTEM_TITLE": "Systeminformationen",
|
||||
"Plugins_Out_of": "von",
|
||||
"Speedtest_Results": "Ergebnisse des Geschwindigkeitstests",
|
||||
"Systeminfo_General": "Allgemein",
|
||||
"Systeminfo_General_Full_Date": "Vollständiges Datum:",
|
||||
"Systeminfo_General_Date": "Datum:",
|
||||
"Systeminfo_General_Date2": "Datum2:",
|
||||
"Systeminfo_General_TimeZone": "Zeitzone:",
|
||||
"Systeminfo_This_Client": "Dieser Mandant",
|
||||
"Systeminfo_Client_User_Agent": "Benutzeragent:",
|
||||
"Systeminfo_Client_Resolution": "Browserauflösung:",
|
||||
"Systeminfo_CPU": "CPU",
|
||||
"Systeminfo_CPU_Vendor": "CPU-Anbieter:",
|
||||
"Systeminfo_CPU_Name": "CPU-Name:",
|
||||
"Systeminfo_CPU_Cores": "CPU-Kerne:",
|
||||
"Systeminfo_CPU_Speed": "CPU-Geschwindigkeit:",
|
||||
"Systeminfo_CPU_Temp": "CPU-Temp:",
|
||||
"Systeminfo_Memory": "Arbeitsspeicher",
|
||||
"Systeminfo_Memory_Usage": "Speichernutzung:",
|
||||
"Systeminfo_Memory_Usage_Percent": "Speicher %:",
|
||||
"Systeminfo_Memory_Total_Memory": "Gesamtspeicher:",
|
||||
"Systeminfo_Motherboard": "Hauptplatine",
|
||||
"Systeminfo_Motherboard_BIOS": "BIOS:",
|
||||
"Systeminfo_Motherboard_BIOS_Date": "BIOS-Datum:",
|
||||
"Systeminfo_Motherboard_BIOS_Vendor": "BIOS-Anbieter:",
|
||||
"Systeminfo_Motherboard_Manufactured": "Hergestellt von:",
|
||||
"Systeminfo_Motherboard_Name": "Name:",
|
||||
"Systeminfo_Motherboard_Revision": "Revision:",
|
||||
"Systeminfo_Storage": "Speicher",
|
||||
"Systeminfo_Storage_Mount": "Mountpunkt:",
|
||||
"Systeminfo_Storage_Device": "Gerät:",
|
||||
"Systeminfo_Storage_Size": "Größe:",
|
||||
"Systeminfo_Storage_Type": "Typ:",
|
||||
"Systeminfo_Storage_Usage": "Speicherverwendung",
|
||||
"Systeminfo_Storage_Usage_Mount": "Mountpunkt:",
|
||||
"Systeminfo_Storage_Usage_Total": "Gesamt:",
|
||||
"Systeminfo_Storage_Usage_Used": "Verwendet:",
|
||||
"Systeminfo_Storage_Usage_Free": "Kostenlos:",
|
||||
"Systeminfo_Network": "Netzwerk",
|
||||
"Systeminfo_Network_Accept_Encoding": "Kodierung akzeptieren:",
|
||||
"Systeminfo_Network_Accept_Language": "Sprache akzeptieren:",
|
||||
"Systeminfo_Network_Connection_Port": "Verbindungsport:",
|
||||
"Systeminfo_Network_HTTP_Host": "HTTP-Host:",
|
||||
"Systeminfo_Network_HTTP_Referer": "HTTP-Referer:",
|
||||
"Systeminfo_Network_HTTP_Referer_String": "Kein HTTP-Referer",
|
||||
"Systeminfo_Network_IP": "IP Internet:",
|
||||
"Systeminfo_Network_IP_Connection": "IP-Verbindung:",
|
||||
"Systeminfo_Network_IP_Server": "Server-IP:",
|
||||
"Systeminfo_Network_MIME": "MIME:",
|
||||
"Systeminfo_Network_Request_Method": "Anfragemethode:",
|
||||
"Systeminfo_Network_Request_URI": "URI anfordern:",
|
||||
"Systeminfo_Network_Request_Time": "Anfragezeit:",
|
||||
"Systeminfo_Network_Secure_Connection": "Sichere Verbindung:",
|
||||
"Systeminfo_Network_Secure_Connection_String": "Nein (HTTP)",
|
||||
"Systeminfo_Network_Server_Name": "Servername:",
|
||||
"Systeminfo_Network_Server_Name_String": "Servername nicht gefunden",
|
||||
"Systeminfo_Network_Server_Query": "Serverabfrage:",
|
||||
"Systeminfo_Network_Server_Query_String": "Keine Abfragezeichenfolge",
|
||||
"Systeminfo_Network_Server_Version": "Serverversion:",
|
||||
"Systeminfo_Network_Hardware": "Netzwerk Hardware",
|
||||
"Systeminfo_Services": "Dienste",
|
||||
"Systeminfo_Services_Name": "Dienstname",
|
||||
"Systeminfo_Services_Description": "Dienstbeschreibung",
|
||||
"Systeminfo_System": "System",
|
||||
"Systeminfo_System_Architecture": "Architektur:",
|
||||
"Systeminfo_System_AVG": "AVG laden:",
|
||||
"Systeminfo_System_Kernel": "Kernel:",
|
||||
"Systeminfo_System_OSVersion": "Betriebssystem:",
|
||||
"Systeminfo_System_Running_Processes": "Laufende Prozesse:",
|
||||
"Systeminfo_System_System": "System:",
|
||||
"Systeminfo_System_Uname": "Uname:",
|
||||
"Systeminfo_System_Uptime": "Betriebszeit:",
|
||||
"Systeminfo_USB_Devices": "USB-Geräte",
|
||||
"Gen_DeleteAll": "Delete all",
|
||||
"Gen_Save": "Speichern",
|
||||
"Gen_Saved": "Gespeichert",
|
||||
"Gen_Run": "Run",
|
||||
"Gen_Copy": "Run",
|
||||
"Gen_Action": "Action",
|
||||
"Gen_Upd": "Updated successfully",
|
||||
"Gen_Upd_Fail": "Update failed",
|
||||
"Gen_ReadDocs": "Mehr in der Dokumentation.",
|
||||
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is runnig.",
|
||||
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
||||
"Login_Default_PWD": "Standardpasswort \"123456\" noch immer aktiv.",
|
||||
"Navigation_Plugins": "Plugins",
|
||||
"Navigation_Flows": "Flows",
|
||||
"Navigation_Donations": "Donations",
|
||||
"Maintenance_version": "App Updates",
|
||||
"Maintenance_new_version": "🆕 Eine neue Version ist vefügbar. Sieh dir die <a href=\"https://github.com/jokob-sk/Pi.Alert/releases\" target=\"_blank\">Versionshinweise</a> an.",
|
||||
"Maintenance_current_version": "Du bist up-to-date. Sieh dir an, <a href=\"https://github.com/jokob-sk/Pi.Alert/issues/138\" target=\"_blank\">woran ich gerade arbeite</a>.",
|
||||
"Maintenance_built_on": "Erstellt am",
|
||||
"Maintenance_Running_Version": "Installierte Version",
|
||||
"Maintenance_database_rows": "Tabelle (Reihen)",
|
||||
"Maintenance_Status": "Status",
|
||||
"Maintenance_Tools_Tab_UISettings": "UI Einstellungen",
|
||||
"Maintenance_Tool_displayed_columns_text": "Ändere die Sichtbarkeit und Anordnung der Spalten in der <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Geräte</b></a>-Seite. (Drag-and-Drop funktioniert nicht einwandfrei, ist aber verwendbar. Ich habe <a href=\"https://github.com/jokob-sk/Pi.Alert/commit/94b32f0f7332879f5a7d2af05dafa2e5d5cfa5da\">3 Stunden</a> versucht das zu beheben, werde es aber nicht weiter verfolgen. Über einen PR mit einem Fix würde ich mich freuen :) ).",
|
||||
"Maintenance_Tool_order_columns_text": "",
|
||||
"Maintenance_Tool_drag_me": "Zieh mich um die Anordnung der Spalten zu ändern.",
|
||||
"Maintenance_Tool_check_visible": "Abwählen um die Spalte auszublenden.",
|
||||
"Maintenance_Tool_del_allevents30": "Alle Ereignisse älter als 30 Tage löschen",
|
||||
"Maintenance_Tool_del_allevents30_text": "Machen Sie ein Backup, bevor Sie diese Funktion nutzen. Der Vorgang kann ohne Backup nicht rückgängig gemacht werden. Alle Ereignisse älter als 30 Tage werden aus der Datenbank gelöscht. Dies setzt auch die Anwesenheit zurück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
||||
"Maintenance_Tool_del_allevents30_noti": "Ereignisse löschen",
|
||||
"Maintenance_Tool_del_allevents30_noti_text": "Sind Sie sich sicher, dass Sie alle Ereignisse älter als 30 Tage löschen wollen? Dies setzt die Präsenz aller Geräte zurück.",
|
||||
"Maintenance_Tool_ExportCSV": "CSV Export",
|
||||
"Maintenance_Tool_ExportCSV_text": "Generiere eine CSV-Datei (comma separated values) mit einer Liste aller Geräte und deren Beziehungen zwischen Netzwerkknoten und verbundenen Geräten. Dies kann auch durch das Besuchen dieser URL <code>your pialert url/php/server/devices.php?action=ExportCSV</code> ausgelöst werden.",
|
||||
"Maintenance_Tool_ExportCSV_noti": "CSV Export",
|
||||
"Maintenance_Tool_ExportCSV_noti_text": "Sind Sie sich sicher, dass Sie die CSV-Datei erstellen wollen?",
|
||||
"Maintenance_Tool_ImportCSV": "CSV Import",
|
||||
"Maintenance_Tool_ImportCSV_text": "Machen Sie ein Backup, bevor Sie diese Funktion nutzen. Importiere eine CSV-Datei (comma separated values) mit einer Liste aller Geräte und deren Beziehungen zwischen Netzwerkknoten und verbundenen Geräten. Um dies zu tun platziere die <b>devices.csv</b> benannte CSV-Datei in deinen <b>/config</b> Ordner.",
|
||||
"Maintenance_Tool_ImportCSV_noti": "CSV Import",
|
||||
"Maintenance_Tool_ImportCSV_noti_text": "Sind Sie sich sicher, dass Sie die CSV-Datei importieren wollen? Dies wird alle Geräte in der Datenbank überschreiben.",
|
||||
"BackDevices_DBTools_ImportCSV": "Die Geräte aus der CSV-Datei wurden erfolgreich importiert.",
|
||||
"BackDevices_DBTools_ImportCSVError": "Die CSV-Datei konnte nicht importiert werden. Stellen Sie sicher, dass das Format korrekt ist.",
|
||||
"BackDevices_DBTools_ImportCSVMissing": "Die CSV-Datei konnte nicht in <b>/config/devices.csv</b> gefunden werden.",
|
||||
"BackDevices_Device_UpdDevError": "Konnte Geräte nicht aktualisieren, versuchen Sie es später erneut. Die Datenbank ist wahrscheinlich wegen einer laufenden Aufgabe gesperrt.",
|
||||
"Network_ManageAssign": "Zuweisen",
|
||||
"Network_ManageUnassign": "Zuweisung aufheben",
|
||||
"Network_UnassignedDevices": "Nicht zugewiesene Geräte",
|
||||
"Network_Assign": "Zum obigen <i class=\"fa fa-server\"></i> Netzwerkknoten zuweisen",
|
||||
"Network_Connected": "Verbundene Geräte",
|
||||
"Network_ManageLeaf": "Zuweisungen verwalten",
|
||||
"Network_Node": "Netzwerkknoten",
|
||||
"Network_Node_Name": "Knotenname",
|
||||
"Network_Parent": "Übergeordnetes Netzwerkgerät",
|
||||
"Network_Cant_Assign": "Internet-Wurzelknoten kann nicht als äußerer Kindknoten zugewiesen werden.",
|
||||
"Network_NoAssignedDevices": "Dieser Netzwerkknoten hat keine zugewiesenen Geräte (Kindknoten). Weise eins von unten zu oder gehe in den <b><i class=\"fa fa-info-circle\"></i> Details</b> Tab eines Gerätes in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Geräte</b></a>, und weise dort das Gerät einem <b><i class=\"fa fa-server\"></i> Netzwerk Knoten</b> und einem <b><i class=\"fa fa-ethernet\"></i> Netzwerk Knoten Port</b> zu.",
|
||||
"Network_Root_Unconfigurable": "Nicht konfigurierbare Wurzel",
|
||||
"HelpFAQ_Cat_Network_601_head": "Gibt es mehr Dokumentation?",
|
||||
"HelpFAQ_Cat_Network_601_text": "Ja, gibt es! Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/\">alle Dokumentationen</a> für mehr Infos.",
|
||||
"test_event_tooltip": "Save your changes at first before you test your settings.",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"run_event_tooltip": "Enable the setting and save your changes at first before you run it.",
|
||||
"run_event_icon": "fa-play",
|
||||
"general_event_title": "Executing an ad-hoc event",
|
||||
"general_event_description": " The event you have triggered might take a while until background processes finish. The execution ended once you see <code>finished</code> below. Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you didn not get the expected result. <br/> <br/> Status: ",
|
||||
"Plugins_Unprocessed_Events": "Unprocessed Events",
|
||||
"Plugins_Objects": "Plugin Objects",
|
||||
"Plugins_DeleteAll": "Delete all (filters are ignored)",
|
||||
"Plugins_History": "Events History",
|
||||
"Plugins_Filters_Mac": "Mac Filter",
|
||||
"Plugins_no_control": "No form control was found to render this value.",
|
||||
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
||||
"settings_missing": "Not all settings loaded, refresh the page! This is probably caused by a high load on the database or app startup sequence.",
|
||||
"settings_missing_block": "You can not save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.",
|
||||
"settings_old": "Importing settings and re-initializing...",
|
||||
"settings_saved": "<br/>Settings saved to the <code>pialert.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
|
||||
"settings_imported": "Last time settings were imported from the pialert.conf file:",
|
||||
"settings_expand_all": "Expand all",
|
||||
"Setting_Override": "Override value",
|
||||
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
|
||||
"General_display_name": "Allgemein",
|
||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||
"SCAN_SUBNETS_description": "Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the <a onclick=\"toggleAllSettings()\" href=\"#PIHOLE_RUN\"><code>PIHOLE_RUN</code>PiHole integration settings</a>. The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.",
|
||||
"LOG_LEVEL_name": "Erweiterte Protokollierung",
|
||||
"LOG_LEVEL_description": "Diese Einstellung aktiviert die erweiterte Protokollierung. Nützlich fürs Debuggen von in die Datenbank geschriebenen Events.",
|
||||
"TIMEZONE_name": "Zeitzone",
|
||||
"TIMEZONE_description": "Zeitzone um Statistiken korrekt darzustellen. Finde deine Zeitzone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">hier</a>.",
|
||||
"ENABLE_PLUGINS_name": "NOTUSED Enable Plugins",
|
||||
"ENABLE_PLUGINS_description": "NOTUSED Enables the <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins\">plugins</a> functionality. Loading plugins requires more hardware resources so you might want to disable them on low-powered system.",
|
||||
"PLUGINS_KEEP_HIST_name": "Plugins Verlauf",
|
||||
"PLUGINS_KEEP_HIST_description": "Wie viele Plugin Scanresultate behalten werden (pro Plugin, nicht gerätespezifisch).",
|
||||
"PIALERT_WEB_PROTECTION_name": "Login aktivieren",
|
||||
"PIALERT_WEB_PROTECTION_description": "Ein Loginfenster wird angezeigt wenn aktiviert. Untere Beschreibung genau durchlesen falls Sie sich aus Ihrer Instanz aussperren.",
|
||||
"PIALERT_WEB_PASSWORD_name": "Login-Passwort",
|
||||
"PIALERT_WEB_PASSWORD_description": "Das Standardpasswort ist <code>123456</code>. Um das Passwort zu ändern, entweder <code>/home/pi/pialert/back/pialert-cli</code> im Container starten oder <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a> nutzen.",
|
||||
"INCLUDED_SECTIONS_name": "Benachrichtigungen",
|
||||
"INCLUDED_SECTIONS_description": "Spezifiziert, bei welchen Events Benachrichtigungen versendet werden. Entfernen Sie die Eventtypen, bei welchen Sie nicht benachrichtigt werden wollen. Diese Einstellung überschreibt gerätespezifische Einstellungen im UI. (<code>STRG + klicken</code> zum aus-/abwählen).",
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Lösche Events älter als",
|
||||
"DAYS_TO_KEEP_EVENTS_description": "Dies ist eine Wartungseinstellung. Spezifiziert wie viele Tage Events gespeichert bleiben. Alle älteren Events werden periodisch gelöscht. Wird auch auf die Plugins History angewendet.",
|
||||
"HRS_TO_KEEP_NEWDEV_name": "Neue Geräte speichern für",
|
||||
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung. Geräte markiert als <b>Neues Gerät</b> werden gelöscht, wenn ihre <b>Erste Sitzung</b> länger her ist als die angegebenen Stunden in dieser Einstellung. <code>0</code> deaktiviert diese Funktion. Nutzen Sie diese Einstellung, um <b>Neue Geräte</b> automatisch nach <code>X</code> Stunden zu löschen.",
|
||||
"REPORT_DASHBOARD_URL_name": "Pi.Alert URL",
|
||||
"REPORT_DASHBOARD_URL_description": "Diese URL wird als Basis fürs Erstellen von Links in E-Mails genutzt. Geben Sie die gesamte URL startend mit <code>http://</code> inklusive der genutzten Portnummer ein (keinen nachfolgenden Schrägstrich <code>/</code> nutzen).",
|
||||
"DIG_GET_IP_ARG_name": "Erkennung externer IP (\"Internet IP\")",
|
||||
"DIG_GET_IP_ARG_description": "Ändere die Argumente des <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig Dienstprogramms</a>, wenn Probleme beim Auflösen der externen IP auftreten. Argumente werden an das Ende des folgenden Befehls angehängt: <code>dig +short </code>.",
|
||||
"NETWORK_DEVICE_TYPES_name": "Netzwerkgeräte-Typen",
|
||||
"NETWORK_DEVICE_TYPES_description": "Welche Gerätetypen als Netzwerkgeräte in der Netzwerkansicht verwendet werden können. Der Gerätetyp muss genau der <code>Typ</code>-Einstellung eines spezifischen Geräts in den Gerätedetails übereinstimmen. Entfernen Sie keine existierenden Typen, sondern fügen Sie nur neue ein.",
|
||||
"UI_LANG_name": "UI Sprache",
|
||||
"UI_LANG_description": "Bevorzugte Oberflächensprache auswählen.",
|
||||
"UI_PRESENCE_name": "Anzeige im Präsenzdiagramm",
|
||||
"UI_PRESENCE_description": "Auswählen, welche Status im <b>Gerätepräsenz im Laufe der Zeit</b>-Diagramm in der <a href=\"/devices.php\" target=\"_blank\">Geräte</a>-Seite angzeigt werden sollen. (<code>STRG + klicken</code> zum aus-/abwählen).",
|
||||
"Email_display_name": "Email",
|
||||
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
||||
"REPORT_MAIL_name": "Enable email",
|
||||
"REPORT_MAIL_description": "If enabled an email is sent out with a list of changes you nove subscribed to. Please also fill out all remaining settings related to the SMTP setup below. If facing issues, set <code>LOG_LEVEL</code> to <code>debug</code> and check the <a href=\"/maintenance.php#tab_Logging\">error log</a>.",
|
||||
"SMTP_SERVER_name": "SMTP server URL",
|
||||
"SMTP_SERVER_description": "The SMTP server host URL. For example <code>smtp-relay.sendinblue.com</code>. To use Gmail as an SMTP server <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP.md\">follow this guide</a>",
|
||||
"SMTP_PORT_name": "SMTP server PORT",
|
||||
"SMTP_PORT_description": "Port number used for the SMTP connection. Set to <code>0</code> if you do not want to use a port when connecting to the SMTP server.",
|
||||
"SMTP_SKIP_LOGIN_name": "Skip authentication",
|
||||
"SMTP_SKIP_LOGIN_description": "Do not use authentication when connecting to the SMTP server.",
|
||||
"SMTP_USER_name": "SMTP user",
|
||||
"SMTP_USER_description": "The user name used to login into the SMTP server (sometimes a full email address).",
|
||||
"SMTP_PASS_name": "SMTP password",
|
||||
"SMTP_PASS_description": "The SMTP server password. ",
|
||||
"SMTP_SKIP_TLS_name": "Do not use TLS",
|
||||
"SMTP_SKIP_TLS_description": "Disable TLS when connecting to your SMTP server.",
|
||||
"SMTP_FORCE_SSL_name": "Force SSL",
|
||||
"SMTP_FORCE_SSL_description": "Force SSL when connecting to your SMTP server.",
|
||||
"REPORT_TO_name": "Send email to",
|
||||
"REPORT_TO_description": "Email address to which the notification will be send to.",
|
||||
"REPORT_FROM_name": "Email subject",
|
||||
"REPORT_FROM_description": "Notification email subject line. Some SMTP servers need this to be an email.",
|
||||
"Webhooks_display_name": "Webhooks",
|
||||
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
||||
"REPORT_WEBHOOK_name": "Enable Webhooks",
|
||||
"REPORT_WEBHOOK_description": "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below.",
|
||||
"WEBHOOK_URL_name": "Target URL",
|
||||
"WEBHOOK_URL_description": "Target URL starting with <code>http://</code> or <code>https://</code>.",
|
||||
"WEBHOOK_PAYLOAD_name": "Payload type",
|
||||
"WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/back/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)",
|
||||
"WEBHOOK_REQUEST_METHOD_name": "Request method",
|
||||
"WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
|
||||
"WEBHOOK_SIZE_name": "Max payload size",
|
||||
"WEBHOOK_SIZE_description": "The maximum size of the webhook payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended.",
|
||||
"WEBHOOK_SECRET_name": "HMAC Secret",
|
||||
"WEBHOOK_SECRET_description": "When set, use this secret to generate the SHA256-HMAC hex digest value of the request body, which will be passed as the <code>X-Webhook-Signature</code> header to the request. You can find more informations <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_SECRET.md\">here</a>.",
|
||||
"Apprise_display_name": "Apprise",
|
||||
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
|
||||
"REPORT_APPRISE_name": "Enable Apprise",
|
||||
"REPORT_APPRISE_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>.",
|
||||
"APPRISE_HOST_name": "Apprise host URL",
|
||||
"APPRISE_HOST_description": "Apprise host URL starting with <code>http://</code> or <code>https://</code>. (do not forget to include <code>/notify</code> at the end)",
|
||||
"APPRISE_URL_name": "Apprise notification URL",
|
||||
"APPRISE_URL_description": "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.",
|
||||
"APPRISE_SIZE_name": "Max payload size",
|
||||
"APPRISE_SIZE_description": "The maximum size of the apprise payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended.",
|
||||
"NTFY_display_name": "NTFY",
|
||||
"NTFY_icon": "<i class=\"fa fa-terminal\"></i>",
|
||||
"REPORT_NTFY_name": "Enable NTFY",
|
||||
"REPORT_NTFY_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>.",
|
||||
"NTFY_HOST_name": "NTFY host URL",
|
||||
"NTFY_HOST_description": "NTFY host URL starting with <code>http://</code> or <code>https://</code>. You can use the hosted instance on <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> by simply entering <code>https://ntfy.sh</code>.",
|
||||
"NTFY_TOPIC_name": "NTFY topic",
|
||||
"NTFY_TOPIC_description": "Your secret topic.",
|
||||
"NTFY_USER_name": "NTFY user",
|
||||
"NTFY_USER_description": "Enter user if you need (host) an instance with enabled authetication.",
|
||||
"NTFY_PASSWORD_name": "NTFY password",
|
||||
"NTFY_PASSWORD_description": "Enter password if you need (host) an instance with enabled authetication.",
|
||||
"PUSHSAFER_display_name": "Pushsafer",
|
||||
"PUSHSAFER_icon": "<i class=\"fa fa-bell\"></i>",
|
||||
"REPORT_PUSHSAFER_name": "Enable Pushsafer",
|
||||
"REPORT_PUSHSAFER_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>.",
|
||||
"PUSHSAFER_TOKEN_name": "Pushsafer token",
|
||||
"PUSHSAFER_TOKEN_description": "Your secret Pushsafer API key (token).",
|
||||
"APPRISE_PAYLOAD_name": "Payload type",
|
||||
"APPRISE_PAYLOAD_description": "Select the payoad type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram.",
|
||||
"MQTT_display_name": "MQTT",
|
||||
"MQTT_icon": "<i class=\"fa fa-square-rss\"></i>",
|
||||
"REPORT_MQTT_name": "Enable MQTT",
|
||||
"REPORT_MQTT_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.home-assistant.io/integrations/mqtt/\">MQTT</a> to your Home Assistance instance.",
|
||||
"MQTT_BROKER_name": "MQTT broker URL",
|
||||
"MQTT_BROKER_description": "MQTT host URL (do not include <code>http://</code> or <code>https://</code>).",
|
||||
"MQTT_PORT_name": "MQTT broker port",
|
||||
"MQTT_PORT_description": "Port number where the broker is listening. Usually <code>1883</code>.",
|
||||
"MQTT_USER_name": "MQTT user",
|
||||
"MQTT_USER_description": "User name used to login into your MQTT broker instance.",
|
||||
"MQTT_PASSWORD_name": "MQTT password",
|
||||
"MQTT_PASSWORD_description": "Password used to login into your MQTT broker instance.",
|
||||
"MQTT_QOS_name": "MQTT Quality of Service",
|
||||
"MQTT_QOS_description": "Quality of service setting for MQTT message sending. <code>0</code> - Low quality to <code>2</code> - High quality. The higher the quality the longer the delay.",
|
||||
"MQTT_DELAY_SEC_name": "MQTT delay per device",
|
||||
"MQTT_DELAY_SEC_description": "A little hack - delay adding to the queue in case the process is restarted and previous publish processes aborted (it takes ~<code>2</code>s to update a sensor config on the broker). Tested with <code>2</code>-<code>3</code> seconds of delay. This delay is only applied when devices are created (during the first notification loop). It doesn not affect subsequent scans or notifications.",
|
||||
"API_display_name": "API",
|
||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||
"API_CUSTOM_SQL_name": "Benutzerdefinierte SQL-Abfrage",
|
||||
"API_CUSTOM_SQL_description": "Benutzerdefinierte SQL-Abfrage, welche eine JSON-Datei generiert und diese mit dem <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\">Dateiendpunkt <code>table_custom_endpoint.json</code></a> zur Verfügung stellt.",
|
||||
"Donations_Title": "Donations",
|
||||
"Donations_Text": "Hey 👋! </br> Thanks for clicking on this menu item 😅 </br> </br> I'm trying to collect some donations to make you better software. Also, it would help me not to get burned out. Me burning out might mean end of support for this app. Any small (recurring or not) sponsorship makes me want ot put more effort into this app. I don't want to lock features (new plugins) behind paywalls 🔐. </br> Currently, I'm waking up 2h before work so I contribute to the app a bit. If I had some recurring income I could shorten my workweek and in the remaining time fully focus on PiAlert. You'd get more functionality, a more polished app and less bugs. </br> </br> Thanks for reading - I'm super grateful for any support ❤🙏 </br> </br> TL;DR: By supporting me you get: </br> </br> <ul><li>Regular updates to keep your data and family safe 🔄</li><li>Less bugs 🐛🔫</li><li>Better and more functionality➕</li><li>I don't get burned out 🔥🤯</li><li>Less rushed releases 💨</li><li>Better docs📚</li><li>Quicker and better support with issues 🆘</li><li>Less grumpy me 😄</li></ul> </br> 📧Email me to <a href='mailto:jokob@duck.com?subject=PiAlert'>jokob@duck.com</a> if you want to get in touch or if I should add other sponsorship platforms. </br>",
|
||||
"Donations_Platforms": "Sponsor platforms",
|
||||
"Donations_Others": "Others"
|
||||
}
|
||||
}
|
||||
@@ -1,414 +0,0 @@
|
||||
<?php
|
||||
|
||||
$lang['de_de'] = array(
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// About - Update by @TeroRERO 07ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'About_Title' => 'Open Source Network Guard',
|
||||
'About_Design' => 'Designed for:',
|
||||
'About_Exit' => 'Sign out',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// General
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'Gen_Delete' => 'Löschen',
|
||||
'Gen_Cancel' => 'Abbrechen',
|
||||
'Gen_Okay' => 'Ok',
|
||||
'Gen_Purge' => 'Aufräumen',
|
||||
'Gen_Backup' => 'Sichern',
|
||||
'Gen_Restore' => 'Wiederherstellen',
|
||||
'Gen_Switch' => 'Umschalten',
|
||||
'Gen_AreYouSure' => 'Sind Sie sich sicher?',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Login Page - Update by @TeroRERO 03ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Login_Box' => 'Passwort eingeben',
|
||||
'Login_Remember' => 'Passwort speichern',
|
||||
'Login_Remember_small' => '(für 7 Tage gültig)',
|
||||
'Login_Submit' => 'Anmelden',
|
||||
'Login_Psw_run' => 'Um das Passwort zu ändern nutze:',
|
||||
'Login_Psw_new' => 'neues_passwort',
|
||||
'Login_Psw_folder' => 'im Ordner "~/pialert/config"',
|
||||
'Login_Psw_alert' => 'Sicherheitshinweis!',
|
||||
'Login_Psw-box' => 'Passwort',
|
||||
'Login_Toggle_Info' => 'Passwort Informationen',
|
||||
'Login_Toggle_Info_headline' => 'Passwort Information',
|
||||
'Login_Toggle_Alert_headline' => 'Passwort Warnung!',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Sidebar
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Navigation_Devices' => 'Geräte',
|
||||
'Navigation_Presence' => 'Anwesenheit',
|
||||
'Navigation_Events' => 'Ereignisse',
|
||||
'Navigation_Maintenance' => 'Wartung',
|
||||
'Navigation_Settings' => 'Einstellung',
|
||||
'Navigation_Network' => 'Netzwerk',
|
||||
'Navigation_HelpFAQ' => 'Hilfe / FAQ',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Device_Title' => 'Geräte',
|
||||
'Device_Shortcut_AllDevices' => 'Alle Geräte',
|
||||
'Device_Shortcut_Connected' => 'Verbunden',
|
||||
'Device_Shortcut_Favorites' => 'Favoriten',
|
||||
'Device_Shortcut_NewDevices' => 'Neue Geräte',
|
||||
'Device_Shortcut_DownAlerts' => 'Down Meldungen',
|
||||
'Device_Shortcut_Archived' => 'Archiviert',
|
||||
'Device_Shortcut_Devices' => 'Geräte',
|
||||
'Device_Shortcut_OnlineChart' => 'Gerätepräsenz im Laufe der Zeit',
|
||||
'Device_TableHead_Name' => 'Name',
|
||||
'Device_TableHead_Owner' => 'Eigentümer',
|
||||
'Device_TableHead_Type' => 'Typ',
|
||||
'Device_TableHead_Favorite' => 'Favorit',
|
||||
'Device_TableHead_Group' => 'Gruppe',
|
||||
'Device_TableHead_FirstSession' => 'Erste Sitzg.',
|
||||
'Device_TableHead_LastSession' => 'Letzte Sitzg.',
|
||||
'Device_TableHead_LastIP' => 'Letzte IP',
|
||||
'Device_TableHead_MAC' => 'MAC',
|
||||
'Device_TableHead_LastIPOrder' => 'Last IP Order',
|
||||
'Device_TableHead_Rowid' => 'Zeilennummer',
|
||||
'Device_TableHead_Status' => 'Status',
|
||||
'Device_Searchbox' => 'Suche',
|
||||
'Device_Tablelenght' => 'Zeige _MENU_ Einträge',
|
||||
'Device_Tablelenght_all' => 'Alle',
|
||||
'Device_Table_info' => 'Zeige _START_ bis _END_ von _TOTAL_ Einträgen',
|
||||
'Device_Table_nav_next' => 'Nächste',
|
||||
'Device_Table_nav_prev' => 'Zurück',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Presence Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Presence_Title' => 'Anwesenheit pro Gerät',
|
||||
'Presence_Shortcut_AllDevices' => 'Alle Geräte',
|
||||
'Presence_Shortcut_Connected' => 'Verbunden',
|
||||
'Presence_Shortcut_Favorites' => 'Favoriten',
|
||||
'Presence_Shortcut_NewDevices' => 'Neue Geräte',
|
||||
'Presence_Shortcut_DownAlerts' => 'Down Meldungen',
|
||||
'Presence_Shortcut_Archived' => 'Archiviert',
|
||||
'Presence_Shortcut_Devices' => 'Geräte',
|
||||
|
||||
// Localizationfiles under pialert/front/lib/AdminLTE/bower_components/fullcalendar/dist/locale
|
||||
'Presence_CallHead_Devices' => 'Geräte',
|
||||
'Presence_CalHead_lang' => 'de',
|
||||
'Presence_CalHead_year' => 'Jahr',
|
||||
'Presence_CalHead_quarter' => 'Quartal',
|
||||
'Presence_CalHead_month' => 'Monat',
|
||||
'Presence_CalHead_week' => 'Woche',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Events Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Events_Title' => 'Ereignisse',
|
||||
'Events_Periodselect_today' => 'Heute',
|
||||
'Events_Periodselect_LastWeek' => 'Letzte Woche',
|
||||
'Events_Periodselect_LastMonth' => 'Letzter Monat',
|
||||
'Events_Periodselect_LastYear' => 'Letztes Jahr',
|
||||
'Events_Periodselect_All' => 'Alle Ereignisse',
|
||||
'Events_Shortcut_AllEvents' => 'Alle Ereignisse',
|
||||
'Events_Shortcut_Sessions' => 'Sitzungen',
|
||||
'Events_Shortcut_MissSessions' => 'fehlende Sitzungen',
|
||||
'Events_Shortcut_VoidSessions' => 'beendete Sitzungen',
|
||||
'Events_Shortcut_NewDevices' => 'Neue Geräte',
|
||||
'Events_Shortcut_DownAlerts' => 'Down Meldungen',
|
||||
'Events_Shortcut_Events' => 'Ereignisse',
|
||||
'Events_TableHead_Order' => 'Order',
|
||||
'Events_TableHead_Device' => 'Gerät',
|
||||
'Events_TableHead_Owner' => 'Eigentümer',
|
||||
'Events_TableHead_Date' => 'Datum',
|
||||
'Events_TableHead_EventType' => 'Ereignis Typ',
|
||||
'Events_TableHead_Connection' => 'Verbindung',
|
||||
'Events_TableHead_Disconnection' => 'Trennung',
|
||||
'Events_TableHead_Duration' => 'Dauer',
|
||||
'Events_TableHead_DurationOrder' => 'Duration Order',
|
||||
'Events_TableHead_IP' => 'IP',
|
||||
'Events_TableHead_IPOrder' => 'IP Order',
|
||||
'Events_TableHead_AdditionalInfo' => 'Zusätzliche Info',
|
||||
'Events_Searchbox' => 'Suche',
|
||||
'Events_Tablelenght' => 'Zeige _MENU_ Einträge',
|
||||
'Events_Tablelenght_all' => 'Alle',
|
||||
'Events_Table_info' => 'Zeige _START_ bis _END_ von _TOTAL_ Einträgen',
|
||||
'Events_Table_nav_next' => 'Nächste',
|
||||
'Events_Table_nav_prev' => 'Zurück',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Details Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'DevDetail_Periodselect_today' => 'Heute',
|
||||
'DevDetail_Periodselect_LastWeek' => 'Letzte Woche',
|
||||
'DevDetail_Periodselect_LastMonth' => 'Letzter Monat',
|
||||
'DevDetail_Periodselect_LastYear' => 'Letztes Jahr',
|
||||
'DevDetail_Periodselect_All' => 'Alle Infos',
|
||||
'DevDetail_Shortcut_CurrentStatus' => 'aktueller Status',
|
||||
'DevDetail_Shortcut_Sessions' => 'Sitzungen',
|
||||
'DevDetail_Shortcut_Presence' => 'Anwesenheit',
|
||||
'DevDetail_Shortcut_DownAlerts' => 'Down Meldungen',
|
||||
'DevDetail_Tab_Details' => 'Details',
|
||||
'DevDetail_Tab_Nmap' => 'Nmap',
|
||||
'DevDetail_Tab_Sessions' => 'Sitzungen',
|
||||
'DevDetail_Tab_Presence' => 'Anwesenheit',
|
||||
'DevDetail_Tab_Events' => 'Ereignisse',
|
||||
'DevDetail_MainInfo_Title' => 'Haupt Infos',
|
||||
'DevDetail_MainInfo_mac' => 'MAC',
|
||||
'DevDetail_MainInfo_Name' => 'Name',
|
||||
'DevDetail_MainInfo_Owner' => 'Eigen-­tümer',
|
||||
'DevDetail_MainInfo_Type' => 'Typ',
|
||||
'DevDetail_MainInfo_Vendor' => 'Hersteller',
|
||||
'DevDetail_MainInfo_Favorite' => 'Favorit',
|
||||
'DevDetail_MainInfo_Group' => 'Gruppe',
|
||||
'DevDetail_MainInfo_Location' => 'Standort',
|
||||
'DevDetail_MainInfo_Comments' => 'Notiz',
|
||||
'DevDetail_MainInfo_Network' => 'Netzwerk Knoten',
|
||||
'DevDetail_MainInfo_Network_Port' => 'Netzwerk Knoten Port',
|
||||
'DevDetail_SessionInfo_Title' => 'Sitzungsinfos',
|
||||
'DevDetail_SessionInfo_Status' => 'Status',
|
||||
'DevDetail_SessionInfo_FirstSession' => 'Erste Sitzung',
|
||||
'DevDetail_SessionInfo_LastSession' => 'Letzte Sitzung',
|
||||
'DevDetail_SessionInfo_LastIP' => 'Letzte IP',
|
||||
'DevDetail_SessionInfo_StaticIP' => 'Statische IP',
|
||||
'DevDetail_EveandAl_Title' => 'Ereignisse & Alarme einstellen',
|
||||
'DevDetail_EveandAl_ScanCycle' => 'Scan Abstand',
|
||||
'DevDetail_EveandAl_AlertAllEvents' => 'Melde alle Ereignisse',
|
||||
'DevDetail_EveandAl_AlertDown' => 'Melde Down',
|
||||
'DevDetail_EveandAl_Skip' => 'pausiere wiederhol. Meldungen für',
|
||||
'DevDetail_EveandAl_NewDevice' => 'Neues Gerät',
|
||||
'DevDetail_EveandAl_Archived' => 'Archivierung',
|
||||
'DevDetail_EveandAl_RandomMAC' => 'Zufällige MAC',
|
||||
'DevDetail_EveandAl_ScanCycle_a' => 'Gerät scannen',
|
||||
'DevDetail_EveandAl_ScanCycle_z' => 'Gerät nicht scannen',
|
||||
'DevDetail_button_Delete' => 'Lösche Gerät',
|
||||
'DevDetail_button_Reset' => 'Verwerfen',
|
||||
'DevDetail_button_Save' => 'Speichern',
|
||||
'DevDetail_button_DeleteEvents' => 'Lösche Events',
|
||||
'DevDetail_button_DeleteEvents_Warning' => 'Sind Sie sicher, dass Sie alle Ereignisse dieses Geräts löschen möchten? (dies löscht den Ereignisverlauf und die Sitzungen und könnte bei ständigen (anhaltenden) Benachrichtigungen helfen)',
|
||||
'DevDetail_SessionTable_Order' => 'Order',
|
||||
'DevDetail_SessionTable_Connection' => 'Verbindung',
|
||||
'DevDetail_SessionTable_Disconnection' => 'Trennung',
|
||||
'DevDetail_SessionTable_Duration' => 'Dauer',
|
||||
'DevDetail_SessionTable_IP' => 'IP',
|
||||
'DevDetail_SessionTable_Additionalinfo' => 'Zusätzliche Info',
|
||||
'DevDetail_Events_CheckBox' => 'Blende Verbindungs-Ereignisse aus',
|
||||
'DevDetail_Nmap_buttonFast' => 'Schneller Scan',
|
||||
'DevDetail_Nmap_buttonDefault' => 'Standard Scan',
|
||||
'DevDetail_Nmap_buttonDetail' => 'Detailierter Scan',
|
||||
'DevDetail_Nmap_buttonFast_text' => 'Schneller Scan: Überprüft nur die wichtigsten 100 Ports (wenige Sekunden)',
|
||||
'DevDetail_Nmap_buttonDefault_text' => 'Standard Scan: Nmap scannt die ersten 1.000 Ports für jedes angeforderte Scan-Protokoll. Damit werden etwa 93 % der TCP-Ports und 49 % der UDP-Ports erfasst. (ca. 5-10 Sekunden)',
|
||||
'DevDetail_Nmap_buttonDetail_text' => 'Detailierter Scan: Standardscan mit aktivierter Betriebssystemerkennung, Versionserkennung, Skript-Scan und Traceroute (bis zu 30 oder mehr Sekunden)',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery' => 'Ohne Erreichbarkeitsprüfung',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery_text' => 'Ohne Erreichbarkeitsprüfung (-Pn Parameter): Standard Scan bei dem nmap annimmt, dass der Host erreichbar ist.',
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Maintenance_Title' => 'Wartungswerkzeuge',
|
||||
'Maintenance_database_path' => 'Datenbank-Pfad',
|
||||
'Maintenance_database_size' => 'Datenbank-Größe',
|
||||
'Maintenance_database_lastmod' => 'Letzte Änderung',
|
||||
'Maintenance_database_backup' => 'DB Sicherungen',
|
||||
'Maintenance_database_backup_found' => 'Sicherungen verfügbar',
|
||||
'Maintenance_database_backup_total' => 'Speicherplatz insgesamt',
|
||||
'Maintenance_arp_status' => 'Scan Status',
|
||||
'Maintenance_arp_status_off' => 'ist im Moment deaktiviert',
|
||||
'Maintenance_arp_status_on' => 'Scan(s) sind gerade aktiv',
|
||||
'Maintenance_themeselector_lable' => 'Skin Auswahl',
|
||||
'Maintenance_themeselector_empty' => 'Skin wählen',
|
||||
'Maintenance_themeselector_text' => 'Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.',
|
||||
'Maintenance_themeselector_apply' => 'Übernehmen',
|
||||
'Maintenance_lang_selector_lable' => 'Sprachauswahl',
|
||||
'Maintenance_lang_selector_empty' => 'Sprache wählen',
|
||||
'Maintenance_lang_en_us' => 'Englisch (US)',
|
||||
'Maintenance_lang_de_de' => 'Deutsch (DE)',
|
||||
'Maintenance_lang_es_es' => 'Spanisch (ES)',
|
||||
'Maintenance_lang_selector_text' => 'Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.',
|
||||
'Maintenance_lang_selector_apply' => 'Übernehmen',
|
||||
'Maintenance_Tools_Tab_Settings' => 'Einstellungen',
|
||||
'Maintenance_Tools_Tab_Tools' => 'Werkzeuge',
|
||||
'Maintenance_Tools_Tab_BackupRestore' => 'Sicherg. / Wiederherstellg.',
|
||||
'Maintenance_Tools_Tab_Logging' => 'Logs',
|
||||
'Maintenance_Tool_darkmode' => 'Darstellungswechsel (Dunkel/Hell)',
|
||||
'Maintenance_Tool_darkmode_text' => 'Wechselt zwischen der hellen und der dunklen Darstellung. Wenn der Wechsel nicht richtig funktionieren sollte, versuchen Sie den Browsercache zu löschen. Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.',
|
||||
'Maintenance_Tool_darkmode_noti' => 'Darstellungswechsel',
|
||||
'Maintenance_Tool_darkmode_noti_text' => 'Wechselt zwischen der hellen und der dunklen Darstellung. Wenn die Umschaltung nicht ordentlich funktionieren sollte, versuchen Sie den Browsercache zu löschen.',
|
||||
'Maintenance_Tool_arpscansw' => 'arp-Scan stoppen/starten',
|
||||
'Maintenance_Tool_arpscansw_text' => 'Schaltet den arp-Scan an oder aus. Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird. Bereits laufende Scans werden dabei nicht beendet.',
|
||||
'Maintenance_Tool_arpscansw_noti' => 'arp-Scan stoppen/starten',
|
||||
'Maintenance_Tool_arpscansw_noti_text' => 'Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird.',
|
||||
'Maintenance_Tool_del_empty_macs' => 'Alle Geräte ohne MAC löschen',
|
||||
'Maintenance_Tool_del_empty_macs_text' => 'Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Geäte ohne MAC-Adresse werden aus der Datenbank ge­löscht.',
|
||||
'Maintenance_Tool_del_empty_macs_noti' => 'Geräte löschen',
|
||||
'Maintenance_Tool_del_empty_macs_noti_text' => 'Sind Sie sicher, dass Sie alle Geräte ohne MAC-Adresse löschen wollen?<br>(Vielleicht bevorzugenn Sie eine Archivierung.)',
|
||||
'Maintenance_Tool_upgrade_database_noti' => 'Aktualisiere Datenbank',
|
||||
'Maintenance_Tool_upgrade_database_text' => 'Mit dieser Schaltfläche wird die Datenbank aktualisiert, um das Diagramm der Netzwerkaktivitäten der letzten 12 Stunden zu aktivieren. Bitte sichern Sie Ihre Datenbank, falls Probleme auftreten.',
|
||||
'Maintenance_Tool_upgrade_database_noti_text' => 'Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen.',
|
||||
'Maintenance_Tool_del_alldev' => 'Alle Geräte löschen',
|
||||
'Maintenance_Tool_del_alldev_text' => 'Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Geräte werden in der Datenbank ge­löscht.',
|
||||
'Maintenance_Tool_del_alldev_noti' => 'Geräte löschen',
|
||||
'Maintenance_Tool_del_alldev_noti_text' => 'Sind Sie sich sicher, dass Sie alle Geräte löschen wollen?',
|
||||
'Maintenance_Tool_del_unknowndev' => 'Löschen der (unknown) Geräte',
|
||||
'Maintenance_Tool_del_unknowndev_text' => 'Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Gräte mit dem Namen (unknown) werden aus der Datenbank ge­löscht.',
|
||||
'Maintenance_Tool_del_unknowndev_noti' => 'Lösche (unknown) Geräte',
|
||||
'Maintenance_Tool_del_unknowndev_noti_text' => 'Sind Sie sicher, dass Sie alle (unknown) Geräte aus der Datenbank löschen wollen?',
|
||||
'Maintenance_Tool_del_allevents' => 'Alle Ereignisse löschen',
|
||||
'Maintenance_Tool_del_allevents_text' => 'Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Ereignisse werden aus der Datenbank ge­löscht. Dies setzt auch die Anwesenheit zu­rück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät "online" ist, sollte das Problem lösen.',
|
||||
'Maintenance_Tool_del_allevents_noti' => 'Alle Ereignisse löschen',
|
||||
'Maintenance_Tool_del_allevents_noti_text' => 'Sind Sie sicher, dass Sie alle Ereignisse aus der Datenbank löschen wollen. Dies setzt die Anwesenheit aller Geräte zurück.',
|
||||
'Maintenance_Tool_backup' => 'DB Sicherung',
|
||||
'Maintenance_Tool_backup_text' => 'Die Datenbank-Sicher­ungen befinden sich im Datenbank-Ver­zeich­nis, gepackt als zip-Archive, benannt mit dem Erstellungs­datum. Es gibt keine maximale Anzahl von Backups.',
|
||||
'Maintenance_Tool_backup_noti' => 'DB Sicherung',
|
||||
'Maintenance_Tool_backup_noti_text' => 'Sind Sie sicher, dass Sie die Datenbank jetzt sichern möchten. Prüfen Sie, dass gerade keine Scans stattfinden.',
|
||||
'Maintenance_Tool_restore' => 'DB Wiederherstellung',
|
||||
'Maintenance_Tool_restore_text' => 'Das neuste Backup kann über diese Funk­tion wiederhergestellt werden. Ältere Sicher­ungen müssen manuell wieder­hergestellt wer­den. Es empfiehlt sich eine Integritäts­prüfung nach der Wieder­her­stellung zu machen, falls die Datenbank bei der Sicherung geöffnet war.',
|
||||
'Maintenance_Tool_restore_noti' => 'DB Wiederherstellung',
|
||||
'Maintenance_Tool_restore_noti_text' => 'Sind Sie sicher, dass Sie die Datenbank aus der neusten Sicherung wiederherstellen möchten? Prüfen Sie, dass gerade keine Scans stattfinden.',
|
||||
'Maintenance_Tool_purgebackup' => 'Sicherungen aufräumen',
|
||||
'Maintenance_Tool_purgebackup_text' => 'Es werden, bis auf die letzten 3 Backups, alle übrigen Backups gelöscht.',
|
||||
'Maintenance_Tool_purgebackup_noti' => 'Sicherungen aufräumen',
|
||||
'Maintenance_Tool_purgebackup_noti_text' => 'Sind Sie sicher, alle Backups, bis auf die letzten 3 löschen möchten?',
|
||||
'Maintenance_Tool_del_ActHistory' => 'Löschen der Netzwerkaktivität',
|
||||
'Maintenance_Tool_del_ActHistory_text' => 'Der Graph für die Netzwerkaktivität wird zurückgesetzt. Hierbei werden die Events nicht beeinflusst.',
|
||||
'Maintenance_Tool_del_ActHistory_noti' => 'Netzwerkaktivität löschen',
|
||||
'Maintenance_Tool_del_ActHistory_noti_text' => 'Sind Sie sicher, dass Sie die Netzwerkaktivität zurücksetzen möchten?',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'BackDevices_Arpscan_disabled' => 'Automatischer Arp-Scan deaktiviert.',
|
||||
'BackDevices_Arpscan_enabled' => 'Automatischer Arp-Scan aktiviert.',
|
||||
'BackDevices_darkmode_disabled' => 'Heller Modus aktiviert.',
|
||||
'BackDevices_darkmode_enabled' => 'Dunkler Modus aktiviert.',
|
||||
'BackDevices_Restore_CopError' => 'Die originale Datenbank konnte nicht kopiert werden.',
|
||||
'BackDevices_Restore_okay' => 'Die Wiederherstellung wurde erfolgreich ausgeführt.',
|
||||
'BackDevices_Restore_Failed' => 'Die Wiederherstellung ist fehlgeschlagen. Stellen Sie das Backup manuell her.',
|
||||
'BackDevices_Backup_CopError' => 'Die originale Datenbank konnte nicht gesichert werden.',
|
||||
'BackDevices_Backup_okay' => 'Das Backup wurde erfolgreich beendet.',
|
||||
'BackDevices_Backup_Failed' => 'Das Backup wurde teilweise ausgeführt. Das Archiv ist entweder leer oder nicht vorhanden.',
|
||||
'BackDevices_DBTools_DelDev_a' => 'Gerät erfolgreich gelöscht.',
|
||||
'BackDevices_DBTools_DelDev_b' => 'Geräte erfolgreich gelöscht.',
|
||||
'BackDevices_DBTools_DelEvents' => 'Events erfolgreich gelöscht.',
|
||||
'BackDevices_DBTools_DelEventsError' => 'Fehler beim Löschen der Ereignisse.',
|
||||
'BackDevices_DBTools_DelDevError_a' => 'Fehler beim Löschen des Gerätes.',
|
||||
'BackDevices_DBTools_DelDevError_b' => 'Fehler beim Löschen der Geräte.',
|
||||
'BackDevices_DBTools_UpdDev' => 'Gerät erfolgreich aktualisiert.',
|
||||
'BackDevices_DBTools_UpdDevError' => 'Fehler beim Aktualisieren des Gerätes.',
|
||||
'BackDevices_DBTools_Upgrade' => 'Datenbank erfolgreich aktualisiert.',
|
||||
'BackDevices_DBTools_UpgradeError' => 'Fehler beim Aktualisieren der Datenbank.',
|
||||
'BackDevices_DBTools_Purge' => 'Die ältesten Backups wurden gelöscht.',
|
||||
'BackDevices_DBTools_DelActHistory' => 'Die Anzeige der Netzwerkaktivität wurde zurückgesetzt.',
|
||||
'BackDevices_DBTools_DelActHistoryError' => 'Fehler beim Zurücksetzen der Netzwerkaktivitätsanzeige.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Network Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Network_Title' => 'Netzwerkübersicht',
|
||||
'Network_ManageDevices' => 'Geräte verwalten',
|
||||
'Network_ManageAdd' => 'Gerät hinzufügen',
|
||||
'Network_ManageEdit' => 'Gerät bearbeiten',
|
||||
'Network_ManageDel' => 'Gerät löschen',
|
||||
'Network_ManageAdd_Name' => 'Name des Gerätes',
|
||||
'Network_ManageAdd_Name_text' => 'Name ohne Sonderzeichen',
|
||||
'Network_ManageAdd_Type' => 'Gerätetyp',
|
||||
'Network_ManageAdd_Type_text' => '-- Typ wählen --',
|
||||
'Network_ManageAdd_Port' => 'Portanzahl',
|
||||
'Network_ManageAdd_Port_text' => 'bei WLAN oder Powerline leer lassen',
|
||||
'Network_ManageAdd_Submit' => 'Hinzufügen',
|
||||
'Network_ManageEdit_ID' => 'Gerät zum Bearbeiten auswählen',
|
||||
'Network_ManageEdit_ID_text' => '-- Gerät wählen --',
|
||||
'Network_ManageEdit_Name' => 'Neuer Name',
|
||||
'Network_ManageEdit_Name_text' => 'Name ohne Sonderzeichen',
|
||||
'Network_ManageEdit_Type' => 'Neuer Typ',
|
||||
'Network_ManageEdit_Type_text' => '-- Typ wählen --',
|
||||
'Network_ManageEdit_Port' => 'Neue Portanzahl',
|
||||
'Network_ManageEdit_Port_text' => 'bei WLAN oder Powerline leer lassen',
|
||||
'Network_ManageEdit_Submit' => 'Speichern',
|
||||
'Network_ManageDel_Name' => 'Gerät zum Löschen auswählen',
|
||||
'Network_ManageDel_Name_text' => '-- Gerät wählen --',
|
||||
'Network_ManageDel_Submit' => 'Löschen',
|
||||
'Network_Table_State' => 'Status',
|
||||
'Network_Table_Hostname' => 'Gerätename',
|
||||
'Network_Table_IP' => 'IP',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Help Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'HelpFAQ_Title' => 'Hilfe / FAQ',
|
||||
'HelpFAQ_Cat_General' => 'Allgemein',
|
||||
'HelpFAQ_Cat_Detail' => 'Detailansicht',
|
||||
'HelpFAQ_Cat_General_100_head' => 'Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht (Zeitverschiebung).',
|
||||
'HelpFAQ_Cat_General_100_text_a' => 'Auf deinem PC ist für die PHP Umgebung folgende Zeitzone voreingestellt:',
|
||||
'HelpFAQ_Cat_General_100_text_b' => 'Sollte dies nicht die Zeitzone sein, in der du dich aufhältst, solltest du die Zeitzone in der PHP Konfigurationsdatei anpassen. Diese findest du in diesem Verzeichnis:',
|
||||
'HelpFAQ_Cat_General_100_text_c' => 'Suche in dieser Datei nach dem Eintrag "date.timezone", entferne ggf. das führende ";" und trage die gewünschte Zeitzone ein. Eine Liste mit den unterstützten Zeitzonen findest du hier (<a href="https://www.php.net/manual/de/timezones.php" target="blank">Link</a>).',
|
||||
'HelpFAQ_Cat_General_101_head' => 'Mein Netzwerk scheint langsamer zu werden, Streaming "ruckelt".',
|
||||
'HelpFAQ_Cat_General_101_text' => 'Es kann durchaus sein, das leistungsschwache Geräte mit der Art und Weise, wie Pi.Alert neue Geräte im Netzwerk erkennt, an ihre Leistungsgrenzen kommen. Dies verstärkt sich noch einmal,
|
||||
wenn diese Geräte per WLAN mit dem Netzwerk kommunizieren. Lösungen wären hier, wenn möglich ein Wechsel auf eine Kabelverbindung oder, falls das Geräte nur einen begrenzten Zeitraum genutzt
|
||||
werden soll, den arp-Scan auf der Wartungsseite zu pausieren.',
|
||||
'HelpFAQ_Cat_General_102_head' => 'Ich bekomme die Meldung, dass die Datenbank schreibgeschützt (read only) ist.',
|
||||
'HelpFAQ_Cat_General_102_text' => 'Prüfe im Pi.Alert verzeichnis ob der Ordner der Datenbank (db) die richtigen Rechte zugewiesen bekommen hat:<br>
|
||||
<span class="text-danger help_faq_code">drwxrwx--- 2 (dein Username) www-data</span><br>
|
||||
Sollte die Berechtigung nicht stimmen, kannst du sie mit folgenden Befehlen im Terminal oder der Konsole wieder setzen:<br>
|
||||
<span class="text-danger help_faq_code">
|
||||
sudo chgrp -R www-data ~/pialert/db<br>
|
||||
chmod -R 770 ~/pialert/db
|
||||
</span><br>
|
||||
Wenn die Datenbank danach noch immer schreibgeschützt ist, versuche eine erneute Installation, oder das Zuückspielen eines Datenbank-Backups über die Wartungsseite.',
|
||||
'HelpFAQ_Cat_General_102docker_head' => '(🐳 Docker only) Database issues (AJAX errors, read-only, not found)',
|
||||
'HelpFAQ_Cat_General_102docker_text' => 'Double-check you\'ve followed the <a href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos="49:4-52:146" dir="auto">
|
||||
<li data-sourcepos="49:4-49:106">Download the <a href="https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db">original DB from GitHub</a>.</li>
|
||||
<li data-sourcepos="50:4-50:195">Map the <code>pialert.db</code> file (<g-emoji class="g-emoji" alias="warning" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/26a0.png">⚠</g-emoji> not folder) from above to <code>/home/pi/pialert/db/pialert.db</code> (see <a href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples">Examples</a> for details).</li>
|
||||
<li data-sourcepos="51:4-51:161">If facing issues (AJAX errors, can\'t write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/home/pi/pialert/front/log</code>.</li>
|
||||
<li data-sourcepos="52:4-52:146">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li>
|
||||
<li data-sourcepos="53:4-53:228">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li>
|
||||
</ul>',
|
||||
'HelpFAQ_Cat_General_103_head' => 'Die Login-Seite erscheint nicht, auch nicht nach der Passwortänderung.',
|
||||
'HelpFAQ_Cat_General_103_text' => 'Neben dem Passwort, muss in der Konfigurationsdatei <span class="text-danger help_faq_code">~/pialert/config/pialert.conf</span>
|
||||
auch der Parameter <span class="text-danger help_faq_code">PIALERT_WEB_PROTECTION</span> auf <span class="text-danger help_faq_code">True</span> gesetzt sein.',
|
||||
'HelpFAQ_Cat_Device_200_head' => 'Ich habe, mir nicht bekannte, Geräte in meiner Liste. Nach dem Löschen tauchen diese immer wieder auf.',
|
||||
'HelpFAQ_Cat_Device_200_text' => 'Wenn du Pi-hole verwendest, beachte bitte, dass Pi.Alert Informationen von Pi-hole abruft. Pausiere Pi.Alert, gehe in Pi-hole auf die Settings-Seite und
|
||||
lösche ggf. die betreffende DHCP-Lease. Anschließend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen.
|
||||
Wenn ja, lösche diese dort ebenfalls. Nun kannst du Pi.Alert wieder starten. Jetzt sollte das Gerät/die Geräte nicht mehr auftauchen.',
|
||||
'HelpFAQ_Cat_Detail_300_head' => 'Was bedeutet ',
|
||||
'HelpFAQ_Cat_Detail_300_text_a' => 'meint ein Netzwerkgerät (welches den typ AP, Gateway, Firewall, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet eingestellt hat)',
|
||||
'HelpFAQ_Cat_Detail_300_text_b' => 'bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Gerät mit diesem Netzwerkgerät verbunden ist.',
|
||||
'HelpFAQ_Cat_Detail_301_head_a' => 'Wann wird nun gescannt? Bei ',
|
||||
'HelpFAQ_Cat_Detail_301_head_b' => ' steht 1min aber der Graph zeigt 5min - Abstände an.',
|
||||
'HelpFAQ_Cat_Detail_301_text' => 'Den zeitlichen Abstand zwischen den Scans legt der "Cronjob" fest, welcher standardmäßig auf 5min eingestellt ist. Die Benennung "1min" bezieht sich auf die zu erwartende Dauer des Scans.
|
||||
Abhängig vor der Netzwerkkonfiguration kann diese Zeitangabe variieren. Um den Cronjob zu bearbeiten, kannst du im Terminal/der Konsole <span class="text-danger help_faq_code">crontab -e</span>
|
||||
eingeben und den Intervall ändern.',
|
||||
'HelpFAQ_Cat_Detail_302_head_a' => 'Was bedeutet ',
|
||||
'HelpFAQ_Cat_Detail_302_head_b' => ' und warum kann ich das nicht auswählen?',
|
||||
'HelpFAQ_Cat_Detail_302_text' => 'Einige moderne Geräte generieren aus Datenschutzgründen zufällige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden können und welche sich mit jeder neuen Verbindung wieder ändern.
|
||||
Pi.Alert erkennt, ob es sich um eine solche zufällige MAC-Adresse handelt und aktiviert diese "Feld" automatisch. Um das Verhalten abzustellen, muss du in deinem Endgerät schauen, wie du die
|
||||
MAC-Adressen-Generierung deaktivierst.',
|
||||
'HelpFAQ_Cat_Detail_303_head' => 'Was ist Nmap und wozu dient es?',
|
||||
'HelpFAQ_Cat_Detail_303_text' => 'Nmap ist ein Netzwerkscanner mit vielfältigen Möglichkeiten.<br>
|
||||
Wenn ein neues Gerät in deiner Liste auftaucht, hast du die Möglichkeit über den Nmap-Scan genauere Informationen über das Gerät zu erhalten.',
|
||||
'HelpFAQ_Cat_Presence_400_head' => 'Geräte werden mit einer gelben Markierung und dem Hinweis "missing Event" angezeigt.',
|
||||
'HelpFAQ_Cat_Presence_400_text' => 'Wenn dies geschieht hast du die Möglickeit, bei dem betreffenden Gerät (Detailsansicht) die Events zu löschen. Eine andere Möglichkeit wäre, das Gerät einzuschalten und zu warten, bis Pi.Alert mit dem nächsten
|
||||
Scan das Gerät als "Online" erkennt und anschließend das Gerät einfach wieder ausschalten. Nun sollte Pi.Alert mit dem nächsten Scan den Zustand des Gerätes ordentlich in der Datenbank vermerken.',
|
||||
'HelpFAQ_Cat_Presence_401_head' => 'Ein Gerät wird als Anwesend angezeigt, obwohl es "Offline" ist.',
|
||||
'HelpFAQ_Cat_Presence_401_text' => 'Wenn dies geschieht hast du die Möglickeit, bei dem betreffenden Gerät (Detailsansicht) die Events zu löschen. Eine andere Möglichkeit wäre, das Gerät einzuschalten und zu warten, bis Pi.Alert mit dem nächsten
|
||||
Scan das Gerät als "Online" erkennt und anschließend das Gerät einfach wieder ausschalten. Nun sollte Pi.Alert mit dem nächsten Scan den Zustand des Gerätes ordentlich in der Datenbank vermerken.',
|
||||
'HelpFAQ_Cat_Network_600_head' => 'Was bringt mir diese Seite?',
|
||||
'HelpFAQ_Cat_Network_600_text' => 'Diese Seite soll dir die Möglichkeit bieten, die Belegung deiner Netzwerkgeräte abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen,
|
||||
sie ggf. mit einer Portanzahl versehen und bereits erkannte Geräte diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Gerätes. So ist es dir möglich, schnell festzustellen
|
||||
an welchem Port ein Host angeschlossen und ob er online ist.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Settings
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
);
|
||||
?>
|
||||
616
front/php/templates/language/en_us.json
Executable file
@@ -0,0 +1,616 @@
|
||||
{
|
||||
"en_us": {
|
||||
"About_Title": "Open Source Network Guard",
|
||||
"About_Design" : "Designed for:",
|
||||
"About_Exit" : "Sign out",
|
||||
"Gen_Delete" : "Delete",
|
||||
"Gen_DeleteAll" : "Delete all",
|
||||
"Gen_Cancel" : "Cancel",
|
||||
"Gen_Okay" : "Ok",
|
||||
"Gen_Save" : "Save",
|
||||
"Gen_Saved" : "Saved",
|
||||
"Gen_Run" : "Run",
|
||||
"Gen_Copy" : "Run",
|
||||
"Gen_Action" : "Action",
|
||||
"Gen_Purge" : "Purge",
|
||||
"Gen_Backup" : "Run Backup",
|
||||
"Gen_Restore" : "Run Restore",
|
||||
"Gen_Switch" : "Switch",
|
||||
"Gen_AreYouSure" : "Are you sure?",
|
||||
"Gen_Upd" : "Updated successfully",
|
||||
"Gen_Upd_Fail" : "Update failed",
|
||||
"Gen_ReadDocs" : "Read more in the docs.",
|
||||
"Gen_DataUpdatedUITakesTime" : "OK - It may take a while for the UI to update if a scan is running.",
|
||||
"Gen_LockedDB" : "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
||||
"Login_Box" : "Enter your password",
|
||||
"Login_Remember" : "Remember",
|
||||
"Login_Remember_small" : "(valid for 7 days)",
|
||||
"Login_Submit" : "Log in",
|
||||
"Login_Psw_run" : "To change the password run:",
|
||||
"Login_Psw_new" : "new_password",
|
||||
"Login_Psw_folder" : "in the config folder.",
|
||||
"Login_Psw_alert" : "Password Alert!",
|
||||
"Login_Psw-box" : "Password",
|
||||
"Login_Toggle_Info" : "Password Information",
|
||||
"Login_Toggle_Info_headline" : "Password Information",
|
||||
"Login_Toggle_Alert_headline" : "Password Alert!",
|
||||
"Login_Default_PWD" : "Default password \"123456\" is still active.",
|
||||
"Navigation_Devices" : "Devices",
|
||||
"Navigation_Presence" : "Presence",
|
||||
"Navigation_Events" : "Events",
|
||||
"Navigation_Report" : "Report",
|
||||
"Navigation_Network" : "Network",
|
||||
"Navigation_Plugins" : "Plugins",
|
||||
"Navigation_Maintenance" : "Maintenance",
|
||||
"Navigation_Settings" : "Settings",
|
||||
"Navigation_SystemInfo" : "System info",
|
||||
"Navigation_Flows" : "Flows",
|
||||
"Navigation_HelpFAQ" : "Help / FAQ",
|
||||
"Navigation_Donations" : "Donations",
|
||||
"Device_Title" : "Devices",
|
||||
"Device_Shortcut_AllDevices" : "All Devices",
|
||||
"Device_Shortcut_Connected" : "Connected",
|
||||
"Device_Shortcut_Favorites" : "Favorites",
|
||||
"Device_Shortcut_NewDevices" : "New Devices",
|
||||
"Device_Shortcut_DownAlerts" : "Down Alerts",
|
||||
"Device_Shortcut_Archived" : "Archived",
|
||||
"Device_Shortcut_Devices" : "Devices",
|
||||
"Device_Shortcut_OnlineChart" : "Device presence over time",
|
||||
"Device_TableHead_Name" : "Name",
|
||||
"Device_TableHead_Owner" : "Owner",
|
||||
"Device_TableHead_Type" : "Type",
|
||||
"Device_TableHead_Icon" : "Icon",
|
||||
"Device_TableHead_RowID" : "Row ID",
|
||||
"Device_TableHead_Rowid" : "Row ID",
|
||||
"Device_TableHead_Parent_MAC" : "Parent node MAC",
|
||||
"Device_TableHead_Connected_Devices" : "Connected Devices",
|
||||
"Device_TableHead_Location" : "Location",
|
||||
"Device_TableHead_Vendor" : "Vendor",
|
||||
"Device_TableHead_Port" : "Port",
|
||||
"Device_TableHead_Favorite" : "Favorite",
|
||||
"Device_TableHead_Group" : "Group",
|
||||
"Device_TableHead_FirstSession" : "First Session",
|
||||
"Device_TableHead_LastSession" : "Last Session",
|
||||
"Device_TableHead_LastIP" : "Last IP",
|
||||
"Device_TableHead_MAC" : "Random MAC",
|
||||
"Device_TableHead_MAC_full" : "Full MAC",
|
||||
"Device_TableHead_LastIPOrder" : "Last IP Order",
|
||||
"Device_TableHead_Status" : "Status",
|
||||
"Device_Searchbox" : "Search",
|
||||
"Device_Tablelenght" : "Show _MENU_ entries",
|
||||
"Device_Tablelenght_all" : "All",
|
||||
"Device_Table_info" : "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||
"Device_Table_nav_next" : "Next",
|
||||
"Device_Table_nav_prev" : "Previous",
|
||||
"Presence_Title" : "Presence by Device",
|
||||
"Presence_Loading" : "Loading...",
|
||||
"Loading" : "Loading...",
|
||||
"Presence_Shortcut_AllDevices" : "All Devices",
|
||||
"Presence_Shortcut_Connected" : "Connected",
|
||||
"Presence_Shortcut_Favorites" : "Favorites",
|
||||
"Presence_Shortcut_NewDevices" : "New Devices",
|
||||
"Presence_Shortcut_DownAlerts" : "Down Alerts",
|
||||
"Presence_Shortcut_Archived" : "Archived",
|
||||
"Presence_Shortcut_Devices" : "Devices",
|
||||
"Presence_CallHead_Devices" : "Devices",
|
||||
"Presence_CalHead_lang" : "en-us",
|
||||
"Presence_CalHead_year" : "year",
|
||||
"Presence_CalHead_quarter" : "quarter",
|
||||
"Presence_CalHead_month" : "month",
|
||||
"Presence_CalHead_week" : "week",
|
||||
"Presence_CalHead_day" : "day",
|
||||
"Events_Title" : "Events",
|
||||
"Events_Loading" : "Loading...",
|
||||
"Events_Periodselect_today" : "Today",
|
||||
"Events_Periodselect_LastWeek" : "Last Week",
|
||||
"Events_Periodselect_LastMonth" : "Last Month",
|
||||
"Events_Periodselect_LastYear" : "Last Year",
|
||||
"Events_Periodselect_All" : "All Info",
|
||||
"Events_Shortcut_AllEvents" : "All Events",
|
||||
"Events_Shortcut_Sessions" : "Sessions",
|
||||
"Events_Shortcut_MissSessions" : "Missing Sessions",
|
||||
"Events_Shortcut_VoidSessions" : "Voided Sessions",
|
||||
"Events_Shortcut_NewDevices" : "New Devices",
|
||||
"Events_Shortcut_DownAlerts" : "Down Alerts",
|
||||
"Events_Shortcut_Events" : "Events",
|
||||
"Events_TableHead_Order" : "Order",
|
||||
"Events_TableHead_Device" : "Device",
|
||||
"Events_TableHead_Owner" : "Owner",
|
||||
"Events_TableHead_Date" : "Date",
|
||||
"Events_TableHead_EventType" : "Event Type",
|
||||
"Events_TableHead_Connection" : "Connection",
|
||||
"Events_TableHead_Disconnection" : "Disconnection",
|
||||
"Events_TableHead_Duration" : "Duration",
|
||||
"Events_TableHead_DurationOrder" : "Duration Order",
|
||||
"Events_TableHead_IP" : "IP",
|
||||
"Events_TableHead_IPOrder" : "IP Order",
|
||||
"Events_TableHead_AdditionalInfo" : "Additional Info",
|
||||
"Events_Searchbox" : "Search",
|
||||
"Events_Tablelenght" : "Show _MENU_ entries",
|
||||
"Events_Tablelenght_all" : "All",
|
||||
"Events_Table_info" : "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||
"Events_Table_nav_next" : "Next",
|
||||
"Events_Table_nav_prev" : "Previous",
|
||||
"DevDetail_Loading" : "Loading...",
|
||||
"DevDetail_Periodselect_today" : "Today",
|
||||
"DevDetail_Periodselect_LastWeek" : "Last Week",
|
||||
"DevDetail_Periodselect_LastMonth" : "Last Month",
|
||||
"DevDetail_Periodselect_LastYear" : "Last Year",
|
||||
"DevDetail_Periodselect_All" : "All Info",
|
||||
"DevDetail_Shortcut_CurrentStatus" : "Current Status",
|
||||
"DevDetail_Shortcut_Sessions" : "Sessions",
|
||||
"DevDetail_Shortcut_Presence" : "Presence",
|
||||
"DevDetail_Shortcut_DownAlerts" : "Down Alerts",
|
||||
"DevDetail_Tab_Details" : "<i class=\"fa fa-info-circle\"></i> Details",
|
||||
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Tools",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Title": "Internet Info",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Description": "The Internet info tool displays information about the Internet connection, such as IP address, city, country, area code and time zone.",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Start": "Start Internet Info",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Error": "An error has occurred",
|
||||
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup is a command-line tool used to query the Domain Name System (DNS). DNS is a system that translates domain names, such as www.google.com, into IP addresses , such as 172.217.0.142.",
|
||||
"DevDetail_Tab_Tools_Nslookup_Start": "Start Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Error": "Error: IP address is not valid",
|
||||
"DevDetail_Tab_Tools_Speedtest_Title" : "Online Speedtest",
|
||||
"DevDetail_Tab_Tools_Speedtest_Description" : "The Speedtest tool measures the download speed, upload speed and latency of the internet connection.",
|
||||
"DevDetail_Tab_Tools_Speedtest_Start" : "Start Speedtest",
|
||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute is a network diagnostic command used to trace the path that data packets take from one host to another.<br><br>The command uses the Internet Control Message Protocol (ICMP) to send packets to intermediate nodes on the route, each intermediate node responds with an ICMP time-out (TTL timed out) packet.<br><br>The output of the traceroute command displays the IP address of each intermediate node on the route.<br><br>The traceroute command can be used to diagnose network problems, such as delays, packet loss, and blocked routes.<br><br>It can also be used to identify the location of an intermediate node on a network.",
|
||||
"DevDetail_Tab_Tools_Traceroute_Start": "Start Traceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Error": "Error: IP address is not valid",
|
||||
"DevDetail_Tab_Nmap" : "<i class=\"fa fa-ethernet\"></i> Nmap",
|
||||
"DevDetail_Tab_Sessions" : "<i class=\"fa fa-list-ol\"></i> Sessions",
|
||||
"DevDetail_Tab_Presence" : "<i class=\"fa fa-calendar\"></i> Presence",
|
||||
"DevDetail_Tab_Events" : "<i class=\"fa fa-bolt\"></i> Events",
|
||||
"DevDetail_Tab_EventsTableDate" : "Date",
|
||||
"DevDetail_Tab_EventsTableEvent" : "Event type",
|
||||
"DevDetail_Tab_EventsTableIP" : "IP",
|
||||
"DevDetail_Tab_EventsTableInfo" : "Additional info",
|
||||
"DevDetail_Tab_Plugins" : "<i class=\"fa fa-plug\"></i> Plugins",
|
||||
"DevDetail_Tab_NmapTableHeader" : "Scheduled scan results",
|
||||
"DevDetail_Tab_NmapTableText" : "Set up a schedule in <a href=\"/settings.php#NMAP_ACTIVE\">Settings</a>",
|
||||
"DevDetail_Tab_NmapEmpty" : "No ports detected with Nmap on this device.",
|
||||
"DevDetail_Tab_NmapTableIndex" : "Index",
|
||||
"DevDetail_Tab_NmapTableTime" : "Time",
|
||||
"DevDetail_Tab_NmapTablePort" : "Port",
|
||||
"DevDetail_Tab_NmapTableState" : "State",
|
||||
"DevDetail_Tab_NmapTableService" : "Service",
|
||||
"DevDetail_Tab_NmapTableExtra" : "Extra",
|
||||
"DevDetail_MainInfo_Title" : "<i class=\"fa fa-pencil\"></i> Main Info",
|
||||
"DevDetail_MainInfo_mac" : "MAC",
|
||||
"DevDetail_MainInfo_Name" : "Name",
|
||||
"DevDetail_MainInfo_Owner" : "Owner",
|
||||
"DevDetail_Owner_hover" : "Who owns this device. Free text field.",
|
||||
"DevDetail_MainInfo_Type" : "Type",
|
||||
"DevDetail_Type_hover" : "The Type of the device. If you select any of the pre-defined network devices (e.g.: AP, Firewall, Router, Switch...) they will show up in the Network tree configuration as possible parent network nodes.",
|
||||
"DevDetail_Icon" : "Icon",
|
||||
"DevDetail_Icon_Descr" : "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
|
||||
"DevDetail_MainInfo_Vendor" : "Vendor",
|
||||
"DevDetail_Vendor_hover" : "Vendor should be auto-detected. You can overwrite or add your custom value.",
|
||||
"DevDetail_MainInfo_Favorite" : "Favorite",
|
||||
"DevDetail_MainInfo_Group" : "Group",
|
||||
"DevDetail_MainInfo_Location" : "Location",
|
||||
"DevDetail_MainInfo_Comments" : "Comments",
|
||||
"DevDetail_MainInfo_Network_Title" : "<i class=\"fa fa-network-wired\"></i> Network",
|
||||
"DevDetail_MainInfo_Network" : "<i class=\"fa fa-server\"></i> Node (MAC)",
|
||||
"DevDetail_Network_Node_hover" : "Select the parent network device the current device is connected to, to populate the Network tree.",
|
||||
"DevDetail_GoToNetworkNode" : "Navigate to the Network page of the given node.",
|
||||
"DevDetail_MainInfo_Network_Port" : "<i class=\"fa fa-ethernet\"></i> Port",
|
||||
"DevDetail_Network_Port_hover" : "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
|
||||
"DevDetail_SessionInfo_Title" : "<i class=\"fa fa-calendar\"></i> Session Info",
|
||||
"DevDetail_SessionInfo_Status" : "Status",
|
||||
"DevDetail_SessionInfo_FirstSession" : "First Session",
|
||||
"DevDetail_SessionInfo_LastSession" : "Last Session",
|
||||
"DevDetail_SessionInfo_LastIP" : "Last IP",
|
||||
"DevDetail_SessionInfo_StaticIP" : "Static IP",
|
||||
"DevDetail_EveandAl_Title" : "<i class=\"fa fa-bolt\"></i> Events & Alerts config",
|
||||
"DevDetail_EveandAl_ScanCycle" : "Scan device",
|
||||
"DevDetail_EveandAl_AlertAllEvents" : "Alert All Events",
|
||||
"DevDetail_EveandAl_AlertDown" : "Alert Down",
|
||||
"DevDetail_EveandAl_Skip" : "Skip repeated notifications for",
|
||||
"DevDetail_EveandAl_NewDevice" : "New Device",
|
||||
"DevDetail_EveandAl_Archived" : "Archived",
|
||||
"DevDetail_EveandAl_RandomMAC" : "Random MAC",
|
||||
"RandomMAC_hover" : "Autodetected - indicates if the device randomizes it's MAC address.",
|
||||
"DevDetail_EveandAl_ScanCycle_a" : "Scan Device",
|
||||
"DevDetail_EveandAl_ScanCycle_z" : "Don't Scan Device",
|
||||
"DevDetail_button_Delete" : "Delete Device",
|
||||
"DevDetail_button_DeleteEvents" : "Delete Events",
|
||||
"DevDetail_button_DeleteEvents_Warning" : "Are you sure you want to delete all Events of this device?<br><br>(this will clear the <b>Events history</b> and the <b>Sessions</b> and might help with constant (persistent) notifications)",
|
||||
"DevDetail_button_Reset" : "Reset Changes",
|
||||
"DevDetail_button_Save" : "Save",
|
||||
"DevDetail_button_OverwriteIcons" : "Overwrite Icons",
|
||||
"DevDetail_button_OverwriteIcons_Tooltip" : "Overwrite icons of all devices with the same device type",
|
||||
"DevDetail_button_OverwriteIcons_Warning" : "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
||||
"DevDetail_SessionTable_Order" : "Order",
|
||||
"DevDetail_SessionTable_Connection" : "Connection",
|
||||
"DevDetail_SessionTable_Disconnection" : "Disconnection",
|
||||
"DevDetail_SessionTable_Duration" : "Duration",
|
||||
"DevDetail_SessionTable_IP" : "IP",
|
||||
"DevDetail_SessionTable_Additionalinfo" : "Additional info",
|
||||
"DevDetail_Events_CheckBox" : "Hide Connection Events",
|
||||
"DevDetail_Nmap_buttonFast" : "Fast Scan",
|
||||
"DevDetail_Nmap_buttonDefault" : "Default Scan",
|
||||
"DevDetail_Nmap_buttonDetail" : "Detailed Scan",
|
||||
"DevDetail_Nmap_buttonFast_text" : "Fast Scan: Scan fewer ports (100) than the default scan (a few seconds)",
|
||||
"DevDetail_Nmap_buttonDefault_text" : "Default Scan: Nmap scans the top 1,000 ports for each scan protocol requested. This catches roughly 93% of the TCP ports and 49% of the UDP ports. (about 5 seconds)",
|
||||
"DevDetail_Nmap_buttonDetail_text" : "Detailed Scan: Default scan with enabled OS detection, version detection, script scanning and traceroute (up to 30 seconds or more)",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery" : "Skip host discovery",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery_text" : "Skip host discovery (-Pn option): Default scan without host discovery",
|
||||
"DevDetail_Nmap_resultsLink" : "You can leave this page after starting a scan. Results will be also available in the <code>pialert_front.log</code> file.",
|
||||
"DevDetail_Nmap_Scans": "Manual Nmap Scans",
|
||||
"DevDetail_Nmap_Scans_desc": "Here you can execute manual NMAP scans. You can also schedule regular automatic NMAP scans via the Services & Ports (NMAP) plugin. Head to <a href='/settings.php' target='_blank'>Settings</a> to find out more",
|
||||
"BackDevDetail_Actions_Title_Run" : "Run action",
|
||||
"BackDevDetail_Actions_Not_Registered" : "Action not registered: ",
|
||||
"BackDevDetail_Actions_Ask_Run" : "Do you want to execute the action?",
|
||||
"BackDevDetail_Tools_WOL_okay" : "The command was executed.",
|
||||
"BackDevDetail_Tools_WOL_error" : "The command was NOT executed.",
|
||||
"DevDetail_Tools_WOL_noti" : "Wake-on-LAN",
|
||||
"DevDetail_Tools_WOL_noti_text" : "The Wake-on-LAN command is sent to the broadcast address. If the target is not in the subnet/VLAN of Pi.Alert, the target device will not respond.",
|
||||
"DevDetail_Tools_WOL" : "Send WoL command to ",
|
||||
"DevDetail_WOL_Title" : "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||
"DevDetail_Run_Actions_Title" : "<i class=\"fa fa-play\"></i> Run action on device",
|
||||
"DevDetail_Run_Actions_Tooltip" : "Run an action on the current device from the dropdown list.",
|
||||
"DevDetail_Copy_Device_Title" : "<i class=\"fa fa-copy\"></i> Copy details from device",
|
||||
"DevDetail_Copy_Device_Tooltip" : "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
||||
"BackDevDetail_Copy_Title" : "Copy details",
|
||||
"BackDevDetail_Copy_Ask" : "Copy details from device from the dropdown list (Everything on this page will be overwritten)?",
|
||||
"Maintenance_Title" : "Maintenance tools",
|
||||
"Maintenance_version" : "App updates",
|
||||
"Maintenance_new_version" : "🆕 A new version is available. Check out the <a href=\"https://github.com/jokob-sk/Pi.Alert/releases\" target=\"_blank\">release notes</a>.",
|
||||
"Maintenance_current_version" : "You are up-to-date. Check out what <a href=\"https://github.com/jokob-sk/Pi.Alert/issues/138\" target=\"_blank\">I am working on</a>.",
|
||||
"Maintenance_built_on" : "Built on",
|
||||
"Maintenance_Running_Version" : "Installed version",
|
||||
"Maintenance_database_path" : "Database-Path",
|
||||
"Maintenance_database_size" : "Database-Size",
|
||||
"Maintenance_database_rows" : "Table (Rows)",
|
||||
"Maintenance_database_lastmod" : "Last Modification",
|
||||
"Maintenance_database_backup" : "DB Backups",
|
||||
"Maintenance_database_backup_found" : "backups were found",
|
||||
"Maintenance_database_backup_total" : "total disk usage",
|
||||
"Maintenance_arp_status" : "Scan Status",
|
||||
"Maintenance_arp_status_off" : "is currently disabled",
|
||||
"Maintenance_arp_status_on" : "scan(s) currently running",
|
||||
"Maintenance_themeselector_lable" : "Select Skin",
|
||||
"Maintenance_themeselector_empty" : "Choose a Skin",
|
||||
"Maintenance_themeselector_apply" : "Apply",
|
||||
"Maintenance_themeselector_text" : "The change takes place on the server side, so it affects all devices in use.",
|
||||
"Maintenance_lang_selector_lable" : "Select Language",
|
||||
"Maintenance_lang_selector_empty" : "Choose Language",
|
||||
"Maintenance_lang_en_us" : "English (US)",
|
||||
"Maintenance_lang_de_de" : "German (DE)",
|
||||
"Maintenance_lang_es_es" : "Spanish (ES)",
|
||||
"Maintenance_lang_selector_text" : "The change takes place on the client side, so it affects only the current browser.",
|
||||
"Maintenance_lang_selector_apply" : "Apply",
|
||||
"Maintenance_Status" : "Status",
|
||||
"Maintenance_Tools_Tab_Settings" : "Settings",
|
||||
"Maintenance_Tools_Tab_UISettings" : "UI Settings",
|
||||
"Maintenance_Tools_Tab_Tools" : "Tools",
|
||||
"Maintenance_Tools_Tab_BackupRestore" : "Backup / Restore",
|
||||
"Maintenance_Tools_Tab_Logging" : "Logs",
|
||||
"Maintenance_Tool_displayed_columns_text" : "Change the visibility and order of the columns in the <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a> page. (The drag-and-drop is a bit clunky, but for now workable, not a common task - will not fix for now (tried for <a href=\"https://github.com/jokob-sk/Pi.Alert/commit/94b32f0f7332879f5a7d2af05dafa2e5d5cfa5da\">like 3h</a> - happy for someone to submit a PR :) )).",
|
||||
"Maintenance_Tool_order_columns_text" : "",
|
||||
"Maintenance_Tool_darkmode" : "Toggle Modes (Dark/Light)",
|
||||
"Maintenance_Tool_drag_me" : "Drag me to reorder columns.",
|
||||
"Maintenance_Tool_check_visible" : "Uncheck to hide column.",
|
||||
"Maintenance_Tool_darkmode_text" : "Toggle between dark mode and light mode. If the switch does not work properly, try to clear the browser cache. The change takes place on the server side, so it affects all devices in use.",
|
||||
"Maintenance_Tool_darkmode_noti" : "Toggle Modes",
|
||||
"Maintenance_Tool_darkmode_noti_text" : "After the theme switch, the page tries to reload itself to activate the change. If necessary, the cache must be cleared.",
|
||||
"Maintenance_Tool_arpscansw" : "Toggle arp-Scan (on/off)",
|
||||
"Maintenance_Tool_arpscansw_text" : "Switching the arp-scan on or off. When the scan has been switched off it remains off until it is activated again. Active scans are not canceled.",
|
||||
"Maintenance_Tool_arpscansw_noti" : "Toggle arp-Scan on or off",
|
||||
"Maintenance_Tool_arpscansw_noti_text" : "When the scan has been switched off it remains off until it is activated again.",
|
||||
"Maintenance_Tool_del_empty_macs" : "Delete Devices with empty MACs",
|
||||
"Maintenance_Tool_del_empty_macs_text" : "Before using this function, please make a backup. The deletion cannot be undone. All devices without MAC will be deleted from the database.",
|
||||
"Maintenance_Tool_del_empty_macs_noti" : "Delete Devices",
|
||||
"Maintenance_Tool_del_empty_macs_noti_text" : "Are you sure you want to delete all devices with empty MAC addresses?<br>(maybe you prefer to archive it)",
|
||||
"Maintenance_Tool_upgrade_database_noti" : "Upgrade database",
|
||||
"Maintenance_Tool_upgrade_database_text" : "This button will upgrade the database to enable the Network activity over last 12 hours chart. Please backup your database in case of issues.",
|
||||
"Maintenance_Tool_upgrade_database_noti_text" : "Are you sure you want to upgrade the database?<br>(maybe you prefer to archive it)",
|
||||
"Maintenance_Tool_del_alldev" : "Delete all Devices",
|
||||
"Maintenance_Tool_del_alldev_text" : "Before using this function, please make a backup. The deletion cannot be undone. All devices will be deleted from the database.",
|
||||
"Maintenance_Tool_del_alldev_noti" : "Delete Devices",
|
||||
"Maintenance_Tool_del_alldev_noti_text" : "Are you sure you want to delete all devices?",
|
||||
"Maintenance_Tool_del_unknowndev" : "Delete (unknown) Devices",
|
||||
"Maintenance_Tool_del_unknowndev_text" : "Before using this function, please make a backup. The deletion cannot be undone. All devices named (unknown) will be deleted from the database.",
|
||||
"Maintenance_Tool_del_unknowndev_noti" : "Delete (unknown) Devices",
|
||||
"Maintenance_Tool_del_unknowndev_noti_text" : "Are you sure you want to delete all (unknown) devices?",
|
||||
"Maintenance_Tool_del_allevents" : "Delete Events (Reset Presence)",
|
||||
"Maintenance_Tool_del_allevents_text" : "Before using this function, please make a backup. The deletion cannot be undone. All events in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
||||
"Maintenance_Tool_del_allevents_noti" : "Delete Events",
|
||||
"Maintenance_Tool_del_allevents_noti_text" : "Are you sure you want to delete all Events? This resets Presence of all Devices.",
|
||||
"Maintenance_Tool_del_allevents30" : "Delete all Events older than 30 days",
|
||||
"Maintenance_Tool_del_allevents30_text" : "Before using this function, please make a backup. The deletion cannot be undone. All events older than 30 days in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
||||
"Maintenance_Tool_del_allevents30_noti" : "Delete Events",
|
||||
"Maintenance_Tool_del_allevents30_noti_text" : "Are you sure you want to delete all Events older than 30 days? This resets Presence of all Devices.",
|
||||
"Maintenance_Tool_backup" : "DB Backup",
|
||||
"Maintenance_Tool_backup_text" : "The database backups are located in the database directory as a zip-archive, named with the creation date. There is no maximum number of backups.",
|
||||
"Maintenance_Tool_backup_noti" : "DB Backup",
|
||||
"Maintenance_Tool_backup_noti_text" : "Are you sure you want to execute the DB Backup? Be sure that no scan is currently running.",
|
||||
"Maintenance_Tool_restore" : "DB Restore",
|
||||
"Maintenance_Tool_restore_text" : "The latest backup can be restored via the button, but older backups can only be restored manually. After the restore, make an integrity check on the database for safety, in case the db was currently in write access when the backup was created.",
|
||||
"Maintenance_Tool_restore_noti" : "DB Restore",
|
||||
"Maintenance_Tool_restore_noti_text" : "Are you sure you want to execute the DB Restore? Be sure that no scan is currently running.",
|
||||
"Maintenance_Tool_purgebackup" : "Purge Backups",
|
||||
"Maintenance_Tool_purgebackup_text" : "All other backups will be deleted except for the last 3 backups.",
|
||||
"Maintenance_Tool_purgebackup_noti" : "Purge Backups",
|
||||
"Maintenance_Tool_purgebackup_noti_text" : "Are you sure you want to delete all backups except the last 3?",
|
||||
"Maintenance_Tool_del_ActHistory" : "Deleting the network activity",
|
||||
"Maintenance_Tool_del_ActHistory_text" : "The network activity graph is reset. This does not affect the events.",
|
||||
"Maintenance_Tool_del_ActHistory_noti" : "Delete network activity",
|
||||
"Maintenance_Tool_del_ActHistory_noti_text" : "Are you sure you want to reset the network activity?",
|
||||
"Maintenance_Tool_ExportCSV" : "CSV Export",
|
||||
"Maintenance_Tool_ExportCSV_text" : "Generate a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this by accessing this URL <code>your pialert url/php/server/devices.php?action=ExportCSV</code>",
|
||||
"Maintenance_Tool_ExportCSV_noti" : "CSV Export",
|
||||
"Maintenance_Tool_ExportCSV_noti_text" : "Are you sure you want to generate a CSV file?",
|
||||
"Maintenance_Tool_ImportCSV" : "CSV Import",
|
||||
"Maintenance_Tool_ImportCSV_text" : "Before using this function, please make a backup. Import a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices. To do that place the CSV file named <b>devices.csv</b> into your <b>/config</b> folder.",
|
||||
"Maintenance_Tool_ImportCSV_noti" : "CSV Import",
|
||||
"Maintenance_Tool_ImportCSV_noti_text" : "Are you sure you want to import the CSV file? This will completely overwrite the devices in your database.",
|
||||
"BackDevices_Arpscan_disabled" : "Arp-Scan Disabled",
|
||||
"BackDevices_Arpscan_enabled" : "Arp-Scan Enabled",
|
||||
"BackDevices_darkmode_disabled" : "Darkmode Disabled",
|
||||
"BackDevices_darkmode_enabled" : "Darkmode Enabled",
|
||||
"BackDevices_Restore_CopError" : "The original database could not be saved.",
|
||||
"BackDevices_Restore_okay" : "Restore executed successfully.",
|
||||
"BackDevices_Restore_Failed" : "Restore Failed. Please restore the backup manually.",
|
||||
"BackDevices_Backup_CopError" : "The original database could not be saved.",
|
||||
"BackDevices_Backup_okay" : "The backup executed successfully with the new archive",
|
||||
"BackDevices_Backup_Failed" : "The backup executed partially successfully. The archive could not be created or is empty.",
|
||||
"BackDevices_DBTools_DelDev_a" : "Device deleted successfully",
|
||||
"BackDevices_DBTools_DelDev_b" : "Devices deleted successfully",
|
||||
"BackDevices_DBTools_DelEvents" : "Events deleted successfully",
|
||||
"BackDevices_DBTools_DelEventsError" : "Error deleting Events",
|
||||
"BackDevices_DBTools_DelDevError_a" : "Error deleting Device",
|
||||
"BackDevices_DBTools_DelDevError_b" : "Error deleting Devices",
|
||||
"BackDevices_DBTools_UpdDev" : "Device updated successfully",
|
||||
"BackDevices_DBTools_UpdDevError" : "Error updating device",
|
||||
"BackDevices_DBTools_Upgrade" : "Database upgraded successfully",
|
||||
"BackDevices_DBTools_UpgradeError" : "Database upgrade failed",
|
||||
"BackDevices_DBTools_Purge" : "The oldest backups were deleted",
|
||||
"BackDevices_DBTools_ImportCSV" : "The devices from the CSV file were imported successfully.",
|
||||
"BackDevices_DBTools_ImportCSVError" : "The CSV file could not be imported. Make sure the format is correct.",
|
||||
"BackDevices_DBTools_ImportCSVMissing" : "The CSV file could not be found under <b>/config/devices.csv.</b>",
|
||||
"BackDevices_Device_UpdDevError" : "Error updating devices, try later. The database is probably locked due to an ongoing task.",
|
||||
"Network_Title" : "Network overview",
|
||||
"Network_ManageDevices" : "Manage Devices",
|
||||
"Network_ManageAdd" : "Add Device",
|
||||
"Network_ManageAssign" : "Assign",
|
||||
"Network_ManageUnassign" : "Unassign",
|
||||
"Network_ManageEdit" : "Update Device",
|
||||
"Network_ManageDel" : "Delete Device",
|
||||
"Network_ManageAdd_Name" : "Device Name",
|
||||
"Network_ManageAdd_Name_text" : "Name without special characters",
|
||||
"Network_ManageAdd_Type" : "Device Type",
|
||||
"Network_ManageAdd_Type_text" : "-- Select Type --",
|
||||
"Network_ManageAdd_Port" : "Port Count",
|
||||
"Network_ManageAdd_Port_text" : "leave blank for wifi and powerline",
|
||||
"Network_ManageAdd_Submit" : "Add Device",
|
||||
"Network_ManageEdit_ID" : "Device to update",
|
||||
"Network_ManageEdit_ID_text" : "-- Select Device for editing --",
|
||||
"Network_ManageEdit_Name" : "New Device Name",
|
||||
"Network_ManageEdit_Name_text" : "Name without special characters",
|
||||
"Network_ManageEdit_Type" : "New Device Type",
|
||||
"Network_ManageEdit_Type_text" : "-- Select Type --",
|
||||
"Network_ManageEdit_Port" : " New Port Count",
|
||||
"Network_ManageEdit_Port_text" : "leave blank for wifi and powerline",
|
||||
"Network_ManageEdit_Submit" : "Save Changes",
|
||||
"Network_ManageDel_Name" : "Device to delete",
|
||||
"Network_ManageDel_Name_text" : "-- Select Device --",
|
||||
"Network_ManageDel_Submit" : "Delete",
|
||||
"Network_Table_State" : "State",
|
||||
"Network_Table_Hostname" : "Hostname",
|
||||
"Network_Table_IP" : "IP",
|
||||
"Network_UnassignedDevices" : "Unassigned devices",
|
||||
"Network_Assign" : "Connect to the above <i class=\"fa fa-server\"></i> Network node",
|
||||
"Network_Connected" : "Connected devices",
|
||||
"Network_ManageLeaf" : "Manage assignment",
|
||||
"Network_Node" : "Network node",
|
||||
"Network_Node_Name" : "Node name",
|
||||
"Network_Parent" : "Parent network device",
|
||||
"Network_Cant_Assign" : "Can't assign the root Internet node as a child leaf node.",
|
||||
"Network_NoAssignedDevices" : "This network node does not have any assigned devices (leaf nodes). Assign one from bellow or go to the <b><i class=\"fa fa-info-circle\"></i> Details</b> tab of any device in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a>, and assign it to a network <b><i class=\"fa fa-server\"></i> Node (MAC)</b> and <b><i class=\"fa fa-ethernet\"></i> Port</b> there.",
|
||||
"Network_Root_Unconfigurable": "Unconfigurable root",
|
||||
"HelpFAQ_Title" : "Help / FAQ",
|
||||
"HelpFAQ_Cat_General" : "General",
|
||||
"HelpFAQ_Cat_Detail" : "Details",
|
||||
"HelpFAQ_Cat_General_100_head" : "The clock on the top right and the times of the events/presence are not correct (time difference).",
|
||||
"HelpFAQ_Cat_General_100_text_a" : "On your PC the following time zone is set for the PHP environment:",
|
||||
"HelpFAQ_Cat_General_100_text_b" : "If this is not the timezone you are in, you should change the timezone in the PHP configuration file. You can find it in this directory:",
|
||||
"HelpFAQ_Cat_General_100_text_c" : "Search in this file for the entry \"date.timezone\", remove the leading \";\" if necessary and enter the desired timezone. A list with the supported timezones can be found here (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
|
||||
"HelpFAQ_Cat_General_101_head" : "My network seems to slow down, streaming \"freezes\".",
|
||||
"HelpFAQ_Cat_General_101_text" : "It may well be that low-powered devices reach their performance limits with the way Pi.Alert detects new devices on the network. This is amplified even more, if these devices communicate with the network via WLAN. Solutions here would be to switch to a wired connection if possible or, if the device is only to be used for a limited period of time, to use the arp scan. pause the arp scan on the maintenance page.",
|
||||
"HelpFAQ_Cat_General_102_head" : "I get the message that the database is read only.",
|
||||
"HelpFAQ_Cat_General_102_text" : "Check in the Pi.Alert directory if the database folder (db) has been assigned the correct permissions:<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (your username) www-data</span><br> If the permission is not correct, you can set it again with the following commands in the terminal or the console:<br> <span class=\"text-danger help_faq_code\">sudo chgrp -R www-data ~/pialert/db<br>chmod -R 770 ~/pialert/db</span><br>If the database is still read-only, try reinstalling or restoring a database backup from the maintenance page.",
|
||||
"HelpFAQ_Cat_General_102docker_head" : "Database issues (AJAX errors, read-only, not found)",
|
||||
"HelpFAQ_Cat_General_102docker_text" : "Double-check you have followed the <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles\">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"><li data-sourcepos=\"49:4-49:106\">Download the <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db\">original DB from GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Map the <code>pialert.db</code> file (<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">⚠</g-emoji> not folder) from above to <code>/home/pi/pialert/db/pialert.db</code> (see <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples\">Examples</a> for details).</li><li data-sourcepos=\"51:4-51:161\">If facing issues (AJAX errors, can not write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/home/pi/pialert/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li><li data-sourcepos=\"53:4-53:228\">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li></ul>",
|
||||
"HelpFAQ_Cat_General_103_head" : "The login page does not appear, even after changing the password.",
|
||||
"HelpFAQ_Cat_General_103_text" : "In addition to the password, the configuration file must contain <span class=\"text-danger help_faq_code\">~/pialert/config/pialert.conf</span> also the parameter <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> must set to <span class=\"text-danger help_faq_code\">True</span>.",
|
||||
"HelpFAQ_Cat_Device_200_head" : "I have devices in my list that I do not know about. After deleting them, they always reappear.",
|
||||
"HelpFAQ_Cat_Device_200_text" : "If you use Pi-hole, please note that Pi.Alert retrieves information from Pi-hole. Pause Pi.Alert, go to the settings page in Pi-hole and delete the DHCP lease if necessary. Then, also in Pi-hole, look under Tools -> Network to see if you can find the recurring hosts there. If yes, delete them there as well. Now you can start Pi.Alert again. Now the device(s) should not show up anymore.",
|
||||
"HelpFAQ_Cat_Detail_300_head" : "What means ",
|
||||
"HelpFAQ_Cat_Detail_300_text_a" : "means a network device (a device of the type AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet). Custom types can be added via the <code>NETWORK_DEVICE_TYPES</code> setting.",
|
||||
"HelpFAQ_Cat_Detail_300_text_b" : "designates the port number where the currently edited device is connected to this network device. Read <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/NETWORK_TREE.md\">this guide</a> for more info.",
|
||||
"HelpFAQ_Cat_Detail_301_head_a" : "When is scanning now? At ",
|
||||
"HelpFAQ_Cat_Detail_301_head_b" : " says 1min but the graph shows 5min intervals.",
|
||||
"HelpFAQ_Cat_Detail_301_text" : "The time interval between the scans is defined by the \"Cronjob\", which is set to 5min by default. The designation \"1min\" refers to the expected duration of the scan. Depending on the network configuration, this time may vary. To edit the cronjob, you can use the following command in the terminal/console <span class=\"text-danger help_faq_code\">crontab -e</span>and change the interval.",
|
||||
"HelpFAQ_Cat_Detail_302_head_a" : "What means ",
|
||||
"HelpFAQ_Cat_Detail_302_head_b" : "and why can not I select that?",
|
||||
"HelpFAQ_Cat_Detail_302_text" : "Some modern devices generate random MAC addresses for privacy reasons, which can no longer be associated with any manufacturer and which change again with each new connection. Pi.Alert detects if it is such a random MAC address and activates this \"field\" automatically. To disable this behavior you have to look in your device how to disable MAC address randomization.",
|
||||
"HelpFAQ_Cat_Detail_303_head" : "What is Nmap and what is it for?",
|
||||
"HelpFAQ_Cat_Detail_303_text" : "Nmap is a network scanner with multiple capabilities.<br>When a new device appears in your list, you have the possibility to get more detailed information about the device via the Nmap scan.",
|
||||
"HelpFAQ_Cat_Presence_400_head" : "Devices are displayed with a yellow marker and the note \"missing event\".",
|
||||
"HelpFAQ_Cat_Presence_400_text" : "If this happens, you have the option to delete the events on the device in question (details view). Another possibility would be to switch on the device and wait until Pi.Alert detects the device as \"online\" with the next scan and then simply turn the device off again. Now Pi.Alert should properly note the state of the device in the database with the next scan.",
|
||||
"HelpFAQ_Cat_Presence_401_head" : "A device is displayed as present although it is \"Offline\".",
|
||||
"HelpFAQ_Cat_Presence_401_text" : "If this happens, you have the possibility to delete the events for the device in question (details view). Another possibility would be to switch on the device and wait until Pi.Alert recognizes the device as \"online\" with the next scan and then simply switch the device off again. Now Pi.Alert should properly note the state of the device in the database with the next scan.",
|
||||
"HelpFAQ_Cat_Network_600_head" : "What is this page for?",
|
||||
"HelpFAQ_Cat_Network_600_text" : "This page should offer you the possibility to map the assignment of your network devices. For this purpose, you can create one or more switches, WLANs, routers, etc., provide them with a port number if necessary and assign already detected devices to them. This assignment is done in the detailed view of the device to be assigned. So it is possible for you to quickly determine to which port a host is connected and if it is online. Read <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/NETWORK_TREE.md\">this guide</a> for more info.",
|
||||
"HelpFAQ_Cat_Network_601_head" : "Are there other docs?",
|
||||
"HelpFAQ_Cat_Network_601_text" : "Yes, there are! Check <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/\">all docs</a> for more info.",
|
||||
"test_event_tooltip" : "Save your changes at first before you test your settings.",
|
||||
"test_event_icon" : "fa-vial-circle-check",
|
||||
"run_event_tooltip" : "Enable the setting and save your changes at first before you run it.",
|
||||
"run_event_icon" : "fa-play",
|
||||
"general_event_title" : "Executing an ad-hoc event",
|
||||
"general_event_description" : "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
||||
"Plugins_Unprocessed_Events" : "Unprocessed Events",
|
||||
"Plugins_Objects" : "Plugin Objects",
|
||||
"Plugins_DeleteAll" : "Delete all (filters are ignored)",
|
||||
"Plugins_History" : "Events History",
|
||||
"Plugins_Filters_Mac" : "Mac Filter",
|
||||
"Plugins_Out_of" : "out of",
|
||||
"Plugins_no_control" : "No form control was found to render this value.",
|
||||
"settings_enabled" : "Enabled settings",
|
||||
"settings_enabled_icon" : "fa-solid fa-toggle-on",
|
||||
"settings_core_icon" : "fa-solid fa-gem",
|
||||
"settings_device_scanners_icon" : "fa-solid fa-magnifying-glass-plus",
|
||||
"settings_other_scanners_icon" : "fa-solid fa-recycle",
|
||||
"settings_system_icon" : "fa-solid fa-gear",
|
||||
"settings_publishers_icon" : "fa-solid fa-comment-dots",
|
||||
"Settings_Metadata_Toggle" : "Show/hide metadata for the given setting.",
|
||||
"settings_missing" : "Not all settings loaded, refresh the page! This is probably caused by a high load on the database or app startup sequence.",
|
||||
"settings_missing_block" : "You can not save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.",
|
||||
"settings_old" : "Importing settings and re-initializing...",
|
||||
"devices_old" : "Refreshing...",
|
||||
"settings_saved" : "<br/>Settings saved to the <code>pialert.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
|
||||
"settings_system_label" : "System",
|
||||
"settings_core_label" : "Core",
|
||||
"settings_imported_label" : "Settings imported",
|
||||
"settings_imported" : "Last time settings were imported from the pialert.conf file",
|
||||
"settings_other_scanners_label" : "Other scanners",
|
||||
"settings_other_scanners" : "Other, non-device scanner plugins that are currently enabled.",
|
||||
"settings_device_scanners_label" : "Device scanners",
|
||||
"settings_device_scanners" : "Device scanners used to discover devices that write into the CurrentScan database table.",
|
||||
"settings_publishers_label" : "Publishers",
|
||||
"settings_publishers" : "Enabled notification gateways - publishers, that will send a notification depending on your settings.",
|
||||
"settings_expand_all" : "Expand all",
|
||||
"Settings_device_Scanners_desync": "⚠ Device scanner schedules are out-of-sync.",
|
||||
"Settings_device_Scanners_desync_popup": "Schedules of devices scanners (<code>*_RUN_SCHD</code>) are not the same. This will result into inconsistent device online/offline notifications. Unless this is intended, please use the same schedule for all enabled <b>🔍Device scanners</b>.",
|
||||
"Setting_Override" : "Override value",
|
||||
"Setting_Override_Description" : "Enabling this option will override an App supplied default value with the value specified above.",
|
||||
"General_display_name" : "General",
|
||||
"General_icon" : "<i class=\"fa fa-gears\"></i>",
|
||||
"SCAN_SUBNETS_description" : "Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the <a onclick=\"toggleAllSettings()\" href=\"#PIHOLE_RUN\"><code>PIHOLE_RUN</code>PiHole integration settings</a>. The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.",
|
||||
"LOG_LEVEL_name" : "Print additional logging",
|
||||
"LOG_LEVEL_description" : "This setting will enable more verbose logging. Useful for debugging events writing into the database.",
|
||||
"TIMEZONE_name" : "Time zone",
|
||||
"TIMEZONE_description" : "Time zone to display stats correctly. Find your time zone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">here</a>.",
|
||||
"ENABLE_PLUGINS_name" : "Enable Plugins",
|
||||
"ENABLE_PLUGINS_description" : "Enables the <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins\">plugins</a> functionality. Loading plugins requires more hardware resources so you might want to disable them on low-powered system.",
|
||||
"PLUGINS_KEEP_HIST_name" : "Plugins History",
|
||||
"PLUGINS_KEEP_HIST_description" : "How many entries of Plugins History scan results should be kept (per Plugin, and not device specific).",
|
||||
"DBCLNP_NOTIFI_HIST_name" : "Notifications History",
|
||||
"DBCLNP_NOTIFI_HIST_description" : "How many historical entries of Notifications should be kept.",
|
||||
"PIALERT_WEB_PROTECTION_name" : "Enable login",
|
||||
"PIALERT_WEB_PROTECTION_description" : "When enabled a login dialog is displayed. Read below carefully if you get locked out of your instance.",
|
||||
"PIALERT_WEB_PASSWORD_name" : "Login password",
|
||||
"PIALERT_WEB_PASSWORD_description" : "The default password is <code>123456</code>. To change the password run <code>/home/pi/pialert/back/pialert-cli</code> in the container or use the <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a>.",
|
||||
"INCLUDED_SECTIONS_name" : "Notify on",
|
||||
"INCLUDED_SECTIONS_description" : "Specifies which events trigger notifications. Remove the event type(s) you do not want to get notified on. This setting overrides device-specific settings in the UI. (<code>CTRL + Click</code> to select/deselect).",
|
||||
"DAYS_TO_KEEP_EVENTS_name" : "Delete events older than",
|
||||
"DAYS_TO_KEEP_EVENTS_description" : "This is a maintenance setting. This specifies the number of days worth of event entries that will be kept. All older events will be deleted periodically. Also applies on Plugin Events History.",
|
||||
"HRS_TO_KEEP_NEWDEV_name" : "Keep new devices for",
|
||||
"HRS_TO_KEEP_NEWDEV_description" : "This is a maintenance setting. If enabled (<code>0</code> is disabled), devices marked as <b>New Device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New Devices</b> after <code>X</code> hours.",
|
||||
"REPORT_DASHBOARD_URL_name" : "Pi.Alert URL",
|
||||
"REPORT_DASHBOARD_URL_description" : "This URL is used as the base for generating links in HTML reports (e.g.: emails). Enter full URL starting with <code>http://</code> including the port number (no trailing slash <code>/</code>).",
|
||||
"DIG_GET_IP_ARG_name" : "Internet IP discovery",
|
||||
"DIG_GET_IP_ARG_description" : "Change the <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>.",
|
||||
"NETWORK_DEVICE_TYPES_name" : "Network device types",
|
||||
"NETWORK_DEVICE_TYPES_description" : "Which device types are allowed to be used as network devices in the Network view. The device type has to match exactly the <code>Type</code> setting on a specific device in Device details. Do not remove existing types, only add new ones.",
|
||||
"UI_LANG_name" : "UI Language",
|
||||
"UI_LANG_description" : "Select the preferred UI language.",
|
||||
"UI_PRESENCE_name" : "Show in presence chart",
|
||||
"UI_PRESENCE_description" : "Select what statuses should be shown in the <b>Device presence over time</b> chart in the <a href=\"/devices.php\" target=\"_blank\">Devices</a> page. (<code>CTRL + Click</code> to select/deselect)",
|
||||
"Email_display_name" : "Email",
|
||||
"Email_icon" : "<i class=\"fa fa-at\"></i>",
|
||||
"REPORT_MAIL_name" : "Enable email",
|
||||
"REPORT_MAIL_description" : "If enabled an email is sent out with a list of changes you have subscribed to. Please also fill out all remaining settings related to the SMTP setup below. If facing issues, set <code>LOG_LEVEL</code> to <code>debug</code> and check the <a href=\"/maintenance.php#tab_Logging\">error log</a>.",
|
||||
"SYSTEM_TITLE" : "System Information",
|
||||
"REPORT_TITLE" : "Report",
|
||||
"REPORT_ERROR" : "The page you are looking for is temporarily unavailable, please try again after a few seconds",
|
||||
"API_display_name" : "API",
|
||||
"API_icon" : "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||
"API_CUSTOM_SQL_name" : "Custom endpoint",
|
||||
"API_CUSTOM_SQL_description" : "You can specify a custom SQL query which will generate a JSON file and then expose it via the <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> file endpoint</a>.",
|
||||
"Speedtest_Results" : "Speedtest Results",
|
||||
"Systeminfo_General" : "General",
|
||||
"Systeminfo_General_Full_Date": "Full Date:",
|
||||
"Systeminfo_General_Date": "Date:",
|
||||
"Systeminfo_General_Date2": "Date2:",
|
||||
"Systeminfo_General_TimeZone": "Timezone:",
|
||||
"Systeminfo_This_Client" : "This Client",
|
||||
"Systeminfo_Client_User_Agent": "User Agent:",
|
||||
"Systeminfo_Client_Resolution": "Browser Resolution:",
|
||||
"Systeminfo_CPU" : "CPU",
|
||||
"Systeminfo_CPU_Vendor": "CPU Vendor:",
|
||||
"Systeminfo_CPU_Name": "CPU Name:",
|
||||
"Systeminfo_CPU_Cores": "CPU Cores:",
|
||||
"Systeminfo_CPU_Speed": "CPU Speed:",
|
||||
"Systeminfo_CPU_Temp": "CPU Temp:",
|
||||
"Systeminfo_Memory" : "Memory",
|
||||
"Systeminfo_Memory_Usage": "Memory usage:",
|
||||
"Systeminfo_Memory_Usage_Percent": "Memory %:",
|
||||
"Systeminfo_Memory_Total_Memory": "Total memory:",
|
||||
"Systeminfo_Motherboard" : "Motherboard",
|
||||
"Systeminfo_Motherboard_BIOS": "BIOS:",
|
||||
"Systeminfo_Motherboard_BIOS_Date": "BIOS date:",
|
||||
"Systeminfo_Motherboard_BIOS_Vendor": "BIOS vendor:",
|
||||
"Systeminfo_Motherboard_Manufactured": "Manufactured by:",
|
||||
"Systeminfo_Motherboard_Name": "Name:",
|
||||
"Systeminfo_Motherboard_Revision": "Revision:",
|
||||
"Systeminfo_Network" : "Network",
|
||||
"Systeminfo_Network_Accept_Encoding": "Accept encoding:",
|
||||
"Systeminfo_Network_Accept_Language": "Accept language:",
|
||||
"Systeminfo_Network_Connection_Port": "Connection port:",
|
||||
"Systeminfo_Network_HTTP_Host": "HTTP host:",
|
||||
"Systeminfo_Network_HTTP_Referer": "HTTP referrer:",
|
||||
"Systeminfo_Network_HTTP_Referer_String": "No HTTP referrer",
|
||||
"Systeminfo_Network_IP": "IP Internet:",
|
||||
"Systeminfo_Network_IP_Connection": "IP connection:",
|
||||
"Systeminfo_Network_IP_Server": "Server IP:",
|
||||
"Systeminfo_Network_MIME": "MIME:",
|
||||
"Systeminfo_Network_Request_Method": "Request Method:",
|
||||
"Systeminfo_Network_Request_URI": "Request URI:",
|
||||
"Systeminfo_Network_Request_Time": "Request time:",
|
||||
"Systeminfo_Network_Secure_Connection": "Secure connection:",
|
||||
"Systeminfo_Network_Secure_Connection_String": "No (HTTP)",
|
||||
"Systeminfo_Network_Server_Name": "Server name:",
|
||||
"Systeminfo_Network_Server_Name_String": "Server name not found",
|
||||
"Systeminfo_Network_Server_Query": "Server query:",
|
||||
"Systeminfo_Network_Server_Query_String": "No query string",
|
||||
"Systeminfo_Network_Server_Version": "Server Version:",
|
||||
"Systeminfo_Network_Hardware" : "Network Hardware",
|
||||
"Systeminfo_Storage" : "Storage",
|
||||
"Systeminfo_Storage_Mount" : "Mount point:",
|
||||
"Systeminfo_Storage_Device" : "Device:",
|
||||
"Systeminfo_Storage_Size" : "Size:",
|
||||
"Systeminfo_Storage_Type" : "Type:",
|
||||
"Systeminfo_Storage_Usage" : "Storage usage",
|
||||
"Systeminfo_Storage_Usage_Mount" : "Mount point:",
|
||||
"Systeminfo_Storage_Usage_Total" : "Total:",
|
||||
"Systeminfo_Storage_Usage_Used" : "Used:",
|
||||
"Systeminfo_Storage_Usage_Free" : "Free:",
|
||||
"Systeminfo_Services" : "Services",
|
||||
"Systeminfo_Services_Name" : "Service Name",
|
||||
"Systeminfo_Services_Description" : "Service Description",
|
||||
"Systeminfo_System" : "System",
|
||||
"Systeminfo_System_Architecture": "Architecture:",
|
||||
"Systeminfo_System_AVG": "Load average:",
|
||||
"Systeminfo_System_Kernel": "Kernel:",
|
||||
"Systeminfo_System_OSVersion": "Operating System:",
|
||||
"Systeminfo_System_Running_Processes" : "Running processes:",
|
||||
"Systeminfo_System_System": "System:",
|
||||
"Systeminfo_System_Uname": "Uname:",
|
||||
"Systeminfo_System_Uptime": "Uptime:",
|
||||
"Systeminfo_USB_Devices" : "USB Devices",
|
||||
"report_select_format": "Select Format:",
|
||||
"report_time": "Notification time:",
|
||||
"report_guid": "Notification guid:",
|
||||
"report_guid_missing": "Linked notification not found. The selected notification might have been deleted during maintenance as specified in the <code>DBCLNP_NOTIFI_HIST</code> setting. The latest notification is displayed instead. The missing notification has the following GUID:",
|
||||
"Donations_Title" : "Donations",
|
||||
"Donations_Text" : "Hey 👋! </br> Thanks for clicking on this menu item 😅 </br> </br> I'm trying to collect some donations to make you better software. Also, it would help me not to get burned out. Me burning out might mean end of support for this app. Any small (recurring or not) sponsorship makes me want to put more effort into this app. I don't want to lock features (new plugins) behind paywalls 🔐. </br> Currently, I'm waking up 2h before work so I contribute to the app a bit. If I had some recurring income I could shorten my workweek and in the remaining time fully focus on PiAlert. You'd get more functionality, a more polished app and less bugs. </br> </br> Thanks for reading - I'm super grateful for any support ❤🙏 </br> </br> TL;DR: By supporting me you get: </br> </br> <ul><li>Regular updates to keep your data and family safe 🔄</li><li>Less bugs 🐛🔫</li><li>Better and more functionality➕</li><li>I don't get burned out 🔥🤯</li><li>Less rushed releases 💨</li><li>Better docs📚</li><li>Quicker and better support with issues 🆘</li><li>Less grumpy me 😄</li></ul> </br> 📧Email me to <a href='mailto:jokob@duck.com?subject=PiAlert'>jokob@duck.com</a> if you want to get in touch or if I should add other sponsorship platforms. </br>",
|
||||
"Donations_Platforms" : "Sponsor platforms",
|
||||
"Donations_Others" : "Others"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,699 +0,0 @@
|
||||
<?php
|
||||
|
||||
$lang['en_us'] = array(
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// About - Update by @TeroRERO 07ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'About_Title' => 'Open Source Network Guard',
|
||||
'About_Design' => 'Designed for:',
|
||||
'About_Exit' => 'Sign out',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// General
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'Gen_Delete' => 'Delete',
|
||||
'Gen_DeleteAll' => 'Delete all',
|
||||
'Gen_Cancel' => 'Cancel',
|
||||
'Gen_Okay' => 'Ok',
|
||||
'Gen_Save' => 'Save',
|
||||
'Gen_Saved' => 'Saved',
|
||||
'Gen_Run' => 'Run',
|
||||
'Gen_Action' => 'Action',
|
||||
'Gen_Purge' => 'Purge',
|
||||
'Gen_Backup' => 'Run Backup',
|
||||
'Gen_Restore' => 'Run Restore',
|
||||
'Gen_Switch' => 'Switch',
|
||||
'Gen_AreYouSure' => 'Are you sure?',
|
||||
'Gen_Upd' => 'Updated successfully',
|
||||
'Gen_Upd_Fail' => 'Update failed',
|
||||
'Gen_Help' => 'Need help?',
|
||||
'Gen_DataUpdatedUITakesTime' => 'OK - It may take a while for the UI to update if a scan is runnig.',
|
||||
'Gen_LockedDB' => 'ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Login Page - Update by @TeroRERO 03ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Login_Box' => 'Enter your password',
|
||||
'Login_Remember' => 'Remember',
|
||||
'Login_Remember_small' => '(valid for 7 days)',
|
||||
'Login_Submit' => 'Log in',
|
||||
'Login_Psw_run' => 'To change the password run:',
|
||||
'Login_Psw_new' => 'new_password',
|
||||
'Login_Psw_folder' => 'in the config folder.',
|
||||
'Login_Psw_alert' => 'Password Alert!',
|
||||
'Login_Psw-box' => 'Password',
|
||||
'Login_Toggle_Info' => 'Password Information',
|
||||
'Login_Toggle_Info_headline' => 'Password Information',
|
||||
'Login_Toggle_Alert_headline' => 'Password Alert!',
|
||||
'Login_Default_PWD' => 'Default password "123456" is still active.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Navigation_Devices' => 'Devices',
|
||||
'Navigation_Presence' => 'Presence',
|
||||
'Navigation_Events' => 'Events',
|
||||
'Navigation_Network' => 'Network',
|
||||
'Navigation_Plugins' => 'Plugins',
|
||||
'Navigation_Maintenance' => 'Maintenance',
|
||||
'Navigation_Settings' => 'Settings',
|
||||
'Navigation_HelpFAQ' => 'Help / FAQ',
|
||||
'Device_Title' => 'Devices',
|
||||
'Device_Shortcut_AllDevices' => 'All Devices',
|
||||
'Device_Shortcut_Connected' => 'Connected',
|
||||
'Device_Shortcut_Favorites' => 'Favorites',
|
||||
'Device_Shortcut_NewDevices' => 'New Devices',
|
||||
'Device_Shortcut_DownAlerts' => 'Down Alerts',
|
||||
'Device_Shortcut_Archived' => 'Archived',
|
||||
'Device_Shortcut_Devices' => 'Devices',
|
||||
'Device_Shortcut_OnlineChart' => 'Device presence over time',
|
||||
'Device_TableHead_Name' => 'Name',
|
||||
'Device_TableHead_Owner' => 'Owner',
|
||||
'Device_TableHead_Type' => 'Type',
|
||||
'Device_TableHead_Icon' => 'Icon',
|
||||
'Device_TableHead_RowID' => 'Row ID',
|
||||
'Device_TableHead_Rowid' => 'Row ID',
|
||||
'Device_TableHead_Parent_MAC' => 'Parent node MAC',
|
||||
'Device_TableHead_Connected_Devices' => 'Connected Devices',
|
||||
'Device_TableHead_Location' => 'Location',
|
||||
'Device_TableHead_Vendor' => 'Vendor',
|
||||
'Device_TableHead_Favorite' => 'Favorite',
|
||||
'Device_TableHead_Group' => 'Group',
|
||||
'Device_TableHead_FirstSession' => 'First Session',
|
||||
'Device_TableHead_LastSession' => 'Last Session',
|
||||
'Device_TableHead_LastIP' => 'Last IP',
|
||||
'Device_TableHead_MAC' => 'MAC',
|
||||
'Device_TableHead_MAC_full' => 'Full MAC',
|
||||
'Device_TableHead_LastIPOrder' => 'Last IP Order',
|
||||
'Device_TableHead_Status' => 'Status',
|
||||
'Device_Searchbox' => 'Search',
|
||||
'Device_Tablelenght' => 'Show _MENU_ entries',
|
||||
'Device_Tablelenght_all' => 'All',
|
||||
'Device_Table_info' => 'Showing _START_ to _END_ of _TOTAL_ entries',
|
||||
'Device_Table_nav_next' => 'Next',
|
||||
'Device_Table_nav_prev' => 'Previous',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Presence Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Presence_Title' => 'Presence by Device',
|
||||
'Presence_Shortcut_AllDevices' => 'All Devices',
|
||||
'Presence_Shortcut_Connected' => 'Connected',
|
||||
'Presence_Shortcut_Favorites' => 'Favorites',
|
||||
'Presence_Shortcut_NewDevices' => 'New Devices',
|
||||
'Presence_Shortcut_DownAlerts' => 'Down Alerts',
|
||||
'Presence_Shortcut_Archived' => 'Archived',
|
||||
'Presence_Shortcut_Devices' => 'Devices',
|
||||
|
||||
// Localizationfiles under pialert/front/lib/AdminLTE/bower_components/fullcalendar/dist/locale
|
||||
'Presence_CallHead_Devices' => 'Devices',
|
||||
'Presence_CalHead_lang' => 'en-us',
|
||||
'Presence_CalHead_year' => 'year',
|
||||
'Presence_CalHead_quarter' => 'quarter',
|
||||
'Presence_CalHead_month' => 'month',
|
||||
'Presence_CalHead_week' => 'week',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Events Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Events_Title' => 'Events',
|
||||
'Events_Periodselect_today' => 'Today',
|
||||
'Events_Periodselect_LastWeek' => 'Last Week',
|
||||
'Events_Periodselect_LastMonth' => 'Last Month',
|
||||
'Events_Periodselect_LastYear' => 'Last Year',
|
||||
'Events_Periodselect_All' => 'All Info',
|
||||
'Events_Shortcut_AllEvents' => 'All Events',
|
||||
'Events_Shortcut_Sessions' => 'Sessions',
|
||||
'Events_Shortcut_MissSessions' => 'Missing Sessions',
|
||||
'Events_Shortcut_VoidSessions' => 'Voided Sessions',
|
||||
'Events_Shortcut_NewDevices' => 'New Devices',
|
||||
'Events_Shortcut_DownAlerts' => 'Down Alerts',
|
||||
'Events_Shortcut_Events' => 'Events',
|
||||
'Events_TableHead_Order' => 'Order',
|
||||
'Events_TableHead_Device' => 'Device',
|
||||
'Events_TableHead_Owner' => 'Owner',
|
||||
'Events_TableHead_Date' => 'Date',
|
||||
'Events_TableHead_EventType' => 'Event Type',
|
||||
'Events_TableHead_Connection' => 'Connection',
|
||||
'Events_TableHead_Disconnection' => 'Disconnection',
|
||||
'Events_TableHead_Duration' => 'Duration',
|
||||
'Events_TableHead_DurationOrder' => 'Duration Order',
|
||||
'Events_TableHead_IP' => 'IP',
|
||||
'Events_TableHead_IPOrder' => 'IP Order',
|
||||
'Events_TableHead_AdditionalInfo' => 'Additional Info',
|
||||
'Events_Searchbox' => 'Search',
|
||||
'Events_Tablelenght' => 'Show _MENU_ entries',
|
||||
'Events_Tablelenght_all' => 'All',
|
||||
'Events_Table_info' => 'Showing _START_ to _END_ of _TOTAL_ entries',
|
||||
'Events_Table_nav_next' => 'Next',
|
||||
'Events_Table_nav_prev' => 'Previous',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Details Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'DevDetail_Periodselect_today' => 'Today',
|
||||
'DevDetail_Periodselect_LastWeek' => 'Last Week',
|
||||
'DevDetail_Periodselect_LastMonth' => 'Last Month',
|
||||
'DevDetail_Periodselect_LastYear' => 'Last Year',
|
||||
'DevDetail_Periodselect_All' => 'All Info',
|
||||
'DevDetail_Shortcut_CurrentStatus' => 'Current Status',
|
||||
'DevDetail_Shortcut_Sessions' => 'Sessions',
|
||||
'DevDetail_Shortcut_Presence' => 'Presence',
|
||||
'DevDetail_Shortcut_DownAlerts' => 'Down Alerts',
|
||||
'DevDetail_Tab_Details' => '<i class="fa fa-info-circle"></i> Details',
|
||||
'DevDetail_Tab_Nmap' => '<i class="fa fa-ethernet"></i> Nmap',
|
||||
'DevDetail_Tab_Sessions' => '<i class="fa fa-list-ol"></i> Sessions',
|
||||
'DevDetail_Tab_Presence' => '<i class="fa fa-calendar"></i> Presence',
|
||||
'DevDetail_Tab_Events' => '<i class="fa fa-bolt"></i> Events',
|
||||
'DevDetail_Tab_Pholus' => '<i class="fa fa-search"></i> Pholus',
|
||||
'DevDetail_Tab_PholusEmpty' => 'Nothing sniffed out with Pholus for this device.',
|
||||
'DevDetail_Tab_NmapTableHeader' => 'Scheduled scan results',
|
||||
'DevDetail_Tab_NmapTableText' => 'Set up a schedule in <a href="/settings.php#NMAP_ACTIVE">Settings</a>',
|
||||
'DevDetail_Tab_NmapEmpty' => 'No ports detected with Nmap on this device.',
|
||||
'DevDetail_MainInfo_Title' => '<i class="fa fa-pencil"></i> Main Info',
|
||||
'DevDetail_MainInfo_mac' => 'MAC',
|
||||
'DevDetail_MainInfo_Name' => 'Name',
|
||||
'DevDetail_MainInfo_Owner' => 'Owner',
|
||||
'DevDetail_MainInfo_Type' => 'Type',
|
||||
'DevDetail_Icon' => 'Icon',
|
||||
'DevDetail_Icon_Descr' => 'Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.',
|
||||
'DevDetail_MainInfo_Vendor' => 'Vendor',
|
||||
'DevDetail_MainInfo_Favorite' => 'Favorite',
|
||||
'DevDetail_MainInfo_Group' => 'Group',
|
||||
'DevDetail_MainInfo_Location' => 'Location',
|
||||
'DevDetail_MainInfo_Comments' => 'Comments',
|
||||
'DevDetail_MainInfo_Network_Title' => '<i class="fa fa-network-wired"></i> Network',
|
||||
'DevDetail_MainInfo_Network' => '<i class="fa fa-server"></i> Node (MAC)',
|
||||
'DevDetail_GoToNetworkNode' => 'Navigate to the Network page of the given node.',
|
||||
'DevDetail_MainInfo_Network_Port' => '<i class="fa fa-ethernet"></i> Port',
|
||||
'DevDetail_SessionInfo_Title' => '<i class="fa fa-calendar"></i> Session Info',
|
||||
'DevDetail_SessionInfo_Status' => 'Status',
|
||||
'DevDetail_SessionInfo_FirstSession' => 'First Session',
|
||||
'DevDetail_SessionInfo_LastSession' => 'Last Session',
|
||||
'DevDetail_SessionInfo_LastIP' => 'Last IP',
|
||||
'DevDetail_SessionInfo_StaticIP' => 'Static IP',
|
||||
'DevDetail_EveandAl_Title' => '<i class="fa fa-bolt"></i> Events & Alerts config',
|
||||
'DevDetail_EveandAl_ScanCycle' => 'Scan device',
|
||||
'DevDetail_EveandAl_AlertAllEvents' => 'Alert All Events',
|
||||
'DevDetail_EveandAl_AlertDown' => 'Alert Down',
|
||||
'DevDetail_EveandAl_Skip' => 'Skip repeated notifications for',
|
||||
'DevDetail_EveandAl_NewDevice' => 'New Device',
|
||||
'DevDetail_EveandAl_Archived' => 'Archived',
|
||||
'DevDetail_EveandAl_RandomMAC' => 'Random MAC',
|
||||
'DevDetail_EveandAl_ScanCycle_a' => 'Scan Device',
|
||||
'DevDetail_EveandAl_ScanCycle_z' => 'Don't Scan Device',
|
||||
'DevDetail_button_Delete' => 'Delete Device',
|
||||
'DevDetail_button_DeleteEvents' => 'Delete Events',
|
||||
'DevDetail_button_DeleteEvents_Warning' => 'Are you sure you want to delete all Events of this device?<br><br>(this will clear the <b>Events history</b> and the <b>Sessions</b> and might help with constant (persistent) notifications)',
|
||||
'DevDetail_button_Reset' => 'Reset Changes',
|
||||
'DevDetail_button_Save' => 'Save',
|
||||
'DevDetail_button_OverwriteIcons' => 'Overwrite Icons',
|
||||
'DevDetail_button_OverwriteIcons_Tooltip' => 'Overwrite icons of all devices with the same device type',
|
||||
'DevDetail_button_OverwriteIcons_Warning' => 'Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?',
|
||||
'DevDetail_SessionTable_Order' => 'Order',
|
||||
'DevDetail_SessionTable_Connection' => 'Connection',
|
||||
'DevDetail_SessionTable_Disconnection' => 'Disconnection',
|
||||
'DevDetail_SessionTable_Duration' => 'Duration',
|
||||
'DevDetail_SessionTable_IP' => 'IP',
|
||||
'DevDetail_SessionTable_Additionalinfo' => 'Additional info',
|
||||
'DevDetail_Events_CheckBox' => 'Hide Connection Events',
|
||||
'DevDetail_Nmap_buttonFast' => 'Fast Scan',
|
||||
'DevDetail_Nmap_buttonDefault' => 'Default Scan',
|
||||
'DevDetail_Nmap_buttonDetail' => 'Detailed Scan',
|
||||
'DevDetail_Nmap_buttonFast_text' => 'Fast Scan: Scan fewer ports (100) than the default scan (a few seconds)',
|
||||
'DevDetail_Nmap_buttonDefault_text' => 'Default Scan: Nmap scans the top 1,000 ports for each scan protocol requested. This catches roughly 93% of the TCP ports and 49% of the UDP ports. (about 5 seconds)',
|
||||
'DevDetail_Nmap_buttonDetail_text' => 'Detailed Scan: Default scan with enabled OS detection, version detection, script scanning and traceroute (up to 30 seconds or more)',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery' => 'Skip host discovery',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery_text' => 'Skip host discovery (-Pn option): Default scan without host discovery',
|
||||
'DevDetail_Nmap_resultsLink' => 'You can leave this page after starting a scan. Results will be also available in the <code>pialert_front.log</code> file.',
|
||||
'BackDevDetail_Actions_Title_Run' => 'Run action',
|
||||
'BackDevDetail_Actions_Not_Registered' => 'Action not registered: ',
|
||||
'BackDevDetail_Actions_Ask_Run' => 'Do you want to execute the action?',
|
||||
'BackDevDetail_Tools_WOL_okay' => 'The command was executed.',
|
||||
'BackDevDetail_Tools_WOL_error' => 'The command was NOT executed.',
|
||||
'DevDetail_Tools_WOL_noti' => 'Wake-on-LAN',
|
||||
'DevDetail_Tools_WOL_noti_text' => 'The Wake-on-LAN command is sent to the broadcast address. If the target is not in the subnet/vlan of Pi.Alert, the target device will not respond.',
|
||||
'DevDetail_Tools_WOL' => 'Send Wol command to ',
|
||||
'DevDetail_WOL_Title' => '<i class="fa fa-power-off"></i> Wake-on-LAN',
|
||||
'DevDetail_Run_Actions_Title' => '<i class="fa fa-play"></i> Run action on device',
|
||||
'DevDetail_Run_Actions_Tooltip' => 'Run an action on the current device from the dropdown list.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Maintenance_Title' => 'Maintenance tools',
|
||||
'Maintenance_version' => 'Application updates',
|
||||
'Maintenance_new_version' => '🆕 A new version is available. Check out the <a href="https://github.com/jokob-sk/Pi.Alert/releases" target="_blank">release notes</a>.',
|
||||
'Maintenance_current_version' => 'You are up-to-date. Check out what <a href="https://github.com/jokob-sk/Pi.Alert/issues/138" target="_blank">I\'m working on</a>.',
|
||||
'Maintenance_database_path' => 'Database-Path',
|
||||
'Maintenance_database_size' => 'Database-Size',
|
||||
'Maintenance_database_lastmod' => 'Last Modification',
|
||||
'Maintenance_database_backup' => 'DB Backups',
|
||||
'Maintenance_database_backup_found' => 'backups were found',
|
||||
'Maintenance_database_backup_total' => 'total disk usage',
|
||||
'Maintenance_arp_status' => 'Scan Status',
|
||||
'Maintenance_arp_status_off' => 'is currently disabled',
|
||||
'Maintenance_arp_status_on' => 'scan(s) currently running',
|
||||
'Maintenance_themeselector_lable' => 'Select Skin',
|
||||
'Maintenance_themeselector_empty' => 'Choose a Skin',
|
||||
'Maintenance_themeselector_apply' => 'Apply',
|
||||
'Maintenance_themeselector_text' => 'The change takes place on the server side, so it affects all devices in use.',
|
||||
'Maintenance_lang_selector_lable' => 'Select Language',
|
||||
'Maintenance_lang_selector_empty' => 'Choose Language',
|
||||
'Maintenance_lang_en_us' => 'English (US)',
|
||||
'Maintenance_lang_de_de' => 'German (DE)',
|
||||
'Maintenance_lang_es_es' => 'Spanish (ES)',
|
||||
'Maintenance_lang_selector_text' => 'The change takes place on the client side, so it affects only the current browser.',
|
||||
'Maintenance_lang_selector_apply' => 'Apply',
|
||||
'Maintenance_Tools_Tab_Settings' => 'Settings',
|
||||
'Maintenance_Tools_Tab_UISettings' => 'UI Settings',
|
||||
'Maintenance_Tools_Tab_Tools' => 'Tools',
|
||||
'Maintenance_Tools_Tab_BackupRestore' => 'Backup / Restore',
|
||||
'Maintenance_Tools_Tab_Logging' => 'Logs',
|
||||
'Maintenance_Tool_displayed_columns_text' => 'Change the visibility and order of the columns in the <a href="devices.php"><b> <i class="fa fa-laptop"></i> Devices</b></a> page. (The drag-and-drop is a bit clunky, but for now workable, not a common task - won\'t fix for now (tried for <a href="https://github.com/jokob-sk/Pi.Alert/commit/94b32f0f7332879f5a7d2af05dafa2e5d5cfa5da">like 3h</a> - happy for someone to submit a PR :) )).',
|
||||
'Maintenance_Tool_order_columns_text' => '',
|
||||
'Maintenance_Tool_darkmode' => 'Toggle Modes (Dark/Light)',
|
||||
'Maintenance_Tool_drag_me' => 'Drag me to reorder columns.',
|
||||
'Maintenance_Tool_check_visible' => 'Uncheck to hide column.',
|
||||
'Maintenance_Tool_darkmode_text' => 'Toggle between dark mode and light mode. If the switch does not work properly, try to clear the browser cache. The change takes place on the server side, so it affects all devices in use.',
|
||||
'Maintenance_Tool_darkmode_noti' => 'Toggle Modes',
|
||||
'Maintenance_Tool_darkmode_noti_text' => 'After the theme switch, the page tries to reload itself to activate the change. If necessary, the cache must be cleared.',
|
||||
'Maintenance_Tool_arpscansw' => 'Toggle arp-Scan (on/off)',
|
||||
'Maintenance_Tool_arpscansw_text' => 'Switching the arp-scan on or off. When the scan has been switched off it remains off until it is activated again. Active scans are not canceled.',
|
||||
'Maintenance_Tool_arpscansw_noti' => 'Toggle arp-Scan on or off',
|
||||
'Maintenance_Tool_arpscansw_noti_text' => 'When the scan has been switched off it remains off until it is activated again.',
|
||||
'Maintenance_Tool_del_empty_macs' => 'Delete Devices with empty MACs',
|
||||
'Maintenance_Tool_del_empty_macs_text' => 'Before using this function, please make a backup. The deletion cannot be undone. All devices without MAC will be deleted from the database.',
|
||||
'Maintenance_Tool_del_empty_macs_noti' => 'Delete Devices',
|
||||
'Maintenance_Tool_del_empty_macs_noti_text' => 'Are you sure you want to delete all devices with empty MAC addresses?<br>(maybe you prefer to archive it)',
|
||||
'Maintenance_Tool_upgrade_database_noti' => 'Upgrade database',
|
||||
'Maintenance_Tool_upgrade_database_text' => 'This button will upgrade the database to enable the Network activity over last 12 hours chart. Please backup your database in case of issues.',
|
||||
'Maintenance_Tool_upgrade_database_noti_text' => 'Are you sure you want to upgrade the database?<br>(maybe you prefer to archive it)',
|
||||
'Maintenance_Tool_del_alldev' => 'Delete all Devices',
|
||||
'Maintenance_Tool_del_alldev_text' => 'Before using this function, please make a backup. The deletion cannot be undone. All devices will be deleted from the database.',
|
||||
'Maintenance_Tool_del_alldev_noti' => 'Delete Devices',
|
||||
'Maintenance_Tool_del_alldev_noti_text' => 'Are you sure you want to delete all devices?',
|
||||
'Maintenance_Tool_del_unknowndev' => 'Delete (unknown) Devices',
|
||||
'Maintenance_Tool_del_unknowndev_text' => 'Before using this function, please make a backup. The deletion cannot be undone. All devices named (unknown) will be deleted from the database.',
|
||||
'Maintenance_Tool_del_unknowndev_noti' => 'Delete (unknown) Devices',
|
||||
'Maintenance_Tool_del_unknowndev_noti_text' => 'Are you sure you want to delete all (unknown) devices?',
|
||||
'Maintenance_Tool_del_allevents' => 'Delete Events (Reset Presence)',
|
||||
'Maintenance_Tool_del_allevents_text' => 'Before using this function, please make a backup. The deletion cannot be undone. All events in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as "present" although they are offline. A scan while the device in question is online solves the problem.',
|
||||
'Maintenance_Tool_del_allevents_noti' => 'Delete Events',
|
||||
'Maintenance_Tool_del_allevents_noti_text' => 'Are you sure you want to delete all Events? This resets Presence of all Devices.',
|
||||
'Maintenance_Tool_del_allevents30' => 'Delete all Events older than 30 days',
|
||||
'Maintenance_Tool_del_allevents30_text' => 'Before using this function, please make a backup. The deletion cannot be undone. All events older than 30 days in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as "present" although they are offline. A scan while the device in question is online solves the problem.',
|
||||
'Maintenance_Tool_del_allevents30_noti' => 'Delete Events',
|
||||
'Maintenance_Tool_del_allevents30_noti_text' => 'Are you sure you want to delete all Events older than 30 days? This resets Presence of all Devices.',
|
||||
'Maintenance_Tool_backup' => 'DB Backup',
|
||||
'Maintenance_Tool_backup_text' => 'The database backups are located in the database directory as a zip-archive, named with the creation date. There is no maximum number of backups.',
|
||||
'Maintenance_Tool_backup_noti' => 'DB Backup',
|
||||
'Maintenance_Tool_backup_noti_text' => 'Are you sure you want to execute the the DB Backup? Be sure that no scan is currently running.',
|
||||
'Maintenance_Tool_restore' => 'DB Restore',
|
||||
'Maintenance_Tool_restore_text' => 'The latest backup can be restored via the button, but older backups can only be restored manually. After the restore, make an integrity check on the database for safety, in case the db was currently in write access when the backup was created.',
|
||||
'Maintenance_Tool_restore_noti' => 'DB Restore',
|
||||
'Maintenance_Tool_restore_noti_text' => 'Are you sure you want to execute the the DB Restore? Be sure that no scan is currently running.',
|
||||
'Maintenance_Tool_purgebackup' => 'Purge Backups',
|
||||
'Maintenance_Tool_purgebackup_text' => 'All other backups will be deleted except for the last 3 backups.',
|
||||
'Maintenance_Tool_purgebackup_noti' => 'Purge Backups',
|
||||
'Maintenance_Tool_purgebackup_noti_text' => 'Are you sure you want to delete all backups except the last 3?',
|
||||
'Maintenance_Tool_del_ActHistory' => 'Deleting the network activity',
|
||||
'Maintenance_Tool_del_ActHistory_text' => 'The network activity graph is reset. This does not affect the events.',
|
||||
'Maintenance_Tool_del_ActHistory_noti' => 'Delete network activity',
|
||||
'Maintenance_Tool_del_ActHistory_noti_text' => 'Are you sure you want to reset the network activity?',
|
||||
'Maintenance_Tool_ExportCSV' => 'CSV Export',
|
||||
'Maintenance_Tool_ExportCSV_text' => 'Generate a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices.',
|
||||
'Maintenance_Tool_ExportCSV_noti' => 'CSV Export',
|
||||
'Maintenance_Tool_ExportCSV_noti_text' => 'Are you sure you want to generate a CSV file?',
|
||||
'Maintenance_Tool_ImportCSV' => 'CSV Import',
|
||||
'Maintenance_Tool_ImportCSV_text' => 'Before using this function, please make a backup. Import a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices. To do that place the CSV file named <b>devices.csv</b> into your <b>/config</b> folder.',
|
||||
'Maintenance_Tool_ImportCSV_noti' => 'CSV Import',
|
||||
'Maintenance_Tool_ImportCSV_noti_text' => 'Are you sure you want to import the CSV file? This will completely overwrite the devices in your database.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'BackDevices_Arpscan_disabled' => 'Arp-Scan Disabled',
|
||||
'BackDevices_Arpscan_enabled' => 'Arp-Scan Enabled',
|
||||
'BackDevices_darkmode_disabled' => 'Darkmode Disabled',
|
||||
'BackDevices_darkmode_enabled' => 'Darkmode Enabled',
|
||||
'BackDevices_Restore_CopError' => 'The original database could not be saved.',
|
||||
'BackDevices_Restore_okay' => 'Restore executed successfully.',
|
||||
'BackDevices_Restore_Failed' => 'Restore Failed. Please restore the backup manually.',
|
||||
'BackDevices_Backup_CopError' => 'The original database could not be saved.',
|
||||
'BackDevices_Backup_okay' => 'The backup executed successfully with the new archive',
|
||||
'BackDevices_Backup_Failed' => 'The backup executed partially successfully. The archive could not be created or is empty.',
|
||||
'BackDevices_DBTools_DelDev_a' => 'Device deleted successfully',
|
||||
'BackDevices_DBTools_DelDev_b' => 'Devices deleted successfully',
|
||||
'BackDevices_DBTools_DelEvents' => 'Events deleted successfully',
|
||||
'BackDevices_DBTools_DelEventsError' => 'Error deleting Events',
|
||||
'BackDevices_DBTools_DelDevError_a' => 'Error deleting Device',
|
||||
'BackDevices_DBTools_DelDevError_b' => 'Error deleting Devices',
|
||||
'BackDevices_DBTools_UpdDev' => 'Device updated successfully',
|
||||
'BackDevices_DBTools_UpdDevError' => 'Error updating device',
|
||||
'BackDevices_DBTools_Upgrade' => 'Database upgraded successfully',
|
||||
'BackDevices_DBTools_UpgradeError' => 'Database upgrade failed',
|
||||
'BackDevices_DBTools_Purge' => 'The oldest backups were deleted',
|
||||
'BackDevices_DBTools_ImportCSV' => 'The devices from the CSV file were imported successfully.',
|
||||
'BackDevices_DBTools_ImportCSVError' => 'The CSV file couldn\'t be imported. Make sure the format is correct.',
|
||||
'BackDevices_DBTools_ImportCSVMissing' => 'The CSV file couldn\'t be found under <b>/config/devices.csv.</b>',
|
||||
'BackDevices_Device_UpdDevError' => 'Error updating devices, try later. The database is probable locked due to an ongoing task.',
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Network Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Network_Title' => 'Network overview',
|
||||
'Network_ManageDevices' => 'Manage Devices',
|
||||
'Network_ManageAdd' => 'Add Device',
|
||||
'Network_ManageAssign' => 'Assign',
|
||||
'Network_ManageUnassign' => 'Unassign',
|
||||
'Network_ManageEdit' => 'Update Device',
|
||||
'Network_ManageDel' => 'Delete Device',
|
||||
'Network_ManageAdd_Name' => 'Device Name',
|
||||
'Network_ManageAdd_Name_text' => 'Name without special characters',
|
||||
'Network_ManageAdd_Type' => 'Device Type',
|
||||
'Network_ManageAdd_Type_text' => '-- Select Type --',
|
||||
'Network_ManageAdd_Port' => 'Port Count',
|
||||
'Network_ManageAdd_Port_text' => 'leave blank for wifi and powerline',
|
||||
'Network_ManageAdd_Submit' => 'Add Device',
|
||||
'Network_ManageEdit_ID' => 'Device to update',
|
||||
'Network_ManageEdit_ID_text' => '-- Select Device for editing --',
|
||||
'Network_ManageEdit_Name' => 'New Device Name',
|
||||
'Network_ManageEdit_Name_text' => 'Name without special characters',
|
||||
'Network_ManageEdit_Type' => 'New Device Type',
|
||||
'Network_ManageEdit_Type_text' => '-- Select Type --',
|
||||
'Network_ManageEdit_Port' => ' New Port Count',
|
||||
'Network_ManageEdit_Port_text' => 'leave blank for wifi and powerline',
|
||||
'Network_ManageEdit_Submit' => 'Save Changes',
|
||||
'Network_ManageDel_Name' => 'Device to delete',
|
||||
'Network_ManageDel_Name_text' => '-- Select Device --',
|
||||
'Network_ManageDel_Submit' => 'Delete',
|
||||
'Network_Table_State' => 'State',
|
||||
'Network_Table_Hostname' => 'Hostname',
|
||||
'Network_Table_IP' => 'IP',
|
||||
'Network_UnassignedDevices' => 'Unassigned devices',
|
||||
'Network_Assign' => 'Connect to the above <i class="fa fa-server"></i> Network node',
|
||||
'Network_Connected' => 'Connected devices',
|
||||
'Network_ManageLeaf' => 'Manage assignment',
|
||||
'Network_Node' => 'Network node',
|
||||
'Network_Node_Name' => 'Node name',
|
||||
'Network_Parent' => 'Parent network device',
|
||||
'Network_NoAssignedDevices' => 'This network node doesn\'t have any assigned devices (leaf nodes). Assign one from bellow or go to the <b><i class="fa fa-info-circle"></i> Details</b> tab of any device in <a href="devices.php"><b> <i class="fa fa-laptop"></i> Devices</b></a>, and assign it to a network <b><i class="fa fa-server"></i> Node (MAC)</b> and <b><i class="fa fa-ethernet"></i> Port</b> there.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Help Page
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'HelpFAQ_Title' => 'Help / FAQ',
|
||||
'HelpFAQ_Cat_General' => 'General',
|
||||
'HelpFAQ_Cat_Detail' => '<i class="fa fa-info-circle"></i> Details',
|
||||
'HelpFAQ_Cat_General_100_head' => 'The clock on the top right and the times of the events/presence are not correct (time difference).',
|
||||
'HelpFAQ_Cat_General_100_text_a' => 'On your PC the following time zone is set for the PHP environment:',
|
||||
'HelpFAQ_Cat_General_100_text_b' => 'If this is not the timezone you are in, you should change the timezone in the PHP configuration file. You can find it in this directory:',
|
||||
'HelpFAQ_Cat_General_100_text_c' => 'Search in this file for the entry "date.timezone", remove the leading ";" if necessary and enter the desired timezone. A list with the supported timezones can be found here (<a href="https://www.php.net/manual/en/timezones.php" target="blank">Link</a>)',
|
||||
'HelpFAQ_Cat_General_101_head' => 'My network seems to slow down, streaming "freezes".',
|
||||
'HelpFAQ_Cat_General_101_text' => 'It may well be that low-powered devices reach their performance limits with the way Pi.Alert detects new devices on the network. This is amplified even more,
|
||||
if these devices communicate with the network via WLAN. Solutions here would be to switch to a wired connection if possible or, if the device is only to be used for a limited period of time, to use the arp scan.
|
||||
pause the arp scan on the maintenance page.',
|
||||
'HelpFAQ_Cat_General_102_head' => 'I get the message that the database is read only.',
|
||||
'HelpFAQ_Cat_General_102_text' => 'Check in the Pi.Alert directory if the database folder (db) has been assigned the correct permissions:<br>
|
||||
<span class="text-danger help_faq_code">drwxrwx--- 2 (your username) www-data</span><br>
|
||||
If the permission is not correct, you can set it again with the following commands in the terminal or the console:<br>
|
||||
<span class="text-danger help_faq_code">
|
||||
sudo chgrp -R www-data ~/pialert/db<br>
|
||||
chmod -R 770 ~/pialert/db
|
||||
</span><br>
|
||||
If the database is still read-only, try reinstalling or restoring a database backup from the maintenance page.',
|
||||
'HelpFAQ_Cat_General_102docker_head' => 'Database issues (AJAX errors, read-only, not found)',
|
||||
'HelpFAQ_Cat_General_102docker_text' => 'Double-check you\'ve followed the <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos="49:4-52:146" dir="auto">
|
||||
<li data-sourcepos="49:4-49:106">Download the <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db">original DB from GitHub</a>.</li>
|
||||
<li data-sourcepos="50:4-50:195">Map the <code>pialert.db</code> file (<g-emoji class="g-emoji" alias="warning" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/26a0.png">⚠</g-emoji> not folder) from above to <code>/home/pi/pialert/db/pialert.db</code> (see <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples">Examples</a> for details).</li>
|
||||
<li data-sourcepos="51:4-51:161">If facing issues (AJAX errors, can\'t write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/home/pi/pialert/front/log</code>.</li>
|
||||
<li data-sourcepos="52:4-52:146">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li>
|
||||
<li data-sourcepos="53:4-53:228">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li>
|
||||
</ul>',
|
||||
'HelpFAQ_Cat_General_103_head' => 'The login page does not appear, even after changing the password.',
|
||||
'HelpFAQ_Cat_General_103_text' => 'In addition to the password, the configuration file must contain <span class="text-danger help_faq_code">~/pialert/config/pialert.conf</span>
|
||||
also the parameter <span class="text-danger help_faq_code">PIALERT_WEB_PROTECTION</span> must set to <span class="text-danger help_faq_code">True</span>.',
|
||||
'HelpFAQ_Cat_Device_200_head' => 'I have devices in my list that I do not know about. After deleting them, they always reappear.',
|
||||
'HelpFAQ_Cat_Device_200_text' => 'If you use Pi-hole, please note that Pi.Alert retrieves information from Pi-hole. Pause Pi.Alert, go to the settings page in Pi-hole and
|
||||
delete the DHCP lease if necessary. Then, also in Pi-hole, look under Tools -> Network to see if you can find the recurring hosts there.
|
||||
If yes, delete them there as well. Now you can start Pi.Alert again. Now the device(s) should not show up anymore.',
|
||||
'HelpFAQ_Cat_Detail_300_head' => 'What means ',
|
||||
'HelpFAQ_Cat_Detail_300_text_a' => 'means a network device (a device of the type AP, Gateway, Firewall, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet).',
|
||||
'HelpFAQ_Cat_Detail_300_text_b' => 'designates the port number where the currently edited device is connected to this network device. Read <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/NETWORK_TREE.md">this guide</a> for more info.',
|
||||
'HelpFAQ_Cat_Detail_301_head_a' => 'When is scanning now? At ',
|
||||
'HelpFAQ_Cat_Detail_301_head_b' => ' says 1min but the graph shows 5min intervals.',
|
||||
'HelpFAQ_Cat_Detail_301_text' => 'The time interval between the scans is defined by the "Cronjob", which is set to 5min by default. The designation "1min" refers to the expected duration of the scan.
|
||||
Depending on the network configuration, this time may vary. To edit the cronjob, you can use the following command in the terminal/console <span class="text-danger help_faq_code">crontab -e</span>
|
||||
and change the interval.',
|
||||
'HelpFAQ_Cat_Detail_302_head_a' => 'What means ',
|
||||
'HelpFAQ_Cat_Detail_302_head_b' => 'and why can\'t I select that?',
|
||||
'HelpFAQ_Cat_Detail_302_text' => 'Some modern devices generate random MAC addresses for privacy reasons, which can no longer be associated with any manufacturer and which change again with each new connection.
|
||||
Pi.Alert detects if it is such a random MAC address and activates this "field" automatically. To disable this behavior you have to look in your device how to disable
|
||||
MAC address randomization.',
|
||||
'HelpFAQ_Cat_Detail_303_head' => 'What is Nmap and what is it for?',
|
||||
'HelpFAQ_Cat_Detail_303_text' => 'Nmap is a network scanner with multiple capabilities.<br>
|
||||
When a new device appears in your list, you have the possibility to get more detailed information about the device via the Nmap scan.',
|
||||
'HelpFAQ_Cat_Presence_400_head' => 'Devices are displayed with a yellow marker and the note "missing event".',
|
||||
'HelpFAQ_Cat_Presence_400_text' => 'If this happens, you have the option to delete the events on the device in question (details view). Another possibility would be to switch on the device and wait until Pi.Alert detects the device as "online" with the next
|
||||
scan and then simply turn the device off again. Now Pi.Alert should properly note the state of the device in the database with the next scan.',
|
||||
'HelpFAQ_Cat_Presence_401_head' => 'A device is displayed as present although it is "Offline".',
|
||||
'HelpFAQ_Cat_Presence_401_text' => 'If this happens, you have the possibility to delete the events for the device in question (details view). Another possibility would be to switch on the device and wait until Pi.Alert recognizes the device as "online" with the next scan
|
||||
and then simply switch the device off again. Now Pi.Alert should properly note the state of the device in the database with the next scan.',
|
||||
'HelpFAQ_Cat_Network_600_head' => 'What is this page for?',
|
||||
'HelpFAQ_Cat_Network_600_text' => 'This page should offer you the possibility to map the assignment of your network devices. For this purpose, you can create one or more switches, WLANs, routers, etc., provide them with a port number if necessary and assign already detected
|
||||
devices to them. This assignment is done in the detailed view of the device to be assigned. So it is possible for you to quickly determine to which port a host is connected and if it is online. Read <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/NETWORK_TREE.md">this guide</a> for more info.',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Front end events
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'test_event_tooltip' => 'Save your changes at first before you test your settings.',
|
||||
'test_event_icon' => 'fa-vial-circle-check',
|
||||
'run_event_tooltip' => 'Enable the setting and save your changes at first before you run it.',
|
||||
'run_event_icon' => 'fa-play',
|
||||
'general_event_title' => 'Executing an ad-hoc event',
|
||||
'general_event_description' => 'The event you\'ve triggered might take a while until background processes finish. The execution ended once you see <code>finished</code> below. Check the <a onclick=\'setCache(\"activeMaintenanceTab\", \"tab_Logging_id\")\' href=\"/maintenance.php#tab_Logging\">error log</a> if you didn\'t get the expected result. <br/> <br/> Status: ',
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Plugins
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Plugins_Unprocessed_Events' => 'Unprocessed Events',
|
||||
'Plugins_Objects' => 'Plugin Objects',
|
||||
'Plugins_History' => 'Events History',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Settings
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
'settings_missing' => 'Not all settings loaded, refresh the page! This is probably caused by a high load on the database.',
|
||||
'settings_missing_block' => 'You can\'t save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.',
|
||||
'settings_old' => 'The settings in the DB (shown on this page) are outdated. This is probably caused by a running scan. The settings were saved in the <code>pialert.conf</code> file, but the background process didn\'t have time to import it yet to the DB. You can wait until the settings get refreshed so you don\'t overwrite your old values. Feel free to save your settings either way if you don\'t mind losing the settings between the last save and now. There are also backup files created if you need to compare your settings later.',
|
||||
'settings_imported' => 'Last time settings were imported from the pialert.conf file:',
|
||||
'settings_expand_all' => 'Expand all',
|
||||
|
||||
|
||||
//General
|
||||
'General_display_name' => 'General',
|
||||
'General_icon' => '<i class="fa fa-gears"></i>',
|
||||
'ENABLE_ARPSCAN_name' => 'Enable ARP scan',
|
||||
'ENABLE_ARPSCAN_description' => 'Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the <a onclick="toggleAllSettings()" href="#PIHOLE_ACTIVE"><code>PIHOLE_ACTIVE</code>PiHole integration settings</a>.',
|
||||
'SCAN_SUBNETS_name' => 'Subnets to scan',
|
||||
'SCAN_SUBNETS_description' => '
|
||||
The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md" target="_blank">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
|
||||
',
|
||||
'LOG_LEVEL_name' => 'Print additional logging',
|
||||
'LOG_LEVEL_description' => 'This setting will enable more verbose logging. Useful for debugging events writing into the database.',
|
||||
'TIMEZONE_name' => 'Time zone',
|
||||
'TIMEZONE_description' => 'Time zone to display stats correctly. Find your time zone <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" rel="nofollow">here</a>.',
|
||||
'ENABLE_PLUGINS_name' => 'Enable Plugins',
|
||||
'ENABLE_PLUGINS_description' => 'Enables the <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins">plugins</a> functionality. Loading plugins requires more hardware resources so you might want to disable them on low-powered system.',
|
||||
'PIALERT_WEB_PROTECTION_name' => 'Enable login',
|
||||
'PIALERT_WEB_PROTECTION_description' => 'When enabled a login dialog is displayed. Read below carefully if you get locked out of your instance.',
|
||||
'PIALERT_WEB_PASSWORD_name' => 'Login password',
|
||||
'PIALERT_WEB_PASSWORD_description' => 'The default password is <code>123456</code>. To change the password run <code>/home/pi/pialert/back/pialert-cli</code> in the container',
|
||||
'INCLUDED_SECTIONS_name' => 'Notify on',
|
||||
'INCLUDED_SECTIONS_description' => 'Specifies which events trigger notifications. Remove the event type(s) you don\'t want to get notified on. This setting overrides device-specific settings in the UI. (<code>CTRL + Click</code> to select / deselect).',
|
||||
'SCAN_CYCLE_MINUTES_name' => 'Scan cycle delay',
|
||||
'SCAN_CYCLE_MINUTES_description' => 'The delay between scans in minutes. If using arp-scan, the scan time itself depends on the number of IP addresses to check. This is influenced by the network mask set in the <a href="#SCAN_SUBNETS"><code>SCAN_SUBNETS</code> setting</a> at the top. Every IP takes a couple seconds to scan.',
|
||||
'DAYS_TO_KEEP_EVENTS_name' => 'Delete events older than',
|
||||
'DAYS_TO_KEEP_EVENTS_description' => 'This is a maintenance setting. This specifies the number of days worth of event entries that will be kept. All older events will be deleted periodically. Also applies on Plugin Events History.',
|
||||
'REPORT_DASHBOARD_URL_name' => 'Pi.Alert URL',
|
||||
'REPORT_DASHBOARD_URL_description' => 'This URL is used as the base for generating links in the emails. Enter full URL starting with <code>http://</code> including the port number (no trailig slash <code>/</code>).',
|
||||
'DIG_GET_IP_ARG_name' => 'Internet IP discovery',
|
||||
'DIG_GET_IP_ARG_description' => 'Change the <a href="https://linux.die.net/man/1/dig" target="_blank">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>.',
|
||||
'UI_LANG_name' => 'UI Language',
|
||||
'UI_LANG_description' => 'Select the preferred UI language.',
|
||||
|
||||
//Email
|
||||
'Email_display_name' => 'Email',
|
||||
'Email_icon' => '<i class="fa fa-at"></i>',
|
||||
'REPORT_MAIL_name' => 'Enable email',
|
||||
'REPORT_MAIL_description' => 'If enabled an email is sent out with a list of changes you\'ve subscribed to. Please also fill out all remaining settings related to the SMTP setup below.',
|
||||
'SMTP_SERVER_name' => 'SMTP server URL',
|
||||
'SMTP_SERVER_description' => 'The SMTP server host URL. For example <code>smtp-relay.sendinblue.com</code>. To use Gmail as an SMTP server <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP_GMAIL.md">follow this guide</a>',
|
||||
'SMTP_PORT_name' => 'SMTP server PORT',
|
||||
'SMTP_PORT_description' => 'Port number used for the SMTP connection. Set to <code>0</code> if you don\'t want to use a port when connecting to the SMTP server.',
|
||||
'SMTP_SKIP_LOGIN_name' => 'Skip authentication',
|
||||
'SMTP_SKIP_LOGIN_description' => 'Don\'t use authentication when connecting to the SMTP server.',
|
||||
'SMTP_USER_name' => 'SMTP user',
|
||||
'SMTP_USER_description' => 'The user name used to login into the SMTP server (sometimes a full email address).',
|
||||
'SMTP_PASS_name' => 'SMTP password',
|
||||
'SMTP_PASS_description' => 'The SMTP server password. ',
|
||||
'SMTP_SKIP_TLS_name' => 'Don\'t use TLS',
|
||||
'SMTP_SKIP_TLS_description' => 'Disable TLS when connecting to your SMTP server.',
|
||||
'SMTP_FORCE_SSL_name' => 'Force SSL',
|
||||
'SMTP_FORCE_SSL_description' => 'Force SSL when connecting to your SMTP server.',
|
||||
'REPORT_TO_name' => 'Send email to',
|
||||
'REPORT_TO_description' => 'Email address to which the notification will be send to.',
|
||||
'REPORT_FROM_name' => 'Email subject',
|
||||
'REPORT_FROM_description' => 'Notification email subject line.',
|
||||
|
||||
//Webhooks
|
||||
'Webhooks_display_name' => 'Webhooks',
|
||||
'Webhooks_icon' => '<i class="fa fa-circle-nodes"></i>',
|
||||
'REPORT_WEBHOOK_name' => 'Enable Webhooks',
|
||||
'REPORT_WEBHOOK_description' => 'Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href="https://n8n.io/" target="_blank">n8n</a> to name a few. Check out this simple <a href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md" target="_blank">n8n guide here</a> to get started. If enabled, configure related settings below.',
|
||||
'WEBHOOK_URL_name' => 'Target URL',
|
||||
'WEBHOOK_URL_description' => 'Target URL starting with <code>http://</code> or <code>https://</code>.',
|
||||
'WEBHOOK_PAYLOAD_name' => 'Payload type',
|
||||
'WEBHOOK_PAYLOAD_description' => 'The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/back/webhook_json_sample.json">here</a>. (e.g.: for discord use <code>html</code>)',
|
||||
'WEBHOOK_REQUEST_METHOD_name' => 'Request method',
|
||||
'WEBHOOK_REQUEST_METHOD_description' => 'The HTTP request method to be used for the webhook call.',
|
||||
|
||||
// Apprise
|
||||
'Apprise_display_name' => 'Apprise',
|
||||
'Apprise_icon' => '<i class="fa fa-bullhorn"></i>',
|
||||
'REPORT_APPRISE_name' => 'Enable Apprise',
|
||||
'REPORT_APPRISE_description' => 'Enable sending notifications via <a target="_blank" href="https://hub.docker.com/r/caronc/apprise">Apprise</a>.',
|
||||
'APPRISE_HOST_name' => 'Apprise host URL',
|
||||
'APPRISE_HOST_description' => 'Apprise host URL starting with <code>http://</code> or <code>https://</code>. (don\'t forget to include <code>/notify</code> at the end)',
|
||||
'APPRISE_URL_name' => 'Apprise notification URL',
|
||||
'APPRISE_URL_description' => 'Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.',
|
||||
|
||||
// NTFY
|
||||
'NTFY_display_name' => 'NTFY',
|
||||
'NTFY_icon' => '<i class="fa fa-terminal"></i>',
|
||||
'REPORT_NTFY_name' => 'Enable NTFY',
|
||||
'REPORT_NTFY_description' => 'Enable sending notifications via <a target="_blank" href="https://ntfy.sh/">NTFY</a>.',
|
||||
'NTFY_HOST_name' => 'NTFY host URL',
|
||||
'NTFY_HOST_description' => 'NTFY host URL starting with <code>http://</code> or <code>https://</code>. You can use the hosted instance on <a target="_blank" href="https://ntfy.sh/">https://ntfy.sh</a> by simply entering <code>https://ntfy.sh</code>.',
|
||||
'NTFY_TOPIC_name' => 'NTFY topic',
|
||||
'NTFY_TOPIC_description' => 'Your secret topic.',
|
||||
'NTFY_USER_name' => 'NTFY user',
|
||||
'NTFY_USER_description' => 'Enter user if you need (host) an instance with enabled authetication.',
|
||||
'NTFY_PASSWORD_name' => 'NTFY password',
|
||||
'NTFY_PASSWORD_description' => 'Enter password if you need (host) an instance with enabled authetication.',
|
||||
|
||||
// Pushsafer
|
||||
'PUSHSAFER_display_name' => 'Pushsafer',
|
||||
'PUSHSAFER_icon' => '<i class="fa fa-bell"></i>',
|
||||
'REPORT_PUSHSAFER_name' => 'Enable Pushsafer',
|
||||
'REPORT_PUSHSAFER_description' => 'Enable sending notifications via <a target="_blank" href="https://www.pushsafer.com/">Pushsafer</a>.',
|
||||
'PUSHSAFER_TOKEN_name' => 'Pushsafer token',
|
||||
'PUSHSAFER_TOKEN_description' => 'Your secret Pushsafer API key (token).',
|
||||
'APPRISE_PAYLOAD_name' => 'Payload type',
|
||||
'APPRISE_PAYLOAD_description' => 'Select the payoad type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram.',
|
||||
|
||||
|
||||
// MQTT
|
||||
'MQTT_display_name' => 'MQTT',
|
||||
'MQTT_icon' => '<i class="fa fa-square-rss"></i>',
|
||||
'REPORT_MQTT_name' => 'Enable MQTT',
|
||||
'REPORT_MQTT_description' => 'Enable sending notifications via <a target="_blank" href="https://www.home-assistant.io/integrations/mqtt/">MQTT</a> to your Home Assistance instance.',
|
||||
'MQTT_BROKER_name' => 'MQTT broker URL',
|
||||
'MQTT_BROKER_description' => 'MQTT host URL (don\'t include <code>http://</code> or <code>https://</code>).',
|
||||
'MQTT_PORT_name' => 'MQTT broker port',
|
||||
'MQTT_PORT_description' => 'Port number where the broker is listening. Usually <code>1883</code>.',
|
||||
'MQTT_USER_name' => 'MQTT user',
|
||||
'MQTT_USER_description' => 'User name used to login into your MQTT broker instance.',
|
||||
'MQTT_PASSWORD_name' => 'MQTT password',
|
||||
'MQTT_PASSWORD_description' => 'Password used to login into your MQTT broker instance.',
|
||||
'MQTT_QOS_name' => 'MQTT Quality of Service',
|
||||
'MQTT_QOS_description' => 'Quality of service setting for MQTT message sending. <code>0</code> - Low quality to <code>2</code> - High quality. The higher the quality the longer the delay.',
|
||||
'MQTT_DELAY_SEC_name' => 'MQTT delay per device',
|
||||
'MQTT_DELAY_SEC_description' => 'A little hack - delay adding to the queue in case the process is restarted and previous publish processes aborted (it takes ~<code>2</code>s to update a sensor config on the broker). Tested with <code>2</code>-<code>3</code> seconds of delay. This delay is only applied when devices are created (during the first notification loop). It doesn\'t affect subsequent scans or notifications.',
|
||||
|
||||
//DynDNS
|
||||
'DynDNS_display_name' => 'DynDNS',
|
||||
'DynDNS_icon' => '<i class="fa fa-globe"></i>',
|
||||
'DDNS_ACTIVE_name' => 'Enable DynDNS',
|
||||
'DDNS_ACTIVE_description' => '',
|
||||
'DDNS_DOMAIN_name' => 'DynDNS domain URL',
|
||||
'DDNS_DOMAIN_description' => '',
|
||||
'DDNS_USER_name' => 'DynDNS user',
|
||||
'DDNS_USER_description' => '',
|
||||
'DDNS_PASSWORD_name' => 'DynDNS password',
|
||||
'DDNS_PASSWORD_description' => '',
|
||||
'DDNS_UPDATE_URL_name' => 'DynDNS update URL',
|
||||
'DDNS_UPDATE_URL_description' => 'Update URL starting with <code>http://</code> or <code>https://</code>.',
|
||||
|
||||
// PiHole
|
||||
'PiHole_display_name' => 'PiHole',
|
||||
'PiHole_icon' => '<i class="fa fa-seedling"></i>',
|
||||
'PIHOLE_ACTIVE_name' => 'Enable PiHole mapping',
|
||||
'PIHOLE_ACTIVE_description' => 'You need to map<code>:/etc/pihole/pihole-FTL.db</code> in the <code>docker-compose.yml</code> file if you enable this setting.',
|
||||
'DHCP_ACTIVE_name' => 'Enable PiHole DHCP',
|
||||
'DHCP_ACTIVE_description' => 'You need to map <code>:/etc/pihole/dhcp.leases</code> in the <code>docker-compose.yml</code> file if you enable this setting.',
|
||||
|
||||
// Pholus
|
||||
'Pholus_display_name' => 'Pholus',
|
||||
'Pholus_icon' => '<i class="fa fa-search"></i>',
|
||||
'PHOLUS_ACTIVE_name' => 'Cycle run',
|
||||
'PHOLUS_ACTIVE_description' => '<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/pholus" target="_blank" >Pholus</a> is a sniffing tool to discover additional information about the devices on the network, including the device name. If enabled this will execute the scan before every network scan cycle until there are no <code>(unknown)</code> or <code>(name not found)</code> devices. Please be aware it can spam the network with unnecessary traffic. Depends on the <a onclick="toggleAllSettings()" href="#SCAN_SUBNETS"><code>SCAN_SUBNETS</code> setting</a>. For a scheduled or one-off scan, check the <a href="#PHOLUS_RUN"><code>PHOLUS_RUN</code> setting</a>.',
|
||||
'PHOLUS_TIMEOUT_name' => 'Cycle run timeout',
|
||||
'PHOLUS_TIMEOUT_description' => 'How long in seconds should Pholus be sniffing on each interface if above condition is fulfilled. The longer you leave it on, the more likely devices would broadcast more info. This timeout adds to the time it takes to perform an arp-scan on your network.',
|
||||
'PHOLUS_FORCE_name' => 'Cycle force scan',
|
||||
'PHOLUS_FORCE_description' => 'Force scan every network scan, even if there are no <code>(unknown)</code> or <code>(name not found)</code> devices. Be careful enabling this as the sniffing can easily flood your network.',
|
||||
'PHOLUS_RUN_name' => 'Scheduled run',
|
||||
'PHOLUS_RUN_description' => 'Enable a regular Pholus scan / sniff on your network. The scheduling settings can be found below. If you select <code>once</code> Pholus is run only once on start for the time specified in <a href="#PHOLUS_RUN_TIMEOUT"><code>PHOLUS_RUN_TIMEOUT</code> setting</a>.',
|
||||
'PHOLUS_RUN_TIMEOUT_name' => 'Scheduled run timeout',
|
||||
'PHOLUS_RUN_TIMEOUT_description' => 'The timeout in seconds for the scheduled Pholus scan. Same notes regarding the duration apply as on the <a href="#PHOLUS_TIMEOUT"><code>PHOLUS_TIMEOUT</code> setting</a>. A scheduled scan doesn\'t check if there are <code>(unknown)</code> or <code>(name not found)</code> devices, the scan is executed either way.',
|
||||
'PHOLUS_RUN_SCHD_name' => 'Schedule',
|
||||
'PHOLUS_RUN_SCHD_description' => 'Only enabled if you select <code>schedule</code> in the <a href="#PHOLUS_RUN"><code>PHOLUS_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format
|
||||
(e.g. validate at <a href="https://crontab.guru/" target="_blank">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick="toggleAllSettings()" href="#TIMEZONE"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes.',
|
||||
'PHOLUS_DAYS_DATA_name' => 'Data retention',
|
||||
'PHOLUS_DAYS_DATA_description' => 'How many days of Pholus scan entries should be kept (globally, not device specific!) Enter <code>0</code> to disable.',
|
||||
|
||||
// Nmap
|
||||
'Nmap_display_name' => 'Nmap',
|
||||
'Nmap_icon' => '<i class="fa fa-ethernet"></i>',
|
||||
'NMAP_ACTIVE_name' => 'Cycle run',
|
||||
'NMAP_ACTIVE_description' => 'If enabled this will execute a scan on a newly found device. For a scheduled or one-off scan, check the <a href="#NMAP_RUN"><code>NMAP_RUN</code> setting</a>.',
|
||||
'NMAP_TIMEOUT_name' => 'Run timeout',
|
||||
'NMAP_TIMEOUT_description' => 'Maximum time in seconds to wait for an Nmap scan to finish on any device.',
|
||||
'NMAP_RUN_name' => 'Scheduled run',
|
||||
'NMAP_RUN_description' => 'Enable a regular Nmap scan on your network on all devices. The scheduling settings can be found below. If you select <code>once</code> Nmap is run only once on start for the time specified in <a href="#NMAP_TIMEOUT"><code>NMAP_TIMEOUT</code> setting</a>.',
|
||||
'NMAP_RUN_SCHD_name' => 'Schedule',
|
||||
'NMAP_RUN_SCHD_description' => 'Only enabled if you select <code>schedule</code> in the <a href="#NMAP_RUN"><code>NMAP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format.',
|
||||
'NMAP_ARGS_name' => 'Arguments',
|
||||
'NMAP_ARGS_description' => 'Arguments used to run the Nmap scan. Be careful to specify <a href="https://linux.die.net/man/1/nmap" target="_blank">the arguments</a> correctly. For example <code>-p -10000</code> scans ports from 1 to 10000.',
|
||||
|
||||
// API
|
||||
'API_display_name' => 'API',
|
||||
'API_icon' => '<i class="fa fa-arrow-down-up-across-line"></i>',
|
||||
'API_CUSTOM_SQL_name' => 'Custom endpoint',
|
||||
'API_CUSTOM_SQL_description' => 'You can specify a custom SQL query which will generate a JSON file and then expose it via the <a href="/api/table_custom_endpoint.json" target="_blank"><code>table_custom_endpoint.json</code> file endpoint</a>.',
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
);
|
||||
|
||||
?>
|
||||
648
front/php/templates/language/es_es.json
Executable file
@@ -0,0 +1,648 @@
|
||||
{
|
||||
"es_es": {
|
||||
"About_Title": "Open Source Network Guard",
|
||||
"About_Design" : "Diseñado para:",
|
||||
"About_Exit" : "Salir",
|
||||
"Gen_Delete" : "Eliminar",
|
||||
"Gen_DeleteAll" : "Eliminar todo",
|
||||
"Gen_Cancel" : "Cancelar",
|
||||
"Gen_Okay" : "Aceptar",
|
||||
"Gen_Save" : "Guardar",
|
||||
"Gen_Saved" : "Guardado",
|
||||
"Gen_Run" : "Ejecutar",
|
||||
"Gen_Copy" : "Ejecutar",
|
||||
"Gen_Action" : "Acción",
|
||||
"Gen_Purge" : "Purgar",
|
||||
"Gen_Backup" : "Ejecutar copia de seguridad",
|
||||
"Gen_Restore" : "Ejecutar restauración",
|
||||
"Gen_Switch" : "Cambiar",
|
||||
"Gen_AreYouSure" : "¿Estás seguro de",
|
||||
"Gen_Upd" : "Actualizado correctamente",
|
||||
"Gen_Upd_Fail" : "Fallo al actualizar",
|
||||
"Gen_ReadDocs" : "Ayuda",
|
||||
"Gen_DataUpdatedUITakesTime" : "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
|
||||
"Gen_LockedDB" : "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
|
||||
"Login_Box" : "Ingrese su contraseña",
|
||||
"Login_Remember" : "Recordar",
|
||||
"Login_Remember_small" : "(válido por 7 días)",
|
||||
"Login_Submit" : "Ingresar",
|
||||
"Login_Psw_run" : "Para cambiar contraseña ejecute:",
|
||||
"Login_Psw_new" : "nueva_contraseña",
|
||||
"Login_Psw_folder" : "en la carpeta config.",
|
||||
"Login_Psw_alert" : "¡Alerta de Contraseña!",
|
||||
"Login_Psw-box" : "Contraseña",
|
||||
"Login_Toggle_Info" : "Información sobre la contraseña",
|
||||
"Login_Toggle_Info_headline" : "Información sobre la contraseña",
|
||||
"Login_Toggle_Alert_headline" : "Alerta de Contraseña!",
|
||||
"Login_Default_PWD" : "La contraseña por defecto \"123456\" sigue activa.",
|
||||
"Navigation_Devices" : "Dispositivos",
|
||||
"Navigation_Presence" : "Historial",
|
||||
"Navigation_Events" : "Eventos",
|
||||
"Navigation_Report" : "Reporte",
|
||||
"Navigation_Network" : "Red",
|
||||
"Navigation_Plugins" : "Plugins",
|
||||
"Navigation_Maintenance" : "Mantenimiento",
|
||||
"Navigation_Settings" : "Configuración",
|
||||
"Navigation_Flows" : "Flows",
|
||||
"Navigation_SystemInfo" : "Info del sistema",
|
||||
"Navigation_HelpFAQ" : "Ayuda / FAQ",
|
||||
"Device_Title" : "Dispositivos",
|
||||
"Device_Shortcut_AllDevices" : "Todos",
|
||||
"Device_Shortcut_Connected" : "Conectado(s)",
|
||||
"Device_Shortcut_Favorites" : "Favorito(s)",
|
||||
"Device_Shortcut_NewDevices" : "Nuevo(s)",
|
||||
"Device_Shortcut_DownAlerts" : "Alerta(s) de caída(s)",
|
||||
"Device_Shortcut_Archived" : "Archivado(s)",
|
||||
"Device_Shortcut_Devices" : "Dispositivos",
|
||||
"Device_Shortcut_OnlineChart" : "Presencia del dispositivo a lo largo del tiempo",
|
||||
"Device_TableHead_Name" : "Nombre",
|
||||
"Device_TableHead_Owner" : "Propietario",
|
||||
"Device_TableHead_Type" : "Tipo",
|
||||
"Device_TableHead_Icon" : "Icon",
|
||||
"Device_TableHead_RowID" : "Row ID",
|
||||
"Device_TableHead_Rowid" : "Row ID",
|
||||
"Device_TableHead_Parent_MAC" : "Nodo principal de la MAC",
|
||||
"Device_TableHead_Connected_Devices" : "Dispositivos conectados",
|
||||
"Device_TableHead_Location" : "Ubicación",
|
||||
"Device_TableHead_Vendor" : "Fabricante",
|
||||
"Device_TableHead_Port" : "Puerto",
|
||||
"Device_TableHead_Favorite" : "Favorito",
|
||||
"Device_TableHead_Group" : "Grupo",
|
||||
"Device_TableHead_FirstSession" : "1ra. sesión",
|
||||
"Device_TableHead_LastSession" : "Última sesión",
|
||||
"Device_TableHead_LastIP" : "Última IP",
|
||||
"Device_TableHead_MAC" : "MAC",
|
||||
"Device_TableHead_MAC_full" : "MAC completa",
|
||||
"Device_TableHead_LastIPOrder" : "Última orden de IP",
|
||||
"Device_TableHead_Status" : "Estado",
|
||||
"Device_Searchbox" : "Búsqueda",
|
||||
"Device_Tablelenght" : "Mostrar _MENU_ entradas",
|
||||
"Device_Tablelenght_all" : "Todos",
|
||||
"Device_Table_info" : "Mostrando el INICIO y el FINAL de TODAS las entradas",
|
||||
"Device_Table_nav_next" : "Siguiente",
|
||||
"Device_Table_nav_prev" : "Anterior",
|
||||
"Presence_Title" : "Historial por dispositivo",
|
||||
"Presence_Loading" : "Cargando...",
|
||||
"Loading" : "Cargando...",
|
||||
"Presence_Shortcut_AllDevices" : "Todos",
|
||||
"Presence_Shortcut_Connected" : "Conectado(s)",
|
||||
"Presence_Shortcut_Favorites" : "Favorito(s)",
|
||||
"Presence_Shortcut_NewDevices" : "Nuevo(s)",
|
||||
"Presence_Shortcut_DownAlerts" : "Alerta(s) de caída(s)",
|
||||
"Presence_Shortcut_Archived" : "Archivado(s)",
|
||||
"Presence_Shortcut_Devices" : "Dispositivos",
|
||||
"Presence_CallHead_Devices" : "Dispositivos",
|
||||
"Presence_CalHead_lang" : "es-es",
|
||||
"Presence_CalHead_year" : "año",
|
||||
"Presence_CalHead_quarter" : "trimestre",
|
||||
"Presence_CalHead_month" : "mes",
|
||||
"Presence_CalHead_week" : "semana",
|
||||
"Presence_CalHead_day" : "día",
|
||||
"Events_Title" : "Eventos",
|
||||
"Events_Loading" : "Cargando...",
|
||||
"Events_Periodselect_today" : "Hoy",
|
||||
"Events_Periodselect_LastWeek" : "La semana pasada",
|
||||
"Events_Periodselect_LastMonth" : "El mes pasado",
|
||||
"Events_Periodselect_LastYear" : "El año pasado",
|
||||
"Events_Periodselect_All" : "Toda la información",
|
||||
"Events_Shortcut_AllEvents" : "Todos los eventos",
|
||||
"Events_Shortcut_Sessions" : "Sesiones",
|
||||
"Events_Shortcut_MissSessions" : "Sesiones faltantes",
|
||||
"Events_Shortcut_VoidSessions" : "Sesiones anuladas",
|
||||
"Events_Shortcut_NewDevices" : "Nuevo(s)",
|
||||
"Events_Shortcut_DownAlerts" : "Alerta(s) de caída(s)",
|
||||
"Events_Shortcut_Events" : "Eventos",
|
||||
"Events_TableHead_Order" : "Ordenar",
|
||||
"Events_TableHead_Device" : "Dispositivo",
|
||||
"Events_TableHead_Owner" : "Propietario",
|
||||
"Events_TableHead_Date" : "Fecha",
|
||||
"Events_TableHead_EventType" : "Tipo de evento",
|
||||
"Events_TableHead_Connection" : "Conexión",
|
||||
"Events_TableHead_Disconnection" : "Desconexión",
|
||||
"Events_TableHead_Duration" : "Duración",
|
||||
"Events_TableHead_DurationOrder" : "Orden de duración",
|
||||
"Events_TableHead_IP" : "Dirección IP",
|
||||
"Events_TableHead_IPOrder" : "Orden de IP",
|
||||
"Events_TableHead_AdditionalInfo" : "Información adicional",
|
||||
"Events_Searchbox" : "Búsqueda",
|
||||
"Events_Tablelenght" : "Mostrando entradas del MENÚ",
|
||||
"Events_Tablelenght_all" : "Todos",
|
||||
"Events_Table_info" : "Mostrando el INICIO y el FINAL de TODAS las entradas",
|
||||
"Events_Table_nav_next" : "Siguiente",
|
||||
"Events_Table_nav_prev" : "Anterior",
|
||||
"DevDetail_Loading" : "Cargando ...",
|
||||
"DevDetail_Periodselect_today" : "Hoy",
|
||||
"DevDetail_Periodselect_LastWeek" : "La semana pasada",
|
||||
"DevDetail_Periodselect_LastMonth" : "El mes pasado",
|
||||
"DevDetail_Periodselect_LastYear" : "El año pasado",
|
||||
"DevDetail_Periodselect_All" : "Toda la información",
|
||||
"DevDetail_Shortcut_CurrentStatus" : "Estado actual",
|
||||
"DevDetail_Shortcut_Sessions" : "Sesiones",
|
||||
"DevDetail_Shortcut_Presence" : "Historial",
|
||||
"DevDetail_Shortcut_DownAlerts" : "Alerta(s) de caída(s)",
|
||||
"DevDetail_Tab_Details" : "<i class=\"fa fa-info-circle\"></i> Detalles",
|
||||
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Herramientas",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Title": "Información de Internet",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Description": "La herramienta de información de internet muestra información sobre la conexión a Internet, como dirección IP, ciudad, país, código de área y zona horaria.",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Start": "Iniciar información de Internet",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Error": "Se ha producido un error",
|
||||
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup es una herramienta de línea de comandos que se utiliza para realizar consultas al Sistema de nombres de dominio (DNS). El DNS es un sistema que traduce nombres de dominio, como www.google.com, a direcciones IP, como 172.217.0.142.",
|
||||
"DevDetail_Tab_Tools_Nslookup_Start": "Iniciar Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Error": "Error: la dirección IP no es válida",
|
||||
"DevDetail_Tab_Tools_Speedtest_Title": "Prueba Speedtest",
|
||||
"DevDetail_Tab_Tools_Speedtest_Description": "La herramienta Speedtest mide la velocidad de descarga, la velocidad de subida y la latencia de la conexión a Internet.",
|
||||
"DevDetail_Tab_Tools_Speedtest_Start": "Iniciar Speedtest",
|
||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute es un comando de diagnóstico de red que se utiliza para rastrear la ruta que toman los paquetes de datos desde un host a otro.<br><br>El comando utiliza el protocolo de mensajes de control de Internet (ICMP) para enviar paquetes a los nodos intermedios en la ruta, cada nodo intermedio responde con un paquete ICMP de tiempo de vida agotado (TTL agotado).<br><br>La salida del comando traceroute muestra la dirección IP de cada nodo intermedio en la ruta.<br><br>El comando traceroute se puede usar para diagnosticar problemas de red, como retrasos, pérdida de paquetes y rutas bloqueadas.<br><br>También se puede usar para identificar la ubicación de un nodo intermedio en una red.",
|
||||
"DevDetail_Tab_Tools_Traceroute_Start": "Iniciar Traceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Error": "Error: la dirección IP no es válida",
|
||||
"DevDetail_Tab_Nmap" : "<i class=\"fa fa-ethernet\"></i> Nmap",
|
||||
"DevDetail_Tab_Sessions" : "<i class=\"fa fa-list-ol\"></i> Sesiones",
|
||||
"DevDetail_Tab_Presence" : "<i class=\"fa fa-calendar\"></i> Historial",
|
||||
"DevDetail_Tab_Events" : "<i class=\"fa fa-bolt\"></i> Eventos",
|
||||
"DevDetail_Tab_EventsTableDate" : "Fecha",
|
||||
"DevDetail_Tab_EventsTableEvent" : "Tipo de evento",
|
||||
"DevDetail_Tab_EventsTableIP" : "IP",
|
||||
"DevDetail_Tab_EventsTableInfo" : "Información adicional",
|
||||
"DevDetail_Tab_Plugins" : "<i class=\"fa fa-plug\"></i> Plugins",
|
||||
"DevDetail_Tab_NmapTableHeader" : "Resultados del escaneo programado",
|
||||
"DevDetail_Tab_NmapTableText" : "Establece la programación en los <a href=\"/settings.php#NMAP_ACTIVE\">Ajustes</a>",
|
||||
"DevDetail_Tab_NmapEmpty" : "Ningún puerto detectado en este dispositivo con Nmap.",
|
||||
"DevDetail_Tab_NmapTableIndex": "Índice",
|
||||
"DevDetail_Tab_NmapTableTime": "Tiempo",
|
||||
"DevDetail_Tab_NmapTablePort": "Puerto",
|
||||
"DevDetail_Tab_NmapTableState": "Estado",
|
||||
"DevDetail_Tab_NmapTableService": "Servicio",
|
||||
"DevDetail_Tab_NmapTableExtra": "Extra",
|
||||
"DevDetail_MainInfo_Title" : "<i class=\"fa fa-pencil\"></i> Información principal",
|
||||
"DevDetail_MainInfo_mac" : "MAC",
|
||||
"DevDetail_MainInfo_Name" : "Nombre",
|
||||
"DevDetail_MainInfo_Owner" : "Propietario",
|
||||
"DevDetail_MainInfo_Type" : "Tipo",
|
||||
"DevDetail_Icon" : "Icono",
|
||||
"DevDetail_Icon_Descr" : "Ingrese un nombre de icono de fuente awesome sin el prefijo fa- o con clase completa, por ejemplo: fa fa-skin fa-apple.",
|
||||
"DevDetail_MainInfo_Vendor" : "Proveedor",
|
||||
"DevDetail_MainInfo_Favorite" : "Favorito",
|
||||
"DevDetail_MainInfo_Group" : "Grupo",
|
||||
"DevDetail_MainInfo_Location" : "Ubicación",
|
||||
"DevDetail_MainInfo_Comments" : "Comentario",
|
||||
"DevDetail_MainInfo_Network_Title" : "<i class=\"fa fa-network-wired\"></i> Red",
|
||||
"DevDetail_MainInfo_Network" : "<i class=\"fa fa-server\"></i> Nodo (MAC)",
|
||||
"DevDetail_GoToNetworkNode" : "Navegar a la página de Internet del nodo seleccionado.",
|
||||
"DevDetail_MainInfo_Network_Port" : "<i class=\"fa fa-ethernet\"></i> Puerto de Red HW",
|
||||
"DevDetail_SessionInfo_Title" : "<i class=\"fa fa-calendar\"></i> Información de sesión",
|
||||
"DevDetail_SessionInfo_Status" : "Estado",
|
||||
"DevDetail_SessionInfo_FirstSession" : "1ra. sesión",
|
||||
"DevDetail_SessionInfo_LastSession" : "Última sesión",
|
||||
"DevDetail_SessionInfo_LastIP" : "Última IP",
|
||||
"DevDetail_SessionInfo_StaticIP" : "IP estática",
|
||||
"DevDetail_EveandAl_Title" : "<i class=\"fa fa-bolt\"></i> Configuración de eventos y alertas",
|
||||
"DevDetail_EveandAl_ScanCycle" : "Ciclo de escaneo",
|
||||
"DevDetail_EveandAl_AlertAllEvents" : "Alerta a todos los eventos",
|
||||
"DevDetail_EveandAl_AlertDown" : "Alerta de caída",
|
||||
"DevDetail_EveandAl_Skip" : "Omitir notificaciones repetidas durante",
|
||||
"DevDetail_EveandAl_NewDevice" : "Nuevo dispositivo",
|
||||
"DevDetail_EveandAl_Archived" : "Archivada",
|
||||
"DevDetail_EveandAl_RandomMAC" : "MAC al azar",
|
||||
"DevDetail_EveandAl_ScanCycle_a" : "Escanear Dispositivo",
|
||||
"DevDetail_EveandAl_ScanCycle_z" : "No Escanear Dispositivo",
|
||||
"DevDetail_button_Delete" : "Eliminar dispositivo",
|
||||
"DevDetail_button_DeleteEvents" : "Eliminar eventos",
|
||||
"DevDetail_button_DeleteEvents_Warning" : "¿Desea eliminar todos los eventos de este dispositivo?<br><br>(se eliminarán el <b>Historial de eventos</b> y las <b>Sesiones</b>, y puede ayudar en el caso de notificaciones constantes)",
|
||||
"DevDetail_button_Reset" : "Restablecer cambios",
|
||||
"DevDetail_button_Save" : "Guardar",
|
||||
"DevDetail_button_OverwriteIcons" : "Sobreescribir iconos",
|
||||
"DevDetail_button_OverwriteIcons_Tooltip" : "Sobreescribir los iconos de todos los dispositivos con el mismo tipo",
|
||||
"DevDetail_button_OverwriteIcons_Warning" : "¿Sobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?",
|
||||
"DevDetail_SessionTable_Order" : "Ordenar",
|
||||
"DevDetail_SessionTable_Connection" : "Conexión",
|
||||
"DevDetail_SessionTable_Disconnection" : "Desconexión",
|
||||
"DevDetail_SessionTable_Duration" : "Duración",
|
||||
"DevDetail_SessionTable_IP" : "Dirección IP",
|
||||
"DevDetail_SessionTable_Additionalinfo" : "Información adicional",
|
||||
"DevDetail_Events_CheckBox" : "Ocultar eventos de conexión",
|
||||
"DevDetail_Nmap_buttonFast" : "Exploración rápida",
|
||||
"DevDetail_Nmap_buttonDefault" : "Escaneado predeterminado",
|
||||
"DevDetail_Nmap_buttonDetail" : "Escaneo detallado",
|
||||
"DevDetail_Nmap_buttonFast_text" : "Escaneo rápido: escanee menos puertos (100) que el escaneo predeterminado (unos pocos segundos)",
|
||||
"DevDetail_Nmap_buttonDefault_text" : "Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)",
|
||||
"DevDetail_Nmap_buttonDetail_text" : "Escaneo detallado: escaneo predeterminado con detección de sistema operativo habilitado, detección de versiones, escaneo de script y traceroute (hasta 30 segundos o más)",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery" : "Omitir detección de host",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery_text" : "Omitir detección de host (-Pn opción): Escaneo predeterminado sin detección de host",
|
||||
"DevDetail_Nmap_resultsLink" : "Puedes abandonar esta página después de empezar un escaneo. Los resultados también estarán disponibles en el archivo <code>pialert_front.log</code>.",
|
||||
"DevDetail_Nmap_Scans": "Escaneos de Nmap",
|
||||
"BackDevDetail_Actions_Title_Run" : "Ejecutar acción",
|
||||
"BackDevDetail_Actions_Not_Registered" : "Acción no registrada: ",
|
||||
"BackDevDetail_Actions_Ask_Run" : "¿Desea ejecutar la acción?",
|
||||
"BackDevDetail_Tools_WOL_okay" : "El comando se ha ejecutado correctamente.",
|
||||
"BackDevDetail_Tools_WOL_error" : "Ha ocurrido un error al ejectuar el comando.",
|
||||
"DevDetail_Tools_WOL_noti" : "Wake-on-LAN",
|
||||
"DevDetail_Tools_WOL_noti_text" : "El comando de Wake-on-LAN en enviado a la dirección de escucha. Si el dispositivo no está en la misma subred/vlan que Pi.Alert, el dispositivo no responderá.",
|
||||
"DevDetail_Tools_WOL" : "Enviar comando WOL a ",
|
||||
"DevDetail_WOL_Title" : "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||
"DevDetail_Run_Actions_Title" : "<i class=\"fa fa-play\"></i> Ejecutar acción en el dispositivo",
|
||||
"DevDetail_Run_Actions_Tooltip" : "Ejecutar la acción del desplegable sobre el dispositivo actual.",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalles del dispositivo",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá",
|
||||
"BackDevDetail_Copy_Title": "Copiar detalles",
|
||||
"BackDevDetail_Copy_Ask": "¿Copiar detalles del dispositivo de la lista desplegable (se sobrescribirá todo en esta página)?",
|
||||
"Maintenance_Title" : "Herramientas de mantenimiento",
|
||||
"Maintenance_version" : "Actualizaciones de la aplicación",
|
||||
"Maintenance_new_version" : "🆕 Una nueva versión está disponible. Comprueba las <a href=\"https://github.com/jokob-sk/Pi.Alert/releases\" target=\"_blank\">notas de lanzamiento</a>.",
|
||||
"Maintenance_current_version" : "No hay actualizaciones disponibles. Comprueba en que <a href=\"https://github.com/jokob-sk/Pi.Alert/issues/138\" target=\"_blank\">se está trabajando</a>.",
|
||||
"Maintenance_built_on" : "Creada",
|
||||
"Maintenance_database_path" : "Ruta de la base de datos:",
|
||||
"Maintenance_database_size" : "Tamaño de base de datos:",
|
||||
"Maintenance_database_lastmod" : "Última modificación:",
|
||||
"Maintenance_database_backup" : "Copias de seguridad de la BD:",
|
||||
"Maintenance_database_backup_found" : "copia(s) de seguridad encontrada(s)",
|
||||
"Maintenance_database_backup_total" : "Uso total de disco",
|
||||
"Maintenance_arp_status" : "Estado de escaneo:",
|
||||
"Maintenance_arp_status_off" : "está actualmente deshabilitado",
|
||||
"Maintenance_arp_status_on" : "escaneo(s) actualmente en ejecución",
|
||||
"Maintenance_themeselector_lable" : "Seleccionar tema",
|
||||
"Maintenance_themeselector_empty" : "Elige un tema",
|
||||
"Maintenance_themeselector_apply" : "Aplicar",
|
||||
"Maintenance_themeselector_text" : "El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.",
|
||||
"Maintenance_lang_selector_lable" : "Seleccione su idioma",
|
||||
"Maintenance_lang_selector_empty" : "Elija un idioma",
|
||||
"Maintenance_lang_en_us" : "English (US)",
|
||||
"Maintenance_lang_de_de" : "German (DE)",
|
||||
"Maintenance_lang_es_es" : "Spanish (ES)",
|
||||
"Maintenance_lang_selector_text" : "El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.",
|
||||
"Maintenance_lang_selector_apply" : "Aplicar",
|
||||
"Maintenance_Status" : "Estado",
|
||||
"Maintenance_Tools_Tab_Settings" : "Ajustes",
|
||||
"Maintenance_Tools_Tab_UISettings" : "Ajustes de interfaz",
|
||||
"Maintenance_Tools_Tab_Tools" : "Herramientas",
|
||||
"Maintenance_Tools_Tab_BackupRestore" : "Respaldo / Restaurar",
|
||||
"Maintenance_Tools_Tab_Logging" : "Registros",
|
||||
"Maintenance_Tool_displayed_columns_text" : "Cambia la visibilidad y el orden de las columnas en la página <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivos</b></a> . (La función de coger y arrastrar funciona un poco mal, pero funciona. (Se intentó arreglar <a href=\"https://github.com/jokob-sk/Pi.Alert/commit/94b32f0f7332879f5a7d2af05dafa2e5d5cfa5da\">como por 3 horas</a> - se agradecerían PRs para arreglarlo)).",
|
||||
"Maintenance_Tool_order_columns_text" : "",
|
||||
"Maintenance_Tool_darkmode" : "Cambiar Modo (Dark/Light)",
|
||||
"Maintenance_Tool_drag_me" : "Coger para rearrastrar columnas.",
|
||||
"Maintenance_Tool_check_visible" : "Desactivar para ocultar columna.",
|
||||
"Maintenance_Tool_darkmode_text" : "Alternar entre el modo oscuro y el modo de luz. Si el interruptor no funciona correctamente, intente borrar el caché del navegador. El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.",
|
||||
"Maintenance_Tool_darkmode_noti" : "Cambiar Modo",
|
||||
"Maintenance_Tool_darkmode_noti_text" : "Después del cambio de tema, la página intenta volver a cargar para activar el cambio. Si es necesario, el caché debe ser eliminado.",
|
||||
"Maintenance_Tool_arpscansw" : "Activar arp-scan (on/off)",
|
||||
"Maintenance_Tool_arpscansw_text" : "Encender o desactivar el arp-scan. Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente. Los escaneos activos no se cancelan.",
|
||||
"Maintenance_Tool_arpscansw_noti" : "Activar arp-scan on or off",
|
||||
"Maintenance_Tool_arpscansw_noti_text" : "Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente.",
|
||||
"Maintenance_Tool_del_empty_macs" : "Eliminar dispositivos con MACs vacíos",
|
||||
"Maintenance_Tool_del_empty_macs_text" : "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos sin Mac se eliminarán de la base de datos.",
|
||||
"Maintenance_Tool_del_empty_macs_noti" : "Eliminar dispositivos",
|
||||
"Maintenance_Tool_del_empty_macs_noti_text" : "¿Estás seguro de que quieres eliminar todos los dispositivos con direcciones MAC vacías? <br> (tal vez prefiera archivarlo)",
|
||||
"Maintenance_Tool_upgrade_database_noti" : "Actualizar la base de datos",
|
||||
"Maintenance_Tool_upgrade_database_text" : "Este botón actualizará la base de datos para habilitar la actividad de la red en las últimas 12 horas. Haga una copia de seguridad de su base de datos en caso de problemas.",
|
||||
"Maintenance_Tool_upgrade_database_noti_text" : "¿Estás seguro de que quieres actualizar la base de datos? <br> (tal vez prefieras archivarla)",
|
||||
"Maintenance_Tool_del_alldev" : "Eliminar todos los dispositivos",
|
||||
"Maintenance_Tool_del_alldev_text" : "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos se eliminarán de la base de datos.",
|
||||
"Maintenance_Tool_del_alldev_noti" : "Eliminar dispositivos",
|
||||
"Maintenance_Tool_del_alldev_noti_text" : "¿Estás seguro de que quieres eliminar todos los dispositivos?",
|
||||
"Maintenance_Tool_del_unknowndev" : "Eliminar dispositivos (desconocidos)",
|
||||
"Maintenance_Tool_del_unknowndev_text" : "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos nombrados (desconocidos) se eliminarán de la base de datos.",
|
||||
"Maintenance_Tool_del_unknowndev_noti" : "Eliminar dispositivos (desconocidos)",
|
||||
"Maintenance_Tool_del_unknowndev_noti_text" : "¿Estás seguro de que quieres eliminar todos los dispositivos (desconocidos)?",
|
||||
"Maintenance_Tool_del_allevents" : "Eliminar todo (Restablecer historial)",
|
||||
"Maintenance_Tool_del_allevents_text" : "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.",
|
||||
"Maintenance_Tool_del_allevents_noti" : "Eliminar eventos",
|
||||
"Maintenance_Tool_del_allevents_noti_text" : "¿Estás seguro de que quieres eliminar todos los eventos? Esto restablece la presencia de todos los dispositivos.",
|
||||
"Maintenance_Tool_del_allevents30" : "Eliminar eventos antiguos (30 días)",
|
||||
"Maintenance_Tool_del_allevents30_text" : "Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos mayores a 30 días en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como \"presentes\", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.",
|
||||
"Maintenance_Tool_del_allevents30_noti" : "Eliminar eventos",
|
||||
"Maintenance_Tool_del_allevents30_noti_text" : "¿Está seguro de eliminar todos los eventos mayores a 30 días? Esto restablece la presencia de todos los dispositivos.",
|
||||
"Maintenance_Tool_backup" : "Respaldar DB",
|
||||
"Maintenance_Tool_backup_text" : "Las copias de seguridad de la base de datos se encuentran en el directorio de la base de datos como una Zip-Archive, nombrada con la fecha de creación. No hay un número máximo de copias de seguridad.",
|
||||
"Maintenance_Tool_backup_noti" : "Respaldar DB",
|
||||
"Maintenance_Tool_backup_noti_text" : "¿Estás seguro de que quieres exactos la copia de seguridad de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.",
|
||||
"Maintenance_Tool_restore" : "Restaurar DB",
|
||||
"Maintenance_Tool_restore_text" : "La última copia de seguridad se puede restaurar a través del botón, pero las copias de seguridad anteriores solo se pueden restaurar manualmente. Después de la restauración, realice una verificación de integridad en la base de datos por seguridad, en caso de que el DB estuviera actualmente en acceso de escritura cuando se creó la copia de seguridad.",
|
||||
"Maintenance_Tool_restore_noti" : "Restaurar DB",
|
||||
"Maintenance_Tool_restore_noti_text" : "¿Estás seguro de que quieres hacer exactos la restauración de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.",
|
||||
"Maintenance_Tool_purgebackup" : "Purgar Respaldos",
|
||||
"Maintenance_Tool_purgebackup_text" : "Todas las copias de seguridad serán eliminadas, excepto las 3 últimas.",
|
||||
"Maintenance_Tool_purgebackup_noti" : "Purgar Respaldos",
|
||||
"Maintenance_Tool_purgebackup_noti_text" : "¿Está seguro de borrar todas las copias de seguridad excepto las 3 últimas?",
|
||||
"Maintenance_Tool_del_ActHistory" : "Eliminar la actividad de la red",
|
||||
"Maintenance_Tool_del_ActHistory_text" : "El gráfico de actividad de la red se resetea. Esto no afecta a los eventos.",
|
||||
"Maintenance_Tool_del_ActHistory_noti" : "Borrar la actividad de la red",
|
||||
"Maintenance_Tool_del_ActHistory_noti_text" : "¿Está seguro de restablecer la actividad de la red?",
|
||||
"Maintenance_Tool_ExportCSV" : "Exportación CSV",
|
||||
"Maintenance_Tool_ExportCSV_text" : "Generar un archivo CSV (valores separados por comas) que contenga la lista de dispositivos incluyendo las relaciones de red entre los nodos de red y los dispositivos conectados.",
|
||||
"Maintenance_Tool_ExportCSV_noti" : "Exportación CSV",
|
||||
"Maintenance_Tool_ExportCSV_noti_text" : "¿Está seguro de que quiere generar un archivo CSV?",
|
||||
"Maintenance_Tool_ImportCSV" : "Importación CSV",
|
||||
"Maintenance_Tool_ImportCSV_text" : "Antes de usar esta función, haga una copia de seguridad. Importe un archivo CSV (valor separado por comas) que contiene la lista de dispositivos, incluidas las relaciones de red entre nodos de red y dispositivos conectados. Para hacer eso, coloque el archivo CSV llamado <b> devices.csv </b> en su carpeta <b>/config </b>.",
|
||||
"Maintenance_Tool_ImportCSV_noti" : "Importación CSV",
|
||||
"Maintenance_Tool_ImportCSV_noti_text" : "¿Está seguro de que quiere importar el archivo CSV? Esto sobrescribirá completamente los dispositivos de su base de datos.",
|
||||
"BackDevices_Arpscan_disabled" : "Arp-Scan Desactivado",
|
||||
"BackDevices_Arpscan_enabled" : "Arp-Scan Activado",
|
||||
"BackDevices_darkmode_disabled" : "Darkmode Desactivado",
|
||||
"BackDevices_darkmode_enabled" : "Darkmode Activado",
|
||||
"BackDevices_Restore_CopError" : "La base de datos original no se pudo guardar.",
|
||||
"BackDevices_Restore_okay" : "Restauración ejecutado con éxito.",
|
||||
"BackDevices_Restore_Failed" : "La restauración falló. Restaurar la copia de seguridad manualmente.",
|
||||
"BackDevices_Backup_CopError" : "La base de datos original no se pudo guardar.",
|
||||
"BackDevices_Backup_okay" : "La copia de seguridad ejecutada con éxito con el nuevo archivo",
|
||||
"BackDevices_Backup_Failed" : "La copia de seguridad se ejecutó parcialmente con éxito. El archivo no se puede crear o está vacío.",
|
||||
"BackDevices_DBTools_DelDev_a" : "Dispositivo eliminado con éxito",
|
||||
"BackDevices_DBTools_DelDev_b" : "Dispositivos eliminados con éxito",
|
||||
"BackDevices_DBTools_DelEvents" : "Eventos eliminados con éxito",
|
||||
"BackDevices_DBTools_DelEventsError" : "Error de eliminación de eventos",
|
||||
"BackDevices_DBTools_DelDevError_a" : "Error de eliminación del dispositivo",
|
||||
"BackDevices_DBTools_DelDevError_b" : "Error de eliminación de dispositivos",
|
||||
"BackDevices_DBTools_UpdDev" : "Dispositivo actualizado con éxito",
|
||||
"BackDevices_DBTools_UpdDevError" : "Error al actualizar el dispositivo",
|
||||
"BackDevices_DBTools_Upgrade" : "Base de datos actualizada correctamente",
|
||||
"BackDevices_DBTools_UpgradeError" : "Falló la actualización de la base de datos",
|
||||
"BackDevices_DBTools_Purge" : "Las copias de seguridad más antiguas fueron eliminadas",
|
||||
"BackDevices_DBTools_ImportCSV" : "Los dispositivos del archivo CSV han sido importados correctamente.",
|
||||
"BackDevices_DBTools_ImportCSVError" : "El archivo CSV no pudo ser importado. Asegúrate de que el formato es correcto.",
|
||||
"BackDevices_DBTools_ImportCSVMissing" : "El archivo CSV no se pudo encontrar en <b>/config/devices.csv.</b>",
|
||||
"BackDevices_Device_UpdDevError" : "Fallo al actualizar dispositivos, pruebe de nuevo más tarde. La base de datos probablemente esté bloqueada por una tarea en curso.",
|
||||
"Network_Title" : "Descripción general de la red",
|
||||
"Network_ManageDevices" : "Administrar dispositivos",
|
||||
"Network_ManageAdd" : "Añadir dispositivo",
|
||||
"Network_ManageAssign" : "Asignar",
|
||||
"Network_ManageUnassign" : "Desasignar",
|
||||
"Network_ManageEdit" : "Actualizar dispositivo",
|
||||
"Network_ManageDel" : "Eliminar dispositivo",
|
||||
"Network_ManageAdd_Name" : "Nombre del dispositivo",
|
||||
"Network_ManageAdd_Name_text" : "Nombre sin caracteres especiales",
|
||||
"Network_ManageAdd_Type" : "Tipo de dispositivo",
|
||||
"Network_ManageAdd_Type_text" : "-- Seleccionar tipo --",
|
||||
"Network_ManageAdd_Port" : "Recuento de puertos",
|
||||
"Network_ManageAdd_Port_text" : "dejar en blanco para WiFi y Powerline",
|
||||
"Network_ManageAdd_Submit" : "Añadir dispositivo",
|
||||
"Network_ManageEdit_ID" : "Dispositivo para actualizar",
|
||||
"Network_ManageEdit_ID_text" : "-- Seleccione el dispositivo para editar --",
|
||||
"Network_ManageEdit_Name" : "Nuevo nombre del dispositivo",
|
||||
"Network_ManageEdit_Name_text" : "Nombre sin caracteres especiales",
|
||||
"Network_ManageEdit_Type" : "Nuevo tipo de dispositivo",
|
||||
"Network_ManageEdit_Type_text" : "-- Seleccione tipo --",
|
||||
"Network_ManageEdit_Port" : " Nuevo recuento de puertos",
|
||||
"Network_ManageEdit_Port_text" : "Dejar en blanco para WiFi y Powerline",
|
||||
"Network_ManageEdit_Submit" : "Guardar los cambios",
|
||||
"Network_ManageDel_Name" : "Dispositivo para eliminar",
|
||||
"Network_ManageDel_Name_text" : "-- Seleccione el dispositivo --",
|
||||
"Network_ManageDel_Submit" : "Eliminar",
|
||||
"Network_Table_State" : "Estado",
|
||||
"Network_Table_Hostname" : "Nombre de host",
|
||||
"Network_Table_IP" : "Dirección IP",
|
||||
"Network_UnassignedDevices" : "Dispositivos sin asignar",
|
||||
"Network_Assign" : "Conectar al nodo de <i class=\"fa fa-server\"></i> red",
|
||||
"Network_Connected" : "Dispositivos conectados",
|
||||
"Network_ManageLeaf" : "Gestionar asignación",
|
||||
"Network_Node" : "Nodo de red",
|
||||
"Network_Node_Name" : "Nombre de nodo",
|
||||
"Network_Parent" : "Dispositivo primario de la red",
|
||||
"Network_NoAssignedDevices" : "Este nodo de red no tiene asignado ningún dispositivo (nodo externo). Asigna uno de la lista o ve a la pestaña <b><i class=\"fa fa-info-circle\"></i> Detalles</b> de cualquier dispositivo en la página<a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Dispositivos</b></a>, y asígnalo a un <b><i class=\"fa fa-server\"></i> Nodo (MAC)</b> <b><i class=\"fa fa-ethernet\"></i> Puerto</b> de la red ahí.",
|
||||
"HelpFAQ_Title" : "Ayuda / FAQ",
|
||||
"HelpFAQ_Cat_General" : "General",
|
||||
"HelpFAQ_Cat_Detail" : "Detalles",
|
||||
"HelpFAQ_Cat_General_100_head" : "El reloj en la parte superior derecha y el tiempo de los eventos/presencia no son correctos (diferencia de tiempo).",
|
||||
"HelpFAQ_Cat_General_100_text_a" : "En su PC, la siguiente zona horaria está configurada para el entorno PHP:",
|
||||
"HelpFAQ_Cat_General_100_text_b" : "Si esta no es la zona horaria en la que se encuentra, debe cambiar la zona horaria en el archivo de configuración de PHP. Puedes encontrarlo en este directorio:",
|
||||
"HelpFAQ_Cat_General_100_text_c" : "Busque en este archivo la entrada \"date.timezone\", elimine el \";\" inicial si es necesario e introduzca la zona horaria deseada. Puede encontrar una lista con las zonas horarias compatibles aquí (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
|
||||
"HelpFAQ_Cat_General_101_head" : "Mi red parece ralentizarse, el streaming se \"congela\".",
|
||||
"HelpFAQ_Cat_General_101_text" : "Es muy posible que los dispositivos de baja potencia alcancen sus límites de rendimiento con la forma en que Pi.Alert detecta nuevos dispositivos en la red. Esto se amplifica aún más, si estos dispositivos se comunican con la red a través de WLAN. Las soluciones aquí serían cambiar a una conexión por cable si es posible o, si el dispositivo sólo se va a utilizar durante un período de tiempo limitado, utilizar el arp scan. pausar el arp scan en la página de mantenimiento.",
|
||||
"HelpFAQ_Cat_General_102_head" : "Me aparece el mensaje de que la base de datos es de sólo de lectura.",
|
||||
"HelpFAQ_Cat_General_102_text" : "Compruebe en el directorio Pi.Alert si la carpeta de la base de datos (db) tiene asignados los permisos correctos:<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (nombre de usuario) www-data</span><br> Si el permiso no es correcto, puede establecerlo de nuevo con los siguientes comandos en la terminal o la consola:<br> <span class=\"text-danger help_faq_code\"> sudo chgrp -R www-data ~/pialert/db<br> chmod -R 770 ~/pialert/db </span><br> Si la base de datos sigue siendo de sólo lectura, intente reinstalar o restaurar una copia de seguridad de la base de datos desde la página de mantenimiento.",
|
||||
"HelpFAQ_Cat_General_102docker_head" : "(🐳 Solo Docker) Problemas con la base de datos (errores de AJAX, solo lectura, no encontrado)",
|
||||
"HelpFAQ_Cat_General_102docker_text" : "Comprueba que has seguido las instrucciones del <a href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles\">dockerfile (la información más actualizada)</a>. <br/> <br/> <ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"> <li data-sourcepos=\"49:4-49:106\">Descarga la <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db\">base de datos original desde GitHub</a>.</li> <li data-sourcepos=\"50:4-50:195\">Mapea el archivo <code>pialert.db</code> (<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">⚠</g-emoji> no carpeta) de arriba a <code>/home/pi/pialert/db/pialert.db</code> (puedes comprobar los <a href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples\">ejemplos</a> para más detalles).</li> <li data-sourcepos=\"51:4-51:161\">Si aparecen problemas (errores de AJAX, no se puede escribir a la base de datos, etc,) asegúrate que los permisos están establecidos correctamente. También puedes comprobar los registros en <code>/home/pi/pialert/front/log</code>.</li> <li data-sourcepos=\"52:4-52:146\">Para arreglar los problemas de los permisos, puedes probar a crear una copia de seguridad de la base de datos y después restaurarla desde la sección <strong>Mantenimiento > Copia de seguridad/Restaurar</strong>.</li> <li data-sourcepos=\"53:4-53:228\">Si la base de datos está en modo solo lectura, lo puedes arreglar ejecutando el siguiente comando para establecer el propietario y grupo en el sistema host: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li> </ul>",
|
||||
"HelpFAQ_Cat_General_103_head" : "La página de inicio de sesión no aparece, incluso después de cambiar la contraseña.",
|
||||
"HelpFAQ_Cat_General_103_text" : "Además de la contraseña, el archivo de configuración debe contener <span class=\"text-danger help_faq_code\">~/pialert/config/pialert.conf</span> además el parámetro <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> debe ajustarse a <span class=\"text-danger help_faq_code\">True</span>.",
|
||||
"HelpFAQ_Cat_Device_200_head" : "Tengo dispositivos en mi lista que no conozco. Después de borrarlos, siempre vuelven a aparecer.",
|
||||
"HelpFAQ_Cat_Device_200_text" : "Si utiliza Pi-hole, tenga en cuenta que Pi.Alert recupera información de Pi-hole. Ponga en pausa Pi.Alert, vaya a la página de configuración de Pi-hole y elimine la concesión DHCP si es necesario. Luego, también en Pi-hole, revise en Herramientas -> Red para ver si puede encontrar los hosts recurrentes allí. Si es así, elimínelos también allí. Ahora puede volver a iniciar Pi.Alert. Ahora el dispositivo(s) no debería aparecer más.",
|
||||
"HelpFAQ_Cat_Detail_300_head" : "¿Qué significa? ",
|
||||
"HelpFAQ_Cat_Detail_300_text_a" : "significa un dispositivo de red creado a partir de la página de red.",
|
||||
"HelpFAQ_Cat_Detail_300_text_b" : "designa el número de puerto en el que el dispositivo editado actualmente está conectado a este dispositivo de red.",
|
||||
"HelpFAQ_Cat_Detail_301_head_a" : "¿Cuándo está escaneando ahora? En ",
|
||||
"HelpFAQ_Cat_Detail_301_head_b" : " dice 1min pero el gráfico muestra intervalos de 5min.",
|
||||
"HelpFAQ_Cat_Detail_301_text" : "El intervalo de tiempo entre los escaneos está definido por el \"Cronjob\", que está configurado en 5 minutos de forma predeterminada. La designación \"1min\" se refiere a la duración esperada del escaneo. Dependiendo de la configuración de la red, este tiempo puede variar. Para editar el cronjob, puede utilizar el siguiente comando en la terminal/consola <span class=\"text-danger help_faq_code\">crontab -e</span> y cambiar el intervalo.",
|
||||
"HelpFAQ_Cat_Detail_302_head_a" : "¿Qué significa? ",
|
||||
"HelpFAQ_Cat_Detail_302_head_b" : "¿y por qué no puedo seleccionarlo?",
|
||||
"HelpFAQ_Cat_Detail_302_text" : "Algunos dispositivos modernos generan direcciones MAC aleatorias por razones de privacidad, que ya no pueden asociarse a ningún fabricante y que vuelven a cambiar con cada nueva conexión. Pi.Alert detecta si se trata de una dirección MAC aleatoria y activa este \"campo\" automáticamente. Para deshabilitar este comportamiento, debe buscar en su dispositivo cómo deshabilitar la aleatorización de direcciones MAC.",
|
||||
"HelpFAQ_Cat_Detail_303_head" : "¿Qué es Nmap y para qué sirve?",
|
||||
"HelpFAQ_Cat_Detail_303_text" : "Nmap es un escáner de red con múltiples capacidades.<br> Cuando aparece un nuevo dispositivo en su lista, tiene la posibilidad de obtener información más detallada sobre el dispositivo a través del escaneo de Nmap.",
|
||||
"HelpFAQ_Cat_Presence_400_head" : "Los dispositivos se muestran con un marcador amarillo y la nota \"evento faltante\".",
|
||||
"HelpFAQ_Cat_Presence_400_text" : "Si esto sucede, tiene la opción de eliminar los eventos en el dispositivo en cuestión (vista de detalles). Otra posibilidad sería encender el dispositivo y esperar hasta que Pi.Alert detecte el dispositivo como \"online\" con el siguiente escaneo y luego simplemente apagar el dispositivo nuevamente. Ahora Pi.Alert debería anotar correctamente el estado del dispositivo en la base de datos con el próximo escaneo.",
|
||||
"HelpFAQ_Cat_Presence_401_head" : "Un dispositivo se muestra como presente aunque esté \"Offline\".",
|
||||
"HelpFAQ_Cat_Presence_401_text" : "Si esto sucede, tiene la posibilidad de eliminar los eventos del dispositivo en cuestión (vista de detalles). Otra posibilidad sería encender el dispositivo y esperar hasta que Pi.Alert reconozca el dispositivo como \"online\" con el siguiente escaneo y luego simplemente apagar el dispositivo nuevamente. Ahora Pi.Alert debería anotar correctamente el estado del dispositivo en la base de datos con el próximo escaneo.",
|
||||
"HelpFAQ_Cat_Network_600_head" : "¿Para qué sirve esta sección?",
|
||||
"HelpFAQ_Cat_Network_600_text" : "Esta sección debería ofrecerle la posibilidad de mapear la asignación de sus dispositivos de red. Para ello, puede crear uno o más conmutadores, WLAN, enrutadores, etc., proporcionarles un número de puerto si es necesario y asignarles dispositivos ya detectados. Esta asignación se realiza en la vista detallada del dispositivo a asignar. Por lo tanto, es posible determinar rápidamente a qué puerto está conectado un host y si está en línea. Es posible asignar un dispositivo a múltiples puertos (agrupación de puertos), así como múltiples dispositivos a un puerto (máquinas virtuales).",
|
||||
"HelpFAQ_Cat_Network_601_head" : "¿Hay otros documentos?",
|
||||
"HelpFAQ_Cat_Network_601_text" : "¡Sí, los hay! Marque <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/\">todos los documentos</a> para más información.",
|
||||
"test_event_tooltip" : "Guarda tus cambios antes de probar nuevos ajustes.",
|
||||
"test_event_icon" : "fa-vial-circle-check",
|
||||
"run_event_tooltip" : "Activa el ajuste y guarda tus cambios antes de ejecutarlo.",
|
||||
"run_event_icon" : "fa-play",
|
||||
"general_event_title" : "Ejecutar un evento ad-hoc",
|
||||
"general_event_description" : "El evento que has ejecutado puede tardar un rato mientras finalizan procesos en segundo plano. La ejecución ha terminado cuando ves <code>finalizado</code> abajo. Comprueba el <a href='/maintenance.php#tab_Logging'>registro de error</a> si no has obtenido el resultado esperado. <br/> <br/> Estado: ",
|
||||
"Plugins_Unprocessed_Events" : "Eventos sin procesar",
|
||||
"Plugins_Objects" : "Objetos del Plugin",
|
||||
"Plugins_DeleteAll" : "Eliminar todo (se ignoran los filtros)",
|
||||
"Plugins_History" : "Historial de eventos",
|
||||
"Plugins_Filters_Mac" : "Filtro MAC",
|
||||
"Plugins_Out_of" : "de",
|
||||
"Settings_Title" : "<i class=\"fa fa-cog\"> Configuración</i>",
|
||||
"settings_missing" : "Actualiza la página, no todos los ajustes se han cargado. Probablemente sea por una sobrecarga de la base de datos.",
|
||||
"settings_missing_block" : "No puedes guardar los ajustes sin establecer todas las claves. Actualiza la página. Problabmente esté causado por una sobrecarga de la base de datos.",
|
||||
"settings_old" : "N/A",
|
||||
"settings_imported" : "Última vez que los ajustes fueron importados desde el archivo pialert.conf:",
|
||||
"settings_expand_all" : "Expandir todo",
|
||||
"Setting_Override" : "Sobreescribir el valor",
|
||||
"Setting_Override_Description": "Habilitar esta opción anulará un valor predeterminado proporcionado por la aplicación con el valor especificado anteriormente.",
|
||||
"General_display_name" : "General",
|
||||
"General_icon" : "<i class=\"fa fa-gears\"></i>",
|
||||
"SCAN_SUBNETS_name" : "Subredes para escanear",
|
||||
"SCAN_SUBNETS_description" : "El escaneo Arp es una herramienta de la línea de comandos que usa el protocolo ARP para encontrar e identificar la ip de los dispositivos. Una alternativa a este escaneo sería activar los ajustes de la <a onclick=\"toggleAllSettings()\" href=\"#PIHOLE_RUN\"><code>PIHOLE_RUN</code>integración con PiHole</a>. El tiempo del escaneo ARP depende del número de ips a comprobar, así que es importante establecer correctamente la máscara y la interfaz de red. Comprueba la <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SUBNETS.md\" target=\"_blank\">documentación sobre sudredes</a> para obtener ayuda para establecer VLANs, cuáles son soportadas o como averiguar la máscara y la interfaz de red.",
|
||||
"LOG_LEVEL_name" : "Imprimir registros adicionales",
|
||||
"LOG_LEVEL_description" : "Esto hará que el registro tenga más información. Util para depurar que eventos se van guardando en la base de datos.",
|
||||
"TIMEZONE_name" : "Zona horaria",
|
||||
"TIMEZONE_description" : "La zona horaria para mostrar las estadísticas correctamente. Encuentra tu zona horaria <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">aquí</a>.",
|
||||
"ENABLE_PLUGINS_name" : "Habilitar complementos",
|
||||
"ENABLE_PLUGINS_description" : "Habilita la funcionalidad de los <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins\">complementos</a>. Cargar los complementos requiere más recursos de hardware, así que quizás quieras desactivarlo en hardware poco potente.",
|
||||
"PLUGINS_KEEP_HIST_name": "Historial de complementos",
|
||||
"PLUGINS_KEEP_HIST_description": "¿Cuántas entradas de los resultados del análisis del historial de complementos deben conservarse (globalmente, no específico del dispositivo!).",
|
||||
"PIALERT_WEB_PROTECTION_name" : "Habilitar inicio de sesión",
|
||||
"PIALERT_WEB_PROTECTION_description" : "Cuando está habilitado, se muestra un cuadro de diálogo de inicio de sesión. Lea detenidamente a continuación si se le bloquea el acceso a su instancia.",
|
||||
"PIALERT_WEB_PASSWORD_name" : "Contraseña de inicio de sesión",
|
||||
"PIALERT_WEB_PASSWORD_description" : "La contraseña predeterminada es <code>123456</code>. Para cambiar la contraseña, ejecute <code>/home/pi/pialert/back/pialert-cli</code> en el contenedor",
|
||||
"INCLUDED_SECTIONS_name" : "Notificar en",
|
||||
"INCLUDED_SECTIONS_description" : "Especifica que eventos envían notificaciones. Elimina los tipos de eventos de los que no quieras recibir notificaciones. Este ajuste sobreescribe los ajustes específicos de los dispositivos en la interfaz. (<code>CTRL + Clic</code> para seleccionar / deseleccionar).",
|
||||
"DAYS_TO_KEEP_EVENTS_name" : "Eliminar eventos anteriores a",
|
||||
"DAYS_TO_KEEP_EVENTS_description" : "Esta es una configuración de mantenimiento. Esto especifica el número de días de entradas de eventos que se guardarán. Todos los eventos anteriores se eliminarán periódicamente.",
|
||||
"HRS_TO_KEEP_NEWDEV_name": "Guardar nuevos dispositivos para",
|
||||
"HRS_TO_KEEP_NEWDEV_description": "Esta es una configuración de mantenimiento. Si está habilitado (<code>0</code> está deshabilitado), los dispositivos marcados como <b>Nuevo dispositivo</b> se eliminarán si su <b>Primera sesión</ b> el tiempo era anterior a las horas especificadas en esta configuración. Utilice esta configuración si desea eliminar automáticamente <b>Nuevos dispositivos</b> después de <code>X</code> horas.",
|
||||
"REPORT_DASHBOARD_URL_name" : "URL de Pi.Alert",
|
||||
"REPORT_DASHBOARD_URL_description" : "Esta URL se utiliza como base para generar enlaces en los correos electrónicos. Ingrese la URL completa que comienza con <code>http://</code>, incluido el número de puerto (sin barra inclinada al final <code>/</code>).",
|
||||
"DIG_GET_IP_ARG_name" : "Descubrir de IP de Internet",
|
||||
"DIG_GET_IP_ARG_description" : "Cambie los argumentos de la <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">utilidad de dig</a> si tiene problemas para resolver su IP de Internet. Los argumentos se agregan al final del siguiente comando: <code>dig +short </code>.",
|
||||
"UI_LANG_name" : "Idioma de interfaz",
|
||||
"UI_LANG_description" : "Seleccione el idioma de interfaz de usuario preferido.",
|
||||
"UI_PRESENCE_name" : "Mostrar en el gráfico de presencia",
|
||||
"UI_PRESENCE_description" : "Elige que estados del dispositivo deben mostrarse en la gráfica de <b>Presencia del dispositivo a lo largo del tiempo</b> de la página de <a href=\"/devices.php\" target=\"_blank\">Dispositivos</a>. (<code>CTRL + Clic</code> para seleccionar / deseleccionar)",
|
||||
"Email_display_name" : "Email",
|
||||
"Email_icon" : "<i class=\"fa fa-at\"></i>",
|
||||
"REPORT_MAIL_name" : "Habilitar email",
|
||||
"REPORT_MAIL_description" : "Si está habilitado, se envía un correo electrónico con una lista de cambios a los que se ha suscrito. Complete también todas las configuraciones restantes relacionadas con la configuración de SMTP a continuación",
|
||||
"SMTP_SERVER_name" : "URL del servidor SMTP",
|
||||
"SMTP_SERVER_description" : "La URL del host del servidor SMTP. Por ejemplo, <code>smtp-relay.sendinblue.com</code>. Para utilizar Gmail como servidor SMTP <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP.md\">siga esta guía</a >",
|
||||
"SMTP_PORT_name" : "Puerto del servidor SMTP",
|
||||
"SMTP_PORT_description" : "Número de puerto utilizado para la conexión SMTP. Establézcalo en <code>0</code> si no desea utilizar un puerto al conectarse al servidor SMTP.",
|
||||
"SMTP_SKIP_LOGIN_name" : "Omitir autenticación",
|
||||
"SMTP_SKIP_LOGIN_description" : "No utilice la autenticación cuando se conecte al servidor SMTP.",
|
||||
"SMTP_USER_name" : "Nombre de usuario SMTP",
|
||||
"SMTP_USER_description" : "El nombre de usuario utilizado para iniciar sesión en el servidor SMTP (a veces, una dirección de correo electrónico completa).",
|
||||
"SMTP_PASS_name" : "Contraseña de SMTP",
|
||||
"SMTP_PASS_description" : "La contraseña del servidor SMTP.",
|
||||
"SMTP_SKIP_TLS_name" : "No usar TLS",
|
||||
"SMTP_SKIP_TLS_description" : "Deshabilite TLS cuando se conecte a su servidor SMTP.",
|
||||
"SMTP_FORCE_SSL_name" : "Forzar SSL",
|
||||
"SMTP_FORCE_SSL_description" : "Forzar SSL al conectarse a su servidor SMTP",
|
||||
"SYSTEM_TITLE" : "Información del sistema",
|
||||
"REPORT_TO_name" : "Enviar el email a",
|
||||
"REPORT_TO_description" : "Dirección de correo electrónico a la que se enviará la notificación.",
|
||||
"REPORT_FROM_name" : "Asunto del email",
|
||||
"REPORT_FROM_description" : "Asunto del correo electrónico de notificación.",
|
||||
"Webhooks_display_name" : "Webhooks",
|
||||
"Webhooks_icon" : "<i class=\"fa fa-circle-nodes\"></i>",
|
||||
"REPORT_WEBHOOK_name" : "Habilitar webhooks",
|
||||
"REPORT_WEBHOOK_description" : "Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a>, por nombrar algunas. Consulte esta sencilla <a href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">guía de n8n aquí</a> para obtener comenzó. Si está habilitado, configure los ajustes relacionados a continuación.",
|
||||
"WEBHOOK_URL_name" : "URL de destino",
|
||||
"WEBHOOK_URL_description" : "URL de destino comienza con <code>http://</code> o <code>https://</code>.",
|
||||
"WEBHOOK_PAYLOAD_name" : "Tipo de carga",
|
||||
"WEBHOOK_PAYLOAD_description" : "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.Alert/blob/main/back/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)",
|
||||
"WEBHOOK_REQUEST_METHOD_name" : "Método de solicitud",
|
||||
"WEBHOOK_REQUEST_METHOD_description" : "El método de solicitud HTTP que se utilizará para la llamada de webhook.",
|
||||
"Webhooks_settings_group" : "<i class=\"fa fa-circle-nodes\"></i> Webhooks",
|
||||
"WEBHOOK_SIZE_name": "Tamaño máximo de carga útil",
|
||||
"WEBHOOK_SIZE_description": "El tamaño máximo de la carga útil del webhook como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>.",
|
||||
"Apprise_display_name" : "Apprise",
|
||||
"Apprise_icon" : "<i class=\"fa fa-bullhorn\"></i>",
|
||||
"REPORT_APPRISE_name" : "Habilitar Apprise",
|
||||
"REPORT_APPRISE_description" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>.",
|
||||
"APPRISE_HOST_description" : "URL del host de Apprise que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)",
|
||||
"APPRISE_HOST_name" : "URL del host de Apprise",
|
||||
"APPRISE_URL_name" : "URL de notificación de Apprise",
|
||||
"APPRISE_URL_description" : "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería <code>tgram://{bot_token}/{chat_id}</code>.",
|
||||
"APPRISE_SIZE_name": "Tamaño máximo de carga útil",
|
||||
"APPRISE_SIZE_description": "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>.",
|
||||
"NTFY_display_name" : "NTFY",
|
||||
"NTFY_icon" : "<i class=\"fa fa-terminal\"></i>",
|
||||
"REPORT_NTFY_name" : "Habilitar NTFY",
|
||||
"REPORT_NTFY_description" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>.",
|
||||
"NTFY_HOST_name" : "URL del host NTFY",
|
||||
"NTFY_HOST_description" : "URL de host NTFY que comienza con <code>http://</code> o <code>https://</code>. Puede usar la instancia alojada en <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> simplemente ingresando <code>https://ntfy. sh</código>.",
|
||||
"NTFY_TOPIC_name" : "Tema de NTFY",
|
||||
"NTFY_TOPIC_description" : "Tu tema secreto.",
|
||||
"NTFY_USER_name" : "Usuario de NTFY",
|
||||
"NTFY_USER_description" : "Ingrese usuario si necesita (alojar) una instancia con autenticación habilitada.",
|
||||
"NTFY_PASSWORD_name" : "Contraseña de NTFY",
|
||||
"NTFY_PASSWORD_description" : "Ingrese la contraseña si necesita (host) una instancia con autenticación habilitada.",
|
||||
"PUSHSAFER_display_name" : "Pushsafer",
|
||||
"PUSHSAFER_icon" : "<i class=\"fa fa-bell\"></i>",
|
||||
"REPORT_PUSHSAFER_name" : "Habilitar Pushsafer",
|
||||
"REPORT_PUSHSAFER_description" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.pushsafer.com/\">Pushsafer</a>.",
|
||||
"PUSHSAFER_TOKEN_name" : "Token de Pushsafer",
|
||||
"PUSHSAFER_TOKEN_description" : "Su clave secreta de la API de Pushsafer (token).",
|
||||
"APPRISE_PAYLOAD_name" : "Tipo de carga",
|
||||
"APPRISE_PAYLOAD_description" : "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electrónicos, <code>text</code> con aplicaciones de chat, como Telegram.",
|
||||
"MQTT_display_name" : "MQTT",
|
||||
"MQTT_icon" : "<i class=\"fa fa-square-rss\"></i>",
|
||||
"REPORT_TITLE" : "Reporte",
|
||||
"REPORT_ERROR" : "La página que está buscando no está disponible temporalmente, inténtelo de nuevo después de unos segundos",
|
||||
"REPORT_MQTT_name" : "Habilitar MQTT",
|
||||
"REPORT_MQTT_description" : "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://www.home-assistant.io/integrations/mqtt/\">MQTT</a> a su Home Assistance.",
|
||||
"MQTT_BROKER_name" : "URL del broker MQTT",
|
||||
"MQTT_BROKER_description" : "URL del host MQTT (no incluya <code>http://</code> o <code>https://</code>).",
|
||||
"MQTT_PORT_name" : "Puerto del broker MQTT",
|
||||
"MQTT_PORT_description" : "Puerto donde escucha el broker MQTT. Normalmente <code>1883</code>.",
|
||||
"MQTT_USER_name" : "Usuario de MQTT",
|
||||
"MQTT_USER_description" : "Nombre de usuario utilizado para iniciar sesión en su instancia de agente de MQTT.",
|
||||
"MQTT_PASSWORD_name" : "Contraseña de MQTT",
|
||||
"MQTT_PASSWORD_description" : "Contraseña utilizada para iniciar sesión en su instancia de agente de MQTT.",
|
||||
"MQTT_QOS_name" : "Calidad de servicio MQTT",
|
||||
"MQTT_QOS_description" : "Configuración de calidad de servicio para el envío de mensajes MQTT. <code>0</code>: baja calidad a <code>2</code>: alta calidad. Cuanto mayor sea la calidad, mayor será el retraso.",
|
||||
"MQTT_DELAY_SEC_name" : "Retraso de MQTT por dispositivo",
|
||||
"MQTT_DELAY_SEC_description" : "Un pequeño truco: retrase la adición a la cola en caso de que el proceso se reinicie y los procesos de publicación anteriores se anulen (se necesitan ~<code>2</code>s para actualizar la configuración de un sensor en el intermediario). Probado con <code>2</code>-<code>3</code> segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificación). No afecta los escaneos o notificaciones posteriores.",
|
||||
"API_display_name" : "API",
|
||||
"API_icon" : "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||
"API_CUSTOM_SQL_name" : "Endpoint personalizado",
|
||||
"API_CUSTOM_SQL_description" : "Puede especificar una consulta SQL personalizada que generará un archivo JSON y luego lo expondrá a través del <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\">archivo <code>table_custom_endpoint.json</code ></a>.",
|
||||
"Speedtest_Results" : "Resultados de la prueba de velocidad",
|
||||
"Systeminfo_General" : "General",
|
||||
"Systeminfo_General_Full_Date": "Fecha completa:",
|
||||
"Systeminfo_General_Date": "Fecha:",
|
||||
"Systeminfo_General_Date2": "Fecha2:",
|
||||
"Systeminfo_General_TimeZone": "Zona horaria:",
|
||||
"Systeminfo_This_Client": "Este cliente",
|
||||
"Systeminfo_Client_User_Agent": "Agente de usuario:",
|
||||
"Systeminfo_Client_Resolution": "Resolución del navegador:",
|
||||
"Systeminfo_CPU" : "CPU",
|
||||
"Systeminfo_CPU_Vendor": "Proveedor de CPU:",
|
||||
"Systeminfo_CPU_Name": "Nombre de la CPU:",
|
||||
"Systeminfo_CPU_Cores": "Núcleos de CPU:",
|
||||
"Systeminfo_CPU_Speed": "Velocidad de la CPU:",
|
||||
"Systeminfo_CPU_Temp": "Temperatura de la CPU:",
|
||||
"Systeminfo_Memory": "Memoria",
|
||||
"Systeminfo_Memory_Usage": "Memoria en uso:",
|
||||
"Systeminfo_Memory_Usage_Percent": "Memoria %:",
|
||||
"Systeminfo_Memory_Total_Memory": "Memoria total:",
|
||||
"Systeminfo_Motherboard" : "Placa base",
|
||||
"Systeminfo_Motherboard_BIOS": "BIOS:",
|
||||
"Systeminfo_Motherboard_BIOS_Date": "Fecha del BIOS:",
|
||||
"Systeminfo_Motherboard_BIOS_Vendor": "Proveedor de BIOS:",
|
||||
"Systeminfo_Motherboard_Manufactured": "Fabricado por:",
|
||||
"Systeminfo_Motherboard_Name": "Nombre:",
|
||||
"Systeminfo_Motherboard_Revision": "Revisión:",
|
||||
"Systeminfo_Network": "Red",
|
||||
"Systeminfo_Network_Accept_Encoding": "Codificación aceptada:",
|
||||
"Systeminfo_Network_Accept_Language": "Idioma aceptado:",
|
||||
"Systeminfo_Network_Connection_Port": "Puerto de conexión:",
|
||||
"Systeminfo_Network_HTTP_Host": "Host HTTP:",
|
||||
"Systeminfo_Network_HTTP_Referer": "Referido HTTP:",
|
||||
"Systeminfo_Network_HTTP_Referer_String": "Sin referencia HTTP",
|
||||
"Systeminfo_Network_IP": "IP Internet:",
|
||||
"Systeminfo_Network_IP_Connection": "Conexión IP:",
|
||||
"Systeminfo_Network_IP_Server": "IP del servidor:",
|
||||
"Systeminfo_Network_MIME": "MIME:",
|
||||
"Systeminfo_Network_Request_Method": "Método de solicitud:",
|
||||
"Systeminfo_Network_Request_URI": "URI de solicitud:",
|
||||
"Systeminfo_Network_Request_Time": "Hora de solicitud:",
|
||||
"Systeminfo_Network_Secure_Connection": "Conexión segura:",
|
||||
"Systeminfo_Network_Secure_Connection_String": "No (HTTP)",
|
||||
"Systeminfo_Network_Server_Name": "Nombre del servidor:",
|
||||
"Systeminfo_Network_Server_Name_String": "Nombre del servidor no encontrado",
|
||||
"Systeminfo_Network_Server_Query": "Consulta del servidor:",
|
||||
"Systeminfo_Network_Server_Query_String": "Sin cadena de consulta",
|
||||
"Systeminfo_Network_Server_Version": "Versión del servidor:",
|
||||
"Systeminfo_Network_Hardware": "Hardware de red",
|
||||
"Systeminfo_Storage": "Almacenamiento",
|
||||
"Systeminfo_Storage_Mount": "Punto de montaje:",
|
||||
"Systeminfo_Storage_Device" : "Dispositivo:",
|
||||
"Systeminfo_Storage_Size": "Tamaño:",
|
||||
"Systeminfo_Storage_Type": "Tipo:",
|
||||
"Systeminfo_Storage_Usage": "Uso de almacenamiento",
|
||||
"Systeminfo_Storage_Usage_Mount": "Punto de montaje:",
|
||||
"Systeminfo_Storage_Usage_Total": "Total:",
|
||||
"Systeminfo_Storage_Usage_Used": "Usado:",
|
||||
"Systeminfo_Storage_Usage_Free": "Libre:",
|
||||
"Systeminfo_Services": "Servicios",
|
||||
"Systeminfo_Services_Name": "Nombre del servicio",
|
||||
"Systeminfo_Services_Description": "Descripción del servicio",
|
||||
"Systeminfo_System": "Sistema",
|
||||
"Systeminfo_System_Architecture": "Arquitectura:",
|
||||
"Systeminfo_System_AVG": "Cargar promedio:",
|
||||
"Systeminfo_System_Kernel": "Núcleo:",
|
||||
"Systeminfo_System_OSVersion": "Sistema Operativo:",
|
||||
"Systeminfo_System_Running_Processes" : "Procesos corriendo:",
|
||||
"Systeminfo_System_System": "Sistema:",
|
||||
"Systeminfo_System_Uname": "Uname:",
|
||||
"Systeminfo_System_Uptime": "Tiempo de actividad:",
|
||||
"Systeminfo_USB_Devices": "Dispositivos USB"
|
||||
}
|
||||
}
|
||||
@@ -1,607 +0,0 @@
|
||||
<?php
|
||||
|
||||
$lang['es_es'] = array(
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// About - Update by @TeroRERO 07ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'About_Title' => 'Guadián de Red <br>(Código Abierto)',
|
||||
'About_Design' => 'Diseñado para:',
|
||||
'About_Exit' => 'Salir',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// General - Update by @TeroRERO 01ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
'Gen_Delete' => 'Eliminar',
|
||||
'Gen_Cancel' => 'Cancelar',
|
||||
'Gen_Okay' => 'Ok',
|
||||
'Gen_Purge' => 'Purgar',
|
||||
'Gen_Backup' => 'Ejecutar copia de seguridad',
|
||||
'Gen_Restore' => 'Ejecutar restauración',
|
||||
'Gen_Switch' => 'Cambiar',
|
||||
'Gen_AreYouSure' => '¿Estás seguro de',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Login Page - Update by @TeroRERO 03ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
// TeroRERO Off 'Login_Box' => 'Inicie su sesión',
|
||||
'Login_Box' => 'Ingrese su contraseña',
|
||||
'Login_Remember' => 'Recordar',
|
||||
'Login_Remember_small' => '(válido por 7 días)',
|
||||
'Login_Submit' => 'Ingresar',
|
||||
'Login_Psw_run' => 'Para cambiar contraseña ejecute:',
|
||||
'Login_Psw_new' => 'nueva_contraseña',
|
||||
'Login_Psw_folder' => 'en la carpeta config.',
|
||||
'Login_Psw_alert' => '¡Alerta de Contraseña!',
|
||||
'Login_Psw-box' => 'Contraseña',
|
||||
'Login_Toggle_Info' => 'Información sobre la contraseña',
|
||||
'Login_Toggle_Info_headline' => 'Información sobre la contraseña',
|
||||
'Login_Toggle_Alert_headline' => 'Alerta de Contraseña!',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Page - Update by @TeroRERO 03ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Navigation_Devices' => 'Dispositivos',
|
||||
'Navigation_Presence' => 'Historial',
|
||||
'Navigation_Events' => 'Eventos',
|
||||
'Navigation_Maintenance' => 'Mantenimiento',
|
||||
'Navigation_Settings' => 'Configuración',
|
||||
'Navigation_Network' => 'Red',
|
||||
'Navigation_HelpFAQ' => 'Ayuda / FAQ',
|
||||
'Device_Title' => 'Dispositivos',
|
||||
'Device_Shortcut_AllDevices' => 'Todos',
|
||||
'Device_Shortcut_Connected' => 'Conectado(s)',
|
||||
'Device_Shortcut_Favorites' => 'Favorito(s)',
|
||||
'Device_Shortcut_NewDevices' => 'Nuevo(s)',
|
||||
'Device_Shortcut_DownAlerts' => 'Alerta(s) de caída(s)',
|
||||
'Device_Shortcut_Archived' => 'Archivado(s)',
|
||||
'Device_Shortcut_Devices' => 'Dispositivos',
|
||||
'Device_Shortcut_OnlineChart' => 'Presencia del dispositivo a lo largo del tiempo',
|
||||
'Device_TableHead_Name' => 'Nombre',
|
||||
'Device_TableHead_Owner' => 'Propietario',
|
||||
'Device_TableHead_Type' => 'Tipo',
|
||||
'Device_TableHead_Favorite' => 'Favorito',
|
||||
'Device_TableHead_Group' => 'Grupo',
|
||||
'Device_TableHead_FirstSession' => '1ra. sesión',
|
||||
'Device_TableHead_LastSession' => 'Última sesión',
|
||||
'Device_TableHead_LastIP' => 'Última IP',
|
||||
'Device_TableHead_MAC' => 'MAC',
|
||||
'Device_TableHead_LastIPOrder' => 'Última orden de IP',
|
||||
'Device_TableHead_Rowid' => 'Rowid',
|
||||
'Device_TableHead_Status' => 'Estado',
|
||||
'Device_Searchbox' => 'Búsqueda',
|
||||
'Device_Tablelenght' => 'Mostrar _MENU_ entradas',
|
||||
'Device_Tablelenght_all' => 'Todos',
|
||||
'Device_Table_info' => 'Mostrando el INICIO y el FINAL de TODAS las entradas',
|
||||
'Device_Table_nav_next' => 'Siguiente',
|
||||
'Device_Table_nav_prev' => 'Anterior',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Presence Page - Update by @TeroRERO 25jul2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Presence_Title' => 'Historial por dispositivo',
|
||||
'Presence_Shortcut_AllDevices' => 'Todos',
|
||||
'Presence_Shortcut_Connected' => 'Conectado(s)',
|
||||
'Presence_Shortcut_Favorites' => 'Favorito(s)',
|
||||
'Presence_Shortcut_NewDevices' => 'Nuevo(s)',
|
||||
'Presence_Shortcut_DownAlerts' => 'Alerta(s) de caída(s)',
|
||||
'Presence_Shortcut_Archived' => 'Archivado(s)',
|
||||
'Presence_Shortcut_Devices' => 'Dispositivos',
|
||||
|
||||
// Localizationfiles under pialert/front/lib/AdminLTE/bower_components/fullcalendar/dist/locale
|
||||
'Presence_CallHead_Devices' => 'Dispositivos',
|
||||
'Presence_CalHead_lang' => 'es-es',
|
||||
'Presence_CalHead_year' => 'año',
|
||||
'Presence_CalHead_quarter' => 'trimestre',
|
||||
'Presence_CalHead_month' => 'mes',
|
||||
'Presence_CalHead_week' => 'semana',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Events Page - Update by @TeroRERO 25jul2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Events_Title' => 'Eventos',
|
||||
'Events_Periodselect_today' => 'Hoy',
|
||||
'Events_Periodselect_LastWeek' => 'La semana pasada',
|
||||
'Events_Periodselect_LastMonth' => 'El mes pasado',
|
||||
'Events_Periodselect_LastYear' => 'El año pasado',
|
||||
'Events_Periodselect_All' => 'Toda la información',
|
||||
'Events_Shortcut_AllEvents' => 'Todos los eventos',
|
||||
'Events_Shortcut_Sessions' => 'Sesiones',
|
||||
'Events_Shortcut_MissSessions' => 'Sesiones faltantes',
|
||||
'Events_Shortcut_VoidSessions' => 'Sesiones anuladas',
|
||||
'Events_Shortcut_NewDevices' => 'Nuevo(s)',
|
||||
'Events_Shortcut_DownAlerts' => 'Alerta(s) de caída(s)',
|
||||
'Events_Shortcut_Events' => 'Eventos',
|
||||
'Events_TableHead_Order' => 'Ordenar',
|
||||
'Events_TableHead_Device' => 'Dispositivo',
|
||||
'Events_TableHead_Owner' => 'Propietario',
|
||||
'Events_TableHead_Date' => 'Fecha',
|
||||
'Events_TableHead_EventType' => 'Tipo de evento',
|
||||
'Events_TableHead_Connection' => 'Conexión',
|
||||
'Events_TableHead_Disconnection' => 'Desconexión',
|
||||
'Events_TableHead_Duration' => 'Duración',
|
||||
'Events_TableHead_DurationOrder' => 'Orden de duración',
|
||||
'Events_TableHead_IP' => 'Dirección IP',
|
||||
'Events_TableHead_IPOrder' => 'Orden de IP',
|
||||
'Events_TableHead_AdditionalInfo' => 'Información adicional',
|
||||
'Events_Searchbox' => 'Búsqueda',
|
||||
'Events_Tablelenght' => 'Mostrando entradas del MENÚ',
|
||||
'Events_Tablelenght_all' => 'Todos',
|
||||
'Events_Table_info' => 'Mostrando el INICIO y el FINAL de TODAS las entradas',
|
||||
'Events_Table_nav_next' => 'Siguiente',
|
||||
'Events_Table_nav_prev' => 'Anterior',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Device Details Page - Update by @TeroRERO 01ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'DevDetail_Periodselect_today' => 'Hoy',
|
||||
'DevDetail_Periodselect_LastWeek' => 'La semana pasada',
|
||||
'DevDetail_Periodselect_LastMonth' => 'El mes pasado',
|
||||
'DevDetail_Periodselect_LastYear' => 'El año pasado',
|
||||
'DevDetail_Periodselect_All' => 'Toda la información',
|
||||
'DevDetail_Shortcut_CurrentStatus' => 'Estado actual',
|
||||
'DevDetail_Shortcut_Sessions' => 'Sesiones',
|
||||
'DevDetail_Shortcut_Presence' => 'Historial',
|
||||
'DevDetail_Shortcut_DownAlerts' => 'Alerta(s) de caída(s)',
|
||||
'DevDetail_Tab_Details' => 'Detalles',
|
||||
'DevDetail_Tab_Nmap' => 'Nmap',
|
||||
'DevDetail_Tab_Sessions' => 'Sesiones',
|
||||
'DevDetail_Tab_Presence' => 'Historial',
|
||||
'DevDetail_Tab_Events' => 'Eventos',
|
||||
'DevDetail_MainInfo_Title' => 'Información principal',
|
||||
'DevDetail_MainInfo_mac' => 'MAC',
|
||||
'DevDetail_MainInfo_Name' => 'Nombre',
|
||||
'DevDetail_MainInfo_Owner' => 'Propietario',
|
||||
'DevDetail_MainInfo_Type' => 'Tipo',
|
||||
'DevDetail_MainInfo_Vendor' => 'Proveedor',
|
||||
'DevDetail_MainInfo_Favorite' => 'Favorito',
|
||||
'DevDetail_MainInfo_Group' => 'Grupo',
|
||||
'DevDetail_MainInfo_Location' => 'Ubicación',
|
||||
'DevDetail_MainInfo_Comments' => 'Comentario',
|
||||
'DevDetail_MainInfo_Network' => 'Hardware de Red (ID)',
|
||||
'DevDetail_MainInfo_Network_Port' => 'Puerto de Red HW',
|
||||
'DevDetail_SessionInfo_Title' => 'Información de sesión',
|
||||
'DevDetail_SessionInfo_Status' => 'Estado',
|
||||
'DevDetail_SessionInfo_FirstSession' => '1ra. sesión',
|
||||
'DevDetail_SessionInfo_LastSession' => 'Última sesión',
|
||||
'DevDetail_SessionInfo_LastIP' => 'Última IP',
|
||||
'DevDetail_SessionInfo_StaticIP' => 'IP estática',
|
||||
'DevDetail_EveandAl_Title' => 'Configuración de eventos y alertas',
|
||||
'DevDetail_EveandAl_ScanCycle' => 'Ciclo de escaneo',
|
||||
'DevDetail_EveandAl_AlertAllEvents' => 'Alerta a todos los eventos',
|
||||
'DevDetail_EveandAl_AlertDown' => 'Alerta de caída',
|
||||
'DevDetail_EveandAl_Skip' => 'Omitir notificaciones repetidas durante',
|
||||
'DevDetail_EveandAl_NewDevice' => 'Nuevo dispositivo',
|
||||
'DevDetail_EveandAl_Archived' => 'Archivada',
|
||||
'DevDetail_EveandAl_RandomMAC' => 'MAC al azar',
|
||||
'DevDetail_EveandAl_ScanCycle_a' => 'Escanear Dispositivo',
|
||||
'DevDetail_EveandAl_ScanCycle_z' => 'No Escanear Dispositivo',
|
||||
'DevDetail_button_Delete' => 'Eliminar dispositivo',
|
||||
'DevDetail_button_Reset' => 'Restablecer cambios',
|
||||
'DevDetail_button_Save' => 'Guardar',
|
||||
'DevDetail_SessionTable_Order' => 'Ordenar',
|
||||
'DevDetail_SessionTable_Connection' => 'Conexión',
|
||||
'DevDetail_SessionTable_Disconnection' => 'Desconexión',
|
||||
'DevDetail_SessionTable_Duration' => 'Duración',
|
||||
'DevDetail_SessionTable_IP' => 'Dirección IP',
|
||||
'DevDetail_SessionTable_Additionalinfo' => 'Información adicional',
|
||||
'DevDetail_Events_CheckBox' => 'Ocultar eventos de conexión',
|
||||
'DevDetail_Nmap_buttonFast' => 'Exploración rápida',
|
||||
'DevDetail_Nmap_buttonDefault' => 'Escaneado predeterminado',
|
||||
'DevDetail_Nmap_buttonDetail' => 'Escaneo detallado',
|
||||
'DevDetail_Nmap_buttonFast_text' => 'Escaneo rápido: escanee menos puertos (100) que el escaneo predeterminado (unos pocos segundos)',
|
||||
'DevDetail_Nmap_buttonDefault_text' => 'Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)',
|
||||
'DevDetail_Nmap_buttonDetail_text' => 'Escaneo detallado: escaneo predeterminado con detección de sistema operativo habilitado, detección de versiones, escaneo de script y traceroute (hasta 30 segundos o más)',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery' => 'Omitir detección de host',
|
||||
'DevDetail_Nmap_buttonSkipDiscovery_text' => 'Omitir detección de host (-Pn opción): Escaneo predeterminado sin detección de host',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page - Update by @TeroRERO 07ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Maintenance_Title' => 'Herramientas de mantenimiento',
|
||||
'Maintenance_database_path' => 'Ruta de la base de datos:',
|
||||
'Maintenance_database_size' => 'Tamaño de base de datos:',
|
||||
'Maintenance_database_lastmod' => 'Última modificación:',
|
||||
'Maintenance_database_backup' => 'Copias de seguridad de la BD:',
|
||||
'Maintenance_database_backup_found' => 'copia(s) de seguridad encontrada(s)',
|
||||
'Maintenance_database_backup_total' => 'Uso total de disco',
|
||||
'Maintenance_arp_status' => 'Estado de escaneo:',
|
||||
'Maintenance_arp_status_off' => 'está actualmente deshabilitado',
|
||||
'Maintenance_arp_status_on' => 'escaneo(s) actualmente en ejecución',
|
||||
'Maintenance_themeselector_lable' => 'Seleccionar Skin',
|
||||
'Maintenance_themeselector_empty' => 'Elija un Skin',
|
||||
'Maintenance_themeselector_text' => 'El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.',
|
||||
'Maintenance_themeselector_apply' => 'Aplicar',
|
||||
'Maintenance_lang_selector_lable' => 'Seleccione su idioma',
|
||||
'Maintenance_lang_selector_empty' => 'Elija un idioma',
|
||||
'Maintenance_lang_en_us' => 'English (US)',
|
||||
'Maintenance_lang_de_de' => 'German (DE)',
|
||||
'Maintenance_lang_es_es' => 'Spanish (ES)',
|
||||
'Maintenance_lang_selector_text' => 'El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.',
|
||||
'Maintenance_lang_selector_apply' => 'Aplicar',
|
||||
'Maintenance_Tools_Tab_Settings' => 'Ajustes',
|
||||
'Maintenance_Tools_Tab_Tools' => 'Tools',
|
||||
'Maintenance_Tools_Tab_BackupRestore' => 'Respaldo / Restaurar',
|
||||
'Maintenance_Tools_Tab_Logging' => 'Logs',
|
||||
'Maintenance_Tool_darkmode' => 'Cambiar Modo (Dark/Light)',
|
||||
'Maintenance_Tool_darkmode_text' => 'Alternar entre el modo oscuro y el modo de luz. Si el interruptor no funciona correctamente, intente borrar el caché del navegador. El cambio tiene lugar en el lado del servidor, por lo que afecta todos los dispositivos en uso.',
|
||||
'Maintenance_Tool_darkmode_noti' => 'Cambiar Modo',
|
||||
'Maintenance_Tool_darkmode_noti_text' => 'Después del cambio de tema, la página intenta volver a cargar para activar el cambio. Si es necesario, el caché debe ser eliminado.',
|
||||
'Maintenance_Tool_arpscansw' => 'Activar arp-scan (on/off)',
|
||||
'Maintenance_Tool_arpscansw_text' => 'Encender o desactivar el arp-scan. Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente. Los escaneos activos no se cancelan.',
|
||||
'Maintenance_Tool_arpscansw_noti' => 'Activar arp-scan on or off',
|
||||
'Maintenance_Tool_arpscansw_noti_text' => 'Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente.',
|
||||
'Maintenance_Tool_del_empty_macs' => 'Eliminar dispositivos con MACs vacíos',
|
||||
'Maintenance_Tool_del_empty_macs_text' => 'Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos sin Mac se eliminarán de la base de datos.',
|
||||
'Maintenance_Tool_del_empty_macs_noti' => 'Eliminar dispositivos',
|
||||
'Maintenance_Tool_del_empty_macs_noti_text' => '¿Estás seguro de que quieres eliminar todos los dispositivos con direcciones MAC vacías? <br> (tal vez prefiera archivarlo)',
|
||||
'Maintenance_Tool_upgrade_database_noti' => 'Actualizar la base de datos',
|
||||
'Maintenance_Tool_upgrade_database_text' => 'Este botón actualizará la base de datos para habilitar la actividad de la red en las últimas 12 horas. Haga una copia de seguridad de su base de datos en caso de problemas.',
|
||||
'Maintenance_Tool_upgrade_database_noti_text' => '¿Estás seguro de que quieres actualizar la base de datos? <br> (tal vez prefieras archivarla)',
|
||||
'Maintenance_Tool_del_alldev' => 'Eliminar todos los dispositivos',
|
||||
'Maintenance_Tool_del_alldev_text' => 'Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos se eliminarán de la base de datos.',
|
||||
'Maintenance_Tool_del_alldev_noti' => 'Eliminar dispositivos',
|
||||
'Maintenance_Tool_del_alldev_noti_text' => '¿Estás seguro de que quieres eliminar todos los dispositivos?',
|
||||
'Maintenance_Tool_del_unknowndev' => 'Eliminar dispositivos (desconocidos)',
|
||||
'Maintenance_Tool_del_unknowndev_text' => 'Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Todos los dispositivos nombrados (desconocidos) se eliminarán de la base de datos.',
|
||||
'Maintenance_Tool_del_unknowndev_noti' => 'Eliminar dispositivos (desconocidos)',
|
||||
'Maintenance_Tool_del_unknowndev_noti_text' => '¿Estás seguro de que quieres eliminar todos los dispositivos (desconocidos)?',
|
||||
'Maintenance_Tool_del_allevents' => 'Eliminar todo (Restablecer historial)',
|
||||
'Maintenance_Tool_del_allevents_text' => 'Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como "presentes", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.',
|
||||
'Maintenance_Tool_del_allevents_noti' => 'Eliminar eventos',
|
||||
'Maintenance_Tool_del_allevents_noti_text' => '¿Estás seguro de que quieres eliminar todos los eventos? Esto restablece la presencia de todos los dispositivos.',
|
||||
'Maintenance_Tool_del_allevents30' => 'Eliminar eventos antiguos (30 días)',
|
||||
'Maintenance_Tool_del_allevents30_text' => 'Antes de usar esta función, haga una copia de seguridad. La eliminación no se puede deshacer. Se eliminarán todos los eventos mayores a 30 días en la base de datos. En ese momento se restablecerá la presencia de todos los dispositivos. Esto puede conducir a sesiones no válidas. Esto significa que los dispositivos se muestran como "presentes", aunque están fuera de línea. Un escaneo mientras el dispositivo en cuestión está en línea resuelve el problema.',
|
||||
'Maintenance_Tool_del_allevents30_noti' => 'Eliminar eventos',
|
||||
'Maintenance_Tool_del_allevents30_noti_text' => '¿Está seguro de eliminar todos los eventos mayores a 30 días? Esto restablece la presencia de todos los dispositivos.',
|
||||
'Maintenance_Tool_backup' => 'Respaldar DB',
|
||||
'Maintenance_Tool_backup_text' => 'Las copias de seguridad de la base de datos se encuentran en el directorio de la base de datos como una Zip-Archive, nombrada con la fecha de creación. No hay un número máximo de copias de seguridad.',
|
||||
'Maintenance_Tool_backup_noti' => 'Respaldar DB',
|
||||
'Maintenance_Tool_backup_noti_text' => '¿Estás seguro de que quieres exactos la copia de seguridad de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.',
|
||||
'Maintenance_Tool_restore' => 'Restaurar DB',
|
||||
'Maintenance_Tool_restore_text' => 'La última copia de seguridad se puede restaurar a través del botón, pero las copias de seguridad anteriores solo se pueden restaurar manualmente. Después de la restauración, realice una verificación de integridad en la base de datos por seguridad, en caso de que el DB estuviera actualmente en acceso de escritura cuando se creó la copia de seguridad.',
|
||||
'Maintenance_Tool_restore_noti' => 'Restaurar DB',
|
||||
'Maintenance_Tool_restore_noti_text' => '¿Estás seguro de que quieres hacer exactos la restauración de DB? Asegúrese de que ningún escaneo se esté ejecutando actualmente.',
|
||||
'Maintenance_Tool_purgebackup' => 'Purgar Respaldos',
|
||||
'Maintenance_Tool_purgebackup_text' => 'Todas las copias de seguridad serán eliminadas, excepto las 3 últimas.',
|
||||
'Maintenance_Tool_purgebackup_noti' => 'Purgar Respaldos',
|
||||
'Maintenance_Tool_purgebackup_noti_text' => '¿Está seguro de borrar todas las copias de seguridad excepto las 3 últimas?',
|
||||
'Maintenance_Tool_del_ActHistory' => 'Eliminar la actividad de la red',
|
||||
'Maintenance_Tool_del_ActHistory_text' => 'El gráfico de actividad de la red se resetea. Esto no afecta a los eventos.',
|
||||
'Maintenance_Tool_del_ActHistory_noti' => 'Borrar la actividad de la red',
|
||||
'Maintenance_Tool_del_ActHistory_noti_text' => '¿Está seguro de restablecer la actividad de la red?',
|
||||
'Maintenance_Tool_ExportCSV' => 'Exportación CSV',
|
||||
'Maintenance_Tool_ExportCSV_text' => 'Generar un archivo CSV (valores separados por comas) que contenga la lista de dispositivos incluyendo las relaciones de red entre los nodos de red y los dispositivos conectados.',
|
||||
'Maintenance_Tool_ExportCSV_noti' => 'Exportación CSV',
|
||||
'Maintenance_Tool_ExportCSV_noti_text' => '¿Está seguro de que quiere generar un archivo CSV?',
|
||||
'Maintenance_Tool_ImportCSV' => 'Importación CSV',
|
||||
'Maintenance_Tool_ImportCSV_text' => 'Antes de usar esta función, haga una copia de seguridad. Importe un archivo CSV (valor separado por comas) que contiene la lista de dispositivos, incluidas las relaciones de red entre nodos de red y dispositivos conectados. Para hacer eso, coloque el archivo CSV llamado <b> devices.csv </b> en su carpeta <b>/config </b>.',
|
||||
'Maintenance_Tool_ImportCSV_noti' => 'Importación CSV',
|
||||
'Maintenance_Tool_ImportCSV_noti_text' => '¿Está seguro de que quiere importar el archivo CSV? Esto sobrescribirá completamente los dispositivos de su base de datos.',
|
||||
'Maintenance_Github_package_a' => 'La última versión de Pi.Alert (Fork leiweibau) se publicó en ',
|
||||
'Maintenance_Github_package_b' => '',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Maintenance Page - Update by @TeroRERO 25jul2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'BackDevices_Arpscan_disabled' => 'Arp-Scan Desactivado',
|
||||
'BackDevices_Arpscan_enabled' => 'Arp-Scan Activado',
|
||||
'BackDevices_darkmode_disabled' => 'Darkmode Desactivado',
|
||||
'BackDevices_darkmode_enabled' => 'Darkmode Activado',
|
||||
'BackDevices_Restore_CopError' => 'La base de datos original no se pudo guardar.',
|
||||
'BackDevices_Restore_okay' => 'Restauración ejecutado con éxito.',
|
||||
'BackDevices_Restore_Failed' => 'La restauración falló. Restaurar la copia de seguridad manualmente.',
|
||||
'BackDevices_Backup_CopError' => 'La base de datos original no se pudo guardar.',
|
||||
'BackDevices_Backup_okay' => 'La copia de seguridad ejecutada con éxito con el nuevo archivo',
|
||||
'BackDevices_Backup_Failed' => 'La copia de seguridad se ejecutó parcialmente con éxito. El archivo no se puede crear o está vacío.',
|
||||
'BackDevices_DBTools_DelDev_a' => 'Dispositivo eliminado con éxito',
|
||||
'BackDevices_DBTools_DelDev_b' => 'Dispositivos eliminados con éxito',
|
||||
'BackDevices_DBTools_DelEvents' => 'Eventos eliminados con éxito',
|
||||
'BackDevices_DBTools_DelEventsError' => 'Error de eliminación de eventos',
|
||||
'BackDevices_DBTools_DelDevError_a' => 'Error de eliminación del dispositivo',
|
||||
'BackDevices_DBTools_DelDevError_b' => 'Error de eliminación de dispositivos',
|
||||
'BackDevices_DBTools_UpdDev' => 'Dispositivo actualizado con éxito',
|
||||
'BackDevices_DBTools_UpdDevError' => 'Error al actualizar el dispositivo',
|
||||
'BackDevices_DBTools_Upgrade' => 'Base de datos actualizada correctamente',
|
||||
'BackDevices_DBTools_UpgradeError' => 'Falló la actualización de la base de datos',
|
||||
'BackDevices_DBTools_Purge' => 'Las copias de seguridad más antiguas fueron eliminadas',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Network Page - Update by @TeroRERO 01ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'Network_Title' => 'Descripción general de la red',
|
||||
'Network_ManageDevices' => 'Administrar dispositivos',
|
||||
'Network_ManageAdd' => 'Añadir dispositivo',
|
||||
'Network_ManageEdit' => 'Actualizar dispositivo',
|
||||
'Network_ManageDel' => 'Eliminar dispositivo',
|
||||
'Network_ManageAdd_Name' => 'Nombre del dispositivo',
|
||||
'Network_ManageAdd_Name_text' => 'Nombre sin caracteres especiales',
|
||||
'Network_ManageAdd_Type' => 'Tipo de dispositivo',
|
||||
'Network_ManageAdd_Type_text' => '-- Seleccionar tipo --',
|
||||
'Network_ManageAdd_Port' => 'Recuento de puertos',
|
||||
'Network_ManageAdd_Port_text' => 'dejar en blanco para WiFi y Powerline',
|
||||
'Network_ManageAdd_Submit' => 'Añadir dispositivo',
|
||||
'Network_ManageEdit_ID' => 'Dispositivo para actualizar',
|
||||
'Network_ManageEdit_ID_text' => '-- Seleccione el dispositivo para editar --',
|
||||
'Network_ManageEdit_Name' => 'Nuevo nombre del dispositivo',
|
||||
'Network_ManageEdit_Name_text' => 'Nombre sin caracteres especiales',
|
||||
'Network_ManageEdit_Type' => 'Nuevo tipo de dispositivo',
|
||||
'Network_ManageEdit_Type_text' => '-- Seleccione tipo --',
|
||||
'Network_ManageEdit_Port' => ' Nuevo recuento de puertos',
|
||||
'Network_ManageEdit_Port_text' => 'Dejar en blanco para WiFi y Powerline',
|
||||
'Network_ManageEdit_Submit' => 'Guardar los cambios',
|
||||
'Network_ManageDel_Name' => 'Dispositivo para eliminar',
|
||||
'Network_ManageDel_Name_text' => '-- Seleccione el dispositivo --',
|
||||
'Network_ManageDel_Submit' => 'Eliminar',
|
||||
'Network_Table_State' => 'Estado',
|
||||
'Network_Table_Hostname' => 'Nombre de host',
|
||||
'Network_Table_IP' => 'Dirección IP',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Help Page - Update by @TeroRERO 07ago2022
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'HelpFAQ_Title' => 'Ayuda / FAQ',
|
||||
'HelpFAQ_Cat_General' => 'General',
|
||||
'HelpFAQ_Cat_Detail' => 'Detalles',
|
||||
'HelpFAQ_Cat_General_100_head' => 'El reloj en la parte superior derecha y el tiempo de los eventos/presencia no son correctos (diferencia de tiempo).',
|
||||
'HelpFAQ_Cat_General_100_text_a' => 'En su PC, la siguiente zona horaria está configurada para el entorno PHP:',
|
||||
'HelpFAQ_Cat_General_100_text_b' => 'Si esta no es la zona horaria en la que se encuentra, debe cambiar la zona horaria en el archivo de configuración de PHP. Puedes encontrarlo en este directorio:',
|
||||
'HelpFAQ_Cat_General_100_text_c' => 'Busque en este archivo la entrada "date.timezone", elimine el ";" inicial si es necesario e introduzca la zona horaria deseada. Puede encontrar una lista con las zonas horarias compatibles aquí (<a href="https://www.php.net/manual/en/timezones.php" target="blank">Link</a>)',
|
||||
'HelpFAQ_Cat_General_101_head' => 'Mi red parece ralentizarse, el streaming se "congela".',
|
||||
'HelpFAQ_Cat_General_101_text' => 'Es muy posible que los dispositivos de baja potencia alcancen sus límites de rendimiento con la forma en que Pi.Alert detecta nuevos dispositivos en la red. Esto se amplifica aún más,
|
||||
si estos dispositivos se comunican con la red a través de WLAN. Las soluciones aquí serían cambiar a una conexión por cable si es posible o, si el dispositivo sólo se va a utilizar durante un período de tiempo limitado, utilizar el arp scan.
|
||||
pausar el arp scan en la página de mantenimiento.',
|
||||
'HelpFAQ_Cat_General_102_head' => 'Me aparece el mensaje de que la base de datos es de sólo de lectura.',
|
||||
'HelpFAQ_Cat_General_102_text' => 'Compruebe en el directorio Pi.Alert si la carpeta de la base de datos (db) tiene asignados los permisos correctos:<br>
|
||||
<span class="text-danger help_faq_code">drwxrwx--- 2 (nombre de usuario) www-data</span><br>
|
||||
Si el permiso no es correcto, puede establecerlo de nuevo con los siguientes comandos en la terminal o la consola:<br>
|
||||
<span class="text-danger help_faq_code">
|
||||
sudo chgrp -R www-data ~/pialert/db<br>
|
||||
chmod -R 770 ~/pialert/db
|
||||
</span><br>
|
||||
Si la base de datos sigue siendo de sólo lectura, intente reinstalar o restaurar una copia de seguridad de la base de datos desde la página de mantenimiento.',
|
||||
'HelpFAQ_Cat_General_102docker_head' => '(🐳 Docker only) Database issues (AJAX errors, read-only, not found)',
|
||||
'HelpFAQ_Cat_General_102docker_text' => 'Double-check you\'ve followed the <a href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos="49:4-52:146" dir="auto">
|
||||
<li data-sourcepos="49:4-49:106">Download the <a href="https://github.com/jokob-sk/Pi.Alert/blob/main/db/pialert.db">original DB from GitHub</a>.</li>
|
||||
<li data-sourcepos="50:4-50:195">Map the <code>pialert.db</code> file (<g-emoji class="g-emoji" alias="warning" fallback-src="https://github.githubassets.com/images/icons/emoji/unicode/26a0.png">⚠</g-emoji> not folder) from above to <code>/home/pi/pialert/db/pialert.db</code> (see <a href="https://github.com/jokob-sk/Pi.Alert/tree/main/dockerfiles#-examples">Examples</a> for details).</li>
|
||||
<li data-sourcepos="51:4-51:161">If facing issues (AJAX errors, can\'t write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/home/pi/pialert/front/log</code>.</li>
|
||||
<li data-sourcepos="52:4-52:146">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li>
|
||||
<li data-sourcepos="53:4-53:228">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec pialert chown -R www-data:www-data /home/pi/pialert/db/pialert.db</code>.</li>
|
||||
</ul>',
|
||||
'HelpFAQ_Cat_General_103_head' => 'La página de inicio de sesión no aparece, incluso después de cambiar la contraseña.',
|
||||
'HelpFAQ_Cat_General_103_text' => 'Además de la contraseña, el archivo de configuración debe contener <span class="text-danger help_faq_code">~/pialert/config/pialert.conf</span>
|
||||
además el parámetro <span class="text-danger help_faq_code">PIALERT_WEB_PROTECTION</span> debe ajustarse a <span class="text-danger help_faq_code">True</span>.',
|
||||
'HelpFAQ_Cat_Device_200_head' => 'Tengo dispositivos en mi lista que no conozco. Después de borrarlos, siempre vuelven a aparecer.',
|
||||
'HelpFAQ_Cat_Device_200_text' => 'Si utiliza Pi-hole, tenga en cuenta que Pi.Alert recupera información de Pi-hole. Ponga en pausa Pi.Alert, vaya a la página de configuración de Pi-hole y
|
||||
elimine la concesión DHCP si es necesario. Luego, también en Pi-hole, revise en Herramientas -> Red para ver si puede encontrar los hosts recurrentes allí.
|
||||
Si es así, elimínelos también allí. Ahora puede volver a iniciar Pi.Alert. Ahora el dispositivo(s) no debería aparecer más.',
|
||||
'HelpFAQ_Cat_Detail_300_head' => '¿Qué significa? ',
|
||||
'HelpFAQ_Cat_Detail_300_text_a' => 'significa un dispositivo de red creado a partir de la página de red.',
|
||||
'HelpFAQ_Cat_Detail_300_text_b' => 'designa el número de puerto en el que el dispositivo editado actualmente está conectado a este dispositivo de red.',
|
||||
'HelpFAQ_Cat_Detail_301_head_a' => '¿Cuándo está escaneando ahora? En ',
|
||||
'HelpFAQ_Cat_Detail_301_head_b' => ' dice 1min pero el gráfico muestra intervalos de 5min.',
|
||||
'HelpFAQ_Cat_Detail_301_text' => 'El intervalo de tiempo entre los escaneos está definido por el "Cronjob", que está configurado en 5 minutos de forma predeterminada. La designación "1min" se refiere a la duración esperada del escaneo.
|
||||
Dependiendo de la configuración de la red, este tiempo puede variar. Para editar el cronjob, puede utilizar el siguiente comando en la terminal/consola <span class="text-danger help_faq_code">crontab -e</span>
|
||||
y cambiar el intervalo.',
|
||||
'HelpFAQ_Cat_Detail_302_head_a' => '¿Qué significa? ',
|
||||
'HelpFAQ_Cat_Detail_302_head_b' => '¿y por qué no puedo seleccionarlo?',
|
||||
'HelpFAQ_Cat_Detail_302_text' => 'Algunos dispositivos modernos generan direcciones MAC aleatorias por razones de privacidad, que ya no pueden asociarse a ningún fabricante y que vuelven a cambiar con cada nueva conexión.
|
||||
Pi.Alert detecta si se trata de una dirección MAC aleatoria y activa este "campo" automáticamente. Para deshabilitar este comportamiento, debe buscar en su dispositivo cómo deshabilitar la
|
||||
aleatorización de direcciones MAC.',
|
||||
'HelpFAQ_Cat_Detail_303_head' => '¿Qué es Nmap y para qué sirve?',
|
||||
'HelpFAQ_Cat_Detail_303_text' => 'Nmap es un escáner de red con múltiples capacidades.<br>
|
||||
Cuando aparece un nuevo dispositivo en su lista, tiene la posibilidad de obtener información más detallada sobre el dispositivo a través del escaneo de Nmap.',
|
||||
'HelpFAQ_Cat_Presence_400_head' => 'Los dispositivos se muestran con un marcador amarillo y la nota "evento faltante".',
|
||||
'HelpFAQ_Cat_Presence_400_text' => 'Si esto sucede, tiene la opción de eliminar los eventos en el dispositivo en cuestión (vista de detalles). Otra posibilidad sería encender el dispositivo y esperar hasta que Pi.Alert detecte el dispositivo como "online" con el siguiente
|
||||
escaneo y luego simplemente apagar el dispositivo nuevamente. Ahora Pi.Alert debería anotar correctamente el estado del dispositivo en la base de datos con el próximo escaneo.',
|
||||
'HelpFAQ_Cat_Presence_401_head' => 'Un dispositivo se muestra como presente aunque esté "Offline".',
|
||||
'HelpFAQ_Cat_Presence_401_text' => 'Si esto sucede, tiene la posibilidad de eliminar los eventos del dispositivo en cuestión (vista de detalles). Otra posibilidad sería encender el dispositivo y esperar hasta que Pi.Alert reconozca el dispositivo como "online" con el siguiente escaneo
|
||||
y luego simplemente apagar el dispositivo nuevamente. Ahora Pi.Alert debería anotar correctamente el estado del dispositivo en la base de datos con el próximo escaneo.',
|
||||
'HelpFAQ_Cat_Network_600_head' => '¿Para qué sirve esta sección?',
|
||||
'HelpFAQ_Cat_Network_600_text' => 'Esta sección debería ofrecerle la posibilidad de mapear la asignación de sus dispositivos de red. Para ello, puede crear uno o más conmutadores, WLAN, enrutadores, etc., proporcionarles un número de puerto si es necesario y asignarles dispositivos
|
||||
ya detectados. Esta asignación se realiza en la vista detallada del dispositivo a asignar. Por lo tanto, es posible determinar rápidamente a qué puerto está conectado un host y si está en línea. Es posible asignar un dispositivo a múltiples
|
||||
puertos (agrupación de puertos), así como múltiples dispositivos a un puerto (máquinas virtuales).',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Settings (based on work of https://github.com/mariorodriguezlopez/Pi.Alert/)
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
'API_settings_group' => '<i class="fa fa-arrow-down-up-across-line"></i> API',
|
||||
|
||||
// General
|
||||
|
||||
'DAYS_TO_KEEP_EVENTS_description' => 'Esta es una configuración de mantenimiento. Esto especifica el número de días de entradas de eventos que se guardarán. Todos los eventos anteriores se eliminarán periódicamente.',
|
||||
'DAYS_TO_KEEP_EVENTS_name' => 'Eliminar eventos anteriores a',
|
||||
'PIALERT_WEB_PASSWORD_description' => 'La contraseña predeterminada es <code>123456</code>. Para cambiar la contraseña, ejecute <code>/home/pi/pialert/back/pialert-cli</code> en el contenedor',
|
||||
'PIALERT_WEB_PASSWORD_name' => 'Contraseña de inicio de sesión',
|
||||
'PIALERT_WEB_PROTECTION_description' => 'Cuando está habilitado, se muestra un cuadro de diálogo de inicio de sesión. Lea detenidamente a continuación si se le bloquea el acceso a su instancia.',
|
||||
'PIALERT_WEB_PROTECTION_name' => 'Habilitar inicio de sesión',
|
||||
'REPORT_DASHBOARD_URL_description' => 'Esta URL se utiliza como base para generar enlaces en los correos electrónicos. Ingrese la URL completa que comienza con <code>http://</code>, incluido el número de puerto (sin barra inclinada al final <code>/</code>).',
|
||||
'REPORT_DASHBOARD_URL_name' => 'Pi.Alert URL',
|
||||
'REPORT_FROM_description' => 'Asunto del correo electrónico de notificación.',
|
||||
'REPORT_FROM_name' => 'Asunto del email',
|
||||
'REPORT_MAIL_description' => 'Si está habilitado, se envía un correo electrónico con una lista de cambios a los que se ha suscrito. Complete también todas las configuraciones restantes relacionadas con la configuración de SMTP a continuación',
|
||||
'REPORT_MAIL_name' => 'Habilitar email',
|
||||
'REPORT_TO_description' => 'Dirección de correo electrónico a la que se enviará la notificación.',
|
||||
'REPORT_TO_name' => 'Enviar el email a',
|
||||
'SCAN_CYCLE_MINUTES_description' => 'El retraso entre escaneos. Si usa arp-scan, el tiempo de escaneo en sí depende de la cantidad de direcciones IP para verificar. Esto está influenciado por la máscara de red configurada en la configuración <a href="#SCAN_SUBNETS"><code>SCAN_SUBNETS</code></a> en la parte superior. Cada IP toma un par de segundos para escanear.',
|
||||
'SCAN_CYCLE_MINUTES_name' => 'Retraso del ciclo de escaneo',
|
||||
'SCAN_SUBNETS_description' => 'El tiempo de escaneo arp en sí depende de la cantidad de direcciones IP para verificar.
|
||||
El número de direcciones IP para comprobar depende de la <a target="_blank" href="https://www.calculator.net/ip-subnet-calculator.html">máscara de red</a> que establezca aquí.
|
||||
Por ejemplo, una máscara <code>/24</code> da como resultado 256 IP para verificar, mientras que <code>/16</code>
|
||||
controles de máscara alrededor de 65,536. Cada IP toma un par de segundos. Esto significa que con una configuración incorrecta
|
||||
el arp-scan tardará horas en completarse en lugar de segundos.
|
||||
<ol>
|
||||
<li>Especifique la máscara de red. Por ejemplo, el filtro <code>192.168.1.0/24</code> cubre los rangos de IP 192.168.1.0 a 192.168.1.255.</li>
|
||||
<li>Ejecute <code>ifconfig</code> en su contenedor para encontrar los nombres de su interfaz (por ejemplo: <code>eth0</code>, <code>eth1</code>)</li>
|
||||
</ol>
|
||||
',
|
||||
'SCAN_SUBNETS_name' => 'Subredes para escanear',
|
||||
'TIMEZONE_description' => 'Zona horaria para mostrar las estadísticas correctamente. Encuentra tu zona horaria<a target="_blank" href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones" rel="nofollow">aquí</a>.',
|
||||
'TIMEZONE_name' => 'Zona horaria',
|
||||
'UI_LANG_description' => 'Seleccione el idioma de interfaz de usuario preferido.',
|
||||
'UI_LANG_name' => 'Idioma de interfaz',
|
||||
|
||||
// Email
|
||||
|
||||
'SMTP_FORCE_SSL_description' => 'Forzar SSL al conectarse a su servidor SMTP',
|
||||
'SMTP_FORCE_SSL_name' => 'Forzar SSL',
|
||||
'SMTP_PASS_description' => 'La contraseña del servidor SMTP.',
|
||||
'SMTP_PASS_name' => 'SMTP password',
|
||||
'SMTP_PORT_description' => 'Número de puerto utilizado para la conexión SMTP. Establézcalo en <code>0</code> si no desea utilizar un puerto al conectarse al servidor SMTP.',
|
||||
'SMTP_PORT_name' => 'SMTP server PORT',
|
||||
'SMTP_SERVER_description' => 'La URL del host del servidor SMTP. Por ejemplo, <code>smtp-relay.sendinblue.com</code>. Para utilizar Gmail como servidor SMTP <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP_GMAIL.md">siga esta guía</a >',
|
||||
'SMTP_SERVER_name' => 'SMTP server URL',
|
||||
'SMTP_SKIP_LOGIN_description' => 'No utilice la autenticación cuando se conecte al servidor SMTP.',
|
||||
'SMTP_SKIP_LOGIN_name' => 'Omitir autenticación',
|
||||
'SMTP_SKIP_TLS_description' => 'Deshabilite TLS cuando se conecte a su servidor SMTP.',
|
||||
'SMTP_SKIP_TLS_name' => 'No usar TLS',
|
||||
'SMTP_USER_description' => 'El nombre de usuario utilizado para iniciar sesión en el servidor SMTP (a veces, una dirección de correo electrónico completa).',
|
||||
'SMTP_USER_name' => 'SMTP user',
|
||||
|
||||
//API
|
||||
|
||||
'API_CUSTOM_SQL_description' => 'Puede especificar una consulta SQL personalizada que generará un archivo JSON y luego lo expondrá a través del <a href="/api/table_custom_endpoint.json" target="_blank">archivo <code>table_custom_endpoint.json</code ></a>.',
|
||||
'API_CUSTOM_SQL_name' => 'Endpoint personalizado',
|
||||
|
||||
|
||||
// Apprise
|
||||
|
||||
'APPRISE_HOST_description' => 'Apprise host URL que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)',
|
||||
'APPRISE_HOST_name' => 'Apprise host URL',
|
||||
'APPRISE_PAYLOAD_description' => 'Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electrónicos, <code>text</code> con aplicaciones de chat, como Telegram.',
|
||||
'APPRISE_PAYLOAD_name' => 'Tipo de carga',
|
||||
'APPRISE_URL_description' => 'Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería <code>tgram://{bot_token}/{chat_id}</code>.',
|
||||
'APPRISE_URL_name' => 'URL de notificación de Apprise',
|
||||
|
||||
// Pushsafer
|
||||
'REPORT_PUSHSAFER_description' => 'Habilitar el envío de notificaciones a través de <a target="_blank" href="https://www.pushsafer.com/">Pushsafer</a>.',
|
||||
'REPORT_PUSHSAFER_name' => 'Habilitar Pushsafer',
|
||||
|
||||
|
||||
//DYNDNS
|
||||
|
||||
|
||||
'DDNS_ACTIVE_name' => 'Habilitar DynDNS',
|
||||
'DDNS_DOMAIN_name' => 'URL del dominio DynDNS',
|
||||
'DDNS_PASSWORD_name' => 'DynDNS password',
|
||||
'DDNS_UPDATE_URL_description' => 'Actualice la URL que comienza con <code>http://</code> o <code>https://</code>.',
|
||||
'DDNS_UPDATE_URL_name' => 'DynDNS update URL',
|
||||
'DDNS_USER_name' => 'DynDNS user',
|
||||
'DHCP_ACTIVE_description' => 'Debe asignar <code>:/etc/pihole/dhcp.leases</code> en el archivo <code>docker-compose.yml</code> si habilita esta configuración.',
|
||||
'DHCP_ACTIVE_name' => 'Habilitar PiHole DHCP',
|
||||
'DIG_GET_IP_ARG_description' => 'Cambie los argumentos de la <a href="https://linux.die.net/man/1/dig" target="_blank">utilidad de dig</a> si tiene problemas para resolver su IP de Internet. Los argumentos se agregan al final del siguiente comando: <code>dig +short </code>.',
|
||||
'DIG_GET_IP_ARG_name' => 'Descubrir de IP de Internet',
|
||||
|
||||
// MQTT
|
||||
'REPORT_MQTT_description' => 'Habilitar el envío de notificaciones a través de <a target="_blank" href="https://www.home-assistant.io/integrations/mqtt/">MQTT</a> a su Home Assistance.',
|
||||
'REPORT_MQTT_name' => 'Habilitar MQTT',
|
||||
'MQTT_BROKER_description' => 'URL del host MQTT (no incluya <code>http://</code> o <code>https://</code>).',
|
||||
'MQTT_BROKER_name' => 'MQTT broker URL',
|
||||
'MQTT_DELAY_SEC_description' => 'Un pequeño truco: retrase la adición a la cola en caso de que el proceso se reinicie y los procesos de publicación anteriores se anulen (se necesitan ~<code>2</code>s para actualizar la configuración de un sensor en el intermediario). Probado con <code>2</code>-<code>3</code> segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificación). No afecta los escaneos o notificaciones posteriores.',
|
||||
'MQTT_DELAY_SEC_name' => 'Retraso de MQTT por dispositivo',
|
||||
'MQTT_PASSWORD_description' => 'Contraseña utilizada para iniciar sesión en su instancia de agente de MQTT.',
|
||||
'MQTT_PASSWORD_name' => 'MQTT password',
|
||||
'MQTT_PORT_description' => 'Puerto donde escucha el broker MQTT. Normalmente <code>1883</code>.',
|
||||
'MQTT_PORT_name' => 'MQTT broker puerto',
|
||||
'MQTT_QOS_description' => 'Configuración de calidad de servicio para el envío de mensajes MQTT. <code>0</code>: baja calidad a <code>2</code>: alta calidad. Cuanto mayor sea la calidad, mayor será el retraso.',
|
||||
'MQTT_QOS_name' => 'Calidad de servicio MQTT',
|
||||
'MQTT_USER_description' => 'Nombre de usuario utilizado para iniciar sesión en su instancia de agente de MQTT.',
|
||||
'MQTT_USER_name' => 'MQTT user',
|
||||
'MQTT_settings_group' => '<i class="fa fa-square-rss"></i> MQTT',
|
||||
|
||||
// NMAP
|
||||
|
||||
'NMAP_ACTIVE_description' => 'Si está habilitado, ejecutará un escaneo en un dispositivo recién encontrado. Para un análisis programado o único, verifique la configuración de <a href="#NMAP_RUN"><code>NMAP_RUN</code></a>.',
|
||||
'NMAP_ACTIVE_name' => 'Ejecución del ciclo',
|
||||
'NMAP_ARGS_description' => 'Argumentos utilizados para ejecutar el análisis de Nmap. Tenga cuidado de especificar <a href="https://linux.die.net/man/1/nmap" target="_blank">los argumentos</a> correctamente. Por ejemplo, <code>-p -10000</code> escanea los puertos del 1 al 10000.',
|
||||
'NMAP_ARGS_name' => 'Argumentos',
|
||||
'NMAP_RUN_SCHD_description' => 'Solo está habilitado si selecciona <code>programar</code> en la configuración de <a href="#NMAP_RUN"><code>NMAP_RUN</code></a>. Asegúrese de ingresar el cronograma en el formato tipo cron correcto.',
|
||||
'NMAP_RUN_SCHD_name' => 'Programar',
|
||||
'NMAP_RUN_description' => 'Habilite un escaneo regular de Nmap en su red en todos los dispositivos. Los ajustes de programación se pueden encontrar a continuación. Si selecciona <code>una vez</code>, Nmap se ejecuta solo una vez al inicio durante el tiempo especificado en la configuración de <a href="#NMAP_TIMEOUT"><code>NMAP_TIMEOUT</code></a>.',
|
||||
'NMAP_RUN_name' => 'Ejecución programada',
|
||||
'NMAP_TIMEOUT_description' => 'Tiempo máximo en segundos para esperar a que finalice un escaneo de Nmap en cualquier dispositivo.',
|
||||
|
||||
// NTFY
|
||||
'REPORT_NTFY_description' => 'Habilitar el envío de notificaciones a través de <a target="_blank" href="https://ntfy.sh/">NTFY</a>.',
|
||||
'REPORT_NTFY_name' => 'Habilitar NTFY',
|
||||
'NTFY_HOST_description' => 'URL de host NTFY que comienza con <code>http://</code> o <code>https://</code>. Puede usar la instancia alojada en <a target="_blank" href="https://ntfy.sh/">https://ntfy.sh</a> simplemente ingresando <code>https://ntfy. sh</código>.',
|
||||
'NTFY_HOST_name' => 'NTFY host URL',
|
||||
'NTFY_PASSWORD_description' => 'Ingrese la contraseña si necesita (host) una instancia con autenticación habilitada.',
|
||||
'NTFY_PASSWORD_name' => 'NTFY password',
|
||||
'NTFY_TOPIC_name' => 'NTFY topic',
|
||||
'NTFY_USER_description' => 'Ingrese usuario si necesita (alojar) una instancia con autenticación habilitada.',
|
||||
'NTFY_USER_name' => 'NTFY user',
|
||||
'NTFY_settings_group' => '<i class="fa fa-terminal"></i> NTFY',
|
||||
|
||||
// Pholus
|
||||
|
||||
'Pholus_settings_group' => '<i class="fa fa-search"></i> Pholus',
|
||||
'PHOLUS_ACTIVE_description' => '<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/pholus" target="_blank" >Pholus</a> es una herramienta de rastreo para descubrir información adicional sobre los dispositivos en la red, incluido el nombre del dispositivo. Si está habilitado, ejecutará el escaneo antes de cada ciclo de escaneo de red hasta que no haya dispositivos <code>(unknown)</code> o <code>(name not found)</code>. Tenga en cuenta que puede enviar spam a la red con tráfico innecesario. Depende de la configuración de <a onclick="toggleAllSettings()" href="#SCAN_SUBNETS"><code>SCAN_SUBNETS</code></a>. Para un análisis programado o único, verifique la configuración de <a href="#PHOLUS_RUN"><code>PHOLUS_RUN</code></a>.',
|
||||
'PHOLUS_ACTIVE_name' => 'Ejecución del ciclo',
|
||||
'PHOLUS_DAYS_DATA_description' => 'Cuántos días de entradas de escaneo de Pholus deben conservarse (globalmente, ¡no específico del dispositivo!). El archivo <a href="/maintenance.php#tab_Logging">pialert_pholus.log</a> no se modifica. Introduzca <code>0</code> para desactivar.',
|
||||
'PHOLUS_DAYS_DATA_name' => 'Retención de datos',
|
||||
'PHOLUS_FORCE_description' => 'Fuerce el escaneo de cada escaneo de red, incluso si no hay dispositivos <code>(unknown)</code> o <code>(name not found)</code>. Tenga cuidado al habilitar esto, ya que la detección puede inundar fácilmente su red.',
|
||||
'PHOLUS_FORCE_name' => 'Escaneo de fuerza de ciclo',
|
||||
'PHOLUS_RUN_SCHD_description' => 'Solo está habilitado si selecciona <code>programar</code> en la configuración de <a href="#PHOLUS_RUN"><code>PHOLUS_RUN</code></a>. Asegúrese de ingresar el horario en el formato similar a cron correcto
|
||||
(por ejemplo, validar en <a href="https://crontab.guru/" target="_blank">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutará el escaneo después de las 4 am en el <a onclick="toggleAllSettings()" href="#TIMEZONE"><code>TIMEZONE</code> que configuró arriba</a>. Se ejecutará la PRÓXIMA vez que pase el tiempo.',
|
||||
'PHOLUS_RUN_SCHD_name' => 'Programar',
|
||||
'PHOLUS_RUN_TIMEOUT_description' => 'El tiempo de espera en segundos para el escaneo Pholus programado. Se aplican las mismas notas con respecto a la duración que en la configuración de <a href="#PHOLUS_TIMEOUT"><code>PHOLUS_TIMEOUT</code></a>. Un escaneo programado no verifica si hay dispositivos <code>(unknown)</code> o <code>(name not found)</code>, el escaneo se ejecuta de cualquier manera.',
|
||||
'PHOLUS_RUN_TIMEOUT_name' => 'Tiempo de espera de ejecución programado',
|
||||
'PHOLUS_RUN_description' => 'Habilite un escaneo regular de Pholus en su red. Los ajustes de programación se pueden encontrar a continuación. Si selecciona <code>una vez</code>, Pholus se ejecuta solo una vez al inicio durante el tiempo especificado en la configuración de <a href="#PHOLUS_RUN_TIMEOUT"><code>PHOLUS_RUN_TIMEOUT</code></a>.',
|
||||
'PHOLUS_RUN_name' => 'Ejecución programada',
|
||||
'PHOLUS_TIMEOUT_description' => '¿Cuánto tiempo en segundos debe rastrear Pholus en cada interfaz si se cumple la condición anterior? Cuanto más tiempo lo deje encendido, es más probable que los dispositivos transmitan más información. Este tiempo de espera se suma al tiempo que lleva realizar un escaneo arp en su red.',
|
||||
'PHOLUS_TIMEOUT_name' => 'Tiempo de espera de ciclo',
|
||||
|
||||
// PiHole
|
||||
|
||||
'PiHole_settings_group' => '<i class="fa fa-seedling"></i> PiHole',
|
||||
'PIHOLE_ACTIVE_description' => 'Debe mapear <code>:/etc/pihole/pihole-FTL.db</code> en el archivo <code>docker-compose.yml</code> si habilita esta configuración.',
|
||||
'PIHOLE_ACTIVE_name' => 'Habilitar el mapeo de PiHole',
|
||||
'PRINT_LOG_description' => 'Esta configuración habilitará un registro más detallado. Útil para depurar eventos que se escriben en la base de datos.',
|
||||
'PRINT_LOG_name' => 'Imprimir registro adicional',
|
||||
'PUSHSAFER_TOKEN_description' => 'Su clave secreta de la API de Pushsafer (token).',
|
||||
'PUSHSAFER_TOKEN_name' => 'Pushsafer token',
|
||||
'PUSHSAFER_settings_group' => '<i class="fa fa-bell"></i> Pushsafer',
|
||||
|
||||
//Apprise
|
||||
|
||||
'REPORT_APPRISE_description' => 'Habilitar el envío de notificaciones a través de <a target="_blank" href="https://hub.docker.com/r/caronc/apprise">Apprise</a>.',
|
||||
'REPORT_APPRISE_name' => 'Habilitar Apprise',
|
||||
|
||||
// Webhooks
|
||||
'REPORT_WEBHOOK_description' => 'Habilite webhooks para notificaciones. Los webhooks lo ayudan a conectarse a muchas herramientas de terceros, como IFTTT, Zapier o <a href="https://n8n.io/" target="_blank">n8n</a>, por nombrar algunas. Consulte esta sencilla <a href="https://github.com/jokob-sk/Pi.Alert/blob/main/docs/WEBHOOK_N8N.md" target="_blank">guía de n8n aquí</a> para obtener comenzó. Si está habilitado, configure los ajustes relacionados a continuación.',
|
||||
'REPORT_WEBHOOK_name' => 'Habilitar webhooks',
|
||||
'WEBHOOK_PAYLOAD_description' => 'El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target="_blank" href="https://github.com/jokob-sk/Pi.Alert/blob/main/back/webhook_json_sample.json">aquí</a>. (por ejemplo: para discord use <code>html</code>)',
|
||||
'WEBHOOK_PAYLOAD_name' => 'Tipo de carga',
|
||||
'WEBHOOK_REQUEST_METHOD_description' => 'El método de solicitud HTTP que se utilizará para la llamada de webhook.',
|
||||
'WEBHOOK_REQUEST_METHOD_name' => 'Método de solicitud',
|
||||
'WEBHOOK_URL_description' => 'URL de destino comienza con <code>http://</code> o <code>https://</code>.',
|
||||
'WEBHOOK_URL_name' => 'URL de destino',
|
||||
'Webhooks_settings_group' => '<i class="fa fa-circle-nodes"></i> Webhooks',
|
||||
|
||||
// Other
|
||||
|
||||
'general_event_description' => 'El evento que ha activado puede tardar un tiempo hasta que finalicen los procesos en segundo plano. La ejecución terminó una vez que vea <code>finished</code> a continuación. Consulte el <a onclick=\'setCache("activeMaintenanceTab", "tab_Logging_id")\' href="/maintenance.php#tab_Logging">registro de errores</a> si no obtuvo el resultado esperado. <br/> <br/> Estado:',
|
||||
'general_event_title' => 'Ejecución de un evento ad-hoc',
|
||||
'run_event_icon' => 'fa-play',
|
||||
'run_event_tooltip' => 'Habilite la configuración y guarde sus cambios al principio antes de ejecutarlo.',
|
||||
'settings_expand_all' => 'Expandir todo',
|
||||
'settings_imported' => 'La última vez que se importó la configuración desde el archivo pialert.conf:',
|
||||
'settings_missing' => 'No se han cargado todos los ajustes, actualice la página. Esto probablemente se deba a una gran carga en la base de datos.',
|
||||
'settings_missing_block' => 'No puede guardar su configuración sin especificar todas las claves de configuración. Recarga la página. Esto probablemente se deba a una gran carga en la base de datos.',
|
||||
'settings_old' => 'La configuración en la base de datos (que se muestra en esta página) está desactualizada. Esto probablemente se deba a un análisis en ejecución. La configuración se guardó en el archivo <code>pialert.conf</code>, pero el proceso en segundo plano aún no tuvo tiempo de importarlo a la base de datos. Puede esperar hasta que la configuración se actualice para no sobrescribir sus valores anteriores. Siéntase libre de guardar su configuración de cualquier manera si no le importa perder la configuración entre la última vez que guardó y ahora. También se crean archivos de respaldo si necesita comparar su configuración más adelante.',
|
||||
'test_event_icon' => 'fa-vial-circle-check',
|
||||
'test_event_tooltip' => 'Guarde sus cambios antes de probar su configuración.',
|
||||
|
||||
);
|
||||
?>
|
||||
@@ -18,54 +18,88 @@ switch($result){
|
||||
|
||||
if (isset($pia_lang_selected) == FALSE or (strlen($pia_lang_selected) == 0)) {$pia_lang_selected = $defaultLang;}
|
||||
|
||||
//Language_Strings ("Language_Code", "String_Key", "String_Value", "Extra")
|
||||
$result = $db->query("SELECT * FROM Plugins_Language_Strings");
|
||||
require dirname(__FILE__).'/../skinUI.php';
|
||||
|
||||
// array
|
||||
$result = $db->query("SELECT * FROM Plugins_Language_Strings");
|
||||
$strings = array();
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
// Push row data
|
||||
$strings[] = array( 'Language_Code' => $row['Language_Code'],
|
||||
'String_Key' => $row['String_Key'],
|
||||
'String_Value' => $row['String_Value'],
|
||||
'Extra' => $row['Extra']
|
||||
);
|
||||
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
||||
$strings[$row['String_Key']] = $row['String_Value'];
|
||||
}
|
||||
|
||||
require dirname(__FILE__).'/../skinUI.php';
|
||||
require dirname(__FILE__).'/en_us.php';
|
||||
require dirname(__FILE__).'/de_de.php';
|
||||
require dirname(__FILE__).'/es_es.php';
|
||||
|
||||
function getLanguageDataFromJson()
|
||||
{
|
||||
global $allLanguages;
|
||||
|
||||
// Default language
|
||||
$defaultLanguage = 'en_us';
|
||||
|
||||
// Array to hold the language data from the JSON files
|
||||
$languageData = [];
|
||||
|
||||
foreach ($allLanguages as $language) {
|
||||
// Load and parse the JSON data from .json files
|
||||
$jsonFilePath = dirname(__FILE__) . '/' . $language . '.json';
|
||||
|
||||
if (file_exists($jsonFilePath)) {
|
||||
$data = json_decode(file_get_contents($jsonFilePath), true);
|
||||
|
||||
// Use the default language if the key is not found
|
||||
$languageData[$language] = $data[$language] ?? $data[$defaultLanguage] ?? [];
|
||||
} else {
|
||||
// Handle the case where the JSON file doesn't exist
|
||||
// For example, you might want to log an error message
|
||||
echo 'File not found: '.$jsonFilePath;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return $languageData;
|
||||
}
|
||||
|
||||
|
||||
// Merge the JSON data with the SQL data, giving priority to SQL data for overlapping keys
|
||||
function mergeLanguageData($jsonLanguageData, $sqlLanguageData)
|
||||
{
|
||||
// Loop through the JSON language data and check for overlapping keys
|
||||
foreach ($jsonLanguageData as $languageCode => $languageStrings) {
|
||||
foreach ($languageStrings as $key => $value) {
|
||||
// Check if the key exists in the SQL data, if yes, use the SQL value
|
||||
if (isset($sqlLanguageData[$key])) {
|
||||
$jsonLanguageData[$languageCode][$key] = $sqlLanguageData[$key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $jsonLanguageData;
|
||||
}
|
||||
|
||||
function lang($key)
|
||||
{
|
||||
global $pia_lang_selected, $lang, $defaultLang, $strings;
|
||||
global $pia_lang_selected, $lang, $defaultLang, $strings, $db;
|
||||
// Get the data from JSON files
|
||||
$languageData = getLanguageDataFromJson();
|
||||
|
||||
// get strings from the DB and append them to the ones from the files
|
||||
foreach ($strings as $string)
|
||||
{
|
||||
$lang[$string["Language_Code"]][$string["String_Key"]] = $string["String_Value"];
|
||||
// Get the data from SQL query
|
||||
$sqlLanguageData = $strings;
|
||||
|
||||
// Merge JSON data with SQL data
|
||||
$mergedLanguageData = mergeLanguageData($languageData, $sqlLanguageData);
|
||||
|
||||
// Check if the key exists in the selected language
|
||||
if (isset($mergedLanguageData[$pia_lang_selected][$key])) {
|
||||
$result = $mergedLanguageData[$pia_lang_selected][$key];
|
||||
} else {
|
||||
// If key not found in selected language, use "en_us" as fallback
|
||||
if (isset($mergedLanguageData['en_us'][$key])) {
|
||||
$result = $mergedLanguageData['en_us'][$key];
|
||||
} else {
|
||||
// If key not found in "en_us" either, use a default string
|
||||
$result = "String Not found for key " . $key;
|
||||
}
|
||||
}
|
||||
|
||||
// check if key exists in selected language
|
||||
if(array_key_exists($key, $lang[$pia_lang_selected]) == FALSE)
|
||||
{
|
||||
// check if key exists in the default language if not available in the selected
|
||||
if (array_key_exists($key, $lang[$defaultLang]) == TRUE)
|
||||
{
|
||||
// if found, use default language
|
||||
$temp = $lang[$defaultLang][$key];
|
||||
|
||||
} else
|
||||
{
|
||||
// String not found in the default or selected language
|
||||
$temp = "String not found for key: ".$key;
|
||||
}
|
||||
} else
|
||||
{
|
||||
// use selected language translation
|
||||
$temp = $lang[$pia_lang_selected][$key];
|
||||
}
|
||||
|
||||
return $temp;
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
|
||||