rsence 2.0.0.3.pre → 2.0.0.4.pre

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/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.3.pre
1
+ 2.0.0.4.pre
data/js/comm/comm/comm.js CHANGED
@@ -133,6 +133,13 @@ COMM = {
133
133
  if(!_options.onSuccess){
134
134
  _this.onSuccess = function(resp){console.log('No success handler specified, response: ',resp);};
135
135
  }
136
+ if(!_options.on302){
137
+ /** Redirection handler **/
138
+ _this.on503 = function(_this){
139
+ var _retryAfter = parseInt(_this.X.getResponseHeader('Retry-After'),10)*1000,
140
+ _timeout = setTimeout(function(){COMM.request(_this.url,_this.options);},_retryAfter);
141
+ };
142
+ }
136
143
  _this.url = _url;
137
144
  _this.options = _options;
138
145
  _this.X = _comm._XMLHttpRequest();
@@ -181,9 +188,9 @@ if(window['XMLHttpRequest']!==undefined){
181
188
  return new XMLHttpRequest();
182
189
  };
183
190
  }
184
- else if(BROWSER_TYPE.ie){
191
+ else if(window.ActiveXObject){
185
192
  COMM._XMLHttpRequest = function(){
186
- return new ActiveXObject("Msxml2.XMLHTTP");
193
+ return new ActiveXObject("Microsoft.XMLHTTP");
187
194
  };
188
195
  }
189
196
  else {
@@ -30,7 +30,7 @@ COMM.SessionWatcher = HApplication.extend({
30
30
 
31
31
  // gets the HValue represented by
32
32
  // sesTimeoutValueId (:client_time in server)
33
- this.sesTimeoutValue = HVM.values[_sesTimeoutValueId];
33
+ this.sesTimeoutValue = COMM.Values.values[_sesTimeoutValueId];
34
34
  this.timeoutSecs = _timeoutSecs;
35
35
  },
36
36
 
@@ -36,7 +36,12 @@ HButton = HControl.extend({
36
36
  ** +1+:: Disabled, clicked
37
37
  ** +Other+:: Disabled, not clickable, not clicked
38
38
  ***/
39
- HClickValueButton = HButton.extend({
39
+ HClickButton = HButton.extend({
40
+
41
+ defaultEvents: {
42
+ click: true
43
+ },
44
+
40
45
  /** = Description
41
46
  * Sets the button enabled if this.value is 0.
42
47
  *
@@ -55,3 +60,4 @@ HClickValueButton = HButton.extend({
55
60
  }
56
61
  });
57
62
 
63
+ HClickValueButton = HClickButton;
@@ -23,7 +23,7 @@
23
23
  ***/
24
24
  COMM.JSONRenderer = HClass.extend({
25
25
 
26
- version: 0.5,
26
+ version: 0.6,
27
27
 
28
28
  /** = Description
29
29
  * Renders JSON structured data, see some of the demos for usage examples.
@@ -145,6 +145,10 @@ COMM.JSONRenderer = HClass.extend({
145
145
  _hasExtension = _dataNode['extend'] !== undefined,
146
146
  _extension = _hasExtension?_dataNode['extend']:null,
147
147
 
148
+ // JS Extension block
149
+ _hasBind = _dataNode['bind'] !== undefined,
150
+ _bind = _hasBind?_dataNode['bind']:null,
151
+
148
152
  // JS Definition block
149
153
  _hasDefinition = _dataNode['define'] !== undefined,
150
154
  _definitions = _hasDefinition?_dataNode['define']:null,
@@ -155,7 +159,6 @@ COMM.JSONRenderer = HClass.extend({
155
159
  i,
156
160
 
157
161
  _subView;
158
- // console.log('className:',_className,' class:',_class);
159
162
  this.scopeDepth ++;
160
163
  this.scopes.push({});
161
164
  try{
@@ -189,9 +192,14 @@ COMM.JSONRenderer = HClass.extend({
189
192
  _class = _class.extend( _extBlock );
190
193
  }
191
194
  if(_hasOptions){
192
- if(_options['valueObjId'] !== undefined){
193
- var _valueObjId = _options['valueObjId'];
194
- _options['valueObj'] = COMM.Values.values[_options['valueObjId']];
195
+ if(_hasBind){
196
+ _options.valueObj = COMM.Values.values[_bind];
197
+ }
198
+ else{
199
+ if(_options['valueObjId'] !== undefined){
200
+ var _valueObjId = _options['valueObjId'];
201
+ _options['valueObj'] = COMM.Values.values[_options['valueObjId']];
202
+ }
195
203
  }
196
204
  }
197
205
  // For HApplication -derived classes
@@ -202,6 +210,11 @@ COMM.JSONRenderer = HClass.extend({
202
210
  else if(_hasRect){
203
211
  _instance = _class.nu(_rect,_parent,_options);
204
212
  }
213
+ if(!_hasOptions){
214
+ if(_hasBind){
215
+ COMM.Values.values[_bind].bind(_instance);
216
+ }
217
+ }
205
218
  }
206
219
  else if(!(!_class && _hasSubviews)) {
207
220
  console.log('renderNode warning; No such class: '+_className+', node: ',_dataNode);
data/lib/conf/argv.rb CHANGED
@@ -18,10 +18,10 @@ class ARGVParser
18
18
  @@version = File.read( File.join( SERVER_PATH, 'VERSION' ) ).strip
19
19
 
20
20
  if RSence.pid_support?
21
- @@cmds = [ :run, :status, :start, :stop, :restart, :save, :setup,
21
+ @@cmds = [ :run, :status, :start, :stop, :restart, :save,
22
22
  :initenv, :version, :help ]
23
23
  else
24
- @@cmds = [ :run, :setup, :initenv, :version, :help ]
24
+ @@cmds = [ :run, :initenv, :version, :help ]
25
25
  end
26
26
 
27
27
  @@cmd_help = {}
@@ -49,30 +49,6 @@ EOF
49
49
  The [PATH] is the RSence environment to use.
50
50
  The [PATH] defaults to the current working directory.
51
51
 
52
- The expected structure of a project environment (where 'project_directory'
53
- is the directory of your project) is:
54
-
55
- [dir] project_directory :: The directory of your project.
56
- [dir] conf :: The directory of config files.
57
- [file] config.yaml :: The config file to load by defult.
58
- [dir] db :: Directory containing database files.
59
- [dir] log :: Directory containing log files.
60
- [dir] plugins :: Directory containing installed plugins.
61
- [dir] run :: Directory containing runtime pid files.
62
-
63
- The 'config.yaml' file contains patches specific to your project.
64
-
65
- The configuration files are loaded and applied in this order:
66
- 1: [rsence_install_path]/conf/default_conf.yaml
67
- 2: [rsence_install_path]/conf/local_conf.yaml
68
- 3: /etc/rsence/config.yaml
69
- 4: ~/.rsence/config.yaml
70
- 5: [project_directory]/conf/config.yaml
71
- 6: Any files given using --conf parameters, in order of occurrence.
72
-
73
- The plugins directory contains the plugins installed in the project.
74
-
75
- See also the 'setup' and 'initenv' commands.
76
52
  EOF
77
53
 
78
54
  @@cmd_help[:options] = <<-EOF
@@ -100,7 +76,7 @@ Available options:
100
76
  '0.0.0.0' matches all interfaces.
101
77
  '127.0.0.1' matches the local loopback interface.
102
78
 
103
- --server <handler> The Rack handler to use.
79
+ --server <handler> The Rack handler to use. Defaults to mongrel
104
80
 
105
81
  --reset-sessions (-r) Resets all active sessions.
106
82
 
@@ -124,12 +100,69 @@ Available options:
124
100
 
125
101
  EOF
126
102
 
103
+ @@cmd_help[:initenv] = <<-EOF
104
+ usage: 'rsence initenv [options] [PATH]'
105
+
106
+ The 'initenv' command creates a new RSence environment.
107
+
108
+ The expected structure of a project environment (where 'project_directory'
109
+ is the directory of your project) is:
110
+
111
+ [d] project_name : The name of your project.
112
+ [d] conf : The directory of config files.
113
+ [f] config.yaml : The config file to load by defult.
114
+ [d] db : Directory containing database files.
115
+ [d] log : Directory containing log files.
116
+ [d] plugins : Directory containing installed plugins.
117
+ [d] run : Directory containing runtime pid files.
118
+ [f] README : Description of the environment directory.
119
+ [f] VERSION : RSence version the environment was created with
120
+
121
+ The 'config.yaml' file contains patches specific to your project.
122
+
123
+ The configuration files are loaded and applied in this order:
124
+ 1: [rsence_install_path]/conf/default_conf.yaml
125
+ 2: [rsence_install_path]/conf/local_conf.yaml
126
+ 3: /etc/rsence/config.yaml
127
+ 4: ~/.rsence/config.yaml
128
+ 5: [project_directory]/conf/config.yaml
129
+ 6: Any files given using --conf parameters, in order of occurrence.
130
+
131
+ The plugins directory contains the plugins that are run in the project.
132
+
133
+
134
+ Available options:
135
+
136
+ --port <number> The port number the http server listens to.
137
+
138
+ --addr <ip address> The IP address or netmask the http server listens to.
139
+ '0.0.0.0' matches all interfaces.
140
+ '127.0.0.1' matches the local loopback interface.
141
+ Defaults to 0.0.0.0
142
+
143
+ --server <handler> The Rack handler to use. Defaults to mongrel
144
+
145
+ --title <title> The title of the index page.
146
+
147
+ --database <conn_str> Use the Sequel connection string to configure the
148
+ default session database.
149
+
150
+ --uri-prefix <path> Configure RSence to use this http "directory" as
151
+ the prefix. It defaults to the root directory: /
152
+
153
+ --blank Doesn't install the Welcome -plugin.
154
+
155
+ --non-interactive (-q) Doesn't ask anything, just creates the environment
156
+ with the options supplied.
157
+
158
+ For further configuration, edit the config.yaml file.
159
+
160
+ EOF
161
+
127
162
  @@cmd_help[:run] = <<-EOF
128
163
  usage: 'rsence run [options] [PATH]'
129
164
 
130
165
  The 'run' command starts RSence in foreground (no daemon). Exit with CTRL-C.
131
- This is the suggested mode for development and the only mode supported by
132
- Windows, because Windows is missing the concept of a process ID.
133
166
 
134
167
  #{@@cmd_help[:path]}
135
168
  #{@@cmd_help[:options]}
@@ -144,7 +177,7 @@ Use the 'stop' command to stop RSence.
144
177
 
145
178
  Use the 'restart' command to restart RSence in the background.
146
179
 
147
- Use the 'status' command to check if RSence is running.
180
+ Use the 'status' command to see if RSence is running.
148
181
 
149
182
  #{@@cmd_help[:path]}
150
183
  #{@@cmd_help[:options]}
@@ -155,7 +188,7 @@ usage: 'rsence stop [options] [PATH]'
155
188
 
156
189
  The 'stop' command stops RSence running in the background (as a daemon).
157
190
 
158
- Use the 'status' command to check if RSence is running.
191
+ Use the 'status' command to see if RSence is running.
159
192
 
160
193
  #{@@cmd_help[:path]}
161
194
  #{@@cmd_help[:options]}
@@ -169,7 +202,8 @@ If RSence wasn't running before the 'restart' command was issued, the
169
202
  effect is the same as 'start'.
170
203
 
171
204
  Use the 'stop' command to stop RSence.
172
- Use the 'status' command to check if RSence is running.
205
+
206
+ Use the 'status' command to see if RSence is running.
173
207
 
174
208
  #{@@cmd_help[:path]}
175
209
  #{@@cmd_help[:options]}
@@ -228,6 +262,35 @@ usage: 'rsence version'
228
262
 
229
263
  The 'version' command simply outputs the version number of RSence.
230
264
 
265
+ RSence follows the standard four-numbered sequence-based version identification
266
+ scheme. The scheme is defined like: major.minor[.maintenance[.package]][.pre]
267
+
268
+ The major number designates major changes in functionality, sometimes limiting
269
+ backwards compatibility with software written for previous versions.
270
+
271
+ The minor number designates minor changes in functionality, like minor or
272
+ moderate changes in functinality that usually don't impact backwards
273
+ compatibilty of software written for a previous release with the same major
274
+ version.
275
+
276
+ The maintenance number designates bug fixes and other minimal changes to
277
+ the release. In a maintenance number change, no new features are introduced.
278
+
279
+ The package number is a sequence used for the package release. Rubygems
280
+ requires an unique version for each gem released, so pre-releases usually
281
+ occupy the first package numbers of any release.
282
+
283
+ The '.pre' suffix signifies a pre-release, like "Alpha" or "Beta". To
284
+ install a prerelease version, gem requires the '--pre' command line argument.
285
+ Release versions never have the '.pre' suffix. There are usually several
286
+ package number increments of a new release.
287
+
288
+ Version number conventions in written text should include both major and
289
+ minor version numbers prefixed with 'RSence'. The maintennance number
290
+ is usally not mentioned unless an issue is fix or such is discussed.
291
+
292
+ For instance: "RSence 2.0 has undergone some major refactoring since 1.2.1"
293
+
231
294
  EOF
232
295
 
233
296
  @@cmd_help[:tail] = <<-EOF
@@ -396,36 +459,36 @@ EOF
396
459
  @args[:say] = true
397
460
  end
398
461
 
399
- def valid_env?( arg )
462
+ def valid_env?( arg, quiet=false )
400
463
  path = File.expand_path( arg )
401
464
  if not File.exists?( path )
402
- puts "no such directory: #{path.inspect}"
465
+ puts "no such directory: #{path.inspect}" unless quiet
403
466
  return false
404
467
  elsif not File.directory?( path )
405
- puts "not a directory: #{path.inspect}"
468
+ puts "not a directory: #{path.inspect}" unless quiet
406
469
  return false
407
470
  end
408
471
  conf_path = File.join( path, 'conf' )
409
472
  if not File.exists?( conf_path )
410
- puts "no conf directory, expected: #{conf_path.inspect}"
473
+ puts "no conf directory, expected: #{conf_path.inspect}" unless quiet
411
474
  return false
412
475
  elsif not File.directory?( conf_path )
413
- puts "not a conf directory, expected: #{conf_path.inspect}"
476
+ puts "not a conf directory, expected: #{conf_path.inspect}" unless quiet
414
477
  return false
415
478
  end
416
479
  conf_file = File.join( path, 'conf', 'config.yaml' )
417
480
  if not File.exists?(conf_file)
418
- puts "missing conf file, expected: #{conf_file.inspect}"
481
+ puts "missing conf file, expected: #{conf_file.inspect}" unless quiet
419
482
  return false
420
483
  elsif not File.file?( conf_file )
421
- puts "conf file not a file, expected: #{conf_file.inspect}"
484
+ puts "conf file not a file, expected: #{conf_file.inspect}" unless quiet
422
485
  return false
423
486
  end
424
487
  plugin_path = File.join( path, 'plugins' )
425
488
  if not File.exists?( plugin_path )
426
489
  warn "Warning; no plugin directory in project, expected: #{plugin_path.inspect}" if @args[:verbose]
427
490
  elsif not File.directory?( plugin_path )
428
- puts "plugin directory not a directory, expected: #{plugin_path.inspect}"
491
+ puts "plugin directory not a directory, expected: #{plugin_path.inspect}" unless quiet
429
492
  return false
430
493
  end
431
494
  run_path = File.join( path, 'run' )
@@ -466,11 +529,15 @@ EOF
466
529
  def test_port( port, addr='127.0.0.1' )
467
530
  require 'socket'
468
531
  begin
532
+ addr = '127.0.0.1' if addr == '0.0.0.0'
469
533
  sock = TCPsocket.open( addr, port )
470
534
  sock.close
471
535
  return true
472
536
  rescue Errno::ECONNREFUSED
473
537
  return false
538
+ rescue => e
539
+ warn e.inspect
540
+ return false
474
541
  end
475
542
  end
476
543
 
@@ -667,15 +734,35 @@ EOF
667
734
  end
668
735
  end
669
736
 
670
- def parse_setup_argv
671
- throw "parse_setup_argv not implemented!"
737
+ # asks y/n and returns boleans,
738
+ # the default tells if which one is for just enter
739
+ def yesno(default=false)
740
+ if default
741
+ question = "Y/n? "
742
+ else
743
+ question = "y/N? "
744
+ end
745
+ print question
746
+ answer = $stdin.gets.strip.downcase[0]
747
+ answer = answer.chr if answer
748
+ if answer == 'n'
749
+ return false
750
+ elsif answer == 'y'
751
+ return true
752
+ elsif answer == nil
753
+ return default
754
+ else
755
+ return nil
756
+ end
672
757
  end
673
758
 
674
759
  def parse_initenv_argv
675
760
  init_args
676
761
  expect_option = false
677
- option_name = false
678
- valid_env
762
+ option_name = false
763
+ valid_env = false
764
+ interactive = true
765
+ create_blank = false
679
766
  if @argv.length >= 2
680
767
  @argv[1..-1].each_with_index do |arg,i|
681
768
  if expect_option
@@ -701,10 +788,26 @@ EOF
701
788
  elsif arg == '--title'
702
789
  expect_option = true
703
790
  option_name = :title
791
+ elsif arg == '--database'
792
+ expect_option = true
793
+ option_name = :db
794
+ elsif arg == '--uri-prefix'
795
+ expect_option = true
796
+ option_name = :base_url
797
+ elsif arg == '--blank'
798
+ create_blank = true
799
+ elsif arg == '--non-interactive'
800
+ interactive = false
704
801
  else
705
802
  invalid_option(arg)
706
803
  end
707
- elsif valid_env?(arg)
804
+ elsif arg.start_with?('-')
805
+ arg.split('')[1..-1].each do |chr|
806
+ if chr == 'q'
807
+ interactive = false
808
+ end
809
+ end
810
+ else
708
811
  @args[:env_path] = File.expand_path(arg)
709
812
  end
710
813
  end
@@ -715,42 +818,217 @@ EOF
715
818
  exit
716
819
  end
717
820
  end
718
- if valid_env?(@args[:env_path])
719
- conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
720
- @args[:conf_files].push( conf_file ) unless @args[:conf_files].include?( conf_file )
721
- else
722
- puts "invalid environment."
821
+ if valid_env?(@args[:env_path],true)
822
+ puts "Environment already initialized."
723
823
  exit
724
824
  end
825
+ conf_file = File.expand_path( File.join( @args[:env_path], 'conf', 'config.yaml' ) )
826
+ if File.exists?(@args[:env_path])
827
+ if Dir.entries(@args[:env_path]).length > 2 # [ '.', '..' ]
828
+ puts "Environment directory #{@args[:env_path]} is not empty."
829
+ exit
830
+ end
831
+ end
832
+
725
833
  require 'conf/default'
726
- config = Configuration.new(@args).config
727
- port = config[:http_server][:port]
728
- addr = config[:http_server][:bind_address]
729
- port_status = test_port( port, addr )
730
- if RSence.pid_support?
731
- pid_fn = config[:daemon][:pid_fn]
732
- if File.exists?( pid_fn )
733
- pid = File.read( pid_fn ).to_i
734
- pid_status = RSence::SIGComm.wait_signal_response(
735
- pid, pid_fn, 'USR2', 3
736
- )
737
- else
738
- puts "no PID file, unable to check process status" if @args[:verbose]
739
- pid_status = nil
834
+ default_config = Configuration.new(@args,true).config
835
+
836
+ config = {
837
+ :base_url => (@args[:base_url] or default_config[:base_url]),
838
+ :http_server => {
839
+ :port => (@args[:port] or default_config[:http_server][:port]),
840
+ :bind_address => (@args[:addr] or default_config[:http_server][:bind_address]),
841
+ :rack_require => (@args[:server] or default_config[:http_server][:rack_require])
842
+ },
843
+ :index_html => {
844
+ :title => (@args[:title] or default_config[:index_html][:title])
845
+ },
846
+ :database => {
847
+ :ses_db => (@args[:db] or default_config[:database][:ses_db])
848
+ }
849
+ }
850
+ Signal.trap 'INT' do
851
+ puts
852
+ puts "Configuration aborted."
853
+ exit
854
+ end
855
+ if interactive
856
+ answers_ok = false
857
+ until answers_ok
858
+ puts <<-END
859
+
860
+ Creating a new RSence environment at #{@args[:env_path]}
861
+
862
+ RSence will first ask a few questions about your environment
863
+ in order to initialize and prepare the project configuration.
864
+
865
+ You may abort this command at any time by pressing CTRL-C
866
+ Nothing will be written until you have answered all the questions.
867
+
868
+ Pressing the ENTER (or RETURN) key at each prompt will choose the
869
+ default option shown.
870
+ If you are not sure about how to answer a question, press
871
+ the ENTER (or RETURN) key to continue.
872
+
873
+ END
874
+
875
+ require 'highline/import'
876
+
877
+ say <<-END
878
+
879
+ Please enter the title of your project.
880
+ This title will be used in the default page title.
881
+
882
+ END
883
+ config[:index_html][:title] = ask("Project Title") do |q|
884
+ q.default = config[:index_html][:title]
885
+ end
886
+
887
+ say <<-END
888
+
889
+
890
+
891
+ Please specify the connection string for the session database to use.
892
+ By default, a local SQLite database is created in the 'db' subdirectory
893
+ of the environment directory. Any database supported by Sequel is supported
894
+ by RSence.
895
+
896
+ For further information about database connection strings, read the Sequel
897
+ documentation at:
898
+ http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html
899
+
900
+ You will also need the appropriate ruby driver for the database selected. If
901
+ none is installed, RSence will not be able to store persistent session data
902
+ between server restarts.
903
+
904
+ END
905
+ config[:database][:ses_db] = ask("Session database connection string") do |q|
906
+ q.default = config[:database][:ses_db]
907
+ end
908
+ say <<-END
909
+
910
+
911
+
912
+ Please enter a HTTP port for the server to listen to. This port must not be a
913
+ TCP port already in use.
914
+
915
+ END
916
+ config[:http_server][:port] = ask("HTTP Port:") do |q|
917
+ q.default = config[:http_server][:port]
918
+ end
919
+ say <<-END
920
+
921
+
922
+ Please enter a TCP/IP address for the HTTP server to listen to. This address
923
+ must be an address configured by a network interface of this computer.
924
+
925
+ The address 0.0.0.0 matches any interfaces.
926
+ The address 127.0.0.1 matches only the localhost address, this address is
927
+ not accessible from any other computer.
928
+
929
+ END
930
+ config[:http_server][:bind_address] = ask("Interface TCP/IP address:") do |q|
931
+ q.default = config[:http_server][:bind_address]
932
+ end
933
+
934
+ say <<-END
935
+
936
+
937
+ Please enter a root directory for RSence to respond in.
938
+ By default this is the root directory of the server: /
939
+
940
+ END
941
+ config[:base_url] = ask("URI Prefix:") do |q|
942
+ q.default = config[:base_url]
943
+ end
944
+ test_url = "http://#{config[:http_server][:bind_address]}:#{config[:http_server][:port]}#{config[:base_url]}"
945
+ say <<-END
946
+
947
+ Configuration Summary
948
+
949
+ Please verify that the configuration is correct.
950
+ This configuration will be written into the configuration file:
951
+ #{conf_file}
952
+
953
+ Title: #{config[:index_html][:title]}
954
+
955
+ Database: #{config[:database][:ses_db]}
956
+
957
+ HTTP Server:
958
+ Address: #{config[:http_server][:bind_address]}
959
+ Port: #{config[:http_server][:port]}
960
+ URI Prefix: #{config[:base_url]}
961
+
962
+ This means the URL will be #{test_url}
963
+
964
+ END
965
+ print "Is the configuration correct, "
966
+ answers_ok = yesno(true)
740
967
  end
741
968
  else
742
- puts "no PID support, unable to check process status" if @args[:verbose]
743
- pid_status = nil
969
+ test_url = "http://#{config[:http_server][:bind_address]}:#{config[:http_server][:port]}#{config[:base_url]}"
744
970
  end
745
- if RSence.pid_support?
746
- if pid_status == nil
747
- puts "No process id, unable to check process status."
748
- elsif pid_status == false
749
- puts "No process running#{port_status ? ' but something responds on ' : ' and nothing responds on ' }#{addr}:#{port}."
750
- else
751
- puts "Process id #{pid} is running#{port_status ? ' and responds on ' : ', but does not respond on '}#{addr}:#{port}."
752
- end
971
+
972
+ puts "Creating directories..."
973
+ env_dir = @args[:env_path]
974
+ require 'fileutils'
975
+ FileUtils.mkdir_p( env_dir ) unless File.exists?( env_dir )
976
+ conf_dir = File.expand_path( 'conf', env_dir )
977
+ Dir.mkdir( conf_dir )
978
+ db_dir = File.expand_path( 'db', env_dir )
979
+ Dir.mkdir( db_dir )
980
+ log_dir = File.expand_path( 'log', env_dir )
981
+ Dir.mkdir( log_dir )
982
+ plugins_dir = File.expand_path( 'plugins', env_dir )
983
+ Dir.mkdir( plugins_dir )
984
+ run_dir = File.expand_path( 'run', env_dir )
985
+ Dir.mkdir( run_dir )
986
+ unless create_blank
987
+ welcome_plugin_dir = File.join( SERVER_PATH, 'setup', 'welcome' )
988
+ welcome_plugin_dst = File.join( plugins_dir, 'welcome' )
989
+ puts "Installing the welcome plugin. To remove it, just delete this folder:"
990
+ puts " #{welcome_plugin_dst}"
991
+ FileUtils.cp_r( welcome_plugin_dir, welcome_plugin_dst )
753
992
  end
993
+ puts "Creating files..."
994
+ conf_file = File.join( conf_dir, 'config.yaml' )
995
+ File.open( conf_file, 'w' ) {|f| f.write( YAML.dump( config ) ) }
996
+ readme_file = File.join( env_dir, 'README' )
997
+ File.open( readme_file, 'w' ) {|f| f.write( <<-END
998
+ This directory contains a RSence environment titled '#{config[:index_html][:title]}'.
999
+ Visit http://rsence.org/ for further information.
1000
+ END
1001
+ ) }
1002
+ version_file = File.join( env_dir, 'VERSION' )
1003
+ File.open( readme_file, 'w' ) {|f| f.write( "RSence Environment Version #{version.to_f}" ) }
1004
+ puts <<-END
1005
+
1006
+ #{'-='*39}-
1007
+
1008
+ RSence project environment for '#{config[:index_html][:title]}' created.
1009
+
1010
+ You may configure the environment by editing the file:
1011
+
1012
+ #{conf_file}
1013
+
1014
+ If you would like to test this environment now, start the RSence server:
1015
+
1016
+ rsence run #{env_dir}
1017
+
1018
+ Then point your browser to:
1019
+
1020
+ #{test_url}
1021
+
1022
+ The latest documentation and further information is available at the
1023
+ RSence website:
1024
+
1025
+ http://rsence.org/
1026
+
1027
+
1028
+ Congratulations!
1029
+
1030
+ END
1031
+ exit
754
1032
  end
755
1033
 
756
1034
  def help( cmd )
@@ -797,8 +1075,6 @@ EOF
797
1075
  parse_status_argv
798
1076
  elsif cmd == :save
799
1077
  parse_save_argv
800
- elsif cmd == :setup
801
- parse_setup_argv
802
1078
  elsif cmd == :initenv
803
1079
  parse_initenv_argv
804
1080
  end