risu 1.5.3 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.ci +1 -0
- data/LICENSE +1 -1
- data/NEWS.markdown +80 -3
- data/README.markdown +9 -8
- data/Rakefile +7 -7
- data/bin/risu +1 -1
- data/lib/risu.rb +6 -3
- data/lib/risu/base.rb +2 -1
- data/lib/risu/base/schema.rb +8 -4
- data/lib/risu/base/template_base.rb +3 -1
- data/lib/risu/base/template_helper.rb +115 -0
- data/lib/risu/base/template_manager.rb +1 -1
- data/lib/risu/base/templater.rb +3 -4
- data/lib/risu/cli.rb +1 -1
- data/lib/risu/cli/application.rb +3 -10
- data/lib/risu/cli/banner.rb +1 -1
- data/lib/risu/exceptions.rb +1 -1
- data/lib/risu/exceptions/invaliddocument.rb +1 -1
- data/lib/risu/models.rb +1 -1
- data/lib/risu/models/familyselection.rb +1 -1
- data/lib/risu/models/host.rb +92 -9
- data/lib/risu/models/individualpluginselection.rb +1 -1
- data/lib/risu/models/item.rb +47 -13
- data/lib/risu/models/patch.rb +1 -1
- data/lib/risu/models/plugin.rb +9 -1
- data/lib/risu/models/pluginspreference.rb +1 -1
- data/lib/risu/models/policy.rb +1 -1
- data/lib/risu/models/reference.rb +69 -9
- data/lib/risu/models/report.rb +1 -1
- data/lib/risu/models/serverpreference.rb +1 -1
- data/lib/risu/models/servicedescription.rb +1 -1
- data/lib/risu/models/version.rb +1 -1
- data/lib/risu/parsers.rb +1 -1
- data/lib/risu/parsers/nessus/nessus_document.rb +1 -1
- data/lib/risu/parsers/nessus/nessus_sax_listener.rb +69 -50
- data/lib/risu/parsers/nexpose/nexpose_document.rb +2 -5
- data/lib/risu/parsers/nexpose/simple_nexpose.rb +1 -1
- data/lib/risu/renderers.rb +1 -1
- data/lib/risu/renderers/nilrenderer.rb +1 -1
- data/lib/risu/templates/assets.rb +17 -29
- data/lib/risu/templates/cover_sheet.rb +40 -44
- data/lib/risu/templates/exec_summary.rb +11 -20
- data/lib/risu/templates/{executive_summary.rb → executive_summary_detailed.rb} +2 -11
- data/lib/risu/templates/finding_statistics.rb +1 -1
- data/lib/risu/templates/findings_host.rb +1 -1
- data/lib/risu/templates/findings_summary.rb +25 -86
- data/lib/risu/templates/findings_summary_with_pluginid.rb +1 -1
- data/lib/risu/templates/graphs.rb +1 -1
- data/lib/risu/templates/host_summary.rb +18 -14
- data/lib/risu/templates/ms_patch_summary.rb +17 -24
- data/lib/risu/templates/ms_update_summary.rb +1 -1
- data/lib/risu/templates/ms_wsus_findings.rb +1 -1
- data/lib/risu/templates/notable.rb +10 -14
- data/lib/risu/templates/notable_detailed.rb +43 -54
- data/lib/risu/templates/pci_compliance.rb +28 -34
- data/lib/risu/templates/stig_findings_summary.rb +25 -38
- data/lib/risu/templates/technical_findings.rb +46 -55
- data/lib/risu/templates/template.rb +4 -3
- data/risu.gemspec +12 -11
- metadata +79 -61
data/Gemfile.ci
CHANGED
data/LICENSE
CHANGED
data/NEWS.markdown
CHANGED
@@ -1,5 +1,82 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
# 1.6 (2013)
|
4
|
+
***Official support for Ruby versions less than 1.9.3 has been dropped due to Rails 4***
|
5
|
+
|
6
|
+
- Changed all copyright to Arxopia LLC. instead of myself for legal protection, **Nothing changes** the project will always be open source and free (as in cost)
|
7
|
+
- Fixed several missing requires for Sqlite3 and Rails
|
8
|
+
- Default template font size is now 10pt
|
9
|
+
- Added TemplateHelper mixin for templates to use. The goal is to abstract Prawn in-line code out of the templates over the next few releases to allow for dynamic output to different formats.Currently it adds the following methods to each template it is included in:
|
10
|
+
- report_title(title, newline=false) #font size 24 + bold + center
|
11
|
+
- report_subtitle(title, newline=false) #font size 18 + bold + center
|
12
|
+
- report_author(author, newline=false) #font size 24 + bold + center
|
13
|
+
- report_classification(classification=Report.classification.upcase, newline=true)
|
14
|
+
- report_text(text, options={})
|
15
|
+
- heading1 #font size 24 + bold
|
16
|
+
- heading2 #font size 18 + bold
|
17
|
+
- heading3 #font size 14 + bold
|
18
|
+
- heading4 #font size 12 + bold
|
19
|
+
- heading5 #font size 10 + bold
|
20
|
+
- heading6 #font size 8 + bold
|
21
|
+
- Models
|
22
|
+
- Reference Model
|
23
|
+
- Added methods
|
24
|
+
- reference_string #Returns a full string of all the references
|
25
|
+
- reference_string_by(type) #Returns a string of all the references by type, Where type is the output of a Reference.type(ex. Reference.cve)
|
26
|
+
- Host Model
|
27
|
+
- Added methods
|
28
|
+
- ip_list #Generates a list of hosts from the database, returns a string \n delimited
|
29
|
+
- unsupported_os? #Checks to see if there was any unsupported OS in the scan
|
30
|
+
- os_windows_8
|
31
|
+
- not_os_windows_8
|
32
|
+
- os_windows_2k12
|
33
|
+
- not_is_windows_2k12
|
34
|
+
- Changed the wording `other_os_graph_text` to indicate that its just a percentage of the non windows computers
|
35
|
+
- Added 'bios_uuid' Property
|
36
|
+
- Reference Model
|
37
|
+
- Added cert-cc,
|
38
|
+
- Added apple-sa
|
39
|
+
- Added icsa
|
40
|
+
- Added msvr
|
41
|
+
- Plugin Model
|
42
|
+
- cvss_base_score is now a float in the schema, this change should be transparent
|
43
|
+
- When assigning to it, the value is converted to a float and when retrieving it, it is converted to a string.
|
44
|
+
- Item Model
|
45
|
+
- Added methods
|
46
|
+
- medium_risks_by_host
|
47
|
+
- low_risks_by_host
|
48
|
+
- plugin
|
49
|
+
- Rewrote the notable_order_by_cvss_raw
|
50
|
+
- Schema Changes
|
51
|
+
- Added owner and visibility to the Policy Table
|
52
|
+
- Added traceroute_hop_0-2 to the Host Properties
|
53
|
+
- Templates
|
54
|
+
- notable
|
55
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
56
|
+
- notable_detailed
|
57
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
58
|
+
- the new reference helpers
|
59
|
+
- host names are now show with ip addresses
|
60
|
+
- technical_findings
|
61
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
62
|
+
- new reference helpers
|
63
|
+
- also fixed a bug with a trailing blank page
|
64
|
+
- host names are now show with ip addresses
|
65
|
+
- findings_summary
|
66
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
67
|
+
- simplified the repeated code
|
68
|
+
- ms_patch_summary
|
69
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
70
|
+
- pci_compliance
|
71
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
72
|
+
- template
|
73
|
+
- cleaned up and updated to use the TemplateHelper mixin
|
74
|
+
- Wiki Pages
|
75
|
+
- New page for installing on [Fedora](https://github.com/arxopia/risu/wiki/Fedora-Installation-Guide)
|
76
|
+
- New page for installing on [CentOS](https://github.com/arxopia/risu/wiki/CentOS-Installation-Guide)
|
77
|
+
- New page for installing on [Gentoo](https://github.com/arxopia/risu/wiki/Gentoo-Installation-Guide)
|
78
|
+
- New page for installing on [ArchLinux](https://github.com/arxopia/risu/wiki/Arch-Linux-Install-Guide)
|
79
|
+
|
3
80
|
#1.5.3 (August 29, 2012)
|
4
81
|
- New Parsed Tags
|
5
82
|
- cm_compliance_info
|
@@ -137,14 +214,14 @@
|
|
137
214
|
- Fixed a bug on the exec_summary_detailed detailed report
|
138
215
|
- A quick reference for Microsoft findings can now be found in the Patch model,
|
139
216
|
You are able to get host_id, name(patch name, ie MS01-001), value (plugin_id)
|
140
|
-
- Please report any missing tags that risu outputs to
|
217
|
+
- Please report any missing tags that risu outputs to risu[@]arxopia[.]com, I expect a ton of Microsoft Patch tags missing
|
141
218
|
|
142
219
|
#1.4.8 (August 21, 2011)
|
143
220
|
- Fixed a gemspec dependency error reported by mlpotgieter
|
144
221
|
- Fixed a parser error related to Microsoft Bulletins report by stevelodin
|
145
222
|
- Added a Table for all host related patches, currently only has Microsoft Bulletins
|
146
223
|
You can access it via `Host.first.patches` or `Patch.all`
|
147
|
-
- Please report any missing tags that risu outputs to
|
224
|
+
- Please report any missing tags that risu outputs to risu[@]arxopia[.]com, I expect a ton of Microsoft Patch tags missing
|
148
225
|
|
149
226
|
#1.4.7 (August 13, 2011)
|
150
227
|
- Fixed issue #39 Ruby 1.8.7 Syntax error reported by mlpotgieter
|
@@ -177,7 +254,7 @@ You can access it via `Host.first.patches` or `Patch.all`
|
|
177
254
|
|
178
255
|
#1.4.3 (May 23, 2011)
|
179
256
|
|
180
|
-
**This is the last release under the NessusDB name, I received a legal notice to change the name. They gave me a few weeks to change the name but I do not have a new name yet. If you have any suggestions please submit them to
|
257
|
+
**This is the last release under the NessusDB name, I received a legal notice to change the name. They gave me a few weeks to change the name but I do not have a new name yet. If you have any suggestions please submit them to risu[@]arxopia[.]com**
|
181
258
|
|
182
259
|
- Fixed small bug in Windows/Other OS graphs
|
183
260
|
- Increased the verboseness of Error messages Ticket #29
|
data/README.markdown
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
Risu is [Nessus](http://www.nessus.org) parser, that converts the generated reports into a [ActiveRecord](http://api.rubyonrails.org/classes/ActiveRecord/Base.html) database, this allows for easy report generation and vulnerability verification.
|
4
4
|
|
5
|
-
Version **1.
|
5
|
+
Version **1.6.0** is the current release.
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
9
9
|
### Ruby
|
10
|
-
Risu has been tested with ruby-1.
|
10
|
+
Risu has been tested with ruby-1.9.3-p392 and ruby-2.0.0-p0. Please try to use one of these versions if possible. I recommend using RVM to setup your ruby environment you can get it [here](https://rvm.beginrescueend.com/).
|
11
11
|
|
12
12
|
### RubyGems
|
13
13
|
Risu relies heavily on [RubyGems](http://rubygems.org/) to install other dependencies I highly recommend using it. RubyGems is included by default in the 1.9.x versions of [Ruby](http://ruby-lang.org/).
|
@@ -20,12 +20,13 @@ Risu relies heavily on [RubyGems](http://rubygems.org/) to install other depende
|
|
20
20
|
- gruff
|
21
21
|
- prawn
|
22
22
|
- mysql2
|
23
|
+
- nokogiri
|
23
24
|
|
24
25
|
## Developmental Requirements
|
25
26
|
|
26
27
|
These are all available through [RubyGems](http://rubygems.org/). The should be installed automatically when you install risu, If not this command will install them all:
|
27
28
|
|
28
|
-
% gem install rmagick gruff prawn yard mysql2 libxml-ruby rails sqlite3 logger yaml
|
29
|
+
% gem install rmagick gruff prawn yard mysql2 libxml-ruby rails sqlite3 logger yaml nokogiri
|
29
30
|
|
30
31
|
**You my need sudo/root access depending on your system setup**
|
31
32
|
|
@@ -74,9 +75,9 @@ Using the risu Console is just like using Rails. You can access all of the Activ
|
|
74
75
|
|_| |_|___/\__,_|
|
75
76
|
|
76
77
|
|
77
|
-
risu Console v1.
|
78
|
+
risu Console v1.6.0
|
78
79
|
>> Host.first
|
79
|
-
=> #<Risu::Models::Host id: 1, report_id: 1, name: "10.69.69.74", os: "Linux Kernel 2.6 on Debian 4.0 (etch)", mac: "XX:XX:XX:XX:XX:XX", start: "2011-04-20 16:29:37", end: "2011-04-20 16:32:14", ip: "10.69.69.74", fqdn: "redada.
|
80
|
+
=> #<Risu::Models::Host id: 1, report_id: 1, name: "10.69.69.74", os: "Linux Kernel 2.6 on Debian 4.0 (etch)", mac: "XX:XX:XX:XX:XX:XX", start: "2011-04-20 16:29:37", end: "2011-04-20 16:32:14", ip: "10.69.69.74", fqdn: "redada.arxopia.net", netbios: "REDADA", local_checks_proto: nil, smb_login_used: nil, ssh_auth_meth: nil, ssh_login_used: nil, pci_dss_compliance: nil, notes: nil>
|
80
81
|
|
81
82
|
## Templates
|
82
83
|
Several templates are included:
|
@@ -107,12 +108,12 @@ Several templates are included:
|
|
107
108
|
The templates are written in ruby using [prawn](http://prawn.majesticseacreature.com/), they are fairly easy to make. I will add any templates as requested. See the 'template' example for creating your own template.
|
108
109
|
|
109
110
|
# Contributing
|
110
|
-
If you would like to contribute templates/bug fixes/etc to risu. The easiest way is to fork the project on [github](http://github.com/
|
111
|
+
If you would like to contribute templates/bug fixes/etc to risu. The easiest way is to fork the project on [github](http://github.com/arxopia/risu) and make the changes in your fork and the submit a pull request to the project.
|
111
112
|
|
112
113
|
# Issues
|
113
|
-
If you have any problems, bugs or feature requests please use the [github issue tracker](http://github.com/
|
114
|
+
If you have any problems, bugs or feature requests please use the [github issue tracker](http://github.com/arxopia/risu/issues).
|
114
115
|
|
115
116
|
# Contact
|
116
|
-
You can reach me at
|
117
|
+
You can reach me at risu[at]arxopia[dot]com.
|
117
118
|
|
118
119
|
You can also contact me on IRC as hammackj on irc.freenode.net, #risu
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -32,7 +32,7 @@ require 'rake'
|
|
32
32
|
require 'rake/testtask'
|
33
33
|
|
34
34
|
task :build do
|
35
|
-
|
35
|
+
system "gem build #{Risu::APP_NAME}.gemspec"
|
36
36
|
end
|
37
37
|
|
38
38
|
task :tag_and_bag do
|
@@ -41,8 +41,8 @@ task :tag_and_bag do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
task :release => [:tag_and_bag, :build] do
|
44
|
-
|
45
|
-
puts "Just released #{Risu::APP_NAME} v#{Risu::VERSION}. #{Risu::APP_NAME} is an Nessus XML parser/database. More information at http://
|
44
|
+
system "gem push #{Risu::APP_NAME}-#{Risu::VERSION}.gem"
|
45
|
+
puts "Just released #{Risu::APP_NAME} v#{Risu::VERSION}. #{Risu::APP_NAME} is an Nessus XML parser/database. More information at http://arxopia.com/projects/risu/"
|
46
46
|
end
|
47
47
|
|
48
48
|
task :clean do
|
@@ -65,13 +65,13 @@ end
|
|
65
65
|
|
66
66
|
Rake::TestTask.new("run_tests") do |t|
|
67
67
|
t.libs << "test"
|
68
|
-
|
69
|
-
|
68
|
+
t.pattern = 'test/*/*_test.rb'
|
69
|
+
t.verbose = true
|
70
70
|
end
|
71
71
|
|
72
72
|
task :merge do
|
73
73
|
system "git checkout master"
|
74
|
-
system "
|
74
|
+
system "git merge #{Risu::VERSION}"
|
75
75
|
system "git push"
|
76
76
|
end
|
77
77
|
|
data/bin/risu
CHANGED
data/lib/risu.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -26,13 +26,14 @@
|
|
26
26
|
|
27
27
|
module Risu
|
28
28
|
APP_NAME = "risu"
|
29
|
-
VERSION = "1.
|
29
|
+
VERSION = "1.6.0"
|
30
30
|
GRAPH_WIDTH = 750
|
31
|
-
EMAIL = "
|
31
|
+
EMAIL = "risu@arxopia.com"
|
32
32
|
CONFIG_FILE = "./risu.cfg"
|
33
33
|
USER_TEMPLATES_DIR = "~/.risu/templates/"
|
34
34
|
end
|
35
35
|
|
36
|
+
require 'rails'
|
36
37
|
require 'active_record'
|
37
38
|
require "active_support"
|
38
39
|
require 'libxml'
|
@@ -45,6 +46,8 @@ require 'prawn/layout'
|
|
45
46
|
require 'stringio'
|
46
47
|
require 'mysql2'
|
47
48
|
require 'irb'
|
49
|
+
require 'sqlite3'
|
50
|
+
require 'nokogiri'
|
48
51
|
|
49
52
|
require 'optparse'
|
50
53
|
|
data/lib/risu/base.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -32,3 +32,4 @@ end
|
|
32
32
|
require 'risu/base/template_base'
|
33
33
|
require 'risu/base/template_manager'
|
34
34
|
require 'risu/base/templater'
|
35
|
+
require 'risu/base/template_helper'
|
data/lib/risu/base/schema.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -28,15 +28,15 @@ module Risu
|
|
28
28
|
module Base
|
29
29
|
|
30
30
|
# Risu database Schema
|
31
|
-
#
|
32
31
|
class Schema < ActiveRecord::Migration
|
33
32
|
|
34
33
|
# Creates all of the database tables required by the parser
|
35
|
-
#
|
36
34
|
def self.up
|
37
35
|
create_table :policies do |t|
|
38
36
|
t.string :name
|
39
37
|
t.string :comments
|
38
|
+
t.string :owner
|
39
|
+
t.string :visibility
|
40
40
|
end
|
41
41
|
|
42
42
|
create_table :server_preferences do |t|
|
@@ -101,6 +101,10 @@ module Risu
|
|
101
101
|
t.string :pcidss_www_sql_injection
|
102
102
|
t.string :pcidss_backup_files
|
103
103
|
t.string :system_type
|
104
|
+
t.string :bios_uuid
|
105
|
+
t.string :traceroute_hop_0
|
106
|
+
t.string :traceroute_hop_1
|
107
|
+
t.string :traceroute_hop_2
|
104
108
|
t.text :notes
|
105
109
|
end
|
106
110
|
|
@@ -133,7 +137,7 @@ module Risu
|
|
133
137
|
t.datetime :plugin_modification_date
|
134
138
|
t.datetime :vuln_publication_date
|
135
139
|
t.string :cvss_vector
|
136
|
-
t.
|
140
|
+
t.float :cvss_base_score
|
137
141
|
t.string :cvss_temporal_score
|
138
142
|
t.string :cvss_temporal_vector
|
139
143
|
t.string :exploitability_ease
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2010-
|
1
|
+
# Copyright (c) 2010-2013 Arxopia LLC.
|
2
2
|
# All rights reserved.
|
3
3
|
#
|
4
4
|
# Redistribution and use in source and binary forms, with or without
|
@@ -30,6 +30,8 @@ module Risu
|
|
30
30
|
# Base template class, all report templates must be a subclass of this.
|
31
31
|
#
|
32
32
|
class TemplateBase
|
33
|
+
attr_accessor :output
|
34
|
+
|
33
35
|
@possible_templates = []
|
34
36
|
|
35
37
|
class << self
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# Copyright (c) 2012 Arxopia LLC.
|
2
|
+
# All rights reserved.
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# * Redistributions of source code must retain the above copyright
|
8
|
+
# notice, this list of conditions and the following disclaimer.
|
9
|
+
# * Redistributions in binary form must reproduce the above copyright
|
10
|
+
# notice, this list of conditions and the following disclaimer in the
|
11
|
+
# documentation and/or other materials provided with the distribution.
|
12
|
+
# * Neither the name of the Arxopia LLC nor the names of its contributors
|
13
|
+
# may be used to endorse or promote products derived from this software
|
14
|
+
# without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
# DISCLAIMED. IN NO EVENT SHALL ARXOPIA LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
|
20
|
+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
21
|
+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
22
|
+
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
24
|
+
#OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
25
|
+
#OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
|
27
|
+
module Risu
|
28
|
+
module Templates
|
29
|
+
module TemplateHelper
|
30
|
+
|
31
|
+
#
|
32
|
+
def report_classification classification=Report.classification.upcase, newline=true
|
33
|
+
@output.font_size(12) do
|
34
|
+
@output.text classification, :align => :center
|
35
|
+
@output.text "\n" if newline
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
def report_title title, newline=false
|
41
|
+
@output.font_size(24) do
|
42
|
+
@output.text title, :align => :center
|
43
|
+
@output.text "\n" if newline
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
def report_subtitle title, newline=false
|
49
|
+
@output.font_size(18) do
|
50
|
+
@output.text title, :align => :center
|
51
|
+
@output.text "\n" if newline
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
def report_author author, newline=false
|
57
|
+
@output.font_size(14) do
|
58
|
+
@output.text author, :align => :center
|
59
|
+
@output.text "\n" if newline
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
def text(text, options = {})
|
65
|
+
if text == nil
|
66
|
+
text = ""
|
67
|
+
end
|
68
|
+
|
69
|
+
@output.text text, options
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
def heading1 title
|
74
|
+
@output.font_size(24) do
|
75
|
+
@output.text title, :style => :bold
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
def heading2 title
|
81
|
+
@output.font_size(18) do
|
82
|
+
@output.text title, :style => :bold
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
def heading3 title
|
88
|
+
@output.font_size(14) do
|
89
|
+
@output.text title, :style => :bold
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
def heading4 title
|
95
|
+
@output.font_size(12) do
|
96
|
+
@output.text title, :style => :bold
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
def heading5 title
|
102
|
+
@output.font_size(10) do
|
103
|
+
@output.text title, :style => :bold
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
#
|
108
|
+
def heading6 title
|
109
|
+
@output.font_size(8) do
|
110
|
+
@output.text title, :style => :bold
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|