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

Max

Member
18.02.2015
8
0
#1
Коллеги, всем день добрый!

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

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#2
можно.
Есть несколько методов. зависит от контекста
 

Max

Member
18.02.2015
8
0
#3
можно.
Есть несколько методов. зависит от контекста
Суть такова: есть один "главный" сервер. Он запуском агента "стучится" до других серверов - получает от них разную инфу. И среди этой инфы нужны IP адреса.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#6
самый простой способ - подключить 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);
}
}
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#7
выкладывал здесь куски сканера сети (многопоточный), кот. менеее че за секунду просканит сеть (и не одну)
ставил ограничение маски (иначе, в линухах, все сокеты выжрет)
единственный момент - я писал для 8-ой java
придется переделывать со стримов на циклы
но в принципе - там все необязательно и есть ссылки на оригиналы идей
возможности: определение доступных интерфейсов (сетевых IPV4), определение на них подсетей (по маске), сканирование этих подсетей по нужному порту (у сервера будет 1352), ограничение маски, выдача откликнувшихся хостов
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#10
вот полный код определения интерфейсов
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

Baneslaer

Well-known member
25.01.2011
123
0
#11
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#12
нужна либа org.apache.commons.net.util.SubnetUtils, свежаяя
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#13
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI.
На удаленном сервере создать серверный агент, который будет принтовать в консоль CGI переменные. В твоем случае наверное подойдет REMOTE_ADDR. Для серверного агента должно вернуть его IP.
С "главного сервера" можно пнуть консольную команду на удаленный сервер, чтоб запустить агент. Результатом запуска консольной команды по идее будет строка прита из агента. Далее парсим.
[DOUBLEPOST=1457085781,1457085696][/DOUBLEPOST]
проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
в серверном документе не обязательно будет IP
 

lmike

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

Max

Member
18.02.2015
8
0
#15
win API ... а если сервер не виндовый?
Ну можно еще извратиться через CGI...
В серверном документе - у нас только FQDN.
Большинство серверов виндовые. Но есть и линукс. Тут конечно засада :(.

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

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

lmike

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

Max

Member
18.02.2015
8
0
#17
издеваетесь?
nslookup системная команда, ну вот и запускать её нужно в системе Shell
LS это вполне сможет, получить резалт - можно в файл (и его распарсить)
Совершенно и в мыслях не было издеваться :)

Я только только начинаю кодить в LS. Всего естественно не знаю.
lmike сказал(а):
ну поменяли и что? на что это повлияет?
Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP. Уж не знаю что с этим связано.
Поэтому смена IP приводит к "поломке" функционирования "системы".
[DOUBLEPOST=1457090869][/DOUBLEPOST]В общем - подытожу - спасибо за идеи и "направления" куда копать.
Будем ковыряться.
Всем спасибо.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#18
Я только только начинаю кодить в LS. Всего естественно не знаю.
вот тогда еще больше вопросов о неприятии java
в современном мире - это одна из основных платформ, а в домино - основная (LS уже давно не развивается)
 

garrick

Lotus team
26.10.2009
901
61
#19
Долго объяснять. В двух словах - Некоторый набор прикладных БД - взаимодействует используя именно IP....спасибо за идеи и "направления" куда копать.
По-моему, правильнее было бы в этих базах "порядок навести". У нас тоже часто IP меняется у разных систем, то новую железку поднимут, то проапгрейдят чего-нибудь. Раньше тоже такие базы были, где IP-адреса в код зашиты - постоянно "ломались".
 

Lariel

Active member
11.09.2009
41
2
#20
Если вы хотите из 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
 
Последнее редактирование модератором: