ОБСУЖДЕНИЕ

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

AI-выжимка обсуждения скоро
Коллеги, всем день добрый!

Возникла задача - получить все IP адреса сервера Domino агентом.
Можно ли это сделать?
 
можно.
Есть несколько методов. зависит от контекста
 
можно.
Есть несколько методов. зависит от контекста

Суть такова: есть один "главный" сервер. Он запуском агента "стучится" до других серверов - получает от них разную инфу. И среди этой инфы нужны IP адреса.
 
каким образом "стучится"?
По разному. Есть проверка открытия основной БД для работы пользователей, есть запрос в консоль "удаленного" сервера (получаю диски, CPU, RAM). Получаю также список programs из АК.
 
самый простой способ - подключить JAVA при условии, что известен хост.
Хост можно найти в names.nsf
Java:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIP {
public static void main(String[] args) {
InetAddress address = null;
try {
address = InetAddress.getByName("www.java2s.com");
} catch (UnknownHostException e) {
System.exit(2);
}
System.out.println(address.getHostName() + "="
+ address.getHostAddress());
System.exit(0);
}
}
 
выкладывал здесь куски сканера сети (многопоточный), кот. менеее че за секунду просканит сеть (и не одну)
ставил ограничение маски (иначе, в линухах, все сокеты выжрет)
единственный момент - я писал для 8-ой java
придется переделывать со стримов на циклы
но в принципе - там все необязательно и есть ссылки на оригиналы идей
возможности: определение доступных интерфейсов (сетевых IPV4), определение на них подсетей (по маске), сканирование этих подсетей по нужному порту (у сервера будет 1352), ограничение маски, выдача откликнувшихся хостов
 
самый простой способ - подключить JAVA при условии, что известен хост.
Хост можно найти в names.nsf

А есть посложнее ? :) Я в java не очень. Вернее совсем не очень.
Может все-таки LS или win API как-то использовать?
 
вот полный код определения интерфейсов
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.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 resPath = "./res";
	private static final Logger LOG = LoggerFactory.getLogger(new Throwable().getStackTrace()[0].getClassName());
 
	private static Predicate<NetworkInterface> notLoopback = iface -> {
		boolean ret = false;
		try {
			ret = !iface.isLoopback();
		} catch (SocketException e) {
			e.printStackTrace();
		}
		return ret;
	};
	private static final Predicate<NetworkInterface> notFake = iface -> {
		boolean ret = false;
		try {
			ret = !iface.isLoopback() & !iface.isPointToPoint()
					& (Collections.list(iface.getInetAddresses()).size() > 0)
					& !iface.isVirtual();
		} catch (SocketException 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 address, String 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 address, String subnetaddr, String mask) {
		SubnetUtils utils = new SubnetUtils(subnetaddr, mask);
		return utils.getInfo().isInRange(address);
	}
 
	/**
	 * @param anyIp
	 * @return list local interface addresses accessible for anyIp (within subnet)
	 * @throws SocketException
	 */
	public static List<String> accessibleAddresses(String anyIp) throws SocketException {
		return getIfacesList().stream()
				.filter(iface -> {
					String cidr = String.format("%s/%s", iface.getAddress().getHostAddress()
							, String.valueOf(iface.getNetworkPrefixLength()));
					return checkIpBySubNet(anyIp, cidr);
				})
				.map(iface -> iface.getAddress().getHostAddress())
				.collect(Collectors.toList());
	}
 
	public static List<String> accessibleRange(String anyIp) {
		ArrayList<String> res = new ArrayList<>();
		InetAddress[] addrs = null;
		try {
			addrs = InetAddress.getAllByName(anyIp);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		assert addrs != null;
		for (InetAddress addr : addrs) {
			try {
				if (addr.isReachable(1000)) {
					res.add(addr.getHostAddress());
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return res;
	}
 
	public static List<String> accessibleRange() {
		ArrayList<String> res = new ArrayList<>();
		for (String saddr : getRangeFromLocal(0)) {
			InetAddress addr = null;
			try {
				addr = InetAddress.getByName(saddr);
				if (addr.isReachable(TIMEOUT)) {
					res.add(addr.getHostAddress());
				} else {
					System.out.println("Is Not reachiable: " + addr.getHostAddress());
				}
			} catch (IOException 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.copyOf(first, totalLength);
		int offset = first.length;
		for (T[] array : rest) {
			System.arraycopy(array, 0, result, offset, array.length);
			offset += array.length;
		}
		return result;
	}
 
	private static List<NetworkInterface> getIfaces() throws SocketException {
		return Collections.list(NetworkInterface.getNetworkInterfaces()).stream().filter(notFake).collect(Collectors.toList());
	}
 
	public static String[] getRangeFromLocal(int ifNum) {
		String[] res = {};
		NetworkInterface liface;
		try {
			if (ifNum >= 0) {
				//liface = Collections.pinglist(NetworkInterface.getNetworkInterfaces()).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).getAddress().getHostAddress()};
				//filter only IPV4
				res = liface.getInterfaceAddresses().stream()
						.filter(ipv4)
						.filter(masq)
						.map(a -> new SubnetUtils(a.getAddress().getHostAddress() + "/" + String.valueOf(a.getNetworkPrefixLength())).getInfo().getAllAddresses())
						.reduce(new String[]{}, NetUtils::concatAll);
				/*for(InterfaceAddress addr:liface.getInterfaceAddresses()){
					LOG.info(addr.getAddress().getHostAddress() + "/" +addr.getNetworkPrefixLength());
					res = concatAll(res,new SubnetUtils(addr.getAddress().getHostAddress() + "/" + String.valueOf(addr.getNetworkPrefixLength())).getInfo().getAllAddresses());
				}*/
//			  res = new SubnetUtils(liface.getInterfaceAddresses().get(0).getAddress().getHostAddress() + "/" + String.valueOf(liface.getInterfaceAddresses().get(0).getNetworkPrefixLength())).getInfo().getAllAddresses();
			} else {
				res = Collections.list(NetworkInterface.getNetworkInterfaces()).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().getHostAddress() + "/" + String.valueOf(a.getNetworkPrefixLength())).getInfo().getAllAddresses())
									.reduce(new String[]{}, NetUtils::concatAll);
//							return new SubnetUtils(iface.getInterfaceAddresses().get(0).getAddress().getHostAddress() +
//									"/" + String.valueOf(iface.getInterfaceAddresses().get(0).getNetworkPrefixLength())).getInfo().getAllAddresses();
						})
						//return combined String[] (for all interfaces)
						.reduce(new String[]{}, NetUtils::concatAll);
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
		return res;
	}
 
	private static void displayInterfaceInformation(NetworkInterface 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 inetAddress : Collections.list(inetAddresses)) {
			out.printf("InetAddress: %s\n", inetAddress);
		}
		out.printf("\n");
	}
 
	private static List<InterfaceAddress> getIfacesList() throws SocketException {
		return Collections.list(NetworkInterface.getNetworkInterfaces()).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 args[]) throws SocketException {
		//createFtpUser("test","fortestonly");
		//startFtp("1680");
		//accessibleRange().forEach(addr->System.out.println(addr));
		Enumeration<NetworkInterface> nets = null;
		try {
			nets = NetworkInterface.getNetworkInterfaces();
			for (NetworkInterface netint : Collections.list(nets))
				if (!netint.isLoopback() & !netint.isPointToPoint()
						& (Collections.list(netint.getInetAddresses()).size() > 0)
						& !netint.isVirtual()) displayInterfaceInformation(netint);
		} catch (SocketException e) {
			e.printStackTrace();
		}
		if (args.length < 1) {
			System.err.println("Usage: java Ping ifaceNum");
			return;
		}
		int firstArg = -1;
		if (Pattern.matches("[0-9]+", args[0])) {
			firstArg = Integer.parseInt(args[0]);
		}
//firstArg=-1;
		out.printf("Param: %d\n", firstArg);
		out.println(Arrays.toString(getRangeFromLocal(firstArg)));
		//return 0;
	}
 
}
в main первая часть - это будет и в 5-ке работать (т.е. - под доминой)
getRangeFromLocal не будет, но первой части вполне хватит
 
  • Нравится
Реакции: savl
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
 
нужна либа org.apache.commons.net.util.SubnetUtils, свежаяя
 
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI.
На удаленном сервере создать серверный агент, который будет принтовать в консоль CGI переменные. В твоем случае наверное подойдет REMOTE_ADDR. Для серверного агента должно вернуть его IP.
С "главного сервера" можно пнуть консольную команду на удаленный сервер, чтоб запустить агент. Результатом запуска консольной команды по идее будет строка прита из агента. Далее парсим.
[DOUBLEPOST=1457085781,1457085696][/DOUBLEPOST]
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
в серверном документе не обязательно будет IP
 
совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>
[DOUBLEPOST=1457087435,1457087377][/DOUBLEPOST]остается не раскрытой тема самой необходимости знать серверный IP
 
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI...

В серверном документе - у нас только FQDN.
Большинство серверов виндовые. Но есть и линукс. Тут конечно засада :(.

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

совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>
[DOUBLEPOST=1457087435,1457087377][/DOUBLEPOST]остается не раскрытой тема самой необходимости знать серверный IP

nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
 
nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)
[DOUBLEPOST=1457090224,1457090151][/DOUBLEPOST]
А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
ну поменяли и что? на что это повлияет?
 
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)

Совершенно и в мыслях не было издеваться :)

Я только только начинаю кодить в LS. Всего естественно не знаю.
lmike сказал(а):
ну поменяли и что? на что это повлияет?

Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP. Уж не знаю что с этим связано.
Поэтому смена IP приводит к "поломке" функционирования "системы".
[DOUBLEPOST=1457090869][/DOUBLEPOST]В общем - подытожу - спасибо за идеи и "направления" куда копать.
Будем ковыряться.
Всем спасибо.
 
Я только только начинаю кодить в LS. Всего естественно не знаю.
вот тогда еще больше вопросов о неприятии java
в современном мире - это одна из основных платформ, а в домино - основная (LS уже давно не развивается)
 
Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP....спасибо за идеи и "направления" куда копать.
По-моему, правильнее было бы в этих базах "порядок навести". У нас тоже часто IP меняется у разных систем, то новую железку поднимут, то проапгрейдят чего-нибудь. Раньше тоже такие базы были, где IP-адреса в код зашиты - постоянно "ломались".
 
Если вы хотите из LotusScript получить данные по настроке IP с удаленного сервера, то вы можете это сделать с помощью wbem запросов обратившись к любому windows серверу (даже если там нету Lotus Domino). Ниже привожу возможный пример Но это только если на удаленной машине будет Windows Скрипт обращается к Windows серверу формирует запрос и получив результат перебирает список IP адресов полученных с удаленного сервера:
Код:
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 Nothing 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
 
Последнее редактирование:

Статистика тем

Создано
Max,
Последний ответ от
swyatogor,
Ответы
47
Просмотры
17 584