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

Тема в разделе "Lotus - Программирование", создана пользователем Max, 4 мар 2016.

  1. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    Коллеги, всем день добрый!

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    можно.
    Есть несколько методов. зависит от контекста
     
  3. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    Суть такова: есть один "главный" сервер. Он запуском агента "стучится" до других серверов - получает от них разную инфу. И среди этой инфы нужны IP адреса.
     
  4. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    каким образом "стучится"?
     
  5. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    По разному. Есть проверка открытия основной БД для работы пользователей, есть запрос в консоль "удаленного" сервера (получаю диски, CPU, RAM). Получаю также список programs из АК.
     
  6. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    самый простой способ - подключить 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);
    }
    }
     
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    выкладывал здесь куски сканера сети (многопоточный), кот. менеее че за секунду просканит сеть (и не одну)
    ставил ограничение маски (иначе, в линухах, все сокеты выжрет)
    единственный момент - я писал для 8-ой java
    придется переделывать со стримов на циклы
    но в принципе - там все необязательно и есть ссылки на оригиналы идей
    возможности: определение доступных интерфейсов (сетевых IPV4), определение на них подсетей (по маске), сканирование этих подсетей по нужному порту (у сервера будет 1352), ограничение маски, выдача откликнувшихся хостов
     
  8. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    А есть посложнее ? :) Я в java не очень. Вернее совсем не очень.
    Может все-таки LS или win API как-то использовать?
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    не надо так делать!
    учите java
     
  10. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    вот полный код определения интерфейсов
    Код (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 не будет, но первой части вполне хватит
     
    2 пользователям это понравилось.
  11. Baneslaer

    Baneslaer Well-Known Member

    Регистрация:
    25 янв 2011
    Сообщения:
    121
    Симпатии:
    0
    проще брать ip из документа сервера. Если такой путь не подходит, то сделать справочник соответствия названия сервера и ip-адреса. При этом не прийдется дополнительно нагружать сервера различными расчетами
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    нужна либа org.apache.commons.net.util.SubnetUtils, свежаяя
     
  13. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    win API ... а если сервер не виндовый?
    Ну можно еще извратиться через CGI.
    На удаленном сервере создать серверный агент, который будет принтовать в консоль CGI переменные. В твоем случае наверное подойдет REMOTE_ADDR. Для серверного агента должно вернуть его IP.
    С "главного сервера" можно пнуть консольную команду на удаленный сервер, чтоб запустить агент. Результатом запуска консольной команды по идее будет строка прита из агента. Далее парсим.
    [DOUBLEPOST=1457085781,1457085696][/DOUBLEPOST]
    в серверном документе не обязательно будет IP
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    совсем забыл..., если сервер привязан к IP (а лучше- чтобы оно так и было), то - команда nslookup <server name>
    [DOUBLEPOST=1457087435,1457087377][/DOUBLEPOST]остается не раскрытой тема самой необходимости знать серверный IP
     
  15. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    В серверном документе - у нас только FQDN.
    Большинство серверов виндовые. Но есть и линукс. Тут конечно засада :(.

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

    nslookup - не понятно как ее подать скриптом или в консоль Domino. и как получить ответ.
    А IP мне нужно знать актуальное - т.к. у нас иногда (редко конечно - но уже пару раз натыкались) наши доблестные инфраструктурщики меняли IP-шники серваков.
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    издеваетесь?
    nslookup системная команда, ну вот и запускать её нужно в системе Shell
    LS это вполне сможет, получить резалт - можно в файл (и его распарсить)
    [DOUBLEPOST=1457090224,1457090151][/DOUBLEPOST]
    ну поменяли и что? на что это повлияет?
     
  17. Max

    Max Member

    Регистрация:
    18 фев 2015
    Сообщения:
    8
    Симпатии:
    0
    Совершенно и в мыслях не было издеваться :)

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    вот тогда еще больше вопросов о неприятии java
    в современном мире - это одна из основных платформ, а в домино - основная (LS уже давно не развивается)
     
  19. garrick

    garrick Lotus team
    Lotus team

    Регистрация:
    26 окт 2009
    Сообщения:
    773
    Симпатии:
    52
    По-моему, правильнее было бы в этих базах "порядок навести". У нас тоже часто IP меняется у разных систем, то новую железку поднимут, то проапгрейдят чего-нибудь. Раньше тоже такие базы были, где IP-адреса в код зашиты - постоянно "ломались".
     
  20. Lariel

    Lariel Active Member

    Регистрация:
    11 сен 2009
    Сообщения:
    41
    Симпатии:
    4
    Если вы хотите из LotusScript получить данные по настроке IP с удаленного сервера, то вы можете это сделать с помощью wbem запросов обратившись к любому windows серверу (даже если там нету Lotus Domino). Ниже привожу возможный пример Но это только если на удаленной машине будет Windows Скрипт обращается к Windows серверу формирует запрос и получив результат перебирает список IP адресов полученных с удаленного сервера:
    Код (LotusScript):
    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
     
    #20 Lariel, 4 мар 2016
    Последнее редактирование модератором: 26 мар 2016
Загрузка...

Поделиться этой страницей