#!/usr/local/bin/tclsh8.6

#
# MX list
#
# Parameters (form or url): none
#   - domain selection
#	(none)
#   - list
#	- domain : domain list
#	- idview: list of view ids
#	- dolist or doprint : output format
#
# History
#   2002/05/25 : pda      : design
#   2002/07/09 : pda      : add nologin
#   2002/10/24 : pda      : use common template file
#   2003/05/13 : pda/jean : use auth base
#   2010/12/10 : pda      : i18n
#   2010/12/26 : pda      : use cgi-dispatch
#   2013/03/21 : pda      : add views
#

#
# Template pages used by this script
#

set conf(page-sel)	admlmx.html
set conf(page-html)	listof.html
set conf(page-latex)	listof.tex

#
# Next actions
# 

set conf(next)		"admlmx"

#
# tabular specification for result
# Columns:
#	- host
#	- priority
#	- MX
#

set conf(tableau) {
    global {
	chars {10 normal}
	columns {45 10 45}
	botbar {yes}
	align {left}
    }
    pattern Title {
	title {yes}
	topbar {yes}
	chars {10 bold}
	align {center}
	vbar {yes}
	column { }
	vbar {yes}
	column { }
	vbar {yes}
	column { }
	vbar {yes}
    }
    pattern Domain {
	chars {10 bold}
	align {center}
	vbar {yes}
	column {
	    multicolumn {3}
	}
	vbar {yes}
    }
    pattern NoMX {
	align {left}
	vbar {yes}
	column {
	    multicolumn {3}
	}
	vbar {yes}
    }
    pattern MX {
	vbar {yes}
	column {
	    botbar {no}
	}
	vbar {yes}
	column {
	    align {right}
	}
	vbar {yes}
	column { }
	vbar {yes}
    }
    pattern LastMX {
	vbar {yes}
	column { }
	vbar {yes}
	column {
	    align {right}
	}
	vbar {yes}
	column { }
	vbar {yes}
    }
}

#
# Netmagis general library
#

source /usr/local/lib/netmagis/libnetmagis.tcl

# ::webapp::cgidebug ; exit

##############################################################################
# Output list
##############################################################################

proc output {dbfd domains idview format} {
    global conf

    #
    # Arguments
    #

    foreach d $domains {
	set iddom [read-domain $dbfd $d]
	if {$iddom == -1} then {
	    d error [mc "Domain '%s' not found" $d]
	}
	set tabdom($d) $iddom
    }

    set msg [check-views [list $idview]]
    if {$msg ne ""} then {
	d error $msg
    }

    #
    # List MX for each domain and view
    #

    set lines {}
    lappend lines [list "Title" \
			    [mc "Name"] \
			    [mc "Priority"] \
			    [mc "MX"] \
			]

    foreach d [lsort $domains] {
	lappend lines [list "Domain" "$d / [u viewname $idview]"]
	set iddom $tabdom($d)

	#
	# Extract MX of domain, and store into a temporary variable.
	#   tabmx(foo.u-strasbg.fr) = {{10 mx1.u-strasbg.fr} {20 mx2...}}
	#

	catch {unset tabmx}
	set sql "SELECT r1.name || '.' || d1.name AS left,
			m.prio,
			r2.name || '.' || d2.name AS right
		    FROM dns.rr r1, dns.domain d1,
			dns.rr_mx m,
			dns.rr r2, dns.domain d2
		    WHERE r1.iddom = d1.iddom
			AND r1.idrr = m.idrr
			AND m.mx = r2.idrr
			AND r1.idview = $idview
			AND r2.iddom = d2.iddom
			AND r1.iddom = $iddom
		    ORDER BY r1.name ASC, m.prio ASC"
	pg_select $dbfd $sql tab {
	    set left  $tab(left)
	    set prio  $tab(prio)
	    set right $tab(right)
	    lappend tabmx($left) [list $prio $right]
	}

	#
	# Process each MX
	#

	set lmx [lsort [array names tabmx]]
	if {[llength $lmx] == 0} then {
	    lappend lines [list "NoMX" [mc "(no MX for this domain)"]]
	} else {
	    foreach mx [lsort [array names tabmx]] {
		set n [llength $tabmx($mx)]
		for {set i 0} {$i < $n} {incr i} {
		    lassign [lindex $tabmx($mx) $i] prio right

		    # output MX name only once
		    if {$i == 0} then {
			set left $mx
		    } else {
			set left ""
		    }

		    # do not display horizontal line under MX name,
		    # except for the last one
		    if {$i < $n - 1} then {
			set pattern "MX"
		    } else {
			set pattern "LastMX"
		    }

		    lappend lines [list $pattern $left $prio $right]
		}
	    }
	}
    }

    set tableau [::arrgen::output $format $conf(tableau) $lines]

    #
    # End of script: output page and close database
    #

    set datefmt [dnsconfig get "datefmt"]
    set date  [clock format [clock seconds] -format $datefmt]
    switch -- $format  {
	html	{
	    d result $conf(page-html) [list \
					[list %TITLE%	"MX"] \
					[list %TXT%	""] \
					[list %TABLEAU%	$tableau] \
					[list %DATE%	$date] \
				    ]
	}
	latex	{
	    d result $conf(page-latex) [list \
					[list %ORIENTATION% "portrait"] \
					[list %TITLE%	"MX"] \
					[list %TXT%	""] \
					[list %TABLEAU%	$tableau] \
					[list %DATE%	$date] \
				    ]
	}
    }
}
##############################################################################
# Display selection page
##############################################################################

d cgi-register {
    dolist {}
    doprint {}
} {} {
    global conf

    #
    # Extract authorized views
    #

    lassign [menu-view $dbfd $tabuid(idcor) "idview" {}] disp viewval
    if {$disp} then {
	set viewlibelle [mc "View"]
    } else {
	set viewlibelle ""
    }
    # get one valid view to satisfy "map" requirements
    set dumbidview [lindex [u myviewids] 0]


    #
    # Extract domain list (all)
    #

    set ld [::pgsql::getcols $dbfd dns.domain "" "name ASC" {name name}]
    set h [llength $ld]
    set listdomains [::webapp::form-menu domain $h 1 $ld {}]

    #
    # End of script: output page and close database
    #

    d urlset "%URLFORM%" $conf(next) {}
    d result $conf(page-sel) [list \
				[list %LISTDOMAINS% $listdomains] \
				[list %VIEWLIBELLE% $viewlibelle] \
				[list %VIEWVAL% $viewval] \
			    ]
}

##############################################################################
# Display list
##############################################################################

d cgi-register {dolist .+} {
    {domain	0 99999}
    {idview	1 1}
} {
    global conf

    output $dbfd $domain $idview "html"
}

##############################################################################
# Print list
##############################################################################

d cgi-register {doprint .+} {
    {domain	0 99999}
    {idview	0 99999}
} {
    global conf

    output $dbfd $domain $idview "latex"
}

##############################################################################
# Main procedure
##############################################################################

d cgi-dispatch "admin" "admin"
