pgupgrade.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. function doAPIRequestWithCallback (mod, func, handler, errorHandler, args) {
  2. 'use strict';
  3. let oReq = new XMLHttpRequest();
  4. oReq.onreadystatechange = function() {
  5. if (this.readyState === XMLHttpRequest.DONE) {
  6. if( this.status === 200 ) {
  7. handler(this);
  8. } else {
  9. errorHandler(mod, func, this.status, this.responseText);
  10. }
  11. }
  12. }
  13. oReq.addEventListener("load", handler);
  14. let argarr = [];
  15. if( typeof args === 'Object' ) {
  16. Object.keys(args).forEach( function(argument) {
  17. argarr.push(`${argument}=${args[argument]}`);
  18. });
  19. }
  20. oReq.open( "POST", "api.cgi", true );
  21. oReq.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
  22. oReq.send(argarr.join("&"));
  23. return false;
  24. }
  25. function generalErrorHandler(mod, func, code, txt) {
  26. console.log(txt);
  27. alert(`API call to ${mod}::${func} failed with error code ${code}! Please see the JS console for details.`);
  28. return false;
  29. }
  30. function safeParseJSON(txt) {
  31. let obj = {};
  32. try {
  33. obj = JSON.parse(txt);
  34. } catch(e) {
  35. console.log(txt);
  36. return { "error": e };
  37. }
  38. return obj;
  39. }
  40. function versionHandler (xhr) {
  41. 'use strict';
  42. let obj = safeParseJSON(xhr.responseText);
  43. if(obj.result === 1) {
  44. console.log(obj);
  45. // Construct version warning/display
  46. let pgVersion = obj.data.installed_version.major + '.' + obj.data.installed_version.minor;
  47. let elem = document.getElementById('psqlVersion');
  48. let html = `<strong>${pgVersion}</strong>`;
  49. if( parseFloat(pgVersion) < parseFloat(obj.data.minimum_supported_version) ) {
  50. elem.classList.add('callout', 'callout-danger');
  51. html += ' -- You are using a version of PostgreSQL Server that is no longer supported by ';
  52. html += '<a href="https://www.postgresql.org/support/versioning/" title="PostgreSQL Supported versions page">postgresql.org</a>!<br>';
  53. if( obj.data.eol_versions.hasOwnProperty(pgVersion) ) {
  54. console.log(obj.data.eol_versions[pgVersion]);
  55. console.log(obj.data.eol_versions[pgVersion].EOL);
  56. html += "<strong>EOL</strong> -- " + new Date(obj.data.eol_versions[pgVersion].EOL * 1000).toLocaleString( undefined, { year: 'numeric', month: 'long', day: 'numeric' } ) + "<br>";
  57. }
  58. html += "<strong>Immediate upgrade is recommended.</strong>";
  59. }
  60. elem.innerHTML = html;
  61. // Now let's build the table
  62. let rows = '';
  63. for ( var version of Object.keys(obj.data.available_versions).sort(function(a,b) { return parseFloat(b) - parseFloat(a) }) ) {
  64. rows +=
  65. `<tr id="pgVersionRow-${version}">
  66. <td>
  67. <input type="radio" name="selectedVersion" value="${version}" onclick="document.getElementById('submit').disabled = false;"></input>
  68. ${version}
  69. </td>
  70. <td><ul>`;
  71. obj.data.available_versions[version].features.forEach(function(feature) {
  72. rows += `<li>${feature}</li>`;
  73. });
  74. rows += `</ul></td>
  75. <td>
  76. ${new Date(obj.data.available_versions[version].release * 1000).toLocaleString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}
  77. </td>
  78. <td>
  79. ${new Date(obj.data.available_versions[version].EOL * 1000).toLocaleString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}
  80. </td>
  81. </tr>`;
  82. }
  83. document.getElementById('loadingCell').remove();
  84. document.querySelector('#upgradeForm > table > tbody').innerHTML = rows;
  85. } else {
  86. console.log(obj.error);
  87. }
  88. }
  89. function doInstallScroller (xhr) {
  90. 'use strict';
  91. let obj = JSON.parse(xhr.responseText);
  92. let upgradeWell = document.getElementById('upgradeWell');
  93. let submitBtn = document.getElementById('submit');
  94. if(obj.result === 1) {
  95. if(obj.data.exit_code !== 0) {
  96. upgradeWell.textContent += obj.data.last_yum_command + " reported nonzero exit code (" + obj.data.exit_code + "):\n[STDOUT] " + obj.data.stdout + "\n[STDERR] " + obj.data.stderr;
  97. submitBtn.textContent = 'Re-Try';
  98. submitBtn.disabled = false;
  99. return false;
  100. }
  101. if(obj.data.already_installed) {
  102. upgradeWell.textContent += obj.data.last_yum_command + " reports the community repository is already installed: " + obj.data.stdout;
  103. } else {
  104. upgradeWell.textContent += obj.data.last_yum_command + "\n" + obj.data.stdout;
  105. }
  106. // Ok, now kick off actual install TODO use WebSocket?
  107. upgradeWell.textContent += "\nNow proceeding with install of PostgreSQL " + window.selectedVersion + "...\n";
  108. doAPIRequestWithCallback( 'Postgres', 'start_postgres_install', handlePGInstall, generalErrorHandler, { "version": window.selectedVersion } );
  109. } else {
  110. upgradeWell.textContent += "Installlation of community repositories failed:" + obj.reason;
  111. submitBtn.textContent = 'Re-Try';
  112. submitBtn.disabled = false;
  113. }
  114. return false;
  115. }
  116. function handlePGInstall (xhr) {
  117. 'use strict';
  118. let obj = safeParseJSON(xhr.responseText);
  119. if(obj.result === 1) {
  120. console.log(obj);
  121. console.log("OK. Now doing our install.");
  122. } else {
  123. console.log(obj.error);
  124. }
  125. return false;
  126. }
  127. window.doUpgrade = function () {
  128. 'use strict';
  129. let form = new FormData(upgradeForm);
  130. window.selectedVersion = form.get('selectedVersion');
  131. document.getElementById('upgradeTitle').textContent = "Install Progress for PostgreSQL " + window.selectedVersion;
  132. let submitBtn = document.getElementById('submit');
  133. submitBtn.disabled = true;
  134. submitBtn.innerHTML = '<span class="fa fa-spin fa-spinner"></span>';
  135. document.getElementById('upgradeDiv').innerHTML = '<pre id="upgradeWell" class="well">Ensuring that the PostgreSQL Community repository is installed...\n</pre>';
  136. doAPIRequestWithCallback('Postgres', 'enable_community_repositories', doInstallScroller, generalErrorHandler );
  137. return false;
  138. }
  139. // Now kickoff the page load post bits
  140. document.getElementById('submit').disabled = true;
  141. doAPIRequestWithCallback( 'Postgres', 'get_postgresql_versions', versionHandler, generalErrorHandler );