Enhancements in BGP module
[netvirt.git] / bgpmanager / impl / src / main / java / org / opendaylight / netvirt / bgpmanager / commands / ClearBgpCli.java
1 /*
2  * Copyright (c) 2015, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.netvirt.bgpmanager.commands;
10
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import java.io.BufferedReader;
13 import java.io.IOException;
14 import java.io.InputStreamReader;
15 import java.io.PrintWriter;
16 import java.net.InetAddress;
17 import java.net.Socket;
18 import java.net.SocketException;
19 import java.net.UnknownHostException;
20 import org.apache.karaf.shell.commands.Argument;
21 import org.apache.karaf.shell.commands.Command;
22 import org.apache.karaf.shell.console.OsgiCommandSupport;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 @Command(scope = "odl", name = "clear-bgp-neighbor", description = "")
27 @SuppressFBWarnings("DM_DEFAULT_ENCODING")
28 public class ClearBgpCli extends OsgiCommandSupport {
29
30     private static final int SERVER_PORT = 2605;
31     private static final String PASSWORD_CHECK_STR = "Password:";
32     private static final String VTY_PASSWORD = "sdncbgpc";
33     private static final String ENABLE_CMD = "enable";
34     private static final int SOCK_TIMEOUT = 5;
35     private static final char HASH_PROMPT = '#';
36     private static final char GT = '>';
37
38     private static final Logger LOG = LoggerFactory.getLogger(ClearBgpCli.class);
39
40     private static String serverName = "localhost";
41
42     @Argument(name = "neighbor-ip", description = "neighbor ip to be cleared", required = false, multiValued = false)
43     String nbr = "";
44
45     Socket socket = null;
46     PrintWriter out = null;
47     BufferedReader in = null;
48
49     public static void setHostAddr(String hostAddr) {
50         serverName = hostAddr;
51     }
52
53     @Override
54     @SuppressFBWarnings("DM_DEFAULT_ENCODING")
55     protected Object doExecute() throws Exception {
56         if (nbr.isEmpty()) {
57             session.getConsole().println("enter neighbor ip to be cleared");
58             session.getConsole().println("Usage:");
59             session.getConsole().println("odl:clear-bgp-neighbor <neighbor|all>");
60             return null;
61         } else if ("all".equals(nbr)) {
62             nbr = "*";
63         } else {
64             try {
65                 InetAddress.getByName(nbr);
66             } catch (UnknownHostException e) {
67                 session.getConsole().println("Invalid neighbor ip :" + nbr);
68                 return null;
69             }
70         }
71         clearBgp("clear ip bgp " + nbr);
72         return null;
73     }
74
75     public static void main(String[] args) throws IOException {
76         ClearBgpCli test = new ClearBgpCli();
77         test.clearBgp("clear ip bgp");
78     }
79
80     public void clearBgp(String clearCommand) throws IOException {
81         try {
82             LOG.trace("Connecting to BgpHost: {}, port {} for clearBgp()", serverName, SERVER_PORT);
83             socket = new Socket(serverName, SERVER_PORT);
84         } catch (IOException ioe) {
85             session.getConsole().println("failed to connect to bgpd " + ioe.getMessage());
86             return;
87         }
88         intializeSocketOptions();
89         try {
90             readPassword(in);
91
92             out.println(VTY_PASSWORD);
93             out.println("enable");
94             LOG.trace("reading until HASH sign");
95             readUntilPrompt(in, HASH_PROMPT);
96
97             out.println(clearCommand);
98             readUntilPrompt(in, HASH_PROMPT);
99         } catch (IOException e) {
100             session.getConsole().println(e.getMessage());
101         } finally {
102             socket.close();
103         }
104         return;
105
106     }
107
108     private void intializeSocketOptions() throws SocketException, IOException {
109         socket.setSoTimeout(SOCK_TIMEOUT * 1000);
110         out = new PrintWriter(socket.getOutputStream(), true);
111         in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
112     }
113
114     private static boolean readPassword(BufferedReader in) throws IOException {
115         return readUntilPrompt(in, GT, PASSWORD_CHECK_STR);
116     }
117
118     private static boolean readUntilPrompt(BufferedReader in, char promptChar) throws IOException {
119         return readUntilPrompt(in, promptChar, null);
120     }
121
122     private static boolean readUntilPrompt(BufferedReader in, char promptChar, String checkString)
123             throws IOException {
124         StringBuilder sb = new StringBuilder();
125         int ret = 0;
126         while (true) {
127             ret = in.read();
128             if (ret == -1) {
129                 throw new IOException("connection closed by bgpd");
130             } else if (ret == promptChar) {
131                 return true;
132             }
133
134             sb.append((char) ret);
135             if (checkString != null) {
136                 if (sb.toString().contains(checkString)) {
137                     break;
138                 }
139             }
140         }
141         sb.setLength(0);
142         return true;
143     }
144 }