aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/tools/build/onos-package
blob: 5566e60dbc4619391a5c80765292c24dea0979dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/bin/bash
# -----------------------------------------------------------------------------
# Packages ONOS distributable into onos.tar.gz, onos.zip or a deb file
# -----------------------------------------------------------------------------

set -e

# Build the staging directory used to produce the packages
function build_stage_dir() {
    # Make sure we have the original apache karaf bits first
    [ ! -d $M2_REPO ] && echo "M2 repository $M2_REPO not found" && exit 1
    [ -d $ONOS_STAGE ] && echo "ONOS stage $ONOS_STAGE already exists" && exit 1

    # Create the stage directory and warp into it
    mkdir -p $ONOS_STAGE
    cd $ONOS_STAGE

    # Check if Apache Karaf bits are available and if not, fetch them.
    if [ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ]; then
        echo "Downloading $KARAF_TAR..."
        curl -sL http://downloads.onosproject.org/third-party/apache-karaf-$KARAF_VERSION.tar.gz > $KARAF_TAR
    fi
    [ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ] && \
        echo "Apache Karaf bits $KARAF_ZIP or $KARAF_TAR not found" && exit 1

    # Unroll the Apache Karaf bits, prune them and make ONOS top-level directories.
    [ -f $KARAF_ZIP ] && unzip -q $KARAF_ZIP && rm -rf $ONOS_STAGE/$KARAF_DIST/demos
    [ -f $KARAF_TAR ] && tar zxf $KARAF_TAR && rm -rf $ONOS_STAGE/$KARAF_DIST/demos
    mkdir bin

    # Patch the log-file size in place to increase it to 10 MB
    perl -pi.old -e "s/maxFileSize=1MB/maxFileSize=10MB/g" \
        $ONOS_STAGE/$KARAF_DIST/etc/org.ops4j.pax.logging.cfg

    # Stage the ONOS admin scripts and patch in Karaf service wrapper extras
    cp -r $ONOS_ROOT/tools/package/bin .
    cp -r $ONOS_ROOT/tools/package/init $ONOS_STAGE/init
    cp -r $ONOS_ROOT/tools/package/etc/* $ONOS_STAGE/$KARAF_DIST/etc

    # Stage all builtin ONOS apps for factory install
    onos-stage-apps $ONOS_STAGE/apps $ONOS_STAGE/$KARAF_DIST/system

    # Mark the org.onosproject.drivers app active by default
    touch $ONOS_STAGE/apps/org.onosproject.drivers/active

    # Patch-in proper Karaf version into the startup script
    sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
        $ONOS_ROOT/tools/package/bin/onos-service > bin/onos-service
    sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
        $ONOS_ROOT/tools/package/bin/onos-client > bin/onos
    chmod a+x bin/onos-service bin/onos

    # Stage the ONOS bundles, but only those that match the version
    mkdir -p $ONOS_STAGE/$KARAF_DIST/system/org/onosproject
    find $M2_REPO/org/onosproject -type f -path "*/$ONOS_POM_VERSION/*" \
        \( -name '*.jar' -o -name '*.pom' -o -name '*-features.xml' \) \
            | grep -v -Ee '-tests.jar|-[0-9]{8}.[0-9]{6}-' \
            | while read src; do
        dst=$ONOS_STAGE/$KARAF_DIST/system/${src#$M2_REPO/*}
        mkdir -p $(dirname $dst)
        cp $src $dst
    done

    # ONOS Patching ----------------------------------------------------------------

    # Patch the Apache Karaf distribution file to add ONOS features repository
    perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onosproject/onos-features/$ONOS_POM_VERSION/xml/features|" \
        $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg

    # Patch the Apache Karaf distribution file to load default ONOS boot features
    export BOOT_FEATURES="webconsole,onos-api,onos-core,onos-incubator,onos-cli,onos-rest,onos-gui"
    perl -pi.old -e "s|^(featuresBoot=.*)|\1,$BOOT_FEATURES|" \
        $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg

    # Patch the Apache Karaf distribution with ONOS branding bundle
    cp $M2_REPO/org/onosproject/onos-branding/$ONOS_POM_VERSION/onos-branding-*.jar \
        $ONOS_STAGE/$KARAF_DIST/lib

    # Patch in the ONOS version file
    echo $ONOS_VERSION > $ONOS_STAGE/VERSION
}

function build_compressed_package() {
    # Package up the ONOS tar file
    cd $ONOS_STAGE_ROOT
    rm -f $ONOS_TAR $ONOS_ZIP
    COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS

    # Figure out whether we should build ONOS zip file and if so, build it.
    which zip >/dev/null && [ -z "$ONOS_TAR_ONLY" ] && buildZip=true || unset buildZip
    [ -n "$buildZip" ] && zip -rq $ONOS_ZIP $ONOS_BITS

    # Report on the archives that were built and clean-up
    [ -n "$buildZip" ] && ls -lh $ONOS_TAR $ONOS_ZIP || ls -lh $ONOS_TAR
    rm -r $ONOS_STAGE
}

# Build a DEB package
function build_deb() {
    echo "This command may ask for your password to run commands as sudo,"
    echo "  because you need to be root in order to generate a proper DEB package."

    sudo rm -fr $ONOS_DEB_ROOT

    mkdir -p $ONOS_DEB_ROOT/{DEBIAN,opt,etc/init}

    # Copy the debian directory and fill in version
    cp -r $ONOS_ROOT/tools/package/deb/* $ONOS_DEB_ROOT/DEBIAN/
    sed -i'' -E "s/@ONOS_POM_VERSION/$ONOS_POM_VERSION/" $ONOS_DEB_ROOT/DEBIAN/control

    cp -r $ONOS_STAGE $ONOS_DEB_ROOT/opt/onos
    cp $ONOS_ROOT/tools/package/init/onos.conf $ONOS_DEB_ROOT/etc/init/

    mkdir -p $ONOS_DEB_ROOT/opt/onos/var/

    sudo chown -R root:root $ONOS_DEB_ROOT

    sudo dpkg-deb --build $ONOS_DEB_ROOT > /dev/null &&
    sudo mv $ONOS_STAGE_ROOT/deb.deb $ONOS_DEB && ls -l $ONOS_DEB

    #TODO run lintian on .deb
}

# Build an RPM package
function build_rpm() {
    read -r -p "WARN: rpm-build utility and root priviledges are need to build the package. Do you want to continue? [Y/n] " response
    [[ "$response" =~ ^[Nn] ]] && exit 0

    sudo rm -fr $ONOS_RPM_ROOT

    sudo yum -y install rpm-build

    mkdir -p $ONOS_RPM_ROOT/{BUILD,RPMS,SOURCES/onos-$ONOS_RPM_VERSION/{etc/init,opt},SPECS,SRPMS}

    cp -r $ONOS_STAGE $ONOS_RPM_ROOT/SOURCES/onos-$ONOS_RPM_VERSION/opt/onos
    cp $ONOS_ROOT/tools/package/init/onos.conf $ONOS_RPM_ROOT/SOURCES/onos-$ONOS_RPM_VERSION/etc/init/

    cd $ONOS_RPM_ROOT/SOURCES
    COPYFILE_DISABLE=1 tar zcf onos-$ONOS_RPM_VERSION.tar.gz onos-$ONOS_RPM_VERSION

    cp $ONOS_ROOT/tools/package/rpm/onos.spec $ONOS_RPM_ROOT/SPECS/
    sed -i'' -E "s/@ONOS_RPM_VERSION/$ONOS_RPM_VERSION/g" $ONOS_RPM_ROOT/SPECS/onos.spec

    rpmbuild --define "_topdir $ONOS_RPM_ROOT" -bb $ONOS_RPM_ROOT/SPECS/onos.spec

    cp $ONOS_RPM_ROOT/RPMS/noarch/onos-$ONOS_RPM_VERSION-1.noarch.rpm $ONOS_STAGE_ROOT && ls -l $ONOS_STAGE_ROOT/onos-$ONOS_RPM_VERSION-1.noarch.rpm
}

# Script entry point
[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
. $ONOS_ROOT/tools/build/envDefaults

# Bail on any errors
set -e

# Before starting make sure the environment is clan - delete onos staging folder
rm -fr $ONOS_STAGE

# If there are parameters check if we want to build a deb - otherwise build tar.gz
case ${1:---tar} in
    "--tar" | "-T") build_stage_dir
                    build_compressed_package
    ;;
    "--deb" | "-D") build_stage_dir
                    build_deb
    ;;
    "--rpm" | "-R") build_stage_dir
                    build_rpm
    ;;
    *) echo "usage: $(basename $0) [--tar|--deb|--rpm]" >&2 && exit 1
    ;;
esac