oxidized 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +135 -865
  5. data/docs/Configuration.md +186 -0
  6. data/docs/Hooks.md +143 -0
  7. data/docs/Outputs.md +190 -0
  8. data/docs/Ruby-API.md +115 -0
  9. data/docs/Sources.md +110 -0
  10. data/docs/Supported-OS-Types.md +149 -0
  11. data/docs/VRP-Huawei.md +27 -0
  12. data/extra/oxidized-report-git-commits +21 -40
  13. data/extra/oxidized-ubuntu.haproxy +45 -0
  14. data/extra/oxidized.service +4 -0
  15. data/lib/oxidized/hook.rb +1 -0
  16. data/lib/oxidized/hook/exec.rb +0 -1
  17. data/lib/oxidized/input/ssh.rb +11 -8
  18. data/lib/oxidized/model/acsw.rb +67 -0
  19. data/lib/oxidized/model/aen.rb +20 -0
  20. data/lib/oxidized/model/alteonos.rb +60 -0
  21. data/lib/oxidized/model/asa.rb +53 -18
  22. data/lib/oxidized/model/asyncos.rb +49 -0
  23. data/lib/oxidized/model/audiocodes.rb +32 -0
  24. data/lib/oxidized/model/boss.rb +76 -0
  25. data/lib/oxidized/model/ciscosma.rb +45 -0
  26. data/lib/oxidized/model/ciscosmb.rb +6 -1
  27. data/lib/oxidized/model/coriantgroove.rb +30 -0
  28. data/lib/oxidized/model/dlink.rb +1 -0
  29. data/lib/oxidized/model/enterasys.rb +30 -0
  30. data/lib/oxidized/model/fiberdriver.rb +1 -1
  31. data/lib/oxidized/model/fortios.rb +3 -1
  32. data/lib/oxidized/model/ftos.rb +2 -0
  33. data/lib/oxidized/model/hirschmann.rb +41 -0
  34. data/lib/oxidized/model/hpemsa.rb +13 -0
  35. data/lib/oxidized/model/ios.rb +2 -2
  36. data/lib/oxidized/model/iosxr.rb +1 -0
  37. data/lib/oxidized/model/ipos.rb +7 -1
  38. data/lib/oxidized/model/ironware.rb +4 -1
  39. data/lib/oxidized/model/netgear.rb +12 -4
  40. data/lib/oxidized/model/panos.rb +1 -1
  41. data/lib/oxidized/model/planet.rb +2 -1
  42. data/lib/oxidized/model/powerconnect.rb +5 -0
  43. data/lib/oxidized/model/procurve.rb +13 -0
  44. data/lib/oxidized/model/routeros.rb +12 -5
  45. data/lib/oxidized/model/sgos.rb +46 -0
  46. data/lib/oxidized/model/ucs.rb +31 -0
  47. data/lib/oxidized/model/voss.rb +12 -3
  48. data/lib/oxidized/model/vrp.rb +6 -0
  49. data/lib/oxidized/model/weos.rb +22 -0
  50. data/lib/oxidized/model/xos.rb +4 -0
  51. data/lib/oxidized/node.rb +4 -2
  52. data/lib/oxidized/nodes.rb +1 -0
  53. data/lib/oxidized/version.rb +1 -1
  54. data/lib/oxidized/worker.rb +23 -2
  55. data/oxidized.gemspec +1 -1
  56. metadata +54 -46
@@ -0,0 +1,115 @@
1
+ # Ruby API
2
+
3
+ The following objects exist in Oxidized.
4
+
5
+ ## Input
6
+ * gets config from nodes
7
+ * must implement 'connect', 'get', 'cmd'
8
+ * 'ssh', 'telnet, ftp, and tftp' implemented
9
+
10
+ ## Output
11
+ * stores config
12
+ * must implement 'store' (may implement 'fetch')
13
+ * 'git' and 'file' (store as flat ascii) implemented
14
+
15
+ ## Source
16
+ * gets list of nodes to poll
17
+ * must implement 'load'
18
+ * source can have 'name', 'model', 'group', 'username', 'password', 'input', 'output', 'prompt'
19
+ * name - name of the devices
20
+ * model - model to use ios/junos/xyz, model is loaded dynamically when needed (Also default in config file)
21
+ * input - method to acquire config, loaded dynamically as needed (Also default in config file)
22
+ * output - method to store config, loaded dynamically as needed (Also default in config file)
23
+ * prompt - prompt used for node (Also default in config file, can be specified in model too)
24
+ * 'sql', 'csv' and 'http' (supports any format with single entry per line, like router.db)
25
+
26
+ ## Model
27
+ ### At the top level
28
+ A model may use several methods at the top level in the class. `cfg` is
29
+ executed in input/output/source context. `cmd` is executed within an instance
30
+ of the model.
31
+
32
+ #### `cfg`
33
+ `cfg` may be called with a list of methods (`:ssh`, `:telnet`) and a block with
34
+ zero parameters. Calling `cfg` registers the given access methods and calling
35
+ it at least once is required for a model to work.
36
+
37
+ The block may contain commands to change some behaviour for the given methods
38
+ (e.g. calling `post_login` to disable the pager).
39
+
40
+ #### `cmd`
41
+ Is used to specify commands that should be executed on a model in order to
42
+ gather its configuration. It can be called with:
43
+
44
+ * Just a string
45
+ * A string and a block
46
+ * `:all` and a block
47
+ * `:secret` and a block
48
+
49
+ The block takes a single parameter `cfg` containing the output of the command
50
+ being processed.
51
+
52
+ Calling `cmd` with just a string will emit the output of the command given in
53
+ that string as configuration.
54
+
55
+ Calling `cmd` with a string and a block will pass the output of the given
56
+ command to the block, then emit its return value (that must be a string) as
57
+ configuration.
58
+
59
+ Calling `cmd` with `:all` and a block will pass all command output through this
60
+ block before emitting it. This is useful if some cleanup is required of the
61
+ output of all commands.
62
+
63
+ Calling `cmd` with `:secret` and a block will pass all configuration to the
64
+ given block before emitting it to hide secrets if secret hiding is enabled. The
65
+ block should replace any secrets with `'<hidden>'` and return the resulting
66
+ string.
67
+
68
+ Execution order is `:all`, `:secret`, and lastly the command specific block, if
69
+ given.
70
+
71
+ #### `comment`
72
+ Called with a single string containing the string to prepend for comments in
73
+ emitted configuration for this model.
74
+
75
+ If not specified the default of `'# '` will be used (note the trailing space).
76
+
77
+ #### `prompt`
78
+ Is called with a regular expression that is used to detect when command output
79
+ ends after a command has been executed.
80
+
81
+ If not specified, a default of `/^([\w.@-]+[#>]\s?)$/` is used.
82
+
83
+ #### `expect`
84
+ Called with a regular expression and a block. The block takes two parameters:
85
+ the regular expression, and the data containing the match.
86
+
87
+ The passed data is replaced by the return value of the block.
88
+
89
+ `expect` can be used to, for example, strip escape sequences from output before
90
+ it's further processed.
91
+
92
+ ### At the second level
93
+ The following methods are available:
94
+
95
+ #### `comment`
96
+ Used inside `cmd` invocations. Comments out every line in the passed string and
97
+ returns the result.
98
+
99
+ #### `password`
100
+ Used inside `cfg` invocations to specify the regular expression used to detect
101
+ the password prompt. If not specified, the default of `/^Password/` is used.
102
+
103
+ #### `post_login`
104
+ Used inside `cfg` invocations to specify commands to run once Oxidized has
105
+ logged in to the switch. Takes one argument that is either a block (taking zero
106
+ parameters) or a string containing a command to execute.
107
+
108
+ #### `pre_logout`
109
+ Used to specify commands to run before Oxidized closes the connection to the
110
+ switch. Takes one argument that is either a block (taking zero parameters) or a
111
+ string containing a command to execute.
112
+
113
+ #### `send`
114
+ Usually used inside `expect` or blocks passed to `post_login`/`pre_logout`.
115
+ Takes a single parameter: a string to be sent to the switch.
@@ -0,0 +1,110 @@
1
+ ## Source
2
+
3
+ ### Source: CSV
4
+
5
+ One line per device, colon seperated. If `ip` isn't present, a DNS lookup will be done against `name`. For large installations, setting `ip` will dramatically reduce startup time.
6
+
7
+ ```
8
+ source:
9
+ default: csv
10
+ csv:
11
+ file: /var/lib/oxidized/router.db
12
+ delimiter: !ruby/regexp /:/
13
+ map:
14
+ name: 0
15
+ ip: 1
16
+ model: 2
17
+ username: 3
18
+ password: 4
19
+ vars_map:
20
+ enable: 5
21
+ ```
22
+
23
+ Example csv `/var/lib/oxidized/router.db`:
24
+
25
+ ```
26
+ rtr01.local,192.168.1.1,ios,oxidized,5uP3R53cR3T,T0p53cR3t
27
+ ```
28
+
29
+ ### Source: SQL
30
+ Oxidized uses the `sequel` ruby gem. You can use a variety of databases that aren't explicitly listed. For more information visit https://github.com/jeremyevans/sequel Make sure you have the correct adapter!
31
+ ### Source: MYSQL
32
+
33
+ `sudo apt-get install libmysqlclient-dev`
34
+
35
+ The values correspond to your fields in the DB such that ip, model, etc are field names in the DB
36
+
37
+ ```
38
+ source:
39
+ default: sql
40
+ sql:
41
+ adapter: mysql2
42
+ database: oxidized
43
+ table: nodes
44
+ user: root
45
+ password: rootpass
46
+ map:
47
+ name: ip
48
+ model: model
49
+ username: username
50
+ password: password
51
+ vars_map:
52
+ enable: enable
53
+ ```
54
+
55
+ ### Source: SQLite
56
+
57
+ One row per device, filtered by hostname.
58
+
59
+ ```
60
+ source:
61
+ default: sql
62
+ sql:
63
+ adapter: sqlite
64
+ database: "/var/lib/oxidized/devices.db"
65
+ table: devices
66
+ map:
67
+ name: fqdn
68
+ model: model
69
+ username: username
70
+ password: password
71
+ vars_map:
72
+ enable: enable
73
+ ```
74
+
75
+ ### Source: HTTP
76
+
77
+ One object per device.
78
+
79
+ HTTP Supports basic auth, configure the user and pass you want to use under the http: section.
80
+
81
+ ```
82
+ source:
83
+ default: http
84
+ http:
85
+ url: https://url/api
86
+ scheme: https
87
+ delimiter: !ruby/regexp /:/
88
+ user: username
89
+ pass: password
90
+ map:
91
+ name: hostname
92
+ model: os
93
+ username: username
94
+ password: password
95
+ vars_map:
96
+ enable: enable
97
+ headers:
98
+ X-Auth-Token: 'somerandomstring'
99
+ ```
100
+
101
+ You can also pass `secure: false` if you want to disable ssl certificate verification:
102
+
103
+ ```
104
+ source:
105
+ default: http
106
+ http:
107
+ url: https://url/api
108
+ scheme: https
109
+ secure: false
110
+ ```
@@ -0,0 +1,149 @@
1
+ # Supported OS types
2
+ * Vendor
3
+ * OS model
4
+ * A10 Networks
5
+ * [ACOS](/lib/oxidized/model/acos.rb)
6
+ * Accedian Performance Elements (NIDs)
7
+ * [AEN](/lib/oxidized/model/aen.rb)
8
+ * Alcatel-Lucent
9
+ * [AOS](/lib/oxidized/model/aos.rb)
10
+ * [AOS7](/lib/oxidized/model/aos7.rb)
11
+ * [ISAM](/lib/oxidized/model/isam.rb)
12
+ * [SR OS (Formerly TiMOS)](/lib/oxidized/model/timos.rb)
13
+ * Wireless
14
+ * Alvarion
15
+ * [BreezeACCESS](/lib/oxidized/model/alvarion.rb)
16
+ * APC
17
+ * [AOS](/lib/oxidized/model/apc_aos.rb)
18
+ * Arista
19
+ * [EOS](/lib/oxidized/model/eos.rb)
20
+ * Arris
21
+ * [C4CMTS](/lib/oxidized/model/c4cmts.rb)
22
+ * Aruba
23
+ * [AOSW](/lib/oxidized/model/aosw.rb)
24
+ * AudioCodes
25
+ * [AudioCodes](/lib/oxdized/model/audiocodes.rb)
26
+ * Avaya
27
+ * [VOSS (VSP Operating System Software)](/lib/oxidized/model/voss.rb)
28
+ * [BOSS (Baystack Operating System Software)](/lib/oxidized/model/boss.rb)
29
+ * Brocade
30
+ * [FabricOS](/lib/oxidized/model/fabricos.rb)
31
+ * [Ironware](/lib/oxidized/model/ironware.rb)
32
+ * [NOS (Network Operating System)](/lib/oxidized/model/nos.rb)
33
+ * [Vyatta](/lib/oxidized/model/vyatta.rb)
34
+ * [6910](/lib/oxidized/model/br6910.rb)
35
+ * Casa
36
+ * [Casa](/lib/oxidized/model/casa.rb)
37
+ * Check Point
38
+ * [GaiaOS](/lib/oxidized/model/gaiaos.rb)
39
+ * Ciena
40
+ * [SAOS](/lib/oxidized/model/saos.rb)
41
+ * Cisco
42
+ * [ACSW](/lib/oxidized/model/acsw.rb)
43
+ * [AireOS](/lib/oxidized/model/aireos.rb)
44
+ * [ASA](/lib/oxidized/model/asa.rb)
45
+ * [AsyncOS](/lib/oxidized/model/asyncos.rb)
46
+ * [CatOS](/lib/oxidized/model/catos.rb)
47
+ * [IOS](/lib/oxidized/model/ios.rb)
48
+ * [IOSXR](/lib/oxidized/model/iosxr.rb)
49
+ * [NGA](/lib/oxidized/model/cisconga.rb)
50
+ * [NXOS](/lib/oxidized/model/nxos.rb)
51
+ * [SMA](/lib/oxidized/model/ciscosma.rb)
52
+ * [SMB (Nikola series)](/lib/oxidized/model/ciscosmb.rb)
53
+ * [UCS](/lib/oxidized/model/ucs.rb)
54
+ * Citrix
55
+ * [NetScaler (Virtual Applicance)](/lib/oxidized/model/netscaler.rb)
56
+ * Coriant (former Tellabs)
57
+ * [TMOS (8800)](/lib/oxidized/model/corianttmos.rb)
58
+ * [8600](/lib/oxidized/model/coriant8600.rb)
59
+ * [Groove](/lib/oxidized/model/coriantgroove.rb)
60
+ * Cumulus
61
+ * [Linux](/lib/oxidized/model/cumulus.rb)
62
+ * DataCom
63
+ * [DmSwitch 3000](/lib/oxidized/model/datacom.rb)
64
+ * DCN
65
+ * [DCN](/lib/oxidized/model/ios.rb) - Map this to ios.
66
+ * DELL
67
+ * [PowerConnect](/lib/oxidized/model/powerconnect.rb)
68
+ * [AOSW](/lib/oxidized/model/aosw.rb)
69
+ * D-Link
70
+ * [D-Link](/lib/oxidized/model/dlink.rb)
71
+ * Ericsson/Redback
72
+ * [IPOS (former SEOS)](/lib/oxidized/model/ipos.rb)
73
+ * Extreme Networks
74
+ * [Enterasys](/lib/oxidized/model/enterasys.rb)
75
+ * [WM](/lib/oxidized/model/mtrlrfs.rb)
76
+ * [XOS](/lib/oxidized/model/xos.rb)
77
+ * F5
78
+ * [TMOS](/lib/oxidized/model/tmos.rb)
79
+ * Force10
80
+ * [DNOS](/lib/oxidized/model/dnos.rb)
81
+ * [FTOS](/lib/oxidized/model/ftos.rb)
82
+ * FortiGate
83
+ * [FortiOS](/lib/oxidized/model/fortios.rb)
84
+ * Fujitsu
85
+ * [PRIMERGY Blade switch 1/10Gbe](/lib/oxidized/model/fujitsupy.rb)
86
+ * Hatteras
87
+ * [Hatteras](/lib/oxidized/model/hatteras.rb)
88
+ * Hirschmann
89
+ * [HiOS](/lib/oxidized/model/hirschmann.rb)
90
+ * HP
91
+ * [Comware (HP A-series, H3C, 3Com)](/lib/oxidized/model/comware.rb)
92
+ * [Procurve](/lib/oxidized/model/procurve.rb)
93
+ * [BladeSystem (Onboard Administrator)](/lib/oxidized/model/hpebladesystem.rb)
94
+ * [MSA](/lib/oxidized/model/hpemsa.rb)
95
+ * Huawei
96
+ * [VRP](/lib/oxidized/model/vrp.rb)
97
+ * Juniper
98
+ * [JunOS](/lib/oxidized/model/junos.rb)
99
+ * [ScreenOS (Netscreen)](/lib/oxidized/model/screenos.rb)
100
+ * Mellanox
101
+ * [MLNX-OS](/lib/oxidized/model/mlnxos.rb)
102
+ * [Voltaire](/lib/oxidized/model/voltaire.rb)
103
+ * Mikrotik
104
+ * [RouterOS](/lib/oxidized/model/routeros.rb)
105
+ * Motorola
106
+ * [RFS](/lib/oxidized/model/mtrlrfs.rb)
107
+ * MRV
108
+ * [MasterOS](/lib/oxidized/model/masteros.rb)
109
+ * [FiberDriver](/lib/oxidized/model/fiberdriver.rb)
110
+ * Netgear
111
+ * [Netgear](/lib/oxidized/model/netgear.rb)
112
+ * Netonix
113
+ * [WISP Switch (As Netonix)](/lib/oxidized/model/netonix.rb)
114
+ * Nokia (formerly TiMetra, Alcatel, Alcatel-Lucent)
115
+ * [SR OS (TiMOS)](/lib/oxidized/model/timos.rb)
116
+ * OneAccess
117
+ * [OneOS](/lib/oxidized/model/oneos.rb)
118
+ * Opengear
119
+ * [Opengear](/lib/oxidized/model/opengear.rb)
120
+ * Palo Alto
121
+ * [PANOS](/lib/oxidized/model/panos.rb)
122
+ * [PLANET SG/SGS Switches](/lib/oxidized/model/planet.rb)
123
+ * [pfSense](/lib/oxidized/model/pfsense.rb)
124
+ * Radware
125
+ * [AlteonOS](/lib/oxidized/model/alteonos.rb)
126
+ * Quanta
127
+ * [Quanta / VxWorks 6.6 (1.1.0.8)](/lib/oxidized/model/quantaos.rb)
128
+ * Siklu
129
+ * [EtherHaul](/lib/oxidized/model/siklu.rb)
130
+ * Supermicro
131
+ * [Supermicro](/lib/oxidized/model/supermicro.rb)
132
+ * Symantec
133
+ * [Blue Coat ProxySG / Security Gateway OS (SGOS)](/lib/oxidized/model/sgos.rb)
134
+ * Trango Systems
135
+ * [Trango](/lib/oxidized/model/trango.rb)
136
+ * TPLink
137
+ * [TPLink](/lib/oxidized/model/tplink.rb)
138
+ * Ubiquiti
139
+ * [AirOS](/lib/oxidized/model/airos.rb)
140
+ * [Edgeos](/lib/oxidized/model/edgeos.rb)
141
+ * [EdgeSwitch](/lib/oxidized/model/edgeswitch.rb)
142
+ * Watchguard
143
+ * [Fireware OS](/lib/oxidized/model/firewareos.rb)
144
+ * Westell
145
+ * [Westell 8178G, Westell 8266G](/lib/oxidized/model/weos.rb)
146
+ * Zhone
147
+ * [Zhone (OLT and MX)](/lib/oxidized/model/zhoneolt.rb)
148
+ * Zyxel
149
+ * [ZyNOS](/lib/oxidized/model/zynos.rb)
@@ -0,0 +1,27 @@
1
+ Huawei VRP Configuration
2
+ ========================
3
+
4
+ Create a user with no privileges
5
+
6
+ <HUAWEI> system-view
7
+ [~HUAWEI] aaa
8
+ [~HUAWEI-aaa] local-user oxidized password irreversible-cipher verysecret
9
+ [*HUAWEI-aaa] local-user oxidized level 1
10
+ [*HUAWEI-aaa] local-user oxidized service-type terminal ssh
11
+ [*HUAWEI-aaa] commit
12
+
13
+ The commands Oxidized executes are:
14
+
15
+ 1. screen-length 0 temporary
16
+ 2. display version
17
+ 3. display device
18
+ 4. display current-configuration all
19
+
20
+ Command 2 and 3 can be executed without issues, but 1 and 4 are only available for higher level users. Instead of making Oxidized a read/write user on your device, lower the priviledge-level for commands 1 and 4:
21
+
22
+ <HUAWEI> system-view
23
+ [~HUAWEI] command-privilege level 1 view global display current-configuration all
24
+ [*HUAWEI] command-privilege level 1 view shell screen-length
25
+ [*HUAWEI] commit
26
+
27
+ Oxidized can now retrieve your configuration!
@@ -17,64 +17,45 @@
17
17
  # See the License for the specific language governing permissions and
18
18
  # limitations under the License.
19
19
  #
20
+ # 20170615 - Andre Sencioles <asenci@gmail.com>
21
+ # Removed requirement for Git working directory
22
+ # Check job status
23
+ #
24
+ #
20
25
  # usage: add the following hook to the oxidized config file:
21
26
  #
22
27
  # hooks:
23
28
  # email_output:
24
29
  # type: exec
25
30
  # events: [post_store, node_fail]
26
- # cmd: '/home/oxidized/extra/oxidized-report-git-commits ~/gitdir/ | mail -s "Oxidized updates for ${OX_NODE_NAME}" update-recipient@example.com'
31
+ # cmd: '/home/oxidized/extra/oxidized-report-git-commits | mail -s "Oxidized updates for ${OX_NODE_NAME}" update-recipient@example.com'
27
32
  # async: true
28
33
  # timeout: 120
29
34
  #
30
35
  #
31
- # The script takes a single argument, namely a git working directory name,
32
- # e.g. "~/gitdir/". This is only used as a staging directory and should
33
- # not be set to be the same as the git repo directory.
34
- #
35
36
 
36
- PATH=${PATH}:/usr/local/bin:/usr/local/sbin
37
- export PATH
37
+ echo "Node name: ${OX_NODE_NAME}"
38
+ echo "Group name: ${OX_NODE_GROUP}"
39
+ echo "Job status: ${OX_JOB_STATUS}"
40
+ echo "Job time: ${OX_JOB_TIME}"
38
41
 
39
- gitdir=$1
42
+ if [ "${OX_EVENT}" = "node_fail" ]; then
43
+ echo 'Job failed'
44
+ exit 64
45
+ fi
40
46
 
41
- if [ X${OX_REPO_COMMITREF} = "X" ]; then
42
- echo \$OX_REPO_COMMITREF not set
47
+ if [ -z "${OX_REPO_COMMITREF}" ]; then
48
+ echo '$OX_REPO_COMMITREF not set'
43
49
  exit 64
44
50
  fi
45
51
 
46
- if [ X${OX_REPO_NAME} = "X" ]; then
47
- echo \$OX_REPO_NAME not set
52
+ if [ -z "${OX_REPO_NAME}" ]; then
53
+ echo '$OX_REPO_NAME not set'
48
54
  exit 64
49
55
  fi
50
56
 
51
- if [ ! -d ${gitdir}/.git ]; then
52
- git clone -q ${OX_REPO_NAME} ${gitdir}
53
-
54
- ret=$?
55
- if [ X"${ret}" != X0 ] && [ X"${ret}" != X1 ]; then
56
- echo git clone failed: aborting.
57
- exit 128
58
- fi
59
- fi
60
-
61
- cd ${gitdir}
62
-
63
- git pull -q > /dev/null 2>&1
64
- ret=$?
65
- if [ X"${ret}" != X0 ] && [ X"${ret}" != X1 ]; then
66
- echo git pull failed: aborting.
67
- exit 128
68
- fi
69
-
70
- # Git is probably working at this stage, so safe to emit more info
71
-
72
- echo "Node name: ${OX_NODE_NAME}"
73
- echo "Group Name: ${OX_NODE_GROUP}"
74
- echo "Job Time: ${OX_JOB_TIME}"
75
- echo "Git Commit ID: ${OX_REPO_COMMITREF}"
76
- echo "Git Repo: ${OX_REPO_NAME}"
77
- echo "Local working dir: ${gitdir}"
57
+ echo "Git repo: ${OX_REPO_NAME}"
58
+ echo "Git commit ID: ${OX_REPO_COMMITREF}"
78
59
  echo ""
79
60
 
80
- git diff --no-color ${OX_REPO_COMMITREF}~1..${OX_REPO_COMMITREF}
61
+ git --bare --git-dir="${OX_REPO_NAME}" show --pretty='' --no-color "${OX_REPO_COMMITREF}"