Difference between revisions of "Web App Packaging Notes"

From Amahi Wiki
Jump to: navigation, search
Line 122: Line 122:
 
<pre>ProxyPass / http://hda:10000/
 
<pre>ProxyPass / http://hda:10000/
 
ProxyPassReverse / http://hda:10000/</pre>
 
ProxyPassReverse / http://hda:10000/</pre>
<pre>RedirectPermanent / http://hda:10000</pre>
+
<pre>RedirectPermanent / http://hda:10000/</pre>
* Redirect Webapp to SSL (add below ServerAlias):
+
* Redirect Webapp to SSL (add below ''ServerAlias''):
 
  RewriteEngine On
 
  RewriteEngine On
 
  RewriteCond %{SERVER_PORT} 80
 
  RewriteCond %{SERVER_PORT} 80
Line 159: Line 159:
  
 
===Scripted Functions===
 
===Scripted Functions===
 +
* Network Interface Name:
 +
INTFC=`ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}' | grep -Fvx -e lo | grep -Fvx -e tun0`
 +
 +
or
 +
 +
INTFC=cat /etc/sysconfig/network-scripts/ifcfg-* | grep -m 1 NAME | sed 's/NAME="//' | sed 's/"//'`
 
* Fully Qualified Domain Name:
 
* Fully Qualified Domain Name:
 
  HSTNM=`hostname -f`
 
  HSTNM=`hostname -f`
Line 170: Line 176:
 
  fi
 
  fi
 
* Arch (32- or 64-bit):
 
* Arch (32- or 64-bit):
  export ARCH=`getconf LONG_BIT`
+
  ARCH=`getconf LONG_BIT`
 
  if [  "$ARCH" = "64" ]; then
 
  if [  "$ARCH" = "64" ]; then
 
   # 64-bit
 
   # 64-bit
Line 177: Line 183:
 
  fi
 
  fi
 
* HDA Domain Name:
 
* HDA Domain Name:
  export HDADOM=`cat /etc/resolv.conf | grep 'search' | awk '{ print $2 }'`;
+
  HDADOM=`cat /etc/resolv.conf | grep 'search' | awk '{ print $2 }'`;
* HDA IP Address:
+
* HDA IP Address
  export HDAIP=`ifconfig eth0 | grep "inet addr" | awk '{ print $2 }' | awk 'BEGIN { FS=":" } { print $2 }'`;
+
  HDAIP=`ifconfig $INTFC | grep "inet addr" | awk '{ print $2 }' | awk 'BEGIN { FS=":" } { print $2 }'`;
 +
 
 +
or
 +
 
 +
HDAIP=$(/sbin/ip -o -4 addr list $INTFC | awk '{print $4}' | cut -d/ -f1)
 
* First Admin User:
 
* First Admin User:
  export FUSER=`/var/hda/platform/html/script/first-admin`  
+
  FUSER=`/var/hda/platform/html/script/first-admin`  
 
or
 
or
  export FUSER=$(echo "SELECT login FROM users WHERE admin=1 ORDER BY id ASC LIMIT 1" | mysql hda_production -uamahihda -pAmahiHDARulez -s)
+
  FUSER=$(echo "SELECT login FROM users WHERE admin=1 ORDER BY id ASC LIMIT 1" | mysql hda_production -uamahihda -pAmahiHDARulez -s)
 
* Check OS Version:
 
* Check OS Version:
  export FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Laughlin)//'`;
+
  FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Laughlin)//'`;
 
  if [ $FVER == '14' ]; then
 
  if [ $FVER == '14' ]; then
 
  ...
 
  ...
 
  fi
 
  fi
 
or
 
or
  export FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Verne)//'`;
+
  FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Verne)//'`;
 
  if [ $FVER == '16' ]; then
 
  if [ $FVER == '16' ]; then
 
  ...
 
  ...
Line 254: Line 264:
 
</HTML>' > html/index.html
 
</HTML>' > html/index.html
 
chown apache:users html/index.html</pre>
 
chown apache:users html/index.html</pre>
* Netboot [[Netboot_Template|App Template]]
+
* Netboot [[Netboot_template|App Template]]
  
 
===Platform Services Feature===
 
===Platform Services Feature===
Line 268: Line 278:
 
#* Returns something, it's assumed it will be valid PIDs for that service
 
#* Returns something, it's assumed it will be valid PIDs for that service
 
# Not recommended as <i>pgrep</i> may pick up other processes running by a name containing <name>, e.g., ssh-agent.
 
# Not recommended as <i>pgrep</i> may pick up other processes running by a name containing <name>, e.g., ssh-agent.
 
 
===systemd service template===
 
===systemd service template===
 
See http://blog.hqcodeshop.fi/archives/93-Handling-varrun-with-systemd.html for details.
 
See http://blog.hqcodeshop.fi/archives/93-Handling-varrun-with-systemd.html for details.

Revision as of 03:40, 11 January 2014

Database Restore

  • Install Script:
# Check for backup of old version database
if [ -f /var/hda/dbs/latest-appname.bz2 ]; then
   # Import old version database
   bzcat latest-app.bz2 |mysql -uapp -papp app
else
   # Insert new version database
   mysql -uappname -pappname appname < appname.sql;
fi

NOTE: if statement switches are:

-d: directory
-f: file

Database Update to UTF8

echo "alter database appdb charset=utf8" | mysql -uappdb -pappdb

App Start on Boot

  • Install Script:
/usr/bin/crontab -l > apache-crontab;
cat >> apache-crontab << 'EOF'
@reboot /var/hda/web-apps/appname/html/startup.sh
EOF
/usr/bin/crontab apache-crontab;
rm -rf apache-crontab;
  • Uninstall Script:
/usr/bin/crontab -l > apache-crontab;
sed -i '/appname/d' apache-crontab;
/usr/bin/crontab apache-crontab;
rm -rf apache-crontab;

Find and Rename .htaccess Files

find . -name .htaccess -exec mv {} {}.tmp \;

Add Server (Service) Feature

  • Install Script (Fedora):
cat > installscript.sh << 'EOF'
install -m 755 appname /etc/init.d/;
/sbin/chkconfig appname on;
/sbin/service appname start;
EOF
chmod 755 installscript.sh;
sudo ./installscript.sh;
cd ..;
rm -rf elevated;
  • Install Script (Ubuntu):
cat > installscript.sh << 'EOF'
install -m 755 appname /etc/init.d/;
update-rc.d appname defaults;
service appname start;
EOF
chmod 755 installscript.sh;
sudo ./installscript.sh;
cd ..;
rm -rf elevated;
  • Uninstall Script (Fedora):
mkdir elevated;
cd elevated;
cat > uninstallscript.sh << 'EOF'
/sbin/service appname stop;
/sbin/chkconfig appname off;
rm -f /etc/init.d/appname;
EOF
chmod 755 uninstallscript.sh;
sudo ./uninstallscript.sh;
cd ..;
rm -rf elevated;
  • Uninstall Script (Ubuntu):
mkdir elevated;
cd elevated;
cat > uninstallscript.sh << 'EOF'
service appname stop;
update-rc.d -f appname remove;
rm -f /etc/init.d/appname;
EOF
chmod 755 uninstallscript.sh;
sudo ./uninstallscript.sh;
cd ..;
rm -rf elevated;
  • Change service run level, start, and stop priority:

Edit the service, i.e. /etc/init.d/adito and change the parameters (Run level: 0-6, start priority: 1-99, and stop priority: 1-99).

# chkconfig: 2345 56 26

Execute the following command as root user:

/sbin/chkconfig adito resetpriorities

Custom Webapp Options

Edit /etc/httpd/conf.d/####-appname.conf file (where #### is a 4 digit number). The web server will require restart to affect the changes.

  • Change PHP Settings (add below ServerAlias):
<Files *.php>
php_flag short_open_tag on
php_flag magic_quotes_gpc Off
php_flag magic_quotes_sybase Off
php_flag magic_quotes_runtime Off
php_flag register_globals Off
php_flag session.auto_start Off
php_flag suhosin.session.encrypt Off
php_value upload_max_filesize 20M
php_value post_max_size 100M
php_value max_execution_time 300
php_value zend.enable_gc off
php_value default_charset "UTF-8"
php_value iconv.input_encoding "UTF-8"
php_value iconv.internal_encoding "UTF-8"
php_value iconv.output_encoding "UTF-8"
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value mbstring.encoding_translation On
php_value mbstring.func_overload 6
</Files>
  • Apache mod_rewrite to allow use of .htaccess for Fedora 19 (replace similar lines above </Directory>):
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
  • Apache mod_rewrite to allow use of .htaccess for older versions of Amahi (replace similar lines above </Directory>):
Options Indexes FollowSymLinks +ExecCGI
AddHandler fcgid-script .fcg
AllowOverride FileInfo Limit Options Indexes
Order allow,deny
Allow from all
  • Redirect Webapp (add below ServerAlias):
ProxyPass / http://hda:10000/
ProxyPassReverse / http://hda:10000/
RedirectPermanent / http://hda:10000/
  • Redirect Webapp to SSL (add below ServerAlias):
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}:10000 [R,L]

Custom .htaccess File

  • Use of .htaccess for Webmin (requires Apache mod-rewrite step above):
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}:10000 [R,L]
  • Some Web-Applications/Frameworks come with a pre configured .htaccess file that is trying to set the AllowOverride Rule. This will result in the following error: .htaccess: AllowOverride not allowed here. Remove AllowOverride from the .htaccess file and add it to the Directory area in your web-app conf.d file that it looks somewhat like this:
<Directory "<your path">
 Options Indexes FollowSymLinks +ExecCGI
 AddHandler fcgid-script .fcg
 AllowOveride FileInfo Limit Options Indexes
 AllowOverride All
 Order allow,deny
 Allow from all
</Directory>

Special Instructions

  • Web Link Syntax:
<a href="http://www.google.com" target="_">Google</a>
  • User Log in:
The administrator login is:<br />
<blockquote>
<code>
Name:  admin<br />
Password:  admin<br />
<br />
</code>
</blockquote>

Scripted Functions

  • Network Interface Name:
INTFC=`ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}' | grep -Fvx -e lo | grep -Fvx -e tun0`

or

INTFC=cat /etc/sysconfig/network-scripts/ifcfg-* | grep -m 1 NAME | sed 's/NAME="//' | sed 's/"//'`
  • Fully Qualified Domain Name:
HSTNM=`hostname -f`
HST=`echo $HSTNM | awk -F'.' '{print $1}'`
GRP=`echo $HSTNM | awk -F'.' '{print $2}'`
DOM=`echo $HSTNM | awk -F'.' '{print $3}' | sed 's/\..*//'`
if [$DOM == '']; then
 DOMNM='amahi.net'
else
 DOMNM=$GRP'.'$DOM
fi
  • Arch (32- or 64-bit):
ARCH=`getconf LONG_BIT`
if [  "$ARCH" = "64" ]; then
  # 64-bit
else
  # 32-bit
fi
  • HDA Domain Name:
HDADOM=`cat /etc/resolv.conf | grep 'search' | awk '{ print $2 }'`;
  • HDA IP Address
HDAIP=`ifconfig $INTFC | grep "inet addr" | awk '{ print $2 }' | awk 'BEGIN { FS=":" } { print $2 }'`;

or

HDAIP=$(/sbin/ip -o -4 addr list $INTFC | awk '{print $4}' | cut -d/ -f1)
  • First Admin User:
FUSER=`/var/hda/platform/html/script/first-admin` 

or

FUSER=$(echo "SELECT login FROM users WHERE admin=1 ORDER BY id ASC LIMIT 1" | mysql hda_production -uamahihda -pAmahiHDARulez -s)
  • Check OS Version:
FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Laughlin)//'`;
if [ $FVER == '14' ]; then
...
fi

or

FVER=`cat /etc/fedora-release | awk -F'release ' '{print $2}' | sed 's/(Verne)//'`;
if [ $FVER == '16' ]; then
...
fi
  • Install Ubuntu (DEB) or Fedora (RPM) package
if [ -f /etc/fedora-release ]; then
yum localinstall -y package.rpm --nogpgcheck
fi
if [ -f /etc/lsb-release ]; then
dpkg -i package.deb
fi

Elevated Privileges (root)

  • Scripts can be run from /var/hda/web-apps/*/elevated, /var/hda/apps/*/elevated or /var/hda/elevated directories.
mkdir -p elevated;
cd elevated;
cat > my-elevated-script << 'EOF'
...commands which need elevated privileges...
EOF
chmod +x my-elevated-script;
sudo ./my-elevated-script;
cd ..;
rm -rf elevated;

Miscellaneous

  • Suppress Console Output
command &> /dev/null
  • Remove Blank Lines From File
sed -i '/^$/d' filename
  • Insert line based on text1 (Previous Line)
sed -i '/text1/ i\text2' /filename;
  • Patch Comment:
# FIXME - this needs to be hosted in dl.amahi.org prior to going live!
  • AmahiSync Web Link:
http://username.amahi.me/Public/filename
  • Patch Diff:
diff -r -N -b -u html.orig html > app-patch.diff
patch -s -p0 -E << 'EOF'
.... contents of app-patch.diff here ....
'EOF'
patch -p0 -E < app-patch.diff
  • Cat EOF:

with variables

cat > test << EOF
... text goes here ... 
EOF

and without variables

cat > test << 'EOF'
... text goes here ...
'EOF'
  • Run as First Admin User:
su $FUSER -c command
  • Redirect to specific URL (change url= to desired path (i.e. http://appname/appdirectory):
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Your Page Title</title>
<meta http-equiv="REFRESH" content="0;url=http://www.the-domain-you-want-to-redirect-to.com"></HEAD>
<BODY>
Optional page text here.
</BODY>
</HTML>' > html/index.html
chown apache:users html/index.html

Platform Services Feature

The server list is a list of service descriptions:

  1. Only one service is allowed (i.e. sshd or ssh:sshd.pid).
  2. Once exactly one service is picked. It's the name of the service.
  3. Name is required, and it may be optionally followed by a PID file path
  4. If:
    • File path doesn't start with / it's relative to /var/run/ (i.e. named:named/named.pid -> /var/run/named/named.pid)
    • PID file path starts with /, then it's used as is
    • No PID file path specified, then the PID file is assume to be /var/run/<name>.pid
    • Does not exist, otherwise the platform will do a pgrep <name>
    • Returns something, it's assumed it will be valid PIDs for that service
  5. Not recommended as pgrep may pick up other processes running by a name containing <name>, e.g., ssh-agent.

systemd service template

See http://blog.hqcodeshop.fi/archives/93-Handling-varrun-with-systemd.html for details.

[Service]
Type=forking
PrivateTmp=yes
User=nobody
Group=nobody
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/usr/bin/mkdir -p /var/run/dhis
ExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/dhis/
# Run ExecStart with User=nobody / Group=nobody
ExecStart=/usr/sbin/dhid -P /var/run/dhis/dhid.pid
PIDFile=/var/run/dhis/dhid.pid