1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4

Получение ip сервера

03.03.2016, 10:07. Показов 14614. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, всем день добрый!

Возникла задача - получить все IP адреса сервера Domino агентом.
Можно ли это сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2016, 10:07
Ответы с готовыми решениями:

Получение пинга с сервера
Какая функция для получения пинга с сервера?

Получение JSON с сервера
Есть класс который принимает строку URL и возвращает JSONObject public class Json { public static JSONObject getJson(String...

Получение текста с сервера
Здраствуйте, как получить текст с сервера? Например, файл расположен по пути test.com/test.txt. Мне требуется получить с него текст и...

47
0 / 0 / 0
Регистрация: 18.08.2008
Сообщений: 1,698
03.03.2016, 10:44
можно.
Есть несколько методов. зависит от контекста
0
1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4
03.03.2016, 11:01
Цитата Сообщение от NickProstoNick
можно.
Есть несколько методов. зависит от контекста
Суть такова: есть один "главный" сервер. Он запуском агента "стучится" до других серверов - получает от них разную инфу. И среди этой инфы нужны IP адреса.
0
0 / 0 / 0
Регистрация: 18.08.2008
Сообщений: 1,698
03.03.2016, 11:14
каким образом "стучится"?
0
1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4
03.03.2016, 11:33
Цитата Сообщение от NickProstoNick
каким образом "стучится"?
По разному. Есть проверка открытия основной БД для работы пользователей, есть запрос в консоль "удаленного" сервера (получаю диски, CPU, RAM). Получаю также список programs из АК.
0
0 / 0 / 0
Регистрация: 18.08.2008
Сообщений: 1,698
03.03.2016, 11:44
самый простой способ - подключить JAVA при условии, что известен хост.
Хост можно найти в names.nsf

Код (Java):

import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIP {
public static void main(String[/URL][] args) {
InetAddress[/URL] address = null;
try {
address = InetAddress[/URL].getByName("www.java2s.com");
} catch (UnknownHostException[/URL] e) {
System[/URL].exit(2);
}
System[/URL].out.println(address.getHostName() + "="
+ address.getHostAddress());
System[/URL].exit(0);
}
}
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 11:54
выкладывал здесь куски сканера сети (многопоточный), кот. менеее че за секунду просканит сеть (и не одну)
ставил ограничение маски (иначе, в линухах, все сокеты выжрет)
единственный момент - я писал для 8-ой java
придется переделывать со стримов на циклы
но в принципе - там все необязательно и есть ссылки на оригиналы идей
возможности: определение доступных интерфейсов (сетевых IPV4), определение на них подсетей (по маске), сканирование этих подсетей по нужному порту (у сервера будет 1352), ограничение маски, выдача откликнувшихся хостов
0
1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4
03.03.2016, 11:55
Цитата Сообщение от NickProstoNick
самый простой способ - подключить JAVA при условии, что известен хост.
Хост можно найти в names.nsf
А есть посложнее ? Я в java не очень. Вернее совсем не очень.
Может все-таки LS или win API как-то использовать?
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 12:01
Цитата Сообщение от Max
Может все-таки LS или win API как-то использовать?
не надо так делать!
учите java
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 12:07
вот полный код определения интерфейсов

Код (Java):
package kodiForm;

import org.apache.commons.net.util.SubnetUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.net.*;
import java.util.*;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import static java.lang.System[/URL].out;

/**
* Created by mike on 29.10.15.
*/
class NetUtils {
private static int TIMEOUT = 500;
private static short MASQ_LIIM = 20;//limit prefix masq len for restrict lage network scan
private static final String[/URL] resPath = "./res";
private static final Logger LOG = LoggerFactory.getLogger(new Throwable[/URL]().getStackTrace()[0].getClassName());

private static Predicate<NetworkInterface> notLoopback = iface -> {
boolean ret = false;
try {
ret = !iface.isLoopback();
} catch (SocketException[/URL] e) {
e.printStackTrace();
}
return ret;
};
private static final Predicate<NetworkInterface> notFake = iface -> {
boolean ret = false;
try {
ret = !iface.isLoopback() & !iface.isPointToPoint()
& (Collections[/URL].list(iface.getInetAddresses()).size() > 0)
& !iface.isVirtual();
} catch (SocketException[/URL] e) {
e.printStackTrace();
}
return ret;
};
private static final Predicate<InterfaceAddress> masq = addr -> {
boolean ret = false;
ret = addr.getNetworkPrefixLength() >= MASQ_LIIM;
return ret;
};
private static final Predicate<InterfaceAddress> ipv4 = addr -> {
LOG.info("filter IPV4 for:" + addr.getAddress().getHostAddress());
return addr.getAddress() instanceof Inet4Address;
};

//http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html
//http://stackoverflow.com/questions/2942299/converting-cidr-address-to-subnet-mask-and-network-address

/**
* @param address tested address
* @param subnet CIDR notation "192.168.0.1/16"
* @return true if included
*/
private static boolean checkIpBySubNet(String[/URL] address, String[/URL] subnet) {
SubnetUtils utils = new SubnetUtils(subnet);
LOG.info("Network:{}", utils.getInfo().getNetworkAddress());
return utils.getInfo().isInRange(address);
}

/**
* @param address tested address
* @param subnetaddr address from subnet (any known)
* @param mask mask
* @return true if included
*/
public static boolean checkIpBySubNet(String[/URL] address, String[/URL] subnetaddr, String[/URL] mask) {
SubnetUtils utils = new SubnetUtils(subnetaddr, mask);
return utils.getInfo().isInRange(address);
}

/**
* @param anyIp
* @return list local interface addresses accessible for anyIp (withyn subnet)
* @throws SocketException
*/
public static List<String> accessibleAddresses(String[/URL] anyIp) throws SocketException[/URL] {
return getIfacesList().stream()
.filter(iface -> {
String[/URL] cidr = String[/URL].format("%s/%s", iface.getAddress().getHostAddress()
, String[/URL].valueOf(iface.getNetworkPrefixLength()) );
return checkIpBySubNet(anyIp, cidr);
})
.map(iface -> iface.getAddress().getHostAddress())
.collect(Collectors.toList());
}

public static List<String> accessibleRange(String[/URL] anyIp) {
ArrayList<String> res = new ArrayList<>();
InetAddress[/URL][] addrs = null;
try {
addrs = InetAddress[/URL].getAllByName(anyIp);
} catch (UnknownHostException[/URL] e) {
e.printStackTrace();
}
assert addrs != null;
for (InetAddress[/URL] addr : addrs) {
try {
if (addr.isReachable(1000)) {
res.add(addr.getHostAddress());
}
} catch (IOException[/URL] e) {
e.printStackTrace();
}
}
return res;
}

public static List<String> accessibleRange() {
ArrayList<String> res = new ArrayList<>();
for (String[/URL] saddr : getRangeFromLocal(0)) {
InetAddress[/URL] addr = null;
try {
addr = InetAddress[/URL].getByName(saddr);
if (addr.isReachable(TIMEOUT)) {
res.add(addr.getHostAddress());
} else {
System[/URL].out.println("Is Not reachiable: " + addr.getHostAddress());
}
} catch (IOException[/URL] e) {
e.printStackTrace();
}
}
return res;
}

@SafeVarargs
private static <T> T[] concatAll(T[] first, T[]... rest) {
//http://stackoverflow.com/questions/80476/how-can-i-concatenate-two-arrays-in-java
int totalLength = first.length;
for (T[] array : rest) {
totalLength += array.length;
}
T[] result = Arrays[/URL].copyOf(first, totalLength);
int offset = first.length;
for (T[] array : rest) {
System[/URL].arraycopy(array, 0, result, offset, array.length);
offset += array.length;
}
return result;
}

private static List<NetworkInterface> getIfaces() throws SocketException[/URL] {
return Collections[/URL].list(NetworkInterface.getNetworkInterfa ces()).stream().filter(notFake).collect( Collectors.toList());
}

public static String[/URL][] getRangeFromLocal(int ifNum) {
String[/URL][] res = {};
NetworkInterface liface;
try {
if (ifNum >= 0) {
//liface = Collections.pinglist(NetworkInterface.ge tNetworkInterfaces()).get(ifNum);
//liface=NetworkInterface.getByIndex(ifNum ); // by real num in interfaces pinglist
liface = getIfaces().get(ifNum);
//displayInterfaceInformation(liface);
//res=new String[]{liface.getInterfaceAddresses().get(0).g etAddress().getHostAddress()};
//filter only IPV4
res = liface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq)
.map(a -> new SubnetUtils(a.getAddress().getHostAddres s() + "/" + String[/URL].valueOf(a.getNetworkPrefixLength())).ge tInfo().getAllAddresses())
.reduce(new String[/URL][]{}, NetUtils::concatAll);
/*for(InterfaceAddress addr:liface.getInterfaceAddresses()){
LOG.info(addr.getAddress().getHostAddres s() + "/" +addr.getNetworkPrefixLength());
res = concatAll(res,new SubnetUtils(addr.getAddress().getHostAdd ress() + "/" + String.valueOf(addr.getNetworkPrefixLeng th())).getInfo().getAllAddresses());
}*/
// res = new SubnetUtils(liface.getInterfaceAddresses ().get(0).getAddress().getHostAddress() + "/" + String.valueOf(liface.getInterfaceAddres ses().get(0).getNetworkPrefixLength())). getInfo().getAllAddresses();
} else {
res = Collections[/URL].list(NetworkInterface.getNetworkInterfa ces()).stream()
// networkInterface.getInterfaceAddresses() .stream()
.filter(notFake)
//for each interface (excluding localhost, virtual, P2P)
//return String[]
.map(iface -> {
return iface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq)
//for each ipv4 address on interface
.map(a -> new SubnetUtils(a.getAddress().getHostAddres s() + "/" + String[/URL].valueOf(a.getNetworkPrefixLength())).ge tInfo().getAllAddresses())
.reduce(new String[/URL][]{}, NetUtils::concatAll);
// return new SubnetUtils(iface.getInterfaceAddresses( ).get(0).getAddress().getHostAddress() +
// "/" + String.valueOf(iface.getInterfaceAddress es().get(0).getNetworkPrefixLength())).g etInfo().getAllAddresses();
})
//return combined String[] (for all interfaces)
.reduce(new String[/URL][]{}, NetUtils::concatAll);
}
} catch (SocketException[/URL] e) {
e.printStackTrace();
}
return res;
}

private static void displayInterfaceInformation(NetworkInter face netint) {
//https://docs.oracle.com/javase/tutorial/networking/nifs/listing.html
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
out.printf("Index: %s\n", netint.getIndex());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress[/URL] inetAddress : Collections[/URL].list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}

private static List<InterfaceAddress> getIfacesList() throws SocketException[/URL] {
return Collections[/URL].list(NetworkInterface.getNetworkInterfa ces()).stream()
// networkInterface.getInterfaceAddresses() .stream()
.filter(notFake)
//for each interface (excluding localhost, virtual, P2P)
//return String[]
.flatMap(iface -> iface.getInterfaceAddresses().stream()
.filter(ipv4)
.filter(masq))
.collect(Collectors.toList())
;
}

public static void main(String[/URL] args[]) throws SocketException[/URL] {
//createFtpUser("test","fortestonly");
//startFtp("1680");
//accessibleRange().forEach(addr->System.out.println(addr));
Enumeration<NetworkInterface> nets = null;
try {
nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections[/URL].list(nets))
if (!netint.isLoopback() & !netint.isPointToPoint()
& (Collections[/URL].list(netint.getInetAddresses()).size() > 0)
& !netint.isVirtual()) displayInterfaceInformation(netint);
} catch (SocketException[/URL] e) {
e.printStackTrace();
}
if (args.length < 1) {
System[/URL].err.println("Usage: java Ping ifaceNum");
return;
}
int firstArg = -1;
if (Pattern.matches("[0-9]+", args[0])) {
firstArg = Integer[/URL].parseInt(args[0]);
}
//firstArg=-1;
out.printf("Param: %d\n", firstArg);
out.println(Arrays[/URL].toString(getRangeFromLocal(firstArg)));
//return 0;
}

}

в main первая часть - это будет и в 5-ке работать (т.е. - под доминой)
getRangeFromLocal не будет, но первой части вполне хватит
0
0 / 0 / 0
Регистрация: 21.01.2011
Сообщений: 120
03.03.2016, 12:11
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 12:12
нужна либа org.apache.commons.net.util.SubnetUtils, свежаяя
0
0 / 0 / 0
Регистрация: 18.08.2008
Сообщений: 1,698
03.03.2016, 12:16
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI.
На удаленном сервере создать серверный агент, который будет принтовать в консоль CGI переменные. В твоем случае наверное подойдет REMOTE_ADDR. Для серверного агента должно вернуть его IP.
С "главного сервера" можно пнуть консольную команду на удаленный сервер, чтоб запустить агент. Результатом запуска консольной команды по идее будет строка прита из агента. Далее парсим.


--- Добавлено 4 мар 2016. Первое сообщение размещено 4 мар 2016 ---




Цитата Сообщение от Baneslaer
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
в серверном документе не обязательно будет IP
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 12:43
совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>


--- Добавлено 4 мар 2016. Первое сообщение размещено 4 мар 2016 ---

остается не раскрытой тема самой необходимости знать серверный IP
0
1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4
03.03.2016, 12:43
Цитата Сообщение от NickProstoNick
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI...
В серверном документе - у нас только FQDN.
Большинство серверов виндовые. Но есть и линукс. Тут конечно засада :(.

Попробую поковырять CGI.



Цитата Сообщение от lmike
совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>


--- Добавлено 4 мар 2016. Первое сообщение размещено 4 мар 2016 ---

остается не раскрытой тема самой необходимости знать серверный IP
nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 13:30
Цитата Сообщение от Max
nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)


--- Добавлено 4 мар 2016. Первое сообщение размещено 4 мар 2016 ---




Цитата Сообщение от Max
А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
ну поменяли и что? на что это повлияет?
0
1 / 1 / 1
Регистрация: 01.12.2009
Сообщений: 4
03.03.2016, 13:40
Цитата Сообщение от lmike
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)
Совершенно и в мыслях не было издеваться

Я только только начинаю кодить в LS. Всего естественно не знаю.


Цитата Сообщение от lmike
ну поменяли и что? на что это повлияет?
Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP. Уж не знаю что с этим связано.
Поэтому смена IP приводит к "поломке" функционирования "системы".


--- Добавлено 4 мар 2016 ---

В общем - подытожу - спасибо за идеи и "направления" куда копать.
Будем ковыряться.
Всем спасибо.
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.03.2016, 14:18
Цитата Сообщение от Max
Я только только начинаю кодить в LS. Всего естественно не знаю.
вот тогда еще больше вопросов о неприятии java
в современном мире - это одна из основных платформ, а в домино - основная (LS уже давно не развивается)
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 812
03.03.2016, 15:00
Цитата Сообщение от Max
Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP....спасибо за идеи и "направления" куда копать.
По-моему, правильнее было бы в этих базах "порядок навести". У нас тоже часто IP меняется у разных систем, то новую железку поднимут, то проапгрейдят чего-нибудь. Раньше тоже такие базы были, где IP-адреса в код зашиты - постоянно "ломались".
0
0 / 0 / 0
Регистрация: 07.09.2009
Сообщений: 39
03.03.2016, 21:52
Если вы хотите из LotusScript получить данные по настроке IP с удаленного сервера, то вы можете это сделать с помощью wbem запросов обратившись к любому windows серверу (даже если там нету Lotus Domino). Ниже привожу возможный пример Но это только если на удаленной машине будет Windows Скрипт обращается к Windows серверу формирует запрос и получив результат перебирает список IP адресов полученных с удаленного сервера:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim IP As String
Dim User As String
Dim Password As String
тут определяем данные для пользователя подключения....
If (IP<>"") And (User<>"") And (Password<>"") Then Учетки для подключения к windows машине
Print "Подключение к серверу "+IP
Dim WBEM As New ClassWBEM (это не родной класс Lotus, а просто мини-класс для удобства инициализации wbem-запросов - буквально несколько строк можно посмотреть в интернет как wbem - запросы формируются в LotusScript)
If wbem.ConnectToServer(IP, "", User, Password) Then
Dim Results As Variant массив с адресами удаленного сервера
В запросе получаем не только все адреса но и только действующие
Set Results = wbem.query("Select IPAddress from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
If Results Is Nothyng Then
Print "Не удалось получить данные"
Else
ForAll objItem In Results перебираем полученные адреса
If FullTrim(objItem.Description)={} Then
Else
Собственно очередной IP-адрес с удаленного сервера
Print FullTrim(objItem.Description)
End If
End ForAll
End If
End If
End If
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2016, 21:52
Помогаю со студенческими работами здесь

Получение данных с сервера
Добрый день. Вопрос такой. Я принимаю данные с сервера вот таким кодом. byte bytes = new bytes; TcpClient...

Получение ответа от сервера
Всем доброго вечера! Есть некоторое ПО, OPC server(KeepServer). При помощи этого ПО я отправляю команды на оборудование (команды...

Получение ip-адреса для сервера
Здравствуйте. Пробую разобраться с сервером на c# сидя на mac с xamarin studio. При запуске проги идет попытка запустить сервер, но прога...

Получение даты/времени с сервера
Как реализовать на c++ получения даты/времени с сервера например time.windows.com/time.nist.gov?

Получение данных с сервера - зависание
Всем привет. Я отправляю данные на сервер и получаю их, но при отправке и оброботки ответа форма зависает. Делаю так. Отправлять и получать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru