<?php
/*
 * Copyright 2005-2016 OCSInventory-NG/OCSInventory-ocsreports contributors.
 * See the Contributors file for more details about them.
 *
 * This file is part of OCSInventory-NG/OCSInventory-ocsreports.
 *
 * OCSInventory-NG/OCSInventory-ocsreports is free software: you can redistribute
 * it and/or modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 2 of the License,
 * or (at your option) any later version.
 *
 * OCSInventory-NG/OCSInventory-ocsreports 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with OCSInventory-NG/OCSInventory-ocsreports. if not, write to the
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 */

function desactive_mach_serv($list_id, $packid) {
    global $l;
    $id_pack = found_id_pack_serv($packid);
    $sql_desactive = "delete from devices where hardware_id in ";
    $arg_desactive = mysql2_prepare($sql_desactive, array(), $list_id);
    $arg_desactive = mysql2_prepare($arg_desactive['SQL'] . " and name='DOWNLOAD' and IVALUE in ", $arg_desactive['ARG'], $id_pack);
    mysql2_query_secure($arg_desactive['SQL'], $_SESSION['OCS']["writeServer"], $arg_desactive['ARG']);
    addLog($l->g(512), $l->g(876) . $packid . " => " . $list_id);
}

function found_id_pack_serv($packid) {
    $sql_id_pack = "select ID from download_enable where fileid=%s and ( group_id != '' and group_id is not null)";
    $arg = $packid;
    $result = mysql2_query_secure($sql_id_pack, $_SESSION['OCS']["readServer"], $arg);
    while ($id_pack = mysqli_fetch_array($result)) {
        $id_paquets[] = $id_pack['ID'];
    }
    return $id_paquets;
}

//fonction qui permet de savoir
//le nombre de serveur déjà dans un groupe
//et dans lesquels ils se trouvent
function exist_server($list_id) {
    global $l;

    $sql = "SELECT count(hardware_id) c,group_id,name
		  FROM download_servers,hardware
			where hardware.id=download_servers.group_id
			and hardware_id in ";
    $arg = mysql2_prepare($sql, array(), $list_id);
    $res = mysql2_query_secure($arg['SQL'] . " group by group_id ", $_SESSION['OCS']["readServer"], $arg['ARG']);
    $msg = "";
    while ($val = mysqli_fetch_array($res)) {
        $msg .= $val['c'] . " " . $l->g(1135) . " " . $val['name'] . "<br>";
    }
    if ($msg != "") {
        msg_error($l->g(877) . " <br>" . $msg . " " . $l->g(878));
    }
}

// fonction qui permet de supprimer des serveurs
// d'un groupe de redistribution
function remove_list_serv($id_group, $list_id) {
    if (is_array($list_id)) {
        $list_id = implode(",", $list_id);
    }
    $sql_del = "DELETE FROM download_servers WHERE group_id='%s' and hardware_id in ";
    $arg_del = array($id_group);
    $arg = mysql2_prepare($sql_del, $arg_del, $list_id);
    mysql2_query_secure($arg['SQL'], $_SESSION['OCS']["writeServer"], $arg['ARG']);
    $cached = mysqli_affected_rows($_SESSION['OCS']["writeServer"]);
    return $cached;
}

//function for add machine in server's group
function add_mach($id_group, $list_mach) {
    $default_values = look_config_default_values(array('DOWNLOAD_SERVER_URI', 'DOWNLOAD_SERVER_DOCROOT'));
    if (is_array($list_mach)) {
        foreach ($list_mach as $value) {
            $reqCache = "INSERT IGNORE INTO download_servers(hardware_id, url, add_rep,GROUP_ID)
						VALUES (%s,'%s','%s',%s)";
            $argcache = array($value, $default_values['tvalue']['DOWNLOAD_SERVER_URI'], $default_values['tvalue']['DOWNLOAD_SERVER_DOCROOT'], $id_group);
            $cachedRes = mysql2_query_secure($reqCache, $_SESSION['OCS']["writeServer"], $argcache);
        }
    } else {
        $reqCache = "INSERT IGNORE INTO download_servers(hardware_id, url, add_rep,GROUP_ID)
						select id,'%s','%s',%s
					    from hardware where id in ";
        $argCache = array($default_values['tvalue']['DOWNLOAD_SERVER_URI'], $default_values['tvalue']['DOWNLOAD_SERVER_DOCROOT'], $id_group);
        $arg = mysql2_prepare($reqCache, $argCache, $list_mach);
        $cachedRes = mysql2_query_secure($arg['SQL'], $_SESSION['OCS']["writeServer"], $arg['ARG']);
    }
    return mysqli_affected_rows($_SESSION['OCS']["writeServer"]);
}

//function for admin server
function admin_serveur($action, $name_server, $descr, $mach) {
    global $l;
    if ($action == "") {
        //intern problem
        return $l->g(663);
    }
    if (trim($name_server) == "") {
        //name of server is empty
        return $l->g(638);
    }
    if ($mach == "") {
        //no mach selected. group not creat
        return $l->g(665);
    }
    if (is_numeric($name_server)) {
        $idGroupServer = $name_server;
    } else {
        //verification group not have the same name
        $reqGetId = "SELECT id FROM hardware WHERE name='%s'";
        $arg = $name_server;
        $resGetId = mysql2_query_secure($reqGetId, $_SESSION['OCS']["readServer"], $arg);
        if ($valGetId = mysqli_fetch_array($resGetId)) {
            $idGroupServer = $valGetId['id'];
        }
    }
    //if we are in creat new server
    if ($action == 'new_serv') {
        //if the name not exist in the base
        if (!isset($idGroupServer)) {
            $deviceid = '_DOWNLOADGROUP_';
            $sql = "INSERT INTO hardware(deviceid,name,description,lastdate) VALUES( '%s' , '%s', '%s', NOW() )";
            $arg = array($deviceid, $name_server, $descr);
            mysql2_query_secure($sql, $_SESSION['OCS']["writeServer"], $arg);
            //Getting hardware id
            $insertId = mysqli_insert_id($_SESSION['OCS']["writeServer"]);
            exist_server($mach);
            $nb_mach = add_mach($insertId, $mach);
            msg_success($l->g(880) . "<br>" . $nb_mach . " " . $l->g(881));
            return '';
        } else {
            //this name already exists
            return $l->g(621);
        }
    }//if the machines add to the group or the group is replace
    elseif ($action == 'add_serv' || $action == 'replace_serv') {
        if ($action == 'replace_serv') {
            $sql = "DELETE FROM download_servers WHERE GROUP_ID=%s";
            $arg = $idGroupServer;
            mysql2_query_secure($sql, $_SESSION['OCS']["writeServer"], $arg);
        }
        exist_server($mach);
        $nb_mach = add_mach($idGroupServer, $mach);
        msg_success($l->g(879) . "<br>" . $nb_mach . " " . $l->g(881));
        return '';
    } elseif ($action == 'del_serv') {
        $nb_mach = remove_list_serv($idGroupServer, $mach);
        msg_success($nb_mach . " " . $l->g(882));
        return '';
    }
}

//function for insert machine with rules
function insert_with_rules($list_id, $rule_detail, $fileid) {

    if (is_array($list_id)) {
        $list_id_hardware = implode(',', $list_id);
    } else {
        $list_id_hardware = $list_id;
        // only one id selected ? is that a group ?
        $sql_is_group = "select HARDWARE_ID from %s where HARDWARE_ID = %s";
        $arg_is_group = array("groups", $list_id_hardware);
        $res_is_group = mysql2_query_secure($sql_is_group, $_SESSION['OCS']["readServer"], $arg_is_group);
        if(mysqli_num_rows($res_is_group) == 1){
          // then it's a group so get all machines in group
          $sql_group_mach = "select HARDWARE_ID, GROUP_ID from %s where GROUP_ID = %s";
          $arg_group_mach = array("groups_cache",$list_id_hardware);
          $res_group_mach = mysql2_query_secure($sql_group_mach, $_SESSION['OCS']["readServer"], $arg_group_mach);
          $list_id_array = array();
          while ($val_group_mach = mysqli_fetch_array($res_group_mach)){
            $list_id_array[] = $val_group_mach['HARDWARE_ID'];
          }
          $list_id_hardware = implode(',', $list_id_array);
        }
    }

    if ($list_id_hardware == "") {
        return;
    }
    //for servers
    //recherche de tous les hardware_id des servers et des id de download_enable correspondant
    $sql_infoServ = "select server_id,id from download_enable where group_id != ''
								and fileid=%s";
    $arg_infoServ = $fileid;
    $res_infoServ = mysql2_query_secure($sql_infoServ, $_SESSION['OCS']["readServer"], $arg_infoServ);
    //création de la liste des id_hardware des servers et d'un tableau de l'id de download_enable en fonction de l'hardware_id
    while ($val_infoServ = mysqli_fetch_array($res_infoServ)) {
        $list_serverId[$val_infoServ['server_id']] = $val_infoServ['server_id'];
    }

    if ($rule_detail['compto'] == "NAME" || $rule_detail['compto'] == "WORKGROUP" || $rule_detail['compto'] == "USERID") {
        $tablecompto = "hardware";
        $id_server = "ID";
    }

    if ($rule_detail['compto'] == "IPSUBNET" || $rule_detail['compto'] == "IPADDRESS") {
        $tablecompto = "networks";
        $id_server = "HARDWARE_ID";
    }


    $sql_servValues = "select a.%s,a.%s,d.id as id_download_enable from %s a,download_enable d
						 where a.%s in ";

    $arg_servValues = array($rule_detail['compto'], $id_server, $tablecompto, $id_server);
    $arg = mysql2_prepare($sql_servValues, $arg_servValues, $list_serverId);
    $arg['SQL'] .= " and d.server_id=a.%s  and fileid='%s'";
    array_push($arg['ARG'], $id_server);
    array_push($arg['ARG'], $fileid);
    $res_servValues = mysql2_query_secure($arg['SQL'], $_SESSION['OCS']["readServer"], $arg['ARG']);

    while ($val_servValues = mysqli_fetch_array($res_servValues)) {
        $tab_serValues[$val_servValues[$rule_detail['compto']]] = $val_servValues[$id_server];
        $correspond_servers[$val_servValues[$id_server]] = $val_servValues['id_download_enable'];
    }

    //for machines
    if ($rule_detail['cfield'] == "NAME" || $rule_detail['cfield'] == "WORKGROUP" || $rule_detail['cfield'] == "USERID") {
        $tablefield = "hardware";
        $id_mach = "ID";
    }
    if ($rule_detail['cfield'] == "IPSUBNET" || $rule_detail['cfield'] == "IPADDRESS") {
        $tablefield = "networks";
        $id_mach = "HARDWARE_ID";
    }

    $sql_machValue = "select %s,%s from %s where %s in ";
    $arg_machValue = array($rule_detail['cfield'], $id_mach, $tablefield, $id_mach);
    $arg = mysql2_prepare($sql_machValue, $arg_machValue, $list_id_hardware);
    $res_machValue = mysql2_query_secure($arg['SQL'], $_SESSION['OCS']["readServer"], $arg['ARG']);

    while ($val_machValue = mysqli_fetch_array($res_machValue)) {
        if ($rule_detail['op'] == "EGAL") {
            //cas of egal
            if (isset($tab_serValues[$val_machValue[$rule_detail['cfield']]])) {
                $tab_final[$val_machValue[$id_mach]] = $correspond_servers[$tab_serValues[$val_machValue[$rule_detail['cfield']]]];
                $verif_idMach[$val_machValue[$id_mach]] = $val_machValue[$id_mach];
            } else {
                $not_match[$val_machValue[$id_mach]] = $val_machValue[$id_mach];
            }
        } elseif ($rule_detail['op'] == "DIFF") {
            if (!isset($tab_serValues[$val_machValue[$rule_detail['cfield']]])) {
                $tab_final[$val_machValue[$id_mach]] = $correspond_servers[$tab_serValues[$val_machValue[$rule_detail['cfield']]]];
                $verif_idMach[$val_machValue[$id_mach]] = $val_machValue[$id_mach];
            } else {
                $not_match[$val_machValue[$id_mach]] = $val_machValue[$id_mach];
            }
        }
        // ipsubnet or ipaddress rule match for one machine network interface, drop not_match result from other interface of this machine
        if (isset($verif_idMach[$val_machValue[$id_mach]]) && isset($not_match[$val_machValue[$id_mach]])) {
            unset($not_match[$val_machValue[$id_mach]]);
        }
    }
    if (isset($verif_idMach)) {
        $sql_verif = "select d.hardware_id as hardware_id
			  from devices d,download_enable d_e
			  where d.ivalue=d_e.id and fileid=%s
				AND d.HARDWARE_ID in ";
        $arg_verif = array($fileid);
        $arg = mysql2_prepare($sql_verif, $arg_verif, $verif_idMach);
        $arg['SQL'] .= " and d.name='DOWNLOAD'";
        $res_verif = mysql2_query_secure($arg['SQL'], $_SESSION['OCS']["readServer"], $arg['ARG']);
        //recupération des machines en doublon
        while ($val_verif = mysqli_fetch_array($res_verif)) {
            //création du tableau de doublon
            $exist[$val_verif['hardware_id']] = $val_verif['hardware_id'];

            //suppression des doublons
            //unset($tab_final[$val_verif['hardware_id']]);
            //$nb_exist++;
        }
        //suppression des doublons pour remettre le statut a attente de notification
        if ($exist != '')
            desactive_mach_serv(implode(',', $exist), $fileid);
        //insertion en base
        $nb_insert = 0;
        foreach ($tab_final as $key => $value) {
            $query = "INSERT INTO devices(HARDWARE_ID, NAME, IVALUE) VALUES('%s', '%s','%s')";
            $arg = array($key, 'DOWNLOAD', $value);
            mysql2_query_secure($query, $_SESSION['OCS']["writeServer"], $arg);
            $insert[$key] = $value;
            $nb_insert++;
        }
    }

    $not_found = array();
    if (is_array($not_match) && count($not_match) > 0) {
        foreach ($not_match as $key => $value) {
            $not_found[] = $value;
        }
    }

    $already_exist = array();
    if (is_array($exist)) {
        foreach ($exist as $key => $value) {
            if (!isset($insert[$key])) {
                $already_exist[] = $value;
            }
        }
    }

    //retour des erreurs
    $don['not_match'] = $not_found;
    $don['nb_not_match'] = count($not_found);
    $don['exist'] = $already_exist;
    $don['nb_exist'] = count($already_exist);
    $don['nb_insert'] = $nb_insert;
    return $don;
}

?>
