pgupgrade.js 5.2 KB

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