<?php defined('APPPATH') or die('No direct access allowed.');
/**
 * HSDN SME
 *
 * Site Management Engine
 *
 * @package        ELISA
 * @author        HSDN Team
 * @copyright    Copyright (c) 2009-2010, Information Networks Ltd.
 * @link        http://www.hsdn.org
 * @since        Version 1
 */

// ------------------------------------------------------------------------

/**
 * Record model Class
 *
 * @author        HSDN Team
 */
class Record_model
{
    
/*
     * Secured record array
     * @access    private
     */
    
private $record_array = array();

    
/*
     * User-trusted record array
     * @access    private
     */
    
private $user_array = array();

    
/*
     * Secured RR types (in origins)
     * @access    private
     */
    
private $secured_types = array('NS');


    
/**
     * Constructor
     *
     * @access    public
     * @return    void
     */
    
public function __construct()
    {
        
$this->parse Load::model('parse');
        
$this->build Load::model('build');
        
$this->zone Load::model('zone');
    }

    
/**
     * Record file exists
     *
     * @access    public
     * @param    string
     * @return    bool
     */
    
public function exists($file)
    {
        
$filename $this->get_filename($file);

        return 
file_exists($filename);
    }

    
/**
     * Get plain-text records by filename
     *
     * @access    public
     * @param    string
     * @return    string
     */
    
public function get_plain($file)
    {
        if (!
$this->exists($file))
        {
            return 
FALSE;
        }

        if (
$plain $this->read_record($file))
        {
            return 
trim($plain);
        }

        return 
FALSE;
    }

    
/**
     * Get user records by filename
     *
     * @access    public
     * @param    string
     * @return    array
     */
    
public function get_user($file)
    {
        if (!
$this->exists($file))
        {
            return 
FALSE;
        }

        if (
sizeof($this->record_array) != 0)
        {
            return 
$this->user_array;
        }

        if (
$string $this->read_record($file))
        {
            if (
$this->parse_record($string))
            {
                return 
$this->user_array;
            }
        }

        return 
FALSE;
    }

    
/**
     * Get secured records by filename
     *
     * @access    public
     * @param    string
     * @return    array
     */
    
public function get_secured($file)
    {
        if (!
$this->exists($file))
        {
            return 
FALSE;
        }

        if (
sizeof($this->user_array) != 0)
        {
            return 
$this->record_array;
        }

        if (
$string $this->read_record($file))
        {
            if (
$this->parse_record($string))
            {
                return 
$this->record_array;
            }
        }

        return 
FALSE;
    }

    
/**
     * Create record file
     *
     * @access    public
     * @param    string
     * @param    array
     * @return    bool
     */
    
public function create($file$build_array)
    {
        if (
$this->exists($file))
        {
            return 
FALSE;
        }

        if (
$this->build_record($file$build_array))
        {
            return 
TRUE;
        }

        return 
FALSE;
    }

    
/**
     * Delete records
     *
     * @access    public
     * @param    string
     * @return    bool
     */
    
public function delete($file)
    {
        if (!
$this->exists($file))
        {
            return 
FALSE;
        }

        
$filename $this->get_filename($file);

        return @
unlink($filename);
    }

    
/**
     * Insert records to record file
     *
     * @access    public
     * @param    string
     * @param    array
     * @param    array
     * @return    bool
     */
    
public function insert($file$record_array$user_array)
    {
        if (
$record_array === FALSE OR $user_array == FALSE)
        {
            return 
FALSE;
        }

        
$build_array array_merge($record_array$user_array);

        if (
$this->build_record($file$build_array))
        {
            return 
TRUE;
        }

        return 
FALSE;
    }

    
/**
     * Generate variable array
     *
     * @access    public
     * @param    string
     * @param    string
     * @return    array
     */
    
public function gen_variable($name$value)
    {
        return array
        (
            
'variable' => $name
            
'data' => $value
        
);
    }

    
/**
     * Generate resource record array
     *
     * @access    public
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @return    array
     */
    
public function gen_resource($name$type$data$ttl ''$class 'IN')
    {
        return array
        (
            
'name' => $name
            
'ttl' => $ttl
            
'class' => $class
            
'type' => $type
            
'data' => $data
        
);
    }

    
/**
     * Generate SOA RR data array
     *
     * @access    public
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @param    string
     * @return    array
     */
    
public function gen_soa_data($server$person$serial$refresh$retry$expire$ttl)
    {
        return array
        (
            
'server' => $server,
            
'person' => $person,
            
'serial' => $serial,
            
'refresh' => $refresh,
            
'retry' => $retry,
            
'expire' => $expire,
            
'ttl' => $ttl
        
);
    }

    
/**
     * Resize serial number for SOA RR data
     *
     * @access    public
     * @param    int
     * @param    int
     * @return    int
     */
    
public function resize_serial($serial 0$time 0)
    {
        if (
$serial == 0)
        {
            
$serial date('Ymd00');
        }

        if (
strlen($serial) == 10)
        {
            
$time = ($time != 0) ? $time time();
            
$date substr($serial08);
            
$seria floor(substr($serial82));
            
$spec_date date('Ymd'$time);

            if (
$date == $spec_date)
            {
                if (
$seria >= 99)
                {
                    return 
FALSE;
                }

                return 
intval($spec_date.str_repeat('0'strlen($seria)).($seria 1));
            }
            else
            {
                return 
intval($spec_date.'00');
            }
        }

        return 
$serial 1;
    }

    
/**
     * Parse record file
     *
     * @access    private
     * @return    array
     */
    
private function parse_record($string)
    {
        if (
$string === '')
        {
            return 
FALSE;
        }

        if (!
$this->record_array $this->parse->record($string))
        {
            return 
FALSE;
        }

        
$last_origin FALSE;

        foreach (
$this->record_array as $line => $record)
        {
            
// exclude all variables
            
if (isset($record['variable']))
            {
                if (
$record['variable'] == 'ORIGIN')
                {
                    
$last_origin $record['data'];
                }

                continue;
            }

            
// exclude SOA type records
            
if (isset($record['type']) AND $record['type'] == 'SOA')
            {
                continue;
            }

            
// exclude records of secured types and...
            
if (isset($record['name']) AND isset($record['type'])
                AND 
in_array($record['type'], $this->secured_types)

                
// ...the origin records!
                
AND ($record['name'] == '' 
                    
OR $record['name'] == '.' 
                    
OR $record['name'] == '@' 
                    
OR $record['name'] == $last_origin)
                )
            {
                continue;
            }

            
$this->user_array[] = $record;
            unset(
$this->record_array[$line]);
        }

        return 
TRUE;
    }

    
/**
     * Build record file
     *
     * @access    private
     * @return    bool
     */
    
private function build_record($file$build_array)
    {
        
$string $this->build->record($build_array);

        if (
$string AND $this->write_record($file$string))
        {
            return 
TRUE;
        }

        return 
FALSE;
    }

    
/**
     * Read record file
     *
     * @access    private
     * @param    string
     * @return    string
     */
    
private function read_record($file)
    {
        
$filename $this->get_filename($file);

        if (
$string = @file_get_contents($filename))
        {
            return 
$string;
        }

        return 
FALSE;
    }

    
/**
     * Write record file
     *
     * @access    private
     * @param    string
     * @param    string
     * @return    bool
     */
    
private function write_record($file$string)
    {
        if (!
$string)
        {
            return 
FALSE;
        }

        
$filename $this->get_filename($file);

        if (
$fp = @fopen($filename"w"))
        {
            if (@
flock($fpLOCK_EX)) 
            {
                
fwrite($fp$string);
                
flock($fpLOCK_UN);
                
fclose($fp);

                return 
TRUE;
            }
        }

        return 
FALSE;
    }

    
/**
     * Get zone filename
     *
     * @access    private
     * @param    string
     * @return    string
     */
    
private function get_filename($file)
    {
        return 
Load::config('named_path''dns').'/'.$file;
    }
}

/* End of file */