A small Python framework meant to easily create programs with unified CLI and API.
Find a file
2013-10-17 10:57:52 +00:00
bash Correct name of the yunohost bin 2013-06-22 13:38:40 +02:00
doc Add json spec generator 2013-07-02 22:02:26 +02:00
txrestapi Move txrestapi 2013-07-06 19:36:19 +02:00
.gitignore Generate doc at API launch 2013-07-03 12:28:18 +00:00
action_map.yml SSOwat conf generator tool 2013-10-17 10:57:52 +00:00
firewall.yml firewall refactoring 2013-07-07 15:26:59 +02:00
generate_api_doc.py Create doc dir if unexistant 2013-07-06 19:55:31 +02:00
generate_function_doc.py Regenerate function doc 2013-07-06 10:17:16 +02:00
ldap_scheme.yml bugfixes 2013-07-03 12:23:07 +00:00
LICENSE Init 2012-10-06 16:22:15 +02:00
process.yml update process list 2013-10-02 08:33:26 +02:00
README.md replace parse_args by yunohost 2013-06-15 14:37:27 +02:00
yunohost remove useless function 2013-09-30 16:36:44 +00:00
yunohost.py fixes 2013-10-11 04:13:47 +02:00
yunohost.tac Add SSL support in API (experimental) 2013-10-07 18:35:54 +00:00
yunohost_app.py Remove apache & lemon stuffs 2013-10-17 09:38:55 +00:00
yunohost_backup.py Configure backup at post-installation 2013-08-05 09:31:13 +02:00
yunohost_domain.py Handle multiple certs in metronome 2013-10-17 10:22:36 +00:00
yunohost_dyndns.py DynDNS improvements 2013-07-08 14:41:44 +02:00
yunohost_firewall.py eth0 interfacace fix 2013-07-14 16:48:29 +02:00
yunohost_monitor.py fix indent 2013-10-05 12:29:48 +02:00
yunohost_tools.py SSOwat conf generator tool 2013-10-17 10:57:52 +00:00
yunohost_user.py Correct PUT method handling & Add infos to user_info 2013-09-23 10:29:49 +00:00

YunoHost CLI

Specifications

User

yunohost user list [-h] [--fields FIELDS [FIELDS ...]] [-o OFFSET]
                        [-f FILTER] [-l LIMIT]
yunohost user create [-h] [-u USERNAME] [-l LASTNAME] [-f FIRSTNAME]
                          [-p PASSWORD] [-m MAIL]
yunohost user delete [-h] [--purge] users [users ...]
yunohost user update [-h] [-f FIRSTNAME]
                          [--add-mailalias MAIL [MAIL ...]] [-m MAIL]
                          [-l LASTNAME]
                          [--remove-mailforward MAIL [MAIL ...]]
                          [--remove-mailalias MAIL [MAIL ...]]
                          [--add-mailforward MAIL [MAIL ...]]
                          [-p PASSWORD]
                          user
yunohost user info [-h] [-u USER] [-m MAIL]

Domain

yunohost domain list [-h] [-l LIMIT] [-o OFFSET] [-f FILTER]
yunohost domain add [-h] [domain [domain ...]]
yunohost domain remove [-h] [domain [domain ...]]
yunohost domain info [-h] domain
yunohost domain renewcert [-h] domain

App

yunohost app updatelist [-h] [-u URL]
yunohost app list [-h] [--fields FIELDS [FIELDS ...]] [-o OFFSET]
                       [-f FILTER] [-l LIMIT]
yunohost app install [-h] [-d DOMAIN] [--public] [-l LABEL] [-p PATH]
                          [--protected]
                          app
yunohost app remove [-h] app [app ...]
yunohost app upgrade [-h] [app [app ...]]
yunohost app info [-h] app
yunohost app addaccess [-h] [-u USER [USER ...]] app [app ...]
yunohost app removeaccess [-h] [-u USER [USER ...]] app [app ...]

Firewall

yunohost firewall list [-h]
yunohost firewall allow [-h] {UDP,TCP,Both} port name
yunohost firewall disallow [-h] name

Monitoring

yunohost monitor info [-h] [-u] [-d] [-p] [-c] [-m] [-i]
yunohost monitor process [-h] [-e PROCESS] [-d PROCESS]
                              [--stop PROCESS] [-c PORT] [-i]
                              [--start PROCESS]

Tools

yunohost tools postinstall [-h] [-d DOMAIN] [-p PASSWORD]
yunohost tools maindomain [-h] [-o OLD_DOMAIN] [-n NEW_DOMAIN]
yunohost tools adminpw [-h] [-o OLD_PASSWORD] [-n NEW_PASSWORD]
yunohost tools ldapinit [-h] [-d DOMAIN]

How to use "as is" ?

The executable file is yunohost, for example:

./yunohost user create

Contribute / FAQ

What a lovely idea ! :)

Dafuq is dat moulinette ?

We decided to regroup all YunoHost related operations into a single program called "moulinette". This will allow us to entirely manipulate our YunoHost instances through a wonderful CLI. Additionally the web interface will just have to call the same "moulinette" functions. Magic power inside :p

Important files

  • yunohost File executed on function calling - i.e ./yunohost user create.
  • action_map.yml Defines all CLI actions and links arguments.
  • yunohost.py Contains all YunoHost functions likely to be shared between moulinette files. Also contains service connections classes (erk).
  • yunohost_*.py Files containing action functions. * is the category: user, domain, firewall, etc.

How to add a function ?

  1. Check if the action is already in the action_map.yml file. If not, follow the file documentation to add it.
  2. Also check if the file yunohost_category.py is created in the working tree. If not, just create it (you may take example of yunohost_user.py file).
  3. Add your function category_action() in this file - i.e user_create()

Note: category_action() takes one parameter,args which contains the arguments passed to the command. Refers to action_map.yml documentation for more informations.

Error handling

Moulinette has a unified way to handle errors. First, you need to import the YunoHostError exception: from yunohost import YunoHostError

Then you need to raise errors like this: raise YunoHostError(<ERROR CODE>, <MESSAGE>)

For example: raise YunoHostError(125, _("Interrupted, user not created"))

Note: Standard error codes can be found in the YunoHostError class in yunohost.py file.

Print results

Moulinette also have a unified way to print results. In fact we don't only print result for the CLI, but we also have to export the result in a JSON way. Results are automatically printed OR exported, you don't have to print it yourself in the action's functions. Your function just need is to return results as a dictionary, for example: return { 'Fullname' : 'Homer Simpson', 'Mail' : 'homer@simpson.org', 'Username' : 'hsimpson' }

i18n

We will have to translate YunoHost, and we have already initialized i18n module in the moulinette. As a result, do not forget to put potentially translated strings into _() function. For example: raise YunoHostError(125, _("Interrupted, user not created"))

Git is pissing me off !

OK, this is the workflow !

For gitlab: Development is handle with git branches and you have your own (i.e dev_beudbeud).

git clone git@dev.yunohost.org:moulinette.git
git checkout -b dev_beudbeud ``
git rebase origin/dev

Do your modifications, then :

git commit -am 'My commit message'
git pull origin dev (merge manually if conflicts)
git push origin dev_beudbeud

Then you could ask for a 'merge request' in gitlab.

For github (here): Development is handle with forked repos and you have your own (i.e beudbeud/moulinette).

git clone https://github.com/beudbeud/moulinette.git ``
git checkout -b dev
git rebase origin/dev

Do your modifications, then:

git commit -am 'My commit message'
git remote add vanilla https://github.com/YunoHost/moulinette.git
git pull vanilla dev (merge manually if conflicts)
git push origin dev

Then you could ask for a 'pull request' in github.