From: Nicolas Boisselier Date: Wed, 21 Sep 2016 21:40:56 +0000 (+0100) Subject: rename global and file as DBQ X-Git-Url: https://git.nbdom.net/?a=commitdiff_plain;h=0030163d72c21342adca3ee51572fffbb53fcda1;p=nb.git rename global and file as DBQ --- diff --git a/etc/dbq.php b/etc/dbq.php new file mode 100644 index 00000000..137d5895 --- /dev/null +++ b/etc/dbq.php @@ -0,0 +1,125 @@ + $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 index 00000000..77524aee --- /dev/null +++ b/etc/dbq.yaml @@ -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 index 00000000..42c28662 --- /dev/null +++ b/etc/dbq/nb.php @@ -0,0 +1,115 @@ + '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] = ''.preg_replace('/\.\w+$/','',$t[0]).''; + } + } + + 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('@^(?:]+>)?(.*?)(?:)?$@','
'.trim($revision).'\1
',$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('%s ',"$url/$p", + nb::prettyText(preg_replace('@^.*?([^/\.]+).*?$@','\1',$p)) + ); + } + + } + + if (!empty($r['doc'])) $r['doc'] = '
'.$r['doc'].'
'; +} +?> diff --git a/etc/dbq/owncloud.php b/etc/dbq/owncloud.php new file mode 100644 index 00000000..2435a118 --- /dev/null +++ b/etc/dbq/owncloud.php @@ -0,0 +1,42 @@ + '_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 index 00000000..27c86d0c --- /dev/null +++ b/etc/dbq/postfix.php @@ -0,0 +1,8 @@ + '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 index 00000000..90b49e44 --- /dev/null +++ b/etc/dbq/puppetdb.php @@ -0,0 +1,26 @@ + '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 index 00000000..e2b1bd54 --- /dev/null +++ b/etc/dbq/ui.php @@ -0,0 +1,189 @@ + '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' => '\'\'', + ), + ), + + '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('',max(date),'') 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'] = ''; + #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('',max(date),'') 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' => '\'\'', + */ + + ), + + 'view_backup' => array( + 'row_parse_post'=> function(&$r) { + $r['Detail'] = 'View'; + }, + ), + + 'view_pingdom_per_month' => array( + 'row_parse_post'=> function(&$r) { + $r['Checks'] = ''.$r['Checks'].''; + }, + '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'] = ''; + }, + + ), + '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 index 00000000..d084af96 --- /dev/null +++ b/etc/dbq/wp.php @@ -0,0 +1,25 @@ + '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 index 799ff544..00000000 --- a/etc/dbs.php +++ /dev/null @@ -1,125 +0,0 @@ - $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 index 77524aee..00000000 --- a/etc/dbs.yaml +++ /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 index c6a5a731..00000000 --- a/etc/dbs/nb.php +++ /dev/null @@ -1,115 +0,0 @@ - '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] = ''.preg_replace('/\.\w+$/','',$t[0]).''; - } - } - - 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('@^(?:]+>)?(.*?)(?:)?$@','
'.trim($revision).'\1
',$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('%s ',"$url/$p", - nb::prettyText(preg_replace('@^.*?([^/\.]+).*?$@','\1',$p)) - ); - } - - } - - if (!empty($r['doc'])) $r['doc'] = '
'.$r['doc'].'
'; -} -?> diff --git a/etc/dbs/owncloud.php b/etc/dbs/owncloud.php deleted file mode 100644 index f1c78170..00000000 --- a/etc/dbs/owncloud.php +++ /dev/null @@ -1,42 +0,0 @@ - '_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 index 8c10855b..00000000 --- a/etc/dbs/postfix.php +++ /dev/null @@ -1,8 +0,0 @@ - '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 index cfe407b1..00000000 --- a/etc/dbs/puppetdb.php +++ /dev/null @@ -1,26 +0,0 @@ - '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 index eaae442c..00000000 --- a/etc/dbs/ui.php +++ /dev/null @@ -1,189 +0,0 @@ - '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' => '\'\'', - ), - ), - - '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('',max(date),'') 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'] = ''; - #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('',max(date),'') 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' => '\'\'', - */ - - ), - - 'view_backup' => array( - 'row_parse_post'=> function(&$r) { - $r['Detail'] = 'View'; - }, - ), - - 'view_pingdom_per_month' => array( - 'row_parse_post'=> function(&$r) { - $r['Checks'] = ''.$r['Checks'].''; - }, - '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'] = ''; - }, - - ), - '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 index af776f2c..00000000 --- a/etc/dbs/wp.php +++ /dev/null @@ -1,25 +0,0 @@ - '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', -); -?> diff --git a/etc/vim/templates/bash.tt b/etc/vim/templates/bash.tt index b9b094f3..dc801ff7 100644 --- a/etc/vim/templates/bash.tt +++ b/etc/vim/templates/bash.tt @@ -92,6 +92,7 @@ verbose() { # ################################################################################# #shopt -s extglob +#${1?"Usage: $0 ARGUMENT"} while [ $# -gt 0 ]; do case "$1" in diff --git a/lib/php/db.php b/lib/php/db.php index b5b6623f..f2fad75e 100644 --- a/lib/php/db.php +++ b/lib/php/db.php @@ -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); diff --git a/lib/php/db/config.php b/lib/php/db/config.php index f2e0817b..a2dbe142 100644 --- a/lib/php/db/config.php +++ b/lib/php/db/config.php @@ -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', +]); ?>