auser-poolparty-extensions 0.0.7 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +15 -0
- data/Rakefile +2 -2
- data/VERSION.yml +2 -2
- data/lib/extensions/bash_alias.rb +3 -0
- data/lib/extensions/convenience_helpers.rb +89 -0
- data/lib/extensions/development_gem_package.rb +3 -2
- data/lib/extensions/ganglia/ganglia.rb +219 -0
- data/lib/extensions/ganglia/templates/bin/gmetad.erb +38 -0
- data/lib/extensions/ganglia/templates/bin/gmond.erb +38 -0
- data/lib/extensions/ganglia/templates/ganglia-web-conf.php.erb +191 -0
- data/lib/extensions/ganglia/templates/gmetad.conf.erb +116 -0
- data/lib/extensions/ganglia/templates/gmond.conf.erb +426 -0
- data/lib/extensions/ganglia/templates/hadoop-metrics.properties.erb +65 -0
- data/lib/extensions/hadoop/hadoop.rb +427 -0
- data/lib/extensions/hadoop/templates/core-site.xml.erb +62 -0
- data/lib/extensions/hadoop/templates/hadoop-env.sh +4 -0
- data/lib/extensions/hadoop/templates/hadoop-site.xml.erb +9 -0
- data/lib/extensions/hadoop/templates/hadoop_hosts.erb +0 -0
- data/lib/extensions/hadoop/templates/hdfs-site.xml.erb +48 -0
- data/lib/extensions/hadoop/templates/init.d/hadoop-datanode +125 -0
- data/lib/extensions/hadoop/templates/init.d/hadoop-jobtracker +125 -0
- data/lib/extensions/hadoop/templates/init.d/hadoop-namenode +124 -0
- data/lib/extensions/hadoop/templates/init.d/hadoop-secondarynamenode +124 -0
- data/lib/extensions/hadoop/templates/init.d/hadoop-tasktracker +124 -0
- data/lib/extensions/hadoop/templates/jvm.conf +12 -0
- data/lib/extensions/hadoop/templates/log4j.properties.erb +94 -0
- data/lib/extensions/hadoop/templates/mapred-site.xml.erb +70 -0
- data/lib/extensions/hive/hive.rb +138 -0
- data/lib/poolparty-extensions.rb +5 -2
- metadata +28 -4
@@ -0,0 +1,62 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
|
3
|
+
|
4
|
+
<!-- Put site-specific property overrides in this file. -->
|
5
|
+
|
6
|
+
<configuration>
|
7
|
+
|
8
|
+
<property>
|
9
|
+
<name>hadoop.tmp.dir</name>
|
10
|
+
<!--<value><%= @node[:poolparty][:hadoop_data_dir] %>/hadoop-${user.name}</value> -->
|
11
|
+
<value><%= @node[:poolparty][:hadoop_data_dir] %>/tmp</value>
|
12
|
+
<description>A base for other temporary directories.</description>
|
13
|
+
</property>
|
14
|
+
|
15
|
+
<property>
|
16
|
+
<name>fs.default.name</name>
|
17
|
+
<value>hdfs://<%= @node[:poolparty][:current_master] %>:<%= @node[:poolparty][:hadoop_fs_default_port] %></value>
|
18
|
+
<description>The name of the default file system. A URI whose
|
19
|
+
scheme and authority determine the FileSystem implementation. The
|
20
|
+
uri's scheme determines the config property (fs.SCHEME.impl) naming
|
21
|
+
the FileSystem implementation class. The uri's authority is used to
|
22
|
+
determine the host, port, etc. for a filesystem.</description>
|
23
|
+
</property>
|
24
|
+
|
25
|
+
<property>
|
26
|
+
<name>webinterface.private.actions</name>
|
27
|
+
<value>true</value>
|
28
|
+
</property>
|
29
|
+
|
30
|
+
<!-- take a look at below -->
|
31
|
+
|
32
|
+
<!--
|
33
|
+
<property>
|
34
|
+
<name>topology.node.switch.mapping.impl</name>
|
35
|
+
<value>org.apache.hadoop.net.ScriptBasedMapping</value>
|
36
|
+
<description> The default implementation of the DNSToSwitchMapping. It
|
37
|
+
invokes a script specified in topology.script.file.name to resolve
|
38
|
+
node names. If the value for topology.script.file.name is not set, the
|
39
|
+
default value of DEFAULT_RACK is returned for all node names.
|
40
|
+
</description>
|
41
|
+
</property>
|
42
|
+
|
43
|
+
<property>
|
44
|
+
<name>topology.script.file.name</name>
|
45
|
+
<value></value>
|
46
|
+
<description> The script name that should be invoked to resolve DNS names to
|
47
|
+
NetworkTopology names. Example: the script would take host.foo.bar as an
|
48
|
+
argument, and return /rack1 as the output.
|
49
|
+
</description>
|
50
|
+
</property>
|
51
|
+
-->
|
52
|
+
|
53
|
+
<property>
|
54
|
+
<name>hadoop.rpc.socket.factory.class.default</name>
|
55
|
+
<value>org.apache.hadoop.net.StandardSocketFactory</value>
|
56
|
+
<final>true</final>
|
57
|
+
</property>
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
</configuration>
|
File without changes
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
|
3
|
+
|
4
|
+
<!-- Put site-specific property overrides in this file. -->
|
5
|
+
|
6
|
+
<configuration>
|
7
|
+
|
8
|
+
<property>
|
9
|
+
<name>dfs.replication</name>
|
10
|
+
<value><%= @node[:poolparty][:block_replication_level] || 3 %></value>
|
11
|
+
<description>Default block replication.
|
12
|
+
The actual number of replications can be specified when the file is created.
|
13
|
+
The default is used if replication is not specified in create time.
|
14
|
+
</description>
|
15
|
+
</property>
|
16
|
+
|
17
|
+
<property>
|
18
|
+
<name>dfs.name.dir</name>
|
19
|
+
<value><%= @node[:poolparty][:hadoop_data_dir] %>/dfs/name</value>
|
20
|
+
</property>
|
21
|
+
|
22
|
+
<property>
|
23
|
+
<name>dfs.data.dir</name>
|
24
|
+
<value><%= @node[:poolparty][:hadoop_data_dir] %>/dfs/data</value>
|
25
|
+
</property>
|
26
|
+
|
27
|
+
<!--
|
28
|
+
<property>
|
29
|
+
<name>dfs.hosts</name>
|
30
|
+
<value>/usr/local/hadoop/conf/hosts</value>
|
31
|
+
<description>
|
32
|
+
When we have a number of users connecting to the hadoop cloud they may
|
33
|
+
accidentially run "start-all.sh" and then their local machine will try to
|
34
|
+
connect to the cluster. We limit the machines that can be a part of the
|
35
|
+
hdfs to be only those listed in the slaves file. See
|
36
|
+
http://www.cloudera.com/blog/2008/12/03/securing-a-hadoop-cluster-through-a-gateway/
|
37
|
+
</description>
|
38
|
+
</property>
|
39
|
+
-->
|
40
|
+
|
41
|
+
<!-- slave.host.name -->
|
42
|
+
|
43
|
+
<property>
|
44
|
+
<name>dfs.permissions</name>
|
45
|
+
<value>true</value>
|
46
|
+
</property>
|
47
|
+
|
48
|
+
</configuration>
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
#
|
3
|
+
# skeleton example file to build /etc/init.d/ scripts.
|
4
|
+
# This file should be used to construct scripts for /etc/init.d.
|
5
|
+
#
|
6
|
+
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
|
7
|
+
# Modified for Debian
|
8
|
+
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
|
9
|
+
# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
|
10
|
+
#
|
11
|
+
# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl
|
12
|
+
#
|
13
|
+
### BEGIN INIT INFO
|
14
|
+
# Provides: hadoop-datanode
|
15
|
+
# Required-Start: $network $local_fs
|
16
|
+
# Required-Stop:
|
17
|
+
# Should-Start: $named
|
18
|
+
# Should-Stop:
|
19
|
+
# Default-Start: 2 3 4 5
|
20
|
+
# Default-Stop: 0 1 6
|
21
|
+
# Short-Description: Hadoop datanode daemon
|
22
|
+
### END INIT INFO
|
23
|
+
|
24
|
+
set -e
|
25
|
+
|
26
|
+
# Include hadoop defaults if available
|
27
|
+
if [ -f /usr/local/hadoop/conf/hadoop-env.sh ] ; then
|
28
|
+
. /usr/local/hadoop/conf/hadoop-env.sh
|
29
|
+
fi
|
30
|
+
|
31
|
+
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
32
|
+
DAEMON_SCRIPT=$HADOOP_HOME/bin/hadoop-daemon.sh
|
33
|
+
NAME=hadoop-datanode
|
34
|
+
DESC="Hadoop datanode daemon"
|
35
|
+
|
36
|
+
test -x $DAEMON_SCRIPT || exit 0
|
37
|
+
|
38
|
+
LOGDIR=$HADOOP_LOG_DIR
|
39
|
+
PIDFILE=/var/run/hadoop/datanode.pid
|
40
|
+
DODTIME=3 # Time to wait for the server to die, in seconds
|
41
|
+
# If this value is set too low you might not
|
42
|
+
# let some servers to die gracefully and
|
43
|
+
# 'restart' will not work
|
44
|
+
|
45
|
+
get_running_pid() {
|
46
|
+
pid=$(ps axw -eo pid,command | tr 'A-Z' 'a-z' | grep org.apache.hadoop | grep datanode | grep java | awk '{print $1}')
|
47
|
+
}
|
48
|
+
|
49
|
+
running() {
|
50
|
+
get_running_pid
|
51
|
+
[ -z "$pid" ] && return 1
|
52
|
+
return 0
|
53
|
+
}
|
54
|
+
|
55
|
+
start() {
|
56
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh start datanode"
|
57
|
+
}
|
58
|
+
stop() {
|
59
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh stop datanode"
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
case "$1" in
|
64
|
+
start)
|
65
|
+
echo -n "Starting $DESC: "
|
66
|
+
|
67
|
+
if running ; then
|
68
|
+
echo "$NAME."
|
69
|
+
echo "Already running."
|
70
|
+
else
|
71
|
+
start
|
72
|
+
if running ; then
|
73
|
+
echo "$NAME."
|
74
|
+
else
|
75
|
+
echo "ERROR."
|
76
|
+
fi
|
77
|
+
fi
|
78
|
+
;;
|
79
|
+
stop)
|
80
|
+
echo -n "Stopping $DESC: "
|
81
|
+
stop
|
82
|
+
if ! running ; then
|
83
|
+
echo 'ERROR'
|
84
|
+
else
|
85
|
+
echo "$NAME."
|
86
|
+
fi
|
87
|
+
;;
|
88
|
+
force-stop)
|
89
|
+
echo -n "Forcefully stopping $DESC: "
|
90
|
+
get_running_pid
|
91
|
+
kill -9 $pid
|
92
|
+
if ! running ; then
|
93
|
+
echo "$NAME."
|
94
|
+
else
|
95
|
+
echo " ERROR."
|
96
|
+
fi
|
97
|
+
;;
|
98
|
+
force-reload)
|
99
|
+
# check wether $DAEMON is running. If so, restart
|
100
|
+
running && $0 restart
|
101
|
+
;;
|
102
|
+
restart)
|
103
|
+
echo -n "Restarting $DESC: "
|
104
|
+
stop
|
105
|
+
[ -n "$DODTIME" ] && sleep $DODTIME
|
106
|
+
$0 start
|
107
|
+
;;
|
108
|
+
status)
|
109
|
+
echo -n "$NAME is "
|
110
|
+
if running ; then
|
111
|
+
echo "running"
|
112
|
+
else
|
113
|
+
echo "not running."
|
114
|
+
exit 1
|
115
|
+
fi
|
116
|
+
;;
|
117
|
+
*)
|
118
|
+
N=/etc/init.d/$NAME
|
119
|
+
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
|
120
|
+
echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
|
121
|
+
exit 1
|
122
|
+
;;
|
123
|
+
esac
|
124
|
+
|
125
|
+
exit 0
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
#
|
3
|
+
# skeleton example file to build /etc/init.d/ scripts.
|
4
|
+
# This file should be used to construct scripts for /etc/init.d.
|
5
|
+
#
|
6
|
+
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
|
7
|
+
# Modified for Debian
|
8
|
+
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
|
9
|
+
# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
|
10
|
+
#
|
11
|
+
# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl
|
12
|
+
#
|
13
|
+
### BEGIN INIT INFO
|
14
|
+
# Provides: hadoop-jobtracker
|
15
|
+
# Required-Start: $network $local_fs
|
16
|
+
# Required-Stop:
|
17
|
+
# Should-Start: $named
|
18
|
+
# Should-Stop:
|
19
|
+
# Default-Start: 2 3 4 5
|
20
|
+
# Default-Stop: 0 1 6
|
21
|
+
# Short-Description: Hadoop jobtracker daemon
|
22
|
+
### END INIT INFO
|
23
|
+
|
24
|
+
set -e
|
25
|
+
|
26
|
+
# Include hadoop defaults if available
|
27
|
+
if [ -f /usr/local/hadoop/conf/hadoop-env.sh ] ; then
|
28
|
+
. /usr/local/hadoop/conf/hadoop-env.sh
|
29
|
+
fi
|
30
|
+
|
31
|
+
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
32
|
+
DAEMON_SCRIPT=$HADOOP_HOME/bin/hadoop-daemon.sh
|
33
|
+
NAME=hadoop-jobtracker
|
34
|
+
DESC="Hadoop jobtracker daemon"
|
35
|
+
|
36
|
+
test -x $DAEMON_SCRIPT || exit 0
|
37
|
+
|
38
|
+
LOGDIR=$HADOOP_LOG_DIR
|
39
|
+
PIDFILE=/var/run/hadoop/jobtracker.pid
|
40
|
+
DODTIME=3 # Time to wait for the server to die, in seconds
|
41
|
+
# If this value is set too low you might not
|
42
|
+
# let some servers to die gracefully and
|
43
|
+
# 'restart' will not work
|
44
|
+
|
45
|
+
get_running_pid() {
|
46
|
+
pid=$(ps axw -eo pid,command | tr 'A-Z' 'a-z' | grep org.apache.hadoop | grep jobtracker | grep java | awk '{print $1}')
|
47
|
+
}
|
48
|
+
|
49
|
+
running() {
|
50
|
+
get_running_pid
|
51
|
+
[ -z "$pid" ] && return 1
|
52
|
+
return 0
|
53
|
+
}
|
54
|
+
|
55
|
+
start() {
|
56
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh start jobtracker"
|
57
|
+
}
|
58
|
+
stop() {
|
59
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh stop jobtracker"
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
case "$1" in
|
64
|
+
start)
|
65
|
+
echo -n "Starting $DESC: "
|
66
|
+
|
67
|
+
if running ; then
|
68
|
+
echo "$NAME."
|
69
|
+
echo "Already running."
|
70
|
+
else
|
71
|
+
start
|
72
|
+
if running ; then
|
73
|
+
echo "$NAME."
|
74
|
+
else
|
75
|
+
echo "ERROR."
|
76
|
+
fi
|
77
|
+
fi
|
78
|
+
;;
|
79
|
+
stop)
|
80
|
+
echo -n "Stopping $DESC: "
|
81
|
+
stop
|
82
|
+
if ! running ; then
|
83
|
+
echo 'ERROR'
|
84
|
+
else
|
85
|
+
echo "$NAME."
|
86
|
+
fi
|
87
|
+
;;
|
88
|
+
force-stop)
|
89
|
+
echo -n "Forcefully stopping $DESC: "
|
90
|
+
get_running_pid
|
91
|
+
kill -9 $pid
|
92
|
+
if ! running ; then
|
93
|
+
echo "$NAME."
|
94
|
+
else
|
95
|
+
echo " ERROR."
|
96
|
+
fi
|
97
|
+
;;
|
98
|
+
force-reload)
|
99
|
+
# check wether $DAEMON is running. If so, restart
|
100
|
+
running && $0 restart
|
101
|
+
;;
|
102
|
+
restart)
|
103
|
+
echo -n "Restarting $DESC: "
|
104
|
+
stop
|
105
|
+
[ -n "$DODTIME" ] && sleep $DODTIME
|
106
|
+
$0 start
|
107
|
+
;;
|
108
|
+
status)
|
109
|
+
echo -n "$NAME is "
|
110
|
+
if running ; then
|
111
|
+
echo "running"
|
112
|
+
else
|
113
|
+
echo "not running."
|
114
|
+
exit 1
|
115
|
+
fi
|
116
|
+
;;
|
117
|
+
*)
|
118
|
+
N=/etc/init.d/$NAME
|
119
|
+
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
|
120
|
+
echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
|
121
|
+
exit 1
|
122
|
+
;;
|
123
|
+
esac
|
124
|
+
|
125
|
+
exit 0
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
#
|
3
|
+
# skeleton example file to build /etc/init.d/ scripts.
|
4
|
+
# This file should be used to construct scripts for /etc/init.d.
|
5
|
+
#
|
6
|
+
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
|
7
|
+
# Modified for Debian
|
8
|
+
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
|
9
|
+
# Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
|
10
|
+
#
|
11
|
+
# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl
|
12
|
+
#
|
13
|
+
### BEGIN INIT INFO
|
14
|
+
# Provides: hadoop-namenode
|
15
|
+
# Required-Start: $network $local_fs
|
16
|
+
# Required-Stop:
|
17
|
+
# Should-Start: $named
|
18
|
+
# Should-Stop:
|
19
|
+
# Default-Start: 2 3 4 5
|
20
|
+
# Default-Stop: 0 1 6
|
21
|
+
# Short-Description: Hadoop namenode daemon
|
22
|
+
### END INIT INFO
|
23
|
+
|
24
|
+
set -e
|
25
|
+
|
26
|
+
# Include hadoop defaults if available
|
27
|
+
if [ -f /usr/local/hadoop/conf/hadoop-env.sh ] ; then
|
28
|
+
. /usr/local/hadoop/conf/hadoop-env.sh
|
29
|
+
fi
|
30
|
+
|
31
|
+
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
32
|
+
DAEMON_SCRIPT=$HADOOP_HOME/bin/hadoop-daemon.sh
|
33
|
+
NAME=hadoop-namenode
|
34
|
+
DESC="Hadoop namenode daemon"
|
35
|
+
|
36
|
+
test -x $DAEMON_SCRIPT || exit 0
|
37
|
+
|
38
|
+
LOGDIR=$HADOOP_LOG_DIR
|
39
|
+
PIDFILE=/var/run/hadoop/namenode.pid
|
40
|
+
DODTIME=3 # Time to wait for the server to die, in seconds
|
41
|
+
# If this value is set too low you might not
|
42
|
+
# let some servers to die gracefully and
|
43
|
+
# 'restart' will not work
|
44
|
+
|
45
|
+
get_running_pid() {
|
46
|
+
pid=$(ps axw -eo pid,command | tr 'A-Z' 'a-z' | grep org.apache.hadoop | grep namenode.namenode | grep java | awk '{print $1}')
|
47
|
+
}
|
48
|
+
|
49
|
+
running() {
|
50
|
+
get_running_pid
|
51
|
+
[ -z "$pid" ] && return 1
|
52
|
+
return 0
|
53
|
+
}
|
54
|
+
|
55
|
+
start() {
|
56
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh start namenode"
|
57
|
+
}
|
58
|
+
stop() {
|
59
|
+
su -s /bin/sh root -c "$HADOOP_HOME/bin/hadoop-daemon.sh stop namenode"
|
60
|
+
}
|
61
|
+
|
62
|
+
|
63
|
+
case "$1" in
|
64
|
+
start)
|
65
|
+
echo -n "Starting $DESC: "
|
66
|
+
if running ; then
|
67
|
+
echo "$NAME."
|
68
|
+
echo "Already running."
|
69
|
+
else
|
70
|
+
start
|
71
|
+
if running ; then
|
72
|
+
echo "$NAME."
|
73
|
+
else
|
74
|
+
echo "ERROR."
|
75
|
+
fi
|
76
|
+
fi
|
77
|
+
;;
|
78
|
+
stop)
|
79
|
+
echo -n "Stopping $DESC: "
|
80
|
+
stop
|
81
|
+
if ! running ; then
|
82
|
+
echo 'ERROR'
|
83
|
+
else
|
84
|
+
echo "$NAME."
|
85
|
+
fi
|
86
|
+
;;
|
87
|
+
force-stop)
|
88
|
+
echo -n "Forcefully stopping $DESC: "
|
89
|
+
get_running_pid
|
90
|
+
kill -9 $pid
|
91
|
+
if ! running ; then
|
92
|
+
echo "$NAME."
|
93
|
+
else
|
94
|
+
echo " ERROR."
|
95
|
+
fi
|
96
|
+
;;
|
97
|
+
force-reload)
|
98
|
+
# check wether $DAEMON is running. If so, restart
|
99
|
+
running && $0 restart
|
100
|
+
;;
|
101
|
+
restart)
|
102
|
+
echo -n "Restarting $DESC: "
|
103
|
+
stop
|
104
|
+
[ -n "$DODTIME" ] && sleep $DODTIME
|
105
|
+
$0 start
|
106
|
+
;;
|
107
|
+
status)
|
108
|
+
echo -n "$NAME is "
|
109
|
+
if running ; then
|
110
|
+
echo "running"
|
111
|
+
else
|
112
|
+
echo "not running."
|
113
|
+
exit 1
|
114
|
+
fi
|
115
|
+
;;
|
116
|
+
*)
|
117
|
+
N=/etc/init.d/$NAME
|
118
|
+
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
|
119
|
+
echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
|
120
|
+
exit 1
|
121
|
+
;;
|
122
|
+
esac
|
123
|
+
|
124
|
+
exit 0
|