--- /dev/null
+<?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];
+}
+
+?>
--- /dev/null
+_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
--- /dev/null
+<?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].'&idplace=:idplace&idtenant=:idtenant&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>';
+}
+?>
--- /dev/null
+<?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;
+ }
+}
+?>
--- /dev/null
+<?php
+$DBQ['postfix'] = array (
+ 'title' => 'Postfix on Izideal',
+ 'type' => 'mysql',
+ 'host' => 'admin.izideal.vpn',
+ 'user' => 'postfix',
+);
+?>
--- /dev/null
+<?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 ),
+);
+?>
--- /dev/null
+<?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 ));
+?>
--- /dev/null
+<?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',
+);
+?>
+++ /dev/null
-<?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];
-}
-
-?>
+++ /dev/null
-_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
+++ /dev/null
-<?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].'&idplace=:idplace&idtenant=:idtenant&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>';
-}
-?>
+++ /dev/null
-<?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;
- }
-}
-?>
+++ /dev/null
-<?php
-$DB_CONFS['postfix'] = array (
- 'title' => 'Postfix on Izideal',
- 'type' => 'mysql',
- 'host' => 'admin.izideal.vpn',
- 'user' => 'postfix',
-);
-?>
+++ /dev/null
-<?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 ),
-);
-?>
+++ /dev/null
-<?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 ));
-?>
+++ /dev/null
-<?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',
-);
-?>
#
#################################################################################
#shopt -s extglob
+#${1?"Usage: $0 ARGUMENT"}
while [ $# -gt 0 ]; do
case "$1" in
# Classes
public $out;
- public $_no_connect;
+# NB 21.09.16 public $_no_connect;
function __construct($opt = '') {
# 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;
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
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;
}
/**
# 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
$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);
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',
+]);
?>