summaryrefslogtreecommitdiffstats
path: root/SOURCES/gitlab.init
blob: e8bb0235a1efddaaf716d162c9a08dc220645a15 (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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#! /bin/sh

# GITLAB
# Maintainer: @randx
# Authors: rovanion.luckey@gmail.com, @randx
# App Version: 6.0

### BEGIN INIT INFO
# Provides:          gitlab
# Required-Start:    $local_fs $remote_fs $network $syslog redis-server
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: GitLab git repository management
# Description:       GitLab git repository management
### END INIT INFO

### Environment variables
RAILS_ENV="production"

# Script variable names should be lower-case not to conflict with internal
# /bin/sh variables such as PATH, EDITOR or SHELL.
app_root="/var/www/gitlab/gitlab"
app_user="git"
pid_path="$app_root/tmp/pids"
socket_path="$app_root/tmp/sockets"
sidekiq_pid_path="$pid_path/sidekiq.pid"



### Here ends user configuration ###


# Switch to the app_user if it is not he/she who is running the script.
if [ "$USER" != "$app_user" ]; then
  sudo -u "$app_user" -H -i $0 "$@"; exit;
fi

# Switch to the gitlab path, if it fails exit with an error.
if ! cd "$app_root" ; then
 echo "Failed to cd into $app_root, exiting!";  exit 1
fi

### Init Script functions

check_pids(){
  if ! mkdir -p "$pid_path"; then
    echo "Could not create the path $pid_path needed to store the pids."
    exit 1
  fi
  if [ -f "$sidekiq_pid_path" ]; then
    spid=$(cat "$sidekiq_pid_path")
  else
    spid=0
  fi
}

# We use the pids in so many parts of the script it makes sense to always check them.
# Only after start() is run should the pids change. Sidekiq sets it's own pid.
check_pids


# Checks whether the different parts of the service are already running or not.
check_status(){
  check_pids
  if [ $spid -ne 0 ]; then
    kill -0 "$spid" 2>/dev/null
    sidekiq_status="$?"
  else
    sidekiq_status="-1"
  fi
}

# Check for stale pids and remove them if necessary
check_stale_pids(){
  check_status
  # If there is a pid it is something else than 0, the service is running if
  # *_status is == 0.
  if [ "$spid" != "0" -a "$sidekiq_status" != "0" ]; then
    echo "Removing stale Sidekiq web server pid. This is most likely caused by the Sidekiq crashing the last time it ran."
    if ! rm "$sidekiq_pid_path"; then
      echo "Unable to remove stale pid, exiting"
      exit 1
    fi
  fi
}

# If no parts of the service is running, bail out.
exit_if_not_running(){
  check_stale_pids
  if [ "$sidekiq_status" != "0" ]; then
    echo "GitLab is not running."
    exit
  fi
}

# Starts Unicorn and Sidekiq.
start() {
  check_stale_pids

  # If sidekiq is already running, don't start it again.
  if [ "$sidekiq_status" = "0" ]; then
    echo "The Sidekiq job dispatcher is already running with pid $spid, not restarting"
  else
    echo "Starting the GitLab Sidekiq event dispatcher..."
    RAILS_ENV=$RAILS_ENV script/background_jobs start
    # We are sleeping a bit here because sidekiq is slow at writing it's pid
    sleep 2
  fi

  # Finally check the status to tell wether or not GitLab is running
  status
}

# Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them.
stop() {
  exit_if_not_running
  # And do the same thing for the Sidekiq.
  if [ "$sidekiq_status" = "0" ]; then
    printf "Stopping Sidekiq job dispatcher."
    RAILS_ENV=$RAILS_ENV script/background_jobs stop
    stopping=true
  else
    echo "The Sidekiq was not running, must have run out of breath."
  fi


  # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script.
  while [ "$stopping" = "true" ]; do
    sleep 1
    check_status
  done
  sleep 1
  # Cleaning up unused pids
  # rm "$sidekiq_pid_path" # Sidekiq seems to be cleaning up it's own pid.

  status
}

# Returns the status of GitLab and it's components
status() {
  check_status
  if [ "$sidekiq_status" != "0" ]; then
    echo "GitLab is not running."
    return
  fi
  if [ "$sidekiq_status" = "0" ]; then
      echo "The GitLab Sidekiq job dispatcher with pid $spid is running."
  else
      printf "The GitLab Sidekiq job dispatcher is \033[31mnot running\033[0m.\n"
  fi
  if [ "$sidekiq_status" = "0" ]; then
    printf "GitLab and all its components are \033[32mup and running\033[0m.\n"
  fi
}

reload(){
  exit_if_not_running
  if [ "$wpid" = "0" ];then
    echo "The GitLab Unicorn Web server is not running thus its configuration can't be reloaded."
    exit 1
  fi
  echo "Restarting GitLab Sidekiq since it isn't capable of reloading its config..."
  RAILS_ENV=$RAILS_ENV script/background_jobs restart
  # Waiting 2 seconds for sidekiq to write it.
  sleep 2
  status
}

restart(){
  check_status
  if [ "$sidekiq_status" = "0" ]; then
    stop
  fi
  start
}


## Finally the input handling.

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  reload|force-reload)
	reload
        ;;
  status)
        status
        ;;
  *)
        echo "Usage: service gitlab {start|stop|restart|reload|status}"
        exit 1
        ;;
esac

exit