Simplest Enterprise Continuous Integration Solutions

Saturday, October 8, 2011

MySQL: Community Server x86 64bit RPMs

Scenario:

Install MySQL Community Server 5.5 x86 64bit RPMs on Red Hat 5 server.



#!/bin/sh
TIME_STAMP=`date +%Y-%m-%d_%H_%M_%S`
TMPP_DIR=/tmp
MYSQL_USER=my_user
MYSQL_PASSWORD=my_password
FQDN_HOSTNAME=`hostname -f`


# make sure MySQL Community 5.5 x86 64bit RPMs existence

if [ -e "${TEMP_DIR}/MySQL-shared-5.5.25-1.rhel5.x86_64.rpm" ]; then
   /bin/chmod a+x ${TEMP_DIR}/MySQL-shared-5.5.25-1.rhel5.x86_64.rpm
else
   /bin/echo "${TEMP_DIR}/MySQL-shared-5.5.25-1.rhel5.x86_64.rpm doesn't exist" > "${MY_OUTPUT}"
   exit 1
fi
if [ -e "${TEMP_DIR}/MySQL-client-5.5.25-1.rhel5.x86_64.rpm" ]; then
   /bin/chmod a+x ${TEMP_DIR}/MySQL-client-5.5.25-1.rhel5.x86_64.rpm
else
   /bin/echo "${TEMP_DIR}/MySQL-client-5.5.25-1.rhel5.x86_64.rpm doesn't exist" > "${MY_OUTPUT}"
   exit 1
fi
if [ -e "${TEMP_DIR}/MySQL-server-5.5.25-1.rhel5.x86_64.rpm" ]; then
   /bin/chmod a+x ${TEMP_DIR}/MySQL-server-5.5.25-1.rhel5.x86_64.rpm
else
   /bin/echo "${TEMP_DIR}/MySQL-server-5.5.25-1.rhel5.x86_64.rpm" > "${MY_OUTPUT}"
   exit 1
fi
if [ -e "/var/lib/mysql" ]; then
   /bin/mv /var/lib/mysql /var/lib/mysql_${MY_TIME_STAMP_STRING}
fi
MY_OUTPUT="/tmp/mysql_rpm_install_output"
MY_MYSQL_RPMS="MySQL-shared MySQL-server MySQL-client"
MYSQL=/usr/bin/mysql
for i in `echo ${MY_MYSQL_RPMS}`
do
   /bin/rpm -Uvh --replacepkgs "${TEMP_DIR}/${i}*.rpm" > "${MY_OUTPUT}" 2>&1
   if [ "$?" != "0" ]; then
      /bin/cat "${MY_OUTPUT}"
      exit 1
   fi
done


# create MySQL user

$MYSQL -u root -e "CREATE USER '${MYSQL_USER}'@'${FQDN_HOST_NAME}' IDENTIFIED BY '${ FQDN_HOSTNAME }';" > "${MY_OUTPUT}" 2>&1
if [ "$?" != "0" ]; then
   /bin/cat "${MY_OUTPUT}"
   exit 1
fi


# grant MySQL user

$MYSQL -u root -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'${FQDN_HOSTNAME}' IDENTIFIED BY '${MYSQL_PASSWORD}';" > "${MY_OUTPUT}" 2>&1
if [ "$?" != "0" ]; then
   /bin/cat "${MY_OUTPUT}"
   exit 1
fi


# flush privileges

$MYSQL -u root -e "FLUSH PRIVILEGES;"
if [ "$?" != "0" ]; then
   /bin/cat "${MY_OUTPUT}"
   exit 1
fi


# install completed

echo "INSTALLED SUCCESSFULLY"
if [ -e "${MY_OUTPUT}" ]; then
   /bin/rm -f "${MY_OUTPUT}"
fi
exit 0

Saturday, September 10, 2011

Enterprise Linux - add hard drive

Here are the procedures to add a new hard drive for vSphere (VMWare ESXI 4.0.0) virtual machine.
  • vSphere Client -> virtual machine “Summary” tab -> "Edit Setting" -> Virtual Machine Properties panel “Hardware” tab -> click "Add" -> popup a "Add Hardware" panel
  • "Add Hardware" panel -> select "Hard Disk", click "Next" -> select "Create a new virtual disk" (by default), click "Next" -> select "Disk Size" to 8GB, click "Next" -> select "Virtual Device Node SCSI(0:1)" (by default), click "Next" -> click "Finish"
  • click "OK" on "Virtual Machine Properties" panel
  • vSphere Client -> virtual machine “Summary” tab -> "Refresh Storage Usage"
  • reboot virtual machine
[root@linux64 ~]# ls -l /dev/sd*
# set partition
brw-r----- 1 root disk 8,  0 Sep 14  2011 /dev/sda
brw-r----- 1 root disk 8,  1 Sep 14  2011 /dev/sda1
brw-r----- 1 root disk 8,  2 Sep 14  2011 /dev/sda2
brw-r----- 1 root disk 8, 16 Sep 14  2011 /dev/sdb
[root@linux64 ~]# df -h
Filesystem                      Size Used Avail Use%  Mounted on
/dev/mapper/VolGroup00-LogVol00 33G  3.4G 28G   11%   /
/dev/sda1                       99M  22M  73M   23%   /boot
tmpfs                           4.0G 0    4.0G  0%    /dev/shm
[root@linux64 ~]# fdisk /dev/sdb
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
   /dev/sdb1        1             1044     8385898+ 83  Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@linux64 ~]# ls -l /dev/sd*
brw-r----- 1 root disk 8,  0 Sep 14  2011 /dev/sda
brw-r----- 1 root disk 8,  1 Sep 14  2011 /dev/sda1
brw-r----- 1 root disk 8,  2 Sep 14  2011 /dev/sda2
brw-r----- 1 root disk 8, 16 Apr 16 18:19 /dev/sdb
brw-r----- 1 root disk 8, 17 Apr 16 18:19 /dev/sdb1
# format new drive
[root@linux64 ~]# mkfs -t ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1048576 inodes, 2096474 blocks
104823 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# mount new drive
[root@linux64 ~]# mkdir /mnt1
[root@linux64 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot              /boot                   ext3    defaults        1 2
tmpfs                    /dev/shm                tmpfs   defaults        0 0
devpts                   /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                    /sys                    sysfs   defaults        0 0
proc                     /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
/dev/sdb1                /mnt1                   ext3    defaults        1 2
[root@linux64 ~]# mount /dev/sdb1
[root@linux64 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb1 on /mnt1 type ext3 (rw)
[root@linux64 ~]# df -h
Filesystem                      Size Used Avail Use%  Mounted on 33G  3.4G 28G   11%   /
/dev/mapper/VolGroup00-LogVol00
/dev/sda1                       99M  22M  73M   23%   /boot
tmpfs                           4.0G 0    4.0G  0%    /dev/shm
/dev/sdb1                       7.9G 147M 7.4G  2%    /mnt1

Saturday, September 3, 2011

Java MultiThreads on Linux


Java MultiThreads wrapped as a Linux (x86-64) Daemon with below directory structure:
MultiThreads-linux-x86-64/
                         /conf/
                              /wrapper.conf
                         /lib
                             /commons-io-2.0.1.jar
                             /libwrapper.so
                             /wrapperdemo.jar
                             /wrapper.jar
                             /wrappertest.jar
                             /yamlbeans-1.0.jar
                         /logs
                         /MultiThreads.jar
                         /MultiThreads.sh
                         /receiveInputsFromYamls/
                         /invokeMultiThreadExecutions/
                         /wrapper


MultiThreads.jar which listens yaml format file as inputs from  MultiThreads-linux-x86-64/receiveInputsFromYamls, and execute the executions with outputs to MultiThreads-linux-x86-64/invokeMultiThreadExecutions/ in Java multithreads mode.


yaml format file inputs content:
name: task1
command: execute_something


MultiThreads-linux-x86-64/conf/wrapper.conf content:
#encoding=UTF-8
# Configuration files must begin with a line specifying the encoding
#  of the the file.


#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
#  License Key to start.  Licenses can be purchased or a trial license
#  requested on the following pages:
# http://wrapper.tanukisoftware.com/purchase
# http://wrapper.tanukisoftware.com/trial


# Include file problems can be debugged by removing the first '#'
#  from the following line:
##include.debug


# The Wrapper will look for either of the following optional files for a
#  valid License Key.  License Key properties can optionally be included
#  directly in this configuration file.
#include ../conf/wrapper-license.conf
#include ../conf/wrapper-license-%WRAPPER_HOST_NAME%.conf


# The following property will output information about which License Key(s)
#  are being found, and can aid in resolving any licensing problems.
#wrapper.license.debug=TRUE


#********************************************************************
# Wrapper Localization
#********************************************************************
# Specify the locale which the Wrapper should use.  By default the system
#  locale is used.
#wrapper.lang=en_US # en_US or ja_JP


# Specify the location of the Wrapper's language resources.  If these are
#  missing, the Wrapper will default to the en_US locale.
wrapper.lang.folder=../lang


#********************************************************************
# Wrapper Java Properties
#********************************************************************
# Java Application
#  Locate the java binary on the system PATH:
#wrapper.java.command=java
#  Specify a specific java binary:
set.JAVA_HOME=/usr/java/jdk1.6.0_23
wrapper.java.command=%JAVA_HOME%/bin/java


# Tell the Wrapper to log the full generated Java command line.
wrapper.java.command.loglevel=INFO


# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp


# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
wrapper.java.classpath.1=lib/wrapper.jar
wrapper.java.classpath.2=MultiThreads.jar


# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=lib


# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE


# Java Additional Parameters
wrapper.java.additional.1=


# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128


# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512


# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=com.acme.multithreads.MultiTheads


#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Enables Debug output from the Wrapper.
# wrapper.debug=TRUE


# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM


# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO


# Log file to use for wrapper output logging.
wrapper.logfile=logs/wrapper.log


# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM


# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO


# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=0


# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=0


# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE


#********************************************************************
# Wrapper General Properties
#********************************************************************
# Allow for the use of non-contiguous numbered properties
wrapper.ignore_sequence_gaps=TRUE


# Title to use when running as a console
wrapper.console.title=MultiThreads


#********************************************************************
# Wrapper JVM Checks
#********************************************************************
# Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
wrapper.check.deadlock=TRUE
wrapper.check.deadlock.interval=60
wrapper.check.deadlock.action=RESTART
wrapper.check.deadlock.output=FULL


# Out Of Memory detection.
# (Simple match)
wrapper.filter.trigger.1000=java.lang.OutOfMemoryError
# (Only match text in stack traces if -XX:+PrintClassHistogram is being used.)
#wrapper.filter.trigger.1000=Exception in thread "*" java.lang.OutOfMemoryError
#wrapper.filter.allow_wildcards.1000=TRUE
wrapper.filter.action.1000=RESTART
wrapper.filter.message.1000=The JVM has run out of memory.


#********************************************************************
# Wrapper Email Notifications. (Requires Professional Edition)
#********************************************************************
# Common Event Email settings.
#wrapper.event.default.email.debug=TRUE
#wrapper.event.default.email.smtp.host=<SMTP_Host>
#wrapper.event.default.email.smtp.port=25
#wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
#wrapper.event.default.email.sender=<Sender email>
#wrapper.event.default.email.recipient=<Recipient email>


# Configure the log attached to event emails.
#wrapper.event.default.email.attach_log=TRUE
#wrapper.event.default.email.maillog.lines=50
#wrapper.event.default.email.maillog.format=LPTM
#wrapper.event.default.email.maillog.loglevel=INFO


# Enable specific event emails.
#wrapper.event.wrapper_start.email=TRUE
#wrapper.event.jvm_prelaunch.email=TRUE
#wrapper.event.jvm_start.email=TRUE
#wrapper.event.jvm_started.email=TRUE
#wrapper.event.jvm_deadlock.email=TRUE
#wrapper.event.jvm_stop.email=TRUE
#wrapper.event.jvm_stopped.email=TRUE
#wrapper.event.jvm_restart.email=TRUE
#wrapper.event.jvm_failed_invocation.email=TRUE
#wrapper.event.jvm_max_failed_invocations.email=TRUE
#wrapper.event.jvm_kill.email=TRUE
#wrapper.event.jvm_killed.email=TRUE
#wrapper.event.jvm_unexpected_exit.email=TRUE
#wrapper.event.wrapper_stop.email=TRUE


# Specify custom mail content
wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n


#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.


# Name of the service
wrapper.name=@app.name@


# Display name of the service
wrapper.displayname=@app.long.name@


# Description of the service
wrapper.description=@app.long.name@


# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=


# Mode in which the service is installed.  AUTO_START, DELAY_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START


# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false


Run as Linux Daemon mode

  • MultiThreads-linux-x86-64/MultiThreads.sh remove
  • MultiThreads-linux-x86-64/MultiThreads.sh install
  • MultiThreads-linux-x86-64/MultiThreads.sh start

Run as console mode

  • MultiThreads-linux-x86-64\MultiThreads.bat console

Sunday, August 14, 2011

Java MultiThreads on Windows


Java MultiThreads wrapped as a Windows service with below directory structure:
MultiThreads-windows-x86-32\
                           \InstallMultiThreadsService.bat
                           \MultiThreads.jar
                           \MultiThreadsConsole.bat
                           \UninstallMultiThreadsService.bat
                           \wrapper.exe
                           \conf\
                                \wrapper.conf
                           \lib\
                               \commons-io-2.0.1.jar
                               \libweapper.so
                               \wrapper.dll
                               \wrapper.jar
                               \wrappertest.jar
                               \yamlbean-1.0.jar
                           \logs
                           \receiveInputsFromYamls\
                           \invokeMultiThreadExecutions\

MultiThreads.jar which listens yaml format file as inputs from  MultiThreads\receiveInputsFromYamls, and execute the executions with outputs to MultiThreads\invokeMultiThreadExecutions\ in Java multithreads mode.

yaml format file inputs content:
name: task1
command: execute_something

MultiThreads-windows-x86-32\conf\wrapper.conf content:

 #********************************************************************

 # Wrapper Properties

 #********************************************************************

 # Java Application

 wrapper.java.command=java

 # Java Main class

 wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

 # Java Classpath (include wrapper.jar)  Add class path elements as

 #  needed starting from 1
 wrapper.java.classpath.1=lib/wrapper.jar
 wrapper.java.classpath.2=MultiThreads.jar
 # Java Library Path (location of Wrapper.DLL or libwrapper.so)
 wrapper.java.library.path.1=lib
# Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
 # Initial Java Heap Size (in MB)
 wrapper.java.initmemory=256
 # Maximum Java Heap Size (in MB)
 wrapper.java.maxmemory=512
 # Application parameters.  Add parameters as needed starting from 1
 wrapper.app.parameter.1=com.acme.multithreads.MultiTheads
 #********************************************************************
 # Wrapper Logging Properties
 #********************************************************************
# Enables Debug output from the Wrapper.
# wrapper.debug=TRUE
 # Format of output for the console.  (See docs for formats)
 wrapper.console.format=PM
 # Log Level for console output.  (See docs for log levels)
 wrapper.console.loglevel=INFO
 # Format of output for the log file.  (See docs for formats)
 wrapper.logfile.format=LPTM
 # Log file to use for wrapper output logging.
 wrapper.logfile=logs/wrapper.log
 # Log Level for log file output.  (See docs for log levels)
 wrapper.logfile.loglevel=INFO
 # Maximum size that the log file will be allowed to grow to before
 #  the log is rolled. Size is specified in bytes.  The default value
 #  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
 #  'm' (mb) suffix.  For example: 10m = 10 megabytes.
 wrapper.logfile.maxsize=10m
 # Maximum number of rolled log files which will be allowed before old
 #  files are deleted.  The default value of 0 implies no limit.
 wrapper.logfile.maxfiles=10
 # Log Level for sys/event log output.  (See docs for log levels)
 wrapper.syslog.loglevel=ERROR
 #********************************************************************
 # Wrapper NT Service Properties
 #********************************************************************
 # WARNING - Do not modify any of these properties when an application
 #  using this configuration file has been installed as a service.
 #  Please uninstall the service before modifying this section.  The
 #  service can then be reinstalled.
 # Name of the service
wrapper.ntservice.name=MultiThreads
 # Display name of the service
wrapper.ntservice.displayname=MultiThreads Service
 # Description of the service
wrapper.ntservice.description=MultiThreads Service
 # Service dependencies.  Add dependencies as needed starting from 1
 wrapper.ntservice.dependency.1=
 # Mode in which the service is installed.  AUTO_START or DEMAND_START
 wrapper.ntservice.starttype=AUTO_START
 # Priority at which
  the service is run.  NORMAL, LOW, HIGH, or
 #  REALTIME
 wrapper.ntservice.process_priority=NORMAL
 # Allow the service to interact with the desktop.
 wrapper.ntservice.interactive=false
 #****************************************************************
 # Wrapper Linux/Unix Service Properties
 #****************************************************************
 wrapper.daemonize=TRUE

Run as Windows service mode
  • MultiThreads\UninstallMultiThreads.bat
  • MultiThreads\InstallMultiThreads.bat
  • net start MultiThreads
Run as console mode
  • MultiThreads\MultiThreads.bat

Saturday, August 13, 2011

Enterprise Linux - Autofs Automounting

Implementing an automount to NFS /home directory when user login to NIS client.
  • NFS Client
Make sure netfs, nfslock, portmap are installed and daemons are running.
[root@linux64-client1 ~]# chkconfig nfslock on
[root@linux64-client1 ~]# service nfslock start 
Starting NFS statd:                                        [  OK  ]
[root@linux64-client1 ~]# chkconfig portmap on
[root@linux64-client1 ~]# service portmap start
Starting portmapper:                                       [  OK  ]
[root@linux64-client1 ~]# chkconfig netfs on
[root@linux64-client1 ~]# service netfs start
Mounting other filesystems:                                [  OK  ]
[root@linux64-client1 ~]# mv /home /home.save
[root@linux64-client1 ~]# mkdir /home
Manual mount
[root@linux64-client1 ~]# mount 10.3.20.100:/home /home
[root@linux64-client1 ~]# umount /home
Configure autofs automount
[root@linux64-client1 ~]# cat /etc/auto.master
/home   /etc/auto.home
[root@linux64-client1 ~]# cat /etc/auto.home
*   -fstype=nfs,soft,intr,rsize=8192,wsize=8192,nosuid,tcp 10.3.20.100:/home/&
[root@linux64-client1 ~]# chkconfig autofs on
[root@linux64-client1 ~]# service autofs restart
Stopping automount:                                        [  OK  ]
Starting automount:                                        [  OK  ]
[root@linux64-client1 ~]#


After doing this, you won’t be able to see the contents of the /home directory on linux64-server as user root. This is because by default NFS activates the root squash feature, which disables this user from having privileged access to directories on remote NFS servers.

Tuesday, July 12, 2011

MySQL - Windows silent install/uninstall

This batch script example is for a silent install/uninstall mysql-essential-5.1.58-winx64.msi with proper return code:


#############################
# MySQL silent installation
#############################

@echo off


set TEMP_DIR=C:\TMP
set MYSQL_MSI=mysql-essential-5.1.58-winx64.msi


REM Timestamp Generator
set cur_yyyy=%date:~10,4%
set cur_mm=%date:~4,2%
set cur_dd=%date:~7,2%
set cur_hh=%time:~0,2%
if %cur_hh% lss 10 (set cur_hh=0%time:~1,1%)
set cur_nn=%time:~3,2%
set cur_ss=%time:~6,2%
set TIMESTAMP=%cur_yyyy%-%cur_mm%-%cur_dd%_%cur_hh%_%cur_nn%_%cur_ss%


set INSTALLDIR=C:\Program Files\MySQL\MySQL Server 5.1
set MYSQL_DATA=C:\Program Files\MySQL\
set MYSQL_INSTALL_LOG=MySQL_5_1_InstallLog.txt


set MYSQL_CONFIG_EXE=MySQLInstanceConfig.exe
set MYSQL_SERVICE_NAME=MySQL
set MYSQL_PORT=3306
set TEMPLATE_INI=my-template.ini
set MYSQL_INI=mysql.ini
set MYSQL_CONFIG_LOG=MySQL_5_1_ConfigLog.txt


REM make sure a clean install
IF EXIST "%INSTALLDIR%\data" (
   MOVE /Y "%INSTALLDIR%\data" "%INSTALLDIR%\data_%TIMESTAMP%"
)


REM install MySQL
msiexec -i %TEMP_DIR%\%MYSQL_MSI% /quiet /l*v "%TEMP_DIR%\%MYSQL_INSTALL_LOG%" INSTALLDIR="%INSTALLDIR%" MYSQL_DATA="%MYSQL_DATA%"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 GOTO CONFIG_MYSQL
echo %RETURN_CODE%: Install MySQL failed
GOTO END


REM config MySQL instance
:CONFIG_MYSQL
"%INSTALLDIR%\bin\%MYSQL_CONFIG_EXE%" -i -q "-l%TEMP_DIR%\%MYSQL_CONFIG_LOG%" "-t%INSTALLDIR%\%TEMPLATE_INI%" "-c%INSTALLDIR%\%MYSQL_INI%" "AddBinToPath=yes" "-n%PRODUCTNAME%" "Port=%MYSQL_PORT%" "ServiceName=%MYSQL_SERVICE_NAME%"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 GOTO CREATE_USER
echo %RETURN_CODE%: Configure MySQL failed
GOTO END


REM create MySQL user
:CREATE_USER
"%INSTALLDIR%\bin\mysql" -u root -e "CREATE USER 'mysql_user'@'localhost' IDENTIFIED BY 'mysql_pw';"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 GOTO GRANT_USER
echo %RETURN_CODE%: Create MySQL user failed
GOTO END


REM grant MySQL user privileges
:GRANT_USER
"%INSTALLDIR%\bin\mysql" -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'mysql_user'@'localhost' IDENTIFIED BY 'mysql_pw';"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 GOTO FLUSH_PRIVILEGES
echo %RETURN_CODE%: Grant MySQL user failed
GOTO END


REM flush privileges
:FLUSH_PRIVILEGES
"%INSTALLDIR%\bin\mysql" -u root -e "FLUSH PRIVILEGES;"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 GOTO VERIFY_USER_ACCESS
echo %RETURN_CODE%: Flush privileges failed
GOTO END


REM verify MS access rights
:VERIFY_USER_ACCESS
"%INSTALLDIR%\bin\mysql" -D mysql -u mysql_user -h localhost -pmysql_pw -e "SELECT create_priv FROM user WHERE user='mysql_user' AND host='localhost'"
set RETURN_CODE=%ERRORLEVEL%
IF %RETURN_CODE% EQU 0 echo %RETURN_CODE%
IF %RETURN_CODE% NEQ 0 echo %RETURN_CODE%: Verfiy MySQL user failed
GOTO END


:END


#############################

# MySQL silent uninstallation
#############################
@echo off

msiexec.exe /I{7346AA6F-CC49-406D-AA97-93FBE3C25E79} /qn
echo %ERRORLEVEL%

Monday, June 13, 2011

Enterprise Linux - SGE submit host automatic configuration

SGE automated (execution) installation updates <hostname> into @allhost and [<hostname>=<cpu_processor_count>] into all.q slots automatically, sometime automatic configure a host to be a dedicated submit host only will be required. Here is an example script (submit_host_only.sh) for this purpose:



#!/bin/sh


TMP_DIR="/tmp"
# retrieve SGE_ROOT from SGE startup script (i.e. /etc/init.d/sgemaster. or /etc/init.d/sgeexecd.)
SGE_SCRIPTUP_DIR="/etc/init.d"
SGE_STARTUP_SCRIPT=`ls ${SGE_SCRIPTUP_DIR} | /bin/grep "sgemaste.*"`
if [ "$SGE_STARTUP_SCRIPT" = "" ]; then
   SGE_STARTUP_SCRIPT=`ls ${SGE_SCRIPTUP_DIR} | /bin/grep "sgeexec.*"`
fi
if [ -e "${SGE_SCRIPTUP_DIR}/${SGE_STARTUP_SCRIPT}" ]; then
   SGE_ROOT=`cat ${SGE_SCRIPTUP_DIR}/${SGE_STARTUP_SCRIPT} | /bin/grep ^SGE_ROOT | cut -d";" -f1,1 | cut -d"=" -f2,2`
   CELL_NAME=`cat ${SGE_SCRIPTUP_DIR}/${SGE_STARTUP_SCRIPT} | /bin/grep ^SGE_CELL | cut -d";" -f1,1 | cut -d"=" -f2,2`
fi


# make sense only SGE_ROOT exists
if [ -d "${SGE_ROOT}" ]; then
   if [ -e "${SGE_ROOT}/${CELL_NAME}/common/settings.sh" ]; then
      . "${SGE_ROOT}/${CELL_NAME}/common/settings.sh"
      # get SGE hostname
      ARCH=`${SGE_ROOT}/util/arch`
      SGE_UTILBIN="${SGE_ROOT}/utilbin/${ARCH}"
      SGE_HOSTNAME=`${SGE_UTILBIN}/gethostname -aname`
      MY_HOSTNAME_SHORT=`${SGE_UTILBIN}/gethostname -aname | cut -f1 -d.`
      # get processor count
      SGE_PROCESSER_COUNT=`qhost | /bin/grep "${MY_HOSTNAME_SHORT} " | /bin/awk '{print $3}'`
      # remove SGE_HOSTNAME from @allhost
      qconf -shgrp @allhosts > ${TMP_DIR}/remove_from_host_grp
      /bin/sed -i "s/ ${SGE_HOSTNAME}//g" ${TMP_DIR}/remove_from_host_grp
      qconf -Mhgrp ${TMP_DIR}/remove_from_host_grp
      # remove SGE_HOSTNAME from slots of all.q
      qconf -sq all.q | /bin/sed "s/^ .*$//g" | /bin/sed "s/^slots.*$//g" > ${TMP_DIR}/remove_from_all_q_no_slots
      qconf -sq all.q | /bin/awk "/^ |^slots/" | /bin/sed -e :a -e N -e 's/\n/ /' -e ta | /bin/sed 's/\\//g' | /bin/sed 's/ //g' | /bin/sed 's/slots/slots /g' | /bin/sed "s/,\[${SGE_HOSTNAME}=${SGE_PROCESSER_COUNT}\]//g" >> ${TMP_DIR}/remove_from_all_q_no_slots
      qconf -Mq ${TMP_DIR}/remove_from_all_q_no_slots
   fi
fi