Bitácora un script php para bash

Bitacora, un script php para Linux bash, aunque existen cientos de programas para tomar notas. De hecho yo uso Evernote que es capaz de solucionarme las notas (sobre todo sintaxis) de comandos de Linux, que uso de vez en cuando. Igualmente cuando me hallo en medio de una investigación de algún proyecto, agrupo las páginas web significativas en “libretas” que luego recupero.

Bitácora, es un programa que me permite, igualmente, tomar notas desde el terminal, si bien, puedo realizar informes de esas notas con un aspecto profesional. Su funcionamiento está basado en archivos .ini manejados por PHP.

Funcionamiento

Un archivo .ini tiene una estructura “etiqueta = valor”, es decir, la etiqueta, que no pude repetirse, tendrá asociada un valor a continuación del igual. El archivo .ini es fácilmente convertible en array mediante la función de PHP parse_file_ini().

Como puede verse en el código, doy el nombre de la etiquta la marca de tiempo en formato YYYYMMDDHHMMSS, que será luego fácilemente convertible a formato fecha para humanos, del tipo DD-MM-AAAA HH:II.Mediante las opciones “bitacora printall” y “bitacora printsections [nombre de la sección]” pueden generarse archivos que serán convertidos en informes con formato adecuado para prasentación.

Bitacora tiene un help bastante clarificador.

Instalación

Tan solo colocar en un directorio que sea listado por “echo $PATH”.

Script

  1. #!/usr/bin/env php
  2. <?php
  3.  
  4. /*
  5. Author: Pedro Ruiz Hidalgo
  6. @pedroruizhidalg
  7. License MIT
  8.  
  9. #
  10. VERSION 1.0
  11. CHANGE LOG
  12. *****************************
  13. 1.0 - 2017/11/21 - Initial issue
  14.  
  15. #
  16. */
  17. class init_file
  18. {
  19. public $folder = '/home/pedro/bitacora/bitacora_1/';
  20. public $fileini = 'bitacora.ini';
  21. public $conffile = 'bitacora.conf';
  22.  
  23. function read_conf()
  24. {
  25. system('clear');
  26. $conf=fopen($this->folder.$this->conffile, 'r');
  27.  
  28. while (!feof($conf))
  29. {
  30. echo fgets($conf);
  31. }
  32.  
  33. }
  34.  
  35. function message($msg,$cr=1)
  36. {
  37. $linefedd = str_repeat("\n", $cr);
  38. echo "$msg$linefedd";
  39. }
  40.  
  41. function initfile()
  42. {
  43. return $this->folder.$this->fileini;
  44. }
  45.  
  46. function read_sections($file)
  47. {
  48. return array_keys(parse_ini_file($file,true));
  49. }
  50.  
  51. function section_exists($section)
  52. {
  53. return (in_array($section, $this->read_sections($this->initfile()))) ? TRUE : FALSE;
  54. }
  55.  
  56. function add_section($section)
  57. {
  58. $file = fopen($this->initfile(), 'a');
  59. $section = strtoupper("[$section]");
  60. fwrite($file, $section.PHP_EOL);
  61. fclose($file);
  62. }
  63.  
  64. function list_section($section)
  65. {
  66. $initfile = parse_ini_file($this->initfile(),true);
  67. $multi_array=array_keys($initfile);
  68. $section=strtoupper($section);
  69.  
  70. if(in_array($section, $multi_array))
  71. {
  72. $this->message("[$section]");
  73. foreach ($initfile[$section] as $key => $value)
  74. { $datekey=date('d-m-Y H:i',strtotime($key));
  75. $this->message("$datekey - $value");
  76. }
  77. }
  78. }
  79.  
  80. function addline($section,$line)
  81. {
  82.  
  83. $date = date('Ymdhis');
  84. $array = parse_ini_file($this->initfile(),true);
  85. $section = strtoupper($section);
  86.  
  87. $array[$section][$date] = $ret = "$line";
  88.  
  89. $file = fopen($this->initfile(), 'w');
  90. $sections = $this->read_sections($this->initfile());
  91.  
  92. foreach ($array as $key => $value)
  93. {
  94. fwrite($file, "[$key]".PHP_EOL);
  95. foreach ($value as $ikey => $ivalue)
  96. {
  97. fwrite($file, sprintf('%s = %s',$ikey, $ivalue).PHP_EOL);
  98. }
  99. fwrite($file, PHP_EOL);
  100. }
  101. fclose($file);
  102. return $ret;
  103. }
  104.  
  105. function list_all()
  106. {
  107. $initfile = parse_ini_file($this->initfile(),true);
  108.  
  109. foreach($initfile as $key => $value)
  110. {
  111. $this->message("[$key]");
  112. foreach($value as $ikey => $ivalue)
  113. {
  114. $datekey=date('d-m-Y H:i',strtotime($ikey));
  115. $this->message("$datekey - $ivalue");
  116. }
  117. $this->message(' ');
  118. }
  119. }
  120.  
  121. function print($out_file)
  122. {
  123. $conf = fopen($this->folder.$this->conffile, 'r');
  124.  
  125. $out_file = fopen($out_file,"w");
  126.  
  127. while (!feof($conf))
  128. {
  129. $linefeed = fgets($conf);
  130. fwrite($out_file, $linefeed);
  131. }
  132.  
  133. $initfile = parse_ini_file($this->initfile(),true);
  134.  
  135. foreach($initfile as $key => $value)
  136. {
  137. fwrite($out_file, "[$key]".PHP_EOL);
  138. foreach($value as $ikey => $ivalue)
  139. {
  140. $datekey=date('d-m-Y H:i',strtotime($ikey));
  141. fwrite($out_file, "$datekey - $ivalue".PHP_EOL);
  142. }
  143. fwrite($out_file, "".PHP_EOL);
  144. }
  145.  
  146. fclose($conf);
  147. fclose($out_file);
  148.  
  149. }
  150.  
  151. function printsection($section,$out_file)
  152. {
  153. $conf = fopen($this->folder.$this->conffile, 'r');
  154. $out_file = fopen($out_file,"w");
  155. $section = strtoupper($section);
  156.  
  157. while (!feof($conf))
  158. {
  159. $linefeed = fgets($conf);
  160. fwrite($out_file, $linefeed);
  161. }
  162.  
  163. $initfile = parse_ini_file($this->initfile(),true);
  164. $multi_array=array_keys($initfile);
  165.  
  166. if(in_array($section, $multi_array))
  167. {
  168. fwrite($out_file, "[$section]".PHP_EOL);
  169.  
  170. foreach ($initfile[$section] as $key => $value)
  171. {
  172. $datekey=date('d-m-Y H:i',strtotime($key));
  173. fwrite($out_file, "$datekey - $value".PHP_EOL);
  174. }
  175. }
  176.  
  177. fclose($conf);
  178. fclose($out_file);
  179. }
  180.  
  181. }
  182.  
  183. $expediente = new init_file;
  184.  
  185. $cmd = (isset($argv[1]) ? $argv[1] : NULL);
  186. $sections = (isset($argv[2]) ? $argv[2] : NULL);
  187. $append = (isset($argv[3]) ? $argv[3] : NULL);
  188. $name = explode('/',$argv[0]);
  189. $name = end($name);
  190.  
  191. switch ($cmd) {
  192. case 'sections':
  193. $section_name = $expediente->read_sections($expediente->initfile());
  194. $expediente->read_conf();
  195. foreach ($section_name as $section)
  196. {
  197. $expediente->message("$section");
  198. }
  199. $expediente->message('');
  200. break;
  201.  
  202. case 'add':
  203. if(! $expediente->section_exists($sections))
  204. {
  205. if($sections!='*')
  206. {
  207. $expediente->add_section($sections);
  208. $expediente->read_conf();
  209. $expediente->message("$sections ha sido creado",2);
  210. } else {
  211. $expediente->message("el nombre de la sección no puede ser $sections",2);
  212. }
  213. } else {
  214. $expediente->read_conf();
  215. $expediente->message("\n$sections ya existe",2);
  216. }
  217. break;
  218.  
  219. case 'addline':
  220. $enough_data = (!$sections || !$append) ? FALSE : TRUE;
  221. if ( $enough_data )
  222. {
  223. $expediente->read_conf();
  224. $expediente->message("añadido en $sections ".$expediente->addline($sections,$append));
  225. } else {
  226. $expediente->message("\nFaltan datos",2);
  227. }
  228.  
  229. break;
  230.  
  231. case 'list':
  232. $expediente->read_conf();
  233. if ( (! $append == '*') )
  234. {
  235. $expediente->list_section(strtoupper($sections));
  236. } else {
  237. $expediente->list_all();
  238. }
  239. break;
  240.  
  241. case 'help':
  242. $expediente->message('');
  243. $expediente->message("\t$name sections para ver secciones",2);
  244. $expediente->message("\t$name add para añadir secciones");
  245. $expediente->message("\t$name addline [section] 'contenido' para añadir una linea en una sección",2);
  246. $expediente->message("\t$name list [expediente] para listar una sección");
  247. $expediente->message("\t$name list * para listar todo el expediente",2);
  248. $expediente->message("\t$name printall [archivo] para generar un archivo");
  249. $expediente->message("\t$name printsection [expediente] [archivo] para generar archivo",2);
  250. $expediente->message("\t$name help para ver esta ayuda");
  251. $expediente->message("\tman $name",2);
  252. break;
  253.  
  254. case 'printall':
  255. $enough_data = (!$sections ) ? FALSE : TRUE;
  256. if( $enough_data )
  257. {
  258. if ( $enough_data )
  259. $expediente->print($sections);
  260. $expediente->read_conf();
  261. $expediente->message("\nCreado $sections",2);
  262. }
  263. break;
  264.  
  265. case 'printsection':
  266. $enough_data = (!$sections || !$append) ? FALSE : TRUE;
  267. if ( $enough_data )
  268. {
  269. $expediente->read_conf();
  270. $expediente->printsection($sections,$append);
  271. $expediente->message("\nCreado $append",2);
  272. } else {
  273. $expediente->message("\nFaltan datos",2);
  274. }
  275. break;
  276.  
  277. default:
  278. $expediente->read_conf();
  279. $expediente->message("\n$name help para ayuda",2);
  280. break;
  281.  
  282. } //end switch
  283.  
  284. // EOF

Deja un comentario