tprov-api 0.0.6

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 69ad26bf0c629f363258b0b5be8a0fb90974d90a
4
+ data.tar.gz: 7ad5433c6e0e3dce78273e90982dcedaa58c10a8
5
+ SHA512:
6
+ metadata.gz: 047178a752dbe25cd79e9caeec031947e7f539275e1ce070582613da3b4227551f0191413ca5c201685780f016af989262199d12ac6700971c858b0425b3038b
7
+ data.tar.gz: cf904ae07ddc7449d094cf718d9c26b068c49b26819beb58651943a2c8628e7f3cba464a4959acc0d4b062a8dde63b51c4220678ec0d7fe499b58acec6b05566
@@ -0,0 +1,5 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ db/statum.db
5
+ config/config.yml
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+ gem "sinatra"
3
+ gem "sinatra-static-assets"
4
+ gem "emk-sinatra-url-for"
5
+ gem "sinatra-flash"
6
+ gem "sinatra-redirect-with-flash"
7
+ gem "docker-api", :require => "docker"
8
+ gem "redis"
@@ -0,0 +1,39 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ archive-tar-minitar (0.5.2)
5
+ docker-api (1.5.4)
6
+ archive-tar-minitar
7
+ excon (>= 0.22.0)
8
+ json
9
+ emk-sinatra-url-for (0.2.1)
10
+ sinatra (>= 0.9.1.1)
11
+ excon (0.31.0)
12
+ json (1.8.1)
13
+ rack (1.5.2)
14
+ rack-protection (1.5.0)
15
+ rack
16
+ redis (3.0.4)
17
+ sinatra (1.4.3)
18
+ rack (~> 1.4)
19
+ rack-protection (~> 1.4)
20
+ tilt (~> 1.3, >= 1.3.4)
21
+ sinatra-flash (0.3.0)
22
+ sinatra (>= 1.0.0)
23
+ sinatra-redirect-with-flash (0.2.0)
24
+ sinatra (>= 1.0.0)
25
+ sinatra-static-assets (1.0.4)
26
+ sinatra (>= 1.1.0)
27
+ tilt (1.4.1)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ docker-api
34
+ emk-sinatra-url-for
35
+ redis
36
+ sinatra
37
+ sinatra-flash
38
+ sinatra-redirect-with-flash
39
+ sinatra-static-assets
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 James Turnbull, james@lovedthanlost.net
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ # TProv
2
+
3
+ **TProv** or the Tomcat Provisioner is a
4
+ [Sinatra](http://www.sinatrarb.com) app that demonstrates how to build
5
+ a simple PAAS with Docker. It allows you to provision Tomcat
6
+ applications running in Docker containers.
7
+
8
+ ## Running standalone
9
+
10
+ Simply run the ``bundle`` and then ``rackup`` commands.
11
+
12
+ ## Bundling as a gem
13
+
14
+ gem build tprov.gemspec
15
+ sudo gem install tprov-0.0.1.gem
@@ -0,0 +1,30 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
2
+
3
+ require 'rubygems'
4
+ require 'rspec/core/rake_task'
5
+ require 'bundler/gem_tasks'
6
+ require 'rubygems'
7
+ require 'sinatra'
8
+ require 'tprov'
9
+
10
+ task :default => :help
11
+
12
+ desc "Run specs"
13
+ task :spec do
14
+ RSpec::Core::RakeTask.new(:spec) do |t|
15
+ t.pattern = './spec/**/*_spec.rb'
16
+ end
17
+ end
18
+
19
+ desc "Run IRB console with app environment"
20
+ task :console do
21
+ puts "Loading development console..."
22
+ system("irb -r ./lib/wprov.rb")
23
+ end
24
+
25
+ desc "Show help menu"
26
+ task :help do
27
+ puts "Available rake tasks: "
28
+ puts "rake console - Run a IRB console with all enviroment loaded"
29
+ puts "rake spec - Run specs and calculate coverage"
30
+ end
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", "lib")))
4
+
5
+ require 'rubygems'
6
+ require 'optparse'
7
+ require 'tprov-api'
8
+ require 'version'
9
+
10
+ options = {}
11
+
12
+ optparse = OptionParser.new do |opts|
13
+ opts.banner = "Usage: TProv API [options] ..."
14
+
15
+ opts.separator ''
16
+ opts.separator "Configuration options:"
17
+
18
+ opts.on_tail( "-v", "--version", "Show version") do
19
+ puts "TProv API version #{TProvAPI::VERSION}"
20
+ exit
21
+ end
22
+
23
+ opts.separator ""
24
+ opts.separator "Common options:"
25
+
26
+ opts.on_tail("-h", "--help", "Display this screen" ) do
27
+ puts opts
28
+ exit
29
+ end
30
+ end
31
+
32
+ begin
33
+ optparse.parse!
34
+ TProvAPI::Application.run!
35
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption, OptionParser::MissingArgument
36
+ puts $!.to_s
37
+ puts optparse
38
+ exit
39
+ end
@@ -0,0 +1,6 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
2
+
3
+ require 'rubygems'
4
+ require 'tprov'
5
+
6
+ run TProv::Application
@@ -0,0 +1,2 @@
1
+ require "version"
2
+ require "tprov-api/app"
@@ -0,0 +1,100 @@
1
+ $: << File.dirname(__FILE__)
2
+
3
+ require 'sinatra/base'
4
+ require 'sinatra/url_for'
5
+ require 'sinatra/static_assets'
6
+ require 'sinatra/flash'
7
+ require 'sinatra/redirect_with_flash'
8
+ require 'json'
9
+ require 'uri'
10
+ require 'docker'
11
+ require 'pp'
12
+
13
+ module TProvAPI
14
+ class Application < Sinatra::Base
15
+
16
+ register Sinatra::StaticAssets
17
+ register Sinatra::Flash
18
+ helpers Sinatra::RedirectWithFlash
19
+
20
+ set :public_folder, File.join(File.dirname(__FILE__), 'public')
21
+ set :views, File.join(File.dirname(__FILE__), 'views')
22
+ set :bind, '0.0.0.0'
23
+
24
+ Docker.url = ENV['DOCKER_URL'] || 'https://localhost:2375'
25
+ Docker.options = {
26
+ :ssl_verify_peer => false
27
+ }
28
+
29
+ enable :sessions, :logging, :dump_errors, :raise_errors, :show_exceptions
30
+
31
+ before do
32
+ @app_name = "TProv API"
33
+ end
34
+
35
+ get '/' do
36
+ erb :index
37
+ end
38
+
39
+ post '/tomcat/create' do
40
+ if params[:name].empty? or params[:url].empty?
41
+ redirect '/', :error => "You must specify a name and a URL."
42
+ end
43
+ success, output = get_war(params[:name], params[:url])
44
+ unless success
45
+ redirect '/', :error => "Tomcat application #{params[:name]} failed to be fetched because #{output}."
46
+ end
47
+ success, output = create_instance(params[:name])
48
+ unless success
49
+ redirect '/', :error => "Tomcat application #{params[:name]} failed to be created because #{output}."
50
+ end
51
+ redirect '/', :success => "Tomcat Application #{params[:name]} created!"
52
+ end
53
+
54
+ post '/tomcat/delete' do
55
+ success, output = delete_instance(params[:id])
56
+ unless success
57
+ redirect '/', :error => "Tomcat application #{params[:name]} failed to be deleted because #{output}."
58
+ end
59
+ redirect '/', :success => "Instance #{params[:id]} deleted!"
60
+ end
61
+
62
+ get '/tomcat/list' do
63
+ @instances = list_instances
64
+ erb :instance_list
65
+ end
66
+
67
+ helpers do
68
+ def get_war(name, url)
69
+ container = Docker::Container.create('Cmd' => url, 'Image' => 'jamtur01/fetcher', 'name' => name)
70
+ container.start
71
+ container.id
72
+ end
73
+
74
+ def create_instance(name)
75
+ container = Docker::Container.create('Image' => 'jamtur01/tomcat7')
76
+ container.start('PublishAllPorts' => true, 'VolumesFrom' => name)
77
+ container.id
78
+ end
79
+
80
+ def delete_instance(cid)
81
+ container = Docker::Container.get(cid)
82
+ container.kill
83
+ end
84
+
85
+ def list_instances
86
+ @list = {}
87
+ instance_ids = Docker::Container.all
88
+ instance_ids.each { |id|
89
+ container = Docker::Container.get(id.id)
90
+ config = container.json
91
+ if config['NetworkSettings']['Ports']['8080/tcp']
92
+ @list[id] = { 'hostname' => config['Config']['Hostname'], 'ip' => config['NetworkSettings']['IPAddress'], 'port' => config['NetworkSettings']['Ports']['8080/tcp'][0]['HostPort'] }
93
+ end
94
+ }
95
+ @list
96
+ end
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,815 @@
1
+ /*!
2
+ * Bootstrap Responsive v2.0.4
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+
11
+ .clearfix {
12
+ *zoom: 1;
13
+ }
14
+
15
+ .clearfix:before,
16
+ .clearfix:after {
17
+ display: table;
18
+ content: "";
19
+ }
20
+
21
+ .clearfix:after {
22
+ clear: both;
23
+ }
24
+
25
+ .hide-text {
26
+ font: 0/0 a;
27
+ color: transparent;
28
+ text-shadow: none;
29
+ background-color: transparent;
30
+ border: 0;
31
+ }
32
+
33
+ .input-block-level {
34
+ display: block;
35
+ width: 100%;
36
+ min-height: 28px;
37
+ -webkit-box-sizing: border-box;
38
+ -moz-box-sizing: border-box;
39
+ -ms-box-sizing: border-box;
40
+ box-sizing: border-box;
41
+ }
42
+
43
+ .hidden {
44
+ display: none;
45
+ visibility: hidden;
46
+ }
47
+
48
+ .visible-phone {
49
+ display: none !important;
50
+ }
51
+
52
+ .visible-tablet {
53
+ display: none !important;
54
+ }
55
+
56
+ .hidden-desktop {
57
+ display: none !important;
58
+ }
59
+
60
+ @media (max-width: 767px) {
61
+ .visible-phone {
62
+ display: inherit !important;
63
+ }
64
+ .hidden-phone {
65
+ display: none !important;
66
+ }
67
+ .hidden-desktop {
68
+ display: inherit !important;
69
+ }
70
+ .visible-desktop {
71
+ display: none !important;
72
+ }
73
+ }
74
+
75
+ @media (min-width: 768px) and (max-width: 979px) {
76
+ .visible-tablet {
77
+ display: inherit !important;
78
+ }
79
+ .hidden-tablet {
80
+ display: none !important;
81
+ }
82
+ .hidden-desktop {
83
+ display: inherit !important;
84
+ }
85
+ .visible-desktop {
86
+ display: none !important ;
87
+ }
88
+ }
89
+
90
+ @media (max-width: 480px) {
91
+ .nav-collapse {
92
+ -webkit-transform: translate3d(0, 0, 0);
93
+ }
94
+ .page-header h1 small {
95
+ display: block;
96
+ line-height: 18px;
97
+ }
98
+ input[type="checkbox"],
99
+ input[type="radio"] {
100
+ border: 1px solid #ccc;
101
+ }
102
+ .form-horizontal .control-group > label {
103
+ float: none;
104
+ width: auto;
105
+ padding-top: 0;
106
+ text-align: left;
107
+ }
108
+ .form-horizontal .controls {
109
+ margin-left: 0;
110
+ }
111
+ .form-horizontal .control-list {
112
+ padding-top: 0;
113
+ }
114
+ .form-horizontal .form-actions {
115
+ padding-right: 10px;
116
+ padding-left: 10px;
117
+ }
118
+ .modal {
119
+ position: absolute;
120
+ top: 10px;
121
+ right: 10px;
122
+ left: 10px;
123
+ width: auto;
124
+ margin: 0;
125
+ }
126
+ .modal.fade.in {
127
+ top: auto;
128
+ }
129
+ .modal-header .close {
130
+ padding: 10px;
131
+ margin: -10px;
132
+ }
133
+ .carousel-caption {
134
+ position: static;
135
+ }
136
+ }
137
+
138
+ @media (max-width: 767px) {
139
+ body {
140
+ padding-right: 20px;
141
+ padding-left: 20px;
142
+ }
143
+ .navbar-fixed-top,
144
+ .navbar-fixed-bottom {
145
+ margin-right: -20px;
146
+ margin-left: -20px;
147
+ }
148
+ .container-fluid {
149
+ padding: 0;
150
+ }
151
+ .dl-horizontal dt {
152
+ float: none;
153
+ width: auto;
154
+ clear: none;
155
+ text-align: left;
156
+ }
157
+ .dl-horizontal dd {
158
+ margin-left: 0;
159
+ }
160
+ .container {
161
+ width: auto;
162
+ }
163
+ .row-fluid {
164
+ width: 100%;
165
+ }
166
+ .row,
167
+ .thumbnails {
168
+ margin-left: 0;
169
+ }
170
+ [class*="span"],
171
+ .row-fluid [class*="span"] {
172
+ display: block;
173
+ float: none;
174
+ width: auto;
175
+ margin-left: 0;
176
+ }
177
+ .input-large,
178
+ .input-xlarge,
179
+ .input-xxlarge,
180
+ input[class*="span"],
181
+ select[class*="span"],
182
+ textarea[class*="span"],
183
+ .uneditable-input {
184
+ display: block;
185
+ width: 100%;
186
+ min-height: 28px;
187
+ -webkit-box-sizing: border-box;
188
+ -moz-box-sizing: border-box;
189
+ -ms-box-sizing: border-box;
190
+ box-sizing: border-box;
191
+ }
192
+ .input-prepend input,
193
+ .input-append input,
194
+ .input-prepend input[class*="span"],
195
+ .input-append input[class*="span"] {
196
+ display: inline-block;
197
+ width: auto;
198
+ }
199
+ }
200
+
201
+ @media (min-width: 768px) and (max-width: 979px) {
202
+ .row {
203
+ margin-left: -20px;
204
+ *zoom: 1;
205
+ }
206
+ .row:before,
207
+ .row:after {
208
+ display: table;
209
+ content: "";
210
+ }
211
+ .row:after {
212
+ clear: both;
213
+ }
214
+ [class*="span"] {
215
+ float: left;
216
+ margin-left: 20px;
217
+ }
218
+ .container,
219
+ .navbar-fixed-top .container,
220
+ .navbar-fixed-bottom .container {
221
+ width: 724px;
222
+ }
223
+ .span12 {
224
+ width: 724px;
225
+ }
226
+ .span11 {
227
+ width: 662px;
228
+ }
229
+ .span10 {
230
+ width: 600px;
231
+ }
232
+ .span9 {
233
+ width: 538px;
234
+ }
235
+ .span8 {
236
+ width: 476px;
237
+ }
238
+ .span7 {
239
+ width: 414px;
240
+ }
241
+ .span6 {
242
+ width: 352px;
243
+ }
244
+ .span5 {
245
+ width: 290px;
246
+ }
247
+ .span4 {
248
+ width: 228px;
249
+ }
250
+ .span3 {
251
+ width: 166px;
252
+ }
253
+ .span2 {
254
+ width: 104px;
255
+ }
256
+ .span1 {
257
+ width: 42px;
258
+ }
259
+ .offset12 {
260
+ margin-left: 764px;
261
+ }
262
+ .offset11 {
263
+ margin-left: 702px;
264
+ }
265
+ .offset10 {
266
+ margin-left: 640px;
267
+ }
268
+ .offset9 {
269
+ margin-left: 578px;
270
+ }
271
+ .offset8 {
272
+ margin-left: 516px;
273
+ }
274
+ .offset7 {
275
+ margin-left: 454px;
276
+ }
277
+ .offset6 {
278
+ margin-left: 392px;
279
+ }
280
+ .offset5 {
281
+ margin-left: 330px;
282
+ }
283
+ .offset4 {
284
+ margin-left: 268px;
285
+ }
286
+ .offset3 {
287
+ margin-left: 206px;
288
+ }
289
+ .offset2 {
290
+ margin-left: 144px;
291
+ }
292
+ .offset1 {
293
+ margin-left: 82px;
294
+ }
295
+ .row-fluid {
296
+ width: 100%;
297
+ *zoom: 1;
298
+ }
299
+ .row-fluid:before,
300
+ .row-fluid:after {
301
+ display: table;
302
+ content: "";
303
+ }
304
+ .row-fluid:after {
305
+ clear: both;
306
+ }
307
+ .row-fluid [class*="span"] {
308
+ display: block;
309
+ float: left;
310
+ width: 100%;
311
+ min-height: 28px;
312
+ margin-left: 2.762430939%;
313
+ *margin-left: 2.709239449638298%;
314
+ -webkit-box-sizing: border-box;
315
+ -moz-box-sizing: border-box;
316
+ -ms-box-sizing: border-box;
317
+ box-sizing: border-box;
318
+ }
319
+ .row-fluid [class*="span"]:first-child {
320
+ margin-left: 0;
321
+ }
322
+ .row-fluid .span12 {
323
+ width: 99.999999993%;
324
+ *width: 99.9468085036383%;
325
+ }
326
+ .row-fluid .span11 {
327
+ width: 91.436464082%;
328
+ *width: 91.38327259263829%;
329
+ }
330
+ .row-fluid .span10 {
331
+ width: 82.87292817100001%;
332
+ *width: 82.8197366816383%;
333
+ }
334
+ .row-fluid .span9 {
335
+ width: 74.30939226%;
336
+ *width: 74.25620077063829%;
337
+ }
338
+ .row-fluid .span8 {
339
+ width: 65.74585634900001%;
340
+ *width: 65.6926648596383%;
341
+ }
342
+ .row-fluid .span7 {
343
+ width: 57.182320438000005%;
344
+ *width: 57.129128948638304%;
345
+ }
346
+ .row-fluid .span6 {
347
+ width: 48.618784527%;
348
+ *width: 48.5655930376383%;
349
+ }
350
+ .row-fluid .span5 {
351
+ width: 40.055248616%;
352
+ *width: 40.0020571266383%;
353
+ }
354
+ .row-fluid .span4 {
355
+ width: 31.491712705%;
356
+ *width: 31.4385212156383%;
357
+ }
358
+ .row-fluid .span3 {
359
+ width: 22.928176794%;
360
+ *width: 22.874985304638297%;
361
+ }
362
+ .row-fluid .span2 {
363
+ width: 14.364640883%;
364
+ *width: 14.311449393638298%;
365
+ }
366
+ .row-fluid .span1 {
367
+ width: 5.801104972%;
368
+ *width: 5.747913482638298%;
369
+ }
370
+ input,
371
+ textarea,
372
+ .uneditable-input {
373
+ margin-left: 0;
374
+ }
375
+ input.span12,
376
+ textarea.span12,
377
+ .uneditable-input.span12 {
378
+ width: 714px;
379
+ }
380
+ input.span11,
381
+ textarea.span11,
382
+ .uneditable-input.span11 {
383
+ width: 652px;
384
+ }
385
+ input.span10,
386
+ textarea.span10,
387
+ .uneditable-input.span10 {
388
+ width: 590px;
389
+ }
390
+ input.span9,
391
+ textarea.span9,
392
+ .uneditable-input.span9 {
393
+ width: 528px;
394
+ }
395
+ input.span8,
396
+ textarea.span8,
397
+ .uneditable-input.span8 {
398
+ width: 466px;
399
+ }
400
+ input.span7,
401
+ textarea.span7,
402
+ .uneditable-input.span7 {
403
+ width: 404px;
404
+ }
405
+ input.span6,
406
+ textarea.span6,
407
+ .uneditable-input.span6 {
408
+ width: 342px;
409
+ }
410
+ input.span5,
411
+ textarea.span5,
412
+ .uneditable-input.span5 {
413
+ width: 280px;
414
+ }
415
+ input.span4,
416
+ textarea.span4,
417
+ .uneditable-input.span4 {
418
+ width: 218px;
419
+ }
420
+ input.span3,
421
+ textarea.span3,
422
+ .uneditable-input.span3 {
423
+ width: 156px;
424
+ }
425
+ input.span2,
426
+ textarea.span2,
427
+ .uneditable-input.span2 {
428
+ width: 94px;
429
+ }
430
+ input.span1,
431
+ textarea.span1,
432
+ .uneditable-input.span1 {
433
+ width: 32px;
434
+ }
435
+ }
436
+
437
+ @media (min-width: 1200px) {
438
+ .row {
439
+ margin-left: -30px;
440
+ *zoom: 1;
441
+ }
442
+ .row:before,
443
+ .row:after {
444
+ display: table;
445
+ content: "";
446
+ }
447
+ .row:after {
448
+ clear: both;
449
+ }
450
+ [class*="span"] {
451
+ float: left;
452
+ margin-left: 30px;
453
+ }
454
+ .container,
455
+ .navbar-fixed-top .container,
456
+ .navbar-fixed-bottom .container {
457
+ width: 1170px;
458
+ }
459
+ .span12 {
460
+ width: 1170px;
461
+ }
462
+ .span11 {
463
+ width: 1070px;
464
+ }
465
+ .span10 {
466
+ width: 970px;
467
+ }
468
+ .span9 {
469
+ width: 870px;
470
+ }
471
+ .span8 {
472
+ width: 770px;
473
+ }
474
+ .span7 {
475
+ width: 670px;
476
+ }
477
+ .span6 {
478
+ width: 570px;
479
+ }
480
+ .span5 {
481
+ width: 470px;
482
+ }
483
+ .span4 {
484
+ width: 370px;
485
+ }
486
+ .span3 {
487
+ width: 270px;
488
+ }
489
+ .span2 {
490
+ width: 170px;
491
+ }
492
+ .span1 {
493
+ width: 70px;
494
+ }
495
+ .offset12 {
496
+ margin-left: 1230px;
497
+ }
498
+ .offset11 {
499
+ margin-left: 1130px;
500
+ }
501
+ .offset10 {
502
+ margin-left: 1030px;
503
+ }
504
+ .offset9 {
505
+ margin-left: 930px;
506
+ }
507
+ .offset8 {
508
+ margin-left: 830px;
509
+ }
510
+ .offset7 {
511
+ margin-left: 730px;
512
+ }
513
+ .offset6 {
514
+ margin-left: 630px;
515
+ }
516
+ .offset5 {
517
+ margin-left: 530px;
518
+ }
519
+ .offset4 {
520
+ margin-left: 430px;
521
+ }
522
+ .offset3 {
523
+ margin-left: 330px;
524
+ }
525
+ .offset2 {
526
+ margin-left: 230px;
527
+ }
528
+ .offset1 {
529
+ margin-left: 130px;
530
+ }
531
+ .row-fluid {
532
+ width: 100%;
533
+ *zoom: 1;
534
+ }
535
+ .row-fluid:before,
536
+ .row-fluid:after {
537
+ display: table;
538
+ content: "";
539
+ }
540
+ .row-fluid:after {
541
+ clear: both;
542
+ }
543
+ .row-fluid [class*="span"] {
544
+ display: block;
545
+ float: left;
546
+ width: 100%;
547
+ min-height: 28px;
548
+ margin-left: 2.564102564%;
549
+ *margin-left: 2.510911074638298%;
550
+ -webkit-box-sizing: border-box;
551
+ -moz-box-sizing: border-box;
552
+ -ms-box-sizing: border-box;
553
+ box-sizing: border-box;
554
+ }
555
+ .row-fluid [class*="span"]:first-child {
556
+ margin-left: 0;
557
+ }
558
+ .row-fluid .span12 {
559
+ width: 100%;
560
+ *width: 99.94680851063829%;
561
+ }
562
+ .row-fluid .span11 {
563
+ width: 91.45299145300001%;
564
+ *width: 91.3997999636383%;
565
+ }
566
+ .row-fluid .span10 {
567
+ width: 82.905982906%;
568
+ *width: 82.8527914166383%;
569
+ }
570
+ .row-fluid .span9 {
571
+ width: 74.358974359%;
572
+ *width: 74.30578286963829%;
573
+ }
574
+ .row-fluid .span8 {
575
+ width: 65.81196581200001%;
576
+ *width: 65.7587743226383%;
577
+ }
578
+ .row-fluid .span7 {
579
+ width: 57.264957265%;
580
+ *width: 57.2117657756383%;
581
+ }
582
+ .row-fluid .span6 {
583
+ width: 48.717948718%;
584
+ *width: 48.6647572286383%;
585
+ }
586
+ .row-fluid .span5 {
587
+ width: 40.170940171000005%;
588
+ *width: 40.117748681638304%;
589
+ }
590
+ .row-fluid .span4 {
591
+ width: 31.623931624%;
592
+ *width: 31.5707401346383%;
593
+ }
594
+ .row-fluid .span3 {
595
+ width: 23.076923077%;
596
+ *width: 23.0237315876383%;
597
+ }
598
+ .row-fluid .span2 {
599
+ width: 14.529914530000001%;
600
+ *width: 14.4767230406383%;
601
+ }
602
+ .row-fluid .span1 {
603
+ width: 5.982905983%;
604
+ *width: 5.929714493638298%;
605
+ }
606
+ input,
607
+ textarea,
608
+ .uneditable-input {
609
+ margin-left: 0;
610
+ }
611
+ input.span12,
612
+ textarea.span12,
613
+ .uneditable-input.span12 {
614
+ width: 1160px;
615
+ }
616
+ input.span11,
617
+ textarea.span11,
618
+ .uneditable-input.span11 {
619
+ width: 1060px;
620
+ }
621
+ input.span10,
622
+ textarea.span10,
623
+ .uneditable-input.span10 {
624
+ width: 960px;
625
+ }
626
+ input.span9,
627
+ textarea.span9,
628
+ .uneditable-input.span9 {
629
+ width: 860px;
630
+ }
631
+ input.span8,
632
+ textarea.span8,
633
+ .uneditable-input.span8 {
634
+ width: 760px;
635
+ }
636
+ input.span7,
637
+ textarea.span7,
638
+ .uneditable-input.span7 {
639
+ width: 660px;
640
+ }
641
+ input.span6,
642
+ textarea.span6,
643
+ .uneditable-input.span6 {
644
+ width: 560px;
645
+ }
646
+ input.span5,
647
+ textarea.span5,
648
+ .uneditable-input.span5 {
649
+ width: 460px;
650
+ }
651
+ input.span4,
652
+ textarea.span4,
653
+ .uneditable-input.span4 {
654
+ width: 360px;
655
+ }
656
+ input.span3,
657
+ textarea.span3,
658
+ .uneditable-input.span3 {
659
+ width: 260px;
660
+ }
661
+ input.span2,
662
+ textarea.span2,
663
+ .uneditable-input.span2 {
664
+ width: 160px;
665
+ }
666
+ input.span1,
667
+ textarea.span1,
668
+ .uneditable-input.span1 {
669
+ width: 60px;
670
+ }
671
+ .thumbnails {
672
+ margin-left: -30px;
673
+ }
674
+ .thumbnails > li {
675
+ margin-left: 30px;
676
+ }
677
+ .row-fluid .thumbnails {
678
+ margin-left: 0;
679
+ }
680
+ }
681
+
682
+ @media (max-width: 979px) {
683
+ body {
684
+ padding-top: 0;
685
+ }
686
+ .navbar-fixed-top,
687
+ .navbar-fixed-bottom {
688
+ position: static;
689
+ }
690
+ .navbar-fixed-top {
691
+ margin-bottom: 18px;
692
+ }
693
+ .navbar-fixed-bottom {
694
+ margin-top: 18px;
695
+ }
696
+ .navbar-fixed-top .navbar-inner,
697
+ .navbar-fixed-bottom .navbar-inner {
698
+ padding: 5px;
699
+ }
700
+ .navbar .container {
701
+ width: auto;
702
+ padding: 0;
703
+ }
704
+ .navbar .brand {
705
+ padding-right: 10px;
706
+ padding-left: 10px;
707
+ margin: 0 0 0 -5px;
708
+ }
709
+ .nav-collapse {
710
+ clear: both;
711
+ }
712
+ .nav-collapse .nav {
713
+ float: none;
714
+ margin: 0 0 9px;
715
+ }
716
+ .nav-collapse .nav > li {
717
+ float: none;
718
+ }
719
+ .nav-collapse .nav > li > a {
720
+ margin-bottom: 2px;
721
+ }
722
+ .nav-collapse .nav > .divider-vertical {
723
+ display: none;
724
+ }
725
+ .nav-collapse .nav .nav-header {
726
+ color: #999999;
727
+ text-shadow: none;
728
+ }
729
+ .nav-collapse .nav > li > a,
730
+ .nav-collapse .dropdown-menu a {
731
+ padding: 6px 15px;
732
+ font-weight: bold;
733
+ color: #999999;
734
+ -webkit-border-radius: 3px;
735
+ -moz-border-radius: 3px;
736
+ border-radius: 3px;
737
+ }
738
+ .nav-collapse .btn {
739
+ padding: 4px 10px 4px;
740
+ font-weight: normal;
741
+ -webkit-border-radius: 4px;
742
+ -moz-border-radius: 4px;
743
+ border-radius: 4px;
744
+ }
745
+ .nav-collapse .dropdown-menu li + li a {
746
+ margin-bottom: 2px;
747
+ }
748
+ .nav-collapse .nav > li > a:hover,
749
+ .nav-collapse .dropdown-menu a:hover {
750
+ background-color: #222222;
751
+ }
752
+ .nav-collapse.in .btn-group {
753
+ padding: 0;
754
+ margin-top: 5px;
755
+ }
756
+ .nav-collapse .dropdown-menu {
757
+ position: static;
758
+ top: auto;
759
+ left: auto;
760
+ display: block;
761
+ float: none;
762
+ max-width: none;
763
+ padding: 0;
764
+ margin: 0 15px;
765
+ background-color: transparent;
766
+ border: none;
767
+ -webkit-border-radius: 0;
768
+ -moz-border-radius: 0;
769
+ border-radius: 0;
770
+ -webkit-box-shadow: none;
771
+ -moz-box-shadow: none;
772
+ box-shadow: none;
773
+ }
774
+ .nav-collapse .dropdown-menu:before,
775
+ .nav-collapse .dropdown-menu:after {
776
+ display: none;
777
+ }
778
+ .nav-collapse .dropdown-menu .divider {
779
+ display: none;
780
+ }
781
+ .nav-collapse .navbar-form,
782
+ .nav-collapse .navbar-search {
783
+ float: none;
784
+ padding: 9px 15px;
785
+ margin: 9px 0;
786
+ border-top: 1px solid #222222;
787
+ border-bottom: 1px solid #222222;
788
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
789
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
790
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
791
+ }
792
+ .navbar .nav-collapse .nav.pull-right {
793
+ float: none;
794
+ margin-left: 0;
795
+ }
796
+ .nav-collapse,
797
+ .nav-collapse.collapse {
798
+ height: 0;
799
+ overflow: hidden;
800
+ }
801
+ .navbar .btn-navbar {
802
+ display: block;
803
+ }
804
+ .navbar-static .navbar-inner {
805
+ padding-right: 10px;
806
+ padding-left: 10px;
807
+ }
808
+ }
809
+
810
+ @media (min-width: 980px) {
811
+ .nav-collapse.collapse {
812
+ height: auto !important;
813
+ overflow: visible !important;
814
+ }
815
+ }