Commit 9b98821dc8a9a9d22ad6739c54a20a54a85a0992
1 parent
1aa7be86
Exists in
master
and in
1 other branch
update README.md
use cdn provided font-awesome and codemirror remove npm and node dependencies version bump to 2021.11.dev1
Showing
13 changed files
with
154 additions
and
169 deletions
Show diff stats
README.md
| 1 | 1 | # Getting Started |
| 2 | 2 | |
| 3 | -Latest review: 2021-07-08 | |
| 3 | +Latest review: 2021-11-08 | |
| 4 | 4 | |
| 5 | 5 | ## Installation |
| 6 | 6 | |
| 7 | 7 | To complete the installation we will need to perform the following steps: |
| 8 | 8 | |
| 9 | -1. install python3, pip and npm | |
| 10 | -2. download aprendizations from the repository | |
| 11 | -3. install javascript libraries (with npm) | |
| 12 | -4. install aprendizations (with pip) | |
| 13 | -5. generate SSL certificates | |
| 14 | -6. configure the firewall (optional) | |
| 9 | +1. install python3 and pip | |
| 10 | +2. install aprendizations | |
| 11 | +3. generate SSL certificates | |
| 12 | +4. configure the firewall (optional) | |
| 15 | 13 | |
| 16 | 14 | To use the software we need to: |
| 17 | 15 | |
| 18 | -1. initialize database | |
| 16 | +1. initialize a database | |
| 19 | 17 | 2. go to the demo directory (or an existing course) |
| 20 | -3. run `aprendizations demo.yaml` | |
| 18 | +3. run `aprendizations courses.yaml` | |
| 21 | 19 | |
| 22 | 20 | Each of these steps is explained below. |
| 23 | 21 | |
| 24 | -### Install python3 with sqlite3 support and npm | |
| 22 | +### Install python3 with sqlite3 support | |
| 25 | 23 | |
| 26 | -Python can be installed either from the system package management or compiled | |
| 27 | -from sources. | |
| 28 | - | |
| 29 | -#### Installing from the system package manager | |
| 30 | - | |
| 31 | -```sh | |
| 32 | -sudo pkg install python3 npm # FreeBSD | |
| 33 | -sudo apt install python3 npm # Linux (Ubuntu) | |
| 34 | -sudo port install python38 npm7 # MacOS | |
| 35 | -``` | |
| 36 | - | |
| 37 | -In FreeBSD also install `py3X-sqlite3` where `X` is the python version. | |
| 38 | - | |
| 39 | -#### Installing from source (outdated) | |
| 40 | - | |
| 41 | -Make sure that the build tools and libraries are installed: | |
| 24 | +Minimum supported version is python3.8. The installed versions depend on the | |
| 25 | +operating system default. | |
| 42 | 26 | |
| 43 | 27 | ```sh |
| 44 | -# Ubuntu: | |
| 45 | -sudo apt install build-essential libssl-dev zlib1g-dev libncurses5-dev \ | |
| 46 | - libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev \ | |
| 47 | - libbz2-dev libexpat1-dev liblzma-dev tk-dev libffi-dev | |
| 28 | +sudo pkg install python3 py38-sqlite3 # FreeBSD | |
| 29 | +sudo apt install python3 # Linux (Ubuntu) | |
| 30 | +sudo port install python39 # MacOS | |
| 48 | 31 | ``` |
| 49 | 32 | |
| 50 | -Download [python](http://www.python.org) and | |
| 51 | - | |
| 52 | -```sh | |
| 53 | -tar xvfJ Python-3.7.tar.xz | |
| 54 | -cd Python-3.7 | |
| 55 | -./configure --prefix=$HOME/.local --enable-optimizations | |
| 56 | -make && make install | |
| 57 | -``` | |
| 58 | - | |
| 59 | -This will install python locally under `~/.local/bin`. Make sure to add it to | |
| 60 | -your `PATH` in `~/.profile`. If `~/bin` is already in the path, just make a | |
| 61 | -symbolic link `ln -s ~/.local/bin ~/bin`. | |
| 62 | - | |
| 63 | 33 | ### Install pip |
| 64 | 34 | |
| 65 | 35 | Install `pip` from the system package manager: |
| 66 | 36 | |
| 67 | 37 | ```sh |
| 68 | -sudo apt install python3-pip # Ubuntu | |
| 69 | -sudo pkg py38-pip # FreeBSD | |
| 38 | +sudo pkg install py38-pip # FreeBSD | |
| 39 | +sudo apt install python3-pip # Linux (Ubuntu) | |
| 70 | 40 | sudo port install py39-pip # MacOS |
| 71 | 41 | ``` |
| 72 | 42 | |
| 73 | -Then run `python3 -m pip install -U pip` to install latest version into your | |
| 74 | -user account under `~/.local/bin`. | |
| 75 | 43 | In the end you should be able to run `pip --version` and `python3 -c "import |
| 76 | 44 | sqlite3"` without errors. |
| 77 | -In some systems, `pip` can be named `pip3`, `pip3.8` or `pip-3.8`. | |
| 45 | +In some systems, `pip` can be named `pip3`, `pip3.8` or `pip-3.8`, etc. | |
| 78 | 46 | |
| 79 | -Edit the configuration file `~/.config/pip/pip.conf` (FreeBSD, Linux) or | |
| 47 | +Packages should **not** be installed system-wide. To install locally in the user | |
| 48 | +area, edit the configuration file `~/.config/pip/pip.conf` (FreeBSD, Linux) or | |
| 80 | 49 | `Library/Application Support/pip/pip.conf` (MacOS) and add the lines |
| 81 | 50 | |
| 82 | 51 | ```ini |
| ... | ... | @@ -84,30 +53,22 @@ Edit the configuration file `~/.config/pip/pip.conf` (FreeBSD, Linux) or |
| 84 | 53 | user = yes |
| 85 | 54 | ``` |
| 86 | 55 | |
| 87 | -This will set pip to install modules in the user area (recommended). | |
| 88 | - | |
| 89 | -### Download and install aprendizations | |
| 56 | +### Install aprendizations | |
| 90 | 57 | |
| 91 | 58 | ```sh |
| 92 | -git clone https://git.xdi.uevora.pt/mjsb/aprendizations.git | |
| 93 | -cd aprendizations | |
| 94 | -npm install # install javascript libraries | |
| 95 | -pip install . # install aprendizations and dependencies | |
| 59 | +pip install git+https://git.xdi.uevora.pt/mjsb/aprendizations.git | |
| 96 | 60 | ``` |
| 97 | 61 | |
| 98 | -Javascript libraries are installed in `aprendizations/node_modules` and are | |
| 99 | -linked from `aprendizations/aprendizations/static`. | |
| 100 | - | |
| 101 | 62 | Python packages are usually installed in: |
| 102 | 63 | |
| 103 | 64 | * `~/.local/lib/python3.8/site-packages/` in Linux/FreeBSD. |
| 104 | 65 | * `~/Library/python/3.9/lib/python/site-packages/` in MacOS. |
| 105 | 66 | |
| 106 | 67 | When aprendizations is installed with pip, all the dependencies are also |
| 107 | -installed. The javascript libraries previously installed with npm are copied to | |
| 108 | -the above directory and the cloned repository is no longer needed. | |
| 68 | +installed. | |
| 109 | 69 | |
| 110 | -At this point `aprendizations` is installed in | |
| 70 | +At this point, the commands `aprendizations` and `initdb-aprendizations` are | |
| 71 | +installed in | |
| 111 | 72 | |
| 112 | 73 | ```sh |
| 113 | 74 | ~/.local/bin # Linux/FreeBSD |
| ... | ... | @@ -119,6 +80,7 @@ and can be run from the terminal: |
| 119 | 80 | ```sh |
| 120 | 81 | aprendizations --version |
| 121 | 82 | aprendizations --help |
| 83 | +initdb-aprendizations --help | |
| 122 | 84 | ``` |
| 123 | 85 | |
| 124 | 86 | ### SSL Certificates |
| ... | ... | @@ -172,7 +134,7 @@ chmod 400 cert.pem privkey.pem |
| 172 | 134 | |
| 173 | 135 | User data is maintained in a sqlite3 database which has to be created manually |
| 174 | 136 | using the `initdb-aprendizations` command. The database file should be located |
| 175 | -in the same directory as the main YAML configuration file. | |
| 137 | +in the same directory as the main YAML configuration file (`courses.yaml`). | |
| 176 | 138 | |
| 177 | 139 | For example, to run the included demo do: |
| 178 | 140 | |
| ... | ... | @@ -190,12 +152,12 @@ The default password is equal to the user name, if left undefined. |
| 190 | 152 | |
| 191 | 153 | ### Running the demo |
| 192 | 154 | |
| 193 | -The application includes a small example in `demo/demo.yaml` that can be used | |
| 155 | +The application includes a small example in `demo/courses.yaml` that can be used | |
| 194 | 156 | for initial testing. Run it with |
| 195 | 157 | |
| 196 | 158 | ```sh |
| 197 | 159 | cd demo |
| 198 | -aprendizations demo.yaml | |
| 160 | +aprendizations courses.yaml | |
| 199 | 161 | ``` |
| 200 | 162 | |
| 201 | 163 | Open the browser at [https://127.0.0.1:8443](https://127.0.0.1:8443). |
| ... | ... | @@ -237,28 +199,25 @@ pflog_logfile="/var/log/pflog" |
| 237 | 199 | |
| 238 | 200 | Reboot or `sudo service pf start`. |
| 239 | 201 | |
| 202 | +Example configuration files are in the `freebsd` directory. | |
| 203 | + | |
| 240 | 204 | ### Testing the system |
| 241 | 205 | |
| 242 | 206 | Make sure the following steps have been done: |
| 243 | 207 | |
| 244 | -* installed python3, pip and npm | |
| 245 | -* git-cloned the aprendizations from the main repository | |
| 246 | -* installed javascript libraries with npm | |
| 247 | -* installed aprendizations with pip | |
| 208 | +* installed python3 and pip | |
| 209 | +* installed aprendizations using pip | |
| 248 | 210 | * initialized database with at least 1 user |
| 249 | 211 | * generate and copy certificates to the appropriate place |
| 250 | 212 | * (optional) configure the firewall to do port forwarding |
| 251 | -* run `aprendizations demo.yaml --check` | |
| 213 | +* run `aprendizations courses.yaml --check` | |
| 252 | 214 | |
| 253 | 215 | ## Keeping aprendizations updated |
| 254 | 216 | |
| 255 | 217 | To update aprendizations to the latest version do: |
| 256 | 218 | |
| 257 | 219 | ```sh |
| 258 | -cd aprendizations | |
| 259 | -git pull # get latest version | |
| 260 | -npm update # update javascript libraries | |
| 261 | -pip install -U . # updates installed version | |
| 220 | +pip install -U git+https://git.xdi.uevora.pt/mjsb/aprendizations.git | |
| 262 | 221 | ``` |
| 263 | 222 | |
| 264 | 223 | ## Troubleshooting |
| ... | ... | @@ -304,20 +263,6 @@ To fix this issue you need to allow animations in the Operating System: |
| 304 | 263 | * On MacOS or iOS search for reduced motion and switch it **OFF** |
| 305 | 264 | (Preferences -> Acessibility -> Display -> Reduce motion). |
| 306 | 265 | |
| 307 | -### The application runs but questions do not show up | |
| 308 | - | |
| 309 | -Some operating systems have an option to disable animations to try to avoid | |
| 310 | -motion sickness in some people. Browsers will check this option with the OS and | |
| 311 | -prevent animate.css library to work. Since questions have several animations, | |
| 312 | -these will will not work and nothing is shown on the page. | |
| 313 | - | |
| 314 | -To fix this issue you need to allow animations in the Operating System: | |
| 315 | - | |
| 316 | -* On windows 10, go to System Preferences, search for "Show animations in | |
| 317 | - windows" and turn it **ON**. | |
| 318 | -* On MacOS or iOS search for reduced motion and switch it **OFF** | |
| 319 | - (Preferences -> Acessibility -> Display -> Reduce motion). | |
| 320 | - | |
| 321 | 266 | ## FAQ |
| 322 | 267 | |
| 323 | 268 | Common database manipulations: | ... | ... |
aprendizations/__init__.py
aprendizations/learnapp.py
| ... | ... | @@ -86,7 +86,7 @@ class LearnApp(): |
| 86 | 86 | for course_file in config.get('topics_from', []): |
| 87 | 87 | course_conf = load_yaml(course_file) # course configuration |
| 88 | 88 | # FIXME set defaults?? |
| 89 | - logger.info('%6d topics imported from %s', | |
| 89 | + logger.info('%6d topics from %s', | |
| 90 | 90 | len(course_conf["topics"]), course_file) |
| 91 | 91 | self._populate_graph(course_conf) |
| 92 | 92 | logger.info('Graph has %d topics', len(self.deps)) |
| ... | ... | @@ -327,7 +327,7 @@ class LearnApp(): |
| 327 | 327 | logger.warning('"%s" could not start course "%s"', uid, course_id) |
| 328 | 328 | raise LearnException() from exc |
| 329 | 329 | else: |
| 330 | - logger.info('User "%s" started course "%s"', uid, course_id) | |
| 330 | + logger.info('User "%s" course "%s"', uid, course_id) | |
| 331 | 331 | |
| 332 | 332 | # ------------------------------------------------------------------------ |
| 333 | 333 | # |
| ... | ... | @@ -609,15 +609,17 @@ class LearnApp(): |
| 609 | 609 | This should be modified to have a "visible" flag |
| 610 | 610 | ''' |
| 611 | 611 | |
| 612 | - logger.info('User "%s" get rankings for %s', uid, course_id) | |
| 613 | - query_students = select(Student.id, Student.name) | |
| 614 | - query_student_topics = select(StudentTopic.student_id, | |
| 615 | - StudentTopic.topic_id, | |
| 616 | - StudentTopic.level, | |
| 617 | - StudentTopic.date) | |
| 618 | - query_total = select(Answer.student_id, func.count(Answer.ref)) | |
| 619 | - query_right = select(Answer.student_id, func.count(Answer.ref)).where(Answer.grade == 1.0) | |
| 612 | + logger.info('User "%s" rankings for "%s"', uid, course_id) | |
| 620 | 613 | with Session(self._engine, future=True) as session: |
| 614 | + query_students = select(Student.id, Student.name) | |
| 615 | + query_student_topics = select(StudentTopic.student_id, | |
| 616 | + StudentTopic.topic_id, | |
| 617 | + StudentTopic.level, | |
| 618 | + StudentTopic.date) | |
| 619 | + query_total = select(Answer.student_id, func.count(Answer.ref)) | |
| 620 | + query_right = select(Answer.student_id, func.count(Answer.ref)) \ | |
| 621 | + .where(Answer.grade == 1.0) | |
| 622 | + | |
| 621 | 623 | # all students in the database FIXME only with answers of this course |
| 622 | 624 | students = session.execute(query_students).all() |
| 623 | 625 | |
| ... | ... | @@ -625,6 +627,9 @@ class LearnApp(): |
| 625 | 627 | student_topics = session.execute(query_student_topics).all() |
| 626 | 628 | |
| 627 | 629 | # answer performance |
| 630 | + | |
| 631 | + # FIXME this does not work when nobody has done anything... | |
| 632 | + # FIXME row to dict seems to be deprecated in 1.4+ | |
| 628 | 633 | total = dict(session.execute(query_total).all()) |
| 629 | 634 | right = dict(session.execute(query_right).all()) |
| 630 | 635 | ... | ... |
aprendizations/static/codemirror
aprendizations/static/fontawesome-free
aprendizations/templates/courses.html
| ... | ... | @@ -9,14 +9,16 @@ |
| 9 | 9 | <link rel="icon" href="favicon.ico"> |
| 10 | 10 | <!-- Styles --> |
| 11 | 11 | <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> |
| 12 | + <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet"> | |
| 12 | 13 | |
| 13 | 14 | <link rel="stylesheet" href="{{static_url('css/maintopics.css')}}"> |
| 14 | 15 | <link rel="stylesheet" href="{{static_url('css/sticky-footer-navbar.css')}}"> |
| 15 | 16 | <!-- Scripts --> |
| 16 | - <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> | |
| 17 | + <script src="https://code.jquery.com/jquery-3.6.0.min.js" | |
| 18 | + integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> | |
| 19 | + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" | |
| 20 | + integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | |
| 17 | 21 | |
| 18 | - <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | |
| 19 | - <script defer src="{{static_url('fontawesome-free/js/all.min.js')}}"></script> | |
| 20 | 22 | <script defer src="{{static_url('js/maintopics.js')}}"></script> |
| 21 | 23 | |
| 22 | 24 | <title>{{appname}}</title> | ... | ... |
aprendizations/templates/maintopics-table.html
| ... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 | |
| 11 | 11 | <!-- Styles --> |
| 12 | 12 | <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> |
| 13 | + <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet"> | |
| 13 | 14 | |
| 14 | 15 | <link rel="stylesheet" href="{{static_url('css/maintopics.css')}}"> |
| 15 | 16 | |
| ... | ... | @@ -17,7 +18,6 @@ |
| 17 | 18 | <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> |
| 18 | 19 | <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> |
| 19 | 20 | |
| 20 | - <script defer src="{{static_url('fontawesome-free/js/all.min.js')}}"></script> | |
| 21 | 21 | <script defer src="{{static_url('js/maintopics.js')}}"></script> |
| 22 | 22 | |
| 23 | 23 | <title>{{appname}}</title> | ... | ... |
aprendizations/templates/rankings.html
| ... | ... | @@ -9,10 +9,12 @@ |
| 9 | 9 | <link rel="icon" href="/static/favicon.ico"> |
| 10 | 10 | <!-- Styles --> |
| 11 | 11 | <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> |
| 12 | + <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet"> | |
| 13 | + | |
| 12 | 14 | <link rel="stylesheet" href="{{static_url('css/maintopics.css')}}"> |
| 13 | 15 | <!-- Scripts --> |
| 14 | 16 | <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> |
| 15 | - <script defer src="{{static_url('fontawesome-free/js/all.min.js')}}"></script> | |
| 17 | + | |
| 16 | 18 | <script defer src="{{static_url('js/maintopics.js')}}"></script> |
| 17 | 19 | |
| 18 | 20 | <title>{{appname}}</title> | ... | ... |
aprendizations/templates/topic.html
| ... | ... | @@ -6,16 +6,17 @@ |
| 6 | 6 | <meta name="author" content="Miguel Barão" /> |
| 7 | 7 | <link rel="icon" href="/static/favicon.ico"> |
| 8 | 8 | |
| 9 | - <!-- Styles --> | |
| 10 | - <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> | |
| 11 | - | |
| 9 | + <!-- Styles ---------------------------------------------------------- --> | |
| 10 | + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" | |
| 11 | + integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous" /> | |
| 12 | + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" /> | |
| 12 | 13 | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" /> |
| 14 | + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.63.3/codemirror.min.css" /> | |
| 15 | + <!-- local styles --> | |
| 16 | + <link rel="stylesheet" href="{{static_url('css/github.css')}}" /> | |
| 17 | + <link rel="stylesheet" href="{{static_url('css/topic.css')}}" /> | |
| 13 | 18 | |
| 14 | - <link rel="stylesheet" href="{{static_url('codemirror/lib/codemirror.css')}}"> | |
| 15 | - <link rel="stylesheet" href="{{static_url('css/github.css')}}"> | |
| 16 | - <link rel="stylesheet" href="{{static_url('css/topic.css')}}"> | |
| 17 | - | |
| 18 | - <!-- MathJax3 --> | |
| 19 | + <!-- Scripts --------------------------------------------------------- --> | |
| 19 | 20 | <script> |
| 20 | 21 | MathJax = { |
| 21 | 22 | tex: { |
| ... | ... | @@ -26,15 +27,14 @@ |
| 26 | 27 | } |
| 27 | 28 | }; |
| 28 | 29 | </script> |
| 29 | - <!-- Scripts --> | |
| 30 | 30 | <script async type="text/javascript" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> |
| 31 | + <script defer src="https://code.jquery.com/jquery-3.6.0.min.js" | |
| 32 | + integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> | |
| 33 | + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" | |
| 34 | + integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | |
| 35 | + <script defer src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.63.3/codemirror.min.js"></script> | |
| 31 | 36 | |
| 32 | - <script defer src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> | |
| 33 | - | |
| 34 | - <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> | |
| 35 | - | |
| 36 | - <script defer src="{{static_url('fontawesome-free/js/all.min.js')}}"></script> | |
| 37 | - <script defer src="{{static_url('codemirror/lib/codemirror.js')}}"></script> | |
| 37 | + <!-- local scripts --> | |
| 38 | 38 | <script defer src="{{static_url('js/topic.js')}}"></script> |
| 39 | 39 | |
| 40 | 40 | <title>{{appname}}</title> | ... | ... |
| ... | ... | @@ -0,0 +1,60 @@ |
| 1 | + | |
| 2 | +# Public interface | |
| 3 | +ext_if="em0" | |
| 4 | + | |
| 5 | +table <bruteforce> persist | |
| 6 | + | |
| 7 | +# Set and drop these IP ranges on public interface | |
| 8 | +martians = "{ 0.0.0.0/8, 127.0.0.0/8 }" | |
| 9 | + | |
| 10 | +# 192.168.0.0/16, 172.16.0.0/12, \ | |
| 11 | +# 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \ | |
| 12 | +# 240.0.0.0/4 }" | |
| 13 | + | |
| 14 | +webports = "{ 8080, 8443 }" | |
| 15 | + | |
| 16 | +tcp_services = "{ domain, ntp, smtp, www, https, ssh }" | |
| 17 | +udp_services = "{ domain, ntp }" | |
| 18 | + | |
| 19 | +# Skip all PF processing on loopback interface | |
| 20 | +set skip on lo | |
| 21 | + | |
| 22 | +# Log statistics on interface | |
| 23 | +set loginterface $ext_if | |
| 24 | + | |
| 25 | +# Packet normalization | |
| 26 | +scrub in all | |
| 27 | + | |
| 28 | +# Redirect http and https ports to 8080 and 8443, resp. | |
| 29 | +no rdr on $ext_if proto tcp from <bruteforce> to any | |
| 30 | +rdr on $ext_if proto tcp from any to any port 80 -> 127.0.0.1 port 8080 | |
| 31 | +rdr on $ext_if proto tcp from any to any port 443 -> 127.0.0.1 port 8443 | |
| 32 | + | |
| 33 | +# Default policy | |
| 34 | +#block return in log all | |
| 35 | +#block out all | |
| 36 | + | |
| 37 | +# Protect against spoofed or forget IP addresses | |
| 38 | +antispoof quick for $ext_if | |
| 39 | + | |
| 40 | +# Drop all Non-Routable Addresses | |
| 41 | +block drop in quick on $ext_if from $martians to any | |
| 42 | +block drop out quick on $ext_if from any to $martians | |
| 43 | + | |
| 44 | +# Protect against SSH attacks | |
| 45 | +block quick from <bruteforce> | |
| 46 | +pass quick proto { tcp, udp } from any to any port ssh \ | |
| 47 | + flags S/SA keep state \ | |
| 48 | + (max-src-conn 10, max-src-conn-rate 5/3, \ | |
| 49 | + overload <bruteforce> flush global) | |
| 50 | + | |
| 51 | +# Allow Ping | |
| 52 | +pass inet proto icmp icmp-type echoreq | |
| 53 | + | |
| 54 | +# Webserver | |
| 55 | +#pass proto tcp from any to $ext_if port $webports | |
| 56 | + | |
| 57 | +# Allow essential outgoing traffic | |
| 58 | +pass out quick on $ext_if proto tcp to any port $tcp_services | |
| 59 | +pass out quick on $ext_if proto udp to any port $udp_services | |
| 60 | + | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +zfs_enable="YES" | |
| 2 | +clear_tmp_enable="YES" | |
| 3 | +hostname="bit.xdi.uevora.pt" | |
| 4 | +ifconfig_em0="inet 193.137.120.198 netmask 255.255.255.192" | |
| 5 | +defaultrouter="193.137.120.254" | |
| 6 | +ifconfig_em0_ipv6="inet6 accept_rtadv" | |
| 7 | +sshd_enable="YES" | |
| 8 | +ntpd_enable="YES" | |
| 9 | +ntpd_sync_on_start="YES" | |
| 10 | +powerd_enable="NO" | |
| 11 | + | |
| 12 | +# pf firewall | |
| 13 | +pf_enable="YES" | |
| 14 | +#pf_flags="-T expire 86400" | |
| 15 | +pf_rules="/etc/pf.conf" | |
| 16 | +#pflog_enable="YES" | |
| 17 | +#pflog_flags="" | |
| 18 | +#pflog_logfile="/var/log/pflog" | |
| 19 | + | |
| 20 | +# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable | |
| 21 | +dumpdev="NO" | ... | ... |
package-lock.json
| ... | ... | @@ -1,39 +0,0 @@ |
| 1 | -{ | |
| 2 | - "name": "aprendizations", | |
| 3 | - "lockfileVersion": 2, | |
| 4 | - "requires": true, | |
| 5 | - "packages": { | |
| 6 | - "": { | |
| 7 | - "dependencies": { | |
| 8 | - "@fortawesome/fontawesome-free": "^5.15.3", | |
| 9 | - "codemirror": "^5.59.4" | |
| 10 | - } | |
| 11 | - }, | |
| 12 | - "node_modules/@fortawesome/fontawesome-free": { | |
| 13 | - "version": "5.15.4", | |
| 14 | - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", | |
| 15 | - "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", | |
| 16 | - "hasInstallScript": true, | |
| 17 | - "engines": { | |
| 18 | - "node": ">=6" | |
| 19 | - } | |
| 20 | - }, | |
| 21 | - "node_modules/codemirror": { | |
| 22 | - "version": "5.63.3", | |
| 23 | - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.3.tgz", | |
| 24 | - "integrity": "sha512-1C+LELr+5grgJYqwZKqxrcbPsHFHapVaVAloBsFBASbpLnQqLw1U8yXJ3gT5D+rhxIiSpo+kTqN+hQ+9ialIXw==" | |
| 25 | - } | |
| 26 | - }, | |
| 27 | - "dependencies": { | |
| 28 | - "@fortawesome/fontawesome-free": { | |
| 29 | - "version": "5.15.4", | |
| 30 | - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", | |
| 31 | - "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==" | |
| 32 | - }, | |
| 33 | - "codemirror": { | |
| 34 | - "version": "5.63.3", | |
| 35 | - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.3.tgz", | |
| 36 | - "integrity": "sha512-1C+LELr+5grgJYqwZKqxrcbPsHFHapVaVAloBsFBASbpLnQqLw1U8yXJ3gT5D+rhxIiSpo+kTqN+hQ+9ialIXw==" | |
| 37 | - } | |
| 38 | - } | |
| 39 | -} |