1929580e3b36f9bfc45c7d4033afb9eeb82f4f4f
[nemo.git] / nemo-renderers / cli-renderer / src / main / java / org / opendaylight / nemo / renderer / cli / TelnetUtils.java
1 /*\r
2  * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.nemo.renderer.cli;\r
10 \r
11 import org.jboss.netty.bootstrap.ClientBootstrap;\r
12 import org.jboss.netty.channel.*;\r
13 import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;\r
14 import org.jboss.netty.handler.codec.string.StringDecoder;\r
15 import org.jboss.netty.handler.codec.string.StringEncoder;\r
16 import org.slf4j.Logger;\r
17 import org.slf4j.LoggerFactory;\r
18 \r
19 import java.net.InetSocketAddress;\r
20 import java.util.concurrent.Executors;\r
21 \r
22 /**\r
23  *\r
24  * @author Shixing Liu\r
25  */\r
26 public class TelnetUtils implements AutoCloseable {\r
27     private static final Logger LOG = LoggerFactory.getLogger(TelnetUtils.class);\r
28 \r
29     private static Boolean ClearOver = Boolean.TRUE;\r
30     private static String instanceOfClearCliTemplate = null;\r
31     private static String instanceOfNewCliTemplate = null;\r
32     private static String currentDeviceName = null;\r
33     private static Boolean ConfigOver = Boolean.FALSE;\r
34 \r
35     /**\r
36      *\r
37      */\r
38     public TelnetUtils(){\r
39         LOG.info("TelnetUtils constructor");\r
40     }\r
41 \r
42     /**\r
43      *\r
44      * @throws Exception\r
45      */\r
46     public void close() throws Exception {\r
47         // TODO\r
48 \r
49                 return;\r
50     }\r
51 \r
52     /**\r
53      *\r
54      * @return\r
55      */\r
56     public static Boolean isClearOver() {\r
57         return ClearOver;\r
58     }\r
59 \r
60     /**\r
61      *\r
62      * @param clearOver\r
63      */\r
64     public static void setClearOver(Boolean clearOver) {\r
65         ClearOver = clearOver;\r
66     }\r
67 \r
68     /**\r
69      *\r
70      * @return\r
71      */\r
72     public static String getInstanceOfClearCliTemplate() {\r
73         return instanceOfClearCliTemplate;\r
74     }\r
75 \r
76     /**\r
77      *\r
78      * @param instanceOfClearCliTemplate\r
79      */\r
80     public static void setInstanceOfClearCliTemplate(String instanceOfClearCliTemplate) {\r
81         TelnetUtils.instanceOfClearCliTemplate = instanceOfClearCliTemplate;\r
82     }\r
83 \r
84     /**\r
85      *\r
86      * @return\r
87      */\r
88     public static String getInstanceOfNewCliTemplate() {\r
89         return instanceOfNewCliTemplate;\r
90     }\r
91 \r
92     /**\r
93      *\r
94      * @param instanceOfNewCliTemplate\r
95      */\r
96     public static void setInstanceOfNewCliTemplate(String instanceOfNewCliTemplate) {\r
97         TelnetUtils.instanceOfNewCliTemplate = instanceOfNewCliTemplate;\r
98     }\r
99 \r
100     /**\r
101      *\r
102      * @return\r
103      */\r
104     public static String getCurrentDeviceName() {\r
105         return currentDeviceName;\r
106     }\r
107 \r
108     /**\r
109      *\r
110      * @param currentDeviceName\r
111      */\r
112     public static void setCurrentDeviceName(String currentDeviceName) {\r
113         TelnetUtils.currentDeviceName = currentDeviceName;\r
114     }\r
115 \r
116     /**\r
117      *\r
118      * @return\r
119      */\r
120     public static Boolean isConfigOver() {\r
121         return ConfigOver.booleanValue();\r
122     }\r
123 \r
124     /**\r
125      *\r
126      * @param configOver\r
127      */\r
128     public static void setConfigOver(Boolean configOver) {\r
129         ConfigOver = configOver;\r
130     }\r
131 \r
132     /**\r
133      *\r
134      * @param simpleChannelUpstreamHandler\r
135      */\r
136     private void startConnectAndConfig(SimpleChannelUpstreamHandler simpleChannelUpstreamHandler){\r
137         ChannelFactory factory = new NioClientSocketChannelFactory(\r
138                 Executors.newCachedThreadPool(),\r
139                 Executors.newCachedThreadPool());\r
140         ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
141         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
142             public ChannelPipeline getPipeline() {\r
143                 ChannelPipeline p = Channels.pipeline();\r
144                 p.addLast("encode", new StringEncoder());\r
145                 p.addLast("decode", new StringDecoder());\r
146                 p.addLast("handler", new ClientHandlerForClearOldConfig());\r
147                 return p;\r
148             }\r
149         });\r
150         bootstrap.setOption("tcpNoDelay" , true);\r
151         bootstrap.setOption("keepAlive", true);\r
152         bootstrap.setOption("connectTimeoutMillis", 5000);\r
153 \r
154         String ipAddress = null;\r
155         String deviceName = getCurrentDeviceName();\r
156         if(deviceName.contains("PE1")) {\r
157             ipAddress = "191.4.1.114";\r
158         }else if(deviceName.contains("PE2")){\r
159             ipAddress = "191.4.1.77";\r
160         }else if(deviceName.contains("PE3")){\r
161             ipAddress = "191.4.1.103";\r
162         }\r
163         System.out.println("Try to clear old configuration for device "+ deviceName+"\n");\r
164         bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
165 \r
166     }\r
167 \r
168     /**\r
169      *\r
170      */\r
171     private void clearOldConfig(){\r
172 \r
173         ChannelFactory factory = new NioClientSocketChannelFactory(\r
174                 Executors.newCachedThreadPool(),\r
175                 Executors.newCachedThreadPool());\r
176         ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
177         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
178             public ChannelPipeline getPipeline() {\r
179                 ChannelPipeline p = Channels.pipeline();\r
180                 p.addLast("encode", new StringEncoder());\r
181                 p.addLast("decode", new StringDecoder());\r
182                 p.addLast("handler", new ClientHandlerForClearOldConfig());\r
183                 return p;\r
184             }\r
185         });\r
186         bootstrap.setOption("tcpNoDelay" , true);\r
187         bootstrap.setOption("keepAlive", true);\r
188         bootstrap.setOption("connectTimeoutMillis", 5000);\r
189 \r
190         String ipAddress = null;\r
191         String deviceName = getCurrentDeviceName();\r
192         if(deviceName.contains("PE1")) {\r
193             ipAddress = "191.4.1.114";\r
194         }else if(deviceName.contains("PE2")){\r
195             ipAddress = "191.4.1.77";\r
196         }else if(deviceName.contains("PE3")){\r
197             ipAddress = "191.4.1.103";\r
198         }\r
199         System.out.println("Try to clear old configuration for device "+ deviceName+"\n");\r
200         bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
201     }\r
202 \r
203     /**\r
204      *\r
205      */\r
206     private static class ClientHandlerForClearOldConfig extends SimpleChannelUpstreamHandler {\r
207         @Override\r
208         public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {\r
209         }\r
210 \r
211         @Override\r
212         public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)throws Exception {\r
213             String str = (String)(e.getMessage());\r
214             System.out.println(e.getMessage());\r
215             if(str.contains("Username")){\r
216                 e.getChannel().write("lfk\n");\r
217             }\r
218             else if(str.contains("Password")){\r
219                 e.getChannel().write("123!@#\n");\r
220             }\r
221             else if(str.contains("The current login time is")){\r
222                 //System.out.println("------------b1----------");\r
223                 setClearOver(Boolean.FALSE);\r
224                 e.getChannel().write("system-view\n");\r
225                 e.getChannel().write("undo ip vpn-instance vpn1\n");\r
226 \r
227             }else if(str.contains("Error: The VPN instance does not exist.")){\r
228                 //System.out.println("------------b2----------");\r
229                 setClearOver(Boolean.TRUE);\r
230                 e.getChannel().close();\r
231                 System.out.println("Clear is completed for device " + getCurrentDeviceName());\r
232                 //start send down new config cli\r
233                 sendNewConfig();\r
234             }else if(str.contains("Error: The VPN instance is in stale state.")){\r
235                 //System.out.println("------------b3----------");\r
236                 e.getChannel().write("undo ip vpn-instance vpn1\n");\r
237             }\r
238             else if((isClearOver() == Boolean.FALSE)\r
239                     &&(!str.contains("Error: The VPN instance does not exist."))\r
240                     &&(!str.contains("Error: The VPN instance is in stale state."))){\r
241                 //System.out.println("------------b4----------");\r
242                 e.getChannel().write("undo ip vpn-instance vpn1\n");\r
243             }\r
244             super.messageReceived(ctx, e);\r
245         }\r
246 \r
247         @Override\r
248         public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {\r
249             // TODO Auto-generated catch block\r
250             LOG.error("Exception:",e.getCause());\r
251            // e.getCause().printStackTrace();\r
252             e.getChannel().close();\r
253         }\r
254     }\r
255 \r
256     /**\r
257      *\r
258      */\r
259     private static void sendNewConfig(){\r
260         ChannelFactory factory = new NioClientSocketChannelFactory(\r
261                 Executors.newCachedThreadPool(),\r
262                 Executors.newCachedThreadPool());\r
263         ClientBootstrap bootstrap = new ClientBootstrap(factory);\r
264         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {\r
265             public ChannelPipeline getPipeline() {\r
266                 ChannelPipeline p = Channels.pipeline();\r
267                 p.addLast("encode",new StringEncoder());\r
268                 p.addLast("decode",new StringDecoder());\r
269                 p.addLast("handler",new ClientHandlerForSendNewConfig());\r
270                 return p;\r
271             }\r
272         });\r
273         bootstrap.setOption("connectTimeoutMillis", 6000);\r
274         bootstrap.setOption("tcpNoDelay" , true);\r
275         bootstrap.setOption("keepAlive", true);\r
276 \r
277         String ipAddress = null;\r
278         String deviceName = getCurrentDeviceName();\r
279         if(deviceName.contains("PE1")) {\r
280             ipAddress = "191.4.1.114";\r
281         }else if(deviceName.contains("PE2")){\r
282             ipAddress = "191.4.1.77";\r
283         }else if(deviceName.contains("PE3")){\r
284             ipAddress = "191.4.1.103";\r
285         }\r
286         System.out.println("Start to configure device " + deviceName + " with CLI.");\r
287         bootstrap.connect(new InetSocketAddress(ipAddress, 23));\r
288     }\r
289 \r
290     /**\r
291      *\r
292      * @param deviceName\r
293      * @param clearOldConfigString\r
294      * @param cliExecutionSequences\r
295      */\r
296     public void configL3vpnOnDeviceByCli(String deviceName,\r
297                                      String clearOldConfigString,\r
298                                      String cliExecutionSequences){\r
299 \r
300         setConfigOver(Boolean.FALSE);\r
301         setInstanceOfClearCliTemplate(clearOldConfigString);\r
302         setInstanceOfNewCliTemplate(cliExecutionSequences);\r
303         setCurrentDeviceName(deviceName);\r
304         clearOldConfig();\r
305     }\r
306 \r
307     /**\r
308      *\r
309      */\r
310     private static class ClientHandlerForSendNewConfig extends SimpleChannelUpstreamHandler {\r
311         @Override\r
312         public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {\r
313         }\r
314 \r
315         @Override\r
316         public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {\r
317             String str = (String)(e.getMessage());\r
318             System.out.println(e.getMessage());\r
319             if(str.contains("Username")){\r
320                 e.getChannel().write("lfk\n");\r
321             }\r
322             else if(str.contains("Password")){\r
323                 e.getChannel().write("123!@#\n");\r
324             }\r
325             if (str.contains("The current login time is")) {\r
326                 System.out.println("ClientHandlerForConfig ");\r
327                 e.getChannel().write("system-view\n");\r
328                 e.getChannel().write(getInstanceOfClearCliTemplate());\r
329                 e.getChannel().write(getInstanceOfNewCliTemplate());\r
330                 setConfigOver(Boolean.TRUE);\r
331                 System.out.println("Configuration is completed for device "+ getCurrentDeviceName());\r
332 \r
333             }\r
334             super.messageReceived(ctx, e);\r
335         }\r
336 \r
337         @Override\r
338         public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {\r
339           //  e.getCause().printStackTrace();\r
340             // TODO Auto-generated catch block\r
341             LOG.error("Exception:",e.getCause());\r
342             e.getChannel().close();\r
343         }\r
344     }\r
345 }\r