BlueCat Address Manager Direct Actions (Server Actions)

Add direct buttons for Server Actions in BlueCat Address Manager

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