1233db49af1e7dd88d0fc61e052925674fcaddd4
1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2014-2015 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Configuration of the Web server of xymus.net
23 # Use actions defined by contribs
25 import benitlux
::benitlux_controller
26 import opportunity
::opportunity_controller
27 import nitiwiki
::wiki_edit
29 # Header for the whole site
33 # Current page id, is used to set the `active` class on the header tab
34 var page
: nullable String
36 # Make room for a login or logout placeholder (used by tnitter)
37 var login_placeholder
: Bool
41 var actives
= new HashMap[String, String]
43 if page
!= null then actives
[page
] = " class=\"active\
""
46 <nav class="navbar navbar-default" role="navigation">
47 <div class="container-fluid">
48 <div class="navbar-header">
49 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
50 <span class="sr-only">Toggle navigation</span>
51 <span class="icon-bar"></span>
52 <span class="icon-bar"></span>
53 <span class="icon-bar"></span>
55 <a class="navbar-brand" href="http://xymus.net/">Xymus.net</a>
58 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
59 <ul class="nav navbar-nav">
60 <li{{{actives.get_or_default("ens", "")}}}><a href="http://xymus.net/ens/">Enseignement</a></li>
61 <li{{{actives.get_or_default("opportunity", "")}}}>
62 <a href="http://xymus.net/opportunity/">
63 <img height="22px" src="/static/opportunity-small-fr.png"></a>
65 <li{{{actives.get_or_default("tnitter", "")}}}>
66 <a href="http://xymus.net/tnitter/">
67 <img height="22px" src="/static/tnitter-small.png">
69 <li><a href="http://xymus.net/pep8/">Pep/8 Analysis</a></li>
70 <li{{{actives.get_or_default("benitlux", "")}}}><a href="http://xymus.net/benitlux/">Benitlux</a></li>
73 <ul class="nav navbar-nav pull-right">
75 if login_placeholder
then add
"%header_right%"
84 redef fun to_s
do return write_to_string
87 class OpportunityMasterHeader
88 super OpportunityHeader
90 var master_header
: MasterHeader
98 <title>Opportunity - The meetup planner</title>
99 <meta charset="utf-8">
100 <meta name="viewport" content="width=device-width, initial-scale=1">
101 <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
102 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
103 <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
112 .opportunity-action:hover {
122 redef class TnitterWeb
123 redef var header
= (new MasterHeader("tnitter", true)).to_s
125 redef fun javascript_header
do return tracking_code
128 redef class BenitluxDocument
129 redef var header
= new MasterHeader("benitlux", false)
132 redef class ErrorTemplate
133 redef var header
= new MasterHeader(null, false)
136 redef class OpportunityPage
137 redef var header
= new OpportunityMasterHeader(new MasterHeader("opportunity", false))
140 redef class FileServer
142 redef fun javascript_header
do return tracking_code
145 redef class MeetupCreationPage
146 redef var templates
do
148 map
["Pizzas spécial LATECE"] = ["Végétarienne", "Pepperoni", "Viandes", "Poulet BBQ"]
149 map
["Heures de réunion à l'UQAM"] = ["7h 30", "9h", "10h 30", "12h",
150 "13h 30", "15h", "16h 30", "18h"]
155 fun tracking_code
: String do return """
156 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
157 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
158 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
159 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
161 ga('create', 'UA-574578-1', 'auto');
162 ga('send', 'pageview');
165 # Avoid executing when running tests
166 if "NIT_TESTING".environ
== "true" then exit
0
168 # Setup server interfaces
170 # Change these to use this config on your own server!
171 var default_vh
= new VirtualHost("xymus.net:80")
172 var vps_vh
= new VirtualHost("vps.xymus.net:80")
173 var tnitter_vh
= new VirtualHost("tnitter.xymus.net:80")
174 var pep8_vh
= new VirtualHost("pep8.xymus.net:80")
175 var benitlux_vh
= new VirtualHost("benitlux.xymus.net:80")
177 var factory
= new HttpFactory.and_libevent
178 factory
.config
.virtual_hosts
.add default_vh
179 factory
.config
.virtual_hosts
.add vps_vh
180 factory
.config
.virtual_hosts
.add tnitter_vh
181 factory
.config
.virtual_hosts
.add pep8_vh
182 factory
.config
.virtual_hosts
.add benitlux_vh
184 # Ports are open, drop to a low-privileged user if we are root
185 var user_group
= new UserGroup("nitcorn", "nitcorn")
186 if sys
.uid
== 0 then user_group
.drop_privileges
188 # Files shared by all the virtual hosts (mostly for the common header)
189 var shared_file_server
= new FileServer("/var/www/static/")
191 # Tnitter is available at `tnitter.xymus.net` and `xymus.net/tnitter/`
192 var tnitter
= new TnitterWeb
193 default_vh
.routes
.add
new Route("/tnitter", tnitter
)
195 tnitter_vh
.routes
.add
new Route("/rest/", new TnitterREST)
196 tnitter_vh
.routes
.add
new Route("/push/", new TnitterPush)
197 tnitter_vh
.routes
.add
new Route("/static/", shared_file_server
)
198 tnitter_vh
.routes
.add
new Route(null, tnitter
)
200 # Pep/8 Analysis is only a file server. It is available at `pep8.xymus.net`
201 # and through the global/default file server at `xymus.net/pep8/`
203 # TODO Implement pep8analysis server-side with a nitcorn action
204 pep8_vh
.routes
.add
new Route("/static/", shared_file_server
)
205 pep8_vh
.routes
.add
new Route(null, new FileServer("/var/www/pep8/"))
207 # Benitlux is available at `benitlux.xymus.net` and `xymus.net/benitlux/`
209 # It has 2 actions/Web interfaces. The Web user UI to subscribe and unsubscribe
210 # to the mailing list. And the RESTful interface used by the Android app.
212 var db_path
= "benitlux_sherbrooke.db"
213 var benitlux_db
= new BenitluxDB.open
(db_path
)
214 var db_error
= benitlux_db
.error
215 if db_error
!= null then
220 var benitlux_sub
= new BenitluxSubscriptionAction(benitlux_db
)
221 var benitlux_rest
= new BenitluxRESTAction(benitlux_db
)
222 var benitlux_push
= new BenitluxPushAction(benitlux_db
)
223 default_vh
.routes
.add
new Route("/benitlux/rest/", benitlux_rest
)
224 default_vh
.routes
.add
new Route("/benitlux/push/", benitlux_push
)
225 default_vh
.routes
.add
new Route("/benitlux", benitlux_sub
)
226 benitlux_vh
.routes
.add
new Route("/rest/", benitlux_rest
)
227 benitlux_vh
.routes
.add
new Route("/push/", benitlux_push
)
228 benitlux_vh
.routes
.add
new Route("/static/", shared_file_server
)
229 benitlux_vh
.routes
.add
new Route(null, benitlux_sub
)
231 # Opportunity service
232 var opportunity
= new OpportunityWelcome
233 var opportunity_rest
= new OpportunityRESTAction
234 default_vh
.routes
.add
new Route("/opportunity/rest/", opportunity_rest
)
235 default_vh
.routes
.add
new Route("/opportunity", opportunity
)
237 # Nitiwiki modification form
238 var passwords
= "nitiwiki_passwords".to_path
.read_lines
239 assert passwords
.not_empty
240 default_vh
.routes
.add
new Route("/edit", new EditAction("http://xymus.net/", "/home/xymus/projects/wiki/config.ini", passwords
))
242 # We use a special file server for the path `xymus.net/ens` only to display
243 # a different header.
244 var file_server_ens
= new FileServer("/var/www/ens/")
245 file_server_ens
.header
= (new MasterHeader("ens", false))
246 default_vh
.routes
.add
new Route("/ens", file_server_ens
)
248 # Default file server is used for the main page at `xymus.net` and it is
249 # the default action for any path not caught by other actions.
250 var file_server
= new FileServer("/var/www/")
251 file_server
.header
= (new MasterHeader(null, false))
252 default_vh
.routes
.add
new Route(null, file_server
)
253 vps_vh
.routes
.add
new Route(null, file_server
)
255 # Launch server main loop