Blame view

README.md 7.49 KB
43785de6   Miguel Barão   - added documenta...
1
# Getting Started
a96cd2c7   Miguel Barão   - added logging s...
2

1e8f0810   Miguel Barão   update setup.py a...
3

5d859a41   Miguel Barão   update documentation
4
5
6
## Requirements

This application requires python3.7+ and a few additional python packages.
93e13002   Miguel Barão   updates README.md.
7
It also uses npm (Node package management) to install javascript libraries.
a96cd2c7   Miguel Barão   - added logging s...
8

39126690   Miguel Barão   removes npm and n...
9
10
11
12
### Install python3.7 with sqlite3 support and npm

This can be done using the system package management, downloaded from [http://www.python.org](), or compiled from sources.

f540e673   Miguel Barão   - added README.md
13
- Installing from the system package manager:
5d859a41   Miguel Barão   update documentation
14
15

```sh
39126690   Miguel Barão   removes npm and n...
16
sudo port install python37 npm5              # MacOS
443a1eea   Miguel Barão   Update to latest ...
17
sudo pkg install python37 py37-sqlite3 npm   # FreeBSD
39126690   Miguel Barão   removes npm and n...
18
sudo apt install python3.7 npm               # Linux
5d859a41   Miguel Barão   update documentation
19
20
```

43785de6   Miguel Barão   - added documenta...
21
- Installing from source:
39126690   Miguel Barão   removes npm and n...
22
     
43785de6   Miguel Barão   - added documenta...
23
Download from [http://www.python.org]() and
39126690   Miguel Barão   removes npm and n...
24
25

```sh
c54ee176   Miguel Barão   update javascript...
26
27
unxz Python-3.7.tar.xz
tar xvf Python-3.7.tar
39126690   Miguel Barão   removes npm and n...
28
29
cd Python-3.7
./configure --prefix=$HOME/.local/bin
1e8f0810   Miguel Barão   update setup.py a...
30
make && make install
93e13002   Miguel Barão   updates README.md.
31
32
```

43785de6   Miguel Barão   - added documenta...
33
This will install python locally under `~/.local/bin`. Make sure to add it to your `PATH` (edit `~/.profile` in MacOS or FreeBSD).
59213008   Miguel Barão   - fixed user path...
34

443a1eea   Miguel Barão   Update to latest ...
35

a96cd2c7   Miguel Barão   - added logging s...
36
### Install pip
43785de6   Miguel Barão   - added documenta...
37

39126690   Miguel Barão   removes npm and n...
38
39
If the `pip` command is not yet installed, run one of these:

1e8f0810   Miguel Barão   update setup.py a...
40
```sh
43785de6   Miguel Barão   - added documenta...
41
sudo apt install python3.7-pip     # Ubuntu
f540e673   Miguel Barão   - added README.md
42
sudo pkg py37-pip                  # FreeBSD
443a1eea   Miguel Barão   Update to latest ...
43
44
sudo port install py37-pip         # MacOS
python3.7 -m ensurepip --user      # otherwise
39126690   Miguel Barão   removes npm and n...
45
```
5d859a41   Miguel Barão   update documentation
46

1e8f0810   Miguel Barão   update setup.py a...
47
48
49
50
51
The latter will install `pip` in your user account under `~/.local/bin`.
In the end you should be able to run `pip3 --version` and 
`python3 -c "import sqlite3"` without errors (sometimes `pip3` is `pip`, 
`pip3.7` or `pip-3.7`).

5dae401a   Miguel Barão   update README.md
52
If you want to always install python modules on the user account (recommended), 
f540e673   Miguel Barão   - added README.md
53
edit the pip configuration file `~/.config/pip/pip.conf` (FreeBSD, Linux) or 
43785de6   Miguel Barão   - added documenta...
54
55
56
57
`Library/Application Support/pip/pip.conf` (MacOS) and add the lines

```ini
[global]
f540e673   Miguel Barão   - added README.md
58
user = yes
39126690   Miguel Barão   removes npm and n...
59
```
f540e673   Miguel Barão   - added README.md
60

43785de6   Miguel Barão   - added documenta...
61
### Install python packages and javascript libraries:
39126690   Miguel Barão   removes npm and n...
62

43785de6   Miguel Barão   - added documenta...
63
Replace USER by your bitbucket username:
f540e673   Miguel Barão   - added README.md
64

c3eba869   Miguel Barão   update README.md
65
```sh
a96cd2c7   Miguel Barão   - added logging s...
66
cd somewhere
443a1eea   Miguel Barão   Update to latest ...
67
git clone https://git.xdi.uevora.pt/mjsb/aprendizations.git
1e8f0810   Miguel Barão   update setup.py a...
68
cd aprendizations
a96cd2c7   Miguel Barão   - added logging s...
69
pip install .           # install aprendizations and dependencies
443a1eea   Miguel Barão   Update to latest ...
70
npm install             # install javascript libraries
39126690   Miguel Barão   removes npm and n...
71
```
f540e673   Miguel Barão   - added README.md
72

39126690   Miguel Barão   removes npm and n...
73
74
Python packages are usually installed in:

5dae401a   Miguel Barão   update README.md
75
76
- `~/.local/lib/python3.7/site-packages/` in Linux/FreeBSD.
- `~/Library/python/3.7/lib/python/site-packages/` in MacOS.
93e13002   Miguel Barão   updates README.md.
77

1e8f0810   Miguel Barão   update setup.py a...
78
Javascript libraries are installed in `aprendizations/node_modules` directory.
5dae401a   Miguel Barão   update README.md
79
80
This libraries have symbolic links from `aprendizations/aprendizations/static`.

93e13002   Miguel Barão   updates README.md.
81
At this point aprendizations is installed in
b4ceb7fc   Miguel Barão   minor change in l...
82

93e13002   Miguel Barão   updates README.md.
83
84
85
```sh
~/Library/Python/3.7/bin              # MacOS
~/.local/bin                          # FreeBSD/Linux
39126690   Miguel Barão   removes npm and n...
86
```
93e13002   Miguel Barão   updates README.md.
87

f540e673   Miguel Barão   - added README.md
88
and can be run with the command `aprendizations` (make sure this directory is
59213008   Miguel Barão   - fixed user path...
89
90
in your `$PATH`).

443a1eea   Miguel Barão   Update to latest ...
91
92
## Configuration

c288f8c6   Miguel Barao   - updated documen...
93
### Database
443a1eea   Miguel Barão   Update to latest ...
94
95
96

The user data is maintained in a sqlite3 database file. We first need to create 
the database.
c288f8c6   Miguel Barao   - updated documen...
97
At the moment, the database should be located in the same directory as the main 
93e13002   Miguel Barão   updates README.md.
98
configuration file (see below). As an example, do
f540e673   Miguel Barão   - added README.md
99

b4ceb7fc   Miguel Barão   minor change in l...
100
```sh
59213008   Miguel Barão   - fixed user path...
101
cd demo                               # contains a small example
43785de6   Miguel Barão   - added documenta...
102
103
104
initdb-aprendizations                 # show or initialize database
initdb-aprendizations --admin         # add admin user
initdb-aprendizations inscricoes.csv  # add students from CSV
59213008   Miguel Barão   - fixed user path...
105
initdb-aprendizations --add 1184 "Aladino da Silva"   # add user
93e13002   Miguel Barão   updates README.md.
106
107
108
initdb-aprendizations --update 1184 --pw alibaba      # update password
initdb-aprendizations --help          # for the available options
```
bbc1c506   Miguel Barão   - documentation u...
109

43785de6   Miguel Barão   - added documenta...
110
The default password is equal to the user name used to login.
443a1eea   Miguel Barão   Update to latest ...
111

5d859a41   Miguel Barão   update documentation
112

43785de6   Miguel Barão   - added documenta...
113
### SSL Certificates
bbc1c506   Miguel Barão   - documentation u...
114

443a1eea   Miguel Barão   Update to latest ...
115
116
We need certificates for https. Certificates can be self-signed or validated by 
a trusted authority.
bbc1c506   Miguel Barão   - documentation u...
117

43785de6   Miguel Barão   - added documenta...
118
Self-signed can be used locally for development and testing, but browsers will 
93e13002   Miguel Barão   updates README.md.
119
120
complain. LetsEncrypt issues trusted and free certificates, but the server must 
have a registered publicly accessible domain name.
43785de6   Miguel Barão   - added documenta...
121

bbc1c506   Miguel Barão   - documentation u...
122
#### Selfsigned
443a1eea   Miguel Barão   Update to latest ...
123
124
125

Generate a selfsigned certificate and place it in `aprendizations/certs`.

bbc1c506   Miguel Barão   - documentation u...
126
```sh
43785de6   Miguel Barão   - added documenta...
127
openssl req -x509 -newkey rsa:4096 -keyout privkey.pem -out cert.pem -days 365 -nodes
443a1eea   Miguel Barão   Update to latest ...
128
```
43785de6   Miguel Barão   - added documenta...
129
130
131
132

#### LetsEncrypt

```sh
bbc1c506   Miguel Barão   - documentation u...
133
sudo pkg install py27-certbot       # FreeBSD
5d859a41   Miguel Barão   update documentation
134
135
136
137
```

Shutdown the firewall and any web server that might be running. Then run the script to generate the certificate:

443a1eea   Miguel Barão   Update to latest ...
138
139
```sh
sudo service pf stop                            # disable pf firewall (FreeBSD)
39126690   Miguel Barão   removes npm and n...
140
sudo certbot certonly --standalone -d www.example.com
5d859a41   Miguel Barão   update documentation
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
sudo service pf start                           # enable pf firewall
```

Certificates are saved under `/usr/local/etc/letsencrypt/live/www.example.com/`. Copy them to `aprendizations/certs` and change permissions to be readable:

```sh
sudo cp /usr/local/etc/letsencrypt/live/www.example.com/cert.pem .
sudo cp /usr/local/etc/letsencrypt/live/www.example.com/privkey.pem .
chmod 400 cert.pem privkey.pem
```

Renews can be done as follows:

```sh
sudo service pf stop   # shutdown firewall
93e13002   Miguel Barão   updates README.md.
156
sudo certbot renew
c55940af   Miguel Barão   - minor change in...
157
sudo service pf start  # start firewall
39126690   Miguel Barão   removes npm and n...
158
```
443a1eea   Miguel Barão   Update to latest ...
159

f540e673   Miguel Barão   - added README.md
160
and then copy the `cert.pem` and `privkey.pem` files to `aprendizations/certs` directory. Change permissions and ownership as appropriate.
43785de6   Miguel Barão   - added documenta...
161

3ec49458   Miguel Barão   fix README.md and...
162

39126690   Miguel Barão   removes npm and n...
163
### Testing
43785de6   Miguel Barão   - added documenta...
164

59213008   Miguel Barão   - fixed user path...
165
The application includes a small example in `demo/demo.yaml`. Run it with
443a1eea   Miguel Barão   Update to latest ...
166
167

```sh
93e13002   Miguel Barão   updates README.md.
168
cd demo
443a1eea   Miguel Barão   Update to latest ...
169
170
aprendizations demo.yaml
```
c288f8c6   Miguel Barao   - updated documen...
171

59213008   Miguel Barão   - fixed user path...
172
173
and open a browser at [https://127.0.0.1:8443](). If it everything looks good, 
check at the correct address `https://www.example.com` (requires port forward 
443a1eea   Miguel Barão   Update to latest ...
174
175
176
in the firewall). The option `--debug` provides more verbose logging and might 
be useful during testing. The option `--check` generates all the questions once
before running the server to check for any obvious syntax error.
59213008   Miguel Barão   - fixed user path...
177
178
179
180
181


### Firewall configuration

Ports 80 and 443 are only usable by root. For security reasons it is better to 
43785de6   Miguel Barão   - added documenta...
182
run the server as an unprivileged user on higher ports like 8080 for http and 
93e13002   Miguel Barão   updates README.md.
183
8443 for https. For this, we can configure port forwarding in the firewall to 
43785de6   Miguel Barão   - added documenta...
184
185
186
redirect incoming tcp traffic from 80 to 8080 and 443 to 8443.

#### FreeBSD and pf
59213008   Miguel Barão   - fixed user path...
187

5d859a41   Miguel Barão   update documentation
188
Edit `/etc/pf.conf`:
59213008   Miguel Barão   - fixed user path...
189

43785de6   Miguel Barão   - added documenta...
190
```sh
59213008   Miguel Barão   - fixed user path...
191
ext_if="em0"                # this should be the correct network interface
43785de6   Miguel Barão   - added documenta...
192
193
194
195
rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443
```

59213008   Miguel Barão   - fixed user path...
196
Under virtualbox with guest additions use `ext_if="vtnet0"`.
43785de6   Miguel Barão   - added documenta...
197
198
199
200
201

Edit `/etc/rc.conf`

```sh
pf_enable="YES"
59213008   Miguel Barão   - fixed user path...
202
pf_flags=""
ea4ff4d2   Miguel Barão   - radio: added su...
203
pf_rules="/etc/pf.conf"
59213008   Miguel Barão   - fixed user path...
204

39126690   Miguel Barão   removes npm and n...
205
206
# optional logging:
pflog_enable="YES"
93e13002   Miguel Barão   updates README.md.
207
208
209
210
pflog_flags=""
pflog_logfile="/var/log/pflog"
```

39126690   Miguel Barão   removes npm and n...
211
212
Reboot or `sudo service pf start`.

443a1eea   Miguel Barão   Update to latest ...
213
214
215

## Troubleshooting

39126690   Miguel Barão   removes npm and n...
216
To help with troubleshooting, use the option `--debug` when running the server. 
a203d3cc   Miguel Barão   - new http server...
217
This will increase logs in the terminal and will present the python exception 
5d859a41   Miguel Barão   update documentation
218
219
220
221
222
errors in the browser.

Logging levels can be adjusted in `~/.config/aprendizations/logger.yaml` and 
`~/.config/aprendizations/logger-debug.yaml`.

39126690   Miguel Barão   removes npm and n...
223
If these files do not yet exist, there are examples in `aprendizations/config` that can be copied to `~/.config/aprendizations`.
5d859a41   Miguel Barão   update documentation
224
225

#### UnicodeEncodeError
59213008   Miguel Barão   - fixed user path...
226
227

The server should not generate this error, but when using external scripts to 
443a1eea   Miguel Barão   Update to latest ...
228
229
generate questions or to correct, these scripts can print unicode strings to 
stdout. If the terminal does not support unicode, python will generate this 
5dae401a   Miguel Barão   update README.md
230
exception.
43785de6   Miguel Barão   - added documenta...
231

443a1eea   Miguel Barão   Update to latest ...
232
- FreeBSD fix: edit `~/.login_conf` to use UTF-8, for example:
5dae401a   Miguel Barão   update README.md
233

43785de6   Miguel Barão   - added documenta...
234
```sh
443a1eea   Miguel Barão   Update to latest ...
235
236
me:\
    :charset=UTF-8:\
43785de6   Miguel Barão   - added documenta...
237
    :lang=en_US.UTF-8:
443a1eea   Miguel Barão   Update to latest ...
238
```
59213008   Miguel Barão   - fixed user path...
239

443a1eea   Miguel Barão   Update to latest ...
240
241
242
- Debian fix: check `locale`...

## FAQ
5dae401a   Miguel Barão   update README.md
243

59213008   Miguel Barão   - fixed user path...
244
- Which students did at least one topic?
443a1eea   Miguel Barão   Update to latest ...
245

59213008   Miguel Barão   - fixed user path...
246
```sh
43785de6   Miguel Barão   - added documenta...
247
248
249
250
251
sqlite3 students.db "select distinct student_id from studenttopic"
```

- How many topics has each student done?

f75a344f   Miguel Barão   - README.md updat...
252
```sh
443a1eea   Miguel Barão   Update to latest ...
253
254
255
256
257
258
259
260
sqlite3 students.db "select student_id, count(topic_id) from studenttopic group by student_id order by count(topic_id) desc"
```

- Which questions have more wrong answers?

```sh
sqlite3 students.db "select count(ref), ref from answers where grade<1.0 group by ref order by count(ref) desc"
```
db04e658   Miguel Barão   - added option to...

43785de6   Miguel Barão   - added documenta...

f75a344f   Miguel Barão   - README.md updat...

93e13002   Miguel Barão   updates README.md.

f75a344f   Miguel Barão   - README.md updat...

43785de6   Miguel Barão   - added documenta...

d187aad4   Miguel Barão   - adds courses

43785de6   Miguel Barão   - added documenta...

f75a344f   Miguel Barão   - README.md updat...

d187aad4   Miguel Barão   - adds courses

f75a344f   Miguel Barão   - README.md updat...

43785de6   Miguel Barão   - added documenta...

93e13002   Miguel Barão   updates README.md.

f75a344f   Miguel Barão   - README.md updat...

93e13002   Miguel Barão   updates README.md.

443a1eea   Miguel Barão   Update to latest ...

f75a344f   Miguel Barão   - README.md updat...

93e13002   Miguel Barão   updates README.md.

443a1eea   Miguel Barão   Update to latest ...

93e13002   Miguel Barão   updates README.md.