module.html 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. <div class="tab-content">
  2. <ul class="nav nav-tabs tabs-block" role="tablist">
  3. <li class="nav-item active">
  4. <a href="#networking-main" role="tab" data-toggle="tab">
  5. Tools
  6. </a>
  7. </li>
  8. <li class="nav-item">
  9. <a href="#networking-config" role="tab" data-toggle="tab">
  10. Config
  11. </a>
  12. </li>
  13. </ul>
  14. <div class="tab-pane fade active in" id="networking-main">
  15. <div class="row">
  16. <div class="col-md-6" ng-controller="NetworkingModeController">
  17. <div class="panel panel-default">
  18. <div class="panel-heading">
  19. <h3 class="panel-title">
  20. WiFi Client Mode
  21. <span class="pull-right">
  22. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="checkConnection();">
  23. Refresh
  24. </button>
  25. </span>
  26. </h3>
  27. </div>
  28. <div class="panel-body">
  29. <div class="col-md-12" ng-show="connected">
  30. <div class="row">
  31. <div class="input-group">
  32. <span class="input-group-addon">Interface</span>
  33. <input type="text" class="form-control" ng-model="connectedInterface" disabled>
  34. </div>
  35. <br/>
  36. <div class="input-group">
  37. <span class="fixed-addon-width input-group-addon">SSID</span>
  38. <input type="text" class="form-control" ng-model="connectedSSID" disabled>
  39. </div>
  40. <br/>
  41. <div class="input-group">
  42. <span class="fixed-addon-width input-group-addon">IP</span>
  43. <input type="text" class="form-control" ng-model="connectedIP" disabled>
  44. </div>
  45. <br/>
  46. <button class="btn btn-default" ng-click="disconnect()" ng-hide="disconnecting">Disconnect</button>
  47. <img src="img/throbber.gif" ng-show="disconnecting">
  48. </div>
  49. </div>
  50. <div class="col-md-12" ng-hide="connected">
  51. <div class="row">
  52. <div class="input-group">
  53. <span class="input-group-addon">Interface</span>
  54. <select class="form-control" ng-model="selectedInterface" ng-disabled="scanning">
  55. <option ng-repeat="interface in interfaces">{{ interface }}</option>
  56. </select>
  57. <span class="input-group-btn">
  58. <button ng-disabled="scanning" class="btn btn-default" type="button" ng-click="scanForNetworks()">
  59. <span ng-hide="scanning">Scan</span>
  60. <img class="image-small-18" src="img/throbber.gif" ng-show="scanning">
  61. </button>
  62. </span>
  63. </div>
  64. <small class="text-muted" ng-hide="accessPoints.length !== 0" ng-show="selectedInterface === 'wlan1' || selectedInterface === 'wlan1mon'"> Note: Choosing wlan1 will interfere with PineAP.</small>
  65. <div class="alert well-sm alert-warning" role="alert" ng-show="noNetworkFound">
  66. <span>No networks were found.</span>
  67. </div>
  68. <br/>
  69. </div>
  70. <div class="row" ng-show="accessPoints.length">
  71. <div class="input-group">
  72. <span class="input-group-addon">Access Point</span>
  73. <select class="form-control" ng-options="ap.ssid for ap in accessPoints track by ap.mac" ng-model="selectedAP"></select>
  74. </div>
  75. <br/>
  76. <div class="input-group" ng-show="(selectedAP['security'] !== 'Open')">
  77. <span class="input-group-addon">Password</span>
  78. <input type="password" class="form-control" ng-model="key">
  79. </div>
  80. <br/>
  81. </div>
  82. <br/><br/>
  83. <div class="row" ng-show="accessPoints.length">
  84. <div class="input-group">
  85. <span class="fixed-addon-width-2 input-group-addon">BSSID</span>
  86. <input type="text" class="form-control" ng-model="selectedAP['mac']" disabled>
  87. </div>
  88. <br/>
  89. <div class="input-group">
  90. <span class="fixed-addon-width-2 input-group-addon">SSID</span>
  91. <input type="text" class="form-control" ng-model="selectedAP['ssid']" disabled>
  92. </div>
  93. <br/>
  94. <div class="input-group">
  95. <span class="fixed-addon-width-2 input-group-addon">Channel</span>
  96. <input type="text" class="form-control" ng-model="selectedAP['channel']" disabled>
  97. </div>
  98. <br/>
  99. <div class="input-group">
  100. <span class="fixed-addon-width-2 input-group-addon">Signal</span>
  101. <input type="text" class="form-control" ng-model="selectedAP['signal']" disabled>
  102. </div>
  103. <br/>
  104. <div class="input-group">
  105. <span class="fixed-addon-width-2 input-group-addon">Quality</span>
  106. <input type="text" class="form-control" ng-model="selectedAP['quality']" disabled>
  107. </div>
  108. <br/>
  109. <div class="input-group">
  110. <span class="fixed-addon-width-2 input-group-addon">Security</span>
  111. <input type="text" class="form-control" ng-model="selectedAP['security']" disabled>
  112. </div>
  113. <br/>
  114. </div>
  115. <div class="row">
  116. <button class="btn btn-default" ng-click="connectToAP()" ng-show="accessPoints.length" ng-disabled="connecting">
  117. <span ng-hide="connecting">Connect</span>
  118. <img class="image-small-18" src="img/throbber.gif" ng-show="connecting">
  119. </button>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <div class="panel panel-default">
  125. <div class="panel-heading">
  126. <h3 class="panel-title">
  127. Interface actions
  128. <span class="pull-right">
  129. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="getInterfaces();">
  130. Refresh
  131. </button>
  132. </span>
  133. </h3>
  134. </div>
  135. <div class="panel-body">
  136. <div class="col-md-12">
  137. <div class="row">
  138. <div class="form-group" ng-repeat="interface in interfaces">
  139. <div class="input-group">
  140. <span class="input-group-addon">{{ interface }}</span>
  141. <div class="btn-group" role="group">
  142. <button type="button" class="btn btn-default" ng-click="interfaceActions(1, interface)" ng-disabled="actions == 'loading'">Up</button>
  143. <button type="button" class="btn btn-default" ng-click="interfaceActions(2, interface)" ng-disabled="actions == 'loading'">Down</button>
  144. <button type="button" class="btn btn-default" ng-click="interfaceActions(3, interface)" ng-disabled="actions == 'loading'">Monitor ON</button>
  145. <button type="button" class="btn btn-default" ng-click="interfaceActions(4, interface)" ng-disabled="actions == 'loading'">Monitor OFF</button>
  146. </div>
  147. </div>
  148. </div>
  149. <img src="img/throbber.gif" ng-show="actions == 'loading'">
  150. <div ng-if="actions == '' && interfaces.length == 0">
  151. <small class="text-muted">Please note that the Pineapple is designed to be used with several Wi-Fi adapters plugged in, but you currently don't have any of them attached.</small>
  152. </div>
  153. </div>
  154. <div class="row" ng-hide="actions == '' || actions == 'loading'">
  155. <br/>
  156. <pre class="scrollable-pre">{{ actions }}</pre>
  157. </div>
  158. </div>
  159. </div>
  160. </div>
  161. <div class="panel panel-default">
  162. <div class="panel-heading">
  163. <h3 class="panel-title">Info</h3>
  164. </div>
  165. <div class="panel-body">
  166. <div class="col-md-12">
  167. <div class="row">
  168. <button class="btn btn-default" ng-click="getInfoData(1)" ng-disabled="info == 'loading'">ifconfig</button>
  169. <button class="btn btn-default" ng-click="getInfoData(2)" ng-disabled="info == 'loading'">iw dev</button>
  170. <button class="btn btn-default" ng-click="getInfoData(3)" ng-disabled="info == 'loading'">airmon-ng</button>
  171. <img src="img/throbber.gif" ng-show="info == 'loading'">
  172. </div>
  173. <div class="row" ng-hide="info == '' || info == 'loading'">
  174. <br/>
  175. <pre class="scrollable-pre">{{ info }}</pre>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <div class="col-md-6">
  182. <div class="panel panel-default" ng-controller="OUILookupController">
  183. <div class="panel-heading">
  184. <h3 class="panel-title">OUI Lookup
  185. <span class="dropdown">
  186. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="OUIDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  187. <span class="caret"></span>
  188. </button>
  189. <ul class="dropdown-menu" aria-labelledby="OUIDropdown">
  190. <li ng-click="removeOUIDatabase()"><a>Remove OUI Database</a></li>
  191. </ul>
  192. </span>
  193. </h3>
  194. </div>
  195. <div class="panel-body">
  196. <div ng-if="isOUIPresent()">
  197. <form class="form-inline" role="form" novalidate>
  198. <div class="form-group">
  199. <div class="input-group">
  200. <span class="input-group-addon">MAC Address</span>
  201. <input name="macAddress" placeholder="00:11:22:33:44:55" type="text" class="form-control" id="macAddress" ng-model="$parent.macAddress">
  202. </div>
  203. <br/>
  204. </div>
  205. <div class="btn-group" role="group">
  206. <button ng-click="lookupMACAddress();" ng-disabled="ouiLoading" class="btn btn-default">
  207. <span ng-hide="ouiLoading">Lookup</span>
  208. <img class="image-small-18 center-block" ng-show="ouiLoading" src="img/throbber.gif" />
  209. </button>
  210. </div>
  211. <br/>
  212. </form>
  213. <br/>
  214. <span ng-show="vendor">{{ vendor }}</span>
  215. </div>
  216. <div ng-if="!isOUIPresent()">
  217. <button ng-click="downloadOUIDatabase()" ng-disabled="gettingOUI" class="btn btn-default">
  218. <span ng-hide="gettingOUI">Download OUI Database</span>
  219. <img class="image-small-18 center-block" ng-show="gettingOUI" src="img/throbber.gif" />
  220. </button>
  221. <br/>
  222. <span class="text-muted">Note: The OUI Database is downloaded from GitHub.com</span>
  223. </div>
  224. </div>
  225. </div>
  226. <div class="panel panel-default controller" ng-controller="NetworkingMACAddressesController">
  227. <div class="panel-heading">
  228. <h3 class="panel-title">MAC Addresses
  229. <span class="dropdown">
  230. <button ng-disabled="modifyingMAC" class="btn btn-xs btn-default dropdown-toggle" type="button" id="NetworkingAccessPointsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  231. <span class="caret"></span>
  232. </button>
  233. <ul class="dropdown-menu" aria-labelledby="NetworkingAccessPointsDropdown">
  234. <li ng-disabled="waiting" ng-click="resetMac()"><a>Restore Default MAC Address</a></li>
  235. </ul>
  236. </span>
  237. <span class="pull-right">
  238. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
  239. Refresh
  240. </button>
  241. </span>
  242. </h3>
  243. </div>
  244. <div class="panel-body">
  245. <div class="col-md-12">
  246. <div class="row">
  247. <div class="input-group">
  248. <span class="input-group-addon">Interface</span>
  249. <select ng-disabled="modifyingMAC" class="form-control" ng-model="selectedInterface">
  250. <option ng-repeat="(interface, mac) in interfaces">{{ interface }}</option>
  251. </select>
  252. </div>
  253. <br/>
  254. <div class="input-group">
  255. <span class="fixed-addon-width-3 input-group-addon">Current MAC</span>
  256. <input type="text" class="form-control autoselect" ng-model="interfaces[selectedInterface]" disabled>
  257. </div>
  258. <br/>
  259. <div class="input-group">
  260. <span class="fixed-addon-width-3 input-group-addon">New MAC</span>
  261. <input ng-disabled="modifyingMAC" type="text" class="form-control" ng-model="newMac">
  262. </div>
  263. <div class="input-group">
  264. <div class="checkbox">
  265. <label><input type="checkbox" value="" ng-model="forceReload">
  266. Reload Wifi after change
  267. </label>
  268. </div>
  269. </div>
  270. <br/>
  271. <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setMac()">Set New MAC</button>
  272. <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setRandomMac()">Set Random MAC</button>
  273. <img ng-show="modifyingMAC" src="img/throbber.gif"/>
  274. <br/>
  275. <small class="text-muted">Note: Changing MAC addresses will restart the WiFi.</small>
  276. </div>
  277. </div>
  278. </div>
  279. </div>
  280. </div>
  281. </div>
  282. </div>
  283. <div class="tab-pane fade" id="networking-config">
  284. <div class="row">
  285. <div class="col-md-12 controller" ng-controller="NetworkingRouteController">
  286. <div class="panel panel-default">
  287. <div class="panel-heading">
  288. <h3 class="panel-title">Route
  289. <span class="dropdown">
  290. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="NetworkingRouteDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  291. <span class="caret"></span>
  292. </button>
  293. <ul class="dropdown-menu" aria-labelledby="NetworkingRouteDropdown">
  294. <li ng-click="restartDNS()"><a>Restart DNS</a></li>
  295. </ul>
  296. </span>
  297. <span class="pull-right">
  298. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
  299. Refresh
  300. </button>
  301. </span>
  302. </h3>
  303. </div>
  304. <div class="panel-body">
  305. <p class="alert well-sm alert-success" ng-show="restartedDNS">DNS restarted successfully</p>
  306. <pre class="scrollable-pre">{{ routeTable }}</pre>
  307. <div class="col-md-8">
  308. <div class="row">
  309. <div class="input-group">
  310. <span class="input-group-addon">Default Route</span>
  311. <input type="text" class="form-control" id="routeIP" name="routeIP" placeholder="172.16.42.42" ng-model="routeIP">
  312. <span class="input-group-addon">Interface</span>
  313. <select class="form-control inline-form" id="routeInterface" name="routeInterface" ng-model="routeInterface">
  314. <option ng-repeat="interface in routeInterfaces">{{ interface }}</option>
  315. </select>
  316. </div>
  317. <div class="col-md-12 input-group" ng-show="updatedRoute">
  318. <br/>
  319. <p class="alert well-sm alert-success">The default route has been updated successfully</p>
  320. </div>
  321. </div>
  322. </div>
  323. <div class="col-md-1"></div>
  324. <div class="col-md-3">
  325. <div class="row">
  326. <div class="input-group">
  327. <button class="btn btn-default" ng-click="updateRoute()">Update Route</button>
  328. </div>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </div>
  335. <div class="row">
  336. <div class="col-md-6 controller" ng-controller="NetworkingAccessPointsController">
  337. <div class="panel panel-default">
  338. <div class="panel-heading">
  339. <h3 class="panel-title">
  340. Access Points
  341. <span class="pull-right">
  342. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
  343. Refresh
  344. </button>
  345. </span>
  346. </h3>
  347. </div>
  348. <div class="panel-body">
  349. <div class="col-md-12">
  350. <div class="row">
  351. <div class="input-group">
  352. <span class="input-group-addon">AP Channel</span>
  353. <select class="form-control" ng-model="apConfig['selectedChannel']">
  354. <option ng-repeat="channel in apConfig['availableChannels']">{{ channel }}</option>
  355. </select>
  356. </div>
  357. <br/>
  358. <div class="input-group">
  359. <span class="fixed-addon-width-3 input-group-addon">Management SSID</span>
  360. <input type="text" class="form-control" ng-model="apConfig['managementSSID']">
  361. </div>
  362. <br/>
  363. <div class="input-group">
  364. <span class="fixed-addon-width-3 input-group-addon">Management PSK</span>
  365. <input type="password" class="form-control" ng-model="apConfig['managementKey']">
  366. </div>
  367. <br/>
  368. <div class="input-group">
  369. <div class="col-md-5">
  370. <div class="checkbox">
  371. <label for="hideManagementAP"><input id="hideManagementAP" type="checkbox" value="" ng-model="apConfig['hideManagementAP']">Hide Management AP</label>
  372. </div>
  373. </div>
  374. <div class="col-md-5">
  375. <div class="checkbox">
  376. <label for="disableManagementAP"><input id="disableManagementAP" type="checkbox" value="" ng-model="apConfig['disableManagementAP']">Disable Management AP</label>
  377. </div>
  378. </div>
  379. </div>
  380. <br/>
  381. </div>
  382. <div class="row">
  383. <div class="input-group">
  384. <span class="input-group-addon">Open SSID</span>
  385. <input type="text" class="form-control" ng-model="apConfig['openSSID']">
  386. </div>
  387. <br/>
  388. <div class="input-group">
  389. <span class="input-group-addon">Maximum Clients</span>
  390. <input type="text" class="form-control" ng-model="apConfig['maxClients']">
  391. </div>
  392. <br/>
  393. <div class="input-group">
  394. <div class="col-md-5">
  395. <div class="checkbox">
  396. <label for="hideOpenAP"><input id="hideOpenAP" type="checkbox" value="" ng-model="apConfig['hideOpenAP']">Hide Open SSID</label>
  397. </div>
  398. </div>
  399. <div class="col-md-5">
  400. <div class="checkbox">
  401. <label for="disableOpenAP"><input id="disableOpenAP" type="checkbox" value="" ng-model="apConfig['disableOpenAP']">Disable Open SSID</label>
  402. </div>
  403. </div>
  404. </div>
  405. <br/>
  406. <div class="input-group">
  407. <button class="btn btn-default" ng-click="saveAPConfiguration()">Update Access Points</button>
  408. </div>
  409. <br/>
  410. <div class="alert well-sm alert-success" ng-show="apConfigurationSaved">The Wireless AP Configuration has been saved. The radios will now restart. If connected over Wireless, you may need to reconnect.</div>
  411. <div class="alert well-sm alert-danger" ng-show="apConfigurationError">{{ apConfigurationError }}</div>
  412. </div>
  413. </div>
  414. </div>
  415. </div>
  416. </div>
  417. <div class="col-md-6">
  418. <div class="panel panel-default controller" ng-controller="NetworkingAdvancedController">
  419. <div class="panel-heading">
  420. <h3 class="panel-title">Advanced</h3>
  421. </div>
  422. <div class="panel-body">
  423. <div class="alert well-sm alert-success" ng-show="hostnameUpdated">The hostname has been updated successfully.</div>
  424. <div class="col-md-12">
  425. <div class="row">
  426. <div class="input-group">
  427. <span class="input-group-addon">Hostname</span>
  428. <input type="text" class="form-control" id="hostname" ng-model="data['hostname']">
  429. <div class="input-group-btn">
  430. <button class="btn btn-default" ng-click="setHostname()">Update</button>
  431. </div>
  432. </div>
  433. </div>
  434. </div>
  435. </div>
  436. </div>
  437. <div class="controller" ng-controller="NetworkingFirewallController" ng-show="showFirewallConfig">
  438. <div class="panel panel-default">
  439. <div class="panel-heading">
  440. <h3 class="panel-title">Firewall</h3>
  441. </div>
  442. <div class="panel-body">
  443. <div class="row">
  444. <div class="col-md-12">
  445. <div class="input-group">
  446. <div class="checkbox">
  447. <label><input type="checkbox" ng-model="WANSSHAccess">Allow SSH Access via WAN</label><br/>
  448. <label><input type="checkbox" ng-model="WANUIAccess">Allow Web UI Access via WAN</label>
  449. </div>
  450. <br/>
  451. <button class="btn btn-default" ng-click="setFirewallConfig();">Save</button>
  452. </div>
  453. <br/>
  454. <div class="alert well-sm alert-success" ng-show="firewallUpdated">The Firewall Configuration has been updated.</div>
  455. </div>
  456. </div>
  457. </div>
  458. </div>
  459. </div>
  460. <div class="panel panel-default controller" ng-controller="NetworkingAdvancedController">
  461. <div class="panel-heading">
  462. <h3 class="panel-title">
  463. Wireless config
  464. <span class="dropdown">
  465. <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="NetworkingAdvancedDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  466. <small><span class="caret"></span></small>
  467. </button>
  468. <ul class="dropdown-menu" aria-labelledby="NetworkingAdvancedDropdown">
  469. <li ng-click="resetWirelessConfig()"><a>Reset WiFi Config to Defaults</a></li>
  470. </ul>
  471. </span>
  472. <span class="pull-right">
  473. <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
  474. Refresh
  475. </button>
  476. </span>
  477. </h3>
  478. </div>
  479. <div class="panel-body">
  480. <div class="alert well-sm alert-success" ng-show="wirelessReset">
  481. The Wireless Configuration has been reset. The Network will now restart.
  482. </div>
  483. <p>
  484. <textarea class="form-control" rows="12" ng-model="data['wireless']" spellcheck="false"></textarea>
  485. </p>
  486. <p class="alert well-sm alert-success" ng-show="wirelessUpdated">Config saved successfully</p>
  487. <button type="submit" class="btn btn-default" ng-click="saveWirelessConfig()">Save config</button>
  488. </div>
  489. </div>
  490. </div>
  491. </div>
  492. </div>
  493. </div>
  494. <script type="text/javascript">
  495. $(function() {
  496. $('.tabs-block a').click(function(event) {
  497. event.preventDefault();
  498. $(this).tab('show');
  499. });
  500. $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  501. loadActiveTabData();
  502. });
  503. });
  504. </script>