├── cp2 ├── ControlPanel │ ├── ControlPanel │ │ ├── __init__.py │ │ ├── forms.py │ │ ├── templatetags │ │ │ └── filters.py │ │ ├── wsgi.py │ │ └── utils.py │ ├── static_cp │ │ ├── images │ │ │ ├── favicon.ico │ │ │ ├── logout.icns │ │ │ ├── logout.png │ │ │ ├── IPOL-header-logo.png │ │ │ ├── flecheblanchedroite.png │ │ │ ├── flecheblanchegauche.png │ │ │ └── non_viewable_inputs.png │ │ ├── admin │ │ │ ├── fonts │ │ │ │ ├── Roboto-Bold-webfont.woff │ │ │ │ ├── Roboto-Light-webfont.woff │ │ │ │ ├── Roboto-Regular-webfont.woff │ │ │ │ └── README.txt │ │ │ ├── js │ │ │ │ ├── cancel.js │ │ │ │ ├── prepopulate.min.js │ │ │ │ ├── jquery.init.js │ │ │ │ ├── prepopulate_init.js │ │ │ │ ├── popup_response.js │ │ │ │ ├── vendor │ │ │ │ │ ├── select2 │ │ │ │ │ │ ├── i18n │ │ │ │ │ │ │ ├── zh-TW.js │ │ │ │ │ │ │ ├── zh-CN.js │ │ │ │ │ │ │ ├── az.js │ │ │ │ │ │ │ ├── fi.js │ │ │ │ │ │ │ ├── ja.js │ │ │ │ │ │ │ ├── hu.js │ │ │ │ │ │ │ ├── tr.js │ │ │ │ │ │ │ ├── ko.js │ │ │ │ │ │ │ ├── th.js │ │ │ │ │ │ │ ├── id.js │ │ │ │ │ │ │ ├── vi.js │ │ │ │ │ │ │ ├── is.js │ │ │ │ │ │ │ ├── ar.js │ │ │ │ │ │ │ ├── de.js │ │ │ │ │ │ │ ├── et.js │ │ │ │ │ │ │ ├── sv.js │ │ │ │ │ │ │ ├── bg.js │ │ │ │ │ │ │ ├── km.js │ │ │ │ │ │ │ ├── nb.js │ │ │ │ │ │ │ ├── ms.js │ │ │ │ │ │ │ ├── gl.js │ │ │ │ │ │ │ ├── da.js │ │ │ │ │ │ │ ├── en.js │ │ │ │ │ │ │ ├── he.js │ │ │ │ │ │ │ ├── hi.js │ │ │ │ │ │ │ ├── fa.js │ │ │ │ │ │ │ ├── hr.js │ │ │ │ │ │ │ ├── mk.js │ │ │ │ │ │ │ ├── eu.js │ │ │ │ │ │ │ ├── pt-BR.js │ │ │ │ │ │ │ ├── pt.js │ │ │ │ │ │ │ ├── lv.js │ │ │ │ │ │ │ ├── es.js │ │ │ │ │ │ │ ├── ca.js │ │ │ │ │ │ │ ├── it.js │ │ │ │ │ │ │ ├── fr.js │ │ │ │ │ │ │ ├── ro.js │ │ │ │ │ │ │ ├── nl.js │ │ │ │ │ │ │ ├── lt.js │ │ │ │ │ │ │ ├── pl.js │ │ │ │ │ │ │ ├── el.js │ │ │ │ │ │ │ ├── sr.js │ │ │ │ │ │ │ ├── uk.js │ │ │ │ │ │ │ ├── sr-Cyrl.js │ │ │ │ │ │ │ ├── ru.js │ │ │ │ │ │ │ ├── sk.js │ │ │ │ │ │ │ └── cs.js │ │ │ │ │ │ └── LICENSE-SELECT2.md │ │ │ │ │ ├── xregexp │ │ │ │ │ │ └── LICENSE-XREGEXP.txt │ │ │ │ │ └── jquery │ │ │ │ │ │ └── LICENSE-JQUERY.txt │ │ │ │ ├── change_form.js │ │ │ │ ├── collapse.js │ │ │ │ ├── autocomplete.js │ │ │ │ └── collapse.min.js │ │ │ ├── img │ │ │ │ ├── tooltag-arrowright.svg │ │ │ │ ├── README.txt │ │ │ │ ├── icon-addlink.svg │ │ │ │ ├── tooltag-add.svg │ │ │ │ ├── icon-changelink.svg │ │ │ │ ├── icon-deletelink.svg │ │ │ │ ├── icon-yes.svg │ │ │ │ ├── search.svg │ │ │ │ ├── icon-alert.svg │ │ │ │ ├── icon-no.svg │ │ │ │ ├── inline-delete.svg │ │ │ │ ├── icon-unknown.svg │ │ │ │ ├── icon-unknown-alt.svg │ │ │ │ ├── icon-clock.svg │ │ │ │ ├── gis │ │ │ │ │ ├── move_vertex_on.svg │ │ │ │ │ └── move_vertex_off.svg │ │ │ │ ├── icon-calendar.svg │ │ │ │ ├── calendar-icons.svg │ │ │ │ ├── LICENSE │ │ │ │ └── sorting-icons.svg │ │ │ └── css │ │ │ │ ├── fonts.css │ │ │ │ ├── dashboard.css │ │ │ │ ├── vendor │ │ │ │ └── select2 │ │ │ │ │ └── LICENSE-SELECT2.md │ │ │ │ └── login.css │ │ ├── js │ │ │ ├── archive.js │ │ │ └── ddl_history.js │ │ └── css │ │ │ ├── profile.css │ │ │ ├── reset.css │ │ │ └── archive.css │ ├── templates │ │ ├── empty.html │ │ ├── searchExperimentForm.html │ │ ├── signout.html │ │ ├── error.html │ │ ├── password │ │ │ ├── password_reset_complete.html │ │ │ ├── password_reset_email.txt │ │ │ ├── password_reset_confirm.html │ │ │ ├── password_reset_done.html │ │ │ └── password_reset.html │ │ ├── showExperiment.html │ │ ├── status.html │ │ ├── ddl_history.html │ │ ├── messages.html │ │ ├── header.html │ │ ├── login.html │ │ ├── detailsBlob.html │ │ ├── experiment.html │ │ ├── Templates.html │ │ └── createBlob.html │ └── manage.py ├── .gitignore ├── pyproject.toml └── gunicorn_start_cp2 ├── doc ├── info.txt ├── api │ ├── generate.sh │ └── api.tex ├── clientApp │ └── images │ │ ├── flow.pdf │ │ ├── execution_flow.pdf │ │ └── client_server_interaction.pdf ├── sysadmin │ ├── images │ │ ├── local.pdf │ │ └── prod_int.pdf │ └── resources │ │ ├── local.dia │ │ └── prod_int.dia ├── control_panel │ └── images │ │ ├── cp.png │ │ ├── admin.png │ │ ├── login.png │ │ └── ipol_webapp_project.png ├── ddl │ └── Images │ │ ├── label_example.png │ │ ├── text_example.png │ │ ├── checkbox_example.png │ │ ├── geojson_example.png │ │ ├── numeric_example.png │ │ ├── slider_examples.png │ │ ├── textarea_example.png │ │ ├── image_gallery_example.png │ │ ├── uploadwindow_capture.png │ │ ├── selection_radio_example.png │ │ └── selection_collapsed_example.png └── system │ ├── blobs │ └── images │ │ ├── blobs_database.pdf │ │ ├── blob_thumbnail_example.pdf │ │ ├── broken_representation.pdf │ │ └── visual_representation.pdf │ ├── proxy │ └── images │ │ └── reverse_proxy.pdf │ ├── demoinfo │ └── images │ │ └── demoinfo_model.pdf │ ├── resources │ ├── IPOL_diagram_class.dia │ ├── blobs │ │ └── blobs_database.dia │ ├── core │ │ └── core_dispatcher.dia │ ├── proxy │ │ └── reverse_proxy.dia │ ├── Example_Factory_Pattern.dia │ ├── graphviz.txt │ └── demo_info │ │ └── demoinfo_model.dot │ ├── architecture │ └── images │ │ └── architecture.pdf │ ├── dispatcher │ ├── images │ │ └── core_dispatcher.pdf │ └── .demo_dispatcher.tex.kate-swp │ ├── tools │ ├── tools.tex │ ├── ddl.tex │ └── demo_copy.tex │ ├── access_control │ └── access_control.tex │ └── user_scripts │ └── scripts.tex ├── sysadmin ├── systemd │ ├── .gitignore │ ├── Makefile │ ├── core │ │ ├── ipol-cp2.service │ │ ├── ipol-core.service │ │ ├── ipol-demorunner.service │ │ └── ipol-demorunner-docker.service │ ├── limule │ │ ├── ipol-sshfs-ipolcore.service │ │ ├── ipol-demorunner-docker.service │ │ └── ipol-demorunner-docker-gpu.service │ ├── integration │ │ ├── ipol-cp2.service │ │ ├── ipol-core.service │ │ ├── ipol-demorunner-docker.service │ │ └── ipol-demorunner.service │ └── green │ │ ├── ipol-demorunner.service │ │ └── ipol-sshfs-ipolcore.service ├── configs │ ├── crontab │ │ ├── integration_root.txt │ │ ├── core_root.txt │ │ ├── integration.txt │ │ └── core.txt │ ├── modules_local │ │ ├── core_local.conf │ │ └── demoinfo_local.conf │ ├── nginx │ │ ├── snippets │ │ │ ├── certificate.conf │ │ │ └── ssl-params.conf │ │ └── nginx.conf │ └── README.txt ├── check_shared_folder.sh ├── install_packages │ ├── Dockerfile │ ├── pip3-requirements.txt │ ├── install_dist_packages.sh │ ├── others.txt │ └── requirements.txt ├── cleanup.sh ├── backup │ ├── backup.sh │ └── backup_sync.sh ├── on_reboot.sh ├── doc │ └── purging_large_files_from_git.txt └── get_execs_statistics.py ├── ci_tests ├── ipolutils ├── requirements.txt ├── resources │ ├── test_image.png │ ├── test_video.mp4 │ └── test_demo_extras.tar.gz ├── published_codes_compilation_test.sh ├── pull.sh └── pdflatex.sh ├── ipol_demo ├── modules │ ├── core │ │ ├── ipolutils │ │ ├── blobs │ │ │ ├── ipolutils │ │ │ └── errors.py │ │ ├── conversion │ │ │ ├── ipolutils │ │ │ ├── errors.py │ │ │ └── router.py │ │ ├── tests │ │ │ └── pytest.ini │ │ ├── __init__.py │ │ ├── dispatcher │ │ │ ├── demorunnerinfo.py │ │ │ └── router.py │ │ ├── logger.py │ │ ├── app.py │ │ ├── pyproject.toml │ │ ├── demoinfo │ │ │ └── tools.py │ │ ├── archive │ │ │ └── db │ │ │ │ └── drop_create_db_schema.sql │ │ └── guards.py │ ├── demorunner │ │ ├── Tools │ │ │ ├── __init__.py │ │ │ └── PythonTools │ │ │ │ ├── frames_to_avi_huff.sh │ │ │ │ ├── website_mp4.sh │ │ │ │ ├── frames_to_mp4.sh │ │ │ │ └── get_video_fps.py │ │ ├── pyproject.toml │ │ └── Dockerfile │ ├── demorunner-docker │ │ ├── .gitignore │ │ ├── start.sh │ │ └── Rocket.toml │ └── config_common │ │ ├── authorized_patterns.conf.sample │ │ ├── emails.conf.sample │ │ └── envs │ │ ├── local0 │ │ ├── demorunners.xml │ │ └── modules.xml │ │ ├── local1 │ │ ├── demorunners.xml │ │ └── modules.xml │ │ ├── integration │ │ ├── demorunners.xml │ │ └── modules.xml │ │ └── prod │ │ └── modules.xml ├── lib │ └── ipolutils │ │ ├── __init__.py │ │ ├── video │ │ └── __init__.py │ │ ├── image │ │ └── __init__.py │ │ ├── evaluator │ │ └── __init__.py │ │ ├── errors.py │ │ └── read_text_file.py └── clientApp │ ├── assets │ ├── favicon.ico │ ├── Github-logo.png │ ├── information-icon.png │ ├── fontawesome-webfont.ttf │ ├── non_viewable_data.png │ ├── non_viewable_inputs.png │ ├── media-controls │ │ ├── play.svg │ │ ├── increase.svg │ │ ├── decrease.svg │ │ ├── pause.svg │ │ ├── stop.svg │ │ ├── loop.svg │ │ ├── step-forward-1.svg │ │ ├── step-forward-5.svg │ │ ├── step-backwards-5.svg │ │ └── step-backwards-1.svg │ └── file.svg │ ├── css │ ├── footer.css │ ├── tabs.css │ ├── reset.css │ ├── helpers.css │ └── inpainting.css │ ├── parameters.html │ ├── inpainting.html │ └── header.html ├── tools └── migrations │ └── rename_thumbnails.sh ├── .dockerignore ├── docker ├── migrations_cp.sh ├── Dockerfile ├── zsh_conf └── pkglist ├── pyproject.toml ├── README.md └── AUTHORS /cp2/ControlPanel/ControlPanel/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /doc/info.txt: -------------------------------------------------------------------------------- 1 | documentation directory 2 | -------------------------------------------------------------------------------- /sysadmin/systemd/.gitignore: -------------------------------------------------------------------------------- 1 | *.wants/ 2 | -------------------------------------------------------------------------------- /ci_tests/ipolutils: -------------------------------------------------------------------------------- 1 | ../ipol_demo/lib/ipolutils -------------------------------------------------------------------------------- /ipol_demo/modules/core/ipolutils: -------------------------------------------------------------------------------- 1 | ../../lib/ipolutils/ -------------------------------------------------------------------------------- /ipol_demo/modules/core/blobs/ipolutils: -------------------------------------------------------------------------------- 1 | ../../lib/ipolutils/ -------------------------------------------------------------------------------- /ci_tests/requirements.txt: -------------------------------------------------------------------------------- 1 | Pillow==9.3.0 2 | requests==2.22.0 3 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/conversion/ipolutils: -------------------------------------------------------------------------------- 1 | ../../../lib/ipolutils/ -------------------------------------------------------------------------------- /ipol_demo/modules/core/tests/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | pythonpath = .. -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | IPOL shared package. 3 | """ 4 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | IPOL demo app module 3 | """ 4 | -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/video/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | An IPOL video package 3 | """ 4 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Tools/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | IPOL demorunner app module 3 | """ 4 | -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/image/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | IPOL library, image conversions. 3 | """ 4 | -------------------------------------------------------------------------------- /doc/api/generate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ./docstring_scanner.py > docstrings.tex 3 | pdflatex api.tex 4 | -------------------------------------------------------------------------------- /doc/clientApp/images/flow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/clientApp/images/flow.pdf -------------------------------------------------------------------------------- /doc/sysadmin/images/local.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/sysadmin/images/local.pdf -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/evaluator/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | IPOL library, evaluator of arithmetic expressions. 3 | """ 4 | -------------------------------------------------------------------------------- /doc/control_panel/images/cp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/control_panel/images/cp.png -------------------------------------------------------------------------------- /doc/ddl/Images/label_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/label_example.png -------------------------------------------------------------------------------- /doc/ddl/Images/text_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/text_example.png -------------------------------------------------------------------------------- /doc/sysadmin/images/prod_int.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/sysadmin/images/prod_int.pdf -------------------------------------------------------------------------------- /doc/sysadmin/resources/local.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/sysadmin/resources/local.dia -------------------------------------------------------------------------------- /tools/migrations/rename_thumbnails.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | find . -name "thumbnail_*" -exec rename s/thumbnail_// * {} \; -------------------------------------------------------------------------------- /ci_tests/resources/test_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ci_tests/resources/test_image.png -------------------------------------------------------------------------------- /ci_tests/resources/test_video.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ci_tests/resources/test_video.mp4 -------------------------------------------------------------------------------- /cp2/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | __pycache__ 3 | share 4 | pyvenv.cfg 5 | lib 6 | lib64 7 | bin 8 | pip-selfcheck.json 9 | include -------------------------------------------------------------------------------- /doc/control_panel/images/admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/control_panel/images/admin.png -------------------------------------------------------------------------------- /doc/control_panel/images/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/control_panel/images/login.png -------------------------------------------------------------------------------- /doc/ddl/Images/checkbox_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/checkbox_example.png -------------------------------------------------------------------------------- /doc/ddl/Images/geojson_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/geojson_example.png -------------------------------------------------------------------------------- /doc/ddl/Images/numeric_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/numeric_example.png -------------------------------------------------------------------------------- /doc/ddl/Images/slider_examples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/slider_examples.png -------------------------------------------------------------------------------- /doc/ddl/Images/textarea_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/textarea_example.png -------------------------------------------------------------------------------- /doc/sysadmin/resources/prod_int.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/sysadmin/resources/prod_int.dia -------------------------------------------------------------------------------- /doc/clientApp/images/execution_flow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/clientApp/images/execution_flow.pdf -------------------------------------------------------------------------------- /doc/ddl/Images/image_gallery_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/image_gallery_example.png -------------------------------------------------------------------------------- /doc/ddl/Images/uploadwindow_capture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/uploadwindow_capture.png -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/favicon.ico -------------------------------------------------------------------------------- /ci_tests/resources/test_demo_extras.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ci_tests/resources/test_demo_extras.tar.gz -------------------------------------------------------------------------------- /doc/ddl/Images/selection_radio_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/selection_radio_example.png -------------------------------------------------------------------------------- /doc/system/blobs/images/blobs_database.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/blobs/images/blobs_database.pdf -------------------------------------------------------------------------------- /doc/system/proxy/images/reverse_proxy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/proxy/images/reverse_proxy.pdf -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/Github-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/Github-logo.png -------------------------------------------------------------------------------- /sysadmin/configs/crontab/integration_root.txt: -------------------------------------------------------------------------------- 1 | # m h dom mon dow command 2 | 0 3 * * 1 /home/ipol/ipolDevel/sysadmin/backup/backup.sh 3 | -------------------------------------------------------------------------------- /sysadmin/configs/modules_local/core_local.conf: -------------------------------------------------------------------------------- 1 | # cherrypy configuration for a local server 2 | 3 | [global] 4 | 5 | env = 'production' 6 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/favicon.ico -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/logout.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/logout.icns -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/logout.png -------------------------------------------------------------------------------- /doc/system/demoinfo/images/demoinfo_model.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/demoinfo/images/demoinfo_model.pdf -------------------------------------------------------------------------------- /doc/system/resources/IPOL_diagram_class.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/resources/IPOL_diagram_class.dia -------------------------------------------------------------------------------- /doc/system/resources/blobs/blobs_database.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/resources/blobs/blobs_database.dia -------------------------------------------------------------------------------- /doc/system/resources/core/core_dispatcher.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/resources/core/core_dispatcher.dia -------------------------------------------------------------------------------- /doc/system/resources/proxy/reverse_proxy.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/resources/proxy/reverse_proxy.dia -------------------------------------------------------------------------------- /sysadmin/configs/modules_local/demoinfo_local.conf: -------------------------------------------------------------------------------- 1 | # cherrypy configuration for a local server 2 | 3 | [global] 4 | 5 | env = 'production' 6 | -------------------------------------------------------------------------------- /doc/ddl/Images/selection_collapsed_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/ddl/Images/selection_collapsed_example.png -------------------------------------------------------------------------------- /doc/system/architecture/images/architecture.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/architecture/images/architecture.pdf -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/information-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/information-icon.png -------------------------------------------------------------------------------- /doc/clientApp/images/client_server_interaction.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/clientApp/images/client_server_interaction.pdf -------------------------------------------------------------------------------- /doc/control_panel/images/ipol_webapp_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/control_panel/images/ipol_webapp_project.png -------------------------------------------------------------------------------- /doc/system/blobs/images/blob_thumbnail_example.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/blobs/images/blob_thumbnail_example.pdf -------------------------------------------------------------------------------- /doc/system/blobs/images/broken_representation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/blobs/images/broken_representation.pdf -------------------------------------------------------------------------------- /doc/system/blobs/images/visual_representation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/blobs/images/visual_representation.pdf -------------------------------------------------------------------------------- /doc/system/dispatcher/images/core_dispatcher.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/dispatcher/images/core_dispatcher.pdf -------------------------------------------------------------------------------- /doc/system/resources/Example_Factory_Pattern.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/resources/Example_Factory_Pattern.dia -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/non_viewable_data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/non_viewable_data.png -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/non_viewable_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/ipol_demo/clientApp/assets/non_viewable_inputs.png -------------------------------------------------------------------------------- /sysadmin/configs/crontab/core_root.txt: -------------------------------------------------------------------------------- 1 | 0 3 * * 1 /home/ipol/ipolDevel/sysadmin/backup/backup.sh 2 | @reboot /home/ipol/ipolDevel/sysadmin/on_reboot.sh 3 | -------------------------------------------------------------------------------- /sysadmin/configs/nginx/snippets/certificate.conf: -------------------------------------------------------------------------------- 1 | ssl_certificate /etc/ssl/certs/ssl-bundle.crt; 2 | ssl_certificate_key /etc/ssl/private/server.key; 3 | 4 | -------------------------------------------------------------------------------- /doc/system/dispatcher/.demo_dispatcher.tex.kate-swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/doc/system/dispatcher/.demo_dispatcher.tex.kate-swp -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/IPOL-header-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/IPOL-header-logo.png -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/flecheblanchedroite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/flecheblanchedroite.png -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/flecheblanchegauche.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/flecheblanchegauche.png -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/images/non_viewable_inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/images/non_viewable_inputs.png -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner-docker/.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | target 3 | .crates.toml 4 | .crates2.json 5 | 6 | logs 7 | compilation 8 | id_ed25519 9 | id_ed25519.pub 10 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/authorized_patterns.conf.sample: -------------------------------------------------------------------------------- 1 | [Patterns] 2 | local = 127.*.*.* 3 | lan = 192.168.*.* 4 | integration = 99.99.99.* 5 | production = 123.123.123.* 6 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ipol-journal/ipolDevel/HEAD/cp2/ControlPanel/static_cp/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/empty.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

There are no {{item}} yet, add some.

4 |
-------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/fonts/README.txt: -------------------------------------------------------------------------------- 1 | Roboto webfont source: https://www.google.com/fonts/specimen/Roboto 2 | Weights used in this project: Light (300), Regular (400), Bold (700) 3 | -------------------------------------------------------------------------------- /sysadmin/configs/crontab/integration.txt: -------------------------------------------------------------------------------- 1 | # m h dom mon dow command 2 | 0 5 * * 1 /home/ipol/ipolDevel/sysadmin/cleanup.sh > /dev/null 3 | 0 15 * * 2 /home/ipol/ipolDevel/ci_tests/pdflatex.sh 4 | 30 10 * * * /home/ipol/ipolDevel/ci_tests/pull.sh > /dev/null 5 | -------------------------------------------------------------------------------- /doc/system/resources/graphviz.txt: -------------------------------------------------------------------------------- 1 | To graphviz to create diagrams with a textual description (.dot files) and then 2 | convert them to PDF. 3 | The .dot files are in the resources/ folder. 4 | 5 | An example: 6 | dot -Tpdf demoinfo_model.dot -o demoinfo_model.pdf 7 | -------------------------------------------------------------------------------- /sysadmin/check_shared_folder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sharedFolder="/home/ipol/ipolDevel/shared_folder" 4 | 5 | if [ $(mount | grep -c shared_folder) -eq 0 ];then 6 | sshfs ipol_core:$sharedFolder $sharedFolder -o uid=$(id -u ipol),gid=$(id -g ipol) 7 | fi 8 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/dispatcher/demorunnerinfo.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | 3 | 4 | @dataclass 5 | class DemoRunnerInfo: 6 | """ 7 | Demorunner information object 8 | """ 9 | 10 | name: str 11 | capabilities: list[str] 12 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/play.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sysadmin/configs/crontab/core.txt: -------------------------------------------------------------------------------- 1 | # m h dom mon dow command 2 | 30 10 * * * /home/ipol/ipolDevel/ci_tests/pull.sh > /dev/null 3 | 0 5 * * 1 /home/ipol/ipolDevel/sysadmin/cleanup.sh > /dev/null 4 | 0 11 * * * /home/ipol/ipolDevel/ci_tests/published_codes_compilation_test.sh 5 | -------------------------------------------------------------------------------- /sysadmin/systemd/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | mkdir -p ${HOME}/.config/systemd/ 3 | rm ${HOME}/.config/systemd/user || true 4 | ln -s $(shell pwd)/$(shell hostname) ${HOME}/.config/systemd/user 5 | systemctl --user daemon-reload 6 | 7 | restart: all 8 | systemctl --user restart ipol-'*' --all 9 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/cancel.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | $(function() { 4 | $('.cancel-link').click(function(e) { 5 | e.preventDefault(); 6 | window.history.back(); 7 | }); 8 | }); 9 | })(django.jQuery); 10 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/emails.conf.sample: -------------------------------------------------------------------------------- 1 | [sender] 2 | name = "Journal demo system" 3 | email = noreply@example.com 4 | 5 | [tech] 6 | name = "Journal Technical staff" 7 | email = tech@example.com 8 | 9 | [edit] 10 | name = "Journal Editorial staff" 11 | email = edit@example.com 12 | -------------------------------------------------------------------------------- /sysadmin/install_packages/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye 2 | 3 | COPY . /w 4 | RUN cd /w && bash install_dist_packages.sh && rm -rf /var/lib/apt/lists/* && cd && rm -r /w 5 | 6 | # to build: 7 | # DOCKER_BUILDKIT=1 docker build sysadmin/install_packages/ -t registry.ipol.im/ipol-debian 8 | # docker push 9 | -------------------------------------------------------------------------------- /sysadmin/install_packages/pip3-requirements.txt: -------------------------------------------------------------------------------- 1 | # install requirements for IPOL project 2 | # pip3 install -r "pip3-requirements.txt" 3 | 4 | # General 5 | requests 6 | opencv-python 7 | scikit-image 8 | virtualenv 9 | python-magic 10 | 11 | # For the DR venv 12 | scipy 13 | tensorflow 14 | joblib 15 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Modules static folders in build phase 2 | ipol_demo/modules/*/venv 3 | # virtualenv tests 4 | ipol_demo/modules/*/venv2 5 | ipol_demo/modules/*/staticData 6 | ipol_demo/modules/*/logs 7 | ipol_demo/modules/*/static 8 | ipol_demo/modules/*/binaries 9 | 10 | .git 11 | .vscode 12 | doc 13 | shared_folder -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/errors.py: -------------------------------------------------------------------------------- 1 | """ 2 | Lib errors 3 | """ 4 | 5 | 6 | class IPOLConvertInputError(Exception): 7 | """ 8 | IPOLConvertInputError 9 | """ 10 | 11 | pass 12 | 13 | 14 | class IPOLImageReadError(Exception): 15 | """ 16 | IPOLImageReadError 17 | """ 18 | 19 | pass 20 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/ControlPanel/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class loginForm(forms.Form): 5 | username = forms.CharField( 6 | widget=forms.TextInput(attrs={"placeholder": "Username"}) 7 | ) 8 | password = forms.CharField( 9 | widget=forms.PasswordInput(attrs={"placeholder": "Password"}) 10 | ) 11 | -------------------------------------------------------------------------------- /sysadmin/configs/README.txt: -------------------------------------------------------------------------------- 1 | This directory contains samples of configuration files for the 2 | programs used in the servers, such as nginx and others. 3 | 4 | - nginx/default 5 | You only have to copy it to /etc/nginx/sites-availables/ and change the variable "$my_user" to your user. 6 | You can execute locally the 'whoami' command to know which is your user. 7 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/increase.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/css/footer.css: -------------------------------------------------------------------------------- 1 | footer { 2 | font-size: 12px; 3 | 4 | text-decoration: none; 5 | 6 | color: #555; 7 | } 8 | 9 | footer a:hover { 10 | color: #5B4BA6; 11 | } 12 | 13 | .footer-line a span { 14 | font-weight: bold; 15 | 16 | color: #000; 17 | } 18 | 19 | footer p { 20 | font-size: 12px; 21 | 22 | margin: 0 auto; 23 | } 24 | -------------------------------------------------------------------------------- /sysadmin/cleanup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Very simple script to clean temporal run directories 4 | # Miguel Colom, 2016 5 | BASE="/home/ipol/ipolDevel/shared_folder/run/" 6 | 7 | find ${BASE} -maxdepth 2 -ctime +30 -type d -exec rm -rf {} \; 8 | 9 | # Remove demo directories without any executions 10 | find ${BASE} -maxdepth 1 -type d -empty -exec rm -rf {} \; 11 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/README.txt: -------------------------------------------------------------------------------- 1 | All icons are taken from Font Awesome (http://fontawesome.io/) project. 2 | The Font Awesome font is licensed under the SIL OFL 1.1: 3 | - http://scripts.sil.org/OFL 4 | 5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG 6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license 7 | in current folder). 8 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/searchExperimentForm.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 |
7 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/parameters.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Parameters

5 | information icon 6 |
7 |
8 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /doc/system/resources/demo_info/demoinfo_model.dot: -------------------------------------------------------------------------------- 1 | digraph { 2 | node [shape=box style=filled] 3 | demo [shape=box style="bold, filled"] 4 | 5 | state -> demo 6 | 7 | demo -> demo_demodescription 8 | demodescription -> demo_demodescription 9 | 10 | editor -> demo_editor 11 | demo -> demo_editor 12 | 13 | author -> demo_author 14 | demo -> demo_author 15 | } 16 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/conversion/errors.py: -------------------------------------------------------------------------------- 1 | """ 2 | Conversion errors 3 | """ 4 | 5 | 6 | class IPOLCropInputError(Exception): 7 | """ 8 | IPOLCropInputError 9 | """ 10 | 11 | 12 | class IPOLConvertInputError(Exception): 13 | """ 14 | IPOLConvertInputError 15 | """ 16 | 17 | 18 | class IPOLThumbnailError(OSError): 19 | """ 20 | IPOLThumbnailError 21 | """ 22 | -------------------------------------------------------------------------------- /cp2/ControlPanel/ControlPanel/templatetags/filters.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from django.template import Library 4 | 5 | register = Library() 6 | 7 | 8 | @register.filter(expects_localtime=True) 9 | def parse_iso(value): 10 | try: 11 | return datetime.strptime(value, "%Y-%m-%d %H:%M:%S.%f") 12 | except Exception: 13 | return datetime.strptime(value, "%Y-%m-%d %H:%M:%S") 14 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/prepopulate.min.js: -------------------------------------------------------------------------------- 1 | (function(c){c.fn.prepopulate=function(e,f,g){return this.each(function(){var a=c(this),b=function(){if(!a.data("_changed")){var b=[];c.each(e,function(a,d){d=c(d);0 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global django:true, jQuery:false*/ 2 | /* Puts the included jQuery into our own namespace using noConflict and passing 3 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 4 | * namespace (i.e. this preserves pre-existing values for both window.$ and 5 | * window.jQuery). 6 | */ 7 | var django = django || {}; 8 | django.jQuery = jQuery.noConflict(true); 9 | -------------------------------------------------------------------------------- /cp2/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "cp2" 3 | version = "0.1.0" 4 | description = "IPOL CP" 5 | readme = "README.md" 6 | requires-python = "==3.12.*" 7 | dependencies = [ 8 | "certifi==2025.10.5", 9 | "chardet==3.0.4", 10 | "django==4.2.26", 11 | "django-utils-six==2.0", 12 | "gunicorn==23.0.0", 13 | "idna==3.11", 14 | "pytz==2018.4", 15 | "requests==2.32.5", 16 | "urllib3>=2.5.0", 17 | ] 18 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/signout.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}Logout{% endblock %} {% block bodyid %}Logout{% endblock %} 2 | {% block header %} 3 | {% include "header.html" %} 4 | {% endblock %} {% block content %} 5 |
6 |

Sign Out

7 |

Are you sure you want to sign out?

8 | Sign Out 9 |
10 | {% endblock %} -------------------------------------------------------------------------------- /sysadmin/systemd/core/ipol-cp2.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run cp2 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/bin/bash -c "~/.local/bin/uv run ./gunicorn_start_cp2" 7 | WorkingDirectory=/home/ipol/ipolDevel/cp2/ 8 | Environment=IPOL_HOST=ipolcore.ipol.im 9 | Environment=IPOL_URL=https://ipolcore.ipol.im 10 | RestartSec=10 11 | Restart=always 12 | SyslogIdentifier=ipol-cp2 13 | 14 | [Install] 15 | WantedBy=default.target 16 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /sysadmin/install_packages/install_dist_packages.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | apt-get update 4 | 5 | while IFS='' read -r line || [[ -n "$line" ]]; do 6 | # Remove commented lines 7 | [[ "$line" =~ ^#.*$ ]] && continue 8 | # Remove lines with spaces 9 | [[ "$line" =~ ^' '*$ ]] && continue 10 | # Remove empty lines 11 | [[ "$line" == '' ]] && continue 12 | apt-get -y install "$line" 13 | done < "apt-get_requirements.txt" 14 | -------------------------------------------------------------------------------- /sysadmin/systemd/limule/ipol-sshfs-ipolcore.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=sshfs from limule to ipolcore 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/usr/bin/sshfs 10.0.0.1:/home/ipol/ipolDevel/shared_folder /home/ipol/ipolDevel/shared_folder -f -o uid=1005,gid=1005,allow_other,reconnect 7 | ExecStopPost=/usr/bin/fusermount -u /home/ipol/ipolDevel/shared_folder 8 | RestartSec=20 9 | Restart=always 10 | 11 | [Install] 12 | WantedBy=default.target 13 | 14 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/conversion/router.py: -------------------------------------------------------------------------------- 1 | from config import settings 2 | from fastapi import APIRouter 3 | 4 | conversionRouter = APIRouter(prefix="/conversion") 5 | 6 | 7 | @conversionRouter.post("/convert_tiff_to_png", status_code=201) 8 | def convert_tiff_to_png(base64_img: str): 9 | """ 10 | Converts the input TIFF to PNG. 11 | This is used by the web interface for visualization purposes 12 | """ 13 | return settings.converter.convert_tiff_to_png(base64_img) 14 | -------------------------------------------------------------------------------- /sysadmin/systemd/integration/ipol-cp2.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run cp2 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/bin/bash -c "~/.local/bin/uv run ./gunicorn_start_cp2" 7 | WorkingDirectory=/home/integration/ipolDevel/cp2/ 8 | Environment=IPOL_HOST=integration.ipol.im 9 | Environment=IPOL_URL=https://integration.ipol.im 10 | Environment=CP2_PORT=10002 11 | RestartSec=10 12 | Restart=always 13 | SyslogIdentifier=ipol-cp2 14 | 15 | [Install] 16 | WantedBy=default.target 17 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/ControlPanel/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for ControlPanel project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ControlPanel.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /doc/system/tools/tools.tex: -------------------------------------------------------------------------------- 1 | \section{System tools} 2 | This section describes the tools available for system administrators, developers, and editors to interact with the IPOL system. Some of their capabilities might clash with the Control Panel (for example, reading and modifying the DDL of the demos in the case of the DDL tool, Sec. \ref{sec:ddl_tool}), but they are useful to perform massive changes or to automatize tasks. 3 | 4 | \input{tools/terminal.tex} 5 | \input{tools/ddl.tex} 6 | \input{tools/demo_copy.tex} 7 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/blobs/errors.py: -------------------------------------------------------------------------------- 1 | """ 2 | Blobs errors 3 | """ 4 | 5 | 6 | class IPOLBlobsTemplateError(Exception): 7 | """ 8 | IPOLBlobsTemplateError 9 | """ 10 | 11 | 12 | class IPOLBlobsThumbnailError(Exception): 13 | """ 14 | IPOLBlobsThumbnailError 15 | """ 16 | 17 | 18 | class IPOLBlobsDataBaseError(Exception): 19 | """ 20 | IPOLBlobsDataBaseError 21 | """ 22 | 23 | 24 | class IPOLRemoveDirError(Exception): 25 | """ 26 | IPOLRemoveDirError 27 | """ 28 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/decrease.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/error.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}createBlob{% endblock %} {% block bodyid %}createBlob{% endblock %} 2 | 3 | {% block header %} 4 | {% include "header.html" %} 5 | {% endblock %} {% block content %} 6 |
7 |

Error {{error_code}}

8 |

The resource you were looking for is not found

9 | {% if message %} 10 |

{{message}}

11 | {% endif %} 12 |
13 | 14 | {% endblock %} -------------------------------------------------------------------------------- /docker/migrations_cp.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd /home/ipol/ipolDevel/ipol_webapp && \ 3 | python manage.py makemigrations --empty controlpanel && \ 4 | python manage.py makemigrations controlpanel && \ 5 | python manage.py migrate controlpanel && \ 6 | python manage.py migrate && \ 7 | python manage.py collectstatic 8 | 9 | cd /home/ipol/ipolDevel/cp2 && \ 10 | python3.9 -m virtualenv cp2 && \ 11 | source cp2/bin/activate && \ 12 | pip3 install -r requirements.txt && \ 13 | cd ControlPanel && python3 manage.py migrate && deactivate -------------------------------------------------------------------------------- /sysadmin/install_packages/others.txt: -------------------------------------------------------------------------------- 1 | This file documents which programs are installed in the servers (say, 2 | needed by some workshops), but their installation procedure is not 3 | standard. 4 | 5 | Pytorch - https://pytorch.org/ 6 | pip3 install http://download.pytorch.org/whl/cpu/torch-0.4.0-cp35-cp35m-linux_x86_64.whl 7 | pip3 install torchvision 8 | 9 | It's imported as import torch 10 | 11 | ------------------------------------------------------------------------------------------------------------------------------ 12 | -------------------------------------------------------------------------------- /sysadmin/systemd/core/ipol-core.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run core 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/bin/bash -c "~/.local/bin/uv run uvicorn app:app --host 127.0.0.1 --port 8080 --workers 20" 7 | WorkingDirectory=/home/ipol/ipolDevel/ipol_demo/modules/core/ 8 | Environment=IPOL_HOST=ipolcore.ipol.im 9 | Environment=IPOL_URL=https://ipolcore.ipol.im 10 | Environment=env=production 11 | RestartSec=10 12 | Restart=always 13 | SyslogIdentifier=ipol-core 14 | 15 | [Install] 16 | WantedBy=default.target 17 | -------------------------------------------------------------------------------- /sysadmin/systemd/green/ipol-demorunner.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run demorunner 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/bin/bash -c "~/.local/bin/uv run uvicorn demorunner:app --host 0.0.0.0 --port 9004 --workers 10" 7 | WorkingDirectory=/home/ipol/ipolDevel/ipol_demo/modules/demorunner/ 8 | Environment=IPOL_HOST=ipolcore.ipol.im 9 | Environment=IPOL_URL=https://ipolcore.ipol.im 10 | RestartSec=10 11 | Restart=always 12 | SyslogIdentifier=ipol-demorunner 13 | 14 | [Install] 15 | WantedBy=default.target 16 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/css/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Roboto'; 3 | src: url('../fonts/Roboto-Bold-webfont.woff'); 4 | font-weight: 700; 5 | font-style: normal; 6 | } 7 | 8 | @font-face { 9 | font-family: 'Roboto'; 10 | src: url('../fonts/Roboto-Regular-webfont.woff'); 11 | font-weight: 400; 12 | font-style: normal; 13 | } 14 | 15 | @font-face { 16 | font-family: 'Roboto'; 17 | src: url('../fonts/Roboto-Light-webfont.woff'); 18 | font-weight: 300; 19 | font-style: normal; 20 | } 21 | -------------------------------------------------------------------------------- /sysadmin/systemd/integration/ipol-core.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run core 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/bin/bash -c "~/.local/bin/uv run uvicorn app:app --host 127.0.0.1 --port 10080 --workers 8" 7 | WorkingDirectory=/home/integration/ipolDevel/ipol_demo/modules/core/ 8 | Environment=IPOL_HOST=integration.ipol.im 9 | Environment=IPOL_URL=https://integration.ipol.im 10 | Environment=env=integration 11 | RestartSec=10 12 | Restart=always 13 | SyslogIdentifier=ipol-core 14 | 15 | [Install] 16 | WantedBy=default.target 17 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/pause.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sysadmin/systemd/green/ipol-sshfs-ipolcore.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=sshfs from green to ipolcore 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/nix/var/nix/profiles/default/bin/nix run nixpkgs#sshfs -- ipolcore.ipol.im:/home/ipol/ipolDevel/shared_folder /home/ipol/ipolDevel/shared_folder -f -o uid=1008,gid=1008,allow_other,reconnect 7 | ExecStopPost=/nix/var/nix/profiles/default/bin/nix shell nixpkgs#fuse -c fusermount -u /home/ipol/ipolDevel/shared_folder 8 | RestartSec=20 9 | Restart=always 10 | 11 | [Install] 12 | WantedBy=default.target 13 | 14 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/stop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ci_tests/published_codes_compilation_test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | host=$(hostname) 4 | today=$(date) 5 | 6 | function send_email () { 7 | msg="$*" 8 | sendTo=$(cat /home/ipol/ipolDevel/ci_tests/send_to.txt) 9 | echo -e "This is the ${host} machine. The compilation tests failed on ${today}:\n${msg}" | mutt -s "[${host}] Compilation failed" -- ${sendTo} 10 | } 11 | 12 | ci_tests_dir=/home/ipol/ipolDevel/ci_tests 13 | 14 | out=$(python3 ${ci_tests_dir}/published_codes_compilation_test.py) 15 | if [ $? -ne 0 ];then 16 | send_email "$out" 17 | fi 18 | 19 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* DASHBOARD */ 2 | 3 | .dashboard .module table th { 4 | width: 100%; 5 | } 6 | 7 | .dashboard .module table td { 8 | white-space: nowrap; 9 | } 10 | 11 | .dashboard .module table td a { 12 | display: block; 13 | padding-right: .6em; 14 | } 15 | 16 | /* RECENT ACTIONS MODULE */ 17 | 18 | .module ul.actionlist { 19 | margin-left: 0; 20 | } 21 | 22 | ul.actionlist li { 23 | list-style-type: none; 24 | overflow: hidden; 25 | text-overflow: ellipsis; 26 | -o-text-overflow: ellipsis; 27 | } 28 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/prepopulate_init.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields'); 4 | $.each(fields, function(index, field) { 5 | $('.empty-form .form-row .field-' + field.name + ', .empty-form.form-row .field-' + field.name).addClass('prepopulated_field'); 6 | $(field.id).data('dependency_list', field.dependency_list).prepopulate( 7 | field.dependency_ids, field.maxLength, field.allowUnicode 8 | ); 9 | }); 10 | })(django.jQuery); 11 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/password/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load filters %} 3 | {% block title %}Password recovery{% endblock %} 4 | {% block bodyid %}password-reset{% endblock %} 5 | {% block content %} 6 | 7 | 15 | 16 | {% endblock %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/logger.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | 4 | def init_logging(): 5 | """ 6 | Initialize the error logs of the module. 7 | """ 8 | logger = logging.getLogger("core") 9 | 10 | logger.setLevel(logging.DEBUG) 11 | handler = logging.StreamHandler() 12 | formatter = logging.Formatter( 13 | "%(asctime)s; [%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s", 14 | datefmt="%Y-%m-%d %H:%M:%S", 15 | ) 16 | handler.setFormatter(formatter) 17 | 18 | logger.addHandler(handler) 19 | return logger 20 | 21 | 22 | logger = init_logging() 23 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/app.py: -------------------------------------------------------------------------------- 1 | from archive.router import archiveRouter 2 | from blobs.router import blobsRouter 3 | from conversion.router import conversionRouter 4 | from core.router import coreRouter 5 | from demoinfo.router import demoinfoRouter 6 | from dispatcher.router import dispatcherRouter 7 | from fastapi import FastAPI 8 | 9 | app = FastAPI(root_path="/api") 10 | 11 | 12 | app.include_router(coreRouter) 13 | app.include_router(demoinfoRouter) 14 | app.include_router(dispatcherRouter) 15 | app.include_router(conversionRouter) 16 | app.include_router(archiveRouter) 17 | app.include_router(blobsRouter) 18 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "python-demorunner" 3 | version = "0.1.0" 4 | description = "Ipol python demorunner module" 5 | readme = "README.md" 6 | requires-python = "==3.9.*" 7 | dependencies = [ 8 | "cycler==0.10.0", 9 | "fastapi==0.97.0", 10 | "matplotlib==3.4.3", 11 | "numpy==2.0.0", 12 | "opencv-python==4.12.0.88", 13 | "pillow==11.3.0", 14 | "psutil==5.9.5", 15 | "pydantic==1.10.9", 16 | "python-magic==0.4.27", 17 | "python-multipart==0.0.19", 18 | "requests==2.32.5", 19 | "uvicorn==0.22.0", 20 | "virtualenv==20.26.6", 21 | ] 22 | -------------------------------------------------------------------------------- /cp2/ControlPanel/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ControlPanel.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/local0/demorunners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | start 6 | stop 7 | restart 8 | ping 9 | 10 | 11 | 12 | 13 | demorunner 14 | http://127.0.0.1/ 15 | DEBIAN_STABLE 16 | 17 | localhost 18 | ~/ipolDevel/ipol_demo/modules/demorunner/ 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/local1/demorunners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | start 6 | stop 7 | restart 8 | ping 9 | 10 | 11 | 12 | 13 | demorunner 14 | http://127.0.1.1/ 15 | DEBIAN_STABLE 16 | 17 | localhost 18 | ~/ipolDevel/ipol_demo/modules/demorunner/ 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/password/password_reset_email.txt: -------------------------------------------------------------------------------- 1 | {% autoescape off %} 2 | Hello, 3 | 4 | We received a request to reset the password for your account for this email address. To initiate the password reset process for your account, click the link below. 5 | 6 | {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %} 7 | 8 | This link can only be used once. If you need to reset your password again, please visit {{ protocol }}://{{domain}} and request another reset. 9 | 10 | If you did not make this request, you can simply ignore this email. 11 | 12 | Sincerely, 13 | The IPOL Team 14 | 15 | {% endautoescape %} -------------------------------------------------------------------------------- /doc/system/tools/ddl.tex: -------------------------------------------------------------------------------- 1 | \subsection{DDL tool} 2 | \label{sec:ddl_tool} 3 | Tool allows to read and write the DDLs of each demo. There are three functionalities for this script: 4 | \begin{itemize} 5 | 6 | \item Read the specified demos: 7 | \texttt{./ddl.py read \dots} 8 | 9 | or 10 | 11 | \texttt{./ddl.py get \dots} 12 | 13 | \item Read all the demos: 14 | 15 | \texttt{./ddl.py readall} 16 | 17 | or 18 | 19 | \texttt{./ddl.py getall} 20 | 21 | \item Write the specified demos: 22 | 23 | \texttt{./ddl.py write \dots} 24 | 25 | or 26 | 27 | \texttt{./ddl.py put \dots} 28 | 29 | \end{itemize} 30 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM registry.ipol.im/ipol-debian 2 | 3 | # Install uv 4 | COPY --from=ghcr.io/astral-sh/uv:0.8.4 /uv /uvx /bin/ 5 | 6 | COPY pyproject.toml . 7 | COPY uv.lock . 8 | 9 | RUN uv sync --locked 10 | 11 | # needed since the DR raises exception when this is not defined 12 | # this is probably a bug 13 | ENV VIRTUAL_ENV= 14 | 15 | # give all permissions to /home/ipol in case a demo has to use ~/.cache or something else 16 | RUN mkdir -p /home/ipol && chmod -R 777 /home/ipol 17 | 18 | # to build: 19 | # DOCKER_BUILDKIT=1 docker build ipol_demo/modules/demorunner -t registry.ipol.im/ipol-debian-demorunner 20 | # docker push 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/password/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load filters %} 3 | {% block title %}Password recovery{% endblock %} 4 | {% block bodyid %}password-reset{% endblock %} 5 | {% block content %} 6 | 7 | 18 | 19 | {% endblock %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/popup_response.js: -------------------------------------------------------------------------------- 1 | /*global opener */ 2 | (function() { 3 | 'use strict'; 4 | var initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); 5 | switch(initData.action) { 6 | case 'change': 7 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value); 8 | break; 9 | case 'delete': 10 | opener.dismissDeleteRelatedObjectPopup(window, initData.value); 11 | break; 12 | default: 13 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj); 14 | break; 15 | } 16 | })(); 17 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | target_version = ['py39'] 3 | 4 | [tool.isort] 5 | profile = "black" 6 | py_version = 39 7 | 8 | [tool.ruff] 9 | ignore = [ 10 | # because of cp2/ControlPanel/ControlPanel/urls.py 11 | "F405", 12 | "F403", 13 | # because we don't package the modules, so we have to do bad things with sys.path 14 | "E402", 15 | ] 16 | 17 | exclude = [ 18 | # unmaintained scripts 19 | "tools/migrations/", 20 | "sysadmin/", 21 | # python 2 22 | "ipol_demo/modules/demorunner/Tools/PythonTools/ply2obj.py", 23 | ] 24 | 25 | # for now we don't force black formatting 26 | # once we do, we can remove this line 27 | line-length = 200 28 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/password/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load filters %} 3 | {% block title %}Password recovery{% endblock %} 4 | {% block bodyid %}password-reset{% endblock %} 5 | {% block content %} 6 | 7 | 15 | 16 | {% endblock %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner-docker/start.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eux 4 | 5 | SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" 6 | cd $SCRIPTPATH 7 | 8 | if [ -f $HOME/.cargo/env ]; then 9 | source $HOME/.cargo/env 10 | fi 11 | 12 | if ! command -v cargo &> /dev/null; then 13 | echo "cargo is required to launch demorunner-docker" >&2 14 | echo "see https://rustup.rs/" >&2 15 | exit 1 16 | fi 17 | 18 | cargo install --git https://github.com/ipol-journal/ipol-demorunner.git --rev ee2039a8980d199e15cb4f59970c63c335d8c743 --root . --target-dir target --debug --force --locked 19 | 20 | export ROCKET_PROFILE=ipol-$(hostname) 21 | bin/ipol-demorunner >logs 2>&1 & 22 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/zh-CN.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/az.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /ipol_demo/modules/core/dispatcher/router.py: -------------------------------------------------------------------------------- 1 | from config import settings 2 | from dispatcher import dispatcher 3 | from fastapi import APIRouter 4 | 5 | dispatcherRouter = APIRouter(prefix="/dispatcher") 6 | dispatcher = dispatcher.Dispatcher( 7 | workload_provider=dispatcher.APIWorkloadProvider(settings.base_url), 8 | ping_provider=dispatcher.APIPingProvider(settings.base_url), 9 | demorunners=dispatcher.parse_demorunners(settings.demorunners_path), 10 | policy=dispatcher.make_policy(settings.policy), 11 | ) 12 | 13 | 14 | @dispatcherRouter.get("/stats", status_code=200) 15 | def get_demorunners_stats(): 16 | """ 17 | Get workload of all DRs. 18 | """ 19 | return dispatcher.get_demorunners_stats() 20 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/fi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ja.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/hu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/tr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /ipol_demo/modules/core/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "core" 3 | version = "0.1.0" 4 | description = "Ipol Core module" 5 | readme = "README.md" 6 | requires-python = "==3.13.*" 7 | dependencies = [ 8 | "cryptography==46.0.0", 9 | "fastapi==0.123.0", 10 | "imagecodecs==2025.11.11", 11 | "imageio==2.9.0", 12 | "lxml==6.0.2", 13 | "numpy==2.2.6", 14 | "opencv-python==4.12.0.88", 15 | "pillow==11.0.0", 16 | "pydantic==2.12.4", 17 | "pydantic-settings>=2.12.0", 18 | "python-magic==0.4.24", 19 | "python-multipart==0.0.19", 20 | "requests==2.32.5", 21 | "result==0.8.0", 22 | "tifffile==2025.1.10", 23 | "uvicorn==0.38.0", 24 | ] 25 | 26 | [dependency-groups] 27 | dev = [ 28 | "pytest>=9.0.1", 29 | ] -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ko.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/th.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/js/archive.js: -------------------------------------------------------------------------------- 1 | let demo_id = getParameterByName('demo_id'); 2 | var csrftoken = getCookie('csrftoken'); 3 | 4 | 5 | $(".experiment-info>button.btn-danger").click(function (element) { 6 | let experiment_id = $(this).attr('data-id'); 7 | 8 | $.ajax({ 9 | data: ({ 10 | demo_id: demo_id, 11 | experiment_id: experiment_id, 12 | csrfmiddlewaretoken: csrftoken, 13 | }), 14 | dataType: 'json', 15 | type: 'POST', 16 | url: 'ajax_delete_experiment', 17 | success: function(data) { 18 | if (data.status == 'OK') { 19 | window.location.reload(); 20 | } else { 21 | 22 | } 23 | }, 24 | }); 25 | 26 | }); -------------------------------------------------------------------------------- /sysadmin/systemd/core/ipol-demorunner.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run legacy demorunner (for core, under docker) 3 | After=docker.service 4 | 5 | [Service] 6 | # ~/.local for uv python install, which the venv points to 7 | ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/ipol --user 1001:1001 -v /home/ipol/ipolDevel:/home/ipol/ipolDevel -v /home/ipol/.local/:/home/ipol/.local/ --workdir /home/ipol/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 9003 --workers 10 8 | TimeoutStartSec=300 9 | ExecStop=/usr/bin/docker stop ipol-demorunner 10 | SyslogIdentifier=demorunner 11 | 12 | [Install] 13 | WantedBy=default.target 14 | -------------------------------------------------------------------------------- /sysadmin/install_packages/requirements.txt: -------------------------------------------------------------------------------- 1 | # install requirements for IPOL project 2 | # pip install -r "requirements.txt" 3 | 4 | # General 5 | av 6 | bs4 7 | cython 8 | future 9 | libtiff 10 | matplotlib 11 | mgrs 12 | numpy 13 | opencv-python 14 | pillow 15 | psutil 16 | pyfftw 17 | pypng 18 | python-magic 19 | requests 20 | simplejson 21 | sklearn 22 | sortedcontainers 23 | tifffile 24 | utm 25 | validoot 26 | weightedstats 27 | 28 | # For the DR venv 29 | scipy 30 | tensorflow 31 | torch 32 | keras 33 | joblib 34 | 35 | # Needed in one of our private projects on satellite imaging 36 | # The package libgeos-dev needs to be installed with apt-get first 37 | geojson 38 | netcdf 39 | planet 40 | rasterio 41 | shapely 42 | 43 | # Audio demos 44 | libsndfile1-dev 45 | libsndfile1 46 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/id.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/vi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/is.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/showExperiment.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}createBlob{% endblock %} {% block bodyid %}createBlob{% endblock %} 2 | 3 | {% block header %} 4 | {% include "header.html" %} 5 | {% endblock %} {% block content %} 6 |

Experiment {{experiment.id}}

7 |
8 | {% block searchExperimentForm %} 9 | {% include "searchExperimentForm.html" %} 10 | {% endblock%} 11 | Back to archive 12 |
13 | 14 |
15 | {% block experiment %} 16 | {% include "experiment.html" %} 17 | {% endblock%} 18 |
19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ar.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/de.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/et.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /sysadmin/systemd/core/ipol-demorunner-docker.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run demorunner-docker (for core) 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/bin/ipol-demorunner 7 | ExecStartPre=-/home/ipol/.cargo/bin/cargo install --git https://github.com/ipol-journal/ipol-demorunner.git --rev f4c094312b3a89a66665c80e9c44b4868a371e6a --root . --target-dir target --debug --force --locked 8 | TimeoutStartSec=300 9 | WorkingDirectory=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/ 10 | Environment=ROCKET_PROFILE=ipol-ipolcore 11 | Environment=ROCKET_ADDRESS=0.0.0.0 12 | Environment=RUST_LOG=info,ipol_demorunner=debug 13 | RestartSec=10 14 | Restart=always 15 | SyslogIdentifier=demorunner-docker 16 | 17 | [Install] 18 | WantedBy=default.target 19 | -------------------------------------------------------------------------------- /sysadmin/systemd/limule/ipol-demorunner-docker.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run demorunner-docker (for limule) 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/bin/ipol-demorunner 7 | ExecStartPre=-/home/ipol/.cargo/bin/cargo install --git https://github.com/ipol-journal/ipol-demorunner.git --rev f4c094312b3a89a66665c80e9c44b4868a371e6a --root . --target-dir target --debug --force --locked 8 | TimeoutStartSec=300 9 | WorkingDirectory=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/ 10 | Environment=ROCKET_PROFILE=ipol-limule 11 | Environment=ROCKET_ADDRESS=0.0.0.0 12 | Environment=RUST_LOG=info,ipol_demorunner=debug 13 | RestartSec=10 14 | Restart=always 15 | SyslogIdentifier=demorunner-docker 16 | 17 | [Install] 18 | WantedBy=default.target 19 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/sv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/bg.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/km.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/nb.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ms.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/integration/demorunners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | start 6 | stop 7 | restart 8 | ping 9 | 10 | 11 | 12 | demorunner 13 | DEBIAN_STABLE 14 | ipol_integration 15 | ipol-demorunner --user 16 | 17 | 18 | 19 | demorunner-docker 20 | docker! 21 | ipol_integration 22 | ipol-demorunner-docker --user 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Tools/PythonTools/frames_to_avi_huff.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ######################################################################### 4 | # Convert a list of frames into an lossless Huffman-encoded AVI video # 5 | ######################################################################### 6 | 7 | # Example: 8 | # ./frames_to_avi_huff.sh input_0/frame_%05d.png 25 spiderman.avi 9 | 10 | if [ "$#" -ne 3 ]; then 11 | echo "Illegal number of parameters" 12 | exit 1 13 | fi 14 | 15 | frame_filename=$1 # Format of the frames. For example: frame_%05d.png 16 | fps=$2 # Frames per second 17 | output=$3 # Output AVI filename 18 | 19 | # -y: overwrite output without asking 20 | # -an: drop audio 21 | ffmpeg -f image2 -i "${frame_filename}" -framerate ${fps} -y -an -c:v huffyuv -pix_fmt rgb24 "${output}" 22 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/change_form.js: -------------------------------------------------------------------------------- 1 | /*global showAddAnotherPopup, showRelatedObjectLookupPopup showRelatedObjectPopup updateRelatedObjectLinks*/ 2 | 3 | (function($) { 4 | 'use strict'; 5 | $(document).ready(function() { 6 | var modelName = $('#django-admin-form-add-constants').data('modelName'); 7 | $('body').on('click', '.add-another', function(e) { 8 | e.preventDefault(); 9 | var event = $.Event('django:add-another-related'); 10 | $(this).trigger(event); 11 | if (!event.isDefaultPrevented()) { 12 | showAddAnotherPopup(this); 13 | } 14 | }); 15 | 16 | if (modelName) { 17 | $('form#' + modelName + '_form :input:visible:enabled:first').focus(); 18 | } 19 | }); 20 | })(django.jQuery); 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/gl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /sysadmin/systemd/limule/ipol-demorunner-docker-gpu.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run demorunner-docker (for limule, with gpu) 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/bin/ipol-demorunner 7 | ExecStartPre=-/home/ipol/.cargo/bin/cargo install --git https://github.com/ipol-journal/ipol-demorunner.git --rev ee2039a8980d199e15cb4f59970c63c335d8c743 --root . --target-dir target --debug --force --locked 8 | TimeoutStartSec=300 9 | WorkingDirectory=/home/ipol/ipolDevel/ipol_demo/modules/demorunner-docker/ 10 | Environment=ROCKET_PROFILE=ipol-limule-gpu 11 | Environment=ROCKET_ADDRESS=0.0.0.0 12 | Environment=RUST_LOG=info,ipol_demorunner=debug 13 | RestartSec=10 14 | Restart=always 15 | SyslogIdentifier=demorunner-docker-gpu 16 | 17 | [Install] 18 | WantedBy=default.target 19 | 20 | 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/da.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ipolDevel 2 | This repository contains the source code of the demo system of the Image Processing On Line (IPOL) platform along with its LaTeX documentation. 3 | 4 | The official repository is here: [https://github.com/ipol-journal/ipolDevel](https://github.com/ipol-journal/ipolDevel) 5 | 6 | Always a work in progress... 7 | 8 | [https://www.ipol.im](https://www.ipol.im) 9 | 10 | ## How to contribute 11 | 12 | The IPOL demo system is using Python 3.9. Your contributions should pass basic codestyle checks: ruff, isort, black. 13 | These tools can be installed using pip, and run with: 14 | ``` 15 | ruff . --fix 16 | black cp2 ipol_demo 17 | isort cp2 ipol_demo 18 | ``` 19 | 20 | See the [Github Actions workflow](.github/workflows/python.yaml) for more details and specific tool versions. See [pyproject.toml](pyproject.toml) for the tools settings. 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/password/password_reset.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load filters %} 3 | {% block title %}Password recovery{% endblock %} 4 | {% block bodyid %}password-reset{% endblock %} 5 | {% block content %} 6 | 7 | 8 | 20 | 21 | {% endblock %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/en.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/status.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}Status{% endblock %} {% block bodyid %}Status{% endblock %} 2 | {% block header %} 3 | {% include "header.html" %} 4 | {% endblock %} {% block content %} 5 |

System Status

6 |
7 |
8 |
9 |

DemoInfo

10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
NameWorkloadStatus
19 |
20 |
21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/he.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/hi.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/css/profile.css: -------------------------------------------------------------------------------- 1 | #saveProfile-form { 2 | display: grid; 3 | grid-template-columns: repeat(auto-fill, minmax(24rem, 40%)); 4 | gap: 1rem; 5 | justify-content: center; 6 | } 7 | 8 | #saveProfile-form > div { 9 | display: grid; 10 | } 11 | 12 | #saveProfile-form label { 13 | padding: 0.5rem 0; 14 | font-size: 1.1rem; 15 | } 16 | #saveProfile-form input { 17 | padding: 1rem; 18 | border: 2px solid black; 19 | border-radius: var(--border-radius); 20 | font-size: 1.2rem; 21 | } 22 | 23 | #saveProfile-form input[type="submit"] { 24 | width: 15rem; 25 | padding: 0.5rem; 26 | border: 2px solid var(--color-black); 27 | border-radius: var(--border-radius); 28 | align-self: flex-start; 29 | margin: 1rem 0; 30 | background-color: var(--color-blue); 31 | color: var(--color-white); 32 | } -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/fa.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/hr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/mk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/eu.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/pt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/ddl_history.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}showDemo{% endblock %} {% block bodyid %}showDemo{% endblock %} 2 | {% block header %} 3 | {% include "header.html" %} 4 | {% endblock %} {% block content %} 5 |

DDL history for demo {{title}}

6 | 7 |
8 |
9 | {% for ddl in ddl_history %} 10 | 11 | {% endfor %} 12 |
13 |

14 |     
15 | 16 |
17 |
18 | 19 | 20 | {% endblock %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/lv.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/es.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ca.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/it.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /ipol_demo/clientApp/css/tabs.css: -------------------------------------------------------------------------------- 1 | .tabs { 2 | display: inline-block; 3 | 4 | width: 100%; 5 | padding: 3px 0; 6 | 7 | border-bottom: 0.5px solid #C6C6C6; 8 | } 9 | 10 | .tabs a:first-child { 11 | margin-left: 25px; 12 | } 13 | 14 | .tabs a { 15 | padding: 2px 6px; 16 | 17 | text-decoration: none; 18 | 19 | color: #000; 20 | border-width: 1px 1px .5px 1px; 21 | border-style: solid; 22 | border-color: transparent; 23 | border-radius: 5px 5px 0 0; 24 | background-color: #D4C9E9; 25 | 26 | font-family: Arial; 27 | font-size: 14px; 28 | } 29 | 30 | .tabs a:hover { 31 | opacity: 1; 32 | color: #000000; 33 | border-color: #aaaaaa; 34 | border-bottom-color: transparent; 35 | background-color: #FFF !important; 36 | } 37 | 38 | a.selectedTab { 39 | opacity: 1; 40 | border-color: #aaaaaa; 41 | border-bottom-color: transparent; 42 | background-color: #FFF !important; 43 | } 44 | -------------------------------------------------------------------------------- /sysadmin/systemd/integration/ipol-demorunner-docker.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run demorunner-docker (for integration) 3 | After=network.target 4 | 5 | [Service] 6 | ExecStart=/home/integration/ipolDevel/ipol_demo/modules/demorunner-docker/bin/ipol-demorunner 7 | ExecStartPre=-/home/integration/.cargo/bin/cargo install --git https://github.com/ipol-journal/ipol-demorunner.git --rev f4c094312b3a89a66665c80e9c44b4868a371e6a --root . --target-dir target --debug --force --locked 8 | TimeoutStartSec=300 9 | WorkingDirectory=/home/integration/ipolDevel/ipol_demo/modules/demorunner-docker/ 10 | Environment=ROCKET_PROFILE=ipol-integration 11 | Environment=ROCKET_ADDRESS=0.0.0.0 12 | Environment=RUST_LOG=info,ipol_demorunner=debug 13 | Environment=DOCKER_HOST=unix:///var/run/docker-integration.sock 14 | RestartSec=10 15 | Restart=always 16 | SyslogIdentifier=demorunner-docker 17 | 18 | [Install] 19 | WantedBy=default.target 20 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/fr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ro.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/nl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/lt.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Tools/PythonTools/website_mp4.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ################################################ 4 | # Convert a video into a browser-viewable MP4 # 5 | ################################################ 6 | 7 | # https://thehelloworldprogram.com/web-development/encode-video-and-audio-for-html5-with-avconv/ 8 | 9 | # Example: 10 | # ./website_mp4.sh spiderman.wmv spiderman.mp4 11 | 12 | if [ "$#" -ne 2 ]; then 13 | echo "Illegal number of parameters" 14 | exit 1 15 | fi 16 | 17 | input=$1 18 | output=$2 19 | 20 | # High quality 21 | #ffmpeg -i "$1" -y -c:v libx264 -crf 1 -c:a aac -b:a 320k -strict experimental "${filename}_out.mp4" 22 | 23 | # -y: overwrite output without asking 24 | # -an: drop audio 25 | # We use the 4:2:2 chroma subsampling instead of 4:4:4 (no subsampling) because 26 | # Firefox can't handle it. 27 | ffmpeg -i "$input" -y -an -c:v libx264 -crf 1 -pix_fmt yuv420p "$output" 28 | -------------------------------------------------------------------------------- /sysadmin/backup/backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Very simple script to make backups 4 | # Miguel Colom, 2016 5 | 6 | user=ipol # Remember to set it back to "ipol" after testing 7 | modulesPath=/home/${user}/ipolDevel/ipol_demo/modules 8 | ipolDevelCopyPath=/home/${user}/backups/ipolDevelCopy 9 | ipolDevelCopyModulesPath=${ipolDevelCopyPath}/ipolDevel/ipol_demo/modules 10 | 11 | # Clone all 12 | mkdir -p ${ipolDevelCopyPath} 13 | rsync -azuP --delete --exclude 'shared_folder' /home/${user}/ipolDevel ${ipolDevelCopyPath} 14 | echo "ipolDevel cloned to ${ipolDevelCopyPath}" 15 | 16 | # Export databases 17 | databases=("blobs/db/blobs.db" "core/db/demoinfo.db" "archive/db/archive.db") 18 | 19 | for database in ${databases[@]}; do 20 | sqlite3 $modulesPath/${database} ".backup '${ipolDevelCopyModulesPath}/${database}'" 21 | cp $modulesPath/${database} ${ipolDevelCopyModulesPath}/${database}.bak 22 | done 23 | echo "Databases backed up" 24 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/pl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/messages.html: -------------------------------------------------------------------------------- 1 | {% if messages %} 2 | {% for message in messages %} 3 | 23 | {% endfor %} 24 | {% endif %} -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/el.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/sr.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /sysadmin/configs/nginx/snippets/ssl-params.conf: -------------------------------------------------------------------------------- 1 | # from https://cipherli.st/ 2 | # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html 3 | 4 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 5 | ssl_prefer_server_ciphers on; 6 | ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; 7 | ssl_ecdh_curve secp384r1; 8 | ssl_session_cache shared:SSL:10m; 9 | ssl_session_tickets off; 10 | ssl_stapling on; 11 | ssl_stapling_verify on; 12 | resolver 8.8.8.8 8.8.4.4 valid=300s; 13 | resolver_timeout 5s; 14 | # Disable preloading HSTS for now. You can use the commented out header line that includes 15 | # the "preload" directive if you understand the implications. 16 | #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 17 | add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; 18 | #add_header X-Frame-Options DENY; 19 | add_header X-Content-Type-Options nosniff; 20 | ssl_dhparam /etc/ssl/certs/dhparam.pem; 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/uk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/sr-Cyrl.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/ru.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /sysadmin/on_reboot.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script is executed by root on reboot 4 | 5 | me=ipol #$(whoami) 6 | modulesDir="/home/${me}/ipolDevel/ipol_demo/modules/" 7 | sharedFolder="/home/${me}/ipolDevel/shared_folder" 8 | 9 | # File with the modules name 10 | modules="/home/${me}/ipolDevel/sysadmin/modules.txt" 11 | 12 | today=$(date) 13 | machine_hostname=$(hostname) 14 | 15 | # Start nginx 16 | /usr/sbin/nginx 17 | 18 | # Start every IPOL module 19 | while read -r module 20 | do 21 | sudo -u ${me} ${modulesDir}${module}/start.sh 22 | done < ${modules} 23 | 24 | # Mount shared folder 25 | if [ $(hostname) != "ipolcore" ] 26 | then 27 | sudo -u ${me} sshfs ipol_core:$sharedFolder $sharedFolder 28 | fi 29 | 30 | 31 | # Send report by email 32 | sendTo=$(cat /home/ipol/ipolDevel/sysadmin/email_tech.txt) 33 | echo "This is the ${machine_hostname} machine. This machine has rebooted at ${today}: starting IPOL modules." | mutt -s "[${machine_hostname}] Reboot notice" -- ${sendTo} 34 | -------------------------------------------------------------------------------- /ci_tests/pull.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | host=$(hostname) 4 | today=$(date) 5 | user=$(whoami) 6 | 7 | # Git pull 8 | cd /home/${user}/ipolDevel/ 9 | git pull 10 | 11 | # Send email to warn about tests failure 12 | function send_email () { 13 | msg="$*" 14 | sendTo=$(cat /home/${user}/ipolDevel/ci_tests/send_to.txt) 15 | echo -e "This is the ${host} machine. The tests failed on ${today}:\n${msg}" | mutt -s "[${host}] Test failed" -- ${sendTo} 16 | } 17 | 18 | if [ ! -d "/home/${user}/ipolDevel/ci_tests/venv" ]; then 19 | python3.9 -m virtualenv ci_tests/venv 20 | source ci_tests/venv/bin/activate 21 | pip install -r ci_tests/requirements.txt 22 | fi 23 | 24 | # Executes all the tests for integration and production 25 | if [ $host == "integration" ] || [ $host == "ipolcore" ];then 26 | source ci_tests/venv/bin/activate 27 | out=$(python /home/${user}/ipolDevel/ci_tests/all.py) 28 | if [ $? -ne 0 ];then 29 | send_email "$out" 30 | fi 31 | deactivate 32 | fi -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Tools/PythonTools/frames_to_mp4.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | ################################################ 4 | # Convert a list of frames into an MP4 video # 5 | ################################################ 6 | 7 | # https://wiki.libav.org/Snippets/avconv#Create_video_from_image_sequence 8 | 9 | # Example: 10 | # ./frames_to_mp4.sh input_0/frame_%05d.png 25 spiderman.mp4 11 | 12 | if [ "$#" -ne 3 ]; then 13 | echo "Illegal number of parameters" 14 | exit 1 15 | fi 16 | 17 | frame_filename=$1 # Format of the frames. For example: input_0/frame_%05d.png 18 | fps=$2 # Frames per second 19 | output=$3 # Output MP4 filename 20 | 21 | # High quality 22 | #ffmpeg -i "$1" -y -c:v libx264 -crf 1 -c:a aac -b:a 320k -strict experimental "${filename}_out.mp4" 23 | 24 | # -y: overwrite output without asking 25 | # -an: drop audio 26 | #ffmpeg -i "$1" -y -an -c:v libx264 -crf 1 "${filename}_out.mp4" 27 | ffmpeg -f image2 -i "${frame_filename}" -framerate ${fps} -y -an -c:v libx264 -crf 1 "${output}" 28 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/demoinfo/tools.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | def is_json(myjson): 5 | """ 6 | verify if string is in json format 7 | """ 8 | try: 9 | json_object = json.loads(myjson) 10 | del json_object 11 | except Exception as e: 12 | print("is_json e:%s" % e) 13 | return False 14 | return True 15 | 16 | 17 | def generate_ssh_keys(): 18 | """ 19 | Generates public and private ssh keys. 20 | """ 21 | from cryptography.hazmat.primitives import serialization as crypto_serialization 22 | from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey 23 | 24 | key = Ed25519PrivateKey.generate() 25 | privkey = key.private_bytes( 26 | crypto_serialization.Encoding.PEM, 27 | crypto_serialization.PrivateFormat.OpenSSH, 28 | crypto_serialization.NoEncryption(), 29 | ) 30 | pubkey = key.public_key().public_bytes( 31 | crypto_serialization.Encoding.OpenSSH, crypto_serialization.PublicFormat.OpenSSH 32 | ) 33 | return pubkey, privkey 34 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/header.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}Login{% endblock %} {% block bodyid %}Login{% endblock %} {% block header %} {% endblock %} {% block content %} 2 | 24 | {% endblock %} -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/prod/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://ipolcore.ipol.im/ 5 | 6 | 7 | archive 8 | ipol_core 9 | ipol-archive --user 10 | start 11 | stop 12 | restart 13 | ping 14 | 15 | 16 | 17 | blobs 18 | ipol_core 19 | ipol-blobs --user 20 | start 21 | stop 22 | restart 23 | ping 24 | 25 | 26 | 27 | core 28 | ipol_core 29 | ipol-core --user 30 | start 31 | stop 32 | restart 33 | ping 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /doc/system/tools/demo_copy.tex: -------------------------------------------------------------------------------- 1 | \subsection{Demo Copy} 2 | 3 | The demo copy script is a tool that allows to clone a demo from one environment to another. This tool is useful for development purposes 4 | as it allows a developer to quickly clone a demo to a local environment. The only parameter is the demo ID number in order to copy 5 | everything related to the demo, this includes the DDL, its demo extras, its blobs, and its templates. 6 | 7 | \subsubsection{Usage} 8 | By default, the script gets the demo information from the production environment. If the demo is to be copied from Integration the {\tt -i} flag needs to be passed argument. 9 | It will also check if there is a demo with the provided ID number and will ask for another one or to overwrite it. 10 | 11 | Some examples: 12 | \paragraph{Copy demo from Production} \hspace{0pt} \\ 13 | ./demo\_copy.py {\tt } 14 | 15 | By default it will use Production as the source. 16 | 17 | \paragraph{Copy demo from Integration} \hspace{0pt} \\ 18 | {\tt ./demo\_copy.py -i {\tt }} 19 | 20 | With the argument -i it will use Integration as the source instead of Production. 21 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/integration/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://integration.ipol.im/ 5 | 6 | 7 | archive 8 | ipol_integration 9 | ipol-archive --user 10 | start 11 | stop 12 | restart 13 | ping 14 | 15 | 16 | 17 | blobs 18 | ipol_integration 19 | ipol-blobs --user 20 | start 21 | stop 22 | restart 23 | ping 24 | 25 | 26 | 27 | core 28 | ipol_integration 29 | ipol-core --user 30 | start 31 | stop 32 | restart 33 | ping 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /sysadmin/doc/purging_large_files_from_git.txt: -------------------------------------------------------------------------------- 1 | How to remove large files from the repository, from all commits 2 | 3 | mkdir ipol_DELETE 4 | cd ipol_DELETE/ 5 | 6 | git clone --mirror git@github.com:ipol-journal/ipolDevel.git 7 | 8 | java -jar ~/progs/bfg-1.12.14.jar --delete-files error.zip ipolDevel.git 9 | java -jar ~/progs/bfg-1.12.14.jar --delete-files input_many.zip ipolDevel.git 10 | java -jar ~/progs/bfg-1.12.14.jar --delete-files input_single.zip ipolDevel.git 11 | java -jar ~/progs/bfg-1.12.14.jar --delete-files test.tar ipolDevel.git 12 | java -jar ~/progs/bfg-1.12.14.jar --delete-files test.tar.gz ipolDevel.git 13 | java -jar ~/progs/bfg-1.12.14.jar --delete-files test.zip ipolDevel.git 14 | java -jar ~/progs/bfg-1.12.14.jar --delete-files bag.png ipolDevel.git 15 | java -jar ~/progs/bfg-1.12.14.jar --delete-files IMG_0230_raw_x32.png ipolDevel.git 16 | 17 | cd ipolDevel.git 18 | git reflog expire --expire=now --all && git gc --prune=now --aggressive 19 | git push 20 | 21 | After that, remove completely the repository ipolDevel and clone it again. 22 | For example, using SSH: git clone git@github.com:ipol-journal/ipolDevel.git 23 | -------------------------------------------------------------------------------- /sysadmin/systemd/integration/ipol-demorunner.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Run legacy demorunner (for integration, under docker) 3 | After=docker-integration.service 4 | 5 | [Service] 6 | # ~/.local for uv python install, which the venv points to 7 | # this one is a bit complex because the demorunner has some dependency on $HOME/$USER 8 | ExecStart=/usr/bin/docker run --rm --name ipol-demorunner --network=host --log-driver=journald --env HOME=/home/integration --user 1005:1005 -v /home/integration/ipolDevel:/home/integration/ipolDevel -v /home/integration/.local/:/home/integration/.local/ -v /home/integration/.cache:/home/integration/.cache --workdir /home/integration/ipolDevel/ipol_demo/modules/demorunner/ registry.ipol.im/ipol-debian-demorunner ./venv/bin/uvicorn demorunner:app --host 127.0.0.1 --port 10004 --workers 10 9 | ExecStop=/usr/bin/docker stop ipol-demorunner 10 | WorkingDirectory=/home/integration/ipolDevel/ipol_demo/modules/demorunner/ 11 | Environment=DOCKER_HOST=unix:///var/run/docker-integration.sock 12 | RestartSec=10 13 | Restart=always 14 | SyslogIdentifier=ipol-demorunner 15 | 16 | [Install] 17 | WantedBy=default.target 18 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:bullseye 2 | 3 | # ipol user config 4 | RUN useradd -ms /bin/zsh ipol 5 | RUN adduser ipol sudo 6 | RUN echo 'ipol:ipol' | chpasswd 7 | 8 | WORKDIR /home/ipol 9 | 10 | # Apt and pip packages installation 11 | COPY ./docker/pkglist /home/ipol/pkglist 12 | RUN apt update && apt install -y $(cat pkglist) 13 | 14 | # Install uv 15 | COPY --from=ghcr.io/astral-sh/uv:0.8.4 /uv /uvx /bin/ 16 | # RUN pip install virtualenv && pip3 install requests virtualenv ipython 17 | 18 | COPY ./docker/zsh_conf /home/ipol/zsh_conf 19 | 20 | # Nginx config file generation 21 | COPY ./sysadmin/configs/nginx/default-docker /etc/nginx/sites-available/default 22 | 23 | USER ipol 24 | 25 | ENV IPOL_URL=http://localhost 26 | ENV IPOL_HOST=localhost 27 | 28 | RUN bash -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)" && \ 29 | cp /home/ipol/zsh_conf ~/.zshrc 30 | 31 | RUN ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -q -N "" && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod og-wx ~/.ssh/authorized_keys 32 | USER root 33 | 34 | EXPOSE 80 35 | 36 | ENTRYPOINT service ssh start && service named start && nginx && zsh -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/sk.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ci_tests/pdflatex.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # pdflatex compilation report 4 | # Miguel Colom, 2016 5 | 6 | me=$(whoami) 7 | docsDir="/home/${me}/ipolDevel/doc" 8 | report="/home/${me}/ipolDevel/ci_tests/pdflatex_report.txt" 9 | files="control_panel/control_panel.tex ddl/ddl.tex system/ipol.tex" 10 | 11 | send=0 12 | 13 | #truncate -s 0 ${report} 14 | today=$(date) 15 | echo "IPOL pdflatex test on ${today}" > ${report} 16 | echo >> ${report} 17 | 18 | # Compile each folder of the documentation 19 | for file in ${files} 20 | do 21 | cd $(dirname ${docsDir}/${file}) 22 | 23 | pdflatex -halt-on-error ${docsDir}/${file} > $(dirname ${report})/pdflatex_tmp.txt 24 | if [ $? != 0 ] ; then 25 | echo "*** Failed compilation of ${docsDir}/${file}:" >> ${report} 26 | cat pdflatex_tmp.txt >> ${report} 27 | echo >> ${report} 28 | send=1 29 | fi 30 | done 31 | 32 | # Send email only if errors 33 | if [ ${send} != 0 ] ; then 34 | # Send report by email 35 | sendTo=$(cat /home/ipol/ipolDevel/ci_tests/send_to.txt) 36 | echo "pdflatex doc compilation report" | mutt -a ${report} -s "[ipolDevel] CI test: pdflatex" -- ${sendTo} 37 | fi 38 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Code Charm Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/detailsBlob.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}detailsBlob{% endblock %} {% block bodyid %}detailsBlob{% endblock %} 2 | {% block header %} 3 | {% include "header.html" %} 4 | {% endblock %} {% block content %} 5 |

Blobset: {{ set_name }}

6 |
7 | {% block blobForm %} 8 | {% include "editBlobForm.html" %} 9 | {% endblock%} 10 |
11 |

Preview

12 |
13 |

Blob

14 | 15 | 16 | 17 |
18 |
19 |

Visual representation

20 | 21 | 22 | 23 |
24 |
25 |
26 | 27 | {% endblock %} -------------------------------------------------------------------------------- /sysadmin/configs/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 28; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | 8 | events { 9 | worker_connections 1024; 10 | } 11 | 12 | 13 | http { 14 | include /etc/nginx/mime.types; 15 | default_type application/octet-stream; 16 | 17 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 | '$status $body_bytes_sent "$http_referer" ' 19 | '"$http_user_agent" "$http_x_forwarded_for"'; 20 | 21 | access_log /var/log/nginx/access.log main; 22 | 23 | sendfile on; 24 | #tcp_nopush on; 25 | 26 | keepalive_timeout 65; 27 | 28 | gzip on; 29 | gzip_disable "msie6"; 30 | 31 | gzip_vary on; 32 | gzip_proxied any; 33 | gzip_comp_level 6; 34 | gzip_buffers 16 8k; 35 | gzip_http_version 1.1; 36 | gzip_min_length 256; 37 | gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | include /etc/nginx/sites-enabled/*; 41 | } 42 | -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner-docker/Rocket.toml: -------------------------------------------------------------------------------- 1 | [default] 2 | compilation_root = "./compilation/" 3 | docker_image_prefix = "ipol-demo-" 4 | docker_exec_prefix = "ipol-exec-" 5 | exec_workdir_in_docker = "/workdir/exec" 6 | user_uid_gid = "1000:1000" 7 | gpus = [] 8 | env_vars = {"IPOL_URL"="https://ipolcore.ipol.im"} 9 | max_timeout = 600 10 | limits = {"file"="500MB", "data-form"="500MB"} 11 | exec_network_mode = "bridge" 12 | build_network_mode = "bridge" 13 | 14 | [ipol-ipolcore] 15 | port = 3000 16 | user_uid_gid = "1001:1001" 17 | # for ipolcore and integration, we need to avoid collision so we run in separate subnets 18 | exec_network_mode = "prod" 19 | build_network_mode = "prod" 20 | 21 | [ipol-integration] 22 | port = 10010 23 | user_uid_gid = "1005:1005" 24 | env_vars = {"IPOL_URL"="https://integration.ipol.im"} 25 | # for ipolcore and integration, we need to avoid collision so we run in separate subnets 26 | exec_network_mode = "integration" 27 | build_network_mode = "integration" 28 | 29 | [ipol-limule] 30 | port = 3000 31 | user_uid_gid = "1005:1005" 32 | 33 | [ipol-limule-gpu] 34 | port = 3001 35 | user_uid_gid = "1005:1005" 36 | gpus = ["GPU-43d69276-d085-d30b-2a53-b8d276038d12"] 37 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/css/reset.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, ol, ul, li, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font-size: 100%; 18 | font: inherit; 19 | vertical-align: baseline; 20 | } 21 | /* HTML5 display-role reset for older browsers */ 22 | article, aside, details, figcaption, figure, 23 | footer, header, hgroup, menu, nav, section { 24 | display: block; 25 | } 26 | body { 27 | line-height: 1; 28 | } 29 | ol, ul { 30 | list-style: none; 31 | } 32 | blockquote, q { 33 | quotes: none; 34 | } 35 | blockquote:before, blockquote:after, 36 | q:before, q:after { 37 | content: ''; 38 | content: none; 39 | } 40 | table { 41 | border-collapse: collapse; 42 | border-spacing: 0; 43 | } -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/loop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | Layer 1 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/i18n/cs.js: -------------------------------------------------------------------------------- 1 | /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */ 2 | 3 | (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/experiment.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {% for file in experiment.files%} 4 | 5 | {{file.name}} 6 | 7 | {% endfor %} 8 |
9 |
10 | {% if experiment.parameters %} 11 |

Parameters:

12 | {% for parameter, value in experiment.parameters.items %} 13 |

{{parameter}}: {{value}}

14 | {% endfor %} 15 | {% endif %} 16 |
17 | {% if experiment.execution %} 18 |

Execution: {{experiment.execution}}

19 | {% endif %} 20 |
21 |

Experiment ID: {{experiment.id}}

22 |

Date: {{experiment.date}}

23 | {% if can_edit %} 24 | 25 | {% endif %} 26 |
27 |
28 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/css/reset.css: -------------------------------------------------------------------------------- 1 | 2 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { 3 | font-size: 100%; 4 | 5 | vertical-align: baseline; 6 | 7 | border: 0; 8 | } 9 | 10 | /* HTML5 display-role reset for older browsers */ 11 | article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { 12 | display: block; 13 | } 14 | 15 | body { 16 | line-height: 1; 17 | } 18 | 19 | ol, ul, li { 20 | font-size: 14px; 21 | line-height: 1.3; 22 | } 23 | 24 | li { 25 | list-style-position: inside; 26 | } 27 | 28 | blockquote, q { 29 | quotes: none; 30 | } 31 | 32 | blockquote:before, blockquote:after, q:before, q:after { 33 | content: ''; 34 | content: none; 35 | } 36 | 37 | table { 38 | border-spacing: 0; 39 | border-collapse: collapse; 40 | } 41 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/local0/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://localhost/ 5 | 6 | 7 | archive 8 | 127.0.0.1 9 | localhost 10 | ~/ipolDevel/ipol_demo/modules/archive/ 11 | start 12 | stop 13 | restart 14 | ping 15 | 16 | 17 | 18 | blobs 19 | 127.0.0.1 20 | localhost 21 | ~/ipolDevel/ipol_demo/modules/blobs/ 22 | start 23 | stop 24 | restart 25 | ping 26 | 27 | 28 | 29 | core 30 | 127.0.0.1 31 | localhost 32 | ~/ipolDevel/ipol_demo/modules/core/ 33 | start 34 | stop 35 | restart 36 | ping 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /ipol_demo/modules/config_common/envs/local1/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://localhost/ 5 | 6 | 7 | archive 8 | 127.0.1.1 9 | localhost 10 | ~/ipolDevel/ipol_demo/modules/archive/ 11 | start 12 | stop 13 | restart 14 | ping 15 | 16 | 17 | 18 | blobs 19 | 127.0.1.1 20 | localhost 21 | ~/ipolDevel/ipol_demo/modules/blobs/ 22 | start 23 | stop 24 | restart 25 | ping 26 | 27 | 28 | 29 | core 30 | 127.0.1.1 31 | localhost 32 | ~/ipolDevel/ipol_demo/modules/core/ 33 | start 34 | stop 35 | restart 36 | ping 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | The IPOL demo system is a free software project contributed by several persons. 2 | 3 | In alphabetical order: 4 | Matías Abal 5 | Jérémy Anger 6 | José Arrecio 7 | Martín Arévalo 8 | Miguel Colom 9 | Carlos Escobar 10 | Vincent Firmin 11 | Frédéric Glorieux 12 | Stéphane Gratias 13 | Karl Krissian 14 | Nicolas Limare 15 | Héctor Macías 16 | Alexis Mongin 17 | Nelson Monzón 18 | Jyotsna Rajan 19 | You can always get a more updated list with "git shortlog -sne". 20 | 21 | The IPOL demo system project is under the responsibility of Miguel Colom (the "coordinator"), who is in charge of the team of engineers that makes IPOL a reality. 22 | 23 | In order to protect the intellectual property of all authors and to properly acknowledge them, note that you are not allowed to remove any authors from this list, or to change any roles without the permission of the coordinator. 24 | 25 | Changing the A-GPL license, adding new licenses, or negotiating any dual licensing is also not allowed without the explicit agreement of the coordinator. 26 | 27 | The contributions of all authors is considered their inalienable intellectual property unless *explicitly* transferred. 28 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/inpainting.html: -------------------------------------------------------------------------------- 1 |
2 | 6 | 10 | 14 | 18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 | 28 |
29 | 30 |
31 |
32 |
33 | 34 | 35 |
36 |
-------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/step-forward-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | Layer 1 9 | 10 | 11 | 12 | 13 | 1 14 | 15 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2007-2012 Steven Levithan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/step-forward-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | Layer 1 9 | 10 | 11 | 12 | 13 | 5 14 | 15 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/css/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/select2/LICENSE-SELECT2.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-2015 Kevin Brown, Igor Vaynberg, and Select2 contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/step-backwards-5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | Layer 1 9 | 10 | 11 | 12 | 13 | 14 | 15 | 5 16 | 17 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/media-controls/step-backwards-1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | Layer 1 9 | 10 | 11 | 12 | 13 | 14 | 1 15 | 16 | 17 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/collapse.js: -------------------------------------------------------------------------------- 1 | /*global gettext*/ 2 | (function($) { 3 | 'use strict'; 4 | $(document).ready(function() { 5 | // Add anchor tag for Show/Hide link 6 | $("fieldset.collapse").each(function(i, elem) { 7 | // Don't hide if fields in this fieldset have errors 8 | if ($(elem).find("div.errors").length === 0) { 9 | $(elem).addClass("collapsed").find("h2").first().append(' (' + gettext("Show") + 11 | ')'); 12 | } 13 | }); 14 | // Add toggle to anchor tag 15 | $("fieldset.collapse a.collapse-toggle").click(function(ev) { 16 | if ($(this).closest("fieldset").hasClass("collapsed")) { 17 | // Show 18 | $(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); 19 | } else { 20 | // Hide 21 | $(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); 22 | } 23 | return false; 24 | }); 25 | }); 26 | })(django.jQuery); 27 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | var init = function($element, options) { 4 | var settings = $.extend({ 5 | ajax: { 6 | data: function(params) { 7 | return { 8 | term: params.term, 9 | page: params.page 10 | }; 11 | } 12 | } 13 | }, options); 14 | $element.select2(settings); 15 | }; 16 | 17 | $.fn.djangoAdminSelect2 = function(options) { 18 | var settings = $.extend({}, options); 19 | $.each(this, function(i, element) { 20 | var $element = $(element); 21 | init($element, settings); 22 | }); 23 | return this; 24 | }; 25 | 26 | $(function() { 27 | // Initialize all autocomplete widgets except the one in the template 28 | // form used when a new formset is added. 29 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2(); 30 | }); 31 | 32 | $(document).on('formset:added', (function() { 33 | return function(event, $newFormset) { 34 | return $newFormset.find('.admin-autocomplete').djangoAdminSelect2(); 35 | }; 36 | })(this)); 37 | }(django.jQuery)); 38 | -------------------------------------------------------------------------------- /ipol_demo/modules/core/archive/db/drop_create_db_schema.sql: -------------------------------------------------------------------------------- 1 | PRAGMA foreign_keys=ON; 2 | CREATE TABLE IF NOT EXISTS experiments ( 3 | id INTEGER PRIMARY KEY AUTOINCREMENT, 4 | id_demo INTEGER NOT NULL, 5 | params TEXT, 6 | execution TEXT, 7 | timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP); 8 | CREATE TABLE IF NOT EXISTS blobs ( 9 | id INTEGER PRIMARY KEY AUTOINCREMENT, 10 | hash TEXT NOT NULL, 11 | type TEXT NOT NULL, 12 | format TEXT NOT NULL); 13 | CREATE TABLE IF NOT EXISTS correspondence ( 14 | id INTEGER PRIMARY KEY AUTOINCREMENT, 15 | id_experiment INTEGER NOT NULL, 16 | id_blob INTEGER NOT NULL, 17 | name TEXT, 18 | order_exp INTEGER, 19 | FOREIGN KEY(`id_experiment`) REFERENCES experiments ( id ) ON DELETE CASCADE, 20 | FOREIGN KEY(`id_blob`) REFERENCES blobs ( id ) ON DELETE CASCADE); 21 | CREATE INDEX IF NOT EXISTS correspondence_id_experiment ON correspondence (id_experiment); 22 | -------------------------------------------------------------------------------- /doc/system/access_control/access_control.tex: -------------------------------------------------------------------------------- 1 | \section{Access control} 2 | \label{sec:Access_control} 3 | \subsection{Introduction} 4 | To avoid the execution of exposed methods that allow the modification of the database (write and delete actions) by an unauthorized 5 | client, it has been created a wrapper that controls the access to these methods. 6 | 7 | This wrapper compares the IP of the client that is calling the method with a list of authorized patterns. If the IP is authorized, 8 | the wrapper will automatically invoke the method requested by the client. Otherwise the request will be denied and the wrapper will 9 | respond with an Authentication Failed message. 10 | 11 | 12 | \subsection{Authorized IPs File} 13 | The file with the authorized IPs patterns is authorized\_pattern.conf, in the config\_common directory. This file consists 14 | of a general section [Patterns], where all the permitted patterns are given with the following format: ``name=pattern''. Each pattern 15 | allows the access of multiple IPs. 16 | 17 | The syntax for the pattern uses the asterisk to mean ``any''. For example: {\tt``local = 127.*.*.*''} 18 | 19 | \subsection{Usage} 20 | To require IP validation in order to be able to reach an endpoint it is enough to add the dependency {\tt Depends(validate\_ip)} in the parameters of the decorator for each endpoint and import said method from ``guards.py''. 21 | -------------------------------------------------------------------------------- /docker/zsh_conf: -------------------------------------------------------------------------------- 1 | ################## 2 | # Zsh # 3 | ################## 4 | export ZSH=/home/ipol/.oh-my-zsh 5 | 6 | ZSH_THEME="jtriley" 7 | 8 | plugins=() 9 | 10 | source $ZSH/oh-my-zsh.sh 11 | 12 | ################## 13 | # Alias # 14 | ################## 15 | 16 | # IPOL quick launch 17 | alias ipolDevel="core & demorunner & cp2devel" 18 | 19 | # Control Panel 20 | alias cp2="cd ~/ipolDevel/cp2 && uv run ./gunicorn_start_cp2" 21 | alias cp2devel="cd ~/ipolDevel/cp2 && uv run python ControlPanel/manage.py runserver 127.0.0.1:8002" 22 | alias venvcp2="cd ~/ipolDevel/cp2 && source bin/activate" 23 | 24 | # Collect all static files from CP. 25 | alias collectstatic="cd ~/ipolDevel/cp2/ControlPanel && uv run python manage.py collectstatic --noinput --clear" 26 | 27 | # Test all 28 | alias runtest="cd ~/ipolDevel/ci_tests && python3 all.py" 29 | 30 | # Go to run directory 31 | alias rund="cd ~/ipolDevel/shared_folder/run/" 32 | 33 | # Activate venv 34 | alias venv="source venv/bin/activate" 35 | 36 | function demo_copy() { 37 | cd ~/ipolDevel/tools/demo_copy && ./demo_copy.py $1 $2 38 | } 39 | 40 | 41 | # Modules start 42 | alias core="cd ~/ipolDevel/ipol_demo/modules/core && uv run uvicorn app:app --reload --host 127.0.0.1 --port 8080" 43 | alias demorunner="cd ~/ipolDevel/ipol_demo/modules/demorunner && uv run uvicorn demorunner:app --reload --host 0.0.0.0 --port 9004" -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/Templates.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Templates{% endblock %} 3 | {% block bodyid %}Templates{% endblock %} 4 | {% block fond %} 5 |
6 | {% endblock %} 7 | {% block header %} 8 | {% include "header.html" %} 9 | {% endblock %} {% block content %} 10 |
11 |

List of Templates

12 | Create template 13 | 14 |

Create template

15 |
16 | 17 | 18 | 19 |
20 | 21 |
22 |
23 | 24 |
25 | {% for template in templates %} 26 | 29 | {% endfor %} 30 |
31 | 32 | {% endblock %} -------------------------------------------------------------------------------- /ipol_demo/modules/demorunner/Tools/PythonTools/get_video_fps.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # -*- coding: utf-8 -*- 4 | # GNU General Public Licence (GPL) 5 | # 6 | # This program is free software; you can redistribute it and/or modify it under 7 | # the terms of the GNU General Public License as published by the Free Software 8 | # Foundation; either version 2 of the License, or (at your option) any later 9 | # version. 10 | # This program is distributed in the hope that it will be useful, but WITHOUT 11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 13 | # details. 14 | # You should have received a copy of the GNU General Public License along with 15 | # this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 | # Place, Suite 330, Boston, MA 02111-1307 USA 17 | 18 | # Print the frames per second (FPS) of the input video 19 | 20 | import argparse 21 | import errno 22 | 23 | import cv2 24 | 25 | # Parse command line arguments 26 | parser = argparse.ArgumentParser() 27 | parser.add_argument("filename", type=str, help="Input filename") 28 | args = parser.parse_args() 29 | 30 | capture = cv2.VideoCapture(args.filename) 31 | if not capture: 32 | raise OSError(errno.ENODATA, "Could not load.", args.filename) 33 | 34 | fps = int(capture.get(cv2.CAP_PROP_FPS)) 35 | print(fps) 36 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/header.html: -------------------------------------------------------------------------------- 1 | 29 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/vendor/jquery/LICENSE-JQUERY.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery 6 | 7 | ==== 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining 10 | a copy of this software and associated documentation files (the 11 | "Software"), to deal in the Software without restriction, including 12 | without limitation the rights to use, copy, modify, merge, publish, 13 | distribute, sublicense, and/or sell copies of the Software, and to 14 | permit persons to whom the Software is furnished to do so, subject to 15 | the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be 18 | included in all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/assets/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/js/ddl_history.js: -------------------------------------------------------------------------------- 1 | let demo_id = getParameterByName('demo_id'); 2 | let csrftoken = getCookie('csrftoken'); 3 | let buttons = document.getElementsByClassName('ddl'); 4 | let aceEditor = ace.edit("aceEditor", { 5 | mode: "ace/mode/json", 6 | autoScrollEditorIntoView: false, 7 | maxLines: 20, 8 | minLines: 20 9 | }); 10 | aceEditor.setValue('{}'); 11 | 12 | let showDDL = function onClick() { 13 | let ddl = JSON.parse(this.getAttribute('data-ddl')); 14 | let creation = this.getAttribute('data-creation'); 15 | let restoreButton = document.getElementById('restore-ddl-button'); 16 | restoreButton.disabled = false; 17 | aceEditor.setValue(JSON.stringify(ddl, undefined, 2), -1); 18 | }; 19 | 20 | Array.from(buttons).forEach(function(button) { 21 | button.addEventListener('click', showDDL); 22 | }); 23 | 24 | function saveDDL() { 25 | const ddl = aceEditor.getValue(); 26 | $.ajax({ 27 | beforeSend: function() { 28 | confirm('This will overwrite the current DDL for this demo, are you sure?'); 29 | }, 30 | data: ({ 31 | demo_id: demo_id, 32 | ddl: ddl, 33 | csrfmiddlewaretoken: csrftoken, 34 | }), 35 | type: 'POST', 36 | dataType: 'json', 37 | url: 'ajax_save_DDL', 38 | success: function(data) { 39 | toast('DDL restored'); 40 | }, 41 | error: function(error) { 42 | 43 | } 44 | }); 45 | 46 | } -------------------------------------------------------------------------------- /cp2/ControlPanel/templates/createBlob.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block title %}createBlob{% endblock %} {% block bodyid %}createBlob{% endblock %} 2 | 3 | {% block header %} 4 | {% include "header.html" %} 5 | {% endblock %} {% block content %} 6 | {% if template_name %} 7 |

Add Blob to {{ template_name }}

8 | {% elif demo_id %} 9 |

Add Blob to demo {{ demo_id }}

10 | {% endif %} 11 |
12 |

Usage:

13 |

In order to upload new blobs you may use any of the following methods:

14 |
    15 |
  • 1. Drag and drop files into the box
  • 16 |
  • 2. Click the button and choose however many files as you need
  • 17 |
18 |

Then click on the upload button.

19 |

When dropping multiple files, it will autofill their names.

20 |
21 |
22 |

Drop your files here

23 | 24 | 27 |
28 |
29 | 30 |
31 |
32 | 33 | {% endblock %} -------------------------------------------------------------------------------- /cp2/gunicorn_start_cp2: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | NAME="cp2" # Name of the application 4 | USER=$USER # the user to run as 5 | PORT="${CP2_PORT:-8002}" 6 | DJANGODIR=/home/${USER}/ipolDevel/cp2/ControlPanel # Django project directory 7 | SOCKFILE=/home/${USER}/ipolDevel/cp2/ControlPanel/run/gunicorn.sock # we will communicte using this unix socket 8 | # the group to run as 9 | NUM_WORKERS=3 # how many worker processes should Gunicorn spawn 10 | DJANGO_SETTINGS_MODULE=ControlPanel.settings # which settings file should Django use 11 | DJANGO_WSGI_MODULE=ControlPanel.wsgi # WSGI module name 12 | 13 | echo "Starting $NAME as $USER on port $PORT" 14 | 15 | # Create the run directory if it doesn't exist 16 | RUNDIR=$(dirname $SOCKFILE) 17 | test -d $RUNDIR || mkdir -p $RUNDIR 18 | 19 | # Start your Django Unicorn 20 | # Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon) 21 | cd ControlPanel/ 22 | 23 | echo "gunicorn ControlPanel.wsgi \ 24 | --name $NAME \ 25 | --workers $NUM_WORKERS \ 26 | --user=$USER \ 27 | --bind=unix:$SOCKFILE \ 28 | --log-level=debug \ 29 | --log-file=- \ " 30 | exec gunicorn -b 127.0.0.1:${PORT} ControlPanel.wsgi \ 31 | --name $NAME \ 32 | --workers $NUM_WORKERS \ 33 | --user=$USER \ 34 | --bind=unix:$SOCKFILE \ 35 | --log-level=debug \ 36 | --log-file=- \ 37 | 38 | -------------------------------------------------------------------------------- /sysadmin/backup/backup_sync.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | # 3 | # This script copies a correct (last changes and exported SQLite 4 | # files) ipolDevel directory from Core to the remote backup destination. 5 | # 6 | # In order to avoid incomplete file copies, this script should be 7 | # executed in a different day from Core's backup job. 8 | 9 | # run as root 10 | 11 | 12 | # DEBUG OPTIONS 13 | # 14 | #set -x 15 | #alias logger="echo logger" 16 | 17 | RSYNC_OPT="--quiet --archive --compress --delete-excluded \ 18 | --acls --xattrs --relative" 19 | 20 | RSYNC_SRC="\ 21 | /etc \ 22 | /root \ 23 | /home/ipol/backups/ipolDevelCopy/ipolDevel" 24 | 25 | RSYNC_EXC="--exclude=/home/ipol/backups/ipolDevelCopy/ipolDevel/shared_folder/ \ 26 | --exclude=/home/ipol/backups/ipolDevelCopy/ipolDevel/ipol_demo/modules/demorunner/binaries/ \ 27 | --exclude=/home/ipol/.cache/ \ 28 | --exclude=/home/ipol/backups/ipolDevelCopy/ipolDevel/ipol_demo/modules/archive/staticData/blobs_thumbs/ \ 29 | --exclude=/home/ipol/backups/ipolDevelCopy/ipolDevel/ci_tests/compilation_folder/ " 30 | 31 | RSYNC_DEST="backup-data@navy.hw.ipol.im:/srv/backup/sync/ipolcore/" 32 | 33 | RSYNC_CMD="/usr/bin/rsync $RSYNC_OPT $RSYNC_EXC $RSYNC_SRC $RSYNC_DEST" 34 | 35 | export RSYNC_RSH="ssh -p 2332 -i $HOME/.ssh/id_navy_backup " 36 | 37 | echo $RSYNC_CMD --rsync-path="rsync --fake-super" \ 38 | 39 | $RSYNC_CMD --rsync-path="/usr/bin/rsync --fake-super" \ 40 | && logger -t backup "successful sync" \ 41 | || logger -t backup "sync failed : $RSYNC_CMD" 42 | -------------------------------------------------------------------------------- /doc/system/user_scripts/scripts.tex: -------------------------------------------------------------------------------- 1 | \section{User scripts} 2 | The demo system provides some scripts common tasks, to free the demo editors to re-invent the wheel writing the same code multiple times. 3 | In this section we document them briefly. 4 | 5 | \subsection{draw2Dcurve.py} 6 | A simple script utility to draw single and multiple 2D plots using matplotlib. 7 | 8 | 9 | \subsection{Video editing tools} 10 | This is for those authors who are unable to read a video file but instead they prefer to have the video as a bunch of frames. 11 | Thus, the system will save the frames as {\tt input\_0/frame\_00000.png}, {\tt input\_0/frame\_00001.png}, {\tt input\_0/frame\_00002.png}, \dots 12 | If there are several inputs, they will be {\tt input\_1}, {\tt input\_2}, etc. 13 | 14 | The system offers some helpers you can call from your demoExtras: 15 | \begin{itemize} 16 | \item {\tt website\_mp4.sh}: converts a video of any format to a (lossy compressed) MP4 video that can be show in the web interface. Only for visualization. You can later offer to download original data. 17 | \item {\tt frames\_to\_avi\_huff.sh}: reads the frames extracted from a video and creates a Huffman-encoded (lossless) AVI file. 18 | \item {\tt frames\_to\_mp4.sh}: reads the frames extracted from a video and creates a lossy MP4 file. Only for visualization. 19 | \item {\tt get\_video\_fps.py}: prints the video's frame's per second (FPS). 20 | \end{itemize} 21 | 22 | \subsection{ply2obj.py} 23 | Converts a .ply mesh (Stanford) to a .obj mesh (wavefront). 24 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/css/helpers.css: -------------------------------------------------------------------------------- 1 | /* DISPLAY */ 2 | 3 | .di-flex { 4 | display: -webkit-box; 5 | display: -ms-flexbox; 6 | display: flex; 7 | align-items: center; 8 | } 9 | 10 | .di-none { 11 | display: none !important; 12 | } 13 | 14 | .di-inline { 15 | display: inline; 16 | } 17 | 18 | .di-block { 19 | display: block; 20 | } 21 | 22 | .di { 23 | display: inline; 24 | } 25 | 26 | .di-inline-block { 27 | display: inline-block; 28 | } 29 | 30 | .space-between { 31 | -webkit-box-pack: justify; 32 | -ms-flex-pack: justify; 33 | justify-content: space-between !important; 34 | } 35 | 36 | .space-around { 37 | -ms-flex-pack: distribute; 38 | justify-content: space-around; 39 | } 40 | 41 | /* PADDINGS AND MARGINS */ 42 | .p-x-10 { 43 | padding: 0 10px; 44 | } 45 | 46 | .p-y-10 { 47 | padding: 10px 0; 48 | } 49 | 50 | .m-x-10 { 51 | margin: 0 10px; 52 | } 53 | 54 | .m-y-5 { 55 | margin: 5px 0; 56 | } 57 | 58 | .m-r-10 { 59 | margin-right: 10px; 60 | } 61 | 62 | .m-b-20 { 63 | margin-bottom: 20px; 64 | } 65 | 66 | .m-b-5 { 67 | margin-bottom: 5px; 68 | } 69 | 70 | .m-0-a { 71 | margin: 0 auto; 72 | } 73 | 74 | .vertical-align { 75 | -webkit-box-align: center; 76 | align-items: center; 77 | -ms-flex-align: center; 78 | } 79 | 80 | .text-center { 81 | text-align: center; 82 | } 83 | 84 | .fw { 85 | width: 100% !important; 86 | } 87 | 88 | .overflow-auto { 89 | overflow: auto; 90 | } 91 | 92 | .disable-btn { 93 | background-color: gray !important; 94 | } 95 | 96 | .flex-50 { 97 | flex-basis: 50%; 98 | } 99 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* LOGIN FORM */ 2 | 3 | body.login { 4 | background: #f8f8f8; 5 | } 6 | 7 | .login #header { 8 | height: auto; 9 | padding: 5px 16px; 10 | } 11 | 12 | .login #header h1 { 13 | font-size: 18px; 14 | } 15 | 16 | .login #header h1 a { 17 | color: #fff; 18 | } 19 | 20 | .login #content { 21 | padding: 20px 20px 0; 22 | } 23 | 24 | .login #container { 25 | background: #fff; 26 | border: 1px solid #eaeaea; 27 | border-radius: 4px; 28 | overflow: hidden; 29 | width: 28em; 30 | min-width: 300px; 31 | margin: 100px auto; 32 | } 33 | 34 | .login #content-main { 35 | width: 100%; 36 | } 37 | 38 | .login .form-row { 39 | padding: 4px 0; 40 | float: left; 41 | width: 100%; 42 | border-bottom: none; 43 | } 44 | 45 | .login .form-row label { 46 | padding-right: 0.5em; 47 | line-height: 2em; 48 | font-size: 1em; 49 | clear: both; 50 | color: #333; 51 | } 52 | 53 | .login .form-row #id_username, .login .form-row #id_password { 54 | clear: both; 55 | padding: 8px; 56 | width: 100%; 57 | -webkit-box-sizing: border-box; 58 | -moz-box-sizing: border-box; 59 | box-sizing: border-box; 60 | } 61 | 62 | .login span.help { 63 | font-size: 10px; 64 | display: block; 65 | } 66 | 67 | .login .submit-row { 68 | clear: both; 69 | padding: 1em 0 0 9.4em; 70 | margin: 0; 71 | border: none; 72 | background: none; 73 | text-align: left; 74 | } 75 | 76 | .login .password-reset-link { 77 | text-align: center; 78 | } 79 | -------------------------------------------------------------------------------- /sysadmin/get_execs_statistics.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | ''' 4 | Count the number of executions the last 30 days 5 | ''' 6 | 7 | import os 8 | import datetime 9 | 10 | DAYS = 30 11 | 12 | base_dir = os.path.expanduser("~/ipolDevel/shared_folder/run") 13 | demos = os.listdir(base_dir) 14 | 15 | now = datetime.datetime.now() 16 | date_from = now - datetime.timedelta(days=DAYS) 17 | 18 | results = {} 19 | # 20 | for demo_id in demos: 21 | demo_dir = os.path.join(base_dir, demo_id) 22 | 23 | if demo_id == '-1': 24 | continue # Test demo 25 | 26 | if demo_id.startswith('.'): 27 | continue # Hidden folder 28 | 29 | # Get the executions of this demo 30 | execs = os.listdir(demo_dir) 31 | 32 | count = 0 33 | for execution in execs: 34 | execution_dir = os.path.join(demo_dir, execution) 35 | 36 | st_mtime = os.stat(execution_dir).st_mtime 37 | exec_datetime = datetime.datetime.fromtimestamp(st_mtime) 38 | 39 | if exec_datetime > date_from: 40 | count += 1 41 | 42 | results[demo_id] = count 43 | 44 | #print "demo #{}:\t{}\t({}/day)".format(demo_id, count, int(count/30.0)) 45 | 46 | print "Execution statistics of the demos the last {} days".format(DAYS) 47 | 48 | count_total = 0 49 | # 50 | for demo_id in sorted(results, key=results.get, reverse=True): 51 | count = results[demo_id] 52 | count_total += count 53 | print "demo #{}:\t{}\t({}/day)".format(demo_id, count, int(float(count)/DAYS)) 54 | 55 | print 56 | print "Total:\t{}\t({}/day)".format(count_total, int(float(count_total)/DAYS)) 57 | -------------------------------------------------------------------------------- /ipol_demo/lib/ipolutils/read_text_file.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | # GNU General Public Licence (GPL) 4 | # 5 | # This program is free software; you can redistribute it and/or modify it under 6 | # the terms of the GNU General Public License as published by the Free Software 7 | # Foundation; either version 2 of the License, or (at your option) any later 8 | # version. 9 | # This program is distributed in the hope that it will be useful, but WITHOUT 10 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 11 | # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 12 | # details. 13 | # You should have received a copy of the GNU General Public License along with 14 | # this program; if not, write to the Free Software Foundation, Inc., 59 Temple 15 | # Place, Suite 330, Boston, MA 02111-1307 USA 16 | """ 17 | IPOL text file wrapper for reading 18 | """ 19 | import re 20 | import sys 21 | 22 | 23 | def read_commented_text_file(input_file): 24 | """ 25 | Return the generated trimmed list after reading a commented text file 26 | """ 27 | trimmed_list = [] 28 | try: 29 | with open(input_file, "r") as file_obj: 30 | lines = file_obj.readlines() 31 | except Exception as err: 32 | print(f"Failed to read input file '{input_file}' - {err}") 33 | sys.exit(-1) 34 | for line in lines: 35 | line_obj = re.match(r"([^#]*)#.*", line) 36 | if line_obj: 37 | line = line_obj.group(1) 38 | line = line.strip() 39 | if line: 40 | trimmed_list.append(line) 41 | return trimmed_list 42 | -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | var $jscomp={scope:{},findInternal:function(a,c,b){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e'+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(c){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", 5 | [a(this).attr("id")]);return!1})})})(django.jQuery); 6 | -------------------------------------------------------------------------------- /docker/pkglist: -------------------------------------------------------------------------------- 1 | debian-keyring 2 | debian-archive-keyring 3 | bash-completion 4 | mailutils 5 | cron-apt 6 | git 7 | python2.7 8 | wget 9 | cmake 10 | ccache 11 | libboost-all-dev 12 | libtiff5-dev 13 | libtiff-tools 14 | libjpeg-dev 15 | libpng-dev 16 | libfftw3-dev 17 | libeigen3-dev 18 | liblapack-dev 19 | libblas-dev 20 | libopenblas-base 21 | libopenblas-dev 22 | parallel 23 | python 24 | python3 25 | python-dev 26 | python3-dev 27 | python3-cherrypy3 28 | python3-mako 29 | python3-jsonschema 30 | gnuplot 31 | gnuplot-nox 32 | python3-pip 33 | python3-yaml 34 | libpq-dev 35 | libmagic-dev 36 | libgsl-dev 37 | libgsl-dbg 38 | libblas-dev 39 | libblas3 40 | libopencv-dev 41 | python3-opencv 42 | liblapack-dev 43 | liblapacke-dev 44 | liblapacke 45 | octave 46 | octave-general 47 | octave-dataframe 48 | octave-image 49 | octave-linear-algebra 50 | octave-splines 51 | octave-statistics 52 | sshfs 53 | libgdal-dev 54 | gdal-bin 55 | python3-gdal 56 | libavformat-dev 57 | libavcodec-dev 58 | libavdevice-dev 59 | libswscale-dev 60 | libavresample-dev 61 | libavfilter-dev 62 | libavutil-dev 63 | apt-transport-https 64 | libconfig9 65 | libconfig-dev 66 | libconfig++-dev 67 | 68 | libgeos-dev 69 | 70 | caffe 71 | libcaffe-dev 72 | libcaffe1 73 | python3-caffe 74 | 75 | libjpeg-progs 76 | 77 | libsndfile1-dev 78 | libsndfile1 79 | 80 | ffmpeg 81 | libgslcblas0 82 | 83 | nano 84 | sudo 85 | vim 86 | tree 87 | nginx 88 | bc 89 | sqlite3 90 | openssh-server 91 | bash-completion 92 | mailutils 93 | cron-apt 94 | bind9 95 | ipython3 96 | net-tools 97 | gunicorn 98 | screen 99 | wget 100 | zip 101 | zsh -------------------------------------------------------------------------------- /ipol_demo/modules/core/guards.py: -------------------------------------------------------------------------------- 1 | import configparser 2 | import os 3 | import re 4 | 5 | from config import settings 6 | from fastapi import HTTPException, Request 7 | from logger import logger 8 | 9 | 10 | def validate_ip(request: Request) -> bool: 11 | # Check if the request is coming from an allowed IP address 12 | patterns = [] 13 | ip = request.headers["x-real-ip"] 14 | # try: 15 | for pattern in read_authorized_patterns(): 16 | patterns.append( 17 | re.compile(pattern.replace(".", "\\.").replace("*", "[0-9a-zA-Z]+")) 18 | ) 19 | for pattern in patterns: 20 | if pattern.match(ip) is not None: 21 | return True 22 | raise HTTPException(status_code=403, detail="IP not allowed") 23 | 24 | 25 | def read_authorized_patterns() -> list: 26 | """ 27 | Read from the IPs conf file 28 | """ 29 | # Check if the config file exists 30 | authorized_patterns_path = os.path.join( 31 | settings.config_common_dir, settings.authorized_patterns 32 | ) 33 | if not os.path.isfile(authorized_patterns_path): 34 | logger.exception( 35 | f"read_authorized_patterns: \ 36 | File {authorized_patterns_path} doesn't exist" 37 | ) 38 | return [] 39 | 40 | # Read config file 41 | try: 42 | cfg = configparser.ConfigParser() 43 | cfg.read([authorized_patterns_path]) 44 | patterns = [] 45 | for item in cfg.items("Patterns"): 46 | patterns.append(item[1]) 47 | return patterns 48 | except configparser.Error: 49 | logger.exception(f"Bad format in {authorized_patterns_path}") 50 | return [] 51 | -------------------------------------------------------------------------------- /doc/api/api.tex: -------------------------------------------------------------------------------- 1 | \documentclass[a4paper,12pt]{article} 2 | 3 | \usepackage[utf8]{inputenc} 4 | \usepackage{url} 5 | \usepackage{color} 6 | \usepackage[hidelinks]{hyperref} 7 | \usepackage{multirow} 8 | \usepackage{datetime} 9 | \usepackage{comment} 10 | \usepackage{xcolor} 11 | 12 | 13 | % Definitions and commands 14 | \def \np{\vskip 0.25 cm} 15 | \def \ap{\vskip 0.15 cm} 16 | 17 | \newcommand{\error}[1]{\textcolor{red}{\textbf{[Error]} #1}} 18 | 19 | 20 | \begin{document} 21 | \begin{titlepage} 22 | 23 | \begin{center} 24 | \vspace*{-1in} 25 | 26 | \vspace*{0.6in} 27 | \begin{Large} 28 | \textbf{The IPOL Demo System 2.0 \\Microservices API} \\ 29 | \end{Large} 30 | 31 | \vspace*{0.6in} 32 | 33 | \small{Compiled on \today\ at \currenttime} 34 | 35 | \vspace*{0.6in} 36 | \rule{80mm}{0.1mm}\\ 37 | \vspace*{0.1in} 38 | \end{center} 39 | 40 | \end{titlepage} 41 | 42 | This document is the IPOL Demo System 2.0 API specification. 43 | 44 | %\maketitle 45 | \newpage 46 | 47 | \tableofcontents 48 | \newpage 49 | 50 | \section{Introduction} 51 | \label{sec:introduction} 52 | This API documentation is automatically obtained from the source code to prevent that it gets desynchronized and outdated. 53 | Therefore, it is assumed to be up to date and to describe the exact signatures of the services exposed by the API. 54 | 55 | 56 | \section{Signatures of the services in the API} 57 | \label{sec:Docstring} 58 | This API documentation is automatically obtained from the source code to prevent that it gets desynchronized and outdated. 59 | Therefore, it is assumed to be up to date and to describe the exact services exposed by the API. 60 | 61 | \input{docstrings.tex} 62 | 63 | \end{document} 64 | % End of document 65 | -------------------------------------------------------------------------------- /cp2/ControlPanel/ControlPanel/utils.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | import requests 5 | 6 | # function in order to know wich machine/server it's used for POST and GET methods (/api/....) 7 | 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | def api_post(resource, method, **kwargs): 13 | host = os.environ["IPOL_URL"] 14 | if method == "get": 15 | response = requests.get(f"{host}{resource}", **kwargs) 16 | return response.json(), response.status_code 17 | elif method == "put": 18 | response = requests.put(f"{host}{resource}", **kwargs) 19 | return response, response.status_code 20 | elif method == "patch": 21 | response = requests.patch(f"{host}{resource}", **kwargs) 22 | return response.json(), response.status_code 23 | elif method == "post": 24 | response = requests.post(f"{host}{resource}", **kwargs) 25 | return response.json(), response.status_code 26 | elif method == "delete": 27 | response = requests.delete(f"{host}{resource}", **kwargs) 28 | return response, response.status_code 29 | else: 30 | assert False, f"Invalid HTTP(S) method: '{method}'." 31 | 32 | 33 | def user_can_edit_demo(user, demo_id): 34 | if user.is_staff or user.is_superuser: 35 | return True 36 | editors_list, status = api_post( 37 | f"/api/demoinfo/demos/{demo_id}/editors", method="get" 38 | ) 39 | if status != 200: 40 | logger.error( 41 | "Something wrong in user_can_edit_demo, %s %s", editors_list, status 42 | ) 43 | return False 44 | for editor in editors_list: 45 | if editor.get("mail") == user.email: 46 | return True 47 | return False 48 | -------------------------------------------------------------------------------- /ipol_demo/clientApp/css/inpainting.css: -------------------------------------------------------------------------------- 1 | #inpainting-buttons { 2 | display: grid; 3 | 4 | grid-gap: 5px; 5 | grid-template-columns: repeat(2, 1fr); 6 | 7 | padding-bottom: 5px; 8 | } 9 | 10 | #inpainting-buttons > button { 11 | padding: 5px 0; 12 | 13 | cursor: pointer; 14 | 15 | border: 1px solid #C6C6C6; 16 | border-radius: 2px; 17 | } 18 | 19 | #inpainting-buttons > button:hover { 20 | padding: 5px 0; 21 | 22 | cursor: pointer; 23 | 24 | border: 1px solid #A8A8A8; 25 | -webkit-box-shadow: 2px 2px 3px #9997999; 26 | -moz-box-shadow: 2px 2px 3px #9997999; 27 | box-shadow: 2px 2px 3px #9997999; 28 | } 29 | 30 | .color-picker-container { 31 | display: flex; 32 | align-content: center; 33 | align-items: center; 34 | } 35 | 36 | .color-picker-label { 37 | cursor: pointer; 38 | } 39 | 40 | .color-picker-circle { 41 | position: relative; 42 | 43 | overflow: hidden; 44 | 45 | width: 20px; 46 | height: 20px; 47 | margin: 0 5px; 48 | 49 | cursor: pointer; 50 | 51 | border: solid 2px #DDD; 52 | border-radius: 40px; 53 | } 54 | 55 | .color-picker { 56 | position: absolute; 57 | top: -10px; 58 | right: -10px; 59 | 60 | width: 35px; 61 | height: 35px; 62 | 63 | cursor: pointer; 64 | 65 | border: none; 66 | } 67 | 68 | .blobEditorCanvas { 69 | cursor: crosshair; 70 | 71 | background-size: cover; 72 | } 73 | 74 | #erase-btn:active, .activated { 75 | color: #E55252FC; 76 | border: 1px solid #E55252FC !important; 77 | } 78 | 79 | #size-selector-container { 80 | display: flex; 81 | align-items: center; 82 | } 83 | 84 | #size-selector-container > label { 85 | padding-right: 5px; 86 | } 87 | 88 | #size-selector { 89 | min-width: 50%; 90 | width: 100%; 91 | } -------------------------------------------------------------------------------- /cp2/ControlPanel/static_cp/css/archive.css: -------------------------------------------------------------------------------- 1 | .archive-head { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | width: 80%; 6 | margin: 0 auto; 7 | } 8 | 9 | .archive-pagination { 10 | display: flex; 11 | } 12 | 13 | .page-input { 14 | display: flex; 15 | } 16 | 17 | .page-input i { 18 | transform: translateX(-2rem); 19 | width: 0; 20 | line-height: 38px; 21 | } 22 | 23 | #page-input { 24 | padding: 0.5rem; 25 | border: 2px solid #555; 26 | border-radius: var(--border-radius); 27 | font-size: var(--fs-normal); 28 | width: 4rem; 29 | transition: all 0.3s ease-in-out; 30 | } 31 | 32 | .experiment-container { 33 | display: flex; 34 | gap: 2rem; 35 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); 36 | margin: 1rem auto; 37 | max-width: 80%; 38 | flex-wrap: wrap; 39 | align-items: center; 40 | place-content: space-around; 41 | } 42 | 43 | .experiment { 44 | width: 100%; 45 | padding: 1rem; 46 | box-shadow: var(--box-shadow); 47 | } 48 | 49 | .experiment-info { 50 | padding: 1rem; 51 | } 52 | 53 | .files { 54 | display: grid; 55 | grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr)); 56 | grid-auto-flow: dense; 57 | gap: 1rem; 58 | padding: 1rem; 59 | align-items: center; 60 | justify-content: space-between; 61 | justify-items: center; 62 | } 63 | 64 | .img-container { 65 | width: 100%; 66 | height: auto; 67 | } 68 | 69 | .img-container > img { 70 | width: 100%; 71 | height: auto; 72 | } 73 | 74 | .params { 75 | display: flex; 76 | flex-direction: column; 77 | padding: 1rem; 78 | align-items: flex-start; 79 | } 80 | --------------------------------------------------------------------------------