automate-it 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.hgignore +10 -0
  4. data/.loadpath +5 -0
  5. data/.project +17 -0
  6. data/CHANGES.txt +314 -0
  7. data/Hoe.rake +40 -0
  8. data/Manifest.txt +164 -0
  9. data/README.txt +40 -0
  10. data/Rakefile +256 -0
  11. data/TESTING.txt +57 -0
  12. data/TODO.txt +50 -0
  13. data/TUTORIAL.txt +391 -0
  14. data/automate-it.gemspec +25 -0
  15. data/bin/ai +3 -0
  16. data/bin/aifield +75 -0
  17. data/bin/aissh +93 -0
  18. data/bin/aitag +134 -0
  19. data/bin/automateit +133 -0
  20. data/docs/friendly_errors.txt +50 -0
  21. data/docs/previews.txt +86 -0
  22. data/examples/basic/Rakefile +26 -0
  23. data/examples/basic/config/automateit_env.rb +16 -0
  24. data/examples/basic/config/fields.yml +3 -0
  25. data/examples/basic/config/tags.yml +7 -0
  26. data/examples/basic/dist/README.txt +9 -0
  27. data/examples/basic/dist/myapp_server.erb +30 -0
  28. data/examples/basic/install.log +15 -0
  29. data/examples/basic/lib/README.txt +10 -0
  30. data/examples/basic/recipes/README.txt +4 -0
  31. data/examples/basic/recipes/install.rb +61 -0
  32. data/examples/basic/recipes/uninstall.rb +6 -0
  33. data/gpl.txt +674 -0
  34. data/helpers/cpan_wrapper.pl +220 -0
  35. data/helpers/which.cmd +7 -0
  36. data/lib/automateit.rb +55 -0
  37. data/lib/automateit/account_manager.rb +114 -0
  38. data/lib/automateit/account_manager/base.rb +138 -0
  39. data/lib/automateit/account_manager/etc.rb +128 -0
  40. data/lib/automateit/account_manager/nscd.rb +33 -0
  41. data/lib/automateit/account_manager/passwd_expect.rb +40 -0
  42. data/lib/automateit/account_manager/passwd_pty.rb +69 -0
  43. data/lib/automateit/account_manager/posix.rb +138 -0
  44. data/lib/automateit/address_manager.rb +88 -0
  45. data/lib/automateit/address_manager/base.rb +171 -0
  46. data/lib/automateit/address_manager/bsd.rb +28 -0
  47. data/lib/automateit/address_manager/freebsd.rb +59 -0
  48. data/lib/automateit/address_manager/linux.rb +42 -0
  49. data/lib/automateit/address_manager/openbsd.rb +66 -0
  50. data/lib/automateit/address_manager/portable.rb +37 -0
  51. data/lib/automateit/address_manager/sunos.rb +34 -0
  52. data/lib/automateit/cli.rb +85 -0
  53. data/lib/automateit/common.rb +65 -0
  54. data/lib/automateit/constants.rb +35 -0
  55. data/lib/automateit/download_manager.rb +48 -0
  56. data/lib/automateit/edit_manager.rb +321 -0
  57. data/lib/automateit/error.rb +10 -0
  58. data/lib/automateit/field_manager.rb +103 -0
  59. data/lib/automateit/interpreter.rb +631 -0
  60. data/lib/automateit/package_manager.rb +257 -0
  61. data/lib/automateit/package_manager/apt.rb +27 -0
  62. data/lib/automateit/package_manager/cpan.rb +101 -0
  63. data/lib/automateit/package_manager/dpkg.rb +54 -0
  64. data/lib/automateit/package_manager/egg.rb +64 -0
  65. data/lib/automateit/package_manager/gem.rb +201 -0
  66. data/lib/automateit/package_manager/pear.rb +95 -0
  67. data/lib/automateit/package_manager/pecl.rb +80 -0
  68. data/lib/automateit/package_manager/portage.rb +69 -0
  69. data/lib/automateit/package_manager/yum.rb +65 -0
  70. data/lib/automateit/platform_manager.rb +49 -0
  71. data/lib/automateit/platform_manager/darwin.rb +30 -0
  72. data/lib/automateit/platform_manager/debian.rb +26 -0
  73. data/lib/automateit/platform_manager/freebsd.rb +29 -0
  74. data/lib/automateit/platform_manager/gentoo.rb +26 -0
  75. data/lib/automateit/platform_manager/lsb.rb +44 -0
  76. data/lib/automateit/platform_manager/openbsd.rb +28 -0
  77. data/lib/automateit/platform_manager/struct.rb +80 -0
  78. data/lib/automateit/platform_manager/sunos.rb +39 -0
  79. data/lib/automateit/platform_manager/uname.rb +29 -0
  80. data/lib/automateit/platform_manager/windows.rb +40 -0
  81. data/lib/automateit/plugin.rb +7 -0
  82. data/lib/automateit/plugin/base.rb +32 -0
  83. data/lib/automateit/plugin/driver.rb +256 -0
  84. data/lib/automateit/plugin/manager.rb +224 -0
  85. data/lib/automateit/project.rb +493 -0
  86. data/lib/automateit/root.rb +17 -0
  87. data/lib/automateit/service_manager.rb +93 -0
  88. data/lib/automateit/service_manager/chkconfig.rb +39 -0
  89. data/lib/automateit/service_manager/rc_update.rb +37 -0
  90. data/lib/automateit/service_manager/sysv.rb +139 -0
  91. data/lib/automateit/service_manager/update_rcd.rb +35 -0
  92. data/lib/automateit/shell_manager.rb +316 -0
  93. data/lib/automateit/shell_manager/base_link.rb +67 -0
  94. data/lib/automateit/shell_manager/link.rb +24 -0
  95. data/lib/automateit/shell_manager/portable.rb +523 -0
  96. data/lib/automateit/shell_manager/symlink.rb +32 -0
  97. data/lib/automateit/shell_manager/which_base.rb +30 -0
  98. data/lib/automateit/shell_manager/which_unix.rb +16 -0
  99. data/lib/automateit/shell_manager/which_windows.rb +20 -0
  100. data/lib/automateit/tag_manager.rb +127 -0
  101. data/lib/automateit/tag_manager/struct.rb +121 -0
  102. data/lib/automateit/tag_manager/tag_parser.rb +93 -0
  103. data/lib/automateit/tag_manager/yaml.rb +29 -0
  104. data/lib/automateit/template_manager.rb +56 -0
  105. data/lib/automateit/template_manager/base.rb +181 -0
  106. data/lib/automateit/template_manager/erb.rb +17 -0
  107. data/lib/ext/metaclass.rb +17 -0
  108. data/lib/ext/object.rb +18 -0
  109. data/lib/ext/shell_escape.rb +7 -0
  110. data/lib/hashcache.rb +22 -0
  111. data/lib/helpful_erb.rb +63 -0
  112. data/lib/inactive_support.rb +53 -0
  113. data/lib/inactive_support/basic_object.rb +6 -0
  114. data/lib/inactive_support/clean_logger.rb +127 -0
  115. data/lib/inactive_support/core_ext/array/extract_options.rb +19 -0
  116. data/lib/inactive_support/core_ext/blank.rb +50 -0
  117. data/lib/inactive_support/core_ext/class/attribute_accessors.rb +48 -0
  118. data/lib/inactive_support/core_ext/class/inheritable_attributes.rb +140 -0
  119. data/lib/inactive_support/core_ext/enumerable.rb +63 -0
  120. data/lib/inactive_support/core_ext/hash/keys.rb +54 -0
  121. data/lib/inactive_support/core_ext/module/aliasing.rb +70 -0
  122. data/lib/inactive_support/core_ext/numeric/time.rb +91 -0
  123. data/lib/inactive_support/core_ext/string/inflections.rb +153 -0
  124. data/lib/inactive_support/core_ext/symbol.rb +14 -0
  125. data/lib/inactive_support/core_ext/time/conversions.rb +96 -0
  126. data/lib/inactive_support/duration.rb +96 -0
  127. data/lib/inactive_support/inflections.rb +53 -0
  128. data/lib/inactive_support/inflector.rb +282 -0
  129. data/lib/nested_error.rb +33 -0
  130. data/lib/nitpick.rb +33 -0
  131. data/lib/queued_logger.rb +68 -0
  132. data/lib/tempster.rb +250 -0
  133. data/misc/index_gem_repository.rb +304 -0
  134. data/misc/setup_egg.rb +12 -0
  135. data/misc/setup_gem_dependencies.sh +6 -0
  136. data/misc/setup_rubygems.sh +21 -0
  137. metadata +279 -0
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "automate-it"
3
+ s.version = '0.9.0'
4
+ s.default_executable = "automateit"
5
+ s.license = 'GNU-GPL'
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Igal Koshevoy", "Pavel Novotny"]
9
+ s.date = %q{2013-05-16}
10
+ s.description = %q{AutomateIt is an open source tool for automating the setup and maintenance of servers, applications and their dependencies. This is updated fork.}
11
+ s.email = %q{fandisek@gmail.com}
12
+ s.homepage = %q{http://rubygems.org/gems/better-automateit}
13
+ s.rubygems_version = %q{1.6.2}
14
+ s.summary = %q{Fork of AutomateIt}
15
+ s.bindir = 'bin'
16
+
17
+ s.add_dependency 'hoe'
18
+ s.add_dependency 'open4'
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+
25
+ end
data/bin/ai ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ load File.join(File.dirname(__FILE__), "automateit")
data/bin/aifield ADDED
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # XXX What can go wrong with this loading approach?
4
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
5
+ if File.directory?(libdir) and File.exists?(File.join(libdir, "automateit.rb"))
6
+ $LOAD_PATH.unshift(libdir)
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'optparse'
11
+ require 'automateit'
12
+
13
+ OptionParser.new do |parser|
14
+ PROG = File.basename($0)
15
+ opts = {}
16
+ parser.banner = <<EOB
17
+ #{PROG} - tool for querying AutomateIt fields
18
+
19
+ Usage: #{PROG} [options] query
20
+
21
+ Examples:
22
+ # Load 'myproject' and get value of 'user' field in 'myapp' hash:
23
+ #{PROG} -p myproject myapp#user
24
+
25
+ # Same but using environmental variable to specify project:
26
+ AUTOMATEIT_PROJECT=myproject
27
+ #{PROG} myapp#user
28
+
29
+ # Dump the 'myapp' hash contents as YAML
30
+ #{PROG} -y myapp#user
31
+
32
+ Options:
33
+ EOB
34
+ parser.on("-p", "--project PATH", "Set project path") do |v|
35
+ opts[:project] = v
36
+ end
37
+
38
+ parser.on("-Y", "--yaml", "Dump as YAML") do |v|
39
+ opts[:yaml] = v
40
+ end
41
+
42
+ parser.on("-a", "--add TAGS", "Add list of space separated tags") do |v|
43
+ opts[:tags] = [v.split].flatten
44
+ end
45
+
46
+ parser.on("-v", "--version", "Display version") do |v|
47
+ puts AutomateIt::VERSION
48
+ exit 0
49
+ end
50
+
51
+ parser.on("-h", "--help", "Display this help message") do |v|
52
+ puts parser
53
+ exit
54
+ end
55
+
56
+ args = parser.parse!.dup
57
+
58
+ # Clear ARGV so that IRB doesn't try to parse our options
59
+ opts[:args] = args
60
+ ARGV.clear
61
+
62
+ query = args.first unless args.empty?
63
+
64
+ interpreter = AutomateIt.new(:project => opts[:project])
65
+ result = interpreter.lookup(query)
66
+ if result.nil?
67
+ puts result.inspect
68
+ exit 1
69
+ elsif opts[:yaml]
70
+ puts result.to_yaml
71
+ else
72
+ puts result.is_a?(String) ? result : result.inspect
73
+ end
74
+ exit 0
75
+ end
data/bin/aissh ADDED
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # XXX What can go wrong with this loading approach?
4
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
5
+ if File.directory?(libdir) and File.exists?(File.join(libdir, "automateit.rb"))
6
+ $LOAD_PATH.unshift(libdir)
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'optparse'
11
+ require 'automateit'
12
+ include AutomateIt::Constants
13
+
14
+ OptionParser.new do |parser|
15
+ PROG = File.basename($0)
16
+ opts = {}
17
+ parser.banner = <<EOB
18
+ #{PROG} - tool for running command via SSH on hosts matching AutomateIt tags
19
+
20
+ Usage: #{PROG} [options] [arguments...]
21
+
22
+ IMPORTANT:
23
+ #{PROG} can only match against tags specified in tags.yml. It cannot
24
+ match against automatically generated tags like the OS, architecture and such
25
+ which are created at runtime by PlatformManager or AddressManager. So if you
26
+ want to run a command against all Ubuntu servers, you must define them
27
+ explicitly in tags.yml.
28
+
29
+ Examples:
30
+ # Read tags from project in current directory and run "ls" on all hosts
31
+ # tagged with "apache_servers" or "rails_servers":
32
+ #{PROG} --project . 'apache_servers | rails_servers' ls
33
+
34
+ # Preview SSH commands needed to run "ls" on "apache_servers":
35
+ #{PROG} -p . -n apache_servers ls
36
+
37
+ # Pass arguments to "ls", rather than #{PROG}:
38
+ #{PROG} -p . -n apache_servers -- ls -la
39
+
40
+ # Same as previous but using a quoted string:
41
+ #{PROG} -p . -n apache_servers 'ls -la'
42
+
43
+ # Execute a command which requires the target server to redirect output:
44
+ #{PROG} -p . -n apache_servers 'ps -ef | grep apache'
45
+
46
+ Options:
47
+ EOB
48
+ parser.on("-n", "--preview", "Preview without executing commands") do |v|
49
+ opts[:preview] = v
50
+ end
51
+
52
+ parser.on("-p", "--project PATH", "Set project path") do |v|
53
+ opts[:project] = v
54
+ end
55
+
56
+ parser.on("-q", "--quiet", "Don't display commands executed") do |v|
57
+ opts[:verbosity] = Logger::ERROR
58
+ end
59
+
60
+ parser.on("-v", "--version", "Display version") do |v|
61
+ puts AutomateIt::VERSION
62
+ exit 0
63
+ end
64
+
65
+ parser.on("-h", "--help", "Display this help message") do |v|
66
+ puts parser
67
+ exit
68
+ end
69
+
70
+ args = parser.parse!.dup
71
+ query = args.shift
72
+ commands = args
73
+
74
+ if commands.blank?
75
+ puts parser
76
+ puts "\nERROR: No commands specified"
77
+ exit 1
78
+ end
79
+
80
+ interpreter = AutomateIt.new(
81
+ :project => opts[:project],
82
+ :verbosity => opts[:verbosity]
83
+ )
84
+
85
+ interpreter.preview true if opts[:preview]
86
+
87
+ for host in interpreter.hosts_tagged_with(query).sort
88
+ cmd = "ssh %s %s" % [host, commands.join(" ").shell_escape]
89
+ interpreter.sh(cmd)
90
+ end
91
+
92
+ exit 0
93
+ end
data/bin/aitag ADDED
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # XXX What can go wrong with this loading approach?
4
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
5
+ if File.directory?(libdir) and File.exists?(File.join(libdir, "automateit.rb"))
6
+ $LOAD_PATH.unshift(libdir)
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'optparse'
11
+ require 'automateit'
12
+
13
+ OptionParser.new do |parser|
14
+ PROG = File.basename($0)
15
+ opts = {}
16
+ parser.banner = <<EOB
17
+ #{PROG} - tool for querying AutomateIt tags
18
+
19
+ Usage: #{PROG} [options] [arguments...]
20
+
21
+ IMPORTANT:
22
+ #{PROG} can only match against tags specified in tags.yml. It cannot
23
+ match against automatically generated tags like the OS, architecture and such
24
+ which are created at runtime by PlatformManager or AddressManager. So if you
25
+ want to run a command against all Ubuntu servers, you must define them
26
+ explicitly in tags.yml.
27
+
28
+ Examples:
29
+ # Load 'myproject' and see if it's tagged with 'apache' or 'svn':
30
+ #{PROG} -p myproject 'apache || svn'
31
+ echo $?
32
+
33
+ # Same but using environmental variable to specify project:
34
+ AUTOMATEIT_PROJECT=myproject
35
+ #{PROG} 'apache || svn'
36
+ echo $?
37
+
38
+ # Dump the results of a query as YAML
39
+ #{PROG} -Y myapp#user
40
+
41
+ Options:
42
+ EOB
43
+ parser.on("-s", "--tags", "List tags for this host") do |v|
44
+ opts[:list_tags] = v
45
+ end
46
+
47
+ parser.on("-f", "--tags_for HOST", "List tags for a specific host") do |v|
48
+ opts[:tags_for] = v
49
+ end
50
+
51
+ parser.on("-t", "--tagged? QUERY", "Is this host tagged with the query?") do |v|
52
+ opts[:tagged?] = v
53
+ end
54
+
55
+ parser.on("-w", "--hosts_tagged_with QUERY", "List hosts tagged with query") do |v|
56
+ opts[:hosts_tagged_with] = v
57
+ end
58
+
59
+ parser.on("-p", "--project PATH", "Set project path") do |v|
60
+ opts[:project] = v
61
+ end
62
+
63
+ parser.on("-Y", "--yaml", "Dump as YAML") do |v|
64
+ opts[:yaml] = v
65
+ end
66
+
67
+ parser.on("-a", "--add TAGS", "Add list of space separated tags") do |v|
68
+ opts[:add_tags] = [v.split].flatten
69
+ end
70
+
71
+ parser.on("-v", "--version", "Display version") do |v|
72
+ puts AutomateIt::VERSION
73
+ exit 0
74
+ end
75
+
76
+ parser.on("-h", "--help", "Display this help message") do |v|
77
+ puts parser
78
+ exit
79
+ end
80
+
81
+ args = parser.parse!.dup
82
+
83
+ # Clear ARGV so that IRB doesn't try to parse our options
84
+ opts[:args] = args
85
+ ARGV.clear
86
+
87
+ interpreter = AutomateIt.new(
88
+ :project => opts[:project],
89
+ :tags => opts[:add_tags]
90
+ )
91
+ result = nil
92
+
93
+ unless opts[:list_tags] or opts[:tags_for] or opts[:tagged?] or opts[:hosts_tagged_with]
94
+ if args.first
95
+ opts[:tagged?] = args.first
96
+ else
97
+ puts parser
98
+ puts "\nERROR: insufficient arguments"
99
+ exit 1
100
+ end
101
+ end
102
+
103
+ result = \
104
+ if opts[:list_tags]
105
+ interpreter.tags.to_a.sort
106
+ elsif opts[:tags_for]
107
+ interpreter.tags_for(opts[:tags_for])
108
+ elsif opts[:tagged?]
109
+ exit(interpreter.tagged?(opts[:tagged?]) ? 0 : 1)
110
+ elsif opts[:hosts_tagged_with]
111
+ interpreter.hosts_tagged_with(opts[:hosts_tagged_with])
112
+ end
113
+
114
+ puts(
115
+ if result.nil?
116
+ result.inspect
117
+ elsif opts[:yaml]
118
+ result.to_yaml
119
+ else
120
+ case result
121
+ when String
122
+ result
123
+ when Set
124
+ result.sort.to_a.join(' ')
125
+ when Array
126
+ result.sort.join(' ')
127
+ else
128
+ result.inspect
129
+ end
130
+ end
131
+ )
132
+
133
+ exit 0
134
+ end
data/bin/automateit ADDED
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # XXX What can go wrong with this loading approach?
4
+ libdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
5
+ if File.directory?(libdir) and File.exists?(File.join(libdir, "automateit.rb"))
6
+ $LOAD_PATH.unshift(libdir)
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'logger'
11
+ require 'optparse'
12
+ require 'automateit'
13
+
14
+ include AutomateIt::Constants
15
+
16
+ OptionParser.new do |parser|
17
+ PROG = File.basename($0)
18
+ opts = {}
19
+ parser.banner = <<EOB
20
+ #{PROG} - tool for automating the setup and maintenance of servers
21
+
22
+ Usage: #{PROG} [options] [recipe]
23
+
24
+ Examples:
25
+ # Start an interactive shell session
26
+ #{PROG}
27
+
28
+ # Execute a recipe
29
+ #{PROG} myrecipe.rb
30
+
31
+ # Preview the commands a recipe will run without running them
32
+ #{PROG} -n myrecipe.rb
33
+
34
+ # Eval a string
35
+ #{PROG} -e "puts tags.to_a.inspect"
36
+
37
+ # Add a tag
38
+ #{PROG} -a mytag -e "puts tags.to_a.inspect"
39
+
40
+ # Add tags
41
+ #{PROG} -a 'mytag othertag' -e "puts tags.to_a.inspect"
42
+
43
+ Options:
44
+ EOB
45
+ parser.on("-c", "--create PATH", "Create project at path") do |v|
46
+ opts[:create] = v
47
+ end
48
+
49
+ parser.on("-p", "--project PATH", "Set project path") do |v|
50
+ opts[:project] = v
51
+ end
52
+
53
+ parser.on("-n", "--preview", "Preview without executing commands") do |v|
54
+ opts[:preview] = v
55
+ end
56
+
57
+ parser.on("-e", "--eval STRING", "Evaluate string") do |v|
58
+ opts[:eval] = v
59
+ end
60
+
61
+ parser.on("-a", "--add TAGS", "Add list of space separated tags") do |v|
62
+ opts[:tags] = [v.split].flatten
63
+ end
64
+
65
+ parser.on("-q", "--quiet", "Print only errors") do |v|
66
+ opts[:verbosity] = Logger::ERROR
67
+ end
68
+
69
+ parser.on("-d", "--debug", "Print debugging information") do |v|
70
+ opts[:verbosity] = Logger::DEBUG
71
+ end
72
+
73
+ parser.on("-T", "--trace", "Display raw exception traces") do |v|
74
+ opts[:friendly_exceptions] = ! v
75
+ end
76
+
77
+ parser.on("-v", "--version", "Display version") do |v|
78
+ puts AutomateIt::VERSION
79
+ exit 0
80
+ end
81
+
82
+ parser.on("-h", "--help", "Display this help message") do |v|
83
+ puts parser
84
+ exit
85
+ end
86
+
87
+ args = parser.parse!.dup
88
+
89
+ # Clear ARGV so that IRB doesn't try to parse our options
90
+ opts[:args] = args
91
+ ARGV.clear
92
+
93
+ opts[:recipe] = args.first unless args.empty?
94
+
95
+ # Save vars because +run+ will delete opts
96
+ argscopy = args.clone
97
+ optscopy = opts.clone
98
+
99
+ # Display newline at the end
100
+ newline = true
101
+
102
+ begin
103
+ rv = AutomateIt::CLI.run(opts)
104
+ rescue SystemExit
105
+ # Don't display errors when 'exit' is run
106
+ newline = false
107
+ rescue Exception => e
108
+ msg = nil
109
+ if e.is_a?(AutomateIt::Error) and e.cause.to_s =~ /IRB_EXIT/
110
+ # Don't display errors interpreter is closed with 'CTRL-D'
111
+ elsif opts[:friendly_exceptions] != false and e.is_a?(AutomateIt::Error)
112
+ # Friendly message
113
+ msg = PERROR+e.message
114
+ msg << "\n\n"+PNOTE+"Use 'automateit --trace' to see complete backtrace"
115
+ else
116
+ # Raw backtrace
117
+ puts PERROR+"AutomateIt error trace:"
118
+ stack = e.backtrace.clone
119
+ msg = "#{stack.shift}: #{e.message} (#{e.exception.class})}";
120
+ for line in stack
121
+ msg << "\n "+line
122
+ end
123
+ end
124
+ puts msg
125
+ exit 1
126
+ end
127
+ if optscopy[:create] or optscopy[:eval] or argscopy.size > 0
128
+ exit rv ? 0 :1
129
+ elsif newline
130
+ # CTRL-D ends the line prematurely, so add a newline
131
+ puts
132
+ end
133
+ end