rubycas-server 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 0.4.0 :: In progress...
2
+
3
+ * Added rubycas-server-ctl script for controlling daemonized server.
4
+ * Added system startup script to be used in /etc/init.d on Linux systems.
5
+ * Authenticator can now be loaded from an external file using the 'source'
6
+ configuration option.
7
+ * Better preemptive detection of startup problems with mongrel.
8
+ * User now sees an error message if the service URI is not a valid URI (i.e.
9
+ if it's not URI-encoded or otherwise malformed).
10
+
1
11
  === 0.3.0 :: 2007-03-29
2
12
 
3
13
  * Fixed glaring security problem with LDAP/AD Authenticator where under some
data/Manifest.txt CHANGED
@@ -4,6 +4,7 @@ Manifest.txt
4
4
  README.txt
5
5
  Rakefile
6
6
  bin/rubycas-server
7
+ bin/rubycas-server-ctl
7
8
  config.example.yml
8
9
  lib/casserver.rb
9
10
  lib/casserver/authenticators/active_directory_ldap.rb
@@ -31,5 +32,6 @@ lib/themes/urbacon/login_box_bg.png
31
32
  lib/themes/urbacon/logo.png
32
33
  lib/themes/urbacon/theme.css
33
34
  lib/themes/warning.png
35
+ resources/init.d.sh
34
36
  setup.rb
35
37
  test/test_casserver.rb
data/Rakefile CHANGED
@@ -20,7 +20,6 @@ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
20
20
 
21
21
  DEPS = [
22
22
  ['camping', '>= 1.5'],
23
- # ['sqlite3-ruby', '>= 1.2.0'],
24
23
  ['activesupport', '>= 1.4.0'],
25
24
  ['activerecord', '>=1.15.3']
26
25
  ]
@@ -56,5 +55,5 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
56
55
 
57
56
  # == Optional
58
57
  p.extra_deps = DEPS
59
- p.spec_extras = {:executables => 'rubycas-server'}
58
+ p.spec_extras = {:executables => ['rubycas-server', 'rubycas-server-ctl']}
60
59
  end
data/bin/rubycas-server CHANGED
@@ -4,10 +4,14 @@ require 'optparse'
4
4
 
5
5
  local_casserver = File.expand_path(File.dirname(File.expand_path(__FILE__))+'/../lib/casserver.rb')
6
6
  if File.exists? local_casserver
7
+ # use local rubycas-server installation
7
8
  $: << File.dirname(local_casserver)
9
+ path = File.dirname(local_casserver)+"/"
8
10
  else
11
+ # use gem installation
12
+ path = ""
9
13
  require 'rubygems'
10
- require_gem 'rubycas-server'
14
+ gem 'rubycas-server'
11
15
  end
12
16
 
13
17
  OptionParser.new do |opts|
@@ -21,14 +25,27 @@ OptionParser.new do |opts|
21
25
  opts.on("-d", "--daemonize", "Run as a daemon (only when using webrick or mongrel)") do |c|
22
26
  $DAEMONIZE = true
23
27
  end
24
-
28
+
29
+ opts.on("-P", "--pid_file FILE", "Use pid file (default is /etc/rubycas-server/rubycas-server.pid)") do |c|
30
+ if $DAEMONIZE && !File.exists?(c)
31
+ puts "Using pid file '#{c}'"
32
+ $PID_FILE = c
33
+ elsif File.exists?(c)
34
+ puts "The pid file already exists. Is rubycas-server running?\n" +
35
+ "You will have to first manually remove the pid file at '#{c}' to start the server as a daemon."
36
+ exit 1
37
+ else
38
+ puts "Not running as Daemon. Ignoring pid option"
39
+ end
40
+ end
41
+
25
42
  opts.on_tail("-h", "--help", "Show this message") do
26
43
  puts opts
27
44
  exit
28
45
  end
29
46
 
30
47
  opts.on_tail("-v", "--version", "Show version number") do
31
- require 'casserver/version'
48
+ require "#{path}casserver/version"
32
49
  puts "rubycas-server-#{CASServer::VERSION::STRING}"
33
50
  exit
34
51
  end
@@ -36,4 +53,4 @@ end.parse!
36
53
 
37
54
  $RUN = true
38
55
 
39
- load 'casserver.rb'
56
+ load "#{path}casserver.rb"
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+
5
+ @options = {}
6
+ @options[:pid_file] = "/etc/rubycas-server/rubycas-server.pid"
7
+ @options[:conf_file] = nil
8
+ @options[:verbose] = false
9
+
10
+ def start
11
+ # use local rubycas-server bin if it exists and is executable -- makes debugging easier
12
+ bin = File.dirname(File.expand_path(__FILE__)) + "/rubycas-server"
13
+
14
+ if File.exists?(bin)
15
+ exec = "ruby #{bin}"
16
+ else
17
+ exec = "rubycas-server"
18
+ end
19
+
20
+ case get_state
21
+ when :ok
22
+ $stderr.puts "rubycas-server is already running"
23
+ exit 1
24
+ when :not_running
25
+ $stderr.puts "The pid file '#{@options[:pid_file]}' exists but rubycas-server is not running." +
26
+ "Please delete the pid file first."
27
+ exit 1
28
+ when :dead
29
+ $stderr.puts "The pid file '#{@options[:pid_file]}' exists but rubycas-server is not running." +
30
+ " Please delete the pid file first."
31
+ exit 1
32
+ when :missing_pid
33
+ # we should be good to go (unless the server is already running without a pid file)
34
+ else
35
+ $stderr.puts "rubycas-server could not be started. Try looking in the log file for more info."
36
+ exit 1
37
+ end
38
+
39
+ cmd = "#{exec} -d -P #{@options[:pid_file]}"
40
+ cmd += " -c #{@options[:conf_file]}" if !@options[:conf_file].nil?
41
+
42
+ puts ">>> #{cmd}" if @options[:verbose]
43
+
44
+ output = `#{cmd}`
45
+
46
+ puts "<<< #{output}" if @options[:verbose]
47
+
48
+ if s = get_state == :ok
49
+ exit 0
50
+ else
51
+ $stderr.puts "rubycas-server could not start properly!\nTry running with the --verbose option for details."
52
+ case s
53
+ when :missing_pid
54
+ exit 4
55
+ when :not_running
56
+ exit 3
57
+ when :dead
58
+ exit 1
59
+ else
60
+ exit 4
61
+ end
62
+ end
63
+ end
64
+
65
+ def stop
66
+ if File.exists? @options[:pid_file]
67
+ pid = open(@options[:pid_file]).read.to_i
68
+ begin
69
+ Process.kill("TERM", pid)
70
+ exit 0
71
+ rescue Errno::ESRCH
72
+ $stderr.puts "rubycas-server process '#{pid}' does not exist."
73
+ exit 1
74
+ end
75
+ else
76
+ $stderr.puts "#{@options[:pid_file]} not found. Is rubycas-server running?"
77
+ exit 4
78
+ end
79
+ end
80
+
81
+ def status
82
+ case get_state
83
+ when :ok
84
+ puts "rubycas-server appears to be up and running."
85
+ exit 0
86
+ when :missing_pid
87
+ $stderr.puts "rubycas-server does not appear to be running (pid file not found)."
88
+ exit 3
89
+ when :empty_pid
90
+ $stderr.puts "rubycas-server does not appear to be running (pid file exists but is empty)."
91
+ when :not_running
92
+ $stderr.puts "rubycas-server is not running."
93
+ exit 1
94
+ when :dead
95
+ $stderr.puts "rubycas-server is dead or unresponsive."
96
+ exit 102
97
+ end
98
+ end
99
+
100
+ def get_state
101
+ if File.exists? @options[:pid_file]
102
+ pid = File.read(@options[:pid_file]).strip
103
+
104
+ return :empty_pid unless pid and !pid.empty? # pid file exists but is empty
105
+
106
+ state = `ps -p #{pid} -o state=`.strip
107
+ if state == ''
108
+ :not_running
109
+ elsif state == 'R' || state == 'S'
110
+ :ok
111
+ else
112
+ :dead
113
+ end
114
+ else
115
+ # TODO: scan through the process table to see if server is running without pid file
116
+ :missing_pid
117
+ end
118
+ end
119
+
120
+ OptionParser.new do |opts|
121
+ opts.banner = "Usage: #{$0} (start|stop|restart) [options]"
122
+ opts.banner += "\nruby-server-ctl is only usable when using webrick or mongrel"
123
+
124
+ opts.on("-c", "--config FILE", "Path to rubycas-server configuration file") { |value| @options[:conf_file] = value }
125
+ opts.on("-P", "--pid_file FILE", "Path to rubycas-server pid file") { |value| @options[:pid_file] = value }
126
+ opts.on('-v', '--verbose', "Print all called commands and output.") { |value| @options[:verbose] = value }
127
+
128
+ if ARGV.empty?
129
+ puts opts
130
+ exit
131
+ else
132
+ @cmd = opts.parse!(ARGV)
133
+ if @cmd.nil?
134
+ puts opts
135
+ exit
136
+ end
137
+ end
138
+ end
139
+
140
+ if !@options[:conf_file].nil? && !File.exists?(@options[:conf_file])
141
+ puts "Invalid path to rubycas-server configuration file: #{@options[:conf_file]}"
142
+ exit
143
+ end
144
+
145
+ case @cmd[0]
146
+ when "start":
147
+ puts "Starting rubycas-server..."
148
+ start
149
+ when "stop":
150
+ puts "Stopping rubycas-server..."
151
+ stop
152
+ when "restart":
153
+ puts "Restarting rubycas-server..."
154
+ stop
155
+ start
156
+ when "status":
157
+ puts "Checking status of rubycas-server..."
158
+ status
159
+ else
160
+ puts "Invalid command. Usage: rubycas-server-ctl [-cPv] start|stop|restart|status"
161
+ end
162
+
163
+ exit
data/config.example.yml CHANGED
@@ -149,16 +149,16 @@ database:
149
149
  # as a hash under :username and :password keys. In the future, this hash
150
150
  # might also contain other data such as the domain that the user is logging in to.
151
151
  #
152
- # To use your custom authenticator, specify it's class name in the authenticator section
153
- # of the config. You will also probably have to load the class using using a `require`
154
- # call at the top of casserver.rb. Any other parameters you specify in the authenticator
155
- # configuration will be passed on to the authenticator and made availabe in the validate()
156
- # method as an @options hash.
152
+ # To use your custom authenticator, specify it's class name and path to the source file
153
+ # in the authenticator section of the config. Any other parameters you specify in the
154
+ # authenticator configuration will be passed on to the authenticator and made availabe in
155
+ # the validate() method as an @options hash.
157
156
  #
158
157
  # Example:
159
158
  #
160
159
  #authenticator:
161
160
  # class: FooModule::MyCustomAuthenticator
161
+ # source: /path/to/source.rb
162
162
  # option_a: foo
163
163
  # another_option: yeeha
164
164
 
@@ -224,4 +224,4 @@ log:
224
224
  # If you would prefer that ticket-granting ticket expiry be enforced (in effect limiting
225
225
  # the maximum length of a session), you can set expire_sessions to true.
226
226
 
227
- # expire_sessions: false
227
+ # expire_sessions: false
data/lib/casserver.rb CHANGED
@@ -8,7 +8,7 @@ $CASSERVER_HOME = File.dirname(File.expand_path(__FILE__))
8
8
  $: << $CASSERVER_HOME
9
9
 
10
10
  require 'rubygems'
11
- require_gem 'camping', '~> 1.5'
11
+ gem 'camping', '~> 1.5'
12
12
  require 'camping'
13
13
 
14
14
  require 'active_support'
@@ -31,9 +31,14 @@ module CASServer
31
31
  module_function :init_logger
32
32
 
33
33
  def init_db_logger
34
- if CASServer::Conf.db_log
35
- CASServer::Models::Base.logger = Logger.new(CASServer::Conf.db_log[:file] || 'casserver_db.log')
36
- CASServer::Models::Base.logger.level = "CASServer::Utils::Logger::#{CASServer::Conf.db_log[:level] || 'DEBUG'}".constantize
34
+ begin
35
+ if CASServer::Conf.db_log
36
+ log_file = CASServer::Conf.db_log[:file] || 'casserver_db.log'
37
+ CASServer::Models::Base.logger = Logger.new(log_file)
38
+ CASServer::Models::Base.logger.level = "CASServer::Utils::Logger::#{CASServer::Conf.db_log[:level] || 'DEBUG'}".constantize
39
+ end
40
+ rescue Errno::EACCES => e
41
+ $LOG.warn "Can't write to database log file at '#{log_file}': #{e}"
37
42
  end
38
43
  end
39
44
  module_function :init_db_logger
@@ -72,11 +77,17 @@ if __FILE__ == $0 || $RUN
72
77
 
73
78
  require 'casserver/postambles'
74
79
  include CASServer::Postambles
75
-
80
+
81
+ if $PID_FILE && (CASServer::Conf.server.to_s != 'mongrel' || CASServer::Conf.server.to_s != 'webrick')
82
+ $LOG.warn("Unable to create a pid file. You must use mongrel or webrick for this feature.")
83
+ end
84
+
76
85
  begin
77
86
  raise NoMethodError if CASServer::Conf.server.nil?
78
87
  send(CASServer::Conf.server)
79
88
  rescue NoMethodError
89
+ # FIXME: this rescue can sometime report the incorrect error messages due to other underlying problems
90
+ # raising a NoMethodError
80
91
  if CASServer::Conf.server
81
92
  raise "The server setting '#{CASServer::Conf.server}' in your config.yml file is invalid."
82
93
  else
@@ -4,7 +4,7 @@ begin
4
4
  require 'net/ldap'
5
5
  rescue LoadError
6
6
  require 'rubygems'
7
- require_gem 'ruby-net-ldap', '~> 0.0.4'
7
+ gem 'ruby-net-ldap', '~> 0.0.4'
8
8
  require 'net/ldap'
9
9
  end
10
10
 
data/lib/casserver/cas.rb CHANGED
@@ -219,6 +219,8 @@ module CASServer::CAS
219
219
  def service_uri_with_ticket(service, st)
220
220
  raise ArgumentError, "Second argument must be a ServiceTicket!" unless st.kind_of? CASServer::Models::ServiceTicket
221
221
 
222
+ # This will choke with a URI::InvalidURIError if service URI is not properly URI-escaped...
223
+ # This exception is handled further upstream (i.e. in the controller).
222
224
  service_uri = URI.parse(service)
223
225
 
224
226
  if service.include? "?"
@@ -47,9 +47,15 @@ begin
47
47
  # attempt to instantiate the authenticator
48
48
  $AUTH = $CONF[:authenticator][:class].constantize.new
49
49
  rescue NameError
50
- # the authenticator class hasn't yet been loaded, so lets try to load it from the casserver/authenticators directory
51
- auth_rb = $CONF[:authenticator][:class].underscore.gsub('cas_server/', '')
52
- require 'casserver/'+auth_rb
50
+ if !$CONF[:authenticator][:source].nil?
51
+ # config.yml explicitly names source file
52
+ require $CONF[:authenticator][:source]
53
+ else
54
+ # the authenticator class hasn't yet been loaded, so lets try to load it from the casserver/authenticators directory
55
+ auth_rb = $CONF[:authenticator][:class].underscore.gsub('cas_server/', '')
56
+ require 'casserver/'+auth_rb
57
+ end
58
+
53
59
  $AUTH = $CONF[:authenticator][:class].constantize.new
54
60
  end
55
61
  rescue
@@ -24,14 +24,19 @@ module CASServer::Controllers
24
24
  end
25
25
 
26
26
  if tgt and !tgt_error
27
- @message = {:type => 'notice', :message => %{You are currently logged in as "#{tgt.username}". If you are not you, please log in below.}}
27
+ @message = {:type => 'notice', :message => %{You are currently logged in as "#{tgt.username}". If this is not you, please log in below.}}
28
28
  end
29
29
 
30
- if @service && !@renew && tgt && !tgt_error
31
- st = generate_service_ticket(@service, tgt.username)
32
- service_with_ticket = service_uri_with_ticket(@service, st)
33
- $LOG.info("User '#{tgt.username}' authenticated based on ticket granting cookie. Redirecting to service '#{@service}'.")
34
- return redirect(service_with_ticket, :status => 303) # response code 303 means "See Other" (see Appendix B in CAS Protocol spec)
30
+ begin
31
+ if @service && !@renew && tgt && !tgt_error
32
+ st = generate_service_ticket(@service, tgt.username)
33
+ service_with_ticket = service_uri_with_ticket(@service, st)
34
+ $LOG.info("User '#{tgt.username}' authenticated based on ticket granting cookie. Redirecting to service '#{@service}'.")
35
+ return redirect(service_with_ticket, :status => 303) # response code 303 means "See Other" (see Appendix B in CAS Protocol spec)
36
+ end
37
+ rescue
38
+ $LOG.error("The service '#{@service}' is not a valid URI!")
39
+ @message = {:type => 'mistake', :message => "The target service your browser supplied appears to be invalid. Please contact your system administrator for help."}
35
40
  end
36
41
 
37
42
  lt = generate_login_ticket
@@ -98,19 +103,24 @@ module CASServer::Controllers
98
103
  if @service.blank?
99
104
  $LOG.info("Successfully authenticated user '#{@username}' at '#{tgt.client_hostname}'. No service param was given, so we will not redirect.")
100
105
  @message = {:type => 'confirmation', :message => "You have successfully logged in."}
101
- render :login
102
106
  else
103
- @st = generate_service_ticket(@service, @username)
104
- service_with_ticket = service_uri_with_ticket(@service, @st)
105
-
106
- $LOG.info("Redirecting authenticated user '#{@username}' at '#{@st.client_hostname}' to service '#{@service}'")
107
- return redirect(service_with_ticket, :status => 303) # response code 303 means "See Other" (see Appendix B in CAS Protocol spec)
107
+ @st = generate_service_ticket(@service, @username)
108
+ begin
109
+ service_with_ticket = service_uri_with_ticket(@service, @st)
110
+
111
+ $LOG.info("Redirecting authenticated user '#{@username}' at '#{@st.client_hostname}' to service '#{@service}'")
112
+ return redirect(service_with_ticket, :status => 303) # response code 303 means "See Other" (see Appendix B in CAS Protocol spec)
113
+ rescue URI::InvalidURIError
114
+ $LOG.error("The service '#{@service}' is not a valid URI!")
115
+ @message = {:type => 'mistake', :message => "The target service your browser supplied appears to be invalid. Please contact your system administrator for help."}
116
+ end
108
117
  end
109
118
  else
110
119
  $LOG.warn("Invalid credentials given for user '#{@username}'")
111
120
  @message = {:type => 'mistake', :message => "Incorrect username or password."}
112
- render :login
113
121
  end
122
+
123
+ render :login
114
124
  end
115
125
  end
116
126
 
@@ -279,4 +289,4 @@ module CASServer::Controllers
279
289
  end
280
290
  end
281
291
  end
282
- end
292
+ end
@@ -47,9 +47,16 @@ module CASServer
47
47
  trap(:INT) do
48
48
  s.shutdown
49
49
  end
50
+ trap(:TERM) do
51
+ s.shutdown
52
+ end
50
53
 
51
54
  if $DAEMONIZE
52
- WEBrick::Daemon.start {s.start}
55
+ WEBrick::Daemon.start do
56
+ write_pid_file if $PID_FILE
57
+ s.start
58
+ clear_pid_file
59
+ end
53
60
  else
54
61
  s.start
55
62
  end
@@ -64,24 +71,35 @@ module CASServer
64
71
  # camping has fixes for mongrel currently only availabe in SVN
65
72
  # ... you can install camping from svn (1.5.180) by running:
66
73
  # gem install camping --source code.whytheluckystiff.net
67
- require_gem 'camping', '~> 1.5.180'
74
+ gem 'camping', '~> 1.5.180'
75
+
76
+ if $DAEMONIZE
77
+ # check if log and pid are writable before daemonizing, otherwise we won't be able to notify
78
+ # the user if we run into trouble later (since once daemonized, we can't write to stdout/stderr)
79
+ check_pid_writable if $PID_FILE
80
+ check_log_writable
81
+ end
68
82
 
69
- CASServer.create
83
+ CASServer.create
70
84
 
71
85
  puts "\n** CASServer is starting. Look in '#{CASServer::Conf.log[:file]}' for further notices."
72
86
 
73
87
  settings = {:host => "0.0.0.0", :log_file => CASServer::Conf.log[:file], :cwd => $CASSERVER_HOME}
74
88
 
75
- # need to close all IOs if we daemonize
76
- $LOG.close
89
+ # need to close all IOs before daemonizing
90
+ $LOG.close if $DAEMONIZE
77
91
 
78
- config = Mongrel::Configurator.new settings do
79
- daemonize :log_file => CASServer::Conf.log[:file], :cwd => $CASSERVER_HOME if $DAEMONIZE
80
-
81
- listener :port => CASServer::Conf.port do
82
- uri CASServer::Conf.uri_path, :handler => Mongrel::Camping::CampingHandler.new(CASServer)
83
- setup_signals
92
+ begin
93
+ config = Mongrel::Configurator.new settings do
94
+ daemonize :log_file => CASServer::Conf.log[:file], :cwd => $CASSERVER_HOME if $DAEMONIZE
95
+
96
+ listener :port => CASServer::Conf.port do
97
+ uri CASServer::Conf.uri_path, :handler => Mongrel::Camping::CampingHandler.new(CASServer)
98
+ setup_signals
99
+ end
84
100
  end
101
+ rescue Errno::EADDRINUSE
102
+ exit 1
85
103
  end
86
104
 
87
105
  config.run
@@ -89,8 +107,19 @@ module CASServer
89
107
  CASServer.init_logger
90
108
  CASServer.init_db_logger
91
109
 
110
+ if $DAEMONIZE && $PID_FILE
111
+ write_pid_file
112
+ unless File.exists? $PID_FILE
113
+ $LOG.error "CASServer could not start because pid file '#{$PID_FILE}' could not be created."
114
+ exit 1
115
+ end
116
+ end
117
+
92
118
  puts "\n** CASServer is running at http://localhost:#{CASServer::Conf.port}#{CASServer::Conf.uri_path} and logging to '#{CASServer::Conf.log[:file]}'"
93
119
  config.join
120
+
121
+ clear_pid_file
122
+
94
123
  puts "\n** CASServer is stopped (#{Time.now})"
95
124
  end
96
125
 
@@ -108,6 +137,41 @@ module CASServer
108
137
  CASServer.create
109
138
  puts CASServer.run
110
139
  end
140
+
141
+ private
142
+ def check_log_writable
143
+ log_file = CASServer::Conf.log['file']
144
+ begin
145
+ f = open(log_file, 'w')
146
+ rescue
147
+ $stderr.puts "Couldn't write to log file at '#{log_file}' (#{$!})."
148
+ exit 1
149
+ end
150
+ f.close
151
+ end
152
+
153
+ def check_pid_writable
154
+ $LOG.debug "Checking if pid file '#{$PID_FILE}' is writable"
155
+ begin
156
+ f = open($PID_FILE, 'w')
157
+ rescue
158
+ $stderr.puts "Couldn't write to log at '#{$PID_FILE}' (#{$!})."
159
+ exit 1
160
+ end
161
+ f.close
162
+ end
163
+
164
+ def write_pid_file
165
+ $LOG.debug "Writing pid '#{Process.pid}' to pid file '#{$PID_FILE}'"
166
+ open($PID_FILE, "w") { |file| file.write(Process.pid) }
167
+ end
168
+
169
+ def clear_pid_file
170
+ if $PID_FILE && File.exists?($PID_FILE)
171
+ $LOG.debug "Clearing pid file '#{$PID_FILE}'"
172
+ File.unlink $PID_FILE
173
+ end
174
+ end
111
175
 
112
176
  end
113
177
  end
@@ -1,7 +1,7 @@
1
1
  module CASServer
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 3
4
+ MINOR = 4
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -0,0 +1,58 @@
1
+ #! /bin/sh
2
+ #
3
+ # Copyright (c) 2007 Urbacon Ltd.
4
+ #
5
+ # System startup script for the RubyCAS-Server
6
+ #
7
+ # Instructions:
8
+ # 1. Rename this file to 'rubycas-server'
9
+ # 2. Copy it to your '/etc/init.d' directory
10
+ # 3. chmod +x /etc/init.d/rubycas-server
11
+ #
12
+ # chkconfig - 85 15
13
+ # description: Provides single-sign-on authentication for web applications.
14
+ #
15
+ ### BEGIN INIT INFO
16
+ # Provides: rubycas-server
17
+ # Required-Start: $syslog
18
+ # Should-Start:
19
+ # Required-Stop: $syslog
20
+ # Should-Stop:
21
+ # Default-Start: 3 5
22
+ # Default-Stop: 0 1 2 6
23
+ # Description: Start the RubyCAS-Server
24
+ ### END INIT INFO
25
+
26
+ CASSERVER_CTL=rubycas-server-ctl
27
+
28
+ # Gracefully exit if the controller is missing.
29
+ which $CASSERVER_CTL > /dev/null || exit 0
30
+
31
+ # Source config
32
+ . /etc/rc.status
33
+
34
+ rc_reset
35
+ case "$1" in
36
+ start)
37
+ $CASSERVER_CTL start
38
+ rc_status -v
39
+ ;;
40
+ stop)
41
+ $CASSERVER_CTL stop
42
+ rc_status -v
43
+ ;;
44
+ restart)
45
+ $0 stop
46
+ $0 start
47
+ rc_status
48
+ ;;
49
+ status)
50
+ $CASSERVER_CTL status
51
+ rc_status -v
52
+ ;;
53
+ *)
54
+ echo "Usage: $0 {start|stop|status|restart}"
55
+ exit 1
56
+ ;;
57
+ esac
58
+ rc_exit
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: rubycas-server
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.0
7
- date: 2007-03-29 00:00:00 -04:00
6
+ version: 0.4.0
7
+ date: 2007-06-04 00:00:00 -04:00
8
8
  summary: Provides single sign on for web applications using the CAS protocol.
9
9
  require_paths:
10
10
  - lib
@@ -35,6 +35,7 @@ files:
35
35
  - README.txt
36
36
  - Rakefile
37
37
  - bin/rubycas-server
38
+ - bin/rubycas-server-ctl
38
39
  - config.example.yml
39
40
  - lib/casserver.rb
40
41
  - lib/casserver/authenticators/active_directory_ldap.rb
@@ -62,6 +63,7 @@ files:
62
63
  - lib/themes/urbacon/logo.png
63
64
  - lib/themes/urbacon/theme.css
64
65
  - lib/themes/warning.png
66
+ - resources/init.d.sh
65
67
  - setup.rb
66
68
  - test/test_casserver.rb
67
69
  test_files:
@@ -73,6 +75,7 @@ extra_rdoc_files: []
73
75
 
74
76
  executables:
75
77
  - rubycas-server
78
+ - rubycas-server-ctl
76
79
  extensions: []
77
80
 
78
81
  requirements: []