├── .dockerignore ├── .env ├── .gitattributes ├── .gitignore ├── README.md ├── alpine_docker.zip ├── apps ├── __init__.py ├── allapp.py ├── cmdb │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── host.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ └── __init__.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── __init__.py │ │ └── data.json │ ├── models.py │ ├── signals.py │ ├── templates │ │ └── cmdb │ │ │ ├── _menu.html │ │ │ ├── host_list.html │ │ │ ├── hostgroup_list.html │ │ │ ├── hostuser_list.html │ │ │ ├── perm_list.html │ │ │ ├── sessionlist.html │ │ │ ├── sshmonitor.html │ │ │ ├── sshreplay.html │ │ │ └── term.html │ ├── tests.py │ ├── urls.py │ ├── views.py │ └── ws.py ├── dock │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── conf.py │ ├── dk.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20200303_1126.py │ │ └── __init__.py │ ├── models.py │ ├── templates │ │ └── dock │ │ │ ├── _menu.html │ │ │ ├── compose.html │ │ │ ├── compose_list.html │ │ │ ├── container.html │ │ │ ├── container_add.html │ │ │ ├── host_list.html │ │ │ ├── image.html │ │ │ ├── imagefile_list.html │ │ │ ├── info.html │ │ │ ├── net.html │ │ │ ├── net_add.html │ │ │ ├── webssh.html │ │ │ ├── yml.html │ │ │ └── yml_list.html │ ├── tests.py │ ├── urls.py │ ├── views.py │ └── ws.py ├── elfinder │ ├── .gitignore │ ├── __init__.py │ ├── conf.py │ ├── connector.py │ ├── exceptions.py │ ├── locale │ │ ├── el │ │ │ └── LC_MESSAGES │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ ├── zh-Hans │ │ │ └── LC_MESSAGES │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ ├── zh_Hans │ │ │ └── LC_MESSAGES │ │ │ │ ├── django.mo │ │ │ │ └── django.po │ │ └── zh_cn │ │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sftpstoragedriver │ │ ├── __init__.py │ │ ├── sftpstorage.py │ │ └── utils.py │ ├── urls.py │ ├── utils │ │ ├── __init__.py │ │ ├── accesscontrol.py │ │ ├── archivers.py │ │ └── volumes.py │ ├── views.py │ └── volumes │ │ ├── __init__.py │ │ ├── base.py │ │ ├── filesystem.py │ │ └── storage.py ├── generic │ ├── __init__.py │ ├── apps.py │ ├── templates │ │ └── generic │ │ │ ├── _detail.html │ │ │ ├── _form.html │ │ │ └── _list.html │ ├── templatetags │ │ └── tags.py │ └── views.py ├── guacamole │ ├── __init__.py │ ├── apps.py │ ├── client.py │ ├── conf.py │ ├── conn.py │ ├── exceptions.py │ ├── instruction.py │ ├── models.py │ ├── templates │ │ └── guacamole │ │ │ ├── index.html │ │ │ ├── monitor.html │ │ │ └── replay.html │ ├── urls.py │ ├── views.py │ └── ws.py ├── ops │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── opt.py │ ├── templates │ │ └── ops │ │ │ ├── _menu.html │ │ │ ├── group_list.html │ │ │ └── userprofile_list.html │ ├── tests.py │ ├── urls.py │ └── views.py ├── readonly │ ├── __init__.py │ ├── addreadonly.py │ └── management.py ├── suitconf.py └── term │ ├── __init__.py │ ├── conf.py │ ├── conn.py │ ├── gunicorn启动进程 │ ├── asgi.py │ └── workers.py │ ├── interactive.py │ ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── proxy_sshd.py │ ├── models.py │ ├── proxy.py │ ├── rsa_private.key │ ├── session.py │ ├── sftp.py │ ├── ssh.py │ ├── sshd.py │ ├── utils.py │ └── 客户端 │ └── linux_xshell.zip ├── c ├── d ├── d.sh ├── gt └── r ├── conf.yml ├── config ├── __init__.py ├── conf_example.py ├── confile.py └── priority.py ├── db.sqlite3 ├── docker-compose.yml ├── docker-entrypoint.sh ├── dx ├── __init__.py ├── asgi.py ├── routing.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── help ├── websftp.png ├── websftp2.png ├── webssh.png └── xshell.gif ├── logs └── .gitkeep ├── manage.py ├── media ├── guacamole │ └── guacd.txt └── sshreplay │ └── 2021.06.30.09.41.00.e2b728.json ├── requirements.2222.txt ├── requirements.txt ├── rsync.txt ├── static ├── admin │ ├── css │ │ ├── base.css │ │ ├── changelists.css │ │ ├── dashboard.css │ │ ├── fonts.css │ │ ├── forms.css │ │ ├── login.css │ │ ├── rtl.css │ │ └── widgets.css │ ├── fonts │ │ ├── LICENSE.txt │ │ ├── README.txt │ │ ├── Roboto-Bold-webfont.woff │ │ ├── Roboto-Light-webfont.woff │ │ └── Roboto-Regular-webfont.woff │ ├── img │ │ ├── LICENSE │ │ ├── README.txt │ │ ├── calendar-icons.svg │ │ ├── gis │ │ │ ├── move_vertex_off.svg │ │ │ └── move_vertex_on.svg │ │ ├── icon-addlink.svg │ │ ├── icon-alert.svg │ │ ├── icon-calendar.svg │ │ ├── icon-changelink.svg │ │ ├── icon-clock.svg │ │ ├── icon-deletelink.svg │ │ ├── icon-no.svg │ │ ├── icon-unknown-alt.svg │ │ ├── icon-unknown.svg │ │ ├── icon-yes.svg │ │ ├── inline-delete.svg │ │ ├── search.svg │ │ ├── selector-icons.svg │ │ ├── sorting-icons.svg │ │ ├── tooltag-add.svg │ │ └── tooltag-arrowright.svg │ └── js │ │ ├── SelectBox.js │ │ ├── SelectFilter2.js │ │ ├── actions.js │ │ ├── actions.min.js │ │ ├── admin │ │ ├── DateTimeShortcuts.js │ │ └── RelatedObjectLookups.js │ │ ├── calendar.js │ │ ├── cancel.js │ │ ├── change_form.js │ │ ├── collapse.js │ │ ├── collapse.min.js │ │ ├── core.js │ │ ├── inlines.js │ │ ├── inlines.min.js │ │ ├── jquery.init.js │ │ ├── popup_response.js │ │ ├── prepopulate.js │ │ ├── prepopulate.min.js │ │ ├── prepopulate_init.js │ │ ├── timeparse.js │ │ ├── urlify.js │ │ └── vendor │ │ ├── jquery │ │ ├── LICENSE-JQUERY.txt │ │ ├── jquery.js │ │ └── jquery.min.js │ │ └── xregexp │ │ ├── LICENSE-XREGEXP.txt │ │ ├── xregexp.js │ │ └── xregexp.min.js ├── codemirror │ ├── addon │ │ ├── comment │ │ │ ├── comment.js │ │ │ └── continuecomment.js │ │ ├── dialog │ │ │ ├── dialog.css │ │ │ └── dialog.js │ │ ├── display │ │ │ ├── autorefresh.js │ │ │ ├── fullscreen.css │ │ │ ├── fullscreen.js │ │ │ ├── panel.js │ │ │ ├── placeholder.js │ │ │ └── rulers.js │ │ ├── edit │ │ │ ├── closebrackets.js │ │ │ ├── closetag.js │ │ │ ├── continuelist.js │ │ │ ├── matchbrackets.js │ │ │ ├── matchtags.js │ │ │ └── trailingspace.js │ │ ├── fold │ │ │ ├── brace-fold.js │ │ │ ├── comment-fold.js │ │ │ ├── foldcode.js │ │ │ ├── foldgutter.css │ │ │ ├── foldgutter.js │ │ │ ├── indent-fold.js │ │ │ ├── markdown-fold.js │ │ │ └── xml-fold.js │ │ ├── hint │ │ │ ├── anyword-hint.js │ │ │ ├── css-hint.js │ │ │ ├── html-hint.js │ │ │ ├── javascript-hint.js │ │ │ ├── show-hint.css │ │ │ ├── show-hint.js │ │ │ ├── sql-hint.js │ │ │ └── xml-hint.js │ │ ├── lint │ │ │ ├── coffeescript-lint.js │ │ │ ├── css-lint.js │ │ │ ├── html-lint.js │ │ │ ├── javascript-lint.js │ │ │ ├── json-lint.js │ │ │ ├── lint.css │ │ │ ├── lint.js │ │ │ └── yaml-lint.js │ │ ├── merge │ │ │ ├── merge.css │ │ │ └── merge.js │ │ ├── mode │ │ │ ├── loadmode.js │ │ │ ├── multiplex.js │ │ │ ├── multiplex_test.js │ │ │ ├── overlay.js │ │ │ └── simple.js │ │ ├── runmode │ │ │ ├── colorize.js │ │ │ ├── runmode-standalone.js │ │ │ ├── runmode.js │ │ │ └── runmode.node.js │ │ ├── scroll │ │ │ ├── annotatescrollbar.js │ │ │ ├── scrollpastend.js │ │ │ ├── simplescrollbars.css │ │ │ └── simplescrollbars.js │ │ ├── search │ │ │ ├── jump-to-line.js │ │ │ ├── match-highlighter.js │ │ │ ├── matchesonscrollbar.css │ │ │ ├── matchesonscrollbar.js │ │ │ ├── search.js │ │ │ └── searchcursor.js │ │ ├── selection │ │ │ ├── active-line.js │ │ │ ├── mark-selection.js │ │ │ └── selection-pointer.js │ │ ├── tern │ │ │ ├── tern.css │ │ │ ├── tern.js │ │ │ └── worker.js │ │ └── wrap │ │ │ └── hardwrap.js │ ├── lib │ │ ├── codemirror.css │ │ └── codemirror.js │ ├── mode │ │ ├── apl │ │ │ ├── apl.js │ │ │ └── index.html │ │ ├── asciiarmor │ │ │ ├── asciiarmor.js │ │ │ └── index.html │ │ ├── asn.1 │ │ │ ├── asn.1.js │ │ │ └── index.html │ │ ├── asterisk │ │ │ ├── asterisk.js │ │ │ └── index.html │ │ ├── brainfuck │ │ │ ├── brainfuck.js │ │ │ └── index.html │ │ ├── clike │ │ │ ├── clike.js │ │ │ ├── index.html │ │ │ ├── scala.html │ │ │ └── test.js │ │ ├── clojure │ │ │ ├── clojure.js │ │ │ └── index.html │ │ ├── cmake │ │ │ ├── cmake.js │ │ │ └── index.html │ │ ├── cobol │ │ │ ├── cobol.js │ │ │ └── index.html │ │ ├── coffeescript │ │ │ ├── coffeescript.js │ │ │ └── index.html │ │ ├── commonlisp │ │ │ ├── commonlisp.js │ │ │ └── index.html │ │ ├── crystal │ │ │ ├── crystal.js │ │ │ └── index.html │ │ ├── css │ │ │ ├── css.js │ │ │ ├── gss.html │ │ │ ├── gss_test.js │ │ │ ├── index.html │ │ │ ├── less.html │ │ │ ├── less_test.js │ │ │ ├── scss.html │ │ │ ├── scss_test.js │ │ │ └── test.js │ │ ├── cypher │ │ │ ├── cypher.js │ │ │ ├── index.html │ │ │ └── test.js │ │ ├── d │ │ │ ├── d.js │ │ │ ├── index.html │ │ │ └── test.js │ │ ├── dart │ │ │ ├── dart.js │ │ │ └── index.html │ │ ├── diff │ │ │ ├── diff.js │ │ │ └── index.html │ │ ├── django │ │ │ ├── django.js │ │ │ └── index.html │ │ ├── dockerfile │ │ │ ├── dockerfile.js │ │ │ └── index.html │ │ ├── dtd │ │ │ ├── dtd.js │ │ │ └── index.html │ │ ├── dylan │ │ │ ├── dylan.js │ │ │ ├── index.html │ │ │ └── test.js │ │ ├── ebnf │ │ │ ├── ebnf.js │ │ │ └── index.html │ │ ├── ecl │ │ │ ├── ecl.js │ │ │ └── index.html │ │ ├── eiffel │ │ │ ├── eiffel.js │ │ │ └── index.html │ │ ├── elm │ │ │ ├── elm.js │ │ │ └── index.html │ │ ├── erlang │ │ │ ├── erlang.js │ │ │ └── index.html │ │ ├── factor │ │ │ ├── factor.js │ │ │ └── index.html │ │ ├── fcl │ │ │ ├── fcl.js │ │ │ └── index.html │ │ ├── forth │ │ │ ├── forth.js │ │ │ └── index.html │ │ ├── fortran │ │ │ ├── fortran.js │ │ │ └── index.html │ │ ├── gas │ │ │ ├── gas.js │ │ │ └── index.html │ │ ├── gfm │ │ │ ├── gfm.js │ │ │ ├── index.html │ │ │ └── test.js │ │ ├── gherkin │ │ │ ├── gherkin.js │ │ │ └── index.html │ │ ├── go │ │ │ ├── go.js │ │ │ └── index.html │ │ ├── groovy │ │ │ ├── groovy.js │ │ │ └── index.html │ │ ├── haml │ │ │ ├── haml.js │ │ │ ├── index.html │ │ │ └── test.js │ │ ├── handlebars │ │ │ ├── handlebars.js │ │ │ └── index.html │ │ ├── haskell-literate │ │ │ ├── haskell-literate.js │ │ │ └── index.html │ │ ├── haskell │ │ │ ├── haskell.js │ │ │ └── index.html │ │ ├── haxe │ │ │ ├── haxe.js │ │ │ └── index.html │ │ ├── htmlembedded │ │ │ ├── htmlembedded.js │ │ │ └── index.html │ │ ├── htmlmixed │ │ │ ├── htmlmixed.js │ │ │ └── index.html │ │ ├── http │ │ │ ├── http.js │ │ │ └── index.html │ │ ├── idl │ │ │ ├── idl.js │ │ │ └── index.html │ │ ├── index.html │ │ ├── javascript │ │ │ ├── index.html │ │ │ ├── javascript.js │ │ │ ├── json-ld.html │ │ │ ├── test.js │ │ │ └── typescript.html │ │ ├── jinja2 │ │ │ ├── index.html │ │ │ └── jinja2.js │ │ ├── jsx │ │ │ ├── index.html │ │ │ ├── jsx.js │ │ │ └── test.js │ │ ├── julia │ │ │ ├── index.html │ │ │ └── julia.js │ │ ├── livescript │ │ │ ├── index.html │ │ │ └── livescript.js │ │ ├── lua │ │ │ ├── index.html │ │ │ └── lua.js │ │ ├── markdown │ │ │ ├── index.html │ │ │ ├── markdown.js │ │ │ └── test.js │ │ ├── mathematica │ │ │ ├── index.html │ │ │ └── mathematica.js │ │ ├── mbox │ │ │ ├── index.html │ │ │ └── mbox.js │ │ ├── meta.js │ │ ├── mirc │ │ │ ├── index.html │ │ │ └── mirc.js │ │ ├── mllike │ │ │ ├── index.html │ │ │ └── mllike.js │ │ ├── modelica │ │ │ ├── index.html │ │ │ └── modelica.js │ │ ├── mscgen │ │ │ ├── index.html │ │ │ ├── mscgen.js │ │ │ ├── mscgen_test.js │ │ │ ├── msgenny_test.js │ │ │ └── xu_test.js │ │ ├── mumps │ │ │ ├── index.html │ │ │ └── mumps.js │ │ ├── nginx │ │ │ ├── index.html │ │ │ └── nginx.js │ │ ├── nsis │ │ │ ├── index.html │ │ │ └── nsis.js │ │ ├── ntriples │ │ │ ├── index.html │ │ │ └── ntriples.js │ │ ├── octave │ │ │ ├── index.html │ │ │ └── octave.js │ │ ├── oz │ │ │ ├── index.html │ │ │ └── oz.js │ │ ├── pascal │ │ │ ├── index.html │ │ │ └── pascal.js │ │ ├── pegjs │ │ │ ├── index.html │ │ │ └── pegjs.js │ │ ├── perl │ │ │ ├── index.html │ │ │ └── perl.js │ │ ├── php │ │ │ ├── index.html │ │ │ ├── php.js │ │ │ └── test.js │ │ ├── pig │ │ │ ├── index.html │ │ │ └── pig.js │ │ ├── powershell │ │ │ ├── index.html │ │ │ ├── powershell.js │ │ │ └── test.js │ │ ├── properties │ │ │ ├── index.html │ │ │ └── properties.js │ │ ├── protobuf │ │ │ ├── index.html │ │ │ └── protobuf.js │ │ ├── pug │ │ │ ├── index.html │ │ │ └── pug.js │ │ ├── puppet │ │ │ ├── index.html │ │ │ └── puppet.js │ │ ├── python │ │ │ ├── index.html │ │ │ ├── python.js │ │ │ └── test.js │ │ ├── q │ │ │ ├── index.html │ │ │ └── q.js │ │ ├── r │ │ │ ├── index.html │ │ │ └── r.js │ │ ├── rpm │ │ │ ├── changes │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ └── rpm.js │ │ ├── rst │ │ │ ├── index.html │ │ │ └── rst.js │ │ ├── ruby │ │ │ ├── index.html │ │ │ ├── ruby.js │ │ │ └── test.js │ │ ├── rust │ │ │ ├── index.html │ │ │ ├── rust.js │ │ │ └── test.js │ │ ├── sas │ │ │ ├── index.html │ │ │ └── sas.js │ │ ├── sass │ │ │ ├── index.html │ │ │ ├── sass.js │ │ │ └── test.js │ │ ├── scheme │ │ │ ├── index.html │ │ │ └── scheme.js │ │ ├── shell │ │ │ ├── index.html │ │ │ ├── shell.js │ │ │ └── test.js │ │ ├── sieve │ │ │ ├── index.html │ │ │ └── sieve.js │ │ ├── slim │ │ │ ├── index.html │ │ │ ├── slim.js │ │ │ └── test.js │ │ ├── smalltalk │ │ │ ├── index.html │ │ │ └── smalltalk.js │ │ ├── smarty │ │ │ ├── index.html │ │ │ └── smarty.js │ │ ├── solr │ │ │ ├── index.html │ │ │ └── solr.js │ │ ├── soy │ │ │ ├── index.html │ │ │ ├── soy.js │ │ │ └── test.js │ │ ├── sparql │ │ │ ├── index.html │ │ │ └── sparql.js │ │ ├── spreadsheet │ │ │ ├── index.html │ │ │ └── spreadsheet.js │ │ ├── sql │ │ │ ├── index.html │ │ │ └── sql.js │ │ ├── stex │ │ │ ├── index.html │ │ │ ├── stex.js │ │ │ └── test.js │ │ ├── stylus │ │ │ ├── index.html │ │ │ └── stylus.js │ │ ├── swift │ │ │ ├── index.html │ │ │ ├── swift.js │ │ │ └── test.js │ │ ├── tcl │ │ │ ├── index.html │ │ │ └── tcl.js │ │ ├── textile │ │ │ ├── index.html │ │ │ ├── test.js │ │ │ └── textile.js │ │ ├── tiddlywiki │ │ │ ├── index.html │ │ │ ├── tiddlywiki.css │ │ │ └── tiddlywiki.js │ │ ├── tiki │ │ │ ├── index.html │ │ │ ├── tiki.css │ │ │ └── tiki.js │ │ ├── toml │ │ │ ├── index.html │ │ │ └── toml.js │ │ ├── tornado │ │ │ ├── index.html │ │ │ └── tornado.js │ │ ├── troff │ │ │ ├── index.html │ │ │ └── troff.js │ │ ├── ttcn-cfg │ │ │ ├── index.html │ │ │ └── ttcn-cfg.js │ │ ├── ttcn │ │ │ ├── index.html │ │ │ └── ttcn.js │ │ ├── turtle │ │ │ ├── index.html │ │ │ └── turtle.js │ │ ├── twig │ │ │ ├── index.html │ │ │ └── twig.js │ │ ├── vb │ │ │ ├── index.html │ │ │ └── vb.js │ │ ├── vbscript │ │ │ ├── index.html │ │ │ └── vbscript.js │ │ ├── velocity │ │ │ ├── index.html │ │ │ └── velocity.js │ │ ├── verilog │ │ │ ├── index.html │ │ │ ├── test.js │ │ │ └── verilog.js │ │ ├── vhdl │ │ │ ├── index.html │ │ │ └── vhdl.js │ │ ├── vue │ │ │ ├── index.html │ │ │ └── vue.js │ │ ├── webidl │ │ │ ├── index.html │ │ │ └── webidl.js │ │ ├── xml │ │ │ ├── index.html │ │ │ ├── test.js │ │ │ └── xml.js │ │ ├── xquery │ │ │ ├── index.html │ │ │ ├── test.js │ │ │ └── xquery.js │ │ ├── yacas │ │ │ ├── index.html │ │ │ └── yacas.js │ │ ├── yaml-frontmatter │ │ │ ├── index.html │ │ │ └── yaml-frontmatter.js │ │ ├── yaml │ │ │ ├── index.html │ │ │ └── yaml.js │ │ └── z80 │ │ │ ├── index.html │ │ │ └── z80.js │ └── theme │ │ ├── 3024-day.css │ │ ├── 3024-night.css │ │ ├── abcdef.css │ │ ├── ambiance-mobile.css │ │ ├── ambiance.css │ │ ├── base16-dark.css │ │ ├── base16-light.css │ │ ├── bespin.css │ │ ├── blackboard.css │ │ ├── cobalt.css │ │ ├── colorforth.css │ │ ├── dracula.css │ │ ├── duotone-dark.css │ │ ├── duotone-light.css │ │ ├── eclipse.css │ │ ├── elegant.css │ │ ├── erlang-dark.css │ │ ├── hopscotch.css │ │ ├── icecoder.css │ │ ├── isotope.css │ │ ├── lesser-dark.css │ │ ├── liquibyte.css │ │ ├── material.css │ │ ├── mbo.css │ │ ├── mdn-like.css │ │ ├── midnight.css │ │ ├── monokai.css │ │ ├── neat.css │ │ ├── neo.css │ │ ├── night.css │ │ ├── panda-syntax.css │ │ ├── paraiso-dark.css │ │ ├── paraiso-light.css │ │ ├── pastel-on-dark.css │ │ ├── railscasts.css │ │ ├── rubyblue.css │ │ ├── seti.css │ │ ├── solarized.css │ │ ├── the-matrix.css │ │ ├── tomorrow-night-bright.css │ │ ├── tomorrow-night-eighties.css │ │ ├── ttcn.css │ │ ├── twilight.css │ │ ├── vibrant-ink.css │ │ ├── xq-dark.css │ │ ├── xq-light.css │ │ ├── yeti.css │ │ └── zenburn.css ├── css │ ├── animate.css │ ├── awesome-bootstrap-checkbox.css │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── bootstrap.min.css │ ├── bootstrap.min.css.map │ ├── datatables.min.css │ ├── patterns │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── congruent_pentagon.png │ │ ├── header-profile-skin-1.png │ │ ├── header-profile-skin-2.png │ │ ├── header-profile-skin-3.png │ │ ├── header-profile.png │ │ ├── otis_redding.png │ │ ├── shattered.png │ │ └── triangular.png │ ├── plugins │ │ ├── __init__.py │ │ ├── chosen │ │ │ ├── bootstrap-chosen.css │ │ │ └── chosen-sprite.png │ │ ├── codemirror │ │ │ ├── ambiance.css │ │ │ ├── codemirror.css │ │ │ └── fold │ │ │ │ └── foldgutter.css │ │ └── select2 │ │ │ └── select2.min.css │ └── style.css ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── img │ ├── favicon.ico │ └── profile_small.jpg ├── js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── china.js │ ├── china.json │ ├── cmd │ │ ├── area.js │ │ └── cmd_h3c.js │ ├── datatables.min.js │ ├── echarts.jpg │ ├── echarts.js │ ├── echarts.min.js │ ├── inspinia.js │ ├── jquery-3.1.1.min.js │ ├── jquery.format.js │ ├── jquery.ztree.all.min.js │ ├── my.js │ ├── plugins │ │ ├── chosen │ │ │ └── chosen.jquery.js │ │ ├── codemirror │ │ │ ├── codemirror.js │ │ │ ├── edit │ │ │ │ └── matchbrackets.js │ │ │ ├── fold │ │ │ │ ├── brace-fold.js │ │ │ │ ├── comment-fold.js │ │ │ │ ├── foldcode.js │ │ │ │ ├── foldgutter.js │ │ │ │ ├── indent-fold.js │ │ │ │ ├── markdown-fold.js │ │ │ │ └── xml-fold.js │ │ │ └── mode │ │ │ │ ├── python.js │ │ │ │ ├── shell.js │ │ │ │ └── yaml.js │ │ ├── metisMenu │ │ │ └── jquery.metisMenu.js │ │ ├── pace │ │ │ └── pace.min.js │ │ ├── select2 │ │ │ └── select2.full.min.js │ │ └── slimscroll │ │ │ ├── jquery.slimscroll.js │ │ │ └── jquery.slimscroll.min.js │ └── posp.js ├── jstree │ ├── jstree.js │ ├── jstree.min.js │ └── themes │ │ ├── default-dark │ │ ├── 32px.png │ │ ├── 40px.png │ │ ├── style.css │ │ ├── style.min.css │ │ └── throbber.gif │ │ └── default │ │ ├── 32px.png │ │ ├── 40px.png │ │ ├── style.css │ │ ├── style.min.css │ │ └── throbber.gif ├── plugins │ ├── asciinema │ │ ├── 2019.02.14.15.36.15.b3b5b1.json │ │ ├── asciicast.json │ │ ├── asciinema-player.css │ │ ├── asciinema-player.js │ │ ├── demo.cast │ │ ├── index.html │ │ └── webssh.json │ ├── avue │ │ ├── 235 │ │ │ ├── avue-mobile.js │ │ │ ├── avue-mobile.min.js │ │ │ ├── avue.js │ │ │ ├── avue.min.js │ │ │ └── index.css │ │ ├── avue.css │ │ ├── avue.js │ │ ├── avue.min.js │ │ ├── index.css │ │ ├── index.js │ │ ├── vue-axios.es5.js │ │ └── vue-axios.min.js │ ├── axios │ │ └── axios.min.js │ ├── bootstrap-dialog │ │ ├── css │ │ │ ├── bootstrap-dialog.css │ │ │ └── bootstrap-dialog.min.css │ │ ├── js │ │ │ ├── bootstrap-dialog.js │ │ │ └── bootstrap-dialog.min.js │ │ └── less │ │ │ └── bootstrap-dialog.less │ ├── clipboard.js │ │ └── clipboard.min.js │ ├── datatimepicker │ │ ├── bootstrap-datetimepicker.js │ │ ├── css │ │ │ ├── bootstrap-datetimepicker-standalone.css │ │ │ ├── bootstrap-datetimepicker.css │ │ │ └── bootstrap-datetimepicker.min.css │ │ └── moment-with-locales.js │ ├── dualListbox │ │ ├── bootstrap-duallistbox.min.css │ │ └── jquery.bootstrap-duallistbox.js │ ├── element-ui │ │ └── 2.12.0 │ │ │ ├── fonts │ │ │ ├── element-icons.ttf │ │ │ └── element-icons.woff │ │ │ ├── index.css │ │ │ └── index.js │ ├── elfinder │ │ ├── .gitignore │ │ ├── ace │ │ │ ├── ace.js │ │ │ ├── ext-language_tools.js │ │ │ ├── ext-modelist.js │ │ │ ├── ext-settings_menu.js │ │ │ ├── mode-css.js │ │ │ ├── mode-html.js │ │ │ ├── mode-java.js │ │ │ ├── mode-jsp.js │ │ │ ├── mode-properties.js │ │ │ ├── mode-python.js │ │ │ ├── mode-sh.js │ │ │ ├── mode-xml.js │ │ │ ├── mode-yaml.js │ │ │ ├── snippets │ │ │ │ ├── html.js │ │ │ │ ├── java.js │ │ │ │ ├── jsp.js │ │ │ │ ├── properties.js │ │ │ │ ├── python.js │ │ │ │ ├── sh.js │ │ │ │ ├── xml.js │ │ │ │ └── yaml.js │ │ │ └── theme-monokai.js │ │ ├── css │ │ │ ├── elfinder.full.css │ │ │ ├── elfinder.min.css │ │ │ └── theme.css │ │ ├── files │ │ │ ├── .gitkeep │ │ │ └── .trash │ │ │ │ └── .gitkeep │ │ ├── img │ │ │ ├── arrows-active.png │ │ │ ├── arrows-normal.png │ │ │ ├── crop.gif │ │ │ ├── dialogs.png │ │ │ ├── edit_aceeditor.png │ │ │ ├── edit_ckeditor.png │ │ │ ├── edit_codemirror.png │ │ │ ├── edit_creativecloud.png │ │ │ ├── edit_pixlreditor.png │ │ │ ├── edit_pixlrexpress.png │ │ │ ├── edit_simplemde.png │ │ │ ├── edit_tinymce.png │ │ │ ├── edit_zohooffice.png │ │ │ ├── icons-big.png │ │ │ ├── icons-small.png │ │ │ ├── logo.png │ │ │ ├── progress.gif │ │ │ ├── quicklook-bg.png │ │ │ ├── quicklook-icons.png │ │ │ ├── resize.png │ │ │ ├── spinner-mini.gif │ │ │ ├── toolbar.png │ │ │ ├── ui-icons_ffffff_256x240.png │ │ │ ├── volume_icon_box.png │ │ │ ├── volume_icon_dropbox.png │ │ │ ├── volume_icon_ftp.png │ │ │ ├── volume_icon_googledrive.png │ │ │ ├── volume_icon_local.png │ │ │ ├── volume_icon_onedrive.png │ │ │ ├── volume_icon_sql.png │ │ │ └── volume_icon_trash.png │ │ ├── js │ │ │ ├── elfinder.full.js │ │ │ ├── elfinder.min.js │ │ │ ├── extras │ │ │ │ ├── editors.default.js │ │ │ │ ├── editors.default.min.js │ │ │ │ ├── encoding-japanese.min.js │ │ │ │ ├── quicklook.googledocs.js │ │ │ │ └── quicklook.googledocs.min.js │ │ │ ├── i18n │ │ │ │ ├── elfinder.LANG.js │ │ │ │ ├── elfinder.ar.js │ │ │ │ ├── elfinder.bg.js │ │ │ │ ├── elfinder.ca.js │ │ │ │ ├── elfinder.cs.js │ │ │ │ ├── elfinder.da.js │ │ │ │ ├── elfinder.de.js │ │ │ │ ├── elfinder.el.js │ │ │ │ ├── elfinder.es.js │ │ │ │ ├── elfinder.fa.js │ │ │ │ ├── elfinder.fallback.js │ │ │ │ ├── elfinder.fo.js │ │ │ │ ├── elfinder.fr.js │ │ │ │ ├── elfinder.he.js │ │ │ │ ├── elfinder.hr.js │ │ │ │ ├── elfinder.hu.js │ │ │ │ ├── elfinder.id.js │ │ │ │ ├── elfinder.it.js │ │ │ │ ├── elfinder.ja.js │ │ │ │ ├── elfinder.jp.js │ │ │ │ ├── elfinder.ko.js │ │ │ │ ├── elfinder.nl.js │ │ │ │ ├── elfinder.no.js │ │ │ │ ├── elfinder.pl.js │ │ │ │ ├── elfinder.pt_BR.js │ │ │ │ ├── elfinder.ro.js │ │ │ │ ├── elfinder.ru.js │ │ │ │ ├── elfinder.si.js │ │ │ │ ├── elfinder.sk.js │ │ │ │ ├── elfinder.sl.js │ │ │ │ ├── elfinder.sr.js │ │ │ │ ├── elfinder.sv.js │ │ │ │ ├── elfinder.tr.js │ │ │ │ ├── elfinder.ug_CN.js │ │ │ │ ├── elfinder.uk.js │ │ │ │ ├── elfinder.vi.js │ │ │ │ ├── elfinder.zh_CN.js │ │ │ │ ├── elfinder.zh_TW.js │ │ │ │ └── help │ │ │ │ │ ├── cs.html.js │ │ │ │ │ ├── en.html.js │ │ │ │ │ ├── ja.html.js │ │ │ │ │ ├── jp.html.js │ │ │ │ │ ├── ko.html.js │ │ │ │ │ ├── pl.html.js │ │ │ │ │ ├── ru.html.js │ │ │ │ │ ├── sk.html.js │ │ │ │ │ ├── zh.html.js │ │ │ │ │ └── zh_CN.html.js │ │ │ └── proxy │ │ │ │ └── elFinderSupportVer1.js │ │ ├── main.default.js │ │ └── sounds │ │ │ └── rm.wav │ ├── fileinput │ │ ├── css │ │ │ ├── fileinput-rtl.css │ │ │ ├── fileinput-rtl.min.css │ │ │ ├── fileinput.css │ │ │ └── fileinput.min.css │ │ ├── img │ │ │ ├── loading-sm.gif │ │ │ └── loading.gif │ │ └── js │ │ │ ├── fileinput.js │ │ │ ├── fileinput.min.js │ │ │ ├── locales │ │ │ ├── zh-TW.js │ │ │ └── zh.js │ │ │ └── plugins │ │ │ ├── piexif.js │ │ │ ├── piexif.min.js │ │ │ ├── purify.js │ │ │ ├── purify.min.js │ │ │ ├── sortable.js │ │ │ └── sortable.min.js │ ├── guacamole │ │ ├── 1.2.0 │ │ │ ├── guacamole-common.js │ │ │ └── guacamole-common.min.js │ │ ├── all.min.js │ │ ├── playback.css │ │ └── playback.js │ ├── jquery-ui │ │ ├── AUTHORS.txt │ │ ├── LICENSE.txt │ │ ├── images │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_95_fef1ec_1x400.png │ │ │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ └── ui-icons_cd0a0a_256x240.png │ │ ├── index.html │ │ ├── jquery-ui.css │ │ ├── jquery-ui.js │ │ ├── jquery-ui.min.css │ │ ├── jquery-ui.min.js │ │ ├── jquery-ui.structure.css │ │ ├── jquery-ui.structure.min.css │ │ ├── jquery-ui.theme.css │ │ ├── jquery-ui.theme.min.css │ │ └── package.json │ ├── mousetrap │ │ └── mousetrap.min.js │ ├── request.js │ ├── sweetalert │ │ ├── sweetalert2.all.min.js │ │ └── sweetalert2.min.css │ ├── vue │ │ └── 2.6.10 │ │ │ └── vue.min.js │ └── zmodem │ │ ├── zmodem.devel.js │ │ └── zmodem.js ├── suit │ ├── css │ │ ├── font-awesome.min.css │ │ ├── suit.bak.css │ │ └── suit.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ └── js │ │ ├── autosize.min.js │ │ ├── suit.js │ │ └── suit.sortables.js ├── switchery │ ├── switchery.min.css │ └── switchery.min.js ├── xterm │ ├── addons │ │ ├── attach │ │ │ ├── attach.js │ │ │ └── attach.js.map │ │ ├── fit │ │ │ ├── fit.js │ │ │ └── fit.js.map │ │ ├── fullscreen │ │ │ ├── fullscreen.css │ │ │ ├── fullscreen.js │ │ │ └── fullscreen.js.map │ │ ├── search │ │ │ ├── search.js │ │ │ └── search.js.map │ │ ├── terminado │ │ │ ├── terminado.js │ │ │ └── terminado.js.map │ │ ├── webLinks │ │ │ ├── webLinks.js │ │ │ └── webLinks.js.map │ │ ├── winptyCompat │ │ │ ├── winptyCompat.js │ │ │ └── winptyCompat.js.map │ │ └── zmodem │ │ │ ├── zmodem.js │ │ │ └── zmodem.js.map │ ├── cmdb_secure.zip │ ├── cmdb_ssh.reg │ ├── sshconnect.js │ ├── xterm.css │ ├── xterm.js │ └── xterm.js.map └── ztree │ ├── bootstrapStyle │ ├── bootstrapStyle.css │ └── img │ │ ├── bootstrap.gif │ │ ├── bootstrap.png │ │ ├── line_conn.png │ │ └── loading.gif │ ├── jquery.ztree.all.js │ ├── jquery.ztree.all.min.js │ └── zTreeStyle │ ├── img │ ├── diy │ │ ├── 1_close.png │ │ ├── 1_open.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ ├── line_conn.gif │ ├── loading.gif │ ├── zTreeStandard.gif │ └── zTreeStandard.png │ └── zTreeStyle.css ├── templates ├── admin │ ├── auth │ │ ├── group │ │ │ └── change_form.html │ │ └── user │ │ │ └── change_form.html │ └── base_site.html ├── base │ ├── _base.html │ ├── _css.html │ ├── _footer.html │ ├── _js.html │ ├── _left.html │ ├── _menu.html │ ├── _top.html │ ├── index.html │ ├── login.html │ ├── otp.html │ └── password.html └── suit │ ├── menu_item.html │ └── widgets │ └── 2related_widget_wrapper.html └── templatetags └── tags.py /.dockerignore: -------------------------------------------------------------------------------- 1 | logs/* 2 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | 2 | # 是否开启django debug, 0和1 3 | DJANGO_DEBUG=1 4 | 5 | # 日志级别 DEBUG INFO WARNING ERROR CRITICAL 6 | LOG_LEVEL=INFO 7 | 8 | # guacamole服务端存放远程桌面/VNC录像等数据所在路径(如果guacd为容器, 则为容器中的路径) 9 | GUACD_DATA_DIR=/guacamole 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=Python 2 | *.html linguist-language=Python 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .svn 2 | .git 3 | *.pyc 4 | *.log 5 | nohup.out 6 | # apps/*/migrations/0*.py 7 | # migrations 8 | #settings.py 9 | static/bak 10 | static/t 11 | __pycache__ 12 | 13 | -------------------------------------------------------------------------------- /alpine_docker.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/alpine_docker.zip -------------------------------------------------------------------------------- /apps/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/__init__.py -------------------------------------------------------------------------------- /apps/allapp.py: -------------------------------------------------------------------------------- 1 | 2 | import re 3 | from importlib import import_module 4 | from django.conf import settings 5 | import logging 6 | 7 | logger = logging.getLogger() 8 | 9 | # import ipdb; ipdb.set_trace() 10 | 11 | URLS_APPS = {} # 用于自动路由ws/urls、前端左边栏,使django “app”与“project”解耦合 12 | for app in settings.INSTALLED_APPS: 13 | # 按settings配置app的先后顺序,生成app:urls字典 14 | 15 | try: 16 | app_model = import_module(f'apps.{app}') # 尝试import apps.xxx模块 17 | except Exception: 18 | continue 19 | # print(app, 555555) 20 | res = re.match(r'(?P\w+)($|\.apps\.(?P\w+)Config)', app) 21 | if res: 22 | # cmdb 或 cmdb.apps.CmdbConfig,{'app_name': 'cmdb', 'app_name2': 'Cmdb'} 23 | app_name = res.groupdict()['app_name'] 24 | try: 25 | app_urls = import_module(f'{app_name}.urls') 26 | except Exception as e: 27 | if getattr(e, 'name', None) != f'{app}.urls': 28 | logger.error(e, exc_info=True) 29 | continue 30 | URLS_APPS[app_name] = app_urls 31 | 32 | # logger.info(URLS_APPS) 33 | 34 | -------------------------------------------------------------------------------- /apps/cmdb/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | default_app_config = 'cmdb.apps.CmdbConfig' 3 | -------------------------------------------------------------------------------- /apps/cmdb/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class CmdbConfig(AppConfig): 8 | name = 'cmdb' 9 | verbose_name = '资产管理' 10 | 11 | # def ready(self): 12 | # # signals are imported, so that they are defined and can be used 13 | # import cmdb.signals 14 | -------------------------------------------------------------------------------- /apps/cmdb/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/cmdb/management/__init__.py -------------------------------------------------------------------------------- /apps/cmdb/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/cmdb/management/commands/__init__.py -------------------------------------------------------------------------------- /apps/cmdb/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/cmdb/migrations/__init__.py -------------------------------------------------------------------------------- /apps/cmdb/signals.py: -------------------------------------------------------------------------------- 1 | # from django.dispatch import receiver 2 | # from django.db.models.signals import post_save, m2m_changed 3 | 4 | # from .models import NetPort 5 | 6 | 7 | # @receiver(post_save, sender=NetPort, dispatch_uid="NetPort_post_save") 8 | # def netport_model_handler(sender, **kwargs): 9 | # '''model.save()''' 10 | # obj = kwargs['instance'] 11 | # print('保存model: {}'.format(obj.__dict__)) 12 | # import ipdb;ipdb.set_trace() 13 | 14 | 15 | # @receiver(m2m_changed, sender=User.addresses.through, dispatch_uid="User_m2m_Address") 16 | # def address_changed(sender, **kwargs): 17 | # # import ipdb;ipdb.set_trace() 18 | # address_ids = kwargs.get('pk_set', set()) 19 | # if address_ids and kwargs.get('action') == 'post_add': 20 | # # print('m2m有添加!!!!!!!!!!', kwargs) 21 | # # 添加User - Address m2m关联记录, 有设置默认地址,将用户之前的默认地址改为非默认 22 | # Address.set_default(address_ids) 23 | -------------------------------------------------------------------------------- /apps/cmdb/templates/cmdb/sshreplay.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/cmdb/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.test import TestCase 5 | 6 | # Create your tests here. 7 | -------------------------------------------------------------------------------- /apps/dock/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | default_app_config = 'dock.apps.DockConfig' 3 | -------------------------------------------------------------------------------- /apps/dock/admin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.contrib import admin 5 | from . import models 6 | 7 | from readonly.addreadonly import ReadOnlyAdmin, ReadOnlyEditAdmin, MyAdmin as MyAdmin 8 | 9 | 10 | @admin.register(models.DockerHost) 11 | class DockerHostAdmin(MyAdmin): 12 | list_display = ('name', 'ip', 'port', 'tls', ) 13 | search_fields = ('ip', 'name') 14 | 15 | 16 | @admin.register(models.DockerYmlGroup) 17 | class DockerYmlGroupAdmin(MyAdmin): 18 | list_display = ('name', 'path', 'desc') 19 | 20 | 21 | @admin.register(models.DockerYml) 22 | class DockerYmlAdmin(MyAdmin): 23 | list_display = ('name', 'group', 'file') 24 | search_fields = ('name', ) 25 | list_filter = ('group',) 26 | 27 | 28 | @admin.register(models.DockerCompose) 29 | class DockerComposeAdmin(MyAdmin): 30 | list_display = ('name', 'dockerhost', 'yml', 'scale', ) 31 | search_fields = ('name', 'yml') 32 | list_filter = ('dockerhost',) 33 | 34 | def get_readonly_fields(self, request, obj=None): 35 | readonly_fields = list(super(self.__class__, self).get_readonly_fields(request, obj=None)) 36 | readonly_fields.append('dockerhost') 37 | readonly_fields.append('yml') 38 | return readonly_fields 39 | -------------------------------------------------------------------------------- /apps/dock/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DockConfig(AppConfig): 5 | name = 'dock' # 为防止与python本身中的docker模块import重名, 取名dock 6 | verbose_name = '容器管理' 7 | -------------------------------------------------------------------------------- /apps/dock/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | 4 | 5 | DOCKER_CERT_PATH = '/etc/docker' # docker客户端(cmdb本机)TSL证书目录,默认在cmdb运行用户的~/.docker/目录 6 | # 三个TSL证书文件名,必需为默认的cert.pem、ca.pem、key.pem,如果不默认,需在cmdb程序中指定 7 | if not os.path.isdir(DOCKER_CERT_PATH) or not os.path.exists(os.path.join(DOCKER_CERT_PATH, 'cert.pem')): 8 | DOCKER_CERT_PATH = None 9 | 10 | YmlDir = '/data/app/yml/' # yml文件根目录 11 | ImgDir = '/data/app/img/' # 镜像包文件根目录 12 | 13 | DOCKER_LOGS_LINES = 500 # 查看容器日志,显示最后XX行,默认为'all'所有日志 14 | -------------------------------------------------------------------------------- /apps/dock/migrations/0002_auto_20200303_1126.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-03-03 11:26 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('dock', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='dockerhost', 15 | options={'permissions': (('images_manage', '镜像管理'), ('containers_manage', '容器管理'), ('net_manage', '网络管理')), 'verbose_name': '容器宿主机'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /apps/dock/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/dock/migrations/__init__.py -------------------------------------------------------------------------------- /apps/dock/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/dock/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /apps/elfinder/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | -------------------------------------------------------------------------------- /apps/elfinder/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | # 网页SFTP后端接口 3 | __version__ = '0.0.1' -------------------------------------------------------------------------------- /apps/elfinder/locale/el/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/locale/el/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /apps/elfinder/locale/zh-Hans/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/locale/zh-Hans/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /apps/elfinder/locale/zh_Hans/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/locale/zh_Hans/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /apps/elfinder/locale/zh_cn/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/locale/zh_cn/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /apps/elfinder/sftpstoragedriver/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/sftpstoragedriver/__init__.py -------------------------------------------------------------------------------- /apps/elfinder/urls.py: -------------------------------------------------------------------------------- 1 | """elfinder URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.8/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 14 | """ 15 | from django.conf.urls import url 16 | from .views import ElfinderConnectorView 17 | 18 | urlpatterns = [ 19 | 20 | url(r'^yawd-connector/(?P.+)/(?P.+)/(?P.+)/$', ElfinderConnectorView.as_view(), name='yawdElfinderConnectorView'), 21 | 22 | ] 23 | -------------------------------------------------------------------------------- /apps/elfinder/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/utils/__init__.py -------------------------------------------------------------------------------- /apps/elfinder/utils/accesscontrol.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def fs_standard_access(attr, path, volume): 5 | """ 6 | Make dotfiles not readable, not writable, hidden and locked. 7 | Should return None to allow for original attribute value, boolean otherwise. 8 | This can be used in the :ref:`setting-accessControl` setting. 9 | 10 | Args: 11 | :attr: One of `read`, `write`, `hidden` and `locked`. 12 | :path: The path to check against. 13 | :volume: The volume responsible for managing the path. 14 | 15 | Returns: 16 | ``True`` if `path` has `attr` permissions, ``False`` if not and 17 | ``None`` to apply the default permission rules. 18 | """ 19 | 20 | if os.path.basename(path) in ['.tmb', '.quarantine']: 21 | #keep reserved folder names intact 22 | return None 23 | 24 | if volume.name() == 'localfilesystem': 25 | if attr in ['read', 'write'] and os.path.basename(path).startswith('.'): 26 | return False 27 | elif attr in ['hidden', 'locked'] and os.path.basename(path).startswith('.'): 28 | return True 29 | -------------------------------------------------------------------------------- /apps/elfinder/utils/archivers.py: -------------------------------------------------------------------------------- 1 | from zipfile import ZipFile 2 | 3 | 4 | class ZipFileArchiver(object): 5 | """ 6 | An archiver used to generate .zip files. 7 | This wraps Python's built in :class:`zipfile.ZipFile` 8 | methods to operate exactly like :class:`tarfile.TarFile` does. 9 | """ 10 | 11 | def __init__(self, *args, **kwargs): 12 | """ 13 | Create a :class:`.ZipFileArchiver` instance. We create a new 14 | :class:`zipfile.ZipFile` and store it to the ``zipfile`` member. 15 | """ 16 | self.zipfile = ZipFile(*args, **kwargs) 17 | 18 | @classmethod 19 | def open(self, *args, **kwargs): 20 | """ 21 | Open the archive. This must be a classmethod. 22 | """ 23 | return ZipFileArchiver(*args,**kwargs) 24 | 25 | def add(self, *args, **kwargs): 26 | """ 27 | Add file to the archive. 28 | """ 29 | self.zipfile.write(*args, **kwargs) 30 | 31 | def extractall(self, *args, **kwargs): 32 | """ 33 | Extract all files from the archive. 34 | """ 35 | self.zipfile.extractall(*args, **kwargs) 36 | 37 | def close(self): 38 | """ 39 | Close the archive. 40 | """ 41 | self.zipfile.close() 42 | -------------------------------------------------------------------------------- /apps/elfinder/volumes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/elfinder/volumes/__init__.py -------------------------------------------------------------------------------- /apps/generic/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/generic/__init__.py -------------------------------------------------------------------------------- /apps/generic/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class GenericConfig(AppConfig): 5 | name = '通用视图模板' 6 | -------------------------------------------------------------------------------- /apps/generic/templatetags/tags.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | # from importlib import import_module 3 | 4 | import logging 5 | from django import template 6 | register = template.Library() 7 | logger = logging.getLogger() 8 | 9 | 10 | @register.filter 11 | def debug(mm, nn=None): 12 | # 自定义过滤器 - 模板调试 {{ mm|debug:nn }} 13 | print({'mm': mm, 'nn': nn}) 14 | import ipdb; ipdb.set_trace() 15 | return 16 | 17 | 18 | @register.simple_tag 19 | def add(*args): 20 | # 自定义标签 -- 字段串拼接 {% add a b c %} (内置过滤器add一次只能拼接二个变量, 语法长不直观) 21 | return ''.join([str(i) for i in args]) 22 | -------------------------------------------------------------------------------- /apps/guacamole/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/guacamole/__init__.py -------------------------------------------------------------------------------- /apps/guacamole/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class CoreConfig(AppConfig): 8 | name = 'guacamole' 9 | -------------------------------------------------------------------------------- /apps/guacamole/exceptions.py: -------------------------------------------------------------------------------- 1 | """ 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2014 - 2016 Mohab Usama 5 | """ 6 | 7 | 8 | class GuacamoleError(Exception): 9 | def __init__(self, message): 10 | super(GuacamoleError, self).__init__( 11 | 'Guacamole Protocol Error. %s' % message 12 | ) 13 | 14 | 15 | class InvalidInstruction(Exception): 16 | def __init__(self, message): 17 | super(InvalidInstruction, self).__init__( 18 | 'Invalid Guacamole Instruction! %s' % message 19 | ) 20 | -------------------------------------------------------------------------------- /apps/guacamole/models.py: -------------------------------------------------------------------------------- 1 | # from django.db import models 2 | 3 | from cmdb.models import Host, HostUser, Session 4 | # Create your models here. 5 | -------------------------------------------------------------------------------- /apps/guacamole/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url 2 | 3 | from guacamole import views 4 | from guacamole.ws import GuacamoleWebsocket, GuacamoleMonitor 5 | 6 | urlpatterns = [ 7 | url(r'^(?P\d+)/(?P\d+)/$', views.Index.as_view(), name='guacamole'), 8 | # url(r'^monitor/(?P\d+)/', views.Monitor.as_view(), name='monitor'), 9 | url(r'^replay/(?P\d+)', views.Replay.as_view(), name='replay'), 10 | url(r'^monitor/(?P\d+)', views.Monitor.as_view(), name='monitor'), 11 | 12 | # url(r'^guacamolemonitor/(?P[0-9]+)/', 13 | # views.GuacmoleMonitor.as_view(), name='guacamolemonitor'), 14 | # url(r'^guacamolekill/$', views.GuacamoleKill.as_view(), name='guacamolekill'), 15 | ] 16 | 17 | # websocket路由 18 | ws_urlpatterns = [ 19 | url(r'^guacamole/(?P\d+)/(?P\d+)/', GuacamoleWebsocket), 20 | url(r'^guacamole/monitor/(?P\d+)/', GuacamoleMonitor), 21 | ] 22 | 23 | -------------------------------------------------------------------------------- /apps/guacamole/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.contrib.auth.mixins import LoginRequiredMixin 4 | from django.views.generic import View 5 | from django.views.generic.detail import DetailView 6 | from django.contrib.auth.mixins import PermissionRequiredMixin 7 | from django.shortcuts import render_to_response 8 | 9 | from . import models, conf 10 | 11 | 12 | class Index(LoginRequiredMixin, PermissionRequiredMixin, View): 13 | '''通过guacamole连接远程主机''' 14 | permission_required = 'cmdb.ssh_host' 15 | 16 | def get(self, request, hostid, uid): 17 | return render_to_response('guacamole/index.html', locals()) 18 | 19 | 20 | class Replay(LoginRequiredMixin, PermissionRequiredMixin, DetailView): 21 | '''guacamole录像回放''' 22 | permission_required = 'cmdb.play_session' 23 | model = models.Session 24 | template_name = 'guacamole/replay.html' 25 | raise_exception = True # 无权限时403, 否则跳转登录界面 26 | 27 | def get_context_data(self, **kwargs): 28 | context = super().get_context_data(**kwargs) 29 | context['REPLAY_PATH'] = conf.REPLAY_PATH 30 | return context 31 | 32 | 33 | class Monitor(LoginRequiredMixin, PermissionRequiredMixin, DetailView): 34 | '''guacamole录像回放''' 35 | permission_required = 'cmdb.play_session' 36 | model = models.Session 37 | template_name = 'guacamole/monitor.html' 38 | raise_exception = True 39 | 40 | # def get(self, request, pk): 41 | # res = render_to_response('guacamole/monitor.html', locals()) 42 | # res['Content-Security-Policy'] = "frame-ancestors http://192.168.80.240:88/ 'self'" 43 | # return res 44 | -------------------------------------------------------------------------------- /apps/ops/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | default_app_config = 'ops.apps.OpsConfig' 3 | -------------------------------------------------------------------------------- /apps/ops/admin.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from __future__ import unicode_literals 4 | 5 | from readonly.addreadonly import admin, MyAdmin 6 | 7 | from . import models 8 | 9 | 10 | @admin.register(models.UserProfile) 11 | class UserAdmin(MyAdmin): 12 | list_display = ('username', 'name', 'email', 'weixin', 'phone') 13 | search_fields = ('username', 'name') 14 | ordering = ('username',) 15 | filter_horizontal = ('groups', 'user_permissions',) 16 | 17 | -------------------------------------------------------------------------------- /apps/ops/apps.py: -------------------------------------------------------------------------------- 1 | 2 | from django.apps import AppConfig 3 | 4 | 5 | class OpsConfig(AppConfig): 6 | name = 'ops' 7 | verbose_name = '选项' 8 | -------------------------------------------------------------------------------- /apps/ops/forms.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from django import forms 3 | import sys 4 | 5 | from . import models 6 | 7 | 8 | class UserProfileForm(forms.ModelForm): 9 | # 未设required值, fields_for_model只从model字段中取, 覆盖widget实例.is_required 10 | pwd = forms.CharField(label='密码', required=False, strip=True, 11 | widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}) 12 | ) 13 | 14 | class Meta: 15 | model = models.UserProfile 16 | fields = [ 17 | 'username', 'pwd', 'name', 18 | 'is_superuser', 'is_active', 'groups', 'user_permissions', 19 | 'email', 'phone', 'weixin', 'otp', 'show_otp', 20 | 'userdays', 'pwddays', 21 | ] 22 | 23 | widgets = { 24 | # 'password': forms.PasswordInput, 25 | } 26 | 27 | labels = { 28 | } 29 | 30 | help_texts = { 31 | } 32 | error_messages = { 33 | # 'username': {'unique': '3333333'} 34 | } 35 | 36 | # def clean(self): 37 | # return self.cleaned_data 38 | 39 | # def clean_pwd(self): 40 | # pwd = self.cleaned_data['pwd'] 41 | # if not pwd: 42 | # if not self.instance.id: 43 | # raise forms.ValidationError('新用户密码不能为空') 44 | # return pwd 45 | 46 | def clean_none_field(self): 47 | # 将字段None值改为'' 48 | field_name = sys._getframe().f_back.f_locals.get('name') 49 | return self.cleaned_data.get(field_name) or '' 50 | 51 | clean_name = clean_none_field 52 | clean_phone = clean_none_field 53 | clean_weixin = clean_none_field 54 | 55 | # import ipdb; ipdb.set_trace() 56 | -------------------------------------------------------------------------------- /apps/ops/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/ops/migrations/__init__.py -------------------------------------------------------------------------------- /apps/ops/templates/ops/_menu.html: -------------------------------------------------------------------------------- 1 | 2 | {% comment help %} 3 | 4 | {% show_menu_url '网址视图' '权限码1' 'and' '权限码2' as url_xx项 %} 5 | 多个权限未提供逻辑与或时, 默认为or, 也就是'or' 可以省略. 6 | 7 | {% endcomment %} 8 | 9 | {% show_menu_url 'ops:userprofile_list' 'auth.view_user' as webuser %} 10 | {% show_menu_url 'ops:group_list' 'auth.view_group' as group %} 11 | 12 | {% if webuser or host or group %} 13 |
  • 14 | 用户管理 15 | 16 | 27 |
  • 28 | {% endif %} 29 | 30 | -------------------------------------------------------------------------------- /apps/ops/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/ops/urls.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from django.urls import path 4 | from . import views 5 | 6 | # from django.urls import reverse_lazy 7 | 8 | urlpatterns = [ 9 | 10 | path('user/add/', views.UserAdd.as_view(), name="userprofile_add"), 11 | path('user/delete/', views.UserDelete.as_view(), name="userprofile_delete"), 12 | path('user//update/', views.UserUpdate.as_view(), name="userprofile_update"), 13 | path('user/', views.UserList.as_view(), name="userprofile_list"), 14 | 15 | path('group/add/', views.GroupAdd.as_view(), name="group_add"), 16 | path('group/delete/', views.GroupDelete.as_view(), name="group_delete"), 17 | path('group//update/', views.GroupUpdate.as_view(), name="group_update"), 18 | path('group/', views.GroupList.as_view(), name="group_list"), 19 | 20 | ] 21 | 22 | -------------------------------------------------------------------------------- /apps/readonly/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/readonly/__init__.py -------------------------------------------------------------------------------- /apps/readonly/management.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import django 4 | from django.db.models.signals import post_migrate 5 | from django.contrib.contenttypes.models import ContentType 6 | from django.contrib.auth.models import Permission 7 | 8 | # Django加只读权限,将当前文件management放到任何一个app目录中,执行Python manage.py migrate时就会添加 9 | 10 | 11 | def add_view_permissions(sender, **kwargs): 12 | """ 13 | This syncdb hooks takes care of adding a view permission too all our 14 | content types. 15 | """ 16 | # for each of our content types 17 | for content_type in ContentType.objects.all(): 18 | # build our permission slug 19 | codename = "view_%s" % content_type.model 20 | # print(codename) 21 | # if it doesn't exist.. 22 | if not Permission.objects.filter(content_type=content_type, codename=codename): 23 | # add it 24 | Permission.objects.create(content_type=content_type, 25 | codename=codename, 26 | name="Can view %s" % content_type.name) 27 | print("Added view permission for %s" % content_type.name) 28 | 29 | # check for all our view permissions after a syncdb 30 | 31 | 32 | if django.__version__ < '2.0': 33 | # django 1.* 增加只读权限数据 34 | # django 2.* 已增加了 只读权限, 所以无需再设置 35 | post_migrate.connect(add_view_permissions) 36 | 37 | -------------------------------------------------------------------------------- /apps/suitconf.py: -------------------------------------------------------------------------------- 1 | from suit.apps import DjangoSuitConfig 2 | 3 | 4 | class Config(DjangoSuitConfig): 5 | layout = 'vertical' # 垂直样式 6 | # layout = 'horizontal' #水平样式 7 | # list_per_page = 20 8 | -------------------------------------------------------------------------------- /apps/term/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | ''' 4 | SSH 堡垒机 5 | author: exia@qq.com 6 | 7 | 8 | 堡垒机通讯流程 9 | 前端/客户端 <<===>> 堡垒机 <<===>> 后端/资产端 10 | ssh_client <<===>> chan_cli - proxy_server/proxy_client - chan_ser <<===>> sshd_server 11 | ''' 12 | 13 | 14 | ''' 15 | 程序结构图 16 | 上面的依赖下面的, 越下面的越基础 17 | 18 | session ⇦⇦ chan_ser 19 | 20 | ⇧ 21 | ⇧ ↖ 22 | proxy ⇨⇨ transport_ser 23 | ↖ 24 | ⇧ chan_cli 25 | ⇧ server_interface 26 | conn ⇨⇨ transport_cli 27 | 28 | ⇧ 29 | ⇧ 30 | sshd 31 | 32 | ''' 33 | 34 | ''' 35 | 数量关系: 36 | 37 | 一 对 多 38 | sshd conn 39 | 40 | conn/transport/ proxy/session/channel/ 41 | proxy_server/proxy_client sftp_server/sftp_client 42 | 43 | ''' 44 | 45 | -------------------------------------------------------------------------------- /apps/term/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | from config import priority 4 | 5 | ''' 6 | 根据配置优先级, 设置各配置值. 7 | 未指定优先级时, 默认优先级: 8 | 环境变量 > project.setting / YML > app.conf 9 | 10 | 示例: 11 | priority.set_conf(__name__, priority=['env', 'conf'], convert=False) 12 | ''' 13 | priority.set_conf(__name__) 14 | 15 | 16 | SSHD = { 17 | # 资产系统 -- SSH代理服务端,参数配置 18 | 'workers': 4, # 堡垒机启动进程个数 19 | 'host': '0.0.0.0' if os.environ.get("IPV6") == '0' else '::', 20 | 'port': 2222, # SSH监听端口 21 | 'password_timeout': 60 * 1500, # 堡垒机连接, 临时密码有效期(秒) 22 | 'shell_timeout': 120, # shell终端闲置分钟, 无操作则断开 23 | 'elfinder_sftp_timeout': 10, # 网页SFTP后端连接闲置分钟, 无操作则断开 24 | 'zmodem_sz_sleep': 0.02, # sz下载时, 数据包间隔秒数. 某些客户端/版本发送太快时, 下载出错. 25 | # 'scheme': {'ssh': 'xshell', 'sftp': 'xftp'}, 26 | 'scheme': { 27 | 'ssh': 'ssh', # 设置ssh的scheme 28 | 'sftp': 'sftp', # 设置sftp的scheme 29 | # Xshell.exe ssh://user:password@192.168.80.238:2222 -newtab 标识名 30 | # 从网页调用外部程序,自定义的协议名,直接调用xshell时它的值必需为"ssh",xftp为"sftp" 31 | # scheme如改为其它名,需通过bat脚本或自行开发客户端调用xshell或securtCRT。注册表[HKEY_CLASSES_ROOT\] 32 | }, 33 | 34 | } 35 | 36 | REPLAY_PATH = 'sshreplay' # 存放终端录像文件夹,MEDIA_ROOT/REPLAY_PATH 37 | 38 | -------------------------------------------------------------------------------- /apps/term/gunicorn启动进程/asgi.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import django 6 | 7 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dx.settings") 8 | # import ipdb; ipdb.set_trace() 9 | django.setup() 10 | 11 | 12 | def get_default_application(): 13 | """ 14 | 用于gunicorn启动堡垒机多进程 15 | """ 16 | from apps.term.sshd import SSHServer 17 | return SSHServer 18 | 19 | 20 | application = get_default_application() 21 | 22 | 23 | if __name__ == '__main__': 24 | # 需在项目根目录 25 | application(workers=2) 26 | -------------------------------------------------------------------------------- /apps/term/gunicorn启动进程/workers.py: -------------------------------------------------------------------------------- 1 | 2 | from gunicorn.workers.base import Worker 3 | # import time 4 | 5 | 6 | class MyWorker(Worker): 7 | """ 8 | 使用gunicorn的功能来启动堡垒机多进程/支持参数 9 | gunicorn -k MyWorker asgi:application 10 | """ 11 | 12 | def run(self): 13 | # print('self.timeout', self.timeout) 14 | self.wsgi(self.sockets, heartbeat=self.notify, timeout=self.timeout) 15 | # while self.alive: 16 | # self.notify() 17 | 18 | 19 | ''' 20 | python3 -u /usr/local/bin/gunicorn --workers=2 -b 0.0.0.0:22222 -k apps.term.gunicorn.workers.MyWorker apps.term.gunicorn.asgi:application 21 | 22 | ''' 23 | 24 | -------------------------------------------------------------------------------- /apps/term/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/term/management/__init__.py -------------------------------------------------------------------------------- /apps/term/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/term/management/commands/__init__.py -------------------------------------------------------------------------------- /apps/term/management/commands/proxy_sshd.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from django.core.management.base import BaseCommand 4 | 5 | from ... import sshd 6 | 7 | # import sys 8 | # # /usr/lib64/python2.7/site-packages/sitecustomize.py 9 | # reload(sys) 10 | # sys.setdefaultencoding('UTF-8') 11 | 12 | 13 | class Command(BaseCommand): 14 | ''' 15 | 使用django command运行堡垒机 16 | ''' 17 | 18 | help = 'SSH堡垒机服务端,使网站支持Xshell等客户端软件终端' 19 | 20 | def add_arguments(self, parser): 21 | parser.add_argument('workers', nargs='?', type=int, 22 | # default='3', 23 | help='堡垒机启动进程数' 24 | ) 25 | 26 | def handle(self, *args, **options): 27 | self.workers = options.get('workers') 28 | try: 29 | sshd.SSHServer(workers=self.workers) 30 | except KeyboardInterrupt: 31 | ... 32 | # from ... import ssh 33 | # import ipdb; ipdb.set_trace() 34 | 35 | -------------------------------------------------------------------------------- /apps/term/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.core.cache import cache 4 | 5 | from cmdb.models import HostGroup, Host, HostUser, Session, User 6 | from .interactive import savelog 7 | 8 | ''' 9 | 不调整表, 所以堡垒机app仅数据库表依赖cmdb, 从cmdb取资产数据. 10 | ''' 11 | -------------------------------------------------------------------------------- /apps/term/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import socket 4 | import os 5 | import logging 6 | 7 | # %(levelname)5s对齐. WARNING长度太长, 超过5字符 8 | logging.addLevelName(logging.WARNING, 'WARN') 9 | 10 | logger = logging.getLogger('sshd') 11 | # 配置在 settings.LOGGING['loggers']['sshd'] 12 | 13 | 14 | def set_logger(file_name): 15 | ''' 16 | 使堡垒机各进程日志隔离, 存放到不同文件 17 | ''' 18 | handler = logging.FileHandler('logs/%s.log' % file_name, encoding='utf-8') 19 | # 定义格式器,添加到处理器中 20 | # fmt = '%(asctime)s , %(levelname)s , %(filename)s %(funcName)s line %(lineno)s , %(message)s' 21 | fmt = '[%(levelname)5s][%(asctime)s] %(message)s' 22 | datefmt = '%Y-%m-%d %H:%M:%S' 23 | log_fmt = logging.Formatter(fmt=fmt, datefmt=datefmt) 24 | handler.setFormatter(log_fmt) 25 | logger.addHandler(handler) 26 | 27 | 28 | ''' 29 | 三种管道区别: 30 | # os.mkfifo(path) 31 | os.pipe() 单向管道, 支持跨进程通讯 32 | socket.socketpair() 无名套接字, 相当于双向管道, 可跨进程通讯 33 | multiprocessing.Pipe() 双向管道, 支持跨进程通讯 34 | ''' 35 | 36 | 37 | class MyPipe: 38 | # 使不支持select轮播的对象支持select 39 | def __init__(self): 40 | # 目前只用单向 p2 --> p1 41 | self.p1, self.p2 = socket.socketpair() 42 | 43 | def set(self): 44 | self.p2.send(b'0') 45 | 46 | def clear(self): 47 | self.p1.recv(1) 48 | 49 | def fileno(self): 50 | return self.p1.fileno() 51 | 52 | def __getattr__(self, item): 53 | return getattr(self.p1, item) 54 | 55 | 56 | class MyEvent: 57 | # 使不支持select轮播的对象支持select 58 | def __init__(self): 59 | self.r, self.w = os.pipe() 60 | 61 | def set(self): 62 | os.write(self.w, b'0') 63 | 64 | def clear(self): 65 | os.read(self.r, 1) 66 | 67 | def fileno(self): 68 | return self.r 69 | 70 | -------------------------------------------------------------------------------- /apps/term/客户端/linux_xshell.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/apps/term/客户端/linux_xshell.zip -------------------------------------------------------------------------------- /c/d: -------------------------------------------------------------------------------- 1 | d.sh -------------------------------------------------------------------------------- /c/gt: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | # path=`dirname "$0"` #脚本目录c 5 | path="$( cd "$( dirname "$0" )" && pwd )" #脚本目录c 6 | 7 | base=`dirname "$path"` #根路径 8 | 9 | cd $base 10 | 11 | 12 | case $1 in 13 | reset|log|push|pull) git $*;exit ;; 14 | # *) echo 'else';; 15 | esac 16 | 17 | # args="reset log push" 18 | # if [[ " $args " =~ " $1 " ]];then 19 | # git $* 20 | # exit 21 | # fi 22 | 23 | 24 | arg1=$1 25 | 26 | 27 | if [ -z "$arg1" ]; then 28 | arg1='自动提交' 29 | 30 | 31 | 32 | elif [ "$arg1" == "dx" ];then 33 | user=root 34 | ip=10.4.21.175 35 | path=/data/dx 36 | /usr/bin/rsync -tL -rv * --exclude-from=rsync.txt $user@$ip:$path 37 | 38 | if [ "$2" == "r" ];then 39 | #同步后需重启 40 | /usr/bin/ssh $user@$ip 'cd $path && c/d restart' 41 | fi 42 | 43 | exit 44 | 45 | 46 | 47 | fi 48 | 49 | /usr/bin/git add . 50 | /usr/bin/git commit -a -m $arg1 51 | #git push 52 | echo `date` 53 | -------------------------------------------------------------------------------- /c/r: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | arg1=$1 3 | arg2=$2 4 | if [ -z $arg1 ];then 5 | arg1='runserver' 6 | arg2='0.0.0.0:8000' 7 | fi 8 | 9 | 10 | # echo $arg1 11 | # echo $arg2 12 | 13 | 14 | redis-cli -p 6379 -a 2017 15 | 16 | -------------------------------------------------------------------------------- /conf.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 开启django调试, 为兼容环境变量, 字符串0和1 4 | debug: "1" 5 | 6 | # 日志级别 DEBUG INFO WARNING ERROR CRITICAL 7 | # log_level: INFO 8 | log_level: DEBUG 9 | 10 | redis: 11 | host: 127.0.0.1 12 | port: 6377 13 | password: 2017 14 | db: 0 15 | 16 | 17 | # 默认配置 18 | default_settings: 19 | # 1: 默认配置直接会应用到settings.py中, 后续可在settings.py中重新定义/替换. 20 | # 2: settings.py中后续会使用的变量, 建议不直接定义在default_settings中, 21 | # 以免IDE开发工具警示, 直接使用变量时提示未定义, 虽然实际没问题. 22 | ALLOWED_HOSTS: 23 | - '*' 24 | DEBUG: true 25 | LOGIN_URL: '/login' 26 | LOGOUT_URL: '/logout' 27 | 28 | # aes算法16位key, 不满16位则重复, 取前16位 29 | AES_KEY: '0123456789' # 修改后, 堡垒机中原有的主机用户密码将失效, 需修改密码 30 | 31 | # 上传 32 | DATA_UPLOAD_MAX_MEMORY_SIZE: 307200 33 | 34 | # SESSION 35 | SESSION_COOKIE_AGE: 259200 # cookie有效期*秒 36 | # # False:会话cookie可以在用户浏览器中保持有效期。True:关闭浏览器,则Cookie失效 37 | # SESSION_EXPIRE_AT_BROWSER_CLOSE: true 38 | # SESSION_COOKIE_DOMAIN: "*" #作用域 39 | SESSION_COOKIE_NAME: 'dx' # 同域不同端口时session隔离 40 | 41 | TEST_LINES: | 42 | 111 43 | 111 44 | 222 45 | 46 | 47 | # SMTP邮件设置: 48 | EMAIL_HOST: 'smtp.qq.com' 49 | EMAIL_PORT: '25' 50 | EMAIL_HOST_USER: 'exia@qq.com' 51 | EMAIL_HOST_PASSWORD: '' 52 | EMAIL_USE_TLS: false # true表示使用SSL 53 | 54 | 55 | # 默认配置的数据库, 在settings中有重新定义则会被替换 56 | DATABASES: 57 | default: 58 | ENGINE: django.db.backends.mysql 59 | HOST: 192.168.80.236 60 | NAME: dx 61 | USER: root 62 | PASSWORD: 2017 63 | OPTIONS: 64 | charset: utf8mb4 65 | 66 | -------------------------------------------------------------------------------- /config/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | ''' 3 | django配置管理与工具 4 | 5 | 1. confile, 支持将各配置文件转py对象, 支持conf.key方式递归取值 6 | 2. 使简化各app的配置读取, 只管从自身app.conf.py中读取配置, 7 | 至于配置是使用环境变量/settings, 优先级相关设置等, 都在conf中简单定义即可. 8 | ''' 9 | -------------------------------------------------------------------------------- /config/conf_example.py: -------------------------------------------------------------------------------- 1 | from config import priority 2 | 3 | ''' 4 | 根据配置优先级, 设置各配置值. 5 | 未指定优先级时, 默认优先级: 6 | 环境变量 > project.setting / YML > app.conf 7 | 8 | 示例: 9 | priority.set_conf(__name__, priority=['env', 'conf'], env_convert=False) 10 | ''' 11 | priority.set_conf(__name__) 12 | 13 | 14 | PATH = 'test' 15 | PWD = {1: 1} # 当env_convert=True, 环境变量不支持配置字典, 虽优先但会忽略 16 | STATIC_URL = 333 17 | 18 | ''' 19 | In [1]: from config import conf_example 20 | 21 | In [2]: conf_example.PATH 22 | Out[2]: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin' 23 | 24 | In [3]: conf_example.PWD 25 | Out[3]: {1: 1} 26 | 27 | In [4]: conf_example.STATIC_URL 28 | Out[4]: '/static/' 29 | 30 | ''' 31 | 32 | # c/d s # 进入django shell 33 | 34 | # from config import confile 35 | # yml = confile.YML('docker-compose.yml') # ***/project/docker-compose.yml 36 | # locals().update(yml) # 将YML配置加载到当前conf 37 | # print(services, 111) 38 | 39 | # yml._deep_update_({'services': {'test': {1: 2}}}) 40 | # print(yml.services, 222) 41 | 42 | # # DEBUG 43 | # import ipdb; ipdb.set_trace() # breakpoint 7e9cd84c // 44 | 45 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/db.sqlite3 -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | # 环境变量${PWD}, 为(在Linux宿主机上)dx项目根目录. 4 | # 环境变量PWD不存在时, (非Linux宿主机)则默认使用/opt/dx 5 | services: 6 | dx: 7 | build: . 8 | image: 'py2010/dx' 9 | container_name: dx 10 | working_dir: /dx # /dx为镜像自带的. /opt/dx为所挂载宿主机项目目录 11 | env_file: 12 | - .env 13 | restart: always 14 | network_mode: host # 使用宿主机网络 15 | # networks: 16 | # - network 17 | volumes: 18 | - ${PWD:-/opt/dx}:/opt/dx # Linux宿主机项目所在目录挂载到容器/opt/dx 19 | 20 | guacd: 21 | # 提供网页访问rdp/vnc支持 22 | image: guacamole/guacd:1.2.0 23 | container_name: guacd 24 | restart: always 25 | network_mode: host # 使用宿主机网络 26 | volumes: 27 | # 挂载Linux宿主机项目media到容器, 用于dx网站中播放视频操作录像 28 | - ${PWD:-/opt/dx}/media/guacamole:${GUACD_DATA_DIR:-/guacamole} 29 | # 容器目录/guacamole, 必须与 dx/apps/guacamole/conf.py中的 "base_path"设置相同, 如有修改需同时修改. 30 | 31 | # networks: 32 | # network: {} 33 | -------------------------------------------------------------------------------- /docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # find ./ -name "*.pyc" -exec rm -f {} \; 4 | 5 | # 宿主机有挂载项目到容器目录, 便于修改测试 6 | DX_DIR=/opt/dx 7 | 8 | if [ "$0" == ${DX_DIR}/docker-entrypoint.sh ];then 9 | echo 使用宿主机挂载目录: $DX_DIR 10 | cd $DX_DIR 11 | DEV=1 12 | 13 | elif [ -x ${DX_DIR}/docker-entrypoint.sh ]; then 14 | exec ${DX_DIR}/docker-entrypoint.sh 15 | 16 | fi 17 | 18 | 19 | # 启动REDIS, 为防止host网络模式下与宿主机redis端口冲突, 使用6377 20 | redis-server /etc/redis.conf --port 6377 & 21 | sleep 1 22 | 23 | # 启动Django网站 24 | 25 | if [ $DEV ]; then 26 | c/d ssh & 27 | c/d & # runserver 开发测试 28 | else 29 | # 生产运行 30 | c/d start 31 | fi 32 | 33 | sleep inf 34 | -------------------------------------------------------------------------------- /dx/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/dx/__init__.py -------------------------------------------------------------------------------- /dx/asgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import os 4 | import django 5 | from channels.routing import get_default_application 6 | 7 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dx.settings") 8 | django.setup() 9 | application = get_default_application() 10 | 11 | 12 | # class MyApplication: 13 | # ... 14 | -------------------------------------------------------------------------------- /dx/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for dx 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/1.11/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", "dx.settings") 15 | 16 | # from django_websocket.wsgi import get_wsgi_websocket_application 17 | 18 | 19 | application = get_wsgi_application() 20 | # websocket = get_wsgi_websocket_application() 21 | -------------------------------------------------------------------------------- /help/websftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/help/websftp.png -------------------------------------------------------------------------------- /help/websftp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/help/websftp2.png -------------------------------------------------------------------------------- /help/webssh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/help/webssh.png -------------------------------------------------------------------------------- /help/xshell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/help/xshell.gif -------------------------------------------------------------------------------- /logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/logs/.gitkeep -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dx.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | 23 | -------------------------------------------------------------------------------- /media/guacamole/guacd.txt: -------------------------------------------------------------------------------- 1 | 2 | guacd目录, 比如上传下载临时目录, 远程桌面录像目录 -------------------------------------------------------------------------------- /requirements.2222.txt: -------------------------------------------------------------------------------- 1 | # python3.6 2 | ## centos7 3 | ## yum install -y epel-release 4 | ## yum install -y python36 python36-pip python36-devel 5 | 6 | django==2.2 7 | django-bootstrap3 8 | 9 | ##使用postgresql 10 | ##yum install -y postgresql-devel 11 | ##apt install -y postgresql-server-dev-all 12 | #psycopg2 13 | 14 | ##使用mysql 15 | ##mysqlclient==1.4.2 16 | 17 | ##centos 18 | ##yum -y install mysql-devel 19 | ##ubuntu 20 | ##apt install libmariadbd-dev 21 | 22 | 23 | https://github.com/darklow/django-suit/tarball/v2 24 | 25 | paramiko 26 | pycrypto==2.6.1 27 | rsa 28 | 29 | 30 | 31 | uvicorn==0.7.1 32 | gunicorn 33 | #futures 34 | 35 | 36 | #djangorestframework 37 | 38 | # yum install -y gcc 39 | channels==2.2 40 | channels-redis 41 | #asgi-redis 42 | #daphne 43 | 44 | django_redis 45 | hiredis 46 | elasticsearch 47 | 48 | ## 登陆时增加otp验证 49 | django_otp 50 | qrcode 51 | pillow 52 | 53 | pyzabbix 54 | 55 | #docker-compose 56 | #docker 57 | 58 | python-magic 59 | 60 | selectors 61 | 62 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | 2 | cryptography==3.2 3 | pycryptodome==3.10.1 4 | PyNaCl==1.3.0 5 | paramiko==2.6.0 6 | gunicorn==19.9.0 7 | uvicorn==0.7.1 8 | django==2.2.20 9 | Twisted==19.2.1 10 | channels==2.2.0 11 | channels-redis==2.4.0 12 | django_redis==4.10.0 13 | qrcode==6.1 14 | asgiref==3.3.4 15 | django_otp==0.6.0 16 | simplejson==3.17.2 17 | six==1.12.0 18 | Image==1.5.33 19 | Pillow==8.2.0 20 | python_magic==0.4.24 21 | https://github.com/darklow/django-suit/tarball/v2 22 | django-bootstrap3==11.1.0 23 | PyYAML==5.1 24 | 25 | ipdb==0.12 26 | 27 | -------------------------------------------------------------------------------- /rsync.txt: -------------------------------------------------------------------------------- 1 | .git 2 | .svn 3 | nohup.out 4 | *.log 5 | *.pyc 6 | *.bak 7 | static/bak 8 | c/d.sh 9 | static/cert 10 | static/agent.py 11 | apps/*/migrations/0*.py 12 | apps/*/migrations/*/* 13 | inspinia_admin-v2.7 14 | .tags 15 | settings.py 16 | __pycache__ 17 | imap 18 | -------------------------------------------------------------------------------- /static/admin/css/changelists.css: -------------------------------------------------------------------------------- 1 | /* Overridden by Django Suit empty stylesheet to reset original style. */ 2 | -------------------------------------------------------------------------------- /static/admin/css/dashboard.css: -------------------------------------------------------------------------------- 1 | /* Overridden by Django Suit empty stylesheet to reset original style. */ 2 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/css/forms.css: -------------------------------------------------------------------------------- 1 | /* Overridden by Django Suit empty stylesheet to reset original style. */ 2 | -------------------------------------------------------------------------------- /static/admin/css/login.css: -------------------------------------------------------------------------------- 1 | /* Overridden by Django Suit empty stylesheet to reset original style. */ 2 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/admin/fonts/Roboto-Bold-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Light-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/admin/fonts/Roboto-Light-webfont.woff -------------------------------------------------------------------------------- /static/admin/fonts/Roboto-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/admin/fonts/Roboto-Regular-webfont.woff -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/img/calendar-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_off.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/admin/img/gis/move_vertex_on.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/admin/img/icon-addlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/js/collapse.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a(document).ready(function(){a("fieldset.collapse").each(function(b,c){0===a(c).find("div.errors").length&&a(c).addClass("collapsed").find("h2").first().append(' ('+gettext("Show")+")")});a("fieldset.collapse a.collapse-toggle").click(function(b){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", 2 | [a(this).attr("id")]);return!1})})})(django.jQuery); 3 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/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 | -------------------------------------------------------------------------------- /static/admin/js/prepopulate.js: -------------------------------------------------------------------------------- 1 | /*global URLify*/ 2 | (function($) { 3 | 'use strict'; 4 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) { 5 | /* 6 | Depends on urlify.js 7 | Populates a selected field with the values of the dependent fields, 8 | URLifies and shortens the string. 9 | dependencies - array of dependent fields ids 10 | maxLength - maximum length of the URLify'd string 11 | allowUnicode - Unicode support of the URLify'd string 12 | */ 13 | return this.each(function() { 14 | var prepopulatedField = $(this); 15 | 16 | var populate = function() { 17 | // Bail if the field's value has been changed by the user 18 | if (prepopulatedField.data('_changed')) { 19 | return; 20 | } 21 | 22 | var values = []; 23 | $.each(dependencies, function(i, field) { 24 | field = $(field); 25 | if (field.val().length > 0) { 26 | values.push(field.val()); 27 | } 28 | }); 29 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode)); 30 | }; 31 | 32 | prepopulatedField.data('_changed', false); 33 | prepopulatedField.change(function() { 34 | prepopulatedField.data('_changed', true); 35 | }); 36 | 37 | if (!prepopulatedField.val()) { 38 | $(dependencies.join(',')).keyup(populate).change(populate).focus(populate); 39 | } 40 | }); 41 | }; 42 | })(django.jQuery); 43 | -------------------------------------------------------------------------------- /static/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 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 | -------------------------------------------------------------------------------- /static/codemirror/addon/dialog/dialog.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-dialog { 2 | position: absolute; 3 | left: 0; right: 0; 4 | background: inherit; 5 | z-index: 15; 6 | padding: .1em .8em; 7 | overflow: hidden; 8 | color: inherit; 9 | } 10 | 11 | .CodeMirror-dialog-top { 12 | border-bottom: 1px solid #eee; 13 | top: 0; 14 | } 15 | 16 | .CodeMirror-dialog-bottom { 17 | border-top: 1px solid #eee; 18 | bottom: 0; 19 | } 20 | 21 | .CodeMirror-dialog input { 22 | border: none; 23 | outline: none; 24 | background: transparent; 25 | width: 20em; 26 | color: inherit; 27 | font-family: monospace; 28 | } 29 | 30 | .CodeMirror-dialog button { 31 | font-size: 70%; 32 | } 33 | -------------------------------------------------------------------------------- /static/codemirror/addon/display/autorefresh.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")) 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod) 9 | else // Plain browser env 10 | mod(CodeMirror) 11 | })(function(CodeMirror) { 12 | "use strict" 13 | 14 | CodeMirror.defineOption("autoRefresh", false, function(cm, val) { 15 | if (cm.state.autoRefresh) { 16 | stopListening(cm, cm.state.autoRefresh) 17 | cm.state.autoRefresh = null 18 | } 19 | if (val && cm.display.wrapper.offsetHeight == 0) 20 | startListening(cm, cm.state.autoRefresh = {delay: val.delay || 250}) 21 | }) 22 | 23 | function startListening(cm, state) { 24 | function check() { 25 | if (cm.display.wrapper.offsetHeight) { 26 | stopListening(cm, state) 27 | if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight) 28 | cm.refresh() 29 | } else { 30 | state.timeout = setTimeout(check, state.delay) 31 | } 32 | } 33 | state.timeout = setTimeout(check, state.delay) 34 | state.hurry = function() { 35 | clearTimeout(state.timeout) 36 | state.timeout = setTimeout(check, 50) 37 | } 38 | CodeMirror.on(window, "mouseup", state.hurry) 39 | CodeMirror.on(window, "keyup", state.hurry) 40 | } 41 | 42 | function stopListening(_cm, state) { 43 | clearTimeout(state.timeout) 44 | CodeMirror.off(window, "mouseup", state.hurry) 45 | CodeMirror.off(window, "keyup", state.hurry) 46 | } 47 | }); 48 | -------------------------------------------------------------------------------- /static/codemirror/addon/display/fullscreen.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-fullscreen { 2 | position: fixed; 3 | top: 0; left: 0; right: 0; bottom: 0; 4 | height: auto; 5 | z-index: 9; 6 | } 7 | -------------------------------------------------------------------------------- /static/codemirror/addon/display/fullscreen.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { 15 | if (old == CodeMirror.Init) old = false; 16 | if (!old == !val) return; 17 | if (val) setFullscreen(cm); 18 | else setNormal(cm); 19 | }); 20 | 21 | function setFullscreen(cm) { 22 | var wrap = cm.getWrapperElement(); 23 | cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, 24 | width: wrap.style.width, height: wrap.style.height}; 25 | wrap.style.width = ""; 26 | wrap.style.height = "auto"; 27 | wrap.className += " CodeMirror-fullscreen"; 28 | document.documentElement.style.overflow = "hidden"; 29 | cm.refresh(); 30 | } 31 | 32 | function setNormal(cm) { 33 | var wrap = cm.getWrapperElement(); 34 | wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); 35 | document.documentElement.style.overflow = ""; 36 | var info = cm.state.fullScreenRestore; 37 | wrap.style.width = info.width; wrap.style.height = info.height; 38 | window.scrollTo(info.scrollLeft, info.scrollTop); 39 | cm.refresh(); 40 | } 41 | }); 42 | -------------------------------------------------------------------------------- /static/codemirror/addon/edit/trailingspace.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { 13 | if (prev == CodeMirror.Init) prev = false; 14 | if (prev && !val) 15 | cm.removeOverlay("trailingspace"); 16 | else if (!prev && val) 17 | cm.addOverlay({ 18 | token: function(stream) { 19 | for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} 20 | if (i > stream.pos) { stream.pos = i; return null; } 21 | stream.pos = l; 22 | return "trailingspace"; 23 | }, 24 | name: "trailingspace" 25 | }); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /static/codemirror/addon/fold/foldgutter.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-foldmarker { 2 | color: blue; 3 | text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; 4 | font-family: arial; 5 | line-height: .3; 6 | cursor: pointer; 7 | } 8 | .CodeMirror-foldgutter { 9 | width: .7em; 10 | } 11 | .CodeMirror-foldgutter-open, 12 | .CodeMirror-foldgutter-folded { 13 | cursor: pointer; 14 | } 15 | .CodeMirror-foldgutter-open:after { 16 | content: "\25BE"; 17 | } 18 | .CodeMirror-foldgutter-folded:after { 19 | content: "\25B8"; 20 | } 21 | -------------------------------------------------------------------------------- /static/codemirror/addon/hint/show-hint.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-hints { 2 | position: absolute; 3 | z-index: 10; 4 | overflow: hidden; 5 | list-style: none; 6 | 7 | margin: 0; 8 | padding: 2px; 9 | 10 | -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); 11 | -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); 12 | box-shadow: 2px 3px 5px rgba(0,0,0,.2); 13 | border-radius: 3px; 14 | border: 1px solid silver; 15 | 16 | background: white; 17 | font-size: 90%; 18 | font-family: monospace; 19 | 20 | max-height: 20em; 21 | overflow-y: auto; 22 | } 23 | 24 | .CodeMirror-hint { 25 | margin: 0; 26 | padding: 0 4px; 27 | border-radius: 2px; 28 | white-space: pre; 29 | color: black; 30 | cursor: pointer; 31 | } 32 | 33 | li.CodeMirror-hint-active { 34 | background: #08f; 35 | color: white; 36 | } 37 | -------------------------------------------------------------------------------- /static/codemirror/addon/lint/coffeescript-lint.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | // Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js 5 | 6 | // declare global: coffeelint 7 | 8 | (function(mod) { 9 | if (typeof exports == "object" && typeof module == "object") // CommonJS 10 | mod(require("../../lib/codemirror")); 11 | else if (typeof define == "function" && define.amd) // AMD 12 | define(["../../lib/codemirror"], mod); 13 | else // Plain browser env 14 | mod(CodeMirror); 15 | })(function(CodeMirror) { 16 | "use strict"; 17 | 18 | CodeMirror.registerHelper("lint", "coffeescript", function(text) { 19 | var found = []; 20 | if (!window.coffeelint) { 21 | if (window.console) { 22 | window.console.error("Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run."); 23 | } 24 | return found; 25 | } 26 | var parseError = function(err) { 27 | var loc = err.lineNumber; 28 | found.push({from: CodeMirror.Pos(loc-1, 0), 29 | to: CodeMirror.Pos(loc, 0), 30 | severity: err.level, 31 | message: err.message}); 32 | }; 33 | try { 34 | var res = coffeelint.lint(text); 35 | for(var i = 0; i < res.length; i++) { 36 | parseError(res[i]); 37 | } 38 | } catch(e) { 39 | found.push({from: CodeMirror.Pos(e.location.first_line, 0), 40 | to: CodeMirror.Pos(e.location.last_line, e.location.last_column), 41 | severity: 'error', 42 | message: e.message}); 43 | } 44 | return found; 45 | }); 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /static/codemirror/addon/lint/css-lint.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | // Depends on csslint.js from https://github.com/stubbornella/csslint 5 | 6 | // declare global: CSSLint 7 | 8 | (function(mod) { 9 | if (typeof exports == "object" && typeof module == "object") // CommonJS 10 | mod(require("../../lib/codemirror")); 11 | else if (typeof define == "function" && define.amd) // AMD 12 | define(["../../lib/codemirror"], mod); 13 | else // Plain browser env 14 | mod(CodeMirror); 15 | })(function(CodeMirror) { 16 | "use strict"; 17 | 18 | CodeMirror.registerHelper("lint", "css", function(text, options) { 19 | var found = []; 20 | if (!window.CSSLint) { 21 | if (window.console) { 22 | window.console.error("Error: window.CSSLint not defined, CodeMirror CSS linting cannot run."); 23 | } 24 | return found; 25 | } 26 | var results = CSSLint.verify(text, options), messages = results.messages, message = null; 27 | for ( var i = 0; i < messages.length; i++) { 28 | message = messages[i]; 29 | var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col; 30 | found.push({ 31 | from: CodeMirror.Pos(startLine, startCol), 32 | to: CodeMirror.Pos(endLine, endCol), 33 | message: message.message, 34 | severity : message.type 35 | }); 36 | } 37 | return found; 38 | }); 39 | 40 | }); 41 | -------------------------------------------------------------------------------- /static/codemirror/addon/lint/json-lint.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | // Depends on jsonlint.js from https://github.com/zaach/jsonlint 5 | 6 | // declare global: jsonlint 7 | 8 | (function(mod) { 9 | if (typeof exports == "object" && typeof module == "object") // CommonJS 10 | mod(require("../../lib/codemirror")); 11 | else if (typeof define == "function" && define.amd) // AMD 12 | define(["../../lib/codemirror"], mod); 13 | else // Plain browser env 14 | mod(CodeMirror); 15 | })(function(CodeMirror) { 16 | "use strict"; 17 | 18 | CodeMirror.registerHelper("lint", "json", function(text) { 19 | var found = []; 20 | if (!window.jsonlint) { 21 | if (window.console) { 22 | window.console.error("Error: window.jsonlint not defined, CodeMirror JSON linting cannot run."); 23 | } 24 | return found; 25 | } 26 | jsonlint.parseError = function(str, hash) { 27 | var loc = hash.loc; 28 | found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), 29 | to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), 30 | message: str}); 31 | }; 32 | try { jsonlint.parse(text); } 33 | catch(e) {} 34 | return found; 35 | }); 36 | 37 | }); 38 | -------------------------------------------------------------------------------- /static/codemirror/addon/lint/yaml-lint.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | // Depends on js-yaml.js from https://github.com/nodeca/js-yaml 15 | 16 | // declare global: jsyaml 17 | 18 | CodeMirror.registerHelper("lint", "yaml", function(text) { 19 | var found = []; 20 | if (!window.jsyaml) { 21 | if (window.console) { 22 | window.console.error("Error: window.jsyaml not defined, CodeMirror YAML linting cannot run."); 23 | } 24 | return found; 25 | } 26 | try { jsyaml.load(text); } 27 | catch(e) { 28 | var loc = e.mark, 29 | // js-yaml YAMLException doesn't always provide an accurate lineno 30 | // e.g., when there are multiple yaml docs 31 | // --- 32 | // --- 33 | // foo:bar 34 | from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0), 35 | to = from; 36 | found.push({ from: from, to: to, message: e.message }); 37 | } 38 | return found; 39 | }); 40 | 41 | }); 42 | -------------------------------------------------------------------------------- /static/codemirror/addon/mode/multiplex_test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | CodeMirror.defineMode("markdown_with_stex", function(){ 6 | var inner = CodeMirror.getMode({}, "stex"); 7 | var outer = CodeMirror.getMode({}, "markdown"); 8 | 9 | var innerOptions = { 10 | open: '$', 11 | close: '$', 12 | mode: inner, 13 | delimStyle: 'delim', 14 | innerStyle: 'inner' 15 | }; 16 | 17 | return CodeMirror.multiplexingMode(outer, innerOptions); 18 | }); 19 | 20 | var mode = CodeMirror.getMode({}, "markdown_with_stex"); 21 | 22 | function MT(name) { 23 | test.mode( 24 | name, 25 | mode, 26 | Array.prototype.slice.call(arguments, 1), 27 | 'multiplexing'); 28 | } 29 | 30 | MT( 31 | "stexInsideMarkdown", 32 | "[strong **Equation:**] [delim&delim-open $][inner&tag \\pi][delim&delim-close $]"); 33 | })(); 34 | -------------------------------------------------------------------------------- /static/codemirror/addon/runmode/colorize.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror"), require("./runmode")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror", "./runmode"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; 15 | 16 | function textContent(node, out) { 17 | if (node.nodeType == 3) return out.push(node.nodeValue); 18 | for (var ch = node.firstChild; ch; ch = ch.nextSibling) { 19 | textContent(ch, out); 20 | if (isBlock.test(node.nodeType)) out.push("\n"); 21 | } 22 | } 23 | 24 | CodeMirror.colorize = function(collection, defaultMode) { 25 | if (!collection) collection = document.body.getElementsByTagName("pre"); 26 | 27 | for (var i = 0; i < collection.length; ++i) { 28 | var node = collection[i]; 29 | var mode = node.getAttribute("data-lang") || defaultMode; 30 | if (!mode) continue; 31 | 32 | var text = []; 33 | textContent(node, text); 34 | node.innerHTML = ""; 35 | CodeMirror.runMode(text.join(""), mode, node); 36 | 37 | node.className += " cm-s-default"; 38 | } 39 | }; 40 | }); 41 | -------------------------------------------------------------------------------- /static/codemirror/addon/scroll/simplescrollbars.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { 2 | position: absolute; 3 | background: #ccc; 4 | -moz-box-sizing: border-box; 5 | box-sizing: border-box; 6 | border: 1px solid #bbb; 7 | border-radius: 2px; 8 | } 9 | 10 | .CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { 11 | position: absolute; 12 | z-index: 6; 13 | background: #eee; 14 | } 15 | 16 | .CodeMirror-simplescroll-horizontal { 17 | bottom: 0; left: 0; 18 | height: 8px; 19 | } 20 | .CodeMirror-simplescroll-horizontal div { 21 | bottom: 0; 22 | height: 100%; 23 | } 24 | 25 | .CodeMirror-simplescroll-vertical { 26 | right: 0; top: 0; 27 | width: 8px; 28 | } 29 | .CodeMirror-simplescroll-vertical div { 30 | right: 0; 31 | width: 100%; 32 | } 33 | 34 | 35 | .CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { 36 | display: none; 37 | } 38 | 39 | .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { 40 | position: absolute; 41 | background: #bcd; 42 | border-radius: 3px; 43 | } 44 | 45 | .CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { 46 | position: absolute; 47 | z-index: 6; 48 | } 49 | 50 | .CodeMirror-overlayscroll-horizontal { 51 | bottom: 0; left: 0; 52 | height: 6px; 53 | } 54 | .CodeMirror-overlayscroll-horizontal div { 55 | bottom: 0; 56 | height: 100%; 57 | } 58 | 59 | .CodeMirror-overlayscroll-vertical { 60 | right: 0; top: 0; 61 | width: 6px; 62 | } 63 | .CodeMirror-overlayscroll-vertical div { 64 | right: 0; 65 | width: 100%; 66 | } 67 | -------------------------------------------------------------------------------- /static/codemirror/addon/search/matchesonscrollbar.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-search-match { 2 | background: gold; 3 | border-top: 1px solid orange; 4 | border-bottom: 1px solid orange; 5 | -moz-box-sizing: border-box; 6 | box-sizing: border-box; 7 | opacity: .5; 8 | } 9 | -------------------------------------------------------------------------------- /static/codemirror/addon/tern/worker.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | // declare global: tern, server 5 | 6 | var server; 7 | 8 | this.onmessage = function(e) { 9 | var data = e.data; 10 | switch (data.type) { 11 | case "init": return startServer(data.defs, data.plugins, data.scripts); 12 | case "add": return server.addFile(data.name, data.text); 13 | case "del": return server.delFile(data.name); 14 | case "req": return server.request(data.body, function(err, reqData) { 15 | postMessage({id: data.id, body: reqData, err: err && String(err)}); 16 | }); 17 | case "getFile": 18 | var c = pending[data.id]; 19 | delete pending[data.id]; 20 | return c(data.err, data.text); 21 | default: throw new Error("Unknown message type: " + data.type); 22 | } 23 | }; 24 | 25 | var nextId = 0, pending = {}; 26 | function getFile(file, c) { 27 | postMessage({type: "getFile", name: file, id: ++nextId}); 28 | pending[nextId] = c; 29 | } 30 | 31 | function startServer(defs, plugins, scripts) { 32 | if (scripts) importScripts.apply(null, scripts); 33 | 34 | server = new tern.Server({ 35 | getFile: getFile, 36 | async: true, 37 | defs: defs, 38 | plugins: plugins 39 | }); 40 | } 41 | 42 | this.console = { 43 | log: function(v) { postMessage({type: "debug", message: v}); } 44 | }; 45 | -------------------------------------------------------------------------------- /static/codemirror/mode/asciiarmor/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: ASCII Armor (PGP) mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    ASCII Armor (PGP) mode

    27 |
    36 | 37 | 42 | 43 |

    MIME types 44 | defined: application/pgp, application/pgp-encrypted, application/pgp-keys, application/pgp-signature

    45 | 46 |
    47 | -------------------------------------------------------------------------------- /static/codemirror/mode/css/gss_test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | "use strict"; 6 | 7 | var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-gss"); 8 | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "gss"); } 9 | 10 | MT("atComponent", 11 | "[def @component] {", 12 | "[tag foo] {", 13 | " [property color]: [keyword black];", 14 | "}", 15 | "}"); 16 | 17 | })(); 18 | -------------------------------------------------------------------------------- /static/codemirror/mode/cypher/test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "cypher"); 6 | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } 7 | 8 | MT("unbalancedDoubledQuotedString", 9 | "[string \"a'b\"][variable c]"); 10 | 11 | MT("unbalancedSingleQuotedString", 12 | "[string 'a\"b'][variable c]"); 13 | 14 | MT("doubleQuotedString", 15 | "[string \"a\"][variable b]"); 16 | 17 | MT("singleQuotedString", 18 | "[string 'a'][variable b]"); 19 | 20 | MT("single attribute (with content)", 21 | "[node {][atom a:][string 'a'][node }]"); 22 | 23 | MT("multiple attribute, singleQuotedString (with content)", 24 | "[node {][atom a:][string 'a'][node ,][atom b:][string 'b'][node }]"); 25 | 26 | MT("multiple attribute, doubleQuotedString (with content)", 27 | "[node {][atom a:][string \"a\"][node ,][atom b:][string \"b\"][node }]"); 28 | 29 | MT("single attribute (without content)", 30 | "[node {][atom a:][string 'a'][node }]"); 31 | 32 | MT("multiple attribute, singleQuotedString (without content)", 33 | "[node {][atom a:][string ''][node ,][atom b:][string ''][node }]"); 34 | 35 | MT("multiple attribute, doubleQuotedString (without content)", 36 | "[node {][atom a:][string \"\"][node ,][atom b:][string \"\"][node }]"); 37 | })(); 38 | -------------------------------------------------------------------------------- /static/codemirror/mode/d/test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | var mode = CodeMirror.getMode({indentUnit: 2}, "d"); 6 | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } 7 | 8 | MT("nested_comments", 9 | "[comment /+]","[comment comment]","[comment +/]","[variable void] [variable main](){}"); 10 | 11 | })(); 12 | -------------------------------------------------------------------------------- /static/codemirror/mode/diff/diff.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function(mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror")); 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror"], mod); 9 | else // Plain browser env 10 | mod(CodeMirror); 11 | })(function(CodeMirror) { 12 | "use strict"; 13 | 14 | CodeMirror.defineMode("diff", function() { 15 | 16 | var TOKEN_NAMES = { 17 | '+': 'positive', 18 | '-': 'negative', 19 | '@': 'meta' 20 | }; 21 | 22 | return { 23 | token: function(stream) { 24 | var tw_pos = stream.string.search(/[\t ]+?$/); 25 | 26 | if (!stream.sol() || tw_pos === 0) { 27 | stream.skipToEnd(); 28 | return ("error " + ( 29 | TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); 30 | } 31 | 32 | var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); 33 | 34 | if (tw_pos === -1) { 35 | stream.skipToEnd(); 36 | } else { 37 | stream.pos = tw_pos; 38 | } 39 | 40 | return token_name; 41 | } 42 | }; 43 | }); 44 | 45 | CodeMirror.defineMIME("text/x-diff", "diff"); 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /static/codemirror/mode/ecl/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: ECL mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    ECL mode

    27 |
    45 | 48 | 49 |

    Based on CodeMirror's clike mode. For more information see HPCC Systems web site.

    50 |

    MIME types defined: text/x-ecl.

    51 | 52 |
    53 | -------------------------------------------------------------------------------- /static/codemirror/mode/haskell-literate/haskell-literate.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function (mod) { 5 | if (typeof exports == "object" && typeof module == "object") // CommonJS 6 | mod(require("../../lib/codemirror"), require("../haskell/haskell")) 7 | else if (typeof define == "function" && define.amd) // AMD 8 | define(["../../lib/codemirror", "../haskell/haskell"], mod) 9 | else // Plain browser env 10 | mod(CodeMirror) 11 | })(function (CodeMirror) { 12 | "use strict" 13 | 14 | CodeMirror.defineMode("haskell-literate", function (config, parserConfig) { 15 | var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell") 16 | 17 | return { 18 | startState: function () { 19 | return { 20 | inCode: false, 21 | baseState: CodeMirror.startState(baseMode) 22 | } 23 | }, 24 | token: function (stream, state) { 25 | if (stream.sol()) { 26 | if (state.inCode = stream.eat(">")) 27 | return "meta" 28 | } 29 | if (state.inCode) { 30 | return baseMode.token(stream, state.baseState) 31 | } else { 32 | stream.skipToEnd() 33 | return "comment" 34 | } 35 | }, 36 | innerMode: function (state) { 37 | return state.inCode ? {state: state.baseState, mode: baseMode} : null 38 | } 39 | } 40 | }, "haskell") 41 | 42 | CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate") 43 | }); 44 | -------------------------------------------------------------------------------- /static/codemirror/mode/http/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: HTTP mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    HTTP mode

    27 | 28 | 29 |
    39 | 40 | 43 | 44 |

    MIME types defined: message/http.

    45 |
    46 | -------------------------------------------------------------------------------- /static/codemirror/mode/mbox/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: mbox mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    mbox mode

    27 |
    38 | 41 | 42 |

    MIME types defined: application/mbox.

    43 | 44 |
    45 | -------------------------------------------------------------------------------- /static/codemirror/mode/oz/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Oz mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 26 | 27 |
    28 |

    Oz mode

    29 | 50 |

    MIME type defined: text/x-oz.

    51 | 52 | 59 |
    60 | -------------------------------------------------------------------------------- /static/codemirror/mode/pascal/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Pascal mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    Pascal mode

    27 | 28 | 29 |
    52 | 53 | 59 | 60 |

    MIME types defined: text/x-pascal.

    61 |
    62 | -------------------------------------------------------------------------------- /static/codemirror/mode/pig/index.html: -------------------------------------------------------------------------------- 1 |  2 | CodeMirror: Pig Latin mode 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 23 | 24 |
    25 |

    Pig Latin mode

    26 |
    38 | 39 | 46 | 47 |

    48 | Simple mode that handles Pig Latin language. 49 |

    50 | 51 |

    MIME type defined: text/x-pig 52 | (PIG code) 53 |

    54 | -------------------------------------------------------------------------------- /static/codemirror/mode/python/test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | var mode = CodeMirror.getMode({indentUnit: 4}, 6 | {name: "python", 7 | version: 3, 8 | singleLineStringErrors: false}); 9 | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } 10 | 11 | // Error, because "foobarhello" is neither a known type or property, but 12 | // property was expected (after "and"), and it should be in parentheses. 13 | MT("decoratorStartOfLine", 14 | "[meta @dec]", 15 | "[keyword def] [def function]():", 16 | " [keyword pass]"); 17 | 18 | MT("decoratorIndented", 19 | "[keyword class] [def Foo]:", 20 | " [meta @dec]", 21 | " [keyword def] [def function]():", 22 | " [keyword pass]"); 23 | 24 | MT("matmulWithSpace:", "[variable a] [operator @] [variable b]"); 25 | MT("matmulWithoutSpace:", "[variable a][operator @][variable b]"); 26 | MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]"); 27 | var before_equal_sign = ["+", "-", "*", "/", "=", "!", ">", "<"]; 28 | for (var i = 0; i < before_equal_sign.length; ++i) { 29 | var c = before_equal_sign[i] 30 | MT("before_equal_sign_" + c, "[variable a] [operator " + c + "=] [variable b]"); 31 | } 32 | 33 | MT("fValidStringPrefix", "[string f'this is a {formatted} string']"); 34 | MT("uValidStringPrefix", "[string u'this is an unicode string']"); 35 | })(); 36 | -------------------------------------------------------------------------------- /static/codemirror/mode/ruby/test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | var mode = CodeMirror.getMode({indentUnit: 2}, "ruby"); 6 | function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } 7 | 8 | MT("divide_equal_operator", 9 | "[variable bar] [operator /=] [variable foo]"); 10 | 11 | MT("divide_equal_operator_no_spacing", 12 | "[variable foo][operator /=][number 42]"); 13 | 14 | MT("complex_regexp", 15 | "[keyword if] [variable cr] [operator =~] [string-2 /(?: \\( #{][tag RE_NOT][string-2 }\\( | #{][tag RE_NOT_PAR_OR][string-2 }* #{][tag RE_OPA_OR][string-2 } )/][variable x]") 16 | })(); 17 | -------------------------------------------------------------------------------- /static/codemirror/mode/rust/test.js: -------------------------------------------------------------------------------- 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others 2 | // Distributed under an MIT license: http://codemirror.net/LICENSE 3 | 4 | (function() { 5 | var mode = CodeMirror.getMode({indentUnit: 4}, "rust"); 6 | function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));} 7 | 8 | MT('integer_test', 9 | '[number 123i32]', 10 | '[number 123u32]', 11 | '[number 123_u32]', 12 | '[number 0xff_u8]', 13 | '[number 0o70_i16]', 14 | '[number 0b1111_1111_1001_0000_i32]', 15 | '[number 0usize]'); 16 | 17 | MT('float_test', 18 | '[number 123.0f64]', 19 | '[number 0.1f64]', 20 | '[number 0.1f32]', 21 | '[number 12E+99_f64]'); 22 | 23 | MT('string-literals-test', 24 | '[string "foo"]', 25 | '[string r"foo"]', 26 | '[string "\\"foo\\""]', 27 | '[string r#""foo""#]', 28 | '[string "foo #\\"# bar"]', 29 | 30 | '[string b"foo"]', 31 | '[string br"foo"]', 32 | '[string b"\\"foo\\""]', 33 | '[string br#""foo""#]', 34 | '[string br##"foo #" bar"##]', 35 | 36 | "[string-2 'h']", 37 | "[string-2 b'h']"); 38 | 39 | })(); 40 | -------------------------------------------------------------------------------- /static/codemirror/mode/solr/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Solr mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 20 | 33 | 34 |
    35 |

    Solr mode

    36 | 37 |
    38 | 47 |
    48 | 49 | 55 | 56 |

    MIME types defined: text/x-solr.

    57 |
    58 | -------------------------------------------------------------------------------- /static/codemirror/mode/spreadsheet/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Spreadsheet mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 25 | 26 |
    27 |

    Spreadsheet mode

    28 |
    29 | 30 | 37 | 38 |

    MIME types defined: text/x-spreadsheet.

    39 | 40 |

    The Spreadsheet Mode

    41 |

    Created by Robert Plummer

    42 |
    43 | -------------------------------------------------------------------------------- /static/codemirror/mode/tiddlywiki/tiddlywiki.css: -------------------------------------------------------------------------------- 1 | span.cm-underlined { 2 | text-decoration: underline; 3 | } 4 | span.cm-strikethrough { 5 | text-decoration: line-through; 6 | } 7 | span.cm-brace { 8 | color: #170; 9 | font-weight: bold; 10 | } 11 | span.cm-table { 12 | color: blue; 13 | font-weight: bold; 14 | } 15 | -------------------------------------------------------------------------------- /static/codemirror/mode/tiki/tiki.css: -------------------------------------------------------------------------------- 1 | .cm-tw-syntaxerror { 2 | color: #FFF; 3 | background-color: #900; 4 | } 5 | 6 | .cm-tw-deleted { 7 | text-decoration: line-through; 8 | } 9 | 10 | .cm-tw-header5 { 11 | font-weight: bold; 12 | } 13 | .cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ 14 | padding-left: 10px; 15 | } 16 | 17 | .cm-tw-box { 18 | border-top-width: 0px !important; 19 | border-style: solid; 20 | border-width: 1px; 21 | border-color: inherit; 22 | } 23 | 24 | .cm-tw-underline { 25 | text-decoration: underline; 26 | } -------------------------------------------------------------------------------- /static/codemirror/mode/turtle/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Turtle mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    Turtle mode

    27 |
    41 | 47 | 48 |

    MIME types defined: text/turtle.

    49 | 50 |
    51 | -------------------------------------------------------------------------------- /static/codemirror/mode/twig/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Twig mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    Twig mode

    27 |
    40 | 45 |
    46 | -------------------------------------------------------------------------------- /static/codemirror/mode/vb/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: VB.NET mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 17 | 30 | 31 |
    32 |

    VB.NET mode

    33 |
    34 | 46 |
    47 |

    MIME type defined: text/x-vb.

    48 | 49 |
    50 | -------------------------------------------------------------------------------- /static/codemirror/mode/z80/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | CodeMirror: Z80 assembly mode 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 |
    26 |

    Z80 assembly mode

    27 | 28 | 29 |
    45 | 46 | 51 | 52 |

    MIME types defined: text/x-z80, text/x-ez80.

    53 |
    54 | -------------------------------------------------------------------------------- /static/codemirror/theme/ambiance-mobile.css: -------------------------------------------------------------------------------- 1 | .cm-s-ambiance.CodeMirror { 2 | -webkit-box-shadow: none; 3 | -moz-box-shadow: none; 4 | box-shadow: none; 5 | } 6 | -------------------------------------------------------------------------------- /static/codemirror/theme/bespin.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Name: Bespin 4 | Author: Mozilla / Jan T. Sott 5 | 6 | CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) 7 | Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) 8 | 9 | */ 10 | 11 | .cm-s-bespin.CodeMirror {background: #28211c; color: #9d9b97;} 12 | .cm-s-bespin div.CodeMirror-selected {background: #36312e !important;} 13 | .cm-s-bespin .CodeMirror-gutters {background: #28211c; border-right: 0px;} 14 | .cm-s-bespin .CodeMirror-linenumber {color: #666666;} 15 | .cm-s-bespin .CodeMirror-cursor {border-left: 1px solid #797977 !important;} 16 | 17 | .cm-s-bespin span.cm-comment {color: #937121;} 18 | .cm-s-bespin span.cm-atom {color: #9b859d;} 19 | .cm-s-bespin span.cm-number {color: #9b859d;} 20 | 21 | .cm-s-bespin span.cm-property, .cm-s-bespin span.cm-attribute {color: #54be0d;} 22 | .cm-s-bespin span.cm-keyword {color: #cf6a4c;} 23 | .cm-s-bespin span.cm-string {color: #f9ee98;} 24 | 25 | .cm-s-bespin span.cm-variable {color: #54be0d;} 26 | .cm-s-bespin span.cm-variable-2 {color: #5ea6ea;} 27 | .cm-s-bespin span.cm-def {color: #cf7d34;} 28 | .cm-s-bespin span.cm-error {background: #cf6a4c; color: #797977;} 29 | .cm-s-bespin span.cm-bracket {color: #9d9b97;} 30 | .cm-s-bespin span.cm-tag {color: #cf6a4c;} 31 | .cm-s-bespin span.cm-link {color: #9b859d;} 32 | 33 | .cm-s-bespin .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} 34 | .cm-s-bespin .CodeMirror-activeline-background { background: #404040; } 35 | -------------------------------------------------------------------------------- /static/codemirror/theme/eclipse.css: -------------------------------------------------------------------------------- 1 | .cm-s-eclipse span.cm-meta { color: #FF1717; } 2 | .cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; color: #7F0055; } 3 | .cm-s-eclipse span.cm-atom { color: #219; } 4 | .cm-s-eclipse span.cm-number { color: #164; } 5 | .cm-s-eclipse span.cm-def { color: #00f; } 6 | .cm-s-eclipse span.cm-variable { color: black; } 7 | .cm-s-eclipse span.cm-variable-2 { color: #0000C0; } 8 | .cm-s-eclipse span.cm-variable-3, .cm-s-eclipse span.cm-type { color: #0000C0; } 9 | .cm-s-eclipse span.cm-property { color: black; } 10 | .cm-s-eclipse span.cm-operator { color: black; } 11 | .cm-s-eclipse span.cm-comment { color: #3F7F5F; } 12 | .cm-s-eclipse span.cm-string { color: #2A00FF; } 13 | .cm-s-eclipse span.cm-string-2 { color: #f50; } 14 | .cm-s-eclipse span.cm-qualifier { color: #555; } 15 | .cm-s-eclipse span.cm-builtin { color: #30a; } 16 | .cm-s-eclipse span.cm-bracket { color: #cc7; } 17 | .cm-s-eclipse span.cm-tag { color: #170; } 18 | .cm-s-eclipse span.cm-attribute { color: #00c; } 19 | .cm-s-eclipse span.cm-link { color: #219; } 20 | .cm-s-eclipse span.cm-error { color: #f00; } 21 | 22 | .cm-s-eclipse .CodeMirror-activeline-background { background: #e8f2ff; } 23 | .cm-s-eclipse .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } 24 | -------------------------------------------------------------------------------- /static/codemirror/theme/elegant.css: -------------------------------------------------------------------------------- 1 | .cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom { color: #762; } 2 | .cm-s-elegant span.cm-comment { color: #262; font-style: italic; line-height: 1em; } 3 | .cm-s-elegant span.cm-meta { color: #555; font-style: italic; line-height: 1em; } 4 | .cm-s-elegant span.cm-variable { color: black; } 5 | .cm-s-elegant span.cm-variable-2 { color: #b11; } 6 | .cm-s-elegant span.cm-qualifier { color: #555; } 7 | .cm-s-elegant span.cm-keyword { color: #730; } 8 | .cm-s-elegant span.cm-builtin { color: #30a; } 9 | .cm-s-elegant span.cm-link { color: #762; } 10 | .cm-s-elegant span.cm-error { background-color: #fdd; } 11 | 12 | .cm-s-elegant .CodeMirror-activeline-background { background: #e8f2ff; } 13 | .cm-s-elegant .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } 14 | -------------------------------------------------------------------------------- /static/codemirror/theme/hopscotch.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Name: Hopscotch 4 | Author: Jan T. Sott 5 | 6 | CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) 7 | Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) 8 | 9 | */ 10 | 11 | .cm-s-hopscotch.CodeMirror {background: #322931; color: #d5d3d5;} 12 | .cm-s-hopscotch div.CodeMirror-selected {background: #433b42 !important;} 13 | .cm-s-hopscotch .CodeMirror-gutters {background: #322931; border-right: 0px;} 14 | .cm-s-hopscotch .CodeMirror-linenumber {color: #797379;} 15 | .cm-s-hopscotch .CodeMirror-cursor {border-left: 1px solid #989498 !important;} 16 | 17 | .cm-s-hopscotch span.cm-comment {color: #b33508;} 18 | .cm-s-hopscotch span.cm-atom {color: #c85e7c;} 19 | .cm-s-hopscotch span.cm-number {color: #c85e7c;} 20 | 21 | .cm-s-hopscotch span.cm-property, .cm-s-hopscotch span.cm-attribute {color: #8fc13e;} 22 | .cm-s-hopscotch span.cm-keyword {color: #dd464c;} 23 | .cm-s-hopscotch span.cm-string {color: #fdcc59;} 24 | 25 | .cm-s-hopscotch span.cm-variable {color: #8fc13e;} 26 | .cm-s-hopscotch span.cm-variable-2 {color: #1290bf;} 27 | .cm-s-hopscotch span.cm-def {color: #fd8b19;} 28 | .cm-s-hopscotch span.cm-error {background: #dd464c; color: #989498;} 29 | .cm-s-hopscotch span.cm-bracket {color: #d5d3d5;} 30 | .cm-s-hopscotch span.cm-tag {color: #dd464c;} 31 | .cm-s-hopscotch span.cm-link {color: #c85e7c;} 32 | 33 | .cm-s-hopscotch .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} 34 | .cm-s-hopscotch .CodeMirror-activeline-background { background: #302020; } 35 | -------------------------------------------------------------------------------- /static/codemirror/theme/isotope.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Name: Isotope 4 | Author: David Desandro / Jan T. Sott 5 | 6 | CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) 7 | Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) 8 | 9 | */ 10 | 11 | .cm-s-isotope.CodeMirror {background: #000000; color: #e0e0e0;} 12 | .cm-s-isotope div.CodeMirror-selected {background: #404040 !important;} 13 | .cm-s-isotope .CodeMirror-gutters {background: #000000; border-right: 0px;} 14 | .cm-s-isotope .CodeMirror-linenumber {color: #808080;} 15 | .cm-s-isotope .CodeMirror-cursor {border-left: 1px solid #c0c0c0 !important;} 16 | 17 | .cm-s-isotope span.cm-comment {color: #3300ff;} 18 | .cm-s-isotope span.cm-atom {color: #cc00ff;} 19 | .cm-s-isotope span.cm-number {color: #cc00ff;} 20 | 21 | .cm-s-isotope span.cm-property, .cm-s-isotope span.cm-attribute {color: #33ff00;} 22 | .cm-s-isotope span.cm-keyword {color: #ff0000;} 23 | .cm-s-isotope span.cm-string {color: #ff0099;} 24 | 25 | .cm-s-isotope span.cm-variable {color: #33ff00;} 26 | .cm-s-isotope span.cm-variable-2 {color: #0066ff;} 27 | .cm-s-isotope span.cm-def {color: #ff9900;} 28 | .cm-s-isotope span.cm-error {background: #ff0000; color: #c0c0c0;} 29 | .cm-s-isotope span.cm-bracket {color: #e0e0e0;} 30 | .cm-s-isotope span.cm-tag {color: #ff0000;} 31 | .cm-s-isotope span.cm-link {color: #cc00ff;} 32 | 33 | .cm-s-isotope .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} 34 | .cm-s-isotope .CodeMirror-activeline-background { background: #202020; } 35 | -------------------------------------------------------------------------------- /static/codemirror/theme/neat.css: -------------------------------------------------------------------------------- 1 | .cm-s-neat span.cm-comment { color: #a86; } 2 | .cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } 3 | .cm-s-neat span.cm-string { color: #a22; } 4 | .cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } 5 | .cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } 6 | .cm-s-neat span.cm-variable { color: black; } 7 | .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } 8 | .cm-s-neat span.cm-meta { color: #555; } 9 | .cm-s-neat span.cm-link { color: #3a3; } 10 | 11 | .cm-s-neat .CodeMirror-activeline-background { background: #e8f2ff; } 12 | .cm-s-neat .CodeMirror-matchingbracket { outline:1px solid grey; color:black !important; } 13 | -------------------------------------------------------------------------------- /static/codemirror/theme/neo.css: -------------------------------------------------------------------------------- 1 | /* neo theme for codemirror */ 2 | 3 | /* Color scheme */ 4 | 5 | .cm-s-neo.CodeMirror { 6 | background-color:#ffffff; 7 | color:#2e383c; 8 | line-height:1.4375; 9 | } 10 | .cm-s-neo .cm-comment { color:#75787b; } 11 | .cm-s-neo .cm-keyword, .cm-s-neo .cm-property { color:#1d75b3; } 12 | .cm-s-neo .cm-atom,.cm-s-neo .cm-number { color:#75438a; } 13 | .cm-s-neo .cm-node,.cm-s-neo .cm-tag { color:#9c3328; } 14 | .cm-s-neo .cm-string { color:#b35e14; } 15 | .cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier { color:#047d65; } 16 | 17 | 18 | /* Editor styling */ 19 | 20 | .cm-s-neo pre { 21 | padding:0; 22 | } 23 | 24 | .cm-s-neo .CodeMirror-gutters { 25 | border:none; 26 | border-right:10px solid transparent; 27 | background-color:transparent; 28 | } 29 | 30 | .cm-s-neo .CodeMirror-linenumber { 31 | padding:0; 32 | color:#e0e2e5; 33 | } 34 | 35 | .cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } 36 | .cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } 37 | 38 | .cm-s-neo .CodeMirror-cursor { 39 | width: auto; 40 | border: 0; 41 | background: rgba(155,157,162,0.37); 42 | z-index: 1; 43 | } 44 | -------------------------------------------------------------------------------- /static/codemirror/theme/railscasts.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Name: Railscasts 4 | Author: Ryan Bates (http://railscasts.com) 5 | 6 | CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) 7 | Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) 8 | 9 | */ 10 | 11 | .cm-s-railscasts.CodeMirror {background: #2b2b2b; color: #f4f1ed;} 12 | .cm-s-railscasts div.CodeMirror-selected {background: #272935 !important;} 13 | .cm-s-railscasts .CodeMirror-gutters {background: #2b2b2b; border-right: 0px;} 14 | .cm-s-railscasts .CodeMirror-linenumber {color: #5a647e;} 15 | .cm-s-railscasts .CodeMirror-cursor {border-left: 1px solid #d4cfc9 !important;} 16 | 17 | .cm-s-railscasts span.cm-comment {color: #bc9458;} 18 | .cm-s-railscasts span.cm-atom {color: #b6b3eb;} 19 | .cm-s-railscasts span.cm-number {color: #b6b3eb;} 20 | 21 | .cm-s-railscasts span.cm-property, .cm-s-railscasts span.cm-attribute {color: #a5c261;} 22 | .cm-s-railscasts span.cm-keyword {color: #da4939;} 23 | .cm-s-railscasts span.cm-string {color: #ffc66d;} 24 | 25 | .cm-s-railscasts span.cm-variable {color: #a5c261;} 26 | .cm-s-railscasts span.cm-variable-2 {color: #6d9cbe;} 27 | .cm-s-railscasts span.cm-def {color: #cc7833;} 28 | .cm-s-railscasts span.cm-error {background: #da4939; color: #d4cfc9;} 29 | .cm-s-railscasts span.cm-bracket {color: #f4f1ed;} 30 | .cm-s-railscasts span.cm-tag {color: #da4939;} 31 | .cm-s-railscasts span.cm-link {color: #b6b3eb;} 32 | 33 | .cm-s-railscasts .CodeMirror-matchingbracket { text-decoration: underline; color: white !important;} 34 | .cm-s-railscasts .CodeMirror-activeline-background { background: #303040; } 35 | -------------------------------------------------------------------------------- /static/css/patterns/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/1.png -------------------------------------------------------------------------------- /static/css/patterns/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/2.png -------------------------------------------------------------------------------- /static/css/patterns/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/3.png -------------------------------------------------------------------------------- /static/css/patterns/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/4.png -------------------------------------------------------------------------------- /static/css/patterns/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/5.png -------------------------------------------------------------------------------- /static/css/patterns/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/6.png -------------------------------------------------------------------------------- /static/css/patterns/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/7.png -------------------------------------------------------------------------------- /static/css/patterns/congruent_pentagon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/congruent_pentagon.png -------------------------------------------------------------------------------- /static/css/patterns/header-profile-skin-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/header-profile-skin-1.png -------------------------------------------------------------------------------- /static/css/patterns/header-profile-skin-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/header-profile-skin-2.png -------------------------------------------------------------------------------- /static/css/patterns/header-profile-skin-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/header-profile-skin-3.png -------------------------------------------------------------------------------- /static/css/patterns/header-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/header-profile.png -------------------------------------------------------------------------------- /static/css/patterns/otis_redding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/otis_redding.png -------------------------------------------------------------------------------- /static/css/patterns/shattered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/shattered.png -------------------------------------------------------------------------------- /static/css/patterns/triangular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/patterns/triangular.png -------------------------------------------------------------------------------- /static/css/plugins/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/plugins/__init__.py -------------------------------------------------------------------------------- /static/css/plugins/chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/css/plugins/chosen/chosen-sprite.png -------------------------------------------------------------------------------- /static/css/plugins/codemirror/fold/foldgutter.css: -------------------------------------------------------------------------------- 1 | .CodeMirror-foldmarker { 2 | color: blue; 3 | text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; 4 | font-family: arial; 5 | line-height: .3; 6 | cursor: pointer; 7 | } 8 | .CodeMirror-foldgutter { 9 | width: .7em; 10 | } 11 | .CodeMirror-foldgutter-open, 12 | .CodeMirror-foldgutter-folded { 13 | cursor: pointer; 14 | } 15 | .CodeMirror-foldgutter-open:after { 16 | content: "\25BE"; 17 | } 18 | .CodeMirror-foldgutter-folded:after { 19 | content: "\25B8"; 20 | } 21 | -------------------------------------------------------------------------------- /static/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /static/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/profile_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/img/profile_small.jpg -------------------------------------------------------------------------------- /static/js/cmd/area.js: -------------------------------------------------------------------------------- 1 | function showLocation(province , city , town) { 2 | 3 | var loc = new Location(); 4 | var title = ['省份' , '地级市' , '市、县、区']; 5 | $.each(title , function(k , v) { 6 | title[k] = ''; 7 | }) 8 | 9 | // $('#d1').append(title[0]); 10 | // $('#d2').append(title[1]); 11 | // $('#d3').append(title[2]); 12 | 13 | $("#d1,#d2,#d3").select2({tags: true, width: "40%"}); 14 | $('#d1').change(function() { 15 | $('#d2').empty(); 16 | // $('#d2').append(title[1]); 17 | loc.fillOption('d2' , '0,'+$('#d1').val()); 18 | $('#d2').change() 19 | //$('input[@name=location_id]').val($(this).val()); 20 | }) 21 | 22 | $('#d2').change(function() { 23 | $('#d3').empty(); 24 | // $('#d3').append(title[2]); 25 | loc.fillOption('d3' , '0,' + $('#d1').val() + ',' + $('#d2').val()); 26 | //$('input[@name=location_id]').val($(this).val()); 27 | }) 28 | 29 | $('#d3').change(function() { 30 | $('input[name=location_id]').val($(this).val()); 31 | }) 32 | 33 | if (province) { 34 | loc.fillOption('d1' , '0' , province); 35 | 36 | if (city) { 37 | loc.fillOption('d2' , '0,'+province , city); 38 | 39 | if (town) { 40 | loc.fillOption('d3' , '0,'+province+','+city , town); 41 | } 42 | } 43 | 44 | } else { 45 | loc.fillOption('d1' , '0'); 46 | } 47 | 48 | } 49 | 50 | $(function(){ 51 | showLocation(); 52 | $('#btnval').click(function(){ 53 | alert($('#d1').val() + ' - ' + $('#d2').val() + ' - ' + $('#d3').val()) 54 | }) 55 | $('#btntext').click(function(){ 56 | alert($('#d1').select2('data').text + ' - ' + $('#d2').select2('data').text + ' - ' + $('#d3').select2('data').text) 57 | }) 58 | }) -------------------------------------------------------------------------------- /static/js/echarts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/js/echarts.jpg -------------------------------------------------------------------------------- /static/jstree/themes/default-dark/32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default-dark/32px.png -------------------------------------------------------------------------------- /static/jstree/themes/default-dark/40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default-dark/40px.png -------------------------------------------------------------------------------- /static/jstree/themes/default-dark/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default-dark/throbber.gif -------------------------------------------------------------------------------- /static/jstree/themes/default/32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default/32px.png -------------------------------------------------------------------------------- /static/jstree/themes/default/40px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default/40px.png -------------------------------------------------------------------------------- /static/jstree/themes/default/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/jstree/themes/default/throbber.gif -------------------------------------------------------------------------------- /static/plugins/asciinema/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /static/plugins/avue/index.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 3 | /** 4 | * Install plugin 5 | * @param Vue 6 | * @param axios 7 | */ 8 | 9 | function plugin(Vue, axios) { 10 | 11 | if (plugin.installed) { 12 | return 13 | } 14 | plugin.installed = true 15 | 16 | if (!axios) { 17 | console.error('You have to install axios') 18 | return 19 | } 20 | 21 | Vue.axios = axios 22 | 23 | Object.defineProperties(Vue.prototype, { 24 | 25 | axios: { 26 | get() { 27 | return axios 28 | } 29 | }, 30 | 31 | $http: { 32 | get() { 33 | return axios 34 | } 35 | } 36 | 37 | }) 38 | } 39 | 40 | if (typeof exports == "object") { 41 | module.exports = plugin 42 | } else if (typeof define == "function" && define.amd) { 43 | define([], function(){ return plugin }) 44 | } else if (window.Vue && window.axios) { 45 | Vue.use(plugin, window.axios) 46 | } 47 | 48 | })(); 49 | -------------------------------------------------------------------------------- /static/plugins/avue/vue-axios.es5.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; 4 | 5 | (function () { 6 | 7 | /** 8 | * Install plugin 9 | * @param Vue 10 | * @param axios 11 | */ 12 | 13 | function plugin(Vue, axios) { 14 | 15 | if (plugin.installed) { 16 | return; 17 | } 18 | plugin.installed = true; 19 | 20 | if (!axios) { 21 | console.error('You have to install axios'); 22 | return; 23 | } 24 | 25 | Vue.axios = axios; 26 | 27 | Object.defineProperties(Vue.prototype, { 28 | 29 | axios: { 30 | get: function get() { 31 | return axios; 32 | } 33 | }, 34 | 35 | $http: { 36 | get: function get() { 37 | return axios; 38 | } 39 | } 40 | 41 | }); 42 | } 43 | 44 | if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) == "object") { 45 | module.exports = plugin; 46 | } else if (typeof define == "function" && define.amd) { 47 | define([], function () { 48 | return plugin; 49 | }); 50 | } else if (window.Vue && window.axios) { 51 | Vue.use(plugin, window.axios); 52 | } 53 | })(); -------------------------------------------------------------------------------- /static/plugins/avue/vue-axios.min.js: -------------------------------------------------------------------------------- 1 | "use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o};!function(){function o(e,t){if(!o.installed){if(o.installed=!0,!t)return void console.error("You have to install axios");e.axios=t,Object.defineProperties(e.prototype,{axios:{get:function(){return t}},$http:{get:function(){return t}}})}}"object"==("undefined"==typeof exports?"undefined":_typeof(exports))?module.exports=o:"function"==typeof define&&define.amd?define([],function(){return o}):window.Vue&&window.axios&&Vue.use(o,window.axios)}(); -------------------------------------------------------------------------------- /static/plugins/element-ui/2.12.0/fonts/element-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/element-ui/2.12.0/fonts/element-icons.ttf -------------------------------------------------------------------------------- /static/plugins/element-ui/2.12.0/fonts/element-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/element-ui/2.12.0/fonts/element-icons.woff -------------------------------------------------------------------------------- /static/plugins/elfinder/.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | ._* 3 | _* 4 | .DS_Store 5 | php-old 6 | extensions 7 | build 8 | files2 9 | elFinderVolumeSVN.class.php 10 | connector-svn.php 11 | node_modules 12 | connector.php 13 | -------------------------------------------------------------------------------- /static/plugins/elfinder/ace/snippets/properties.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/properties",["require","exports","module"], function(require, exports, module) { 2 | "use strict"; 3 | 4 | exports.snippetText = ""; 5 | exports.scope = "properties"; 6 | 7 | }); 8 | (function() { 9 | ace.require(["ace/snippets/properties"], function(m) { 10 | if (typeof module == "object" && typeof exports == "object" && module) { 11 | module.exports = m; 12 | } 13 | }); 14 | })(); -------------------------------------------------------------------------------- /static/plugins/elfinder/ace/snippets/xml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/xml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="xml"}) -------------------------------------------------------------------------------- /static/plugins/elfinder/ace/snippets/yaml.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/yaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="yaml"}) -------------------------------------------------------------------------------- /static/plugins/elfinder/files/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/files/.gitkeep -------------------------------------------------------------------------------- /static/plugins/elfinder/files/.trash/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/files/.trash/.gitkeep -------------------------------------------------------------------------------- /static/plugins/elfinder/img/arrows-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/arrows-active.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/arrows-normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/arrows-normal.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/crop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/crop.gif -------------------------------------------------------------------------------- /static/plugins/elfinder/img/dialogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/dialogs.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_aceeditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_aceeditor.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_ckeditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_ckeditor.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_codemirror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_codemirror.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_creativecloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_creativecloud.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_pixlreditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_pixlreditor.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_pixlrexpress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_pixlrexpress.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_simplemde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_simplemde.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_tinymce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_tinymce.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/edit_zohooffice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/edit_zohooffice.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/icons-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/icons-big.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/icons-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/icons-small.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/logo.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/progress.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/progress.gif -------------------------------------------------------------------------------- /static/plugins/elfinder/img/quicklook-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/quicklook-bg.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/quicklook-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/quicklook-icons.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/resize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/resize.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/spinner-mini.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/spinner-mini.gif -------------------------------------------------------------------------------- /static/plugins/elfinder/img/toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/toolbar.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_box.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_dropbox.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_ftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_ftp.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_googledrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_googledrive.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_local.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_onedrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_onedrive.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_sql.png -------------------------------------------------------------------------------- /static/plugins/elfinder/img/volume_icon_trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py2010/dx/8cb7c28833d309e4123188b0274a952c2ba66927/static/plugins/elfinder/img/volume_icon_trash.png -------------------------------------------------------------------------------- /static/plugins/elfinder/js/extras/quicklook.googledocs.min.js: -------------------------------------------------------------------------------- 1 | "use strict";!function(e,n){"function"==typeof define&&define.amd?define(["elfinder"],n):"undefined"!=typeof exports?module.exports=n(require("elfinder")):n(e.elFinder)}(this,function(e){try{e.prototype.commands.quicklook.plugins||(e.prototype.commands.quicklook.plugins=[]),e.prototype.commands.quicklook.plugins.push(function(e){var n=e.fm,o=e.preview;o.on("update",function(i){var t,l,r=(e.window,i.file);0===r.mime.indexOf("application/vnd.google-apps.")&&("1"==r.url&&$('
    ").appendTo(e.info.find(".elfinder-quicklook-info")).on("click",function(){$(this).html(''),n.request({data:{cmd:"url",target:r.hash},preventDefault:!0}).always(function(){$(this).html("")}).done(function(i){var t=n.file(r.hash);e.value.url=t.url=i.url||"",e.value.url&&o.trigger($.Event("update",{file:e.value}))})}),""!==r.url&&"1"!=r.url&&(i.stopImmediatePropagation(),o.one("change",function(){l.remove(),t.off("load").remove()}),l=$('
    Now loading...
    ').appendTo(e.info.find(".elfinder-quicklook-info")),t=$('