Linux Java Daemon RPM - Hello World 2001

(RedHat Linux 7.1)


 

  • Introduction:

  • The following package linja is an example that demonstrates:
    - SysV Init. bash script to start a daemmon
    /etc/rc.d/init.d/linjad
    
    - C source for a daemon
    /opt/linja/src/linjad.c
    /opt/linja/bin/linjad
    
    - Bash script to start a server
    /opt/linja/bin/linjad.bash
    
    - Java server executing runtime
    /opt/linja/bin/linja.bash
    
    - Java server streaming output using a nnetwork socket
    /var/www/html/linja/LinjaServer.class
    
    - Applet source to connect to the serverr and polls for data in realtime
    /var/www/html/linja/index.html
    /var/www/html/linja/LinjaClient.class
    
    - Man page
    /usr/share/man/man1/linja.1.gz
    
    - RPM building
    /usr/src/redhat/SPECS/linja.spec
    

 

  • Environment:

The following system environment is assumed:

  • Linux = RedHat Linux 7.1
Download the Demo sample, extract it and test it.

 

  • Sources:

  • SysV Init. Bash Script:
    /opt/linja/bin/linjad.bash
    #!/bin/bash
    
    # /usr/share/doc/initscripts-5.83/sysvinitfiles
    
    DAEMON="/opt/linja/bin/linjad";
    PROG="linjad";
    RETVAL=0;
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    start() {
            echo -n "Starting ${PROG}: "
            daemon ${DAEMON}
            RETVAL=${?}
            touch /var/lock/subsys/${PROG}
            /bin/echo "";
            return ${RETVAL}
    }       
    
    stop() {
            echo -n "Shutting down ${PROG}: "
            killproc ${DAEMON}
            RETVAL=${?}
            rm -f /var/lock/subsys/${PROG}
    PIDS=`/bin/ps -auwx | /bin/grep "Kaffe" | /bin/grep "LinjaServer" | /usr/bin/awk '{print $2}'`;
    for PID in ${PIDS}
    do
      /bin/kill -9 ${PID};
    done;
            /bin/echo "";
            return ${RETVAL}
    }
    
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        status)
            status ${PROG}
            ;;
        restart)
            stop
            start
            ;;
        *)
            echo "Usage: ${PROG} {start|stop|status|restart}"
            exit 1
            ;;
    esac
    exit $?
    
  • C Daemon:
    /opt/linja/src/linjad.c
    /*
    // 4 May 2002
    // /usr/bin/make linjad
    */
    
    #include <sys/types.h> /* pid_t */
    
    void doDaemon
    (
    )
    {
      setsid();
      umask(0);
    
    
      system("/opt/linja/bin/linjad.bash");
    
      for (;;)
      {
        sleep(1);
      }
    
      return;
    }
    
    void checkForkError
    (
      pid_t process_id
    )
    {
      if (process_id < 0)
      {
        perror("Fork");
        exit(-1);
      }
    
      return;
    }
    
    /*
    // Two processes:
    // 1. Start daemon and exit
    // 2. Running ongoing background process
    */
    int main
    (
    )
    {
      pid_t process_id;
    
      process_id = fork();
      checkForkError(process_id);
    
    /*
    // Parent (process_id != 0)
    // Forked child already so exit
    */
      if (process_id != 0 )
      {
        return 0;
      }
    
    /*
    // Child (process_id == 0)
    // Run ongoing daemon
    */
      doDaemon();
    
      return 0;
    }
    
    To compile the source code, execute "/usr/bin/make linjad" and then make sure that the binary file is in "/opt/linja/bin".
  • Java Server Bash Script:
    /opt/linja/bin/linjad.bash
    #!/bin/bash
    
    cd /var/www/html/linja
    /usr/bin/java LinjaServer
    
  • Java Server Source:
    /var/www/html/linja/LinjaServer.java
    /*
    // 21 Apr 2002
    //
    // /usr/bin/javac *.java
    // /bin/cp *.class /var/www/html/linja
    // cd /var/www/html/linja
    // /usr/bin/java LinjaServer
    //
    */
    
    import java.lang.*;
    import java.net.*;
    import LinjaCommon;
    
    public class LinjaServer extends java.lang.Thread
      implements java.lang.Runnable
    {
      public final static int SLEEP_INTERVAL = 1000;
      public final static java.lang.String COMMAND_STRING =
        new java.lang.String("/opt/linja/bin/linja.bash");
    
      public java.net.ServerSocket serverSocket;
      public java.net.Socket       socket;
      public java.lang.String      input;
      public Connection            connection;
    
      public LinjaServer
      (
      )
      {
        try
        {
          this.serverSocket = new ServerSocket(LinjaCommon.PORT);
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue.getMessage());
          java.lang.System.exit(0);
        }
    
        return;
      }
    
      public static void main
      (
        java.lang.String argv[]
      )
      {
        LinjaServer linjaServer;
    
        linjaServer = new LinjaServer();
        linjaServer.start();
    
        return;
      }
    
      public synchronized void run
      (
      )
      {
        this.listen();
    
        this.connection = new Connection(this.socket);
        this.connection.start();
    
        for (;;)
        {
          try
          {
            this.toProcess();
    
            this.sleep(this.SLEEP_INTERVAL);
          }
          catch
          (
            java.lang.Exception exceptionValue
          )
          {
            break;
          }
        }
    
        this.close();
    
        return;
      }
    
      public void listen
      (
      )
      {
        try
        {
          this.socket = this.serverSocket.accept();
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue);
        }
    
        return;
      }
    
      public void close
      (
      )
      {
        try
        {
          this.socket.close();
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue.getMessage());
    
          return;
        }
    
        return;
      }
    
      public void toProcess
      (
      )
      {
        java.lang.Runtime      runtime;
        java.io.BufferedReader bufferedReader;
        java.lang.String       string;
        java.lang.String       line;
    
        runtime = java.lang.Runtime.getRuntime();
    
        try
        {
          bufferedReader =
            new java.io.BufferedReader
            (
              new java.io.InputStreamReader
              (
                runtime.exec(this.COMMAND_STRING).getInputStream()
              )
            );
    
          string = new java.lang.String("\n");
          while ((line = bufferedReader.readLine()) != null)
          {
            string = new java.lang.String(string + line + "\n");
          }
    
          this.connection.dataOutputStream.writeUTF(string);
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue.getMessage());
    
          return;
        }
    
        return;
      }
    }
    
    class Connection extends java.lang.Thread
    {
      public java.net.Socket          socket;
      public java.io.DataOutputStream dataOutputStream;
    
      public Connection
      (
        java.net.Socket socketValue
      )
      {
        this.socket = socketValue;
    
        return;
      }
    
      public synchronized void run
      (
      )
      {
        try
        {
          this.dataOutputStream =
            new java.io.DataOutputStream
            (
              this.socket.getOutputStream()
            );
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue.getMessage());
          java.lang.System.exit(0);
        }
    
        return;
      }
    }
    

    /var/www/html/linja/LinjaCommon.java
    /*
    // 15 April 2002
    */
    
    import java.lang.*;
    
    public class LinjaCommon
    {
      public static final java.lang.String HOST =
        new java.lang.String("localhost.localdomain");
      public static final int PORT = 12345;
    
      public LinjaCommon
      (
      )
      {
        super();
    
        return;
      }
    }
    
    To compile the source code, execute "/usr/bin/javac *.java" and then make sure the class files are in "/var/www/html/linja".
  • Runtime Bash Script:
    /opt/linja/bin/linja.bash
    #!/bin/bash
    
    SOURCES=`/opt/linja/bin/printsources.bash`;
    DATE=`/bin/date`;
    
    for SOURCE in ${SOURCES}
    do
      /bin/echo "###################################################";
      /bin/echo ${DATE};
      /bin/echo ${SOURCE};
      /bin/cat ${SOURCE};
      /bin/echo "###################################################";
    done;
    

    /opt/linja/bin/printsources.bash
    #!/bin/bash
    
    SOURCE_INIT="/etc/rc.d/init.d/linjad";
    SOURCE_C="/opt/linja/src/linjad.c";
    SOURCE_BASH="/opt/linja/bin/linja.bash";
    SOURCE_JAVA="/opt/linja/src/LinjaServer.java";
    SOURCE_APPLET="/opt/linja/src/LinjaClient.java";
    
    /bin/echo "\
    ${SOURCE_INIT} \
    ${SOURCE_C} \
    ${SOURCE_BASH} \
    ${SOURCE_JAVA} \
    ${SOURCE_APPLET} \
    ";
    
    exit 0;
    
  • Java Client Source:
    /var/www/html/linja/index.html
    <!-- /var/www/html/linja/index.html -->
    <applet code="LinjaClient.class" height="400" width="600"></applet>
    

    /var/www/html/linja/LinjaClient.java
    /*
    // 14 April 2002
    //
    // /usr/bin/appletviewer index.html
    //
    */
    
    import java.lang.*;
    import java.applet.*;
    import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    
    public class LinjaClient extends java.applet.Applet
    {
      public LinjaCommon              linjaCommon;
    
      public java.awt.GridBagLayout gridBagLayout;
      public java.awt.TextArea      textArea;
      public java.net.Socket        socket;
    
      public LinjaClient
      (
      )
      {
        this.linjaCommon = new LinjaCommon();
    
        this.gridBagLayout = new java.awt.GridBagLayout();
        this.textArea      = new java.awt.TextArea();
    
        return;
      }
    
      public void init
      (
      )
      {
        super.init();
    
        if (this.connect() != true)
        {
          java.lang.System.exit(0);
        }
    
        this.setLayout(this.gridBagLayout);
    
        this.addComponent(this.textArea, 1, 1, 1, 1,
                          0, 0, java.awt.GridBagConstraints.NONE);
    
        return;
      }
    
      public synchronized void start
      (
      )
      {
        java.io.DataInputStream  dataInputStream;
        Reporter                 reporter;
    
        try
        {
          dataInputStream =
            new java.io.DataInputStream
            (
              this.socket.getInputStream()
            );
    
          reporter = new Reporter(dataInputStream, this.textArea);
          reporter.start();
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          java.lang.System.err.println(exceptionValue.getMessage());
    
          java.lang.System.exit(0);
        }
    
        return;
      }
    
      public void addComponent
      (
        java.awt.Component c,
        int                row,
        int                column,
        int                width,
        int                height,
        int                weightxValue,  // can grow wider
        int                weightyValue,  // can grow taller
        int                fillValue
      )
      {
        java.awt.GridBagConstraints gbConstraints =
          new java.awt.GridBagConstraints();
    
        gbConstraints.gridx = column;
        gbConstraints.gridy = row;
    
        gbConstraints.gridwidth  = width;
        gbConstraints.gridheight = height;
    
        gbConstraints.weightx = weightxValue;
        gbConstraints.weighty = weightyValue;
    
        gbConstraints.fill = fillValue;
    
        this.gridBagLayout.setConstraints(c, gbConstraints);
        this.add(c);
    
        return;
      }
    
      public boolean connect
      (
      )
      {
        boolean flag;
    
        flag = true;
    
        try
        {
          this.socket =
            new java.net.Socket
            (
              linjaCommon.HOST,
              linjaCommon.PORT
            );
        }
        catch
        (
          java.lang.Exception exceptionValue
        )
        {
          flag = false;
        }
    
        return flag;
      }
    }
    
    class Reporter extends java.lang.Thread
    {
      java.io.DataInputStream dataInputStream;
      java.awt.TextArea       textArea;
    
      public Reporter
      (
        java.io.DataInputStream dataInputStreamValue,
        java.awt.TextArea       textAreaValue
      )
      {
        super();
    
        this.dataInputStream = dataInputStreamValue;
        this.textArea        = textAreaValue;
    
        return;
      }
    
      public synchronized void run
      (
      )
      {
        for (;;)
        {
          try
          {
            this.textArea.setText
            (
              this.dataInputStream.readUTF()
            );
    
            this.sleep(1000);
          }
          catch
          (
            java.lang.Exception exceptionValue
          )
          {
            break;
          }
        }
    
        return;
      }
    }
    
  • Man Page:
    /usr/share/man/man1/linja.1.gz
    .TH LINJA 1
    .SH NAME
    linja \- LINUX JAVA
    .SH SYNOPSIS
    /sbin/service linjad start
    .br
    /usr/bin/java LinjaServer
    .br
    /usr/bin/appletviewer index.html
    .br
    .br
     
    .SH DESCRIPTION
       Linux Java demonstrates how Java can be used under the
    Red Hat Linux 7.1 with the kaffe package.
    .PP
       This manual page documents the GNU version of
    .BR linja .
    .B linja
    Enables system to function with Bash, C daemon and Java.
    .SS OPTIONS
    .TP
    .I none
    
    .SH VERSION
    LINJA v1.0
    
    .SH AUTHOR
    Primac Systems Limited - Copyright (c) 2002
    
    .SH BUG REPORT
    Report any bugs to [email protected]
    
    .SH WEB
    http://www.geocities.com/primacprim/
    
  • Building RPM:
    /usr/src/redhat/SPECS/linja.spec
    Summary: Linux Java
    Name: linja
    Version: 1.0
    Release: 1
    BuildRoot: /var/tmp/%{name}-%{version}
    
    URL: http://www.geocities.com/primacprim/
    Packager: Primac <[email protected]>
    Distribution: Red Hat Linux release 7.1 (Seawolf)
    Vendor: Primac Project <http://www.geocities.com/primacprim/>
    
    License: GPL
    Group: Networking/Daemons
    Requires: bash >= 2.04-21, fileutils >= 4.0.36-4, initscripts >= 5.83-1, kaffe >= 1.0.6-3, apache >= 1.3.19-5
    
    %description
    Linux Java demonstrates how Java can be used under the
    Red Hat Linux 7.1 with the kaffe package.
    
    %install
    /bin/mkdir -p ${RPM_BUILD_ROOT}/opt/linja/bin
    /bin/mkdir -p ${RPM_BUILD_ROOT}/opt/linja/src
    /bin/mkdir -p ${RPM_BUILD_ROOT}/etc/rc.d/init.d
    /bin/mkdir -p ${RPM_BUILD_ROOT}/var/www/html/linja
    /bin/mkdir -p ${RPM_BUILD_ROOT}/usr/share/man/man1
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/linjad.init ${RPM_BUILD_ROOT}/etc/rc.d/init.d/linjad
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/linja.1.gz ${RPM_BUILD_ROOT}/usr/share/man/man1
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/linjad ${RPM_BUILD_ROOT}/opt/linja/bin
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/*.bash ${RPM_BUILD_ROOT}/opt/linja/bin
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/*.java ${RPM_BUILD_ROOT}/opt/linja/src
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/*.c ${RPM_BUILD_ROOT}/opt/linja/src
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/*.class ${RPM_BUILD_ROOT}/opt/linja/bin
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/*.class ${RPM_BUILD_ROOT}/var/www/html/linja
    /usr/bin/install -m755 ${RPM_SOURCE_DIR}/index.html ${RPM_BUILD_ROOT}/var/www/html/linja
    
    %post
    /bin/echo -e "\nLinux Java\n";
    
    %clean
    /bin/rm -rf ${RPM_BUILD_ROOT}
    
    %files
    /etc/rc.d/init.d/linjad
    /usr/share/man/man1/linja.1.gz
    /var/www/html/linja/Connection.class
    /var/www/html/linja/LinjaClient.class
    /var/www/html/linja/LinjaServer.class
    /var/www/html/linja/LinjaCommon.class
    /var/www/html/linja/Reporter.class
    /var/www/html/linja/index.html
    /opt/linja/bin/linjad.bash
    /opt/linja/bin/linjad
    /opt/linja/bin/LinjaClient.class
    /opt/linja/bin/LinjaCommon.class
    /opt/linja/bin/LinjaServer.class
    /opt/linja/bin/Connection.class
    /opt/linja/bin/Reporter.class
    /opt/linja/bin/printsources.bash
    /opt/linja/bin/linja.bash
    /opt/linja/src/linjad.c
    /opt/linja/src/LinjaCommon.java
    /opt/linja/src/LinjaServer.java
    /opt/linja/src/LinjaClient.java
    
    %changelog
    * Sat May 3  2002 Primac <[email protected]>
    - First Build (/bin/rpm -bb linja.spec)
    
    Make sure that all of the files are in the /usr/src/redhat/SOURCES. Execute "/bin/rpm -bb /usr/src/redhat/SPECS/linja.spec". Install the new Linja RPM "/bin/rpm -ivh /usr/src/redhat/RPMS/i386/linja-1.0-1.i386.rpm".

 

  • Testing:

  • Start the Linja Server service.
    /sbin/service linjad restart
    
  • Use the Linja Client to access the service.
    cd /var/www/html/linja
    /usr/bin/appletviewer /var/www/html/linja/index.html
    


 

Primac Systems Limited

Copyright 2001

 

Hosted by www.Geocities.ws

1