You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							161 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							161 lines
						
					
					
						
							4.8 KiB
						
					
					
				| #!/bin/sh -e | |
|  | |
| # A script to check for satellite updates. | |
| # It just downloads the documents which should be updated when the software has an update. | |
| # It's a shitty method, but it kinda works... Other than having a lot of false-positives. | |
| 
 | |
| _show_help() { | |
| echo "This program will help keep your satellites fresh and up to date. | |
| Usage: $0 <[\$dir_satellites] [\$_dir_fresh]|ignore <diff> <ignorediff>> | |
|  | |
| \$dir_satellites = The directory where all the satellites are you want to update. | |
| \$_dir_fresh = The directory that will be used to keep all the files for checking. | |
| ignore = Use this option to generate an ignorediff. | |
| diff = A diff file. Generated without -u or any other fancy options. | |
| ignorediff = A file containing the differences to be ignored (this file will be appended to). | |
|  | |
| The variables (starting with \$) can also be set from a configuration file." | |
| } | |
| 
 | |
| get_variable() { | |
|     printf " | |
|         download() { :; } | |
|         extract() { :; } | |
|         getfile() { :; } | |
|         extrafile() { :; } | |
|         dlextract() { :; } | |
|         dlfile() { :; } | |
|         header_end() { echo \$$1; exit; } | |
|         . %s | |
|     " $2 | sh | |
| } | |
| 
 | |
| download() { | |
|     $(echo "$cmd_download" | sed -e 's@{dst}@'"$2"'@g' -e 's@{src}@'"$1"'@g') 2> /dev/null | |
| } | |
| 
 | |
| diff_extractlines() { | |
|     # Extract all the line numbers from a diff. | |
| 
 | |
|     stage=0 | |
|     for line in $(echo "$1" | awk '{print $1}'); do | |
|         if [ "$stage" = 0 ]; then | |
|             if [ "$line" != ">" -a "$line" != "<" ]; then | |
|                 echo "$line" | |
|                 stage=1 | |
|             fi | |
|         elif [ "$stage" = 1 ]; then | |
|             if [ "$line" != ">" -a "$line" != "<" ]; then | |
|                 if [ "$line" = "---" ]; then | |
|                     stage=0 | |
|                 else | |
|                     echo "$line" | |
|                 fi | |
|             fi | |
|         fi | |
|     done | |
| } | |
| 
 | |
| apply_ignorediff() { | |
|     # Filter a diff, only return the differences that shouldn't be ignored. | |
|     # TODO: This function is slow, due to the usage of awk on every line. A solution for this problem would be great. | |
| 
 | |
|     stage=0 | |
|     ignore=0 | |
|     echo "$1" | while read line; do | |
|         first="$(echo "$line" | awk '{print $1}')" | |
|         if [ "$stage" = 0 ]; then | |
|             if [ "$first" != ">" -a "$first" != "<" ]; then | |
|                 stage=1 | |
|                 ignore=0 | |
|                 if grep -e "^$line\$" "$2" > /dev/null; then | |
|                     ignore=1 | |
|                 fi | |
|             fi | |
|         elif [ "$stage" = 1 ]; then | |
|             if [ "$first" != ">" -a "$first" != "<" ]; then | |
|                 if [ "$line" = "---" ]; then | |
|                     stage=0 | |
|                 else | |
|                     ignore=0 | |
|                     if grep -e "^$line\$" "$2" > /dev/null; then | |
|                         ingore=1 | |
|                     fi | |
|                 fi | |
|             fi | |
|         fi | |
| 
 | |
|         if [ "$ignore" = 0 ]; then | |
|             echo "$line" | |
|         fi | |
|     done | |
| } | |
| 
 | |
| # Do something completely different when this option is provided. | |
| if [ "$1" = "ignore" ]; then | |
|     if [ $# -lt 3 ]; then | |
|         _show_help | |
|         exit 1 | |
|     fi | |
| 
 | |
|     diff_extractlines "$(cat "$2")" >> "$3" | |
| 
 | |
|     # Don't do anything else | |
|     exit | |
| fi | |
| 
 | |
| # Load the config | |
| cmd_download="curl -L -o {dst} {src}"  # Command to execute to download files | |
| [ -f /etc/astronaut.conf ] && . /etc/astronaut.conf | |
| [ -f "$HOME/.astronaut.conf" ] && . "$HOME/.astronaut.conf" | |
| 
 | |
| # Override config with command-line parameters. | |
| [ "$1" ] && dir_satellites="$1" | |
| [ "$2" ] && _dir_fresh="$2" | |
| 
 | |
| if [ ! "$dir_satellites" -o ! "$_dir_fresh" ]; then | |
|     _show_help | |
|     exit 1 | |
| fi | |
| 
 | |
| mkdir -p "$_dir_fresh" | |
| 
 | |
| for sat in "$dir_satellites"/*.sat; do | |
|     update_url="$(get_variable update_url "$sat")" | |
|     name="$(basename "$sat" .sat)" | |
| 
 | |
|     if [ "$update_url" ]; then | |
|         printf "Checking: $name..." | |
|         cols="$(expr $(tput cols) - $(printf "Checking: $name..." | wc -c))" | |
| 
 | |
|         download "$update_url" "$_dir_fresh/$name.fresh" | |
| 
 | |
|         if [ -f "$_dir_fresh/$name" ]; then | |
|             check="$(diff "$_dir_fresh/$name" "$_dir_fresh/$name.fresh" || true)" | |
| 
 | |
|             if [ -f "$_dir_fresh/$name.ignorediff" ]; then | |
|                 check="$(apply_ignorediff "$check" "$_dir_fresh/$name.ignorediff")" | |
|             fi | |
| 
 | |
|             if [ "$check" ]; then | |
|                 printf "%${cols}s\n" "Update detected" | |
|                 echo "$check" >> "$_dir_fresh/$name-$(date +%Y%m%d%H%M%S).diff" | |
|             else | |
|                 printf "\n" | |
|             fi | |
|         else | |
|             printf "%${cols}s\n" "First update check, creating new file" | |
|             download "$update_url" "$_dir_fresh/$name.checkfresh" | |
|             check="$(diff "$_dir_fresh/$name.fresh" "$_dir_fresh/$name.checkfresh" || true)" | |
| 
 | |
|             if [ "$check" ]; then | |
|                 echo "$(diff_extractlines "$check")" >> "$_dir_fresh/$name.ignorediff" | |
|                 echo "> Created ignorediff" | |
|             fi | |
| 
 | |
|             rm "$_dir_fresh/$name.checkfresh" | |
|         fi | |
| 
 | |
|         mv "$_dir_fresh/$name.fresh" "$_dir_fresh/$name" | |
|     fi | |
| done
 | |
| 
 |