#!/bin/bash # file: gsl__post_manager # Folder: /var/lib/gsl/scripts # By echolib # License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 #----------------------------------------------------------------------- # ----------------------------------------------------------- # MAIN LOOP. Read from Post list. Do according to Post Status # ----------------------------------------------------------- #----------------------------------------------------------------------- gsl__loop_posts() { gsl__logs_print \ "$gsl_log_i" \ "Found" \ "Posts" \ "$gsl_nbr_posts" \ "${PWD}" for gsl_post in `ls -1 *.gsl 2>/dev/null` do # Check specific asked Post if [[ "$gsl_this_post" ]];then ! [[ "$gsl_post" == "$gsl_this_post" ]] && continue fi # Post too small gsl__post_hash_size if (( "$gsl_post_size" <= $gsl_post_min_size ));then gsl__logs_print \ "$gsl_log_e" \ "Post" \ "Size" \ "Too small $gsl_post_size <= $gsl_post_min_size" \ "${PWD}/$gsl_post" continue fi # From COMMAND [OPT] case "$1" in check) if ! [[ "$gsl_force_check" ]];then gsl__post_compare_hash || continue fi gsl__logs_print \ "$gsl_log_i" \ "Reading" \ "Post" \ "$gsl_post" \ "${PWD}" gsl_process="Checked" gsl__all_checkers ;; make) gsl_process="Made" gsl__db_exists "$gsl_file_db_posts" case "$gsl_db_post_status" in Checked) gsl__post_compare_hash || continue gsl__all_makers ;; Made) gsl__logs_print "$gsl_log_w" \ "Post" \ "Make" \ "$gsl_post already Converted" \ "$gsl_file_db_posts" continue ;; esac ;; esac done [[ "$gsl_checker_war" ]] \ && gsl log -s -w [[ "$gsl_checker_err" ]] \ && gsl log -s -e [[ "$gsl_check_done" ]] \ && echo "# Check already done" } #----------------------------------------------------------------------- # -------------------- # Doing some checkings # -------------------- #----------------------------------------------------------------------- #======================================================================= # Check NAME post from [OPT] ; should be from autocompletion #======================================================================= gsl__check_opt_post() { [[ `ls -1 *.gsl | grep "$1"` ]] \ && gsl_this_post="$1" } #======================================================================= # Check if posts from PWD folder #======================================================================= gsl__check_nbr_posts() { gsl_nbr_posts=`ls -1 *.gsl 2>/dev/null | wc -l` ! (( $gsl_nbr_posts >= 1 )) \ && echo "! No Posts found with .gsl extension" \ && exit 1 } #======================================================================= # Check if Post has same Hash #======================================================================= gsl__post_compare_hash() { gsl__db_post_hash case "$gsl_process" in Checked) if [[ "$gsl_db_post_hash" == "$gsl_post_hash" ]];then gsl__logs_print \ "$gsl_log_i" \ "Post" \ "Hash" \ "$gsl_post already Checked from $gsl_post_hash" \ "$gsl_file_db_posts" gsl_check_done=true return 1 fi ;; Made) if ! [[ "$gsl_db_post_hash" == "$gsl_post_hash" ]];then gsl__logs_print \ "$gsl_log_e" \ "Post" \ "Hash" \ "$gsl_post has changed. Check it again" \ "$gsl_file_db_posts" unset gsl_check_done gsl_checker_err=true return 1 fi # Compare external content hash while read "gsl_content_filename" do #unset gsl_db_file_hash gsl_file_hash ! [[ "$gsl_content_filename" ]] && continue gsl_db_file_hash=` grep "$gsl_content_filename" "$gsl_file_db_files" \ | awk -F: '{print $2}'` gsl_file_hash=` cksum "$gsl_dir_domain_files/$gsl_content_filename" \ | awk '{print $1}'` if ! [[ "$gsl_db_file_hash" == "$gsl_file_hash" ]];then gsl__logs_print \ "$gsl_log_w" \ "File" \ "Hash" \ "$gsl_content_filename has changed. $gsl_db_file_hash $gsl_file_hash" \ "$gsl_file_db_files" gsl_checker_war=true return 1 fi done < <(grep "$gsl_post" "$gsl_file_db_posts" \ | awk -F"|" \ '{for(i=7;i<=NF;i++){print $i}}') ;; esac } #======================================================================= # Check NEEDED Fields from HEADER #======================================================================= gsl__check_header_fields() { if ! [[ "$gsl_post_header_field_1" ]] || \ ! [[ "$gsl_post_header_field_2" ]];then gsl__logs_print \ "$gsl_log_e" \ "$1" \ "$2" \ "Line:$gsl_post_header_line_nbr > Content: $3" \ "${PWD}/$gsl_post" gsl_checker_err=true return fi } #======================================================================= # Check OPTIONAL Field 3 from HEADER #======================================================================= gsl__check_header_field3() { if ! [[ "$gsl_post_header_field_3" ]];then case "$2" in Image) gsl__logs_print \ "$gsl_log_e" \ "$1" \ "$2" \ "Line:$gsl_post_header_line_nbr > No ALT TEXT ?" \ "${PWD}/$gsl_post" gsl_checker_err=true ;; *) gsl__logs_print \ "$gsl_log_w" \ "$1" \ "$2" \ "Line:$gsl_post_header_line_nbr > No ALT TEXT ?" \ "${PWD}/$gsl_post" gsl_checker_war=true ;; esac fi } #----------------------------------------------------------------------- # -------------- # Tools for Post # -------------- #----------------------------------------------------------------------- #======================================================================= # Get Post Hash #======================================================================= gsl__post_hash_size() { gsl_post_csum=`cksum "$gsl_post"` gsl_post_hash=`awk '{print $1}' <<< "$gsl_post_csum"` gsl_post_size=`awk '{print $2}' <<< "$gsl_post_csum"` } #======================================================================= # Get line nbr from Post... $1: TERM | $2: File #======================================================================= gsl__get_line() { awk -v s="$1" \ 'match($0,s) {print NR}' \ "$2" } #======================================================================= # Get everything after the marker... $1: marker | $2: File #======================================================================= gsl__get_header() { awk -F"$1" -v marker="$1" -v l="$gsl_post_begin" \ 'NR < l && $0 ~ marker {print $2}' \ "$2" 2>/dev/null } #======================================================================= # Get fields from variable... $1: field | $2: variable #======================================================================= gsl__get_header_field() { awk -F" : " -v f="$1" \ 'NFS=f {print $NFS}' \ <<< "$2" } #======================================================================= # Get line nbr from CONTENT Post... $1: TERM | $2: File #======================================================================= gsl__get_content_line() { awk -v line="$gsl_post_begin" -v s="$1" \ 'NR >= line && $0 ~ s {print NR}' \ "$2" || return } #======================================================================= # Get CONTENT Post with markers... $1: Open Marker | $2: Close Marker #======================================================================= gsl__get_content_with_markers() { gsl__get_content_finder \ -o "$1" \ -b "$gsl_post_header_field_1" \ -c "$2" \ -f "$gsl_post" \ | tail -1 \ || return } #======================================================================= # Get CONTENT with marks | ! find from ONE line content #======================================================================= gsl__get_content_finder() { # Get [OPTs] while (( "$#" )) do case "$1" in -o) mk_o="$2" ;; # Open marker -c) mk_c="$2" ;; # Close Marker -b) mk_b="$2" ;; # Between markers -f) file="$2" ;; # In whole file -v) ivar="$2" ;; # In variable -n) line="n" ;; # Give found line number esac shift done ! [[ "$file" ]] && ! [[ "$ivar" ]] && return 1 ! [[ "$mk_o" ]] && ! [[ "$mk_c" ]] && return 1 ! [[ "$mk_b" ]] && mk_b='.*' if [[ "$file" ]];then grep -oP$line "(?<=$mk_o)$mk_b?(?=$mk_c)" "$file" && return elif [[ "$ivar" ]];then grep -oP$line "(?<=$mk_o)$mk_b?(?=$mk_c)" <<< "$ivar" && return fi } #======================================================================= # Get NEEDED HEADERS | $1 VAR CONTENT $2 LOG Proc $3 LOG Act #======================================================================= gsl__check_needed_headers() { ! [[ "$1" ]] \ && gsl__logs_print \ "$gsl_log_e" \ "Post" \ "Header $2" \ "Missing: POST TITLE" \ "${PWD}/$gsl_post" \ && gsl_checker_err=true } #======================================================================= # Get Fields and line nbr from header from marker #======================================================================= gsl__get_header_fields() { gsl_post_header_field_1=` gsl__get_header_field 1 "$gsl_header_content_line"` gsl_post_header_field_2=` gsl__get_header_field 2 "$gsl_header_content_line"` gsl_post_header_field_3=` gsl__get_header_field 3 "$gsl_header_content_line"` gsl_post_header_line_nbr=` gsl__get_line "$1$gsl_post_header_field_1" "$gsl_post"` }