fsi_admin.JFsiTareas.java Source code

Java tutorial

Introduction

Here is the source code for fsi_admin.JFsiTareas.java

Source

/*
Forseti, El ERP Gratuito para PyMEs
Copyright (C) 2015 Gabriel Gutirrez Fuentes.
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.
    
You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package fsi_admin;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Vector;

import org.apache.commons.lang.mutable.MutableBoolean;

import forseti.JAccesoBD;
import forseti.JBDRegistradasSet;
import forseti.JFsiScript;
import forseti.JUtil;
import forseti.JZipUnZipUtil;
import forseti.sets.JAdmVariablesSet;
import forseti.sets.JBDSSet;

public class JFsiTareas implements JTimerInterface {
    private static boolean actualizando;
    private boolean auto_act;
    private boolean auto_resp;
    private boolean auto_slds;
    private int auto_hora;
    private int auto_min;
    private String respaldos;
    private String postgresql;
    private String actualizar;
    private String tomcat;

    JTimer timer;
    String salida;
    short idsalida;
    String log;

    public JFsiTareas() {
        actualizando = false;
        timer = new JTimer(this, 60000);
        auto_act = false;
        auto_resp = false;
        auto_slds = false;
        auto_hora = 0;
        auto_min = 0;
        respaldos = "NC";
        postgresql = "general";
        actualizar = "NC";
        tomcat = "NC";
        salida = "";
        log = "";
        idsalida = -1;

        // Ahora inicia el gestor de tareas
        try {
            FileReader file = new FileReader("/usr/local/forseti/bin/.forseti_auto");
            BufferedReader buff = new BufferedReader(file);
            boolean eof = false;
            while (!eof) {
                String line = buff.readLine();
                if (line == null) {
                    eof = true;
                } else {
                    try {
                        StringTokenizer st = new StringTokenizer(line, "=");
                        String key = st.nextToken();
                        String value = st.nextToken();
                        if (key.equals("HORA")) {
                            String[] temp = value.split(":");
                            auto_hora = Integer.parseInt(temp[0]);
                            auto_min = Integer.parseInt(temp[1]);
                        } else if (key.equals("ACT"))
                            auto_act = (value.equals("1") ? true : false);
                        else if (key.equals("RESP"))
                            auto_resp = (value.equals("1") ? true : false);
                        else if (key.equals("SLDS"))
                            auto_slds = (value.equals("1") ? true : false);
                        else if (key.equals("POSTGRESQL"))
                            postgresql = value;
                        else if (key.equals("RESPALDOS"))
                            respaldos = value;
                        else if (key.equals("ACTUALIZAR"))
                            actualizar = value;
                        else if (key.equals("TOMCAT"))
                            tomcat = value;
                    } catch (NoSuchElementException e) {
                        continue;
                    }

                }

            }

        } catch (Throwable e) {
            e.printStackTrace(System.out);
        }

        timer.startTimer();
        System.out.println("El sistema de tareas se ha iniciado a las " + auto_hora + ":" + auto_min + "\n"
                + "PGSQL: " + postgresql + " RUTA: " + respaldos + " ACT = " + auto_act + " RESP = " + auto_resp
                + " SLDS = " + auto_slds);

    }

    public void verificarPorTareas() {
        // esta se llama cada minuto para verificar por la actualizacion de saldos
        Calendar fecha = GregorianCalendar.getInstance();
        //System.out.println("Revisando tiempo para sistema de tareas automticas: " + fecha.get(Calendar.HOUR_OF_DAY) + ":" + fecha.get(Calendar.MINUTE) + " " + auto_hora + ":" + auto_min );
        if (auto_hora == fecha.get(Calendar.HOUR_OF_DAY) && auto_min == fecha.get(Calendar.MINUTE))
            tareasAutomatizadas();

    }

    public boolean getActualizando() {
        return actualizando;
    }

    public void tareasAutomatizadas() {
        System.out.println("OK llamada a Tareas Automatizadas");
        if (!actualizando) {
            actualizando = true;
            System.out.println("OK actualizando......");
            if (auto_resp) {
                System.out.println("Respaldando servidor......");
                respaldarServidor(Calendar.getInstance(), null);
            }
            if (auto_slds) {
                System.out.println("Actualizando saldos del CEF......");
                actualizarSaldos();
            }
            if (auto_act)
                actualizarServidor(null);

            System.out.println("Fin de tareas automtizadas......");
            actualizando = false;
        } else
            System.out
                    .println("No se procedi a actualizar porque el sistema ya est actualizandose actualmente");

    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public synchronized void actualizarSaldos() {
        //       Primero recopila la informacion de las bases de datos.
        Vector BASES = new Vector();

        JBDRegistradasSet bdr = new JBDRegistradasSet(null);
        bdr.ConCat(true);
        bdr.Open();

        for (int i = 0; i < bdr.getNumRows(); i++) {
            String nombre = bdr.getAbsRow(i).getNombre();
            BASES.addElement(nombre);

        }
        short res = 0;
        String mensaje = "";
        Connection con;

        try {
            Calendar fecha = GregorianCalendar.getInstance();
            FileWriter filewri = new FileWriter(
                    "/usr/local/forseti/log/SLDS-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-hh-mm") + ".log", true);
            PrintWriter pw = new PrintWriter(filewri);

            for (int i = 0; i < BASES.size(); i++) {
                String nombre = (String) BASES.get(i);

                pw.println("----------------------------------------------------------------------------");
                pw.println("             " + "ACTUALIZANDO LA BASE DE DATOS: " + nombre + " "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.println("----------------------------------------------------------------------------");
                pw.flush();

                System.out.println("ACTUALIZANDO LA BASE DE DATOS: " + nombre + " "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));

                //Empieza por la de saldos
                con = JAccesoBD.getConexion(nombre);
                String sql[] = {
                        "select * from sp_invserv_actualizar_existencias() as ( err integer, res varchar ) ",
                        "select * from sp_prod_formulas_actualizar_niveles() as ( err integer, res varchar ) ",
                        "select * from sp_invserv_actualizar_sdos() as ( err integer, res varchar ) ",
                        "select * from sp_invserv_actualizar_polcant() as ( err integer, res varchar ) ",
                        "select * from sp_cont_catalogo_actualizar_sdos() as ( err integer, res varchar ) ",
                        "select * from sp_bancos_actualizar_sdos() as ( err integer, res varchar ) ",
                        "select * from sp_provee_actualizar_sdos() as ( err integer, res varchar ) ",
                        "select * from sp_client_actualizar_sdos() as ( err integer, res varchar ) " };

                try {
                    Statement s = con.createStatement();
                    for (int j = 0; j < sql.length; j++) {
                        System.out.println("EJECUTANDO: " + sql[j]);
                        pw.println("EJECUTANDO: " + sql[j] + "\n");
                        pw.flush();

                        ResultSet rs = s.executeQuery(sql[j]);
                        if (rs.next()) {
                            res = rs.getShort("ERR");
                            mensaje = rs.getString("RES");
                        }

                        //outprintln("REGRESO: ERR: " + res + " RES: " + mensaje + " " + JUtil.obtFechaTxt(new Date(), "hh:mm:ss"));
                        pw.println("REGRESO: ERR: " + res + " RES: " + mensaje + " "
                                + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                        pw.flush();

                    }
                    s.close();

                } catch (NullPointerException e) //Se captura cuando no existe una base de datos fsica pero el cabecero general de tbl_bd contiene una
                {
                    System.out.println(e.toString());
                    pw.println(e.toString() + "\n");
                    pw.flush();
                } catch (SQLException e) {
                    System.out.println(e.toString());
                    pw.println(e.toString() + "\n");
                    pw.flush();
                } finally {
                    JAccesoBD.liberarConexion(con);
                }

            } // Fin for BA>SES

            pw.println("----------------------------- FIN DE LA ACTUALIZACION ----------------------------------");
            pw.flush();

            idsalida = 0;
        } catch (IOException e) {
            idsalida = 3;
            salida += "OCURRIERON ERRORES AL ABRIR O COPIAR ARCHIVOS... REVISA EL REGISTRO DE ACTUALIZACIONES<br>";
            e.printStackTrace();
        }

    }

    public synchronized void respaldarEmpresa(JBDSSet set, int ind, Calendar fecha, PrintWriter out,
            PrintWriter prntwri) {
        try {
            //Primero respalda emp/NOMBRE/
            String nombre = set.getAbsRow(ind).getNombre();
            String path = "/usr/local/forseti/log/RESP-" + nombre + "-"
                    + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".log";
            PrintWriter pw;
            if (prntwri == null)
                pw = new PrintWriter(new FileWriter(path, true));
            else
                pw = prntwri;

            if (out != null) {
                out.println("----------------------------------------------------------------------------<br>");
                out.println("RESPALDANDO LA BASE DE DATOS Y ARCHIVOS EMP: " + nombre.substring(6) + " "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                out.println("----------------------------------------------------------------------------<br>");
                out.flush();
            }
            pw.println("----------------------------------------------------------------------------");
            pw.println("RESPALDANDO LA BASE DE DATOS Y ARCHIVOS EMP: " + nombre.substring(6) + " "
                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
            pw.println("----------------------------------------------------------------------------");
            pw.flush();

            if (respaldos.equals("NC")) {
                if (out != null) {
                    out.println(
                            "PRECAUCION: La variable RESPALDOS (ruta para los archivos de respaldo) no est definida... No se puede generar<br>");
                    out.flush();
                }
                pw.println(
                        "PRECAUCION: La variable RESPALDOS (ruta para los archivos de respaldo) no est definida... No se puede generar");
                pw.flush();
                return;
            }

            JFsiScript sc = new JFsiScript();
            sc.setVerbose(true);

            String ERROR = "";

            try {
                File dir;
                //System.out.println(dir.getAbsolutePath());
                String CONTENT;
                JAdmVariablesSet var = new JAdmVariablesSet(null);
                var.ConCat(3);
                var.setBD(nombre);
                var.m_Where = "ID_Variable = 'VERSION'";
                var.Open();
                String vers = var.getAbsRow(0).getVAlfanumerico();

                if (prntwri == null) {
                    dir = new File(respaldos, (nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm")));
                    dir.mkdir();
                    // Primero Agrega el archivo de version para esta empresa
                    File version = new File(respaldos + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/forseti.version");
                    FileWriter fw = new FileWriter(version);
                    fw.write(vers);
                    fw.close();
                    CONTENT = "rsync -av --stats /usr/local/forseti/emp/" + nombre.substring(6) + " " + respaldos
                            + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm");
                } else {
                    dir = new File(respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"),
                            (nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm")));
                    dir.mkdir();
                    // Primero Agrega el archivo de version para esta empresa
                    File version = new File(respaldos + "/FORSETI_ADMIN-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/forseti.version");
                    FileWriter fw = new FileWriter(version);
                    fw.write(vers);
                    fw.close();
                    CONTENT = "rsync -av --stats /usr/local/forseti/emp/" + nombre.substring(6) + " " + respaldos
                            + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm");
                }
                sc.setContent(CONTENT);
                //System.out.println(CONTENT);
                String RES = sc.executeCommand();
                ERROR += sc.getError();
                if (!ERROR.equals("")) {
                    if (out != null) {
                        out.println("ERROR al respaldar en RSYNC: " + ERROR + "<br>");
                        out.flush();
                    }
                    pw.println("ERROR al respaldar en RSYNC: " + ERROR);
                    pw.flush();
                } else {
                    if (out != null) {
                        out.println("El respaldo de los archivos se gener con xito en: " + respaldos + "/"
                                + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "<br>");
                        out.flush();
                    }
                    pw.println("El respaldo de los archivos se gener con xito en: " + respaldos + "/" + nombre
                            + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"));
                    pw.flush();
                }
                if (out != null) {
                    out.println("FINALIZANDO RESPALDO DE ARCHIVOS EMP: " + nombre.substring(6) + " "
                            + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                    out.println(
                            "Comenzando el respaldo de la base de datos... Esto puede tardar muchos minutos, incluso horas (dependiendo de la cantidad de informacin) hay que ser pacientes<br>");
                    out.flush();
                }
                pw.println("FINALIZANDO RESPALDO DE ARCHIVOS EMP: " + nombre.substring(6) + " "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.flush();

                ERROR = "";
                if (prntwri == null)
                    CONTENT = "PGUSER=forseti PGPASSWORD=" + JUtil.getPASS() + " pg_dump --host=" + JUtil.getADDR()
                            + " --port=" + JUtil.getPORT() + " --file=" + respaldos + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".dump --no-owner " + nombre;
                else
                    CONTENT = "PGUSER=forseti PGPASSWORD=" + JUtil.getPASS() + " pg_dump --host=" + JUtil.getADDR()
                            + " --port=" + JUtil.getPORT() + " --file=" + respaldos + "/FORSETI_ADMIN-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".dump --no-owner " + nombre;

                sc.setContent(CONTENT);
                //System.out.println(CONTENT);
                RES = sc.executeCommand();
                ERROR += sc.getError();
                if (!ERROR.equals("")) {
                    //System.out.println(ERROR);
                    if (out != null) {
                        out.println("ERROR al crear el respaldo de la base de datos: " + ERROR + "<br>");
                        out.flush();
                    }
                    pw.println("ERROR al crear el respaldo de la base de datos: " + ERROR);
                    pw.flush();
                } else {
                    if (RES.equals("")) {
                        if (out != null) {
                            out.println(
                                    "El respaldo de la base de datos se gener con xito como archivo .dump dentro de este directorio<br>");
                            out.flush();
                        }
                        pw.println(
                                "El respaldo de la base de datos se gener con xito como archivo .dump dentro de este directorio");
                        pw.flush();
                    } else {
                        if (out != null) {
                            out.println("RESPUESTA PG_DUMP: " + RES + "<br>");
                            out.flush();
                        }
                        pw.println("RESPUESTA PG_DUMP: " + RES);
                        pw.flush();
                    }
                }
                if (out != null) {
                    out.println("FINALIZANDO RESPALDO DE LA BASE DE DATOS: " + nombre + " "
                            + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                    out.flush();
                }
                pw.println("FINALIZANDO RESPALDO DE LA BASE DE DATOS: " + nombre + " "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.flush();

                File file;
                if (prntwri == null)
                    file = new File(respaldos + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm")
                            + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".conf");
                else
                    file = new File(respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm")
                            + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/" + nombre + "-"
                            + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".conf");

                String conf = "id_bd|" + set.getAbsRow(ind).getID_BD() + "\n" + "nombre|"
                        + set.getAbsRow(ind).getNombre() + "\n" + "usuario|" + set.getAbsRow(ind).getUsuario()
                        + "\n" + "password|" + set.getAbsRow(ind).getPassword() + "\n" + "fechaalta|"
                        + JUtil.obtFechaSQL(set.getAbsRow(ind).getFechaAlta()) + "\n" + "compania|"
                        + set.getAbsRow(ind).getCompania() + "\n" + "direccion|" + set.getAbsRow(ind).getDireccion()
                        + "\n" + "poblacion|" + set.getAbsRow(ind).getPoblacion() + "\n" + "cp|"
                        + set.getAbsRow(ind).getCP() + "\n" + "mail|" + set.getAbsRow(ind).getMail() + "\n" + "web|"
                        + set.getAbsRow(ind).getWeb() + "\n" + "su|" + set.getAbsRow(ind).getSU() + "\n" + "rfc|"
                        + set.getAbsRow(ind).getRFC() + "\n" + "cfd|" + set.getAbsRow(ind).getCFD() + "\n"
                        + "cfd_calle|" + set.getAbsRow(ind).getCFD_Calle() + "\n" + "cfd_noext|"
                        + set.getAbsRow(ind).getCFD_NoExt() + "\n" + "cfd_noint|"
                        + set.getAbsRow(ind).getCFD_NoInt() + "\n" + "cfd_colonia|"
                        + set.getAbsRow(ind).getCFD_Colonia() + "\n" + "cfd_localidad|"
                        + set.getAbsRow(ind).getCFD_Localidad() + "\n" + "cfd_municipio|"
                        + set.getAbsRow(ind).getCFD_Municipio() + "\n" + "cfd_estado|"
                        + set.getAbsRow(ind).getCFD_Estado() + "\n" + "cfd_pais|" + set.getAbsRow(ind).getCFD_Pais()
                        + "\n" + "cfd_cp|" + set.getAbsRow(ind).getCFD_CP() + "\n" + "cfd_regimenfiscal|"
                        + set.getAbsRow(ind).getCFD_RegimenFiscal();
                FileWriter fconf = new FileWriter(file);
                fconf.write(conf);
                fconf.close();
                if (out != null) {
                    out.println(
                            "El respaldo de la configuracin se gener con xito como archivo .conf en este directorio<br>");
                    out.flush();
                }
                pw.println(
                        "El respaldo de la configuracin se gener con xito como archivo .conf en este directorio");
                pw.flush();
                if (prntwri == null) {
                    if (out != null) {
                        out.println("Generando el archivo zip...<br>");
                        out.flush();
                    }
                    pw.println("Generando el archivo zip...");
                    pw.flush();
                    JZipUnZipUtil azip = new JZipUnZipUtil();
                    azip.zipFolder(respaldos + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"),
                            respaldos + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".zip");
                    if (out != null) {
                        out.println("Eliminando carpeta de respaldo<br>");
                        out.flush();
                    }
                    pw.println("Eliminando carpeta de respaldo...");
                    pw.flush();
                    //Borra los archivos del respaldo
                    File dirbd = new File(
                            respaldos + "/" + nombre + "-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"));
                    File[] currList;
                    Stack<File> stack = new Stack<File>();
                    stack.push(dirbd);
                    while (!stack.isEmpty()) {
                        if (stack.lastElement().isDirectory()) {
                            currList = stack.lastElement().listFiles();
                            if (currList.length > 0) {
                                for (File curr : currList) {
                                    stack.push(curr);
                                }
                            } else {
                                stack.pop().delete();
                            }
                        } else {
                            stack.pop().delete();
                        }
                    }
                }
            } catch (Throwable e) {
                if (out != null) {
                    out.println("ERROR Throwable:<br>");
                    e.printStackTrace(out);
                    out.flush();
                }
                pw.println("ERROR Throwable:\n");
                e.printStackTrace(pw);
                pw.flush();
            }
            if (out != null) {
                out.println("----------------------------- FIN DEL RESPALDO: " + nombre
                        + " ----------------------------------<br>");
                out.flush();
            }
            pw.println("----------------------------- FIN DEL RESPALDO: " + nombre
                    + " ----------------------------------");
            pw.flush();
            if (prntwri == null)
                pw.close();
        } catch (IOException e) {
            if (out != null) {
                out.println("OCURRIERON ERRORES AL ABRIR O COPIAR ARCHIVOS<br>");
                e.printStackTrace(out);
                out.flush();
            }
            e.printStackTrace(System.out);
        }

    }

    public synchronized void respaldarServidor(Calendar fecha, PrintWriter out) {
        try {
            String path = "/usr/local/forseti/log/RESP-FORSETI_ADMIN-"
                    + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".log";
            FileWriter filewri = new FileWriter(path, true);
            PrintWriter pw = new PrintWriter(filewri);

            if (out != null) {
                out.println("----------------------------------------------------------------------------<br>");
                out.println("RESPALDANDO LA BASE DE DATOS PRINCIPAL: FORSETI_ADMIN Y ARCHIVOS "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                out.println("----------------------------------------------------------------------------<br>");
                out.flush();
            }
            pw.println("----------------------------------------------------------------------------");
            pw.println("RESPALDANDO LA BASE DE DATOS PRINCIPAL: FORSETI_ADMIN Y ARCHIVOS "
                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
            pw.println("----------------------------------------------------------------------------");
            pw.flush();

            if (respaldos.equals("NC")) {
                if (out != null) {
                    out.println(
                            "PRECAUCION: La variable RESPALDOS (ruta para los archivos de respaldo) no est definida... No se puede generar<br>");
                    out.flush();
                }
                pw.println(
                        "PRECAUCION: La variable RESPALDOS (ruta para los archivos de respaldo) no est definida... No se puede generar");
                pw.flush();
                return;
            }

            if (tomcat.equals("NC")) {
                if (out != null) {
                    out.println(
                            "PRECAUCION: La variable TOMCAT (ruta de instalacin de tomcat) no est definida... No se puede generar");
                    out.flush();
                }
                pw.println(
                        "PRECAUCION: La variable TOMCAT (ruta de instalacin de tomcat) no est definida... No se puede generar");
                pw.flush();
                return;
            }

            JFsiScript sc = new JFsiScript();
            sc.setVerbose(true);

            String ERROR = "", RES = "";

            try {
                JAdmVariablesSet var = new JAdmVariablesSet(null);
                var.ConCat(true);
                var.m_Where = "ID_Variable = 'VERSION'";
                var.Open();
                String vers = var.getAbsRow(0).getVAlfanumerico();

                File dir = new File(respaldos, "FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"));
                dir.mkdir();
                // Primero Agrega el archivo de version para este servidor
                File version = new File(respaldos + "/" + "FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/forseti.version");
                FileWriter fw = new FileWriter(version);
                fw.write(vers);
                fw.close();
                File diremp = new File(respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"),
                        "emp");
                diremp.mkdir();

                //System.out.println(dir.getAbsolutePath());
                String CONTENT = "";
                CONTENT += "rsync -av --stats /usr/local/forseti/act " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";
                CONTENT += "rsync -av --stats /usr/local/forseti/bin " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";
                CONTENT += "rsync -av --stats /usr/local/forseti/log " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";
                CONTENT += "rsync -av --stats /usr/local/forseti/pac " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";
                CONTENT += "rsync -av --stats /usr/local/forseti/rec " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";
                CONTENT += "rsync -av --stats " + tomcat + "/webapps/ROOT.war " + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "\n";

                sc.setContent(CONTENT);
                System.out.println(CONTENT);
                RES = sc.executeCommand();
                ERROR += sc.getError();
                if (!ERROR.equals("")) {
                    if (out != null) {
                        pw.println("ERROR al respaldar en RSYNC: " + ERROR + "<br>");
                        pw.flush();
                    }
                    pw.println("ERROR al respaldar en RSYNC: " + ERROR);
                    pw.flush();
                } else {
                    if (out != null) {
                        out.println("El respaldo de los archivos se genero con xito en: " + respaldos
                                + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "<br>");
                        out.flush();
                    }
                    pw.println("El respaldo de los archivos se genero con xito en: " + respaldos
                            + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"));
                    pw.flush();
                }

                if (out != null) {
                    out.println("FINALIZANDO RESPALDO DE ARCHIVOS FORSETI_ADMIN: "
                            + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                    out.flush();
                }
                pw.println("FINALIZANDO RESPALDO DE ARCHIVOS FORSETI_ADMIN: "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.flush();

                RES = "";
                ERROR = "";
                CONTENT = "PGUSER=forseti PGPASSWORD=" + JUtil.getPASS() + " pg_dump --host=" + JUtil.getADDR()
                        + " --port=" + JUtil.getPORT() + " --file=" + respaldos + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + "/FORSETI_ADMIN-"
                        + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".dump FORSETI_ADMIN";
                sc.setContent(CONTENT);
                //System.out.println(CONTENT);
                RES = sc.executeCommand();
                ERROR += sc.getError();
                //Ahora genera el Archivo Base64
                if (!ERROR.equals("")) {
                    //System.out.println(ERROR);
                    if (out != null) {
                        out.println("ERROR al crear el respaldo de la base de datos principal: " + ERROR + "<br>");
                        out.flush();
                    }
                    pw.println("ERROR al crear el respaldo de la base de datos principal: " + ERROR);
                    pw.flush();
                } else {
                    if (RES.equals("")) {
                        if (out != null) {
                            out.println(
                                    "El respaldo de la base de datos principal se gener con xito como archivo .dump dentro de este directurio");
                            out.flush();
                        }
                        pw.println(
                                "El respaldo de la base de datos principal se gener con xito como archivo .dump dentro de este directurio");
                        pw.flush();
                    } else {
                        if (out != null) {
                            out.println("RESPUESTA PG_DUMP: " + RES + "<br>");
                            out.flush();
                        }
                        pw.println("RESPUESTA PG_DUMP: " + RES);
                        pw.flush();
                    }
                }
                //////////////////////////////////////////
                if (out != null) {
                    out.println("FINALIZANDO RESPALDO DE LA BASE DE DATOS: FORSETI_ADMIN "
                            + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                    out.flush();
                }
                pw.println("FINALIZANDO RESPALDO DE LA BASE DE DATOS: FORSETI_ADMIN "
                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.flush();
            } catch (Throwable e) {
                if (out != null) {
                    out.println("ERROR Throwable:<br>");
                    e.printStackTrace(out);
                    out.flush();
                }
                pw.println("ERROR Throwable:");
                e.printStackTrace(pw);
                pw.flush();
            }

            JBDSSet set = new JBDSSet(null);
            set.ConCat(true);
            set.m_OrderBy = "ID_BD ASC";
            set.Open();

            for (int i = 0; i < set.getNumRows(); i++) {
                if (!set.getAbsRow(i).getSU().equals("3")) // La base de datos esta corrupta, se debe eliminar
                {
                    out.println("La siguiente base de datos esta corrupta y se debe eliminar: "
                            + set.getAbsRow(i).getNombre() + "<br>");
                    out.flush();
                    pw.println("La siguiente base de datos esta corrupta y se debe eliminar: "
                            + set.getAbsRow(i).getNombre());
                    pw.flush();
                    continue;
                } else
                    respaldarEmpresa(set, i, fecha, out, pw);
            }
            if (out != null) {
                out.println(
                        "Generando el archivo zip... Esto puede tardar demasiado tiempo, hay que ser pacientes<br>");
                out.flush();
            }
            pw.println("Generando el archivo zip...");
            pw.flush();
            JZipUnZipUtil azip = new JZipUnZipUtil();
            azip.zipFolder(respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"),
                    respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".zip");
            if (out != null) {
                out.println("Eliminando carpeta de respaldo...<br>");
                out.flush();
            }
            pw.println("Eliminando carpeta de respaldo...");
            pw.flush();
            //Borra los archivos del respaldo
            File dirbd = new File(respaldos + "/FORSETI_ADMIN-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm"));
            File[] currList;
            Stack<File> stack = new Stack<File>();
            stack.push(dirbd);
            while (!stack.isEmpty()) {
                if (stack.lastElement().isDirectory()) {
                    currList = stack.lastElement().listFiles();
                    if (currList.length > 0) {
                        for (File curr : currList) {
                            stack.push(curr);
                        }
                    } else {
                        stack.pop().delete();
                    }
                } else {
                    stack.pop().delete();
                }
            }
            if (out != null) {
                out.println("--------------- FIN DEL RESPALDO " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss")
                        + " ---------------<br>");
                out.flush();
            }
            pw.println("--------------- FIN DEL RESPALDO " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss")
                    + " ---------------");
            pw.flush();
            pw.close();

        } catch (IOException e) {
            if (out != null) {
                out.println("OCURRIERON ERRORES DE IOException<br>");
                e.printStackTrace(out);
                out.flush();
            }
            System.out.println("OCURRIERON ERRORES DE IOException<br>");
            e.printStackTrace(System.out);

        } catch (Exception e) {
            if (out != null) {
                out.println("OCURRIERON ERRORES DE Exception<br>");
                e.printStackTrace(out);
                out.flush();
            }
            System.out.println("OCURRIERON ERRORES DE Exception<br>");
            e.printStackTrace(System.out);

        }

    }

    public synchronized void actualizarServidor(PrintWriter out) {
        MutableBoolean reiniciarServ = new MutableBoolean(false);
        float version = -1F; // la version actual
        int revision = 0;
        float versiondisp = -1F;
        int revisiondisp = 0;

        //String sversion = "";
        String dir_act = "/usr/local/forseti/act";

        JAdmVariablesSet set = new JAdmVariablesSet(null);
        set.ConCat(true);
        set.m_Where = "ID_Variable = 'VERSION'";
        set.Open();

        version = set.getAbsRow(0).getVDecimal();
        revision = set.getAbsRow(0).getVEntero();

        JFsiScript sc = new JFsiScript();
        sc.setVerbose(true);
        String CONTENT;

        Calendar fecha = GregorianCalendar.getInstance();
        try {
            FileWriter filewri = new FileWriter(
                    "/usr/local/forseti/log/ACT-" + JUtil.obtFechaTxt(fecha, "yyyy-MM-dd-HH-mm") + ".log", true);
            PrintWriter pw = new PrintWriter(filewri);
            try {
                pw.println("----------------------------------------------------------------------------");
                pw.println("             ACTUALIZACION DEL SERVIDOR: " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.println("----------------------------------------------------------------------------");

                if (actualizar.equals("NC")) {
                    if (out != null) {
                        out.println(
                                "PRECAUCION: La variable ACTUALIZAR (url de descarga de actualizaciones) no est definida... No se puede actualizar<br>");
                        out.flush();
                    }
                    pw.println(
                            "PRECAUCION: La variable ACTUALIZAR (url de descarga de actualizaciones) no est definida... No se puede actualizar");
                    pw.flush();
                    return;
                }

                if (out != null) {
                    out.println("Obteniendo indice de actualizacion desde: " + actualizar + "<br>");
                    out.flush();
                }
                pw.println("Obteniendo indice de actualizacion desde: " + actualizar);
                pw.flush();

                CONTENT = "wget -O " + dir_act + "/indice.si " + actualizar + "/indice.si";
                sc.setContent(CONTENT);
                //System.out.println(CONTENT);
                sc.executeCommand();
                pw.println(sc.getError());
                if (out != null) {
                    out.println("FINALIZANDO DESCARGA DEL INDICE: " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss")
                            + "<br>");
                    out.println(
                            "------------------------------------------------------------------------------<br>");
                    out.flush();
                }
                pw.println("FINALIZANDO DESCARGA DEL INDICE: " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                pw.println("------------------------------------------------------------------------------");
                pw.flush();

                FileReader file = new FileReader(dir_act + "/indice.si");
                BufferedReader buff = new BufferedReader(file);
                boolean eof = false;
                while (!eof) {
                    String line = buff.readLine();
                    if (line == null)
                        eof = true;
                    else {
                        try {
                            boolean descargar = false;
                            StringTokenizer st = new StringTokenizer(line, "|");
                            String key = st.nextToken();
                            String value = st.nextToken();
                            try {
                                versiondisp = Float.parseFloat(key);
                            } catch (NumberFormatException e) {
                                versiondisp = -2F;
                            }
                            ;
                            try {
                                revisiondisp = Integer.parseInt(value);
                            } catch (NumberFormatException e) {
                                revisiondisp = -2;
                            }
                            ;

                            if (version > versiondisp)
                                continue;
                            else // Nuevas versiones o revisiones disponibles
                            {
                                if (version == versiondisp) //la misma version, checa la revision
                                {
                                    if (revision >= revisiondisp)
                                        continue;
                                    else //revision menor a la disponible
                                    {
                                        File status = new File(dir_act + "/act-" + versiondisp + "." + revisiondisp
                                                + "/status_log");
                                        if (!status.exists()) {
                                            if (out != null) {
                                                out.println("Descarga de revisin disponible: " + versiondisp + "."
                                                        + revisiondisp + " "
                                                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                                                out.flush();
                                            }
                                            pw.println("Descarga de revisin disponible: " + versiondisp + "."
                                                    + revisiondisp + " "
                                                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                                            pw.flush();
                                            descargar = true;
                                        }
                                    }
                                } else //version menor a las disponibles
                                {
                                    File status = new File(
                                            dir_act + "/act-" + versiondisp + "." + revisiondisp + "/status_log");
                                    if (!status.exists()) {
                                        if (out != null) {
                                            out.println("Descarga de versin disponible: " + versiondisp + "."
                                                    + revisiondisp + " " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss")
                                                    + "<br>");
                                            out.flush();
                                        }
                                        pw.println("Descarga de versin disponible: " + versiondisp + "."
                                                + revisiondisp + " " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                                        pw.flush();
                                        descargar = true;
                                    }
                                }
                            }
                            //Si se debe descargar.... lo hace
                            if (descargar) {
                                CONTENT = "wget -O " + dir_act + "/act-" + versiondisp + "." + revisiondisp
                                        + ".zip " + actualizar + "/act-" + versiondisp + "." + revisiondisp
                                        + ".zip";
                                sc.setContent(CONTENT);
                                //System.out.println(CONTENT);
                                sc.executeCommand();
                                pw.println(sc.getError());
                                if (out != null) {
                                    out.println("Desempaquetando......<br>");
                                    out.flush();
                                }
                                pw.println("Desempaquetando......");
                                pw.flush();
                                desempaquetarActualizacion(
                                        dir_act + "/act-" + versiondisp + "." + revisiondisp + ".zip",
                                        dir_act + "/act-" + versiondisp + "." + revisiondisp + "/", pw, out);
                            }
                        } catch (NoSuchElementException e) {
                            continue;
                        }

                    }
                }
                buff.close();
                file.close();
                buff = null;
                file = null;
                //Ahora ya tiene las actualizaciones descargadas, y desempaquetadas procede a instalarlas
                //System.out.println("1");
                file = new FileReader(dir_act + "/indice.si");
                buff = new BufferedReader(file);
                eof = false;
                while (!eof) {
                    String line = buff.readLine();
                    if (line == null)
                        eof = true;
                    else {
                        try {
                            boolean bActualizar = false;
                            StringTokenizer st = new StringTokenizer(line, "|");
                            String key = st.nextToken();
                            String value = st.nextToken();
                            try {
                                versiondisp = Float.parseFloat(key);
                            } catch (NumberFormatException e) {
                                versiondisp = -2F;
                            }
                            ;
                            try {
                                revisiondisp = Integer.parseInt(value);
                            } catch (NumberFormatException e) {
                                revisiondisp = -2;
                            }
                            ;
                            //System.out.println("ACTUALIZACION DISP: " + versiondisp + "." + revisiondisp + " " + version + "." + revision);   
                            if (version > versiondisp)
                                continue;
                            else // Nuevas versiones o revisiones disponibles
                            {
                                if (version == versiondisp) //la misma version, checa la revision
                                {
                                    if (revision >= revisiondisp)
                                        continue;
                                    else //revision menor a la disponible
                                    {
                                        //System.out.println("OK procede...");
                                        File status = new File(dir_act + "/act-" + versiondisp + "." + revisiondisp
                                                + "/status_log");
                                        if (status.exists()) {
                                            if (out != null) {
                                                out.println("Actualizacin de revisin: " + versiondisp + "."
                                                        + revisiondisp + " "
                                                        + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
                                                out.flush();
                                            }
                                            pw.println("Actualizacin de revisin: " + versiondisp + "."
                                                    + revisiondisp + " "
                                                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                                            pw.flush();
                                            bActualizar = true;
                                        }
                                    }
                                } else //version menor a las disponibles
                                {
                                    File status = new File(
                                            dir_act + "/act-" + versiondisp + "." + revisiondisp + "/status_log");
                                    if (status.exists()) {
                                        if (out != null) {
                                            out.println("Actualizacin de versin: " + versiondisp + "."
                                                    + revisiondisp + " " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss")
                                                    + "<br>");
                                            out.flush();
                                        }
                                        pw.println("Actualizacion de version: " + versiondisp + "." + revisiondisp
                                                + " " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
                                        pw.flush();
                                        bActualizar = true;
                                    }
                                }
                            }
                            //Si se debe actualizar.... lo hace
                            if (bActualizar) {
                                CONTENT = "wget -O " + dir_act + "/act-" + versiondisp + "." + revisiondisp
                                        + ".zip " + actualizar + "/act-" + versiondisp + "." + revisiondisp
                                        + ".zip";
                                instalarActualizacion(dir_act + "/act-" + versiondisp + "." + revisiondisp + "/",
                                        versiondisp, revisiondisp, version, revision, pw, reiniciarServ, out);
                            }
                        } catch (NoSuchElementException e) {
                            continue;
                        }

                    }
                }
                buff.close();
                file.close();
                //System.out.println("2");
                if (out != null) {
                    if (reiniciarServ.booleanValue())
                        out.println(
                                "Se han descargado y actualizado el servidor. Este servidor se ha reiniciado, por lo tanto, todas las sesiones abiertas se han cancelado. Es necesario volver a registrarse.<br>");
                    else
                        out.println(
                                "Se han descargado y actualizado el servidor. No fue necesario reiniciar el servidor.<br>");
                    out.flush();
                }
                if (reiniciarServ.booleanValue())
                    pw.println(
                            "Se han descargado y actualizado el servidor. Este servidor se ha reiniciado, por lo tanto, todas las sesiones abiertas se han cancelado. Es necesario volver a registrarse.");
                else
                    pw.println(
                            "Se han descargado y actualizado el servidor. No fue necesario reiniciar el servidor.");
                out.flush();

            } catch (IOException e) {
                if (out != null) {
                    out.println("ERROR de IOException<br>");
                    out.flush();
                    e.printStackTrace(out);
                }
                pw.println("ERROR de IOException: ");
                pw.flush();
                e.printStackTrace(pw);
            } catch (Exception e1) {
                if (out != null) {
                    out.println("ERROR de Exception<br>");
                    out.flush();
                    e1.printStackTrace(out);
                }
                pw.println("ERROR de Exception: ");
                pw.flush();
                e1.printStackTrace(pw);
            }
            if (out != null) {
                out.println(
                        "<br>----------------------------- FIN DE LA ACTUALIZACION ----------------------------------");
                out.flush();
            }
            pw.println("----------------------------- FIN DE LA ACTUALIZACION ----------------------------------");
            pw.flush();
            pw.close();
        } catch (IOException e) {
            if (out != null) {
                out.println("OCURRIERON ERRORES AL ABRIR O COPIAR ARCHIVOS<br>");
                out.flush();
                e.printStackTrace(out);
            }
        }
    }

    private void instalarActualizacion(String folderact, float versiondisp, int revisiondisp, float version,
            int revision, PrintWriter pw, MutableBoolean reiniciarServidor, PrintWriter out) throws Exception {
        if (out != null) {
            out.println("COMENZANDO LA ACTUALIZACION DE BASES DE DATOS " + versiondisp + "." + revisiondisp + ": "
                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
            out.println("------------------------------------------------------------------------------<br>");
            out.flush();
        }
        pw.println("COMENZANDO LA ACTUALIZACION DE BASES DE DATOS " + versiondisp + "." + revisiondisp + ": "
                + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
        pw.println("------------------------------------------------------------------------------");
        pw.flush();

        FileReader file = new FileReader(folderact + "status_log");
        BufferedReader buff = new BufferedReader(file);
        boolean eof = false;
        Map<String, String> map = new HashMap<String, String>();
        Vector<String> actbd_sql = new Vector<String>();
        Vector<String> actfsi_sql = new Vector<String>();
        while (!eof) {
            String line = buff.readLine();
            if (line == null)
                eof = true;
            else {
                try {
                    StringTokenizer st = new StringTokenizer(line, "=");
                    String key = st.nextToken();
                    String value = st.nextToken();
                    map.put(key, value);
                } catch (NoSuchElementException e) {
                    continue;
                }
            }
        }
        buff.close();
        file.close();

        //ya tenemos el status_log en memoria, ahora lo utilizamos como base para la actualizacion
        JFsiScript sc = new JFsiScript();
        sc.setVerbose(true);
        String ERROR = "";
        String dirfsi = "/usr/local/forseti";
        if (map.get("STATUS").equals("ACTBD")) // significa que no ha hecho nada, o que no se completo la actulizacion anterior
        {
            JBDSSet set = new JBDSSet(null);
            set.ConCat(true);
            set.m_Where = "ID_BD >= " + map.get("BD") + " and SU = '3'";
            set.m_OrderBy = "ID_BD ASC";
            set.Open();

            for (int i = 0; i < set.getNumRows(); i++) {
                //verifica que la base de datos a actualizar, no sea mas antigua que las actuales en este servidor
                //Esto pudiera suceder porque se acaba de restaurar una base de datos que habia sido respaldada antes
                //de la ultima actualizacion del servidor
                JAdmVariablesSet var = new JAdmVariablesSet(null);
                var.setBD(set.getAbsRow(i).getNombre());
                var.ConCat(3);
                var.m_Where = "ID_Variable = 'VERSION'";
                var.Open();
                //pw.println("SQL: " + set.getAbsRow(i).getNombre() + " " + var.getSQL());
                //pw.println("TOTAL: " + var.getNumRows());
                float varversion = var.getAbsRow(0).getVDecimal();
                int varrevision = var.getAbsRow(0).getVEntero();
                if (varversion < version || (varversion == version && varrevision < revision)) {
                    if (out != null) {
                        out.println(
                                "LA BASE DE DATOS ESTA DESFASADA EN VERSION O REVISION Y NO SE PUEDE ACTUALIZAR: "
                                        + set.getAbsRow(i).getNombre() + ":" + varversion + "." + varrevision
                                        + " --- " + versiondisp + "." + revisiondisp + "<br>");
                        out.println(
                                "ESTO PUEDE SER DEBIDO A QUE SE HA RESTAURADO UNA BASE DE DATOS QUE HABIA SIDO<br>");
                        out.println(
                                "RESPALDADA ANTES DE LA ULTIMA ACTUALIZACION DEL SERVIDOR... INTENTA POR ACTUALIZACION DE EMPRESAS DESFASADAS<br>");
                        out.println(
                                "-------------------------------------------------------------------------------------------------------------------<br>");
                        out.flush();
                    }
                    pw.println("LA BASE DE DATOS ESTA DESFASADA EN VERSION O REVISION Y NO SE PUEDE ACTUALIZAR: "
                            + set.getAbsRow(i).getNombre() + ":" + varversion + "." + varrevision + " --- "
                            + versiondisp + "." + revisiondisp);
                    pw.println("ESTO PUEDE SER DEBIDO A QUE SE HA RESTAURADO UNA BASE DE DATOS QUE HABIA SIDO");
                    pw.println(
                            "RESPALDADA ANTES DE LA ULTIMA ACTUALIZACION DEL SERVIDOR... INTENTA POR ACTUALIZACION DE EMPRESAS DESFASADAS");
                    pw.println(
                            "-------------------------------------------------------------------------------------------------------------------");
                    pw.flush();
                    continue;
                }

                if (out != null) {
                    out.println("Actualizando BD :" + set.getAbsRow(i).getNombre() + "<br>");
                    out.flush();
                }
                pw.println("Actualizando BD :" + set.getAbsRow(i).getNombre());
                pw.flush();

                if (map.get("PUNTO").equals("NC")) // nada actalizado a esta base de datos, comienza por los archivos
                {
                    File dir = new File(folderact + "emp");
                    if (dir.exists()) {
                        if (out != null) {
                            out.println("Grabando los archivos del sistema para BD: " + set.getAbsRow(i).getNombre()
                                    + "<br>");
                            out.flush();
                        }
                        pw.println("Grabando los archivos del sistema para BD: " + set.getAbsRow(i).getNombre());
                        pw.flush();
                        String CONTENT = "rsync -av --stats " + folderact + "emp/ " + dirfsi + "/emp/"
                                + set.getAbsRow(i).getNombre().substring(6);
                        sc.setContent(CONTENT);
                        pw.println(CONTENT);
                        String RES = sc.executeCommand();
                        ERROR += sc.getError();
                        if (!ERROR.equals("")) {
                            //System.out.println(ERROR);
                            if (out != null) {
                                out.println(ERROR + "<br>");
                                out.flush();
                            }
                            pw.println(ERROR);
                            pw.flush();
                            return;
                        } else {
                            pw.println(RES);
                            pw.flush();
                        }
                    }
                    map.put("PUNTO", "ARCHIVOS");
                    File f = new File(folderact + "status_log");
                    FileWriter fsl = new FileWriter(f);
                    fsl.write("STATUS=ACTBD\nBD=" + set.getAbsRow(i).getID_BD() + "\nPUNTO=ARCHIVOS");
                    fsl.close();

                    pw.println("-----------------------------------------------------------------------------");
                    pw.flush();
                }

                if (map.get("PUNTO").equals("ARCHIVOS")) // archivos actualizados, ahora la estructura de la bd
                {
                    File sql = new File(folderact + "actbd.sql");
                    if (sql.exists()) {
                        //////////////////////////////////////////////////////////////////////////////////////////////////
                        if (actbd_sql.size() == 0) {
                            FileReader filebas = new FileReader(folderact + "actbd.sql");
                            BufferedReader buffbas = new BufferedReader(filebas);
                            boolean eofbas = false;
                            String strbas = "";

                            while (!eofbas) {
                                String linebas = buffbas.readLine();
                                if (linebas == null)
                                    eofbas = true;
                                else {
                                    if (linebas.indexOf("--@FIN_BLOQUE") == -1)
                                        strbas += linebas + "\n";
                                    else {
                                        actbd_sql.addElement(strbas);
                                        strbas = "";
                                    }
                                }
                            }
                            buffbas.close();
                            filebas.close();
                        }
                        if (out != null) {
                            out.println(
                                    "Executando estructura SQL para BD: " + set.getAbsRow(i).getNombre() + "<br>");
                            out.flush();
                        }
                        pw.println("Executando estructura SQL para BD: " + set.getAbsRow(i).getNombre());
                        pw.flush();
                        Connection con = JAccesoBD.getConexion(set.getAbsRow(i).getNombre());
                        con.setAutoCommit(false);
                        Statement s = con.createStatement();
                        for (int j = 0; j < actbd_sql.size(); j++) {
                            String actbdblq_sql = JUtil.replace(actbd_sql.get(j), "[[owner]]",
                                    set.getAbsRow(i).getUsuario());
                            pw.println(actbdblq_sql + "\n");
                            pw.flush();
                            s.executeUpdate(actbdblq_sql);
                        }
                        String varbd_sql = "UPDATE TBL_VARIABLES\n" + "SET VDecimal = '" + versiondisp
                                + "', VEntero = '" + revisiondisp + "', VAlfanumerico = '" + versiondisp + "."
                                + revisiondisp + "'\n" + "WHERE ID_Variable = 'VERSION';";
                        //"REASSIGN OWNED BY forseti TO " + set.getAbsRow(i).getUsuario() + ";"; 

                        pw.println(varbd_sql + "\n");
                        pw.flush();
                        s.executeUpdate(varbd_sql);
                        con.commit();
                        s.close();
                        con.close();
                        ////////////////////////////////////////////////////////////////////////////////////////////////
                    } else {
                        Connection con = JAccesoBD.getConexion(set.getAbsRow(i).getNombre());
                        con.setAutoCommit(false);
                        Statement s = con.createStatement();
                        String varbd_sql = "UPDATE TBL_VARIABLES\n" + "SET VDecimal = '" + versiondisp
                                + "', VEntero = '" + revisiondisp + "', VAlfanumerico = '" + versiondisp + "."
                                + revisiondisp + "'\n" + "WHERE ID_Variable = 'VERSION';";
                        pw.println(varbd_sql + "\n");
                        pw.flush();
                        s.executeUpdate(varbd_sql);
                        con.commit();
                        s.close();
                        con.close();
                    }
                    map.put("PUNTO", "ESTRUCTURA");
                    File f = new File(folderact + "status_log");
                    FileWriter fsl = new FileWriter(f);
                    fsl.write("STATUS=ACTBD\nBD=" + set.getAbsRow(i).getID_BD() + "\nPUNTO=ESTRUCTURA");
                    fsl.close();

                }
                //////////////////////////////////////////////////////////////////////
                if (map.get("PUNTO").equals("ESTRUCTURA")) // Ahora los mensajes de esta bd los actualiza
                {
                    File msj = new File(folderact + "bin/.forseti_es");
                    if (msj.exists()) {
                        FileReader filemsj = new FileReader(folderact + "bin/.forseti_es");
                        BufferedReader buffmsj = new BufferedReader(filemsj);
                        boolean eofmsj = false;
                        if (out != null) {
                            out.println("Executando mensajes para " + set.getAbsRow(i).getNombre() + "<br>");
                            out.flush();
                        }
                        pw.println("Executando mensajes para " + set.getAbsRow(i).getNombre());
                        pw.flush();
                        Connection con = JAccesoBD.getConexion(set.getAbsRow(i).getNombre());
                        Statement s = con.createStatement();
                        String varmsj_sql = "TRUNCATE TABLE TBL_MSJ;";
                        pw.println(varmsj_sql + "\n");
                        pw.flush();
                        s.executeUpdate(varmsj_sql);

                        while (!eofmsj) {
                            String line = buffmsj.readLine();
                            if (line == null)
                                eofmsj = true;
                            else {
                                if (line.equals("__INIT")) {
                                    String alc = "", mod = "", sub = "", elm = "", msj1 = "", msj2 = "", msj3 = "",
                                            msj4 = "", msj5 = "";
                                    for (int im = 1; im <= 9; im++) {
                                        line = buffmsj.readLine();
                                        switch (im) {
                                        case 1:
                                            msj1 = "'" + line + "'";
                                            break;
                                        case 2:
                                            msj2 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                            break;
                                        case 3:
                                            msj3 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                            break;
                                        case 4:
                                            msj4 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                            break;
                                        case 5:
                                            msj5 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                            break;
                                        case 6:
                                            alc = "'" + JUtil.p(line) + "'";
                                            break;
                                        case 7:
                                            mod = "'" + JUtil.p(line) + "'";
                                            break;
                                        case 8:
                                            sub = "'" + JUtil.p(line) + "'";
                                            break;
                                        case 9:
                                            elm = "'" + JUtil.p(line) + "'";
                                            break;
                                        }
                                    }

                                    varmsj_sql = "INSERT INTO tbl_msj\nVALUES(";
                                    varmsj_sql += alc + "," + mod + "," + sub + "," + elm + "," + msj1 + "," + msj2
                                            + "," + msj3 + "," + msj4 + "," + msj5 + ");";

                                    pw.println(varmsj_sql + "\n");
                                    pw.flush();
                                    s.executeUpdate(varmsj_sql);

                                }
                            }
                        }

                        s.close();
                        con.close();

                        buffmsj.close();
                        filemsj.close();
                    }
                    map.put("PUNTO", "MSJ");
                    File f = new File(folderact + "status_log");
                    FileWriter fsl = new FileWriter(f);
                    fsl.write("STATUS=ACTBD\nBD=" + set.getAbsRow(i).getID_BD() + "\nPUNTO=MSJ");
                    fsl.close();

                }
                ///////////////////////////////////////////////////////////////////////
                map.put("PUNTO", "NC");
            }
            map.put("STATUS", "ACTFSI");
            map.put("BD", "FSI");
            map.put("PUNTO", "NC");
            File f = new File(folderact + "status_log");
            FileWriter fsl = new FileWriter(f);
            fsl.write("STATUS=ACTFSI\nBD=FSI\nPUNTO=NC");
            fsl.close();
        }

        if (map.get("STATUS").equals("ACTFSI")) //Significa que las bases de datos ya estan actualizadas, y falta FORSETI_ADMIN
        {
            if (map.get("PUNTO").equals("NC")) // nada actalizado a esta base de datos, comienza por los archivos
            {
                if (out != null) {
                    out.println(
                            "--------------------------------- FORSETI_ADMIN -------------------------------------------<br>");
                    out.flush();
                }
                pw.println(
                        "--------------------------------- FORSETI_ADMIN -------------------------------------------");
                pw.flush();

                File dir = new File(folderact + "act");
                if (dir.exists()) {
                    if (out != null) {
                        out.println("Grabando los archivos act...<br>");
                        out.flush();
                    }
                    pw.println("Grabando los archivos act...");
                    pw.flush();
                    String CONTENT = "rsync -av --stats " + folderact + "act/ " + dirfsi + "/act";
                    sc.setContent(CONTENT);
                    pw.println(CONTENT);
                    String RES = sc.executeCommand();
                    ERROR = sc.getError();
                    if (!ERROR.equals("")) {
                        if (out != null) {
                            out.println(ERROR + "<br>");
                            out.flush();
                        }
                        pw.println(ERROR);
                        pw.flush();
                        return;
                    } else {
                        pw.println(RES);
                        pw.flush();
                    }
                }
                dir = new File(folderact + "bin");
                if (dir.exists()) {
                    if (out != null) {
                        out.println("Grabando los archivos bin...<br>");
                        out.flush();
                    }
                    pw.println("Grabando los archivos bin...");
                    pw.flush();
                    String CONTENT = "rsync -av --stats " + folderact + "bin/ " + dirfsi + "/bin";
                    sc.setContent(CONTENT);
                    pw.println(CONTENT);
                    String RES = sc.executeCommand();
                    ERROR = sc.getError();
                    if (!ERROR.equals("")) {
                        if (out != null) {
                            out.println(ERROR + "<br>");
                            out.flush();
                        }
                        pw.println(ERROR);
                        pw.flush();
                        return;
                    } else {
                        pw.println(RES);
                        pw.flush();
                    }
                }
                dir = new File(folderact + "pac");
                if (dir.exists()) {
                    if (out != null) {
                        out.println("Grabando los archivos pac...<br>");
                        out.flush();
                    }
                    pw.println("Grabando los archivos pac...");
                    pw.flush();
                    String CONTENT = "rsync -av --stats " + folderact + "pac/ " + dirfsi + "/pac";
                    sc.setContent(CONTENT);
                    pw.println(CONTENT);
                    String RES = sc.executeCommand();
                    ERROR = sc.getError();
                    if (!ERROR.equals("")) {
                        if (out != null) {
                            out.println(ERROR + "<br>");
                            out.flush();
                        }
                        pw.println(ERROR);
                        pw.flush();
                        return;
                    } else {
                        pw.println(RES);
                        pw.flush();
                    }
                }
                dir = new File(folderact + "rec");
                if (dir.exists()) {
                    if (out != null) {
                        out.println("Grabando los archivos rec...<br>");
                        out.flush();
                    }
                    pw.println("Grabando los archivos rec...");
                    pw.flush();
                    String CONTENT = "rsync -av --stats " + folderact + "rec/ " + dirfsi + "/rec";
                    sc.setContent(CONTENT);
                    pw.println(CONTENT);
                    String RES = sc.executeCommand();
                    ERROR = sc.getError();
                    if (!ERROR.equals("")) {
                        if (out != null) {
                            out.println(ERROR + "<br>");
                            out.flush();
                        }
                        pw.println(ERROR);
                        pw.flush();
                        return;
                    } else {
                        pw.println(RES);
                        pw.flush();
                    }
                }
                map.put("PUNTO", "ARCHIVOS");
                File f = new File(folderact + "status_log");
                FileWriter fsl = new FileWriter(f);
                fsl.write("STATUS=ACTFSI\nBD=FSI\nPUNTO=ARCHIVOS");
                fsl.close();
            }

            if (map.get("PUNTO").equals("ARCHIVOS")) // archivos actualizados, ahora la estructura de la bd
            {
                File sql = new File(folderact + "actfsi.sql");
                if (sql.exists()) {
                    //////////////////////////////////////////////////////////////////////////////////////////////////
                    FileReader filebas = new FileReader(folderact + "actfsi.sql");
                    BufferedReader buffbas = new BufferedReader(filebas);
                    boolean eofbas = false;
                    String strbas = "";

                    while (!eofbas) {
                        String linebas = buffbas.readLine();
                        if (linebas == null)
                            eofbas = true;
                        else {
                            if (linebas.indexOf("--@FIN_BLOQUE") == -1)
                                strbas += linebas + "\n";
                            else {
                                actfsi_sql.addElement(strbas);
                                strbas = "";
                            }
                        }
                    }
                    buffbas.close();
                    filebas.close();

                    if (out != null) {
                        out.println("Executando estructura SQL para FORSETI_ADMIN<br>");
                        out.flush();
                    }
                    pw.println("Executando estructura SQL para FORSETI_ADMIN");
                    pw.flush();
                    Connection con = JAccesoBD.getConexion();
                    con.setAutoCommit(false);
                    Statement s = con.createStatement();
                    for (int j = 0; j < actfsi_sql.size(); j++) {
                        String actfsiblq_sql = actfsi_sql.get(j);
                        pw.println(actfsiblq_sql + "\n");
                        pw.flush();
                        s.executeUpdate(actfsiblq_sql);
                    }
                    String varfsi_sql = "UPDATE TBL_VARIABLES\n" + "SET VDecimal = '" + versiondisp
                            + "', VEntero = '" + revisiondisp + "', VAlfanumerico = '" + versiondisp + "."
                            + revisiondisp + "'\n" + "WHERE ID_Variable = 'VERSION';";
                    pw.println(varfsi_sql + "\n");
                    pw.flush();
                    s.executeUpdate(varfsi_sql);
                    con.commit();
                    s.close();
                    con.close();
                } else {
                    Connection con = JAccesoBD.getConexion();
                    con.setAutoCommit(false);
                    Statement s = con.createStatement();
                    String varfsi_sql = "UPDATE TBL_VARIABLES\n" + "SET VDecimal = '" + versiondisp
                            + "', VEntero = '" + revisiondisp + "', VAlfanumerico = '" + versiondisp + "."
                            + revisiondisp + "'\n" + "WHERE ID_Variable = 'VERSION';";
                    pw.println(varfsi_sql + "\n");
                    pw.flush();
                    s.executeUpdate(varfsi_sql);
                    con.commit();
                    s.close();
                    con.close();
                }
                map.put("PUNTO", "ESTRUCTURA");
                File f = new File(folderact + "status_log");
                FileWriter fsl = new FileWriter(f);
                fsl.write("STATUS=ACTFSI\nBD=FSI\nPUNTO=ESTRUCTURA");
                fsl.close();

            }

            if (map.get("PUNTO").equals("ESTRUCTURA")) // Ahora los mensajes los actualiza
            {
                File msj = new File(folderact + "bin/.forseti_es");
                if (msj.exists()) {
                    FileReader filemsj = new FileReader(folderact + "bin/.forseti_es");
                    BufferedReader buffmsj = new BufferedReader(filemsj);
                    boolean eofmsj = false;
                    if (out != null) {
                        out.println("Executando mensajes para FORSETI_ADMIN<br>");
                        out.flush();
                    }
                    pw.println("Executando mensajes para FORSETI_ADMIN");
                    pw.flush();
                    Connection con = JAccesoBD.getConexion();
                    Statement s = con.createStatement();
                    String varmsj_sql = "TRUNCATE TABLE TBL_MSJ;";
                    pw.println(varmsj_sql + "\n");
                    pw.flush();
                    s.executeUpdate(varmsj_sql);

                    while (!eofmsj) {
                        String line = buffmsj.readLine();
                        if (line == null)
                            eofmsj = true;
                        else {
                            if (line.equals("__INIT")) {
                                String alc = "", mod = "", sub = "", elm = "", msj1 = "", msj2 = "", msj3 = "",
                                        msj4 = "", msj5 = "";
                                for (int i = 1; i <= 9; i++) {
                                    line = buffmsj.readLine();
                                    switch (i) {
                                    case 1:
                                        msj1 = "'" + line + "'";
                                        break;
                                    case 2:
                                        msj2 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                        break;
                                    case 3:
                                        msj3 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                        break;
                                    case 4:
                                        msj4 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                        break;
                                    case 5:
                                        msj5 = (line.equals("null") ? "null" : "'" + JUtil.p(line) + "'");
                                        break;
                                    case 6:
                                        alc = "'" + JUtil.p(line) + "'";
                                        break;
                                    case 7:
                                        mod = "'" + JUtil.p(line) + "'";
                                        break;
                                    case 8:
                                        sub = "'" + JUtil.p(line) + "'";
                                        break;
                                    case 9:
                                        elm = "'" + JUtil.p(line) + "'";
                                        break;
                                    }
                                }

                                varmsj_sql = "INSERT INTO tbl_msj\nVALUES(";
                                varmsj_sql += alc + "," + mod + "," + sub + "," + elm + "," + msj1 + "," + msj2
                                        + "," + msj3 + "," + msj4 + "," + msj5 + ");";

                                pw.println(varmsj_sql + "\n");
                                pw.flush();
                                s.executeUpdate(varmsj_sql);

                            }
                        }
                    }

                    s.close();
                    con.close();

                    buffmsj.close();
                    filemsj.close();
                }
                File f = new File(folderact + "status_log");
                FileWriter fsl = new FileWriter(f);
                fsl.write("STATUS=ACTFSI\nBD=FSI\nPUNTO=MSJ");
                fsl.close();
            }

            if (map.get("PUNTO").equals("MSJ")) // mensajes actualizados, ahora el archivo ROOT
            {
                File root = new File(folderact + "ROOT.war");
                if (root.exists()) {
                    if (out != null) {
                        out.println("Grabando el archivo ROOT para tomcat...<br>");
                        out.flush();
                    }
                    pw.println("Grabando el archivo ROOT para tomcat...");
                    pw.flush();
                    String CONTENT = "rsync -av --stats " + folderact + "ROOT.war " + tomcat + "/webapps";
                    sc.setContent(CONTENT);
                    pw.println(CONTENT);
                    String RES = sc.executeCommand();
                    ERROR = sc.getError();
                    if (!ERROR.equals("")) {
                        if (out != null) {
                            out.println(ERROR + "<br>");
                            out.flush();
                        }
                        pw.println(ERROR);
                        pw.flush();
                        return;
                    } else {
                        pw.println(RES);
                        pw.flush();
                    }
                }
                map.put("PUNTO", "ROOT");
                File f = new File(folderact + "status_log");
                FileWriter fsl = new FileWriter(f);
                fsl.write("STATUS=OK\nBD=FSI\nPUNTO=ROOT");
                fsl.close();
                reiniciarServidor.setValue(true);
            }

        }
        if (out != null) {
            out.println("FINALIZADA LA ACTUALIZACION DE BASES DE DATOS: "
                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
            out.println("------------------------------------------------------------------------------<br>");
        }
        pw.println("FINALIZADA LA ACTUALIZACION DE BASES DE DATOS: " + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
        pw.println("------------------------------------------------------------------------------");

    }

    private void desempaquetarActualizacion(String path_zip, String destfolder, PrintWriter pw, PrintWriter out)
            throws IOException {
        JZipUnZipUtil uzapl = new JZipUnZipUtil();
        uzapl.unZipAct(path_zip, destfolder);

        String status_log = "STATUS=ACTBD\nBD=-1\nPUNTO=NC";
        FileWriter fsl = null;
        File file = new File(destfolder + "status_log");
        fsl = new FileWriter(file);
        fsl.write(status_log);
        fsl.close();
        if (out != null) {
            out.println("FINALIZADA LA DESCARGA Y DESEMPAQUETADO DE LA ACTUALIZACION: "
                    + JUtil.obtFechaTxt(new Date(), "HH:mm:ss") + "<br>");
            out.println("------------------------------------------------------------------------------<br>");
            out.flush();
        }
        pw.println("FINALIZADA LA DESCARGA Y DESEMPAQUETADO DE LA ACTUALIZACION: "
                + JUtil.obtFechaTxt(new Date(), "HH:mm:ss"));
        pw.println("------------------------------------------------------------------------------");
        pw.flush();
    }

}