Script for generating fsdata.c file
authorPiotr Dymacz <pepe2k@gmail.com>
Thu, 23 Jan 2014 13:27:28 +0000 (14:27 +0100)
committerPiotr Dymacz <pepe2k@gmail.com>
Thu, 23 Jan 2014 13:27:28 +0000 (14:27 +0100)
u-boot/httpd/vendors/makefsdatac [new file with mode: 0755]
u-boot/httpd/vendors/yuicompressor-2.4.8.jar [new file with mode: 0644]

diff --git a/u-boot/httpd/vendors/makefsdatac b/u-boot/httpd/vendors/makefsdatac
new file mode 100755 (executable)
index 0000000..9a231c6
--- /dev/null
@@ -0,0 +1,146 @@
+#!/bin/bash
+
+# This script generates "fsdata.c" file for uIP 0.9 stack.
+# It takes one argument - name of vendor directory,
+# which should contains all www files, at least:
+# - index.html (with: <input type="file" name="firmware">)
+# - 404.html
+# - flashing.hmtl
+# - fail.html
+#
+# All other files are optional. If you want to allow also
+# ART and/or U-Boot image update, add the following files,
+# with appropriate inputs in form:
+# - art.html (<input type="file" name="art">)
+# - uboot.html (<input type="file" name="uboot">)
+#
+# HTML and CSS files are compressed before placing them
+# inside "fsdata.c".
+#
+# You SHOULDN'T embed addresses of any external
+# files in "flashing.html" file, because web server,
+# after receive POST data, returns this page and stops.
+
+# Vendor specific directory (default: "general")
+vendor_dir=${1:-general}
+
+# Temporary files
+files_content_tmp=".files_content"
+files_list_tmp=".files_list"
+
+# YUI Compressor path (should be in the same dir)
+yui_compressor=`ls -t *.jar 2> /dev/null | tail --lines=1`
+
+# Previous fsdata_file var name
+prev_fsdata_struct="NULL"
+
+# Files counter
+files_counter=0
+
+# Change ASCII to bytes, comma separated (e.g. "0x01, 0x02, 0x03...")
+function ascii_to_bytes() {
+       echo -ne $1 | od -A n -t x1 | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'
+}
+
+# $1 -> file path
+function print_data_array() {
+       local _file_ext="${1##*.}"
+       local _file_name="${1##*/}"
+       local _file_name_no_ext="${_file_name%\.*}"
+       local _file_content=""
+
+       # Open variable declaration
+       `echo -ne "static const char data_"$_file_name_no_ext"_"$_file_ext"[] = {\n" >> "$files_content_tmp"`
+       `echo -ne "/* HTTP Header */\n" >> "$files_content_tmp"`
+
+       # HTTP header (200 OK or 404 Not Found)
+       if [ "$_file_name_no_ext" == "404"  ]; then
+               `ascii_to_bytes "HTTP/1.0 404 File not found\r\n" >> "$files_content_tmp"`
+       else
+               `ascii_to_bytes "HTTP/1.0 200 OK\r\n" >> "$files_content_tmp"`
+       fi
+
+       # Server type
+       `echo "," >> "$files_content_tmp"`
+       `ascii_to_bytes "Server: uIP/0.9\r\n" >> "$files_content_tmp"`
+       `echo "," >> "$files_content_tmp"`
+
+       # Content
+       if [ "$_file_ext" == "css"  ]; then
+               if [ -e "$yui_compressor" ]; then
+                       _file_content=`java -jar "$yui_compressor" --charset utf-8 "$1" | od -A n -t x1 | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               else
+                       _file_content=`cat "$1" | tr -d '\r\n\t' | od -A n -t x1 | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               fi
+               `ascii_to_bytes "Content-type: text/css; charset=UTF-8\r\n\r\n" >> "$files_content_tmp"`
+       elif [ "$_file_ext" == "png"  ]; then
+               _file_content=`od -A n -t x1 < "$1" | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               `ascii_to_bytes "Content-Type: image/png\r\n\r\n" >> "$files_content_tmp"`
+       elif [ "$_file_ext" == "jpg" -o "$_file_ext" == "jpeg"  ]; then
+               _file_content=`od -A n -t x1 < "$1" | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               `ascii_to_bytes "Content-Type: image/jpeg\r\n\r\n" >> "$files_content_tmp"`
+       elif [ "$_file_ext" == "gif"  ]; then
+               _file_content=`od -A n -t x1 < "$1" | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               `ascii_to_bytes "Content-Type: image/gif\r\n\r\n" >> "$files_content_tmp"`
+       else
+               _file_content=`cat "$1" | tr -d '\t\r\n' | od -A n -t x1 | tr -d '\r\n' | sed 's/ /0x/;s/ /, 0x/g;s/.\{102\}/&\n/g'`
+               `ascii_to_bytes "Content-type: text/html; charset=UTF-8\r\n\r\n" >> "$files_content_tmp"`
+       fi
+
+       `echo "," >> "$files_content_tmp"`
+
+       # File content
+       `echo -ne "/* Page/File content */\n" >> "$files_content_tmp"`
+       `echo -ne "$_file_content" >> "$files_content_tmp"`
+
+       # And close declaration
+       `echo -ne ", 0 };\n\n" >> "$files_content_tmp"`
+}
+
+# $1 -> file path
+function print_data_struct() {
+       local _file_ext="${1##*.}"
+       local _file_name="${1##*/}"
+       local _file_name_no_ext="${_file_name%\.*}"
+
+       `echo -ne "const struct fsdata_file file_"$_file_name_no_ext"_"$_file_ext"[] = {{\n" >> "$files_list_tmp"`
+       `echo -ne "\t"$prev_fsdata_struct",\n" >> "$files_list_tmp"`
+       `echo -ne "\t\"/$_file_name_no_ext.$_file_ext\",\n" >> "$files_list_tmp"`
+       `echo -ne "\tdata_"$_file_name_no_ext"_"$_file_ext",\n" >> "$files_list_tmp"`
+       `echo -ne "\t(int)sizeof(data_"$_file_name_no_ext"_"$_file_ext") - 1\n" >> "$files_list_tmp"`
+       `echo -ne "}};\n\n" >> "$files_list_tmp"`
+
+       prev_fsdata_struct="file_"$_file_name_no_ext"_"$_file_ext""
+}
+
+# === Main loop ===
+
+if [ -d "$vendor_dir"  ]; then # If vendor dir exists
+       # Remove old fsdata.c
+       if [ -a "../fsdata.c" ]; then
+               `rm "../fsdata.c"`
+       fi
+
+       `touch "$files_content_tmp" "$files_list_tmp"`
+
+       # Loop through all files in vendor dir
+       for file in "$vendor_dir"/*; do # For all found files
+               print_data_array $file
+               print_data_struct $file
+               files_counter=$((files_counter+1))
+       done
+
+       # Add required defines
+       `echo "#define FS_ROOT "$prev_fsdata_struct"" >> "$files_list_tmp"`
+       `echo "#define FS_NUMFILES "$files_counter"" >> "$files_list_tmp"`
+
+       # Generate new fsdata.c
+       `touch "../fsdata.c"`
+
+       `cat "$files_content_tmp" > "../fsdata.c"`
+       `cat "$files_list_tmp" >> "../fsdata.c"`
+
+       `rm "$files_content_tmp" "$files_list_tmp"`
+else
+       echo "Error! Vendor specific directory doesn't exist!"
+fi
diff --git a/u-boot/httpd/vendors/yuicompressor-2.4.8.jar b/u-boot/httpd/vendors/yuicompressor-2.4.8.jar
new file mode 100644 (file)
index 0000000..a1cf0a0
Binary files /dev/null and b/u-boot/httpd/vendors/yuicompressor-2.4.8.jar differ