]> git.nbdom.net Git - nb.git/commitdiff
rename global and file as DBQ
authorNicolas Boisselier <nicolas.boisselier@gmail.com>
Wed, 21 Sep 2016 21:40:56 +0000 (22:40 +0100)
committerNicolas Boisselier <nicolas.boisselier@gmail.com>
Wed, 21 Sep 2016 21:40:56 +0000 (22:40 +0100)
19 files changed:
etc/dbq.php [new file with mode: 0644]
etc/dbq.yaml [new file with mode: 0644]
etc/dbq/nb.php [new file with mode: 0644]
etc/dbq/owncloud.php [new file with mode: 0644]
etc/dbq/postfix.php [new file with mode: 0644]
etc/dbq/puppetdb.php [new file with mode: 0644]
etc/dbq/ui.php [new file with mode: 0644]
etc/dbq/wp.php [new file with mode: 0644]
etc/dbs.php [deleted file]
etc/dbs.yaml [deleted file]
etc/dbs/nb.php [deleted file]
etc/dbs/owncloud.php [deleted file]
etc/dbs/postfix.php [deleted file]
etc/dbs/puppetdb.php [deleted file]
etc/dbs/ui.php [deleted file]
etc/dbs/wp.php [deleted file]
etc/vim/templates/bash.tt
lib/php/db.php
lib/php/db/config.php

diff --git a/etc/dbq.php b/etc/dbq.php
new file mode 100644 (file)
index 0000000..137d589
--- /dev/null
@@ -0,0 +1,125 @@
+<?php
+require_once dirname(__FILE__).'/../lib/php/nb.php';
+$DBQ = [];
+#$dev = (bool)(stripos(gethostname(),'macbook') !== false);
+$LOCAL_DB = (
+  file_exists('/opt/local/var/run/mysql5')
+  and ! file_exists('/opt/local/var/run/mysql5/mysqld.sock')
+) ? true : false;
+
+#
+# Search existing DIR_SQLITE
+#
+$DIR_SQLITE = '';
+foreach ([
+  '~nico/ownCloud',
+  '~nicoadm/ownCloud',
+] as $dir) {
+  $dir = nb::untilde($dir);
+  if (!is_readable($dir)) continue;
+  $DIR_SQLITE = $dir;
+  break;
+}
+if ($DIR_SQLITE) $DIR_SQLITE .= '/var/lib/sqlite';
+
+#
+# Includes dbq/*php
+#
+$dir = dirname(__FILE__).'/dbq';
+foreach (nb::ls_dir($dir,'\.php$') as $file) {
+  require_once("$dir/$file");
+}
+
+#
+# Create *-sqlite databases
+#
+$host_already_exists = [];
+foreach ($DBQ as $id => $db) {
+  if (1
+    and !empty($db['type']) and $db['type'] == 'sqlite'
+    and !empty($db['host']) 
+  ) $host_already_exists[$db['host']] = $id;
+}
+
+if ($DIR_SQLITE) {
+  foreach (nb::ls_dir($DIR_SQLITE,'\.db$') as $file) {
+
+    if (isset($host_already_exists["$DIR_SQLITE/$file"])) {
+      $DBQ[$host_already_exists["$DIR_SQLITE/$file"]]['sql_pre'][] = 'PRAGMA journal_mode=OFF';
+      continue;
+    }
+
+    $name = basename($file,'.db');
+    $id = "$name-sqlite";
+
+    $DBQ[$id] = [
+      'host' => "$DIR_SQLITE/$file",
+      'type' => 'sqlite',
+      'title' => 'created by dbq.php',
+      '_import' => $name
+    ];
+    #if (!empty($DBQ[$name])) $DBQ[$id] = array_merge_recursive($DBQ[$name],$DBQ[$id]);
+  }
+}
+
+#
+# Sqlite all Attach db type=sqlite
+#
+#return;
+$DBQ['all'] = [
+  'host' => ':memory:',
+  'type' => 'sqlite',
+  'pdo' => '',
+  #'order' => '0',
+  'options' => [
+    PDO::ATTR_PERSISTENT => true,
+  ],
+  'tables' => [],
+  'sql_pre' => [
+    'PRAGMA busy_timeout = 1000',
+    #'PRAGMA synchronous=NORMAL',
+    'PRAGMA journal_mode=MEMORY',
+  ],
+];
+
+foreach ($DBQ as $id => $db) {
+  if (0
+    or empty($db['type'] )
+    or $db['type']!='sqlite'
+    or empty($db['host'] )
+    #or !is_readable($fname=basename($db['host'],'.db'))
+    #or !is_readable($fname)
+    or !is_readable($db['host'])
+  ) continue;
+  $fname = basename($db['host'],'.db');
+  $DBQ['all']['types']['sql_pre'][] = "ATTACH DATABASE '".$db['host']."' as ".$fname."";
+  conf_merge($DBQ[$fname],$DBQ['all']);
+
+}
+conf_merge($DBQ['nb'],$DBQ['all']);
+
+return 1;
+
+function conf_merge(&$c1,&$c2) {
+
+  if (!empty($c1['tables'])) {
+    if (empty($c1['tables'])) $c1['tables'] = [];
+    foreach ($c1['tables'] as $k=>$v) {
+      #debug($k);
+      $c2['tables'][$k] = $v;
+    }
+  }
+
+  foreach ([
+    'default_table',
+    'title',
+    'row_parse',
+    #'_import',
+  ] as $k) if (!empty($c1[$k]))
+    $c2[$k] = $c1[$k];
+  ;
+
+  return [$c1,$c2];
+}
+
+?>
diff --git a/etc/dbq.yaml b/etc/dbq.yaml
new file mode 100644 (file)
index 0000000..77524ae
--- /dev/null
@@ -0,0 +1,44 @@
+_nico:
+  user: nico
+
+_mysql:
+  type: mysql
+
+crypt:
+  type: sqlite
+  host: /dev/shm/crypt.db
+
+rt:
+  type: pgsql
+  host: db.rt.semantico.net
+  name: rtdb
+  user: rtuser
+  title: 'RT'
+
+izi:
+  title: Izi Admin
+  host: admin.izideal.vpn
+  default_table: process
+  user: izideal
+  name: izi
+  type: mysql
+  _import:
+    - _izi
+  encoding: utf-8
+  tables:
+    site:
+      replace:
+        idlang: lang.id
+
+izi-sql:
+  title: Mysql Izi Slave
+  host: sql.izideal.vpn
+  _import:
+    - izi
+
+izi-dev:
+  host: big.cascais.loc
+  title: Mysql Izi on Big
+  #user: nico
+  _import:
+    - izi
diff --git a/etc/dbq/nb.php b/etc/dbq/nb.php
new file mode 100644 (file)
index 0000000..42c2866
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+
+$DBQ['nb'] = array(
+  'host' => 'admin.izideal.vpn',
+  'type' => 'mysql',
+  'name' => 'nb',
+  '_import' => ['_nico'],
+
+  'title' => 'Nb',
+  'notice' => 'Micro foncier 4BE',
+  'default_table' => 'rent',
+
+  'tables' => array(
+
+    'agency' => [ 'row_parse_post' => function(&$r) { return rent_doc('agency',$r); }, ],
+
+    'place' => array(
+      #'replace' => [ 'id' => 'addr.addr' ],
+      'row_parse_post' => 'place_doc',
+    ),
+
+    'tenant' => array(
+      'row_parse_post' => 'tenant_doc',
+    ),
+
+    'test' => array(
+      'sql' => "SELECT 'Test sql table'",
+    ),
+
+    'rent' => array(
+      'orderby' => 'start desc, end desc',
+      #'replace' => [ 'idtenant' => 'tenant.name', 'idplace' => 'addr.addr' ],
+
+      'row_parse_pre' => function(&$r) {
+        $r['month'] = $r['rent'] + $r['charge'];
+
+        $start_month = date('m',strtotime($r['start']));
+        $end_month = date('m',strtotime($r['end']));
+        if (date('Y',strtotime($r['end'])) > date('Y',strtotime($r['start']))) $end_month = 12;
+        $r['months'] = (1 + $end_month - $start_month);
+
+        $r['total'] = sprintf('%d',$r['rent'] * $r['months']);
+      },
+
+      'row_parse_post' => ((empty($GLOBALS['Db']) or Db::php_cli()) ? null : function(&$r) {
+        static $templates;
+        if (!isset($templates)) {
+          $templates = $GLOBALS['Db']->rows("SELECT id FROM template",PDO::FETCH_NUM);
+          foreach ($templates as $k=>$t) {
+            $templates[$k] = '<a class="small revision" href="template/?id='.$t[0].'&amp;idplace=:idplace&amp;idtenant=:idtenant&amp;start=:start">'.preg_replace('/\.\w+$/','',$t[0]).'</a>';
+          }
+        }
+
+        tenant_doc($r);
+        $revision = '';
+        foreach ($templates as $t) {
+          $revision .= preg_replace_callback('/:(\w+)/',function($m) use(&$r) {return $r[$m[1]];},$t).' ';
+        }
+        $r['doc'] = preg_replace('@^(?:<div[^>]+>)?(.*?)(?:</div>)?$@','<div class="list">'.trim($revision).'\1</div>',$r['doc']);
+
+      }),
+    ),
+
+  ),
+);
+
+if (strpos(php_uname("n"),'ovh.net')!==false) $DBQ['nb']['order'] = 1;
+return 1;
+
+function tenant_doc(&$r) { return rent_doc('tenant',$r); }
+function place_doc(&$r) { return rent_doc('place',$r); }
+
+function rent_doc($table,&$r) {
+  if (empty($_SERVER['DOCUMENT_ROOT'])) return;
+
+  #if (!empty($r['end']) and date('Ymd') > $r['end']) return $r['doc'] = isset($r['doc']) ? $r['doc'] : '';
+
+  $url = '';
+  foreach (['id'.$table,'id'] as $k) {
+    if (isset($r[$k])) {
+      $url = '/data/'.$table.'/'.$r[$k];
+      break;
+    }
+  }
+  if (!$url) return;
+
+  if (!isset($r['doc'])) $r['doc'] = '';
+#debug($_SERVER['DOCUMENT_ROOT'].$url);
+  if (
+
+    # Web url
+    (
+      empty($r['doc']) and file_exists( $dir = $_SERVER['DOCUMENT_ROOT'].$url )
+    )
+
+    # Absolute path
+    or (
+      ( $dir = nb::untilde($r['doc']) ) 
+      and file_exists($dir) and is_dir($dir)
+      and ($url='' or 1)
+    )
+
+  ) {
+
+    foreach (nb::ls_dir($dir,'',true) as $p) {
+      $r['doc'] .= sprintf('<a href="%s" class="small">%s</a> ',"$url/$p",
+        nb::prettyText(preg_replace('@^.*?([^/\.]+).*?$@','\1',$p))
+      );
+    }
+
+  }
+
+  if (!empty($r['doc'])) $r['doc'] = '<div class="list">'.$r['doc'].'</div>';
+}
+?>
diff --git a/etc/dbq/owncloud.php b/etc/dbq/owncloud.php
new file mode 100644 (file)
index 0000000..2435a11
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+$DBQ['owncloud'] = [
+  '_import' => '_nico',
+  'name' => 'owncloud',
+  'type' => 'mysql',
+  'host' => 'admin.izideal.vpn',
+  #'default_table' => 'oc_users',
+  'default_table' => 'oc_last_files',
+  'tables' => [
+    'oc_contact' => [
+      #'sql' => "SELECT * FROM oc_contacts_cards_properties",
+      'sql' => "SELECT c.id"
+        #.",org.value as org"
+        #.",name.value as name"
+        #.",tel.value as tel"
+        .",TRIM(CONCAT("
+          ."(SELECT value FROM oc_cards_properties p WHERE p.name='ORG' AND p.cardid=c.id AND p.addressbookid=c.addressbookid)"
+          .",' ',"
+          ."(SELECT value FROM oc_cards_properties p WHERE p.name='FN' AND p.cardid=c.id AND p.addressbookid=c.addressbookid)"
+        .")) as name"
+        .",(SELECT value FROM oc_cards_properties p WHERE p.name='TEL' AND p.cardid=c.id AND p.addressbookid=c.addressbookid ORDER BY preferred DESC LIMIT 1) as tel"
+        .",(SELECT value FROM oc_cards_properties p WHERE p.name='EMAIL' AND p.cardid=c.id AND p.addressbookid=c.addressbookid ORDER BY preferred DESC LIMIT 1) as email"
+      . " FROM oc_cards c GROUP BY c.id HAVING name IS NOT NULL AND name<>''"
+      ,
+      'row_parse_pre' => 'owncloud_row_parse',
+    ],
+    'oc_last_files' => [
+      'sql' => "SELECT path,mtime FROM oc_filecache WHERE path NOT LIKE 'files_versions/%' ORDER BY fileid DESC LIMIT 10",
+      'row_parse_pre' => function(&$r) {
+        $r['mtime'] = date ("Y-m-d H:i:s",$r['mtime']);
+      }
+    ],
+  ],
+];
+
+function owncloud_row_parse(&$r) {
+  foreach ($r as $k=>$v) {
+    $v = str_replace(chr(194).chr(160),' ',$v);
+    $r[$k] = $v;
+  }
+}
+?>
diff --git a/etc/dbq/postfix.php b/etc/dbq/postfix.php
new file mode 100644 (file)
index 0000000..27c86d0
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+$DBQ['postfix'] = array (
+  'title' => 'Postfix on Izideal',
+  'type' => 'mysql',
+  'host' => 'admin.izideal.vpn',
+  'user' => 'postfix',
+);
+?>
diff --git a/etc/dbq/puppetdb.php b/etc/dbq/puppetdb.php
new file mode 100644 (file)
index 0000000..90b49e4
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+$DBQ['puppetdb'] = array (
+  'title' => 'Puppetdb',
+  'host' => 'big.cascais.loc',
+  'type' => 'pgsql',
+  'user' => 'puppetdb',
+  'default_table' => 'view_hosts',
+  'row_parse' => function(&$r) {
+    foreach ($r as $k=>$v) {
+      # Clean date time
+      $r[$k] = preg_replace('/^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\.\d+$/','\1',$v);
+    }
+  },
+# NB 11.04.16   'tables' => 
+# NB 11.04.16   array (
+# NB 11.04.16     'hosts' => 
+# NB 11.04.16     array (
+# NB 11.04.16       'row_parse_pre' => function(&$r) {
+# NB 11.04.16         foreach ($r as $k=>$v) {
+# NB 11.04.16           $r[$k] = preg_replace('/(:\d\d)\.\d+/','\1',$v);
+# NB 11.04.16         }
+# NB 11.04.16       },
+# NB 11.04.16     ),
+# NB 11.04.16   ),
+);
+?>
diff --git a/etc/dbq/ui.php b/etc/dbq/ui.php
new file mode 100644 (file)
index 0000000..e2b1bd5
--- /dev/null
@@ -0,0 +1,189 @@
+<?php
+$DBQ['_ui'] = array(
+  'title' => 'Semantico UI',
+  'type' => 'sqlite',
+  'host' => (file_exists('/opt/www/sem_ui/var/db/semantico.db') ?  '/opt/www/sem_ui/var/db/semantico.db' : "$DIR_SQLITE/semantico.db"),
+  'default_table' => 'node',
+
+  'tables' => array(
+
+    'aws_az' => array(
+      'extras'=> array(
+        #'network_idsubnet' => "(SELECT code FROM network WHERE network.id='subnet-' || aws_az.id)",
+        'aws_region_cidr' => "(SELECT cidr FROM aws_region WHERE aws_region.id=idaws_region)",
+        'aws_region_idvpc' => "(SELECT idvpc FROM aws_region WHERE aws_region.id=idaws_region)",
+        'aws_region_sg' => "(SELECT sg FROM aws_region WHERE aws_region.id=idaws_region)",
+        'aws_ec2s' => "(SELECT count(*) FROM aws_ec2 WHERE aws_az.id=idaws_az)",
+        'idnetwork' => "(SELECT id FROM network WHERE network.id='subnet-' || aws_az.id)",
+        'network_subnet' => "(SELECT network FROM network WHERE network.id='subnet-' || aws_az.id)",
+        'ec2' => "CONCAT('--region ',(SELECT id FROM aws_region WHERE aws_region.id=idaws_region),' --subnet-id ',(SELECT id FROM aws_subnet WHERE aws_subnet.aws_azid=aws_az.id),' --security-group-ids ',(SELECT sg FROM aws_region WHERE aws_region.id=idaws_region),' --associate-public-ip-address --key-name semadm')"
+        #'subnet' => "(SELECT 'subnet' || aws_az.id)",
+      )
+    ),
+
+    'aws_region' => array(
+      'extras'=> array(
+        'aws_az' => "(SELECT count(*) FROM aws_az WHERE idaws_region=aws_region.id)",
+        'aws_ec2' => "(SELECT count(*) FROM aws_ec2 JOIN aws_az ON idaws_region=aws_region.id)",
+        'aws_rds' => "(SELECT count(*) FROM aws_rds WHERE idaws_region=aws_region.id)",
+        'aws_elb' => "(SELECT count(*) FROM aws_elb WHERE idaws_region=aws_region.id)",
+      ),
+    ),
+
+    'contact' => array(
+      'extras'=> array(
+      'pic' => '\'<img alt="" src="/scripts/gravatar/?email=\' || contact.email || \'" />\'',
+      ),
+    ),
+
+    'vmware' => array(
+      'extras'=> array(
+        'vms' => "(SELECT count(*) FROM vms WHERE vms.idvmware = vmware.id)",
+        'Rack' => "(SELECT idrack FROM rack_node WHERE id=idnode LIMIT 1)",
+      ),
+    ),
+
+    'firewall' => array(
+      'extras'=> array(
+        ' Rack' => "(SELECT idrack FROM rack_node WHERE id=idnode LIMIT 1)",
+      ),
+    ),
+
+    'vms' => array(
+      'extras'=> array(
+        'Rack' => "(SELECT idrack FROM rack_node WHERE idvmware=idnode LIMIT 1)",
+      ),
+    ),
+
+    'company' => array(
+      'extras'=> array(
+        'nodes' => "(SELECT count(*) FROM node WHERE node.idcompany = company.id)",
+        'peoples' => "(SELECT count(*) FROM people WHERE people.idcompany = company.id)",
+      ),
+    ),
+
+    'service' => array(
+      'extras'=> array(
+        'products' => '(SELECT GROUP_CONCAT(idproduct,", ") FROM product_service WHERE idservice=id)',
+      ),
+    ),
+
+    'product' => array(
+      'extras'=> array(
+        'service' => '(SELECT GROUP_CONCAT(idservice,", ") FROM product_service WHERE idproduct=id)',
+        #'nodes' => "(SELECT count(*) FROM node WHERE node.id LIKE '___' || product.id || '%')",
+      ),
+    ),
+
+    'dc' => array(
+      #'nodes' => "(SELECT count(*) FROM node WHERE node.id LIKE '%' || dc.id || '_')",
+      'nodes' => "(SELECT count(*) FROM node WHERE node.iddc = dc.id)",
+      #'dns-scr' => "(SELECT count(*) FROM dns WHERE dns.src LIKE '%' || dc.id || '%')",
+      #'dns-dst' => "(SELECT count(*) FROM dns WHERE dns.dst LIKE '%' || dc.id || '%')",
+    ),
+
+    'node' => array(
+      'row_parse_post'=> function(&$r) {
+        global $Db;
+        $metas = [];
+        foreach ($Db->rows(
+          #"SELECT name,value FROM fact WHERE name IN ('environment','last_run') AND idnode=".$Db->quote($r['id'])
+          #"SELECT * FROM (SELECT 'dell-drac' as 'n',replace(src,'.semantico.net','') as 'v' FROM dns WHERE src LIKE ".$Db->quote($r['id'].'-rac.%')." ORDER BY length(v) LIMIT 1) drac"
+          ""
+          ."SELECT 'idvmware',idvmware FROM vms WHERE vms.idnode=".$Db->quote($r['id'])
+          ." UNION SELECT 'env',value FROM fact WHERE name = 'environment' AND idnode=".$Db->quote($r['id'])
+          ." UNION SELECT 'aws_ec2',id FROM aws_ec2 WHERE aws_ec2.idnode=".$Db->quote($r['id'])
+          ." UNION SELECT 'last_backup',CONCAT('<a href=\"#\" onclick=\"alert(''Directories:\\n\\n ',replace(dirs,' ','\\n'),''');return false\">',max(date),'</a>') as v FROM backup WHERE idnode=".$Db->quote($r['id'])." GROUP BY dirs"
+          ." UNION SELECT 'last_run',substr(value,1,10) FROM fact WHERE name = 'last_run' AND idnode=".$Db->quote($r['id'])." AND value < ".$Db->quote(date('Y-m-d', strtotime('-3 days')))
+          ." UNION SELECT 'rack',CONCAT(idrack,'/',position) FROM rack_node WHERE idnode=".$Db->quote($r['id'])." OR idnode IN (SELECT idvmware FROM vms WHERE vms.idnode=rack_node.idnode)"
+          ." UNION SELECT 'switch' as n, CONCAT(id,':',port) as v FROM switch_port WHERE switch_port.idnode=".$Db->quote($r['id'])." AND switch_port.port NOT LIKE 'ch%'"
+        ,PDO::FETCH_NUM) as $f) { $metas[$f[0]] = $f[1]; }
+        if ($metas) {
+          $r['metas'] = join("",array_map(function($k,$v){return (string)$v==="" ? "" : "$k=$v\n";},array_keys($metas),$metas));
+        }
+
+        $r['keyevent'] = $Db->row("SELECT count(*) FROM fact WHERE fact.idnode=".$Db->quote($r['id']));
+        $r['graph'] = '<a target="_blank" href="/graphite/?Hosts='.$r['id'].'"><img alt="" src="/images/graphite.png" /></a>';
+        #debug($facts);
+      },
+      /*
+      'extras'=> array(
+        # n => v
+        'metas' => preg_replace('/(^\t|\n$)/',' ',"(SELECT GROUP_CONCAT(n || '=' || v,'\n') FROM (
+          SELECT * FROM (SELECT 'dell-drac' as 'n',replace(src,'.semantico.net','') as 'v' FROM dns WHERE src LIKE CONCAT(node.id,'-rac.%') ORDER BY length(v) LIMIT 1) drac
+          UNION SELECT 'idvmware' as 'n',idvmware as 'v' FROM vms WHERE vms.idnode=node.id
+          UNION SELECT 'env' as 'n',value as 'v' FROM fact WHERE fact.idnode=node.id AND name='environment'
+          UNION SELECT 'aws_ec2' as 'n',id as 'v' FROM aws_ec2 WHERE aws_ec2.idnode=node.id
+          UNION SELECT 'last_backup' as 'n',CONCAT('<a href=\"#\" onclick=\"alert(''Directories:\\n\\n ',replace(dirs,' ','\\n'),''');return false\">',max(date),'</a>') as 'v' FROM backup WHERE idnode=node.id
+          UNION SELECT name as 'n', strftime('%Y-%m-%d',value) as 'v' FROM fact WHERE idnode=id AND name='last_run' AND value < '".date('Y-m-d', strtotime('-3 days'))."'
+          UNION SELECT 'rack' as'n',CONCAT(idrack,'/',position) as 'v' FROM rack_node WHERE id=idnode OR idnode IN (SELECT idvmware FROM vms WHERE vms.idnode=node.id)
+          UNION SELECT 'switch' as 'n', CONCAT(id,':',port) as 'v' FROM switch_port WHERE switch_port.idnode=node.id AND switch_port.port NOT LIKE 'ch%'
+        ) t)"),
+        'fact' => "(SELECT count(*) FROM fact WHERE fact.idnode=node.id)",
+        'keyevent' => "(SELECT count(*) FROM keyevent WHERE keyevent.idnode=node.id)",
+        #'graph' => '\'<a target="_blank" href="/graphite/?Hosts=\' || id || \'"><img alt="" src="/images/graphite.png" /></a>\'',
+      */
+
+    ),
+
+    'view_backup' => array(
+      'row_parse_post'=> function(&$r) {
+        $r['Detail'] = '<a target="_blank" class="view_backup" href="?table=backup&idnode='.$r['idnode'].'">View</a>';
+      },
+    ),
+
+    'view_pingdom_per_month' => array(
+      'row_parse_post'=> function(&$r) {
+        $r['Checks'] = '<a target="_blank" class="pingdom_check_report" href="?table=pingdom_check_policy&idpingdom_policy='.$r['idpingdom_policy'].'">'.$r['Checks'].'</a>';
+      },
+      'extras' => array(
+        'Checks' => '(SELECT count(*) FROM pingdom_check_policy pcp WHERE pcp.idpingdom_policy=view_pingdom_per_month.idpingdom_policy)',
+      ),
+    ),
+
+    'pingdom_check' => array(
+      'row_parse_post'=> function(&$r) {
+        $r['View'] = '<a target="_blank" class="pingdom_check_report" href="https://my.pingdom.com/reports/uptime#check='.$r['id'].'"><img alt="" src="/images/graphite.png" /></a>';
+      },
+
+    ),
+    'network_ips' => array('sql' => "SELECT id as idnetwork,code,network,iddc,count(*) as count FROM network n JOIN view_ip ON cidr_range(network,ip) WHERE n.network IS NOT NULL AND n.hidden=0 AND EXISTS(SELECT 1 FROM fact WHERE value=ip AND name LIKE 'ipaddress%') GROUP BY n.id"),
+    'view_puppet_error' => array('sql' => "SELECT idnode ,idcompany ,iddc ,value as last_run FROM fact JOIN node ON id=idnode WHERE name='last_run' AND substr(value,1,10) <='".date('Y-m-d', strtotime('-3 days'))."'"),
+    'view_backup_error' => array('sql' => "SELECT idnode,idcompany,iddc,server,max(backup.date) as date FROM backup JOIN node ON id=idnode WHERE NOT EXISTS (SELECT 1 FROM node_decommission nd WHERE nd.id=node.id) GROUP BY idnode HAVING date <= '".date('Y-m-d', strtotime('-2 days'))."' ORDER BY backup.date")
+
+  ),
+);
+$DBQ['ui'] = [
+  '_import' => ['_ui'],
+  'order' => (preg_match('/^(dev|isp|ist)/',php_uname('n')) ? 1 : null),
+  #'order' => 1,
+];
+$DBQ['ui-pgsql'] = [
+  'host' => 'ui.semantico.net',
+  'type' => 'pgsql',
+  'name' => 'ui',
+  'pdo' => '',
+  '_import' => ['_ui','_semadm'],
+];
+$DBQ['ui-mysql'] = [
+  'host' => 'ui.semantico.net',
+  'type' => 'mysql',
+  'name' => 'ui',
+  'pdo' => '',
+  'sql_pre' => [
+    'SET SESSION sql_mode=PIPES_AS_CONCAT',
+  ],
+  '_import' => ['_ui','_semadm'],
+];
+#bye(realpath(dirname(__FILE__).'/../../lib/php/db.php'));
+#require_once(realpath(dirname(__FILE__).'/../../lib/php/db/types/sqlite.php'));
+#bye($DB_TYPES['sqlite']);
+# NB 24.06.16 if (!empty($DB_TYPES['sqlite']) and 0)
+# NB 24.06.16 $DB_TYPES['sqlite']['sqliteCreateFunction'] = array_merge($DB_TYPES['sqlite']['sqliteCreateFunction'],array(
+# NB 24.06.16   'gethostbyaddr' => function ($value) { return gethostbyaddr($value); },
+# NB 24.06.16   'ip2int' => function ($value) { return ip2long($value); },
+# NB 24.06.16   'int2ip' => function ($value) { return long2ip($value); },
+# NB 24.06.16   'concat' => function ($v1,$v2) { return $v1.$v2; },
+# NB 24.06.16   'cidr_range' => function ( $cidr, $chkip=null ) { return cidr_range( $cidr,$chkip); },
+# NB 24.06.16 ));
+?>
diff --git a/etc/dbq/wp.php b/etc/dbq/wp.php
new file mode 100644 (file)
index 0000000..d084af9
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+$DBQ['wp'] = [
+  'title' => 'Wordpress',
+  'host' => 'admin.izideal.vpn',
+  'type' => 'mysql',
+  '_import' => '_nico',
+  'default_table' => 'wp_blogs',
+  'tables' => [
+    'wp_options' => [
+      'row_parse_pre' => function(&$r) { foreach ($r as $k=>$v) { $r[$k] = str_replace("\0",'',$v); } },
+    ],
+  ],
+];
+
+if (false and !empty($GLOBALS['wpdb'])) {
+  $DBQ['wp']['type'] = 'sqlite';
+  $DBQ['wp']['host'] = DB_DIR.'/'.DB_FILE;
+}
+
+$DBQ['wp-sqlite'] = array (
+  'host' => "$DIR_SQLITE/wp.db",
+  'type' => 'sqlite',
+  '_import' => 'wp',
+);
+?>
diff --git a/etc/dbs.php b/etc/dbs.php
deleted file mode 100644 (file)
index 799ff54..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-require_once dirname(__FILE__).'/../lib/php/nb.php';
-$DB_CONFS = [];
-#$dev = (bool)(stripos(gethostname(),'macbook') !== false);
-$LOCAL_DB = (
-  file_exists('/opt/local/var/run/mysql5')
-  and ! file_exists('/opt/local/var/run/mysql5/mysqld.sock')
-) ? true : false;
-
-#
-# Search existing DIR_SQLITE
-#
-$DIR_SQLITE = '';
-foreach ([
-  '~nico/ownCloud',
-  '~nicoadm/ownCloud',
-] as $dir) {
-  $dir = nb::untilde($dir);
-  if (!is_readable($dir)) continue;
-  $DIR_SQLITE = $dir;
-  break;
-}
-if ($DIR_SQLITE) $DIR_SQLITE .= '/var/lib/sqlite';
-
-#
-# Includes dbs/*php
-#
-$dir = dirname(__FILE__).'/dbs';
-foreach (nb::ls_dir($dir,'\.php$') as $file) {
-  require_once("$dir/$file");
-}
-
-#
-# Create *-sqlite databases
-#
-$host_already_exists = [];
-foreach ($DB_CONFS as $id => $db) {
-  if (1
-    and !empty($db['type']) and $db['type'] == 'sqlite'
-    and !empty($db['host']) 
-  ) $host_already_exists[$db['host']] = $id;
-}
-
-if ($DIR_SQLITE) {
-  foreach (nb::ls_dir($DIR_SQLITE,'\.db$') as $file) {
-
-    if (isset($host_already_exists["$DIR_SQLITE/$file"])) {
-      $DB_CONFS[$host_already_exists["$DIR_SQLITE/$file"]]['sql_pre'][] = 'PRAGMA journal_mode=OFF';
-      continue;
-    }
-
-    $name = basename($file,'.db');
-    $id = "$name-sqlite";
-
-    $DB_CONFS[$id] = [
-      'host' => "$DIR_SQLITE/$file",
-      'type' => 'sqlite',
-      'title' => 'created by dbs.php',
-      '_import' => $name
-    ];
-    #if (!empty($DB_CONFS[$name])) $DB_CONFS[$id] = array_merge_recursive($DB_CONFS[$name],$DB_CONFS[$id]);
-  }
-}
-
-#
-# Sqlite all Attach db type=sqlite
-#
-#return;
-$DB_CONFS['all'] = [
-  'host' => ':memory:',
-  'type' => 'sqlite',
-  'pdo' => '',
-  #'order' => '0',
-  'options' => [
-    PDO::ATTR_PERSISTENT => true,
-  ],
-  'tables' => [],
-  'sql_pre' => [
-    'PRAGMA busy_timeout = 1000',
-    #'PRAGMA synchronous=NORMAL',
-    'PRAGMA journal_mode=MEMORY',
-  ],
-];
-
-foreach ($DB_CONFS as $id => $db) {
-  if (0
-    or empty($db['type'] )
-    or $db['type']!='sqlite'
-    or empty($db['host'] )
-    #or !is_readable($fname=basename($db['host'],'.db'))
-    #or !is_readable($fname)
-    or !is_readable($db['host'])
-  ) continue;
-  $fname = basename($db['host'],'.db');
-  $DB_CONFS['all']['types']['sql_pre'][] = "ATTACH DATABASE '".$db['host']."' as ".$fname."";
-  conf_merge($DB_CONFS[$fname],$DB_CONFS['all']);
-
-}
-conf_merge($DB_CONFS['nb'],$DB_CONFS['all']);
-
-return 1;
-
-function conf_merge(&$c1,&$c2) {
-
-  if (!empty($c1['tables'])) {
-    if (empty($c1['tables'])) $c1['tables'] = [];
-    foreach ($c1['tables'] as $k=>$v) {
-      #debug($k);
-      $c2['tables'][$k] = $v;
-    }
-  }
-
-  foreach ([
-    'default_table',
-    'title',
-    'row_parse',
-    #'_import',
-  ] as $k) if (!empty($c1[$k]))
-    $c2[$k] = $c1[$k];
-  ;
-
-  return [$c1,$c2];
-}
-
-?>
diff --git a/etc/dbs.yaml b/etc/dbs.yaml
deleted file mode 100644 (file)
index 77524ae..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-_nico:
-  user: nico
-
-_mysql:
-  type: mysql
-
-crypt:
-  type: sqlite
-  host: /dev/shm/crypt.db
-
-rt:
-  type: pgsql
-  host: db.rt.semantico.net
-  name: rtdb
-  user: rtuser
-  title: 'RT'
-
-izi:
-  title: Izi Admin
-  host: admin.izideal.vpn
-  default_table: process
-  user: izideal
-  name: izi
-  type: mysql
-  _import:
-    - _izi
-  encoding: utf-8
-  tables:
-    site:
-      replace:
-        idlang: lang.id
-
-izi-sql:
-  title: Mysql Izi Slave
-  host: sql.izideal.vpn
-  _import:
-    - izi
-
-izi-dev:
-  host: big.cascais.loc
-  title: Mysql Izi on Big
-  #user: nico
-  _import:
-    - izi
diff --git a/etc/dbs/nb.php b/etc/dbs/nb.php
deleted file mode 100644 (file)
index c6a5a73..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-$DB_CONFS['nb'] = array(
-  'host' => 'admin.izideal.vpn',
-  'type' => 'mysql',
-  'name' => 'nb',
-  '_import' => ['_nico'],
-
-  'title' => 'Nb',
-  'notice' => 'Micro foncier 4BE',
-  'default_table' => 'rent',
-
-  'tables' => array(
-
-    'agency' => [ 'row_parse_post' => function(&$r) { return rent_doc('agency',$r); }, ],
-
-    'place' => array(
-      #'replace' => [ 'id' => 'addr.addr' ],
-      'row_parse_post' => 'place_doc',
-    ),
-
-    'tenant' => array(
-      'row_parse_post' => 'tenant_doc',
-    ),
-
-    'test' => array(
-      'sql' => "SELECT 'Test sql table'",
-    ),
-
-    'rent' => array(
-      'orderby' => 'start desc, end desc',
-      #'replace' => [ 'idtenant' => 'tenant.name', 'idplace' => 'addr.addr' ],
-
-      'row_parse_pre' => function(&$r) {
-        $r['month'] = $r['rent'] + $r['charge'];
-
-        $start_month = date('m',strtotime($r['start']));
-        $end_month = date('m',strtotime($r['end']));
-        if (date('Y',strtotime($r['end'])) > date('Y',strtotime($r['start']))) $end_month = 12;
-        $r['months'] = (1 + $end_month - $start_month);
-
-        $r['total'] = sprintf('%d',$r['rent'] * $r['months']);
-      },
-
-      'row_parse_post' => ((empty($GLOBALS['Db']) or Db::php_cli()) ? null : function(&$r) {
-        static $templates;
-        if (!isset($templates)) {
-          $templates = $GLOBALS['Db']->rows("SELECT id FROM template",PDO::FETCH_NUM);
-          foreach ($templates as $k=>$t) {
-            $templates[$k] = '<a class="small revision" href="template/?id='.$t[0].'&amp;idplace=:idplace&amp;idtenant=:idtenant&amp;start=:start">'.preg_replace('/\.\w+$/','',$t[0]).'</a>';
-          }
-        }
-
-        tenant_doc($r);
-        $revision = '';
-        foreach ($templates as $t) {
-          $revision .= preg_replace_callback('/:(\w+)/',function($m) use(&$r) {return $r[$m[1]];},$t).' ';
-        }
-        $r['doc'] = preg_replace('@^(?:<div[^>]+>)?(.*?)(?:</div>)?$@','<div class="list">'.trim($revision).'\1</div>',$r['doc']);
-
-      }),
-    ),
-
-  ),
-);
-
-if (strpos(php_uname("n"),'ovh.net')!==false) $DB_CONFS['nb']['order'] = 1;
-return 1;
-
-function tenant_doc(&$r) { return rent_doc('tenant',$r); }
-function place_doc(&$r) { return rent_doc('place',$r); }
-
-function rent_doc($table,&$r) {
-  if (empty($_SERVER['DOCUMENT_ROOT'])) return;
-
-  #if (!empty($r['end']) and date('Ymd') > $r['end']) return $r['doc'] = isset($r['doc']) ? $r['doc'] : '';
-
-  $url = '';
-  foreach (['id'.$table,'id'] as $k) {
-    if (isset($r[$k])) {
-      $url = '/data/'.$table.'/'.$r[$k];
-      break;
-    }
-  }
-  if (!$url) return;
-
-  if (!isset($r['doc'])) $r['doc'] = '';
-#debug($_SERVER['DOCUMENT_ROOT'].$url);
-  if (
-
-    # Web url
-    (
-      empty($r['doc']) and file_exists( $dir = $_SERVER['DOCUMENT_ROOT'].$url )
-    )
-
-    # Absolute path
-    or (
-      ( $dir = nb::untilde($r['doc']) ) 
-      and file_exists($dir) and is_dir($dir)
-      and ($url='' or 1)
-    )
-
-  ) {
-
-    foreach (nb::ls_dir($dir,'',true) as $p) {
-      $r['doc'] .= sprintf('<a href="%s" class="small">%s</a> ',"$url/$p",
-        nb::prettyText(preg_replace('@^.*?([^/\.]+).*?$@','\1',$p))
-      );
-    }
-
-  }
-
-  if (!empty($r['doc'])) $r['doc'] = '<div class="list">'.$r['doc'].'</div>';
-}
-?>
diff --git a/etc/dbs/owncloud.php b/etc/dbs/owncloud.php
deleted file mode 100644 (file)
index f1c7817..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-$DB_CONFS['owncloud'] = [
-  '_import' => '_nico',
-  'name' => 'owncloud',
-  'type' => 'mysql',
-  'host' => 'admin.izideal.vpn',
-  #'default_table' => 'oc_users',
-  'default_table' => 'oc_last_files',
-  'tables' => [
-    'oc_contact' => [
-      #'sql' => "SELECT * FROM oc_contacts_cards_properties",
-      'sql' => "SELECT c.id"
-        #.",org.value as org"
-        #.",name.value as name"
-        #.",tel.value as tel"
-        .",TRIM(CONCAT("
-          ."(SELECT value FROM oc_cards_properties p WHERE p.name='ORG' AND p.cardid=c.id AND p.addressbookid=c.addressbookid)"
-          .",' ',"
-          ."(SELECT value FROM oc_cards_properties p WHERE p.name='FN' AND p.cardid=c.id AND p.addressbookid=c.addressbookid)"
-        .")) as name"
-        .",(SELECT value FROM oc_cards_properties p WHERE p.name='TEL' AND p.cardid=c.id AND p.addressbookid=c.addressbookid ORDER BY preferred DESC LIMIT 1) as tel"
-        .",(SELECT value FROM oc_cards_properties p WHERE p.name='EMAIL' AND p.cardid=c.id AND p.addressbookid=c.addressbookid ORDER BY preferred DESC LIMIT 1) as email"
-      . " FROM oc_cards c GROUP BY c.id HAVING name IS NOT NULL AND name<>''"
-      ,
-      'row_parse_pre' => 'owncloud_row_parse',
-    ],
-    'oc_last_files' => [
-      'sql' => "SELECT path,mtime FROM oc_filecache WHERE path NOT LIKE 'files_versions/%' ORDER BY fileid DESC LIMIT 10",
-      'row_parse_pre' => function(&$r) {
-        $r['mtime'] = date ("Y-m-d H:i:s",$r['mtime']);
-      }
-    ],
-  ],
-];
-
-function owncloud_row_parse(&$r) {
-  foreach ($r as $k=>$v) {
-    $v = str_replace(chr(194).chr(160),' ',$v);
-    $r[$k] = $v;
-  }
-}
-?>
diff --git a/etc/dbs/postfix.php b/etc/dbs/postfix.php
deleted file mode 100644 (file)
index 8c10855..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-$DB_CONFS['postfix'] = array (
-  'title' => 'Postfix on Izideal',
-  'type' => 'mysql',
-  'host' => 'admin.izideal.vpn',
-  'user' => 'postfix',
-);
-?>
diff --git a/etc/dbs/puppetdb.php b/etc/dbs/puppetdb.php
deleted file mode 100644 (file)
index cfe407b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-$DB_CONFS['puppetdb'] = array (
-  'title' => 'Puppetdb',
-  'host' => 'big.cascais.loc',
-  'type' => 'pgsql',
-  'user' => 'puppetdb',
-  'default_table' => 'view_hosts',
-  'row_parse' => function(&$r) {
-    foreach ($r as $k=>$v) {
-      # Clean date time
-      $r[$k] = preg_replace('/^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\.\d+$/','\1',$v);
-    }
-  },
-# NB 11.04.16   'tables' => 
-# NB 11.04.16   array (
-# NB 11.04.16     'hosts' => 
-# NB 11.04.16     array (
-# NB 11.04.16       'row_parse_pre' => function(&$r) {
-# NB 11.04.16         foreach ($r as $k=>$v) {
-# NB 11.04.16           $r[$k] = preg_replace('/(:\d\d)\.\d+/','\1',$v);
-# NB 11.04.16         }
-# NB 11.04.16       },
-# NB 11.04.16     ),
-# NB 11.04.16   ),
-);
-?>
diff --git a/etc/dbs/ui.php b/etc/dbs/ui.php
deleted file mode 100644 (file)
index eaae442..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-<?php
-$DB_CONFS['_ui'] = array(
-  'title' => 'Semantico UI',
-  'type' => 'sqlite',
-  'host' => (file_exists('/opt/www/sem_ui/var/db/semantico.db') ?  '/opt/www/sem_ui/var/db/semantico.db' : "$DIR_SQLITE/semantico.db"),
-  'default_table' => 'node',
-
-  'tables' => array(
-
-    'aws_az' => array(
-      'extras'=> array(
-        #'network_idsubnet' => "(SELECT code FROM network WHERE network.id='subnet-' || aws_az.id)",
-        'aws_region_cidr' => "(SELECT cidr FROM aws_region WHERE aws_region.id=idaws_region)",
-        'aws_region_idvpc' => "(SELECT idvpc FROM aws_region WHERE aws_region.id=idaws_region)",
-        'aws_region_sg' => "(SELECT sg FROM aws_region WHERE aws_region.id=idaws_region)",
-        'aws_ec2s' => "(SELECT count(*) FROM aws_ec2 WHERE aws_az.id=idaws_az)",
-        'idnetwork' => "(SELECT id FROM network WHERE network.id='subnet-' || aws_az.id)",
-        'network_subnet' => "(SELECT network FROM network WHERE network.id='subnet-' || aws_az.id)",
-        'ec2' => "CONCAT('--region ',(SELECT id FROM aws_region WHERE aws_region.id=idaws_region),' --subnet-id ',(SELECT id FROM aws_subnet WHERE aws_subnet.aws_azid=aws_az.id),' --security-group-ids ',(SELECT sg FROM aws_region WHERE aws_region.id=idaws_region),' --associate-public-ip-address --key-name semadm')"
-        #'subnet' => "(SELECT 'subnet' || aws_az.id)",
-      )
-    ),
-
-    'aws_region' => array(
-      'extras'=> array(
-        'aws_az' => "(SELECT count(*) FROM aws_az WHERE idaws_region=aws_region.id)",
-        'aws_ec2' => "(SELECT count(*) FROM aws_ec2 JOIN aws_az ON idaws_region=aws_region.id)",
-        'aws_rds' => "(SELECT count(*) FROM aws_rds WHERE idaws_region=aws_region.id)",
-        'aws_elb' => "(SELECT count(*) FROM aws_elb WHERE idaws_region=aws_region.id)",
-      ),
-    ),
-
-    'contact' => array(
-      'extras'=> array(
-      'pic' => '\'<img alt="" src="/scripts/gravatar/?email=\' || contact.email || \'" />\'',
-      ),
-    ),
-
-    'vmware' => array(
-      'extras'=> array(
-        'vms' => "(SELECT count(*) FROM vms WHERE vms.idvmware = vmware.id)",
-        'Rack' => "(SELECT idrack FROM rack_node WHERE id=idnode LIMIT 1)",
-      ),
-    ),
-
-    'firewall' => array(
-      'extras'=> array(
-        ' Rack' => "(SELECT idrack FROM rack_node WHERE id=idnode LIMIT 1)",
-      ),
-    ),
-
-    'vms' => array(
-      'extras'=> array(
-        'Rack' => "(SELECT idrack FROM rack_node WHERE idvmware=idnode LIMIT 1)",
-      ),
-    ),
-
-    'company' => array(
-      'extras'=> array(
-        'nodes' => "(SELECT count(*) FROM node WHERE node.idcompany = company.id)",
-        'peoples' => "(SELECT count(*) FROM people WHERE people.idcompany = company.id)",
-      ),
-    ),
-
-    'service' => array(
-      'extras'=> array(
-        'products' => '(SELECT GROUP_CONCAT(idproduct,", ") FROM product_service WHERE idservice=id)',
-      ),
-    ),
-
-    'product' => array(
-      'extras'=> array(
-        'service' => '(SELECT GROUP_CONCAT(idservice,", ") FROM product_service WHERE idproduct=id)',
-        #'nodes' => "(SELECT count(*) FROM node WHERE node.id LIKE '___' || product.id || '%')",
-      ),
-    ),
-
-    'dc' => array(
-      #'nodes' => "(SELECT count(*) FROM node WHERE node.id LIKE '%' || dc.id || '_')",
-      'nodes' => "(SELECT count(*) FROM node WHERE node.iddc = dc.id)",
-      #'dns-scr' => "(SELECT count(*) FROM dns WHERE dns.src LIKE '%' || dc.id || '%')",
-      #'dns-dst' => "(SELECT count(*) FROM dns WHERE dns.dst LIKE '%' || dc.id || '%')",
-    ),
-
-    'node' => array(
-      'row_parse_post'=> function(&$r) {
-        global $Db;
-        $metas = [];
-        foreach ($Db->rows(
-          #"SELECT name,value FROM fact WHERE name IN ('environment','last_run') AND idnode=".$Db->quote($r['id'])
-          #"SELECT * FROM (SELECT 'dell-drac' as 'n',replace(src,'.semantico.net','') as 'v' FROM dns WHERE src LIKE ".$Db->quote($r['id'].'-rac.%')." ORDER BY length(v) LIMIT 1) drac"
-          ""
-          ."SELECT 'idvmware',idvmware FROM vms WHERE vms.idnode=".$Db->quote($r['id'])
-          ." UNION SELECT 'env',value FROM fact WHERE name = 'environment' AND idnode=".$Db->quote($r['id'])
-          ." UNION SELECT 'aws_ec2',id FROM aws_ec2 WHERE aws_ec2.idnode=".$Db->quote($r['id'])
-          ." UNION SELECT 'last_backup',CONCAT('<a href=\"#\" onclick=\"alert(''Directories:\\n\\n ',replace(dirs,' ','\\n'),''');return false\">',max(date),'</a>') as v FROM backup WHERE idnode=".$Db->quote($r['id'])." GROUP BY dirs"
-          ." UNION SELECT 'last_run',substr(value,1,10) FROM fact WHERE name = 'last_run' AND idnode=".$Db->quote($r['id'])." AND value < ".$Db->quote(date('Y-m-d', strtotime('-3 days')))
-          ." UNION SELECT 'rack',CONCAT(idrack,'/',position) FROM rack_node WHERE idnode=".$Db->quote($r['id'])." OR idnode IN (SELECT idvmware FROM vms WHERE vms.idnode=rack_node.idnode)"
-          ." UNION SELECT 'switch' as n, CONCAT(id,':',port) as v FROM switch_port WHERE switch_port.idnode=".$Db->quote($r['id'])." AND switch_port.port NOT LIKE 'ch%'"
-        ,PDO::FETCH_NUM) as $f) { $metas[$f[0]] = $f[1]; }
-        if ($metas) {
-          $r['metas'] = join("",array_map(function($k,$v){return (string)$v==="" ? "" : "$k=$v\n";},array_keys($metas),$metas));
-        }
-
-        $r['keyevent'] = $Db->row("SELECT count(*) FROM fact WHERE fact.idnode=".$Db->quote($r['id']));
-        $r['graph'] = '<a target="_blank" href="/graphite/?Hosts='.$r['id'].'"><img alt="" src="/images/graphite.png" /></a>';
-        #debug($facts);
-      },
-      /*
-      'extras'=> array(
-        # n => v
-        'metas' => preg_replace('/(^\t|\n$)/',' ',"(SELECT GROUP_CONCAT(n || '=' || v,'\n') FROM (
-          SELECT * FROM (SELECT 'dell-drac' as 'n',replace(src,'.semantico.net','') as 'v' FROM dns WHERE src LIKE CONCAT(node.id,'-rac.%') ORDER BY length(v) LIMIT 1) drac
-          UNION SELECT 'idvmware' as 'n',idvmware as 'v' FROM vms WHERE vms.idnode=node.id
-          UNION SELECT 'env' as 'n',value as 'v' FROM fact WHERE fact.idnode=node.id AND name='environment'
-          UNION SELECT 'aws_ec2' as 'n',id as 'v' FROM aws_ec2 WHERE aws_ec2.idnode=node.id
-          UNION SELECT 'last_backup' as 'n',CONCAT('<a href=\"#\" onclick=\"alert(''Directories:\\n\\n ',replace(dirs,' ','\\n'),''');return false\">',max(date),'</a>') as 'v' FROM backup WHERE idnode=node.id
-          UNION SELECT name as 'n', strftime('%Y-%m-%d',value) as 'v' FROM fact WHERE idnode=id AND name='last_run' AND value < '".date('Y-m-d', strtotime('-3 days'))."'
-          UNION SELECT 'rack' as'n',CONCAT(idrack,'/',position) as 'v' FROM rack_node WHERE id=idnode OR idnode IN (SELECT idvmware FROM vms WHERE vms.idnode=node.id)
-          UNION SELECT 'switch' as 'n', CONCAT(id,':',port) as 'v' FROM switch_port WHERE switch_port.idnode=node.id AND switch_port.port NOT LIKE 'ch%'
-        ) t)"),
-        'fact' => "(SELECT count(*) FROM fact WHERE fact.idnode=node.id)",
-        'keyevent' => "(SELECT count(*) FROM keyevent WHERE keyevent.idnode=node.id)",
-        #'graph' => '\'<a target="_blank" href="/graphite/?Hosts=\' || id || \'"><img alt="" src="/images/graphite.png" /></a>\'',
-      */
-
-    ),
-
-    'view_backup' => array(
-      'row_parse_post'=> function(&$r) {
-        $r['Detail'] = '<a target="_blank" class="view_backup" href="?table=backup&idnode='.$r['idnode'].'">View</a>';
-      },
-    ),
-
-    'view_pingdom_per_month' => array(
-      'row_parse_post'=> function(&$r) {
-        $r['Checks'] = '<a target="_blank" class="pingdom_check_report" href="?table=pingdom_check_policy&idpingdom_policy='.$r['idpingdom_policy'].'">'.$r['Checks'].'</a>';
-      },
-      'extras' => array(
-        'Checks' => '(SELECT count(*) FROM pingdom_check_policy pcp WHERE pcp.idpingdom_policy=view_pingdom_per_month.idpingdom_policy)',
-      ),
-    ),
-
-    'pingdom_check' => array(
-      'row_parse_post'=> function(&$r) {
-        $r['View'] = '<a target="_blank" class="pingdom_check_report" href="https://my.pingdom.com/reports/uptime#check='.$r['id'].'"><img alt="" src="/images/graphite.png" /></a>';
-      },
-
-    ),
-    'network_ips' => array('sql' => "SELECT id as idnetwork,code,network,iddc,count(*) as count FROM network n JOIN view_ip ON cidr_range(network,ip) WHERE n.network IS NOT NULL AND n.hidden=0 AND EXISTS(SELECT 1 FROM fact WHERE value=ip AND name LIKE 'ipaddress%') GROUP BY n.id"),
-    'view_puppet_error' => array('sql' => "SELECT idnode ,idcompany ,iddc ,value as last_run FROM fact JOIN node ON id=idnode WHERE name='last_run' AND substr(value,1,10) <='".date('Y-m-d', strtotime('-3 days'))."'"),
-    'view_backup_error' => array('sql' => "SELECT idnode,idcompany,iddc,server,max(backup.date) as date FROM backup JOIN node ON id=idnode WHERE NOT EXISTS (SELECT 1 FROM node_decommission nd WHERE nd.id=node.id) GROUP BY idnode HAVING date <= '".date('Y-m-d', strtotime('-2 days'))."' ORDER BY backup.date")
-
-  ),
-);
-$DB_CONFS['ui'] = [
-  '_import' => ['_ui'],
-  'order' => (preg_match('/^(dev|isp|ist)/',php_uname('n')) ? 1 : null),
-  #'order' => 1,
-];
-$DB_CONFS['ui-pgsql'] = [
-  'host' => 'ui.semantico.net',
-  'type' => 'pgsql',
-  'name' => 'ui',
-  'pdo' => '',
-  '_import' => ['_ui','_semadm'],
-];
-$DB_CONFS['ui-mysql'] = [
-  'host' => 'ui.semantico.net',
-  'type' => 'mysql',
-  'name' => 'ui',
-  'pdo' => '',
-  'sql_pre' => [
-    'SET SESSION sql_mode=PIPES_AS_CONCAT',
-  ],
-  '_import' => ['_ui','_semadm'],
-];
-#bye(realpath(dirname(__FILE__).'/../../lib/php/db.php'));
-#require_once(realpath(dirname(__FILE__).'/../../lib/php/db/types/sqlite.php'));
-#bye($DB_TYPES['sqlite']);
-# NB 24.06.16 if (!empty($DB_TYPES['sqlite']) and 0)
-# NB 24.06.16 $DB_TYPES['sqlite']['sqliteCreateFunction'] = array_merge($DB_TYPES['sqlite']['sqliteCreateFunction'],array(
-# NB 24.06.16   'gethostbyaddr' => function ($value) { return gethostbyaddr($value); },
-# NB 24.06.16   'ip2int' => function ($value) { return ip2long($value); },
-# NB 24.06.16   'int2ip' => function ($value) { return long2ip($value); },
-# NB 24.06.16   'concat' => function ($v1,$v2) { return $v1.$v2; },
-# NB 24.06.16   'cidr_range' => function ( $cidr, $chkip=null ) { return cidr_range( $cidr,$chkip); },
-# NB 24.06.16 ));
-?>
diff --git a/etc/dbs/wp.php b/etc/dbs/wp.php
deleted file mode 100644 (file)
index af776f2..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-$DB_CONFS['wp'] = [
-  'title' => 'Wordpress',
-  'host' => 'admin.izideal.vpn',
-  'type' => 'mysql',
-  '_import' => '_nico',
-  'default_table' => 'wp_blogs',
-  'tables' => [
-    'wp_options' => [
-      'row_parse_pre' => function(&$r) { foreach ($r as $k=>$v) { $r[$k] = str_replace("\0",'',$v); } },
-    ],
-  ],
-];
-
-if (false and !empty($GLOBALS['wpdb'])) {
-  $DB_CONFS['wp']['type'] = 'sqlite';
-  $DB_CONFS['wp']['host'] = DB_DIR.'/'.DB_FILE;
-}
-
-$DB_CONFS['wp-sqlite'] = array (
-  'host' => "$DIR_SQLITE/wp.db",
-  'type' => 'sqlite',
-  '_import' => 'wp',
-);
-?>
index b9b094f30ff4b715ad0325e55052e29faa0178c3..dc801ff7b11dfc0ece5555983dc9053508657fd7 100644 (file)
@@ -92,6 +92,7 @@ verbose() {
 #
 #################################################################################
 #shopt -s extglob
+#${1?"Usage: $0 ARGUMENT"}
 while [ $# -gt 0 ]; do
 
   case "$1" in
index b5b6623f7e1d57f611450ea0984e6a7c90528688..f2fad75e62f8be00abd64bba9509bae85be48259 100644 (file)
@@ -73,7 +73,7 @@ class Db extends nb {
 
   # Classes
   public $out;
-  public $_no_connect;
+# NB 21.09.16   public $_no_connect;
 
   function __construct($opt = '') {
 
@@ -149,16 +149,13 @@ class Db extends nb {
 
       # Extract args from pdo
       if (preg_match_all("/[:;](\w+)=([^;]+)/",$this->pdo,$m,PREG_SET_ORDER)) {
-        #array_shift($m);
         foreach ($m as $param) {
           $k = $param[1];
           if ($k == 'dbname') $k = 'name';
           if (!empty($this->$k)) continue;
           $this->$k = $param[2];
         }
-        #$this->bye($m);
       }
-      #$this->bye($this->pdo);
 
       if ($p = $this->p('db.host')) $this->host = $p;
 
@@ -200,6 +197,7 @@ class Db extends nb {
 
     if (!empty($this->conn)) return false;
     # Pdo
+    if (empty($this->pdo)) $this->bye("db: `".$this->id."`: Missing pdo: check host, name, user, password");
     if (empty($this->pdo)) return false;
 
     # Type
@@ -538,67 +536,85 @@ class Db extends nb {
   public static function conf_load($files=[],&$first=false) {
     if (empty($files)) return [];
 
-    # Load all files into a $h if #files is not a hash
+    #
+    # Load all files into a $dbs if #files is not a hash
+    #
 
-    $h = [];
+    $dbs = [];
     if (is_scalar($files)) $files = array($files);
 
     foreach ($files as $file) {
+
+      $file = self::untilde($file);
+
       if (!is_readable($file)) continue;
 
       if (preg_match('/\.(yaml|yml)$/i',$file) and ($yaml = yaml_parse_file($file))) {
-        $h = array_replace_recursive($h,$yaml);
+        $dbs = array_replace_recursive($dbs,$yaml);
 
       } elseif (preg_match('/\.php$/i',$file)) {
-        #global $DB_CONFS;
         require($file);
-        if (!empty($DB_CONFS)) $h = array_replace_recursive($h,$DB_CONFS);
+        if (!empty($DBQ)) $dbs = array_replace_recursive($dbs,$DBQ);
 
       }
 
     }
-    unset($yaml,$DB_CONFS);
-    if (!$h) return false;
+    unset($yaml,$DBQ);
+    if (!$dbs) return false;
 
-    # Emulate hash pointer _import
-    foreach ($h as $db=>$o) {
+    #
+    # Import database conf with key _import
+    #
+    foreach ($dbs as $id=>$params) {
 
-      foreach ((array)$o as $k => $v) {
+      $params = (array)$params;
+
+      # If _default exists spush it to all dbs's _import
+      if ($id == '_default') {
+        continue;
+      } elseif(!empty($dbs['_default'])) {
+        if (empty($params['_import'])) $params['_import'] = [];
+        elseif (is_scalar($params['_import'])) $params['_import'] = (array)$params['_import'];
+        $params['_import'][] = '_default';
+      }
+
+      foreach ($params as $k => $v) {
         if ($k != '_import') continue;
 
         $import = is_array($v) ? $v : explode(',',$v);
         foreach ($import as $v) {
-          if (empty($h[$v])) continue;
+          if ($id == $v) this::bye("Infinite loop: _import $id = $v");
+          if (empty($dbs[$v])) continue;
 
-          foreach ($h[$v] as $kk => $vv) {
-            if (!isset($o[$kk])) $h[$db][$kk] = $vv;
+          foreach ($dbs[$v] as $kk => $vv) {
+            if (!isset($params[$kk])) $dbs[$id][$kk] = $vv;
           }
         }
 
-        unset($h[$db][$k]);
+        unset($dbs[$id][$k]);
       }
     }
 
     # Remove db starting with _
-    foreach ($h as $db=>$o) { if (preg_match('/^_/',$db)) unset($h[$db]); }
+    foreach ($dbs as $db=>$o) { if (preg_match('/^_/',$db)) unset($dbs[$db]); }
 
     # Add missing name
-    foreach ($h as $db=>$o) {
-      if (empty($o['name'])) $h[$db]['name'] = $db;
-      if (empty($o['id'])) $h[$db]['id'] = $db;
+    foreach ($dbs as $db=>$o) {
+      if (empty($o['name'])) $dbs[$db]['name'] = $db;
+      if (empty($o['id'])) $dbs[$db]['id'] = $db;
     }
 
     # Sort by `order`, min first
-    uasort($h,function($a,$b){
+    uasort($dbs,function($a,$b){
       if (empty($a['order']) and empty($b['order'])) return strcmp($a['id'],$b['id']);
       $a_ = !empty($a['order']) ? $a['order'] : 9999999;
       $b_ = !empty($b['order']) ? $b['order'] : 9999999;
       return($a_-$b_);
     });
 
-    if (!$h) return false;
-    if ($first !== false) $first = self::ar_first($h);
-    return $h;
+    if (!$dbs) return false;
+    if ($first !== false) $first = self::ar_first($dbs);
+    return $dbs;
   }
 
   /**
@@ -669,10 +685,9 @@ class Db extends nb {
 
     # Connection
     $Db->__construct($db);
-    if (empty($Db->_no_connect)) {
-      if (empty($Db->pdo)) $Db->bye("No pdo for db: `".$Db->p('db')."`");
+# NB 21.09.16     if (empty($Db->_no_connect)) {
       $Db->connect();
-    }
+# NB 21.09.16     }
 
     /*
       Table
@@ -1006,7 +1021,7 @@ class Db extends nb {
     $has_order = false;
 
     foreach ($this->conf as $id => $attr) {
-      $attr['_no_connect'] = true;
+# NB 21.09.16       $attr['_no_connect'] = true;
       $attr['id'] = $id;
       if (isset($attr['id'])) $has_order = true;
       $d = new Db($attr);
index f2e0817bf6d0b1e459c827baf9dab1693e73d37f..a2dbe1424d388acfa99e2eaa1a516d2bdf2be6e3 100644 (file)
@@ -4,5 +4,19 @@ require_once(realpath(dirname(__FILE__).'/../db.php'));
 
 Db::pinit();
 
-$DB_CONFS = Db::conf_load([ Db::ROOT_DIR.'/etc/dbs.yaml',Db::ROOT_DIR.'/etc/dbs.php','/etc/dbs.yaml' ]);
+$DB_CONFS = Db::conf_load([
+  Db::ROOT_DIR.'/etc/dbs.yaml',
+  Db::ROOT_DIR.'/etc/dbs.php',
+
+  Db::ROOT_DIR.'/etc/dbq.yaml',
+  Db::ROOT_DIR.'/etc/dbq.php',
+
+  '/etc/dbq.yaml',
+
+  '/etc/dbq.yaml',
+  '/etc/dbq.php',
+
+  '~/.dbq.yaml',
+  '~/.dbq.php',
+]);
 ?>