- Timestamp:
- 06/17/16 18:01:13 (9 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/DNSDB.pm
r722 r723 4884 4884 4885 4885 4886 ## DNSDB::recSearchCount() 4887 # Get a total count for a global record search 4888 ## DNSDB::recSearch() 4889 # Find records matching the search string 4890 sub recSearch { 4891 my $self = shift; 4892 my $dbh = $self->{dbh}; 4893 4894 my %args = @_; 4895 4896 my $sql = q( 4897 SELECT r.domain_id,d.domain,g1.group_name AS domgroup,r.rdns_id,z.revnet AS revzone,g2.group_name AS 4898 revgroup,r.host,t.name AS rectype,r.val,l.description AS location 4886 # a collection of joins for the record search 4887 our $recsearchsqlbase = q( 4899 4888 FROM records r 4900 4889 LEFT JOIN domains d ON r.domain_id = d.domain_id … … 4907 4896 ); 4908 4897 4909 # Limit scope based on group 4910 if ($args{group} != 1) { 4911 my @grouplist; 4912 $self->getChildren($args{group}, \@grouplist); 4913 my $groupset = join(',', $args{group}, @grouplist); 4914 # oh my aching HEAD. there has to be a better way to do conditions on joined tables... 4915 $sql .= "AND ( 4916 (g1.group_id IN ($groupset) AND g2.group_id IN ($groupset)) OR 4917 (g1.group_id IN ($groupset) AND g2.group_id IS NULL) OR 4918 (g1.group_id IS NULL AND g2.group_id IN ($groupset)) 4919 ) 4898 4899 ## DNSDB::recSearchCount() 4900 # Get a total count for a global record search 4901 # Takes a hash with the search string and the login group of the user 4902 sub recSearchCount { 4903 my $self = shift; 4904 my $dbh = $self->{dbh}; 4905 my %args = @_; 4906 4907 my $sql = "SELECT count(*)".$recsearchsqlbase; 4908 4909 # Limit scope based on group 4910 if ($args{group} != 1) { 4911 my @grouplist; 4912 $self->getChildren($args{group}, \@grouplist); 4913 my $groupset = join(',', $args{group}, @grouplist); 4914 # oh my aching HEAD. there has to be a better way to do conditions on joined tables... 4915 $sql .= "AND ( 4916 (g1.group_id IN ($groupset) AND g2.group_id IN ($groupset)) OR 4917 (g1.group_id IN ($groupset) AND g2.group_id IS NULL) OR 4918 (g1.group_id IS NULL AND g2.group_id IN ($groupset)) 4919 ) 4920 4920 "; 4921 } 4922 4923 my $foo = q( 4924 SELECT r.domain_id,d.domain,g1.group_name AS domgroup,r.rdns_id,z.revnet AS revzone,g2.group_name AS 4925 revgroup,r.host,t.name AS rectype,r.val,l.description AS location 4926 FROM records r 4927 LEFT JOIN domains d on r.domain_id = d.domain_id 4928 LEFT JOIN groups g1 on d.group_id = g1.group_id 4929 LEFT JOIN revzones z on r.rdns_id = z.rdns_id 4930 LEFT JOIN groups g2 on z.group_id = g2.group_id 4931 JOIN rectypes t ON r.type = t.val 4932 LEFT JOIN locations l ON r.location = l.location 4933 WHERE r.type <> 6 AND (r.host ~* 'kings' OR r.val ~* 'kings'); 4934 ); 4935 #ORDER BY record_id 4936 4937 #warn "$sql\n"; 4938 # safety valve. probably need a way to flag this back to the caller. 4939 if (!$args{searchfor} || $args{searchfor} =~ /^.{0,2}$/) { $sql .= "LIMIT 10"; } 4940 4941 #$sql .= "LIMIT 20" if $sql !~ /LIMIT/; 4942 4943 return $dbh->selectall_arrayref($sql, { Slice => {} }, $args{searchfor}, $args{searchfor}) or warn $dbh->errstr; 4921 } 4922 4923 my $count = $dbh->selectrow_array($sql, undef, $args{searchfor}, $args{searchfor}); 4924 $errstr = $dbh->errstr if !$count; 4925 return $count; 4926 4927 } # end recSearchCount() 4928 4929 4930 ## DNSDB::recSearch() 4931 # Find records matching the search string 4932 # Takes a hash with the search string, login group of the user, pagination offset, sort field, 4933 # and sort direction 4934 # Returns a reference to a list of hashrefs 4935 sub recSearch { 4936 my $self = shift; 4937 my $dbh = $self->{dbh}; 4938 my %args = @_; 4939 4940 my $sql = q(SELECT 4941 r.domain_id, d.domain, g1.group_name AS domgroup, 4942 r.rdns_id, z.revnet AS revzone, g2.group_name AS revgroup, 4943 r.host, t.name AS rectype, r.val, l.description AS location, r.record_id). 4944 $recsearchsqlbase; 4945 4946 # Limit scope based on group 4947 if ($args{group} != 1) { 4948 my @grouplist; 4949 $self->getChildren($args{group}, \@grouplist); 4950 my $groupset = join(',', $args{group}, @grouplist); 4951 # oh my aching HEAD. there has to be a better way to do conditions on joined tables... 4952 $sql .= "AND ( 4953 (g1.group_id IN ($groupset) AND g2.group_id IN ($groupset)) OR 4954 (g1.group_id IN ($groupset) AND g2.group_id IS NULL) OR 4955 (g1.group_id IS NULL AND g2.group_id IN ($groupset)) 4956 ) 4957 "; 4958 } 4959 4960 # mixed tables means this isn't a simple prefix like the regular record list filter. :/ 4961 my %sortmap = ( 4962 domain => 'd.domain', 4963 revzone => 'z.revnet', 4964 host => 'r.host', 4965 type => 't.name', 4966 val => 'inetlazy(r.val)', 4967 location => 'r.location', 4968 ); 4969 4970 # Sorting defaults 4971 $args{sortorder} = 'ASC' if !$args{sortorder} || !grep /^$args{sortorder}$/, ('ASC','DESC'); 4972 $args{sortby} = 'r.host' if !$args{sortby} || $args{sortby} !~ /^[\w_.]+$/; 4973 $args{offset} = 0 if !$args{offset} || $args{offset} !~ /^(?:all|\d+)$/; 4974 4975 $args{sortby} = $sortmap{$args{sortby}} if $args{sortby} !~ /\./; 4976 4977 # Add sort and offset to SQL 4978 $sql .= "ORDER BY $args{sortby} $args{sortorder},record_id ASC\n"; 4979 $sql .= ($args{offset} eq 'all' ? '' : "LIMIT $self->{perpage} OFFSET ".$args{offset}*$self->{perpage}); 4980 4981 ##fixme: should probably sent the warning somewhere else 4982 return $dbh->selectall_arrayref($sql, { Slice => {} }, $args{searchfor}, $args{searchfor}) 4983 or warn $dbh->errstr; 4984 4944 4985 } # end recSearch() 4945 4986 -
trunk/dns.cgi
r722 r723 1861 1861 } elsif ($webvar{page} eq 'recsearch') { 1862 1862 1863 ##FIXME 1864 ##FIXME Limit scope of search!! 1865 ##FIXME 1866 1867 # my $count = $dnsdb->recSearchCount(searchfor => $webvar{searchfor}); 1868 1869 $page->param(searchfor => $webvar{searchfor}); 1870 my $recset = $dnsdb->recSearch(searchfor => $webvar{searchfor}, group => $logingroup); 1863 # we do this for the domain and record list filter/search - it should be extremely rare to 1864 # need to search on characters outside this set until we get into IDNs 1865 $webvar{searchfor} =~ s/[^a-zA-Z0-9_.:\@-]//g if $webvar{searchfor}; 1866 1867 # save the search in the session, same as the "filter" in various other lists... 1868 if (defined($webvar{searchfor})) { 1869 if ($session->param('recsearch') && $webvar{searchfor} ne $session->param('recsearch')) { 1870 $uri_self =~ s/\&offset=[^&]//; 1871 $offset = 0; 1872 } 1873 $session->param(recsearch => $webvar{searchfor}); 1874 } 1875 my $searchfor = $session->param('recsearch'); 1876 1877 $sortby = 'host'; 1878 $session->param($webvar{page}.'sortby', $webvar{sortby}) if $webvar{sortby}; 1879 $session->param($webvar{page}.'order', $webvar{order}) if $webvar{order}; 1880 $sortby = $session->param($webvar{page}.'sortby') if $session->param($webvar{page}.'sortby'); 1881 $sortorder = $session->param($webvar{page}.'order') if $session->param($webvar{page}.'order'); 1882 1883 # some magic to label and linkify the column headers for sorting 1884 my @cols = ('domain','revzone','host','type','val','location'); 1885 my %colheads = (domain => "Domain (Group)", revzone => "Reverse zone (Group)", host => "Host", 1886 type => "Type", val => "IP/value", location => "Location"); 1887 fill_colheads($sortby, $sortorder, \@cols, \%colheads); 1888 1889 # pgcount.tmpl 1890 my $count = $dnsdb->recSearchCount(searchfor => $searchfor, group => $logingroup); 1891 fill_pgcount($count, "records"); 1892 fill_fpnla($count); 1893 1894 # and a bit for fpnla.tmpl 1895 $page->param(curpage => $webvar{page}); 1896 1897 $page->param(searchfor => $searchfor); 1898 my $recset = $dnsdb->recSearch(searchfor => $searchfor, group => $logingroup, offset => $webvar{offset}, 1899 sortby => $sortby, sortorder => $sortorder); 1871 1900 $page->param(searchresults => $recset); 1872 1901 -
trunk/templates/menu.tmpl
r722 r723 32 32 <hr /> 33 33 Find records(s): 34 <form action="<TMPL_VAR NAME=script_self>&page=recsearch" method=" POST">34 <form action="<TMPL_VAR NAME=script_self>&page=recsearch" method="post"> 35 35 <input name="searchfor" /> 36 36 <input type="submit" value=" Search " /> -
trunk/templates/recsearch.tmpl
r722 r723 15 15 <td align="center"><TMPL_INCLUDE NAME="fpnla.tmpl"></td> 16 16 <td class="rightthird"> 17 <form action="<TMPL_VAR NAME=script_self>">18 19 20 21 22 17 <form action="<TMPL_VAR NAME=script_self>" method="post"> 18 <input type="hidden" name="page" value="recsearch" /> 19 <input type="hidden" name="offset" value="0" /> 20 <input name="searchfor" value="<TMPL_VAR NAME=searchfor>" /> 21 <input type="submit" value=" Refine search " /> 22 </form> 23 23 </td> 24 24 </tr> … … 26 26 27 27 <table class="altrows" width="98%" border="0" cellpadding="3"> 28 <tr><th>Domain (Group)</th><th>Reverse zone (Group)</th><th>Host</th><th>Type</th><th>IP/value</th><th>Location</th></tr> 29 <tbody> 28 <tr> 29 <TMPL_LOOP NAME=colheads> <th><a href="<TMPL_VAR NAME=script_self>&page=<TMPL_VAR 30 NAME=page><TMPL_IF NAME=offset>&offset=<TMPL_VAR NAME=offset></TMPL_IF>&sortby=<TMPL_VAR 31 NAME=sortby>&order=<TMPL_VAR NAME=order>"><TMPL_VAR NAME=colname></a><TMPL_IF 32 NAME=sortorder> <img alt="<TMPL_VAR NAME=sortorder>" src="images/<TMPL_VAR 33 NAME=sortorder>.png" /></TMPL_IF></th> 34 </TMPL_LOOP> 35 </tr> 36 37 <TMPL_IF searchresults> 30 38 <TMPL_LOOP NAME=searchresults> 31 39 <tr> 32 <td><TMPL_IF domain_id><a href="<TMPL_VAR NAME=script_self>&page=reclist&id=<TMPL_VAR 33 NAME=domain_id>&defrec=n&filter=<TMPL_VAR NAME=searchfor>"><TMPL_VAR NAME=domain></a> (<TMPL_VAR 34 NAME=domgroup>)</TMPL_IF></td> 35 <td><TMPL_IF rdns_id><a href="<TMPL_VAR NAME=script_self>&page=reclist&id=<TMPL_VAR NAME=rdns_id>&defrec=n&revrec=y"><TMPL_VAR NAME=revzone></a> (<TMPL_VAR NAME=revgroup>)</TMPL_IF></td> 40 <td><TMPL_IF domain_id><a href="<TMPL_VAR NAME=script_self>&page=reclist&id=<TMPL_VAR 41 NAME=domain_id>&defrec=n&filter=<TMPL_VAR NAME=searchfor>"><TMPL_VAR NAME=domain></a> (<TMPL_VAR 42 NAME=domgroup>)</TMPL_IF></td> 43 <td><TMPL_IF rdns_id><a href="<TMPL_VAR NAME=script_self>&page=reclist&id=<TMPL_VAR 44 NAME=rdns_id>&defrec=n&revrec=y&filter=<TMPL_VAR NAME=searchfor>"><TMPL_VAR 45 NAME=revzone></a> (<TMPL_VAR NAME=revgroup>)</TMPL_IF></td> 46 <TMPL_IF domain_id> 47 <td><a href="<TMPL_VAR NAME=script_self>&page=record&parentid=<TMPL_VAR 48 NAME=domain_id>&defrec=n&revrec=n&recact=edit&id=<TMPL_VAR 49 NAME=record_id>"><TMPL_VAR NAME=host></a></td> 50 <TMPL_ELSE> 36 51 <td><TMPL_VAR NAME=host></td> 52 </TMPL_IF> 37 53 <td><TMPL_VAR NAME=rectype></td> 54 <TMPL_IF rdns_id> 55 <td><a href="<TMPL_VAR NAME=script_self>&page=record&parentid=<TMPL_VAR 56 NAME=domain_id>&defrec=n&revrec=y&recact=edit&id=<TMPL_VAR 57 NAME=record_id>"><TMPL_VAR NAME=val></a></td> 58 <TMPL_ELSE> 38 59 <td><TMPL_VAR NAME=val></td> 60 </TMPL_IF> 39 61 <td><TMPL_VAR NAME=location></td> 40 62 </tr> 41 63 </TMPL_LOOP> 42 </tbody> 64 <TMPL_ELSE> 65 <tr><td colspan="5" align="center">No records found matching '<TMPL_VAR NAME=searchfor>'</td></tr> 66 </TMPL_IF> 43 67 </table> 68 69 <div class="center"><TMPL_INCLUDE NAME="fpnla.tmpl"></div> 70 71 </td> 72 </tr> 73 </table> 74
Note:
See TracChangeset
for help on using the changeset viewer.