Commit 0b27f204b42680c977f7150a56f7f1dd03900f61

Authored by Miguel Barão
1 parent 7c49db42
Exists in master and in 1 other branch dev

updates README.md

Showing 2 changed files with 84 additions and 77 deletions   Show diff stats
README.md
... ... @@ -11,26 +11,27 @@
11 11  
12 12 ## Requirements
13 13  
14   -The webserver is a python application that requires `>=python3.7` and the package installer for python `pip`. The node package management `npm` is also necessary in order to install the javascript libraries.
  14 +The webserver is a python application that requires `>=python3.8` and the
  15 +package installer for python `pip`. The node package management `npm` is also
  16 +necessary in order to install the javascript libraries.
15 17  
16 18 ```sh
17 19 sudo apt install python3 python3-pip npm # Ubuntu
18   -sudo pkg install python37 py37-sqlite3 py37-pip npm # FreeBSD
19   -sudo port install python37 py37-pip py37-setuptools npm6 # MacOS (macports)
  20 +sudo pkg install python38 py38-sqlite3 py38-pip npm # FreeBSD
  21 +sudo port install python38 py38-pip py38-setuptools npm6 # MacOS (macports)
20 22 ```
21 23  
22   -To make the `pip` install packages to a local directory, the file `pip.conf` should be configured as follows:
  24 +To make the `pip` install packages to a local directory, the file `pip.conf`
  25 +should be configured as follows:
23 26  
24 27 ```ini
25 28 [global]
26 29 user=yes
27   -
28   -[list]
29   -format=columns
30 30 ```
31 31  
32 32 This file is usually in `~/.config/pip/` in Linux and FreeBSD. In MacOS it's in
33   -`~/Library/Application Support/pip/`. You may have to create it, if it doesn't exist yet.
  33 +`~/Library/Application Support/pip/`. You may have to create it, if it doesn't
  34 +exist yet.
34 35  
35 36 ---
36 37  
... ... @@ -42,19 +43,21 @@ Download and install:
42 43 git clone https://git.xdi.uevora.pt/mjsb/perguntations.git
43 44 cd perguntations
44 45 npm install
45   -pip3 install .
  46 +pip install .
46 47 ```
47 48  
48   -The command `npm` installs the javascript libraries and then `pip3` installs the python webserver. This will also install any required dependencies.
  49 +The command `npm` installs the javascript libraries and then `pip` installs the
  50 +python webserver. This will also install any required dependencies.
49 51  
50   -**Atention!** `pip3 install .` must run **after** `npm install`, otherwise the javascript libraries will not be found during the install.
  52 +**Atention!** `pip install .` must be run **after** `npm install`, otherwise
  53 +the javascript libraries will not be found during the install.
51 54  
52 55 ---
53 56  
54 57 ## Setup
55 58  
56   -The server will run a `https` server and requires valid certificates.
57   -There are two possibilities to generate the certificates:
  59 +The server will run a `https` server and requires valid certificates. There
  60 +are two possibilities to generate the certificates:
58 61  
59 62 - public server with static IP address and registered domain name;
60 63 - private server on a local network isolated from the internet.
... ... @@ -74,38 +77,35 @@ cd ~/.local/share/certs
74 77 openssl req -x509 -newkey rsa:4096 -keyout privkey.pem -out cert.pem -days 365 -nodes
75 78 ```
76 79  
77   -To have a true certificate, like the ones issued by LetsEncrypt, the host
78   -must have a registered domain name.
79   -See instructions for FreeBSD at the end of this page.
  80 +To have a true certificate, like the ones issued by LetsEncrypt, the host must
  81 +have a registered domain name. See instructions for FreeBSD at the end of this
  82 +page.
80 83  
81 84 ---
82 85  
83 86 ## Running a demo
84 87  
85   -The directory `demo` in the repository includes a demo test that can be used
86   -as a template for your own tests and questions.
87   -
88   -To run the demonstration test you need to initialize the database using one of
89   -the following methods:
  88 +The directory `demo` in the repository includes a demo test that can be used as
  89 +a template for your own tests and questions. To run the demonstration test you
  90 +need to initialize the database using one of the following methods:
90 91  
91 92 ```sh
92 93 cd perguntations/demo
93   -
94 94 initdb students.csv # initialize from a CSV file
95 95 initdb --admin # only adds the administrator account
96 96 initdb --add 123 "Asterix Gaules" # add one student
97 97 ```
98 98  
99 99 This will create or update a `students.db` file that contains a sqlite3
100   -database.
101   -The database stores user passwords and grades, but not the actual tests.
  100 +database. The database stores user passwords and grades, but not the actual
  101 +tests.
102 102  
103   -A test is specified in a single `yaml` file.
104   -The demo already includes the `demo.yaml` that you can play with.
  103 +A test is specified in a single `yaml` file. The file `demo.yaml` is a test
  104 +specification that you can play with.
105 105  
106   -The complete tests submitted by the students are stored in JSON files in the
107   -directory defined in `demo.yaml` under the option `answers_dir: ans`.
108   -We also have to create this directory manually:
  106 +The answered tests submitted by the students are stored in JSON files in a
  107 +directory defined in `demo.yaml` under the option `answers_dir: ans`. We also
  108 +have to create this directory manually:
109 109  
110 110 ```sh
111 111 mkdir ans # directory where the tests will be saved
... ... @@ -114,38 +114,36 @@ mkdir ans # directory where the tests will be saved
114 114 Start the server and run the `demo.yaml` test:
115 115  
116 116 ```sh
117   -perguntations demo.yaml # run demo test
  117 +perguntations demo.yaml # run demo test
118 118 ```
119 119  
120 120 Several options are available, run `perguntations --help` for a list.
121 121  
122   -The server listens on port 8443 of all IPs of all network interfaces.
123   -Open the browser at `http://127.0.0.1:8443/` and login as user number `0`
  122 +The server listens on port 8443 of all IPs of all network interfaces. Open the
  123 +browser at `http://127.0.0.1:8443/` and login as user number `0`
124 124 (administrator) and choose any password you want. The password is defined on
125 125 first login.
  126 +
126 127 After logging in, you will be redirected to the administration page that shows
127 128 all the students and their current state.
128 129  
129 130 1. Authorize students by clicking the checkboxes.
130 131 2. Open a different browser (or exit administrator) at `http://127.0.0.1:8443/`
131   -and login as one of the authorized students.
132   -Answer the questions and submit. You should get a grade at the end.
  132 + and login as one of the authorized students. Answer the questions and
  133 + submit. You should get a grade at the end.
133 134  
134   -The server can be stoped from the terminal with `^C`.
  135 +The server can be stoped from the terminal with `^C` (Control+C).
135 136  
136 137 ---
137 138  
138 139 ## Running on lower ports
139 140  
140 141 Ports 80 and 443 are reserved for the root user and and this software **should
141   -NOT be run as root**.
142   -Instead, tcp traffic can be forwarded from port 443 to 8443 where the server is
143   -listening.
144   -The details depend on the operating system/firewall.
145   -
146   -### debian
  142 +NOT be run as root**. Instead, tcp traffic can be forwarded from port 443 to
  143 +8443 where the server is listening. The details depend on the operating
  144 +system/firewall.
147 145  
148   -FIXME: Untested
  146 +### debian (FIXME: Untested)
149 147  
150 148 ```.sh
151 149 iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-ports 8443
... ... @@ -166,25 +164,29 @@ Explanation:
166 164  
167 165 Edit `/etc/pf.conf`:
168 166  
169   - ext_if="wlan1"
170   - rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080
171   - rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443
  167 +```conf
  168 +ext_if="wlan1"
  169 +rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080
  170 +rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443
  171 +```
172 172  
173   -The `wlan1` should be the name of the network interface.
174   -Use `ext_if="vtnet0"` for guest additions under virtual box.
  173 +The `wlan1` should be the name of the network interface. Use `ext_if="vtnet0"`
  174 +for guest additions under virtual box.
175 175  
176 176 Start firewall with `sudo service pf start`.
177 177  
178 178 Optionally, to activate pf on boot, edit `rc.conf`:
179 179  
180   - pf_enable="YES"
181   - pf_flags=""
182   - pf_rules="/etc/pf.conf"
  180 +```conf
  181 +pf_enable="YES"
  182 +pf_flags=""
  183 +pf_rules="/etc/pf.conf"
183 184  
184   - # optional logging:
185   - pflog_enable="YES"
186   - pflog_flags=""
187   - pflog_logfile="/var/log/pflog"
  185 +# optional logging:
  186 +pflog_enable="YES"
  187 +pflog_flags=""
  188 +pflog_logfile="/var/log/pflog"
  189 +```
188 190  
189 191 ## Generating certificates with LetsEncript (FreeBSD)
190 192  
... ... @@ -192,7 +194,7 @@ Generating certificates for a public server (FreeBSD) requires a registered
192 194 domain with fixed IP.
193 195  
194 196 ```sh
195   -sudo pkg install py27-certbot # FreeBSD
  197 +sudo pkg install py38-certbot # FreeBSD 13
196 198 sudo service pf stop # disable pf firewall (FreeBSD)
197 199 sudo certbot certonly --standalone -d www.example.com
198 200 sudo service pf start # enable pf firewall
... ... @@ -208,47 +210,52 @@ chmod 400 cert.pem privkey.pem
208 210 Certificate renewals can be done as follows:
209 211  
210 212 ```sh
211   -sudo service pf stop # shutdown firewall
  213 +sudo service pf stop # shutdown firewall
212 214 sudo certbot renew
213   -sudo service pf start # start firewall
  215 +sudo service pf start # start firewall
214 216 ```
215 217  
216   -Again, copy certificate files `privkey.pem` and `cert.pem` to `~/.local/share/certs`.
  218 +Again, copy certificate files `privkey.pem` and `cert.pem` to
  219 +`~/.local/share/certs`.
217 220  
218 221 ---
219 222  
220 223 ## Upgrading
221 224  
222   -From time to time there can be updates to perguntations, python packages and javascript libraries.
223   -
224   -Python packages can be upgraded independently of the rest using pip:
  225 +From time to time there can be updates to perguntations, python packages and
  226 +javascript libraries. Python packages can be upgraded independently of the
  227 +rest using pip:
225 228  
226 229 ```sh
227   -pip list --outdated # lists upgradable packages
  230 +pip list --outdated --user # lists upgradable packages
228 231 pip install -U something # upgrade something
229 232 ```
230 233  
  234 +Attention: don't upgrade blindly. Some upgrades can be incompatible with
  235 +perguntations and break things! All upgrades require testing of all the
  236 +funcionalities.
  237 +
231 238 To upgrade perguntations and javascript libraries do:
232 239  
233 240 ```sh
234 241 cd perguntations
235 242 git pull # get latest version of perguntations
236 243 npm update # get latest versions of javascript libraries
237   -pip3 install -U . # upgrade perguntations
  244 +pip install -U . # upgrade perguntations
238 245 ```
239 246  
240 247 ## Troubleshooting
241 248  
242 249 - The server tries to run `python3` so this command must be accessible from
243   -user accounts. Currently, the minimum supported python version is 3.7.
244   -
  250 + user accounts. Currently, the minimum supported python version is 3.8.
245 251 - If you are getting any `UnicodeEncodeError` type of errors that's because the
246   -terminal is not supporting UTF-8.
247   -This error may occur when a unicode character is printed to the screen by the
248   -server or, when running question generator or correction scripts, a message is
249   -piped between the server and the scripts that includes unicode characters.
250   -Try running `locale` on the terminal and see if there are any error messages.
251   -Solutions:
  252 + terminal is not supporting UTF-8. This error may occur when a unicode
  253 + character is printed to the screen by the server or, when running question
  254 + generator or correction scripts, a message is piped between the server and
  255 + the scripts that includes unicode characters. Try running `locale` on the
  256 + terminal and see if there are any error messages.
  257 + Solutions:
  258 +
252 259 - debian: `sudo dpkg-reconfigure locales` and select your UTF-8 locales.
253 260 - FreeBSD: edit `~/.login_conf` to use UTF-8, for example:
254 261  
... ...
package.json
... ... @@ -2,12 +2,12 @@
2 2 "description": "Javascript libraries required to run the server",
3 3 "email": "mjsb@uevora.pt",
4 4 "dependencies": {
5   - "@fortawesome/fontawesome-free": "^5.15.1",
6   - "bootstrap": "^4.5",
7   - "codemirror": "^5.58.1",
  5 + "@fortawesome/fontawesome-free": "^5.15.3",
  6 + "bootstrap": "^4.6.0",
  7 + "codemirror": "^5.61.1",
8 8 "datatables": "^1.10",
9   - "jquery": "^3.5.1",
10   - "mathjax": "^3.1.2",
11   - "underscore": "^1.11.0"
  9 + "jquery": "^3.6.0",
  10 + "mathjax": "^3.1.4",
  11 + "underscore": "^1.13.1"
12 12 }
13 13 }
... ...