BlueCat Address Manager Direct Actions (Server Actions)

Add direct buttons for Server Actions in BlueCat Address Manager

当前为 2018-11-26 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name BlueCat Address Manager Direct Actions (Server Actions)
  3. // @namespace *
  4. // @description Add direct buttons for Server Actions in BlueCat Address Manager
  5. // @include */app*
  6. // @license MIT
  7. // @version 9
  8. // @grant none
  9. // @copyright 2018, Marius Galm
  10. // @license MIT
  11. // @icon https://www.bluecatnetworks.com/wp-content/uploads/2018/03/cropped-bluecat-favicon-32x32.png
  12. // ==/UserScript==
  13.  
  14. function isNodeList(nodes) {
  15. var stringRepr = Object.prototype.toString.call(nodes);
  16.  
  17. return typeof nodes === 'object' &&
  18. /^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) &&
  19. (typeof nodes.length === 'number') &&
  20. (nodes.length > 0 || (typeof nodes[0] === "object" && nodes[0].nodeType > 0));
  21. }
  22.  
  23. // give up after 15 tries = 7,5 sec
  24. var k = 0, howManyTimes = 15;
  25. function getServers() {
  26. var count = k+1;
  27. console.log(" + looking for widgets "+count+"/"+howManyTimes);
  28. var servers = document.querySelectorAll("div[id^='gwt-uid']");
  29. k++;
  30. if(( k < howManyTimes )&&(isNodeList(servers)==false)){
  31. setTimeout( getServers, 500 );
  32. }
  33. else if ((servers!==undefined)&&(servers.length>0)) {
  34. //console.log(servers);
  35. console.log(" => Found Server widgets, adding buttons");
  36. for (index = 0; index < servers.length; ++index) {
  37. var namecell = servers[index];
  38. //console.log(namecell);
  39. var isCluster = false;
  40. var image = namecell.getElementsByTagName('img');
  41. if (image !== undefined) {
  42. // odd, shouldn't happen
  43. if (image[0].src.indexOf("cluster") > -1) {
  44. isCluster = true;
  45. //console.log(cluster);
  46. }
  47. var link = namecell.getElementsByTagName("a")[0].href;
  48. var rest = link.split("SingleServer:")[1];
  49. var server_id = rest.split(":")[0];
  50. // add links with icons to namecell
  51. var td = namecell.getElementsByTagName("a")[0].parentNode;
  52. var tr = td.parentNode;
  53. // console.log(" + Adding Buttons")
  54. // edit button
  55. var x = tr.insertCell(-1);
  56. var editlink = "";
  57. if (isCluster) {
  58. // special Link for clusters (why? no idea -> the other link let's you set the hostname :-D )
  59. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditXHA&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  60. }else {
  61. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditServer&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  62. }
  63. // more room between the name and the buttons
  64. x.innerHTML='<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'+editlink+'"><img title="Edit Server Settings" src="/images/icons/small/document_edit.gif" border="0"></a></td>';
  65. // view logs button
  66. var y = tr.insertCell(-1);
  67. var loglink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DViewLogs&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  68. y.innerHTML='<td><a href="'+loglink+'"><img title="View Server Logs" src="/images/icons/small/server_view.gif" border="0"></a></td>';
  69. // service config button
  70. var z = tr.insertCell(-1);
  71. var conflink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DServerServiceConfigure&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  72. z.innerHTML='<td><a href="'+conflink+'"><img title="Service Configuration" src="/images/icons/small/server_configuration.gif" border="0"></a></td>';
  73. }
  74. }
  75. } else {
  76. console.log(" => No Server widgets found, giving up!");
  77. }
  78. };
  79.  
  80.  
  81. if (document.readyState === "interactive" ) {
  82. var page = document.childNodes[2].nodeValue;
  83. if (/ Page: Home /.test(page)) {
  84. console.log("Found MyIPAM - Special handling because Widgets loading takes a while...");
  85. var index;
  86. // loop or something
  87. getServers();
  88. } else if (/ Page: ServerGroupPage /.test(page)) {
  89. // go through the h
  90. var outertable = document.getElementById("outerTable");
  91. var header = new Array();
  92. var spanheaders = 0;
  93. for (var i = 0, row; row = outertable.rows[i]; i++) {
  94. // process header
  95. if (i === 0) {
  96. //iterate through rows
  97. //rows would be accessed using the "row" variable assigned in the for loop
  98. for (var j = 0, col; col = row.cells[j]; j++) {
  99. //iterate through columns
  100. //check if the column td has an id to check for
  101. if (col.id != null) {
  102. // add 1 to spanheaders to get the correct fields later
  103. if (col.id.startsWith("spanHeader")) {
  104. // found a span header substrace one more for future fields
  105. spanheaders = spanheaders + 1;
  106. //console.log("spanHeader count now: "+spanheaders);
  107. continue;
  108. }
  109. }
  110. // get first element of header-text content
  111. var text = col.getElementsByClassName("header-text")[0];
  112. if (text !== undefined) {
  113. var trimmed = text.innerText.trim();
  114. if (text !== undefined) {
  115. if (trimmed === "Name") {
  116. header.name = j;
  117. } else if (trimmed === "Managed") {
  118. //console.log("normal cound would be: "+j+" but we need to substrace "+spanheaders+" for the span headers")
  119. header.managed = j-spanheaders;
  120. } else if (trimmed === "Profile") {
  121. //console.log("normal cound would be: "+j+" but we need to substrace "+spanheaders+" for the span headers")
  122. header.profile = j-spanheaders;
  123. }
  124. }
  125. }
  126. }
  127. } else {
  128. // get necessary columns by header if
  129. var namecell = row.cells[header.name];
  130. // extract Text, because we don't need the rest
  131. var name = namecell.innerText.trim();
  132. var managed = row.cells[header.managed].innerText.trim();
  133. var profile = row.cells[header.profile].innerText.trim();
  134. var isCluster = false;
  135. var image = namecell.getElementsByTagName('img');
  136. if (image !== undefined) {
  137. // odd, shouldn't happen
  138. if (image[0].src.indexOf("cluster") > -1) {
  139. var cluster = 'Found Cluster "'+name+'" as Managed: "'+managed+'" with Profile "'+profile+'"';
  140. isCluster = true;
  141. //console.log(cluster);
  142. } else {
  143. var server = 'Found Server "'+name+'" as Managed: "'+managed+'" with Profile "'+profile+'"';
  144. // console.log(server);
  145. }
  146. // only for managed BDDS
  147. if (managed === "Yes") {
  148. if (profile.startsWith("BlueCat DNS")||profile.startsWith("Adonis")) {
  149. // get Server ID from link
  150. var link = namecell.getElementsByTagName("a")[0].href;
  151. var rest = link.split("SingleServer%3A")[1];
  152. var server_id = rest.split("%")[0];
  153. // add links with icons to namecell
  154. var td = namecell.getElementsByTagName("a")[0].parentNode;
  155. var tr = td.parentNode;
  156. // console.log(" + Adding Buttons")
  157. // edit button
  158. var x = tr.insertCell(-1);
  159. var editlink = "";
  160. if (isCluster) {
  161. // special Link for clusters (why? no idea -> the other link let's you set the hostname :-D )
  162. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditXHA&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  163. }else {
  164. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditServer&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  165. }
  166. // more room between the name and the buttons
  167. x.innerHTML='<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'+editlink+'"><img title="Edit Server Settings" src="/images/icons/small/document_edit.gif" border="0"></a></td>';
  168. // view logs button
  169. var y = tr.insertCell(-1);
  170. var loglink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DViewLogs&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  171. y.innerHTML='<td><a href="'+loglink+'"><img title="View Server Logs" src="/images/icons/small/server_view.gif" border="0"></a></td>';
  172. // service config button
  173. var z = tr.insertCell(-1);
  174. var conflink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DServerServiceConfigure&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  175. z.innerHTML='<td><a href="'+conflink+'"><img title="Service Configuration" src="/images/icons/small/server_configuration.gif" border="0"></a></td>';
  176. } else if (profile.startsWith("Managed Windows Server")||profile.startsWith("BlueCat Address Manager for Windows Server")) {
  177. // get Server ID from link
  178. var link = namecell.getElementsByTagName("a")[0].href;
  179. var rest = link.split("SingleServer%3A")[1];
  180. var server_id = rest.split("%")[0];
  181. // add links with icons to namecell
  182. var td = namecell.getElementsByTagName("a")[0].parentNode;
  183. var tr = td.parentNode;
  184. // console.log(" + Adding Buttons")
  185. // edit button
  186. var x = tr.insertCell(-1);
  187. var editlink = editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditServer&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  188. // more room between the name and the buttons
  189. x.innerHTML='<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'+editlink+'"><img title="Edit Server Settings" src="/images/icons/small/document_edit.gif" border="0"></a></td>';
  190. // view logs button
  191. var y = tr.insertCell(-1);
  192. var loglink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DViewLogs&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  193. y.innerHTML='<td><a href="'+loglink+'"><img title="View Server Logs" src="/images/icons/small/server_view.gif" border="0"></a></td>';
  194. }
  195. }
  196. }
  197. }
  198. //console.log(header);
  199.  
  200. }
  201.  
  202. } else if (/ Page: ConfigurationPage /.test(page)) {
  203. var subtab = document.getElementsByClassName("TabPanelLabelActive")[0];
  204. if (/Servers/.test(subtab.innerHTML.trim())) {
  205. // go through the h
  206. var outertable = document.getElementById("outerTable");
  207. var header = new Array();
  208. var spanheaders = 0;
  209. for (var i = 0, row; row = outertable.rows[i]; i++) {
  210. // process header
  211. if (i === 0) {
  212. //iterate through rows
  213. //rows would be accessed using the "row" variable assigned in the for loop
  214. for (var j = 0, col; col = row.cells[j]; j++) {
  215. //iterate through columns
  216. //check if the column td has an id to check for
  217. if (col.id != null) {
  218. // add 1 to spanheaders to get the correct fields later
  219. if (col.id.startsWith("spanHeader")) {
  220. // found a span header substrace one more for future fields
  221. spanheaders = spanheaders + 1;
  222. //console.log("spanHeader count now: "+spanheaders);
  223. continue;
  224. }
  225. }
  226. // get first element of header-text content
  227. var text = col.getElementsByClassName("header-text")[0];
  228. if (text !== undefined) {
  229. var trimmed = text.innerText.trim();
  230. if (text !== undefined) {
  231. if (trimmed === "Name") {
  232. header.name = j;
  233. } else if (trimmed === "Managed") {
  234. //console.log("normal cound would be: "+j+" but we need to substrace "+spanheaders+" for the span headers")
  235. header.managed = j-spanheaders;
  236. } else if (trimmed === "Profile") {
  237. //console.log("normal cound would be: "+j+" but we need to substrace "+spanheaders+" for the span headers")
  238. header.profile = j-spanheaders;
  239. }
  240. }
  241. }
  242. }
  243. } else {
  244. // get necessary columns by header if
  245. var namecell = row.cells[header.name];
  246. // extract Text, because we don't need the rest
  247. var name = namecell.innerText.trim();
  248. var managed = row.cells[header.managed].innerText.trim();
  249. var profile = row.cells[header.profile].innerText.trim();
  250. var isCluster = false;
  251. var image = namecell.getElementsByTagName('img');
  252. if (image !== undefined) {
  253. // odd, shouldn't happen
  254. if (image[0].src.indexOf("cluster") > -1) {
  255. var cluster = 'Found Cluster "'+name+'" as Managed: "'+managed+'" with Profile "'+profile+'"';
  256. isCluster = true;
  257. //console.log(cluster);
  258. } else {
  259. var server = 'Found Server "'+name+'" as Managed: "'+managed+'" with Profile "'+profile+'"';
  260. // console.log(server);
  261. }
  262. // only for managed BDDS
  263. if (managed === "Yes") {
  264. if (profile.startsWith("BlueCat DNS")||profile.startsWith("Adonis")) {
  265. // get Server ID from link
  266. var link = namecell.getElementsByTagName("a")[0].href;
  267. var rest = link.split("SingleServer%3A")[1];
  268. var server_id = rest.split("%")[0];
  269. // add links with icons to namecell
  270. var td = namecell.getElementsByTagName("a")[0].parentNode;
  271. var tr = td.parentNode;
  272. // console.log(" + Adding Buttons")
  273. // edit button
  274. var x = tr.insertCell(-1);
  275. var editlink = "";
  276. if (isCluster) {
  277. // special Link for clusters (why? no idea -> the other link let's you set the hostname :-D )
  278. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditXHA&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  279. }else {
  280. editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditServer&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  281. }
  282. // more room between the name and the buttons
  283. x.innerHTML='<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'+editlink+'"><img title="Edit Server Settings" src="/images/icons/small/document_edit.gif" border="0"></a></td>';
  284. // view logs button
  285. var y = tr.insertCell(-1);
  286. var loglink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DViewLogs&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  287. y.innerHTML='<td><a href="'+loglink+'"><img title="View Server Logs" src="/images/icons/small/server_view.gif" border="0"></a></td>';
  288. // service config button
  289. var z = tr.insertCell(-1);
  290. var conflink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DServerServiceConfigure&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  291. z.innerHTML='<td><a href="'+conflink+'"><img title="Service Configuration" src="/images/icons/small/server_configuration.gif" border="0"></a></td>';
  292. } else if (profile.startsWith("Managed Windows Server")||profile.startsWith("BlueCat Address Manager for Windows Server")) {
  293. // get Server ID from link
  294. var link = namecell.getElementsByTagName("a")[0].href;
  295. var rest = link.split("SingleServer%3A")[1];
  296. var server_id = rest.split("%")[0];
  297. // add links with icons to namecell
  298. var td = namecell.getElementsByTagName("a")[0].parentNode;
  299. var tr = td.parentNode;
  300. // console.log(" + Adding Buttons")
  301. // edit button
  302. var x = tr.insertCell(-1);
  303. var editlink = editlink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DAddEditServer&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18&sp=ScontextId%3Ddetails&sp=SformMode%3Dedit";
  304. // more room between the name and the buttons
  305. x.innerHTML='<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'+editlink+'"><img title="Edit Server Settings" src="/images/icons/small/document_edit.gif" border="0"></a></td>';
  306. // view logs button
  307. var y = tr.insertCell(-1);
  308. var loglink = "/app?component=%24TabbedEntityContainer.%24PagePanel.pageMenu.direct&page=ServerPage&service=direct&session=T&sp=Spage%3DViewLogs&sp=Svalue%3DSingleServer%3A"+server_id+"%3A18"
  309. y.innerHTML='<td><a href="'+loglink+'"><img title="View Server Logs" src="/images/icons/small/server_view.gif" border="0"></a></td>';
  310. }
  311. }
  312. }
  313. }
  314. //console.log(header);
  315. }
  316.  
  317. }
  318. }
  319. }