From 25e57e89ab6703aa011da4598e22f130c2695e45 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 12 May 2019 12:31:51 +0200 Subject: [PATCH 01/19] update readme --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bbe61d6..36a30cb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ -# Ungleich dns cli tool +# ungleich cli -A python package to set reverse dns in ungleich vm. +This CLI is used for day-to-day tasks used at ungleich. +It is intended to be used by ungleich engineers and skilled customers. -## Requirements +## Requirements / Installation -You need at least python 3. +* ensure you have python3 +* git clone this repo +* python ungleich-cli.py -## Usage +## Usage: DNS installing the package via pip (python3 required) From 672418af194d41abcb3aa44a6d2a3e7141556259 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sun, 12 May 2019 12:42:28 +0200 Subject: [PATCH 02/19] Cleanup --- README.md | 18 ++++++++---------- ungleichcli.py => ungleich | 2 +- ungleich_dns.py | 4 +++- 3 files changed, 12 insertions(+), 12 deletions(-) rename ungleichcli.py => ungleich (98%) mode change 100644 => 100755 diff --git a/README.md b/README.md index 36a30cb..7138b3f 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,17 @@ It is intended to be used by ungleich engineers and skilled customers. * ensure you have python3 * git clone this repo -* python ungleich-cli.py + +## Usage general + +``` +ungleich --help +``` ## Usage: DNS -installing the package via pip (python3 required) - -```angular2 -python3 -m pip install ungleich-cli ``` -after installed you can set the reverse dns by typing - -```angular2 -ungleich-cli dns --set-reverse --user --token --name mirror.example.com +ungleich dns --set-reverse --user --token --name mirror.example.com ``` ### Usage: RIPE @@ -27,7 +25,7 @@ ungleich-cli dns --set-reverse --user --token --name mir Creating a new route6 object: ``` -ungleichcli.py ripe-add-route6 \ +ungleich ripe-add-route6 \ --network 2a09:2947::/32 --description "First REST /32" --password "very secure" diff --git a/ungleichcli.py b/ungleich old mode 100644 new mode 100755 similarity index 98% rename from ungleichcli.py rename to ungleich index b1f8282..6d6a818 --- a/ungleichcli.py +++ b/ungleich @@ -5,7 +5,7 @@ import argparse from ungleich_dns import ungleichDNS from ungleich_ripe import ungleichRIPE -VERSION = "0.0.2" +VERSION = "0.0.3" class ungleichCLI(object): def __init__(self): diff --git a/ungleich_dns.py b/ungleich_dns.py index 1dd8204..cd47685 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -6,7 +6,9 @@ class ungleichDNS(object): self.parser = parser self.parser['dns'] = self.parser['sub'].add_parser( - 'dns', parents=[parents]) + 'dns', + help="Manage DNS entries @ ungleich", + parents=[parents]) self.parser['dns'].add_argument('--set-reverse', help='REQUIRED: IPv6 Address of your VM', metavar='', required=True) self.parser['dns'].add_argument('--user', help='Your ungleich username', metavar='', required=True) From 6f3d4a9890789f16ffa5f5580ce0e22035d5541a Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Wed, 15 May 2019 18:49:00 -0400 Subject: [PATCH 03/19] fix and add the dev vm --- ungleich_dns.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/ungleich_dns.py b/ungleich_dns.py index cd47685..14c5349 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -14,10 +14,20 @@ class ungleichDNS(object): self.parser['dns'].add_argument('--user', help='Your ungleich username', metavar='', required=True) self.parser['dns'].add_argument('--token', help='Your ungleich 6 digit OTP generated token', metavar='', type=int, required=True) self.parser['dns'].add_argument('--name', help='Hostname', metavar='', required=True) + self.parser['dns'].add_argument('--email', help='registered email', metavar='', required=True) + self.parser['dns'].add_argument('--realm', help='Otp realm', metavar='', required=True) + self.parser['dns'].set_defaults(func=self._handle_dns) - def _handle_dns(self): - """A dummy endpoint, to check what endpoint will be reverse-dns service.""" + def _handle_dns(self, args): + """A dev endpoint for reverse-dns service.""" r = requests.post( - 'https://en53kfc0hydpg.x.pipedream.net', - json={'username': args.user, 'token': args.token, 'ipaddress': args.set_reverse, 'name': args.name}) - return r.text + 'https://dev.william.ungleich.cloud', + json={ + 'username': args.user, + 'token': args.token, + 'ipaddress': args.set_reverse, + 'name': args.name, + 'email': args.email, + 'realm': args.realm + }) + print(r.text) From 64f9e32e8c87a2f06615808c3b48ecd56a850b72 Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Wed, 15 May 2019 18:49:22 -0400 Subject: [PATCH 04/19] Updated readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7138b3f..642dd42 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ungleich --help ## Usage: DNS ``` -ungleich dns --set-reverse --user --token --name mirror.example.com +ungleich dns --set-reverse --user --token --realm --email --name mirror.example.com ``` ### Usage: RIPE From d4d03d6add1072196b9c48862da81a755c51303b Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Wed, 15 May 2019 18:53:34 -0400 Subject: [PATCH 05/19] delete unnecesary files --- LICENSE | 9 --------- setup.cfg | 2 -- setup.py | 34 ---------------------------------- 3 files changed, 45 deletions(-) delete mode 100644 LICENSE delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 45e4486..0000000 --- a/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -LICENSE - -Copyright - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 224a779..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[metadata] -description-file = README.md \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index 9848154..0000000 --- a/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -from setuptools import setup - - -def readme(): - with open('README.md') as f: - README = f.read() - return README - - -setup( - name='ungleich-cli', - version='1.0.0', - description="A Python package for ungleich dns administration.", - long_description=readme(), - long_description_content_type="text/markdown", - author="William Colmenares", - author_email="colmenares.william@gmail.com", - license="MIT", - classifiers=[ - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - ], - - py_modules=['ungleichcli'], - install_requires=[ - 'requests', - ], - entry_points={ - "console_scripts": [ - "ungleich-cli=ungleichcli:cli" - ] - }, -) From d6e29ead71760e241aa27ec079614e920a7e096d Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Sat, 18 May 2019 12:39:28 -0400 Subject: [PATCH 06/19] remove metavar --- ungleich_dns.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ungleich_dns.py b/ungleich_dns.py index 14c5349..7552c99 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -10,12 +10,12 @@ class ungleichDNS(object): help="Manage DNS entries @ ungleich", parents=[parents]) - self.parser['dns'].add_argument('--set-reverse', help='REQUIRED: IPv6 Address of your VM', metavar='', required=True) - self.parser['dns'].add_argument('--user', help='Your ungleich username', metavar='', required=True) - self.parser['dns'].add_argument('--token', help='Your ungleich 6 digit OTP generated token', metavar='', type=int, required=True) - self.parser['dns'].add_argument('--name', help='Hostname', metavar='', required=True) - self.parser['dns'].add_argument('--email', help='registered email', metavar='', required=True) - self.parser['dns'].add_argument('--realm', help='Otp realm', metavar='', required=True) + self.parser['dns'].add_argument('--set-reverse', help='REQUIRED: IPv6 Address of your VM', required=True) + self.parser['dns'].add_argument('--user', help='Your ungleich username', required=True) + self.parser['dns'].add_argument('--token', help='Your ungleich 6 digit OTP generated token', type=int, required=True) + self.parser['dns'].add_argument('--name', help='Hostname', required=True) + self.parser['dns'].add_argument('--email', help='registered email', required=True) + self.parser['dns'].add_argument('--realm', help='Otp realm', required=True) self.parser['dns'].set_defaults(func=self._handle_dns) def _handle_dns(self, args): From a185cf6a3247c1eebbf1afb11c054933107c3fa3 Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Thu, 30 May 2019 05:24:09 -0400 Subject: [PATCH 07/19] Set correct endpoint for dns --- ungleich_dns.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ungleich_dns.py b/ungleich_dns.py index 7552c99..86b9dbe 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -19,9 +19,9 @@ class ungleichDNS(object): self.parser['dns'].set_defaults(func=self._handle_dns) def _handle_dns(self, args): - """A dev endpoint for reverse-dns service.""" + """Reverse dns endpoint.""" r = requests.post( - 'https://dev.william.ungleich.cloud', + 'https://dns.service.ungleich.ch', json={ 'username': args.user, 'token': args.token, From 78d2083e4dfd601d52d4bb9cc85c3a6229336f7e Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Thu, 30 May 2019 05:26:12 -0400 Subject: [PATCH 08/19] Updated readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 642dd42..d05ee4c 100644 --- a/README.md +++ b/README.md @@ -30,3 +30,12 @@ ungleich ripe-add-route6 \ --description "First REST /32" --password "very secure" ``` + +### Usage: Account + +Creating a new account object: + +``` +ungleich account --create-user --name --lastname --email + +``` From 4dd9b8cb29924e35407a676530a70da9333e516b Mon Sep 17 00:00:00 2001 From: meow Date: Thu, 6 Jun 2019 15:26:07 +0500 Subject: [PATCH 09/19] requirements.txt added, weather sub command added --- __pycache__/ungleich_account.cpython-37.pyc | Bin 0 -> 1270 bytes __pycache__/ungleich_dns.cpython-37.pyc | Bin 0 -> 1406 bytes __pycache__/ungleich_ripe.cpython-37.pyc | Bin 0 -> 2228 bytes __pycache__/ungleich_weather.cpython-37.pyc | Bin 0 -> 1554 bytes requirements.txt | 1 + ungleich | 2 ++ ungleich_weather.py | 33 ++++++++++++++++++++ 7 files changed, 36 insertions(+) create mode 100644 __pycache__/ungleich_account.cpython-37.pyc create mode 100644 __pycache__/ungleich_dns.cpython-37.pyc create mode 100644 __pycache__/ungleich_ripe.cpython-37.pyc create mode 100644 __pycache__/ungleich_weather.cpython-37.pyc create mode 100644 requirements.txt create mode 100644 ungleich_weather.py diff --git a/__pycache__/ungleich_account.cpython-37.pyc b/__pycache__/ungleich_account.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90c587c8fa4ec4826331cb322ad8f8ae13491024 GIT binary patch literal 1270 zcmZuvOK;RL5Vjp>H(lCoK|Cb{D}jV^$nJp~LWoy|xKyIRB|@@7>~^zcv#IUyh?Wa* z-8%>V0C#?kuUz0CAWqCAP1ORnX2zcJjA!PX`x_er0_)q4UoSpzLcZgrTW}|Lfy{Ma zl1Q49xRo@fkBDT_`$VLt*heq+Bz;Ok{u5r3ofLVu7#!{bnajWwiK!$plT@-#1iU=S zL2~JXch3#)rRkz7tazYRVpZya3oevBpa($aGq5FH5qc22 z)m~EN*0@bEO$wPS(Ut2tZdAUf*B}$^1N%z!7Kq25bxm zi$g`1bjE-@AP(e9_JvDt#oja9Te4aIBf`!BcE7%~t6nSUPlxMB6|!7pg&o(|rq-6` z)?{+ngK<~ZIGs*fs3#$J0m6-t#cN0Cxu65a`3)?HhfHj;69z5%%0QQSxiB_9)y5JS z$8n6Lu_O8%Fz1&Vl5yOsw-#n%6LlPrGmh#8fR>#`haoWZG=h)vk2D(WAVZqrjIOPEih8i^?*B3yz d0Mc&e&-E5BXDYRg^?!j}aJ&8g4m}pl`vY*pO3(lR literal 0 HcmV?d00001 diff --git a/__pycache__/ungleich_dns.cpython-37.pyc b/__pycache__/ungleich_dns.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f388d02873f46dfb61b4b1612cd2afce3d3b1276 GIT binary patch literal 1406 zcmZux!H(ND5G5%}mc6@)lk9F%phZ<67aeTh_7DWcHrb%fAx^qU3sfi|C?eOEBTEWN zZM%YdO0NEc{y^{jf_?_Cy|jN&^wb$?)o#!wF+*xNoEgr0_M^SM5rOgRAAfzHx`h0W zAN}C4IR?@9K?x#gPNHt55&e<~CY<*~IFh|{B1h1dB;;KpunW-#~5XhQwq;R#4JMWCfvw zvtbJ=_||Ey>|uAx;FJkhcw!*@twXO`hhlV%bw}(P2kd)W{(<)maq}AQvAA`O^|rY4 zKP!j2T(Q5U6dDLmJ(ycZ*RQQ33f+A2EGd$O4B*j$ER4#e4vvGq6(O^HDf7w>szkxD zZuTY8ORTTt z+d5NHG~Q%VYpI&U@6e^s6`-w1*0LE)CZ>ENizfWg;V2NnIt!#!GRfD?@VTjib{kU5&*~xt zYIyK^D9(-&A>zyZF76YxsMpXJ>tvvIp);|NXGxtKZFk~jQixo}(B{ywT+94SA>kDg z>KCGJ!SeTPwk+3jwwC1&vlFS`n6jGn9hszg_U{LVnN}CpkK?S!OdMlV^*vC8dTc}) z%rQHphx8r@&St+41mI5lYbpLFa3HmZAT70zU}KQZbVFAR!~x+TE{F#*5bS49I9v7; zGyaCHhVPJ09O&dW2d5ny0w@tkB&rg+F>O9w8dK>9vl&(n?K{s>IqgfDrpwTa{2p`b zwlGG+tb)EGg)B$RtlQ#a-AhO!zS3ne4@VuHq&7O@6##5GhEn_Rj%WvQxMZk00E;?A zbr+O%D}_*TBY!kNnlaiqz^E-%Eh3$|jTdf$!s{Bp2;-E2^z#O5?)Hyq`}-f-^Uy_@ zu>Lr!kMl0voF5hwf?)Tn&wj}=-%t`KwUL(MG{ YtyjKY$<(x`*9Efv!!G~l^hz}L5Al6#UjP6A literal 0 HcmV?d00001 diff --git a/__pycache__/ungleich_ripe.cpython-37.pyc b/__pycache__/ungleich_ripe.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb7615c4ca3559d37a1b99756428e053e9d1aa5b GIT binary patch literal 2228 zcmZ`*&2Jk;6rY*>@cJW;o2I3$C@dThR%<&#s7k9)8rp&?p%9Xy7OQBr@l4`%*1Ox; zaZ9#q4y4xzaqq!Ca_6s^D;M|=5GUT-jZ0LOvF6R2H#2YF=TH7(X{knF{Ql?PPcGL9 z`2#nLVFGgpW_k|@C!B_)U#_%Ii#_YJVm10^v08nLv%bxZzWo*9CbwP^Zi&jV(RVoA zC2jjJ&_uSft3#!d^j5DYMXI`duPcK@bR(g9$YdX$J?^MC@1S6SiWY+ba|dSnE)YS` zI53QI_LB4sZg3M;Fa{0KjY)J6ieNC@d9ZzdV88<$xLPpp!b~$DIn9Yjaxwz9FOw1I z%Gm)$T_;8%WgF!wgHy&WZu80sqi1E#TVz#`)p-5HICB&AnY?jADFhd6T-wq`I@!yX zF%})4^Nx%sO5DiWcct)^aLcV5?~TMjxk2QrAqe5J%YEhV`Kf3#T}gZ?B9&@$D8eMG zb~+H==dnC|*rwW%;^`!if@e#e4j1VFUaKIEvRbE;_-P9Fc=qx3Dd+CT()9-ek)}a( zP<#!8=VJ2Q&Fu$mCT$3r!~lYFbAJ*I+LpG#f>cOd0~fqgzJa_i4<=)ob(nM?F_=;^~S@1 zbdw|PcwP_%%JUlVKD`2jP@B~#qb6;#26bpT8F1N!g)VfkyLdUk0>gnSuwRNYS*L^? zwG^4roQ~L>PT3<8-7twV4r}sDN~VzH?24)*>I~eXHzpE)AEJIjSc9d+~O9L8yz{o*&wOF>cCp%wU;EfX4N^lM~>;#hL@EC zl2>>g?gPC{W;Nd6OT3xe0S)K@%sJSg>a#{(nbX-4Uk1w^)tohP4<*=|R@L&TH9D7@ zxx-uh9Q;;ZF@FBUoYugbRq)0v{BhJuUOT396TQMWv-5dvPJg*Htt&IH&sOJTb^-O{ zIr{u9*&*O77Wsv(Y;8A|^60wzV(Ri(q;3=|H;m&$Hw+Gi>qqW`?PoXK)2h7%*RqQ* zroFOAdY>=K^s^V!zFi9Y&gSkXYd6<#u4_A%!9fsdt0?ZQF^*Jck=o40-QLjv@>h&S z^Y6m0C=iGs`C;V=n?gBO#pC4mb^HdFlTET~3yX?k`>*=D8(}=~!}K;Vi+BA>+3qR0R`flz zl~OX;17t{b^);Va6Sd!2*XH&&yAQLLpCn;0@Ugdhqco1%ENk42BL&^pd3clvZEr$f zC#r2~V?mW5HjFE* zNwatUr<}F`iva|&XgyEYJZ~KHNr-&I^PW!puso41_CDyRSnuR|IBt(sJZG@JZ&%sowzg#Cvv9LB)l!-kbO4-<$cp_wzUHc7s5Bar@WnAtU5Z zbT$oq@)AU%;)K(PxK&SGTKa}-KyO6ml(~!&ZgTdPxYl=sTfFv`@S3Pyo3732kECng z!YO3frMmfb8qV{xC={^@a1fgTVuGB3$Y-Dwc~3e0jV_5Y-kSxPFtBMsxzQn@%?=qE za4Z`xcE?JkU-o)o`rJ>$gCLpqCNhb8E(=0+kS7VVKq*vO8KwgvtHomO}iqHma8CeUgdjN14L3jxwKL#ZTq6`SblL1w8 zjV|LBJiDg1Hep{?fdWJi8}=4RiR3951uck206|D$hfLr&ZWhKR_L?{WZ84YT{w@nv&58yf2EDtCyg@%d1GfSNQ07H>$^4eI^rJZ5**UP@K?wh=|V(;v0zzd+rvDZ*>UY?vQix z^Y=?jnT5q4!$^4!*gIf<08*Z}_CI{!KLP(Ekoy?3$*U?)yF>SB5DW%>Ukr{0C;sup z$>$e?{>gFw@VNiQ;nCrXJNoG@Rv@H{&akSlq|45IB^Kr{{i8ctESw+0c>gCcO>yK9 zTz_7=x_*|#JXB#4 Date: Thu, 6 Jun 2019 15:37:39 +0500 Subject: [PATCH 10/19] README.md updated --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index d05ee4c..9a1594d 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,22 @@ It is intended to be used by ungleich engineers and skilled customers. * ensure you have python3 * git clone this repo +* cd into this repo +* run the following command +``` +sudo pip3 install -r requirements.txt +``` ## Usage general ``` ungleich --help ``` +## Usage: Weather + +``` +ungleich weather +``` ## Usage: DNS From b8794b900bdc76f9c801b8b471a1ccfcf3d890bd Mon Sep 17 00:00:00 2001 From: meow Date: Thu, 6 Jun 2019 19:01:24 +0500 Subject: [PATCH 11/19] .gitignore updated not to track __pycache__ directory and __pycache__ removed --- .gitignore | 1 + __pycache__/ungleich_account.cpython-37.pyc | Bin 1270 -> 0 bytes __pycache__/ungleich_dns.cpython-37.pyc | Bin 1406 -> 0 bytes __pycache__/ungleich_ripe.cpython-37.pyc | Bin 2228 -> 0 bytes __pycache__/ungleich_weather.cpython-37.pyc | Bin 1554 -> 0 bytes 5 files changed, 1 insertion(+) create mode 100644 .gitignore delete mode 100644 __pycache__/ungleich_account.cpython-37.pyc delete mode 100644 __pycache__/ungleich_dns.cpython-37.pyc delete mode 100644 __pycache__/ungleich_ripe.cpython-37.pyc delete mode 100644 __pycache__/ungleich_weather.cpython-37.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c18dd8d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/__pycache__/ungleich_account.cpython-37.pyc b/__pycache__/ungleich_account.cpython-37.pyc deleted file mode 100644 index 90c587c8fa4ec4826331cb322ad8f8ae13491024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmZuvOK;RL5Vjp>H(lCoK|Cb{D}jV^$nJp~LWoy|xKyIRB|@@7>~^zcv#IUyh?Wa* z-8%>V0C#?kuUz0CAWqCAP1ORnX2zcJjA!PX`x_er0_)q4UoSpzLcZgrTW}|Lfy{Ma zl1Q49xRo@fkBDT_`$VLt*heq+Bz;Ok{u5r3ofLVu7#!{bnajWwiK!$plT@-#1iU=S zL2~JXch3#)rRkz7tazYRVpZya3oevBpa($aGq5FH5qc22 z)m~EN*0@bEO$wPS(Ut2tZdAUf*B}$^1N%z!7Kq25bxm zi$g`1bjE-@AP(e9_JvDt#oja9Te4aIBf`!BcE7%~t6nSUPlxMB6|!7pg&o(|rq-6` z)?{+ngK<~ZIGs*fs3#$J0m6-t#cN0Cxu65a`3)?HhfHj;69z5%%0QQSxiB_9)y5JS z$8n6Lu_O8%Fz1&Vl5yOsw-#n%6LlPrGmh#8fR>#`haoWZG=h)vk2D(WAVZqrjIOPEih8i^?*B3yz d0Mc&e&-E5BXDYRg^?!j}aJ&8g4m}pl`vY*pO3(lR diff --git a/__pycache__/ungleich_dns.cpython-37.pyc b/__pycache__/ungleich_dns.cpython-37.pyc deleted file mode 100644 index f388d02873f46dfb61b4b1612cd2afce3d3b1276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZux!H(ND5G5%}mc6@)lk9F%phZ<67aeTh_7DWcHrb%fAx^qU3sfi|C?eOEBTEWN zZM%YdO0NEc{y^{jf_?_Cy|jN&^wb$?)o#!wF+*xNoEgr0_M^SM5rOgRAAfzHx`h0W zAN}C4IR?@9K?x#gPNHt55&e<~CY<*~IFh|{B1h1dB;;KpunW-#~5XhQwq;R#4JMWCfvw zvtbJ=_||Ey>|uAx;FJkhcw!*@twXO`hhlV%bw}(P2kd)W{(<)maq}AQvAA`O^|rY4 zKP!j2T(Q5U6dDLmJ(ycZ*RQQ33f+A2EGd$O4B*j$ER4#e4vvGq6(O^HDf7w>szkxD zZuTY8ORTTt z+d5NHG~Q%VYpI&U@6e^s6`-w1*0LE)CZ>ENizfWg;V2NnIt!#!GRfD?@VTjib{kU5&*~xt zYIyK^D9(-&A>zyZF76YxsMpXJ>tvvIp);|NXGxtKZFk~jQixo}(B{ywT+94SA>kDg z>KCGJ!SeTPwk+3jwwC1&vlFS`n6jGn9hszg_U{LVnN}CpkK?S!OdMlV^*vC8dTc}) z%rQHphx8r@&St+41mI5lYbpLFa3HmZAT70zU}KQZbVFAR!~x+TE{F#*5bS49I9v7; zGyaCHhVPJ09O&dW2d5ny0w@tkB&rg+F>O9w8dK>9vl&(n?K{s>IqgfDrpwTa{2p`b zwlGG+tb)EGg)B$RtlQ#a-AhO!zS3ne4@VuHq&7O@6##5GhEn_Rj%WvQxMZk00E;?A zbr+O%D}_*TBY!kNnlaiqz^E-%Eh3$|jTdf$!s{Bp2;-E2^z#O5?)Hyq`}-f-^Uy_@ zu>Lr!kMl0voF5hwf?)Tn&wj}=-%t`KwUL(MG{ YtyjKY$<(x`*9Efv!!G~l^hz}L5Al6#UjP6A diff --git a/__pycache__/ungleich_ripe.cpython-37.pyc b/__pycache__/ungleich_ripe.cpython-37.pyc deleted file mode 100644 index fb7615c4ca3559d37a1b99756428e053e9d1aa5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2228 zcmZ`*&2Jk;6rY*>@cJW;o2I3$C@dThR%<&#s7k9)8rp&?p%9Xy7OQBr@l4`%*1Ox; zaZ9#q4y4xzaqq!Ca_6s^D;M|=5GUT-jZ0LOvF6R2H#2YF=TH7(X{knF{Ql?PPcGL9 z`2#nLVFGgpW_k|@C!B_)U#_%Ii#_YJVm10^v08nLv%bxZzWo*9CbwP^Zi&jV(RVoA zC2jjJ&_uSft3#!d^j5DYMXI`duPcK@bR(g9$YdX$J?^MC@1S6SiWY+ba|dSnE)YS` zI53QI_LB4sZg3M;Fa{0KjY)J6ieNC@d9ZzdV88<$xLPpp!b~$DIn9Yjaxwz9FOw1I z%Gm)$T_;8%WgF!wgHy&WZu80sqi1E#TVz#`)p-5HICB&AnY?jADFhd6T-wq`I@!yX zF%})4^Nx%sO5DiWcct)^aLcV5?~TMjxk2QrAqe5J%YEhV`Kf3#T}gZ?B9&@$D8eMG zb~+H==dnC|*rwW%;^`!if@e#e4j1VFUaKIEvRbE;_-P9Fc=qx3Dd+CT()9-ek)}a( zP<#!8=VJ2Q&Fu$mCT$3r!~lYFbAJ*I+LpG#f>cOd0~fqgzJa_i4<=)ob(nM?F_=;^~S@1 zbdw|PcwP_%%JUlVKD`2jP@B~#qb6;#26bpT8F1N!g)VfkyLdUk0>gnSuwRNYS*L^? zwG^4roQ~L>PT3<8-7twV4r}sDN~VzH?24)*>I~eXHzpE)AEJIjSc9d+~O9L8yz{o*&wOF>cCp%wU;EfX4N^lM~>;#hL@EC zl2>>g?gPC{W;Nd6OT3xe0S)K@%sJSg>a#{(nbX-4Uk1w^)tohP4<*=|R@L&TH9D7@ zxx-uh9Q;;ZF@FBUoYugbRq)0v{BhJuUOT396TQMWv-5dvPJg*Htt&IH&sOJTb^-O{ zIr{u9*&*O77Wsv(Y;8A|^60wzV(Ri(q;3=|H;m&$Hw+Gi>qqW`?PoXK)2h7%*RqQ* zroFOAdY>=K^s^V!zFi9Y&gSkXYd6<#u4_A%!9fsdt0?ZQF^*Jck=o40-QLjv@>h&S z^Y6m0C=iGs`C;V=n?gBO#pC4mb^HdFlTET~3yX?k`>*=D8(}=~!}K;Vi+BA>+3qR0R`flz zl~OX;17t{b^);Va6Sd!2*XH&&yAQLLpCn;0@Ugdhqco1%ENk42BL&^pd3clvZEr$f zC#r2~V?mW5HjFE* zNwatUr<}F`iva|&XgyEYJZ~KHNr-&I^PW!puso41_CDyRSnuR|IBt(sJZG@JZ&%sowzg#Cvv9LB)l!-kbO4-<$cp_wzUHc7s5Bar@WnAtU5Z zbT$oq@)AU%;)K(PxK&SGTKa}-KyO6ml(~!&ZgTdPxYl=sTfFv`@S3Pyo3732kECng z!YO3frMmfb8qV{xC={^@a1fgTVuGB3$Y-Dwc~3e0jV_5Y-kSxPFtBMsxzQn@%?=qE za4Z`xcE?JkU-o)o`rJ>$gCLpqCNhb8E(=0+kS7VVKq*vO8KwgvtHomO}iqHma8CeUgdjN14L3jxwKL#ZTq6`SblL1w8 zjV|LBJiDg1Hep{?fdWJi8}=4RiR3951uck206|D$hfLr&ZWhKR_L?{WZ84YT{w@nv&58yf2EDtCyg@%d1GfSNQ07H>$^4eI^rJZ5**UP@K?wh=|V(;v0zzd+rvDZ*>UY?vQix z^Y=?jnT5q4!$^4!*gIf<08*Z}_CI{!KLP(Ekoy?3$*U?)yF>SB5DW%>Ukr{0C;sup z$>$e?{>gFw@VNiQ;nCrXJNoG@Rv@H{&akSlq|45IB^Kr{{i8ctESw+0c>gCcO>yK9 zTz_7=x_*|#JXB#4 Date: Thu, 6 Jun 2019 16:15:04 +0200 Subject: [PATCH 12/19] + weather header --- ungleich_weather.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ungleich_weather.py b/ungleich_weather.py index 5333f2c..0cb073e 100644 --- a/ungleich_weather.py +++ b/ungleich_weather.py @@ -23,6 +23,7 @@ class ungleichWeather(object): def forecast_weather(args): _city, _country_code = get_loc() + print("Weather for {}\n".format(_city)) client = ApixuClient("cc33a1e3237a4b78b3174104190206") @@ -30,4 +31,4 @@ class ungleichWeather(object): print(f"{'Date':^12}|{'Min Temp':^10}|{'Max Temp':^10}|{'Condition':^15}") print(f"{'*'*47:^47}") for day in forecast['forecast']['forecastday']: - print(f"{day['date']:^12}|{day['day']['mintemp_c']:^10}|{day['day']['maxtemp_c']:^10}|{day['day']['condition']['text']:^15}") \ No newline at end of file + print(f"{day['date']:^12}|{day['day']['mintemp_c']:^10}|{day['day']['maxtemp_c']:^10}|{day['day']['condition']['text']:^15}") From 9772a479b6df712a30c0ac1e9104293fb407a7a6 Mon Sep 17 00:00:00 2001 From: William Colmenares Date: Thu, 6 Jun 2019 10:19:43 -0400 Subject: [PATCH 13/19] use urllib instead of requests --- ungleich_dns.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/ungleich_dns.py b/ungleich_dns.py index 86b9dbe..85eb6bd 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -1,5 +1,7 @@ -import requests + +import urllib.request import argparse +import json class ungleichDNS(object): def __init__(self, parser, parents): @@ -20,14 +22,21 @@ class ungleichDNS(object): def _handle_dns(self, args): """Reverse dns endpoint.""" - r = requests.post( - 'https://dns.service.ungleich.ch', - json={ + url = 'https://dns.service.ungleich.ch' + req = urllib.request.Request( + url=url, + method='POST', + headers={ + "Content-Type": "application/json" + }, + data=json.dumps({ 'username': args.user, 'token': args.token, 'ipaddress': args.set_reverse, 'name': args.name, 'email': args.email, 'realm': args.realm - }) - print(r.text) + }).encode('utf-8') + ) + response = urllib.request.urlopen(req).read() + print(json.loads(response)) From bdb21e285a122d83c008e887c5817e281da197bb Mon Sep 17 00:00:00 2001 From: ahmedbilal Date: Fri, 7 Jun 2019 15:48:48 +0500 Subject: [PATCH 14/19] Now using Pipenv, requirements.txt removed --- Pipfile | 12 ++++++++++++ Pipfile.lock | 25 +++++++++++++++++++++++++ README.md | 2 +- requirements.txt | 1 - ungleich_dns.py | 21 +++++++++++++++------ 5 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock delete mode 100644 requirements.txt diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..2339605 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +apixu-python = {git = "https://github.com/apixu/apixu-python.git"} + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..d099c51 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,25 @@ +{ + "_meta": { + "hash": { + "sha256": "e84e3c15d8fea5745b66f0970337d98fef35d6898635ea849162932e1dabd55a" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "apixu-python": { + "git": "https://github.com/apixu/apixu-python.git", + "ref": "4beb003c71c0213720e930350f46e5fa6af9ef12" + } + }, + "develop": {} +} diff --git a/README.md b/README.md index 9a1594d..e16d057 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ It is intended to be used by ungleich engineers and skilled customers. * cd into this repo * run the following command ``` -sudo pip3 install -r requirements.txt +sudo pip3 install pipenv ``` ## Usage general diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 6404404..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -git+https://github.com/apixu/apixu-python.git@master diff --git a/ungleich_dns.py b/ungleich_dns.py index 86b9dbe..85eb6bd 100644 --- a/ungleich_dns.py +++ b/ungleich_dns.py @@ -1,5 +1,7 @@ -import requests + +import urllib.request import argparse +import json class ungleichDNS(object): def __init__(self, parser, parents): @@ -20,14 +22,21 @@ class ungleichDNS(object): def _handle_dns(self, args): """Reverse dns endpoint.""" - r = requests.post( - 'https://dns.service.ungleich.ch', - json={ + url = 'https://dns.service.ungleich.ch' + req = urllib.request.Request( + url=url, + method='POST', + headers={ + "Content-Type": "application/json" + }, + data=json.dumps({ 'username': args.user, 'token': args.token, 'ipaddress': args.set_reverse, 'name': args.name, 'email': args.email, 'realm': args.realm - }) - print(r.text) + }).encode('utf-8') + ) + response = urllib.request.urlopen(req).read() + print(json.loads(response)) From 56c341805be397e5f3be3b56fbdaad3d082f944b Mon Sep 17 00:00:00 2001 From: ahmedbilal Date: Fri, 7 Jun 2019 16:37:42 +0500 Subject: [PATCH 15/19] README.md updated --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e16d057..c945b68 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ It is intended to be used by ungleich engineers and skilled customers. ## Requirements / Installation -* ensure you have python3 +* ensure you have **python3** and **pipenv** * git clone this repo * cd into this repo * run the following command ``` -sudo pip3 install pipenv +pipenv install +pipenv shell ``` ## Usage general From 29d1247f42861423eaa171b42d359dd5cf5cee58 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 8 Jun 2019 19:10:08 +0200 Subject: [PATCH 16/19] Add pipfile, add ssh key handling --- Pipfile | 12 ++++++++++ Pipfile.lock | 57 +++++++++++++++++++++++++++++++++++++++++++++ ungleich | 4 +++- ungleich_ssh_key.py | 49 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 ungleich_ssh_key.py diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..c6a4088 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.python.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +requests = "*" + +[dev-packages] + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..6c82f11 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,57 @@ +{ + "_meta": { + "hash": { + "sha256": "0fd749b30be70c938b01b5bf9e870b04e9c3648dea04f51a2feb9da5ac5a8f8c" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" + ], + "version": "==2019.3.9" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "requests": { + "hashes": [ + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + ], + "index": "pypi", + "version": "==2.22.0" + }, + "urllib3": { + "hashes": [ + "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", + "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" + ], + "version": "==1.25.3" + } + }, + "develop": {} +} diff --git a/ungleich b/ungleich index edc559a..34d86cf 100755 --- a/ungleich +++ b/ungleich @@ -6,8 +6,9 @@ from ungleich_dns import ungleichDNS from ungleich_ripe import ungleichRIPE from ungleich_account import Account_Create from ungleich_weather import ungleichWeather +from ungleich_ssh_key import SSHKey -VERSION = "0.0.3" +VERSION = "0.0.4" class ungleichCLI(object): def __init__(self): @@ -17,6 +18,7 @@ class ungleichCLI(object): dns = ungleichDNS(self.parser, self.parser_parents) ripe = ungleichRIPE(self.parser, self.parser_parents) ripe = Account_Create(self.parser, self.parser_parents) + SSHKey(self.parser, self.parser_parents) ungleichWeather(self.parser, self.parser_parents) def _init_parser(self): diff --git a/ungleich_ssh_key.py b/ungleich_ssh_key.py new file mode 100644 index 0000000..5f54c95 --- /dev/null +++ b/ungleich_ssh_key.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +import os +import sys +import subprocess + +class SSHKey(object): + def __init__(self, parser, parents): + self.parser = parser + + self.parser['sshkey'] = self.parser['sub'].add_parser( + 'sshkey', + help="Manage SSH keys", + parents=[parents]) + + self.parser['sshkey'].add_argument('--user', + help='Username on the host', + required=False, + default="root") + self.parser['sshkey'].add_argument('--key', + help='Name of the key', + required=True) + self.parser['sshkey'].add_argument('--key-dir', + help='Directory holding keys', + default=os.path.join(os.environ['HOME'], "vcs/ungleich-ssh-keys/"), + required=false) + self.parser['sshkey'].add_argument('--host', + help='Host to use', + required=True) + self.parser['sshkey'].add_argument('--delete', + help='Delete key instead of adding', + action="store_true") + self.parser['sshkey'].set_defaults(func=self._manage_key) + + + def _manage_key(self, args): + if args.delete: + print("Not yet supported to delete, sorry :-)") + sys.exit(1) + + keyfile = os.path.join(args.keydir, "{}.pub".format(args.key)) + + if not os.path.exists(keyfile): + print("Key for {} does not exist in {}. Aborting".format(args.key, args.keydir)) + sys.exit(1) + + cmd = 'cat {} | ssh {} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"'.format(keyfile, args.host) + + subprocess.run(cmd, shell=True) From 5766e65b204ac2afac904a9c97b62884ecac25b5 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 8 Jun 2019 19:14:21 +0200 Subject: [PATCH 17/19] add apixu Signed-off-by: Nico Schottelius --- Pipfile | 4 ++++ Pipfile.lock | 6 +++++- requirements.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Pipfile b/Pipfile index c6a4088..524fb1c 100644 --- a/Pipfile +++ b/Pipfile @@ -10,3 +10,7 @@ requests = "*" [requires] python_version = "3.7" + +[packages.apixu] +git = "https://github.com/apixu/apixu-python.git" +ref = "master" diff --git a/Pipfile.lock b/Pipfile.lock index 6c82f11..2ffc179 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0fd749b30be70c938b01b5bf9e870b04e9c3648dea04f51a2feb9da5ac5a8f8c" + "sha256": "ca9c2522bf07f03d1588afe76e9f6fc73bc1efec20d4f155d82b709efaf14a56" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,10 @@ ] }, "default": { + "apixu": { + "git": "https://github.com/apixu/apixu-python.git", + "ref": "master" + }, "certifi": { "hashes": [ "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", diff --git a/requirements.txt b/requirements.txt index 6404404..9d1c8a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -git+https://github.com/apixu/apixu-python.git@master +git+https://github.com/apixu/apixu-python.git@master#egg=apixu From d28748618d642d841a8e6e5e3df39b77de5d436a Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 8 Jun 2019 19:18:37 +0200 Subject: [PATCH 18/19] Add usage description, --bugs --- README.md | 6 ++++++ ungleich_ssh_key.py | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9a1594d..b93058d 100644 --- a/README.md +++ b/README.md @@ -49,3 +49,9 @@ Creating a new account object: ungleich account --create-user --name --lastname --email ``` + +### Usage: SSH Key + +``` +ungleich sshkey --key raul.ascencio --host dev.raul.ungleich.cloud +``` diff --git a/ungleich_ssh_key.py b/ungleich_ssh_key.py index 5f54c95..9a29c04 100644 --- a/ungleich_ssh_key.py +++ b/ungleich_ssh_key.py @@ -22,8 +22,8 @@ class SSHKey(object): required=True) self.parser['sshkey'].add_argument('--key-dir', help='Directory holding keys', - default=os.path.join(os.environ['HOME'], "vcs/ungleich-ssh-keys/"), - required=false) + default=os.path.join(os.environ['HOME'], "vcs/ungleich-ssh-keys/current"), + required=False) self.parser['sshkey'].add_argument('--host', help='Host to use', required=True) @@ -38,12 +38,14 @@ class SSHKey(object): print("Not yet supported to delete, sorry :-)") sys.exit(1) - keyfile = os.path.join(args.keydir, "{}.pub".format(args.key)) + keyfile = os.path.join(args.key_dir, "{}.pub".format(args.key)) if not os.path.exists(keyfile): - print("Key for {} does not exist in {}. Aborting".format(args.key, args.keydir)) + print("Key for {} does not exist in {}. Aborting".format(args.key, args.key_dir)) sys.exit(1) - cmd = 'cat {} | ssh {} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"'.format(keyfile, args.host) + cmd = 'cat {} | ssh {}@{} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"'.format(keyfile, + args.user, + args.host) subprocess.run(cmd, shell=True) From 49f1229aca055e95fb4e58c2c0265e99cea71624 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Sat, 8 Jun 2019 19:29:03 +0200 Subject: [PATCH 19/19] ++ changes --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index b93058d..e7f97e4 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,11 @@ ungleich account --create-user --name --lastname