Viewing File: /usr/local/cpanel/base/sharedjs/transfers/TransferMasterLogProcessor.js

/*global console:true, alert:true, TransferTailWindowUI:false, TransferLogTail:false, TransferLogRender:false, TransferQueueWindowUI:false */
/*jshint -W116, -W035 */
/* eslint camelcase: 0 */
(function(window) {

    "use strict";

    var YAHOO = window.YAHOO;
    var DOM = window.DOM;
    var EVENT = window.EVENT;

    var ENABLE_SUBITEMS = 0;

    //TODO: This needs to be redone in a localizable way.
    var ITEM_TYPES = {
        failure: {
            className: "subitem_status",
            maketext_string: "[_1]", //  ## no extract maketext
        },
        warnings: {
            className: "warningmsg",
            maketext_string: "[quant,_1,warning,warnings]", //  ## no extract maketext
        },
        skipped_items: {
            className: "warningmsg",
            maketext_string: "[quant,_1,skipped item,skipped items]", //  ## no extract maketext
        },
        dangerous_items: {
            className: "errormsg",
            maketext_string: "[quant,_1,dangerous item,dangerous items]", //  ## no extract maketext
        },
        altered_items: {
            className: "warningmsg",
            maketext_string: "[quant,_1,altered item,altered items]", //  ## no extract maketext
        }
    };

    var TransferMasterLogProcessor = function(transfer_session_id, sessionUIObj, masterErrorProcessorObj) {
        this._queue_windows = {};
        this._logfiles = {};
        this._childTailObj = new TransferLogTail(transfer_session_id, "child", masterErrorProcessorObj);
        this._sessionUIObj = sessionUIObj;
        this._sessionState = "UNKNOWN";
        this._transfer_session_id = transfer_session_id;
    };

    YAHOO.lang.augmentObject(TransferMasterLogProcessor.prototype, {
        getTransferSessionId: function() {
            return this._transfer_session_id;
        },

        getSessionState: function() {
            return this._sessionState;
        },

        setSessionState: function(newState) {
            this._sessionState = newState;
            this._sessionUIObj.setUIState(newState);
            return 1;
        },

        renderMessage: function(msg) {
            if (msg.type == "control") {
                if (msg.contents.action === "process-item") {
                    this._start_item_tail(msg.contents);
                } else if (msg.contents.action === "initiator") {
                    // do nothing
                    // new TransferLogName(this._sessionUIObj.get_app_name_element(), msg.contents.msg);
                } else if (msg.contents.action === "start") {
                    //do nothing
                } else if (msg.contents.action === "remotehost") {
                    this._sessionUIObj.set_source(msg.contents.msg);
                } else if (msg.contents.action === "version") {
                    //do nothing
                } else if (msg.contents.action === "pause") {
                    this.setSessionState("PAUSED");
                } else if (msg.contents.action === "pausing") {
                    this.setSessionState("PAUSING");
                } else if (msg.contents.action === "aborting") {
                    this.setSessionState("ABORTING");
                } else if (msg.contents.action === "resume") {
                    this.setSessionState("RUNNING");
                } else if (msg.contents.action === "child-failed") {
                    // do nothing
                } else if (msg.contents.action === "complete" || msg.contents.action === "abort" || msg.contents.action === "fail") {
                    this._complete_queue(msg.contents);
                    if (!msg.contents.child_number) {
                        if (msg.contents.action === "complete") {
                            this.setSessionState("COMPLETED");
                        } else if (msg.contents.action === "abort") {
                            this.setSessionState("ABORTED");
                        } else {
                            this.setSessionState("FAILED");
                        }
                    }
                } else if (msg.contents.action === "queue_count") {
                    //Start a new queue window group
                    this._setup_queue(msg.contents);
                } else if (msg.contents.action === "queue_size") {
                    this._track_queue_size(msg.contents);
                } else if (msg.contents.action === "start-item") {
                    this._start_item(msg.contents);
                } else if (msg.contents.action === "success-item" || msg.contents.action === "warning-item" || msg.contents.action === "failed-item") {
                    this._finish_item(msg.contents.action, msg.contents);
                } else {
                    console.log("Unhandled message");
                    console.log(msg.contents);
                }
            }
        },

        _getQueueTailWindow: function(queue, windownum) {
            if (!this._queue_windows[queue]) {
                alert("Message out of order for queue: " + queue);
                console.trace();
                return;
            }
            if (!this._queue_windows[queue].tail_windows["w_" + windownum]) {
                this._queue_windows[queue].tail_windows["w_" + windownum] = {
                    logFile: null,
                    ui: new TransferTailWindowUI(queue, windownum, this._sessionUIObj)
                };
                this._queue_windows[queue].ui.addWindow(this._queue_windows[queue].tail_windows["w_" + windownum].ui.containerElement);
                this._queue_windows[queue].tail_windows["w_" + windownum].ui.render();
            }
            return this._queue_windows[queue].tail_windows["w_" + windownum];
        },

        _start_item_tail: function(item_message) {
            var logfile = item_message.msg;
            var queue = item_message.queue;
            var tail_window = this._getQueueTailWindow(queue, item_message.child_number);

            if (tail_window.logFile) {
                this._childTailObj.delLog(tail_window.logFile);
            }
            this._logfiles[logfile] = {
                //FIXME: digging in the tail_window object
                renderer: new TransferLogRender(tail_window, this._queue_windows[queue])
            };

            if (item_message.local_item && item_message.local_item !== item_message.item) {
                tail_window.ui.set_item(LOCALE.maketext("[_1]: “[_2]” → “[_3]”", item_message.item_name, item_message.item, item_message.local_item));
            } else {
                tail_window.ui.set_item(LOCALE.maketext("[_1]: “[_2]”", item_message.item_name, item_message.item));
            }
            tail_window.ui.setProgressBarPercentage(0);
            tail_window.logFile = logfile;

            //FIXME this is a hack
            if (this.getSessionState() === "PAUSED" || this.getSessionState() === "ABORTED") {
                this._sessionUIObj._hide_spinners();
            }

            this._childTailObj.addLog(
                logfile,
                this._logfiles[logfile].renderer.renderMessage.bind(this._logfiles[logfile].renderer)
            );
        },

        _setup_queue: function(item_message) {
            var itemcount = parseInt(item_message.msg, 10);
            var queue = item_message.queue;

            this._setup_queue_window_group(queue, itemcount);
        },

        _track_queue_size: function(item_message) {
            var size = parseInt(item_message.msg, 10);
            var queue = item_message.queue;

            this._queue_windows[queue].relative_item_size = {
                completed: 0,
                total: size
            };
        },

        _setup_queue_window_group: function(queue, itemcount) {
            if (this._queue_windows[queue]) {
                //replay on resume so no need to set it up again
                return;
            }

            this._queue_windows[queue] = {
                tail_windows: {},
                items: {},
                itemcount: itemcount,
                itemstatus: {
                    success: 0,
                    warnings: 0,
                    failed: 0,
                },
                processedcount: 0,
                relative_item_size: {
                    completed: 0,
                    total: 0,
                },
                ui: new TransferQueueWindowUI(queue, this._sessionUIObj)
            };
            var self = this;
            this._queue_windows[queue].setItemPercentage = function(logfile, pct) {
                self._update_progress(queue, logfile, pct);
            };
        },

        _update_progress: function(queue, logfile, pct) {
            var pctQueue;
            var queue_window = this._queue_windows[queue];

            if (!queue_window.items[logfile]) {
                /* already reached 100% from the master.log */
                return;
            }

            var previous_percent = queue_window.items[logfile].percent;
            var size = queue_window.items[logfile].size;
            var newly_completed_percent = (pct - previous_percent);
            var additional_relative_size_completed = (newly_completed_percent / 100) * size;

            queue_window.items[logfile].percent = pct;
            queue_window.items[logfile].completed += additional_relative_size_completed;
            queue_window.relative_item_size.completed += additional_relative_size_completed;

            if (pct >= 99.9999) {
                var epsilon = 0;
                if (queue_window.items[logfile].completed > size) {
                    epsilon = queue_window.items[logfile].completed - size;
                }
                queue_window.relative_item_size.completed -= epsilon;
                delete queue_window.items[logfile];
            }

            // http://en.wikipedia.org/wiki/Machine_epsilon
            if (Math.abs(queue_window.relative_item_size.completed - queue_window.relative_item_size.total) < 0.0001) {
                pctQueue = 1;
            } else {
                pctQueue = queue_window.relative_item_size.completed / queue_window.relative_item_size.total;
            }

            queue_window.ui.setProgressBarPercentage(parseInt(pctQueue * 100, 10));

        },

        _start_item: function(item_message) {
            var queue = item_message.queue;
            var queue_window = this._queue_windows[queue];
            var this_message = item_message.msg;
            var size = parseInt(this_message.size, 10);

            queue_window.items[item_message.logfile] = {
                size: size,
                completed: 0,
                percent: 0
            };
        },

        _finish_item: function(item_type, item_message) {
            var queue = item_message.queue;
            var queue_window = this._queue_windows[queue];
            var this_message = item_message.msg;
            var was_at_end = (queue_window.ui.outputEl.scrollTop + queue_window.ui.outputEl.offsetHeight + 1 >= queue_window.ui.outputEl.scrollHeight) || (queue_window.ui.outputEl.scrollHeight <= queue_window.ui.outputEl.offsetHeight) ? 1 : 0;

            queue_window.processedcount++;

            // on the last item disable the state button
            if (queue === "RESTORE" && queue_window.processedcount >= queue_window.itemcount - 1) {
                this._sessionUIObj.hideStateButton();
            }

            //Update progressbar
            this._update_progress(queue, item_message.logfile, 100);

            var report_item_in_summary = 0;

            /* Add each item to the report */
            var div_html;
            var itemClass;
            var fallback_msg;
            if (item_type === "success-item") {
                fallback_msg = LOCALE.maketext("Success");
                itemClass = "okmsg";
                this._queue_windows[queue]["itemstatus"]["success"]++;
            } else if (item_type === "warning-item") {
                fallback_msg = LOCALE.maketext("Warnings");
                itemClass = "warningmsg";
                report_item_in_summary = 1;
                this._queue_windows[queue]["itemstatus"]["warnings"]++;
            } else {
                fallback_msg = LOCALE.maketext("Failed");
                itemClass = "errormsg";
                report_item_in_summary = 1;
                this._queue_windows[queue]["itemstatus"]["failed"]++;
            }

            /* TODO: THIS SHOULD ALL BE IN THE UI OBJECT */
            var summary_msg = this_message.failure || this_message.message || fallback_msg;
            if (item_message.local_item && item_message.local_item !== item_message.item) {
                div_html = LOCALE.maketext("[_1] “[_2]” → “[_3]”: [_4][comment,## no extract maketext (will be done via task 32670)]", item_message.item_name, item_message.item, item_message.local_item, summary_msg);
            } else {
                div_html = LOCALE.maketext("[_1] “[_2]”: [_3][comment,## no extract maketext (will be done via task 32670)]", item_message.item_name, item_message.item, summary_msg);
            }

            var link;
            var statusDiv = document.createElement("div");
            if (item_message.logfile) {
                link = this._create_log_link(queue, div_html, this._transfer_session_id, item_message.logfile);
                statusDiv.appendChild(link);
            } else {
                statusDiv[CPANEL.has_text_content ? "textContent" : "innerText"] = div_html;
            }
            statusDiv.className = itemClass;
            queue_window.ui.outputEl.appendChild(statusDiv);

            var item;
            if (ENABLE_SUBITEMS) {
                /* Now build any subitems that go under the item
                 * for exmaple 12 Warnings
                 * 3 Dangerous Item */
                for (item in this_message) {
                    if (ITEM_TYPES[item] && this_message[item]) {
                        var newDiv = document.createElement("div");
                        newDiv[CPANEL.has_text_content ? "textContent" : "innerText"] = LOCALE.maketext(ITEM_TYPES[item].maketext_string, this_message[item]); //  ## no extract maketext
                        newDiv.className = ITEM_TYPES[item].className + " subitem_status";
                        queue_window.ui.outputEl.appendChild(newDiv);
                    }
                }
            }

            if (report_item_in_summary) {
                var report = DOM.get("report"); // FIXME use UI object
                var actual_items = this_message.contents;
                var masterDiv = document.createElement("div");
                masterDiv.className = itemClass;

                if (item_message.local_item && item_message.local_item !== item_message.item) {
                    div_html = LOCALE.maketext("[_1]: [_2] “[_3]” → “[_4]”: [_5][comment,## no extract maketext (will be done via task 32670)]", queue, item_message.item_name, item_message.item, item_message.local_item, summary_msg);
                } else {
                    div_html = LOCALE.maketext("[_1]: [_2] “[_3]”: [_4][comment,## no extract maketext (will be done via task 32670)]", queue, item_message.item_name, item_message.item, summary_msg);
                }

                if (item_message.logfile) {
                    link = this._create_log_link(queue, div_html, this._transfer_session_id, item_message.logfile);
                    masterDiv.appendChild(link);
                } else {
                    masterDiv[CPANEL.has_text_content ? "textContent" : "innerText"] = div_html;
                }

                report.appendChild(masterDiv);

                var logEntryDiv = document.createElement("div");
                report.appendChild(logEntryDiv);

                for (item in actual_items) {
                    if (ITEM_TYPES[item] && actual_items[item] && actual_items[item].length) {
                        for (var logindex = 0; logindex < actual_items[item].length; logindex++) {
                            /* TODO: this logic exists in TransferLogRender.js as well */
                            var log_message_to_display = actual_items[item][logindex];

                            //This doesn’t seem to get the actual message.
                            var log_text = log_message_to_display[1];

                            //This is where the message seems to be.
                            //Leaving it as fallback logic to avoid
                            //inadvertent breakage.
                            if (!log_text && log_message_to_display.msg) {
                                log_text = log_message_to_display.msg[0];
                            }

                            var msg_div = document.createElement("div");
                            msg_div.className = ITEM_TYPES[item].className + " subitem_status";
                            msg_div[CPANEL.has_text_content ? "textContent" : "innerText"] = log_text;
                            logEntryDiv.appendChild(msg_div);

                            var action_url = log_message_to_display[2];
                            if (action_url) {
                                msg_div.innerHTML += " ";
                                link = document.createElement("a");
                                link.href = ".." + action_url[1] + "?" + CPANEL.util.make_query_string(action_url[2]);
                                link[CPANEL.has_text_content ? "textContent" : "innerText"] = action_url[0];
                                link.target = "_blank";
                                msg_div.appendChild(link);
                            }
                        }
                    }
                }
            }

            if (was_at_end) {
                queue_window.ui.outputEl.scrollTop = queue_window.ui.outputEl.scrollHeight;
            }
        },

        _addLogReviewAction: function(el, logfile) {
            EVENT.on(el, "click", function() {
                window.open("render_transfer_log?transfer_session_id=" + encodeURIComponent(this._transfer_session_id) + "&log_file=" + encodeURIComponent(logfile));
            });
        },

        _create_log_link: function(queue, text_content, transfer_session_id, logfile) {
            var link = document.createElement("a");
            link.href = "render_transfer_log?" + CPANEL.util.make_query_string({
                transfer_session_id: transfer_session_id,
                log_file: logfile
            });
            link[CPANEL.has_text_content ? "textContent" : "innerText"] = text_content;
            link.target = "_blank";
            if (queue === "TRANSFER") {
                link.title = LOCALE.maketext("View this transfer’s log.");
                link.id = "transfer_log_for_" + transfer_session_id;

            } else {
                link.title = LOCALE.maketext("View this restoration’s log.");
                link.id = "restoration_log_for_" + transfer_session_id;
            }
            var spacer = document.createElement("span");
            spacer[CPANEL.has_text_content ? "textContent" : "innerText"] = " ";
            link.appendChild(spacer);
            var icon = document.createElement("span");
            icon.className = "glyphicon glyphicon-expand";
            link.appendChild(icon);
            return link;
        },

        _completeSummary: function() {
            /* TODO: THIS SHOULD ALL BE IN THE UI OBJECT */
            var queue;
            var queues = [];
            for (queue in this._queue_windows) {
                if (this._queue_windows.hasOwnProperty(queue)) {
                    queues.push(queue);
                }
            }
            queues = queues.sort();
            for (var i = 0; i < queues.length; i++) {
                queue = queues[i];
                var itemstatus = this._queue_windows[queue]["itemstatus"];
                var summaryDiv = document.createElement("h5");
                summaryDiv.className = "summary_of_summary";
                summaryDiv[CPANEL.has_text_content ? "textContent" : "innerText"] = LOCALE.maketext("[_1]: [_2] completed, [_3] had warnings, and [_4] failed.[comment,## no extract maketext (will be done via task 32670)]", queue, (itemstatus["success"] + itemstatus["warnings"]), itemstatus["warnings"], itemstatus["failed"]);
                var report = DOM.get("report"); // FIXME use UI object
                if (report.firstChild) {
                    report.insertBefore(summaryDiv, report.firstChild);
                } else {
                    report.appendChild(summaryDiv);
                }
            }

        },

        _complete_queue: function(item_message) {
            if (item_message.child_number) {
                var tail_window = this._getQueueTailWindow(item_message.queue, item_message.child_number);

                if (tail_window) {
                    if (tail_window.logFile) {
                        this._childTailObj.delLog(tail_window.logFile);
                    }
                    tail_window.ui.set_item(LOCALE.maketext(item_message.action)); //  ## no extract maketext
                    CPANEL.animate.slide_up(tail_window.ui.containerElement);
                }
            } else {
                this._completeSummary();
            }
        }
    });

    window.TransferMasterLogProcessor = TransferMasterLogProcessor;

}(window));
Back to Directory File Manager