# Isard-Repository Updates
hay un servidor de updates: ssh root@isardvdi.com -p 9022 . Hay un repositorio para toda esta parte que está en https://gitlab.com/isard/www-repository-server
Hay una base de datos rethink, un isard-repository (python flask) y un nginx delante y otro haproxy delante del nginx?
```
4ab3083ebfe5 rethinkdb "rethinkdb --bind all" 2 weeks ago Up 2 weeks 0.0.0.0:8080->8080/tcp, 0.0.0.0:28015->28015/tcp, 29015/tcp db
428dc45b45d7 www-repository-server_haproxy "docker-entrypoint.s…" 4 weeks ago Up 4 weeks 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:5050->5050/tcp haproxy
a81bf240013e www-repository-server_isard-repository "python3 start.py" 4 weeks ago Up 2 weeks
isard-repository
ec0c0f0b5b6e www-repository-server_nginx "/docker-entrypoint.…" 4 weeks ago Up 4 weeks 80/tcp
nginx
a9720af1c834 hashicorp/boundary:0.7.1 "docker-entrypoint.s…" 9 months ago Up 9 months 9200/tcp, 9202/tcp, 0.0.0.0:9201->9201/tcp boundary-controller
0398ce1ed06b storage-tests_nginx "/docker-entrypoint.…" 13 months ago Up 9 months 0.0.0.0:1314->80/tcp
storage-tests-nginx
```
Ojo que nos quedemos sin espacio. Ahora quedan 272GB
cuando arranca el contenedor isard-repository ves lo que ha detectado en las tablas
# Estructura
En **/opt/isardvdi-data/isard-repository/storage**
hay un directorio por cada tipo de media
Para los dominios se ha de descargar el diccionario y el nuevo dominio
En interface, graphics no hay nada, pero en vídeo tenemos los diccionario de vídeo pero como yaml.
# Ejemplo de nuevo vídeo:
En el directorio de videos /opt/isardvdi-data/isard-repository/storage/videos:
cp qxl32.yaml qxl64.yaml
#modificamos lo que queramos
### Medias para descargar
Pueden ser de dos tipos, simplemente yamls con url web desde donde descargar, o pueden ser
Ejemplo de url para descargar: Fedora-Workstation-Live.yaml
```
kind : iso
id : Fedora-Workstation-Live-x86_64-29-1.2
name : Fedora Workstation Live x86_64 29 1.2
description : Download from website
icon : fa-circle-o
url-isard : false
url-web: https://download.fedoraproject.org/pub/fedora/linux/releases/29/Workstation/x86_64/iso/Fedora-Workstation-Live-x86_64-29-1.2.iso
hypervisors_pools:
- default
allowed:
roles: false
categories: false
groups: false
users: false
```
Aquí se busca la iso dentro isard por el url_isard y allí es donde se descarga
```
root@web /opt/isardvdi-data/isard-repository/storage/media # cat virtio_win10_x64_20190313.yaml
kind : iso
id : virtio_win10_x64_20190313
name : Virtio ISO drivers only Windows 10 x64 0.1.164
default-virtio-iso: true
description : windows virtio drivers as ISO image to use in windows 10 x64 install
icon : fa-circle-o
url-isard : virtio_win10_x64_20190313.iso
url-web : false
hypervisors_pools:
- default
allowed:
roles: false
categories: false
groups: false
users: false
```
Si queremos que vaya en private se ha de poner en private_media
Hay que actualizar cada media de tipo url externa por cosas que vayan y revisar que van
### Virt-install
Actualizar los xmls que ofrece el paquete virt-install. Recomendamos hacerlo desde el último fedora:
https://gitlab.com/isard/www-repository-server/-/blob/master/UPGRADE_VIRT_INSTALLS.md
Copiamos desde ese fedora a /tmp/xmls los ficheros que genera.
Una vez en el servidor de updates nos llevamos esos xmls a la carpeta que toca
```
mv /opt/isardvdi-data/isard-repository/storage/virt_install/xmls /opt/isardvdi-data/isard-repository/storage/virt_install/xmls_old
mkdir /opt/isardvdi-data/isard-repository/storage/virt_install/xmls
mv /tmp/xmls/*.xml /opt/isardvdi-data/isard-repository/storage/virt_install/xmls/
mv /tmp/osinfo.txt /opt/isardvdi-data/isard-repository/storage/virt_install/
```
#### Custom virt-intall
Para los xmls que nosotros hemos preparado, sobre todo para los windows con virtio...
El script pilla lo que hay de custom_osinfo.txt, busca el shortID dentro de la carpeta y ha de coincidir que exita.
Por ejemplo si queremos añadir el windws11 hay que editar una nueva lína la línea
```
root@web /opt/isardvdi-data/isard-repository/storage/virt_install # cat custom_osinfo.txt │···
Short ID | Name | Version | ID │···
----------------------+----------------------------------------------------+----------+----------------------------------------- │···
win7Virtio | Microsoft windows 7 with Virtio devices | 6.1 | http://microsoft.com/win/7 │···
win10VirtioUEFI | Microsoft windows 10 with Virtio devices UEFI | 10.0 | http://microsoft.com/win/10 │···
pepitogrillo | Do not download this one | 1.1 | https://isardvdi.com
```
Hemos insertado una línea pepitogrillo y debe existir el pepitogrillo.xml en el directorio custom_xmls
Después de cambiar la línea y tener el xml hacemos un restart de docker
```
docker restart isard-repository
```
Y al arrancar podemos ver si los ha ledio con un log del docker (docker logs isard-repository):
```
2022/09/06 10:54:33 91 - INFO - MainThread: Checking table registrations │···
2022/09/06 10:54:33 105 - INFO - MainThread: Database up and populated. Resources webapp running on port 5050. │···
2022/09/06 10:54:33 717 - INFO - MainThread: ---> LOADED: 12 resources from table media │···
2022/09/06 10:54:33 717 - INFO - MainThread: ---> LOADED: 8 resources from table domains │···
2022/09/06 10:54:33 717 - INFO - MainThread: ---> LOADED: 2 resources from table builders │···
2022/09/06 10:54:33 717 - INFO - MainThread: ---> LOADED: 35 resources from table virt_builder │···
2022/09/06 10:54:33 717 - INFO - MainThread: ---> LOADED: 765 resources from table virt_install │···
2022/09/06 10:54:33 718 - INFO - MainThread: ---> LOADED: 3 resources from table videos │···
2022/09/06 10:54:33 718 - INFO - MainThread: ---> LOADED: 3 resources from table viewers │···
2022/09/06 10:54:33 771 - INFO - MainThread: ---> LOADED private_domains: 3 resources from table private_domains
```
## Qcows
Todos los ficheros qcow2 tienen que tener su yaml asociado, sino no se visualizan y ocupan espacio sin necesidad
Un yaml que se corresponde con una entrada en el diccionario domain. Para hacer una entrada nueva lo recomendable es coger uno que ya exista, por ejemplo debian9.yml y se copuia a win11.yml
```
cp debian9.yaml win11.yaml
```
Importante hay que pegar el contenido del xml que quieras en el campo xml y modificar name, id y que haya coherencia
Para descargarlo, el nombre del fichero ha de ser el que dice esta entrada del yaml, que para que tenga coherencia :
```
url-isard : debian_9_5_0.qcow2
```
Los yamls que hay en
En private_domains sólo hay yamls y estos sólo se cargan cuando añadimos en el isard-cliente en config...
Los qcows privates y públicos comparten el directorio /opt/isardvdi-data/isard-repository/storage/domains
Y los yamls están en un directorio según sean públicos y privado
Y para los media debería ir igual (pero no va)
### En
python3 activate_private_docnloads
## Cómo convertir un json a yaml
```
In [1]: import json,yaml
In [2]: s_json = """{
...:
...: "allowed": {
...: "categories": false ,
...: "groups": false ,
...: "roles": [
...: "admin"
...: ] ,
...: "users": false
...: } ,
...: "description": "QXL 32MB" ,
...: "heads": 1 ,
...: "id": "qxl32" ,
...: "model": "qxl" ,
...: "name": "QXL 32MB" ,
...: "ram": 32768 ,
...: "vram": 32768
...:
...: }"""
In [3]: d = json.loads(s_json)
In [4]: print(yaml.dump(d))
allowed:
categories: false
groups: false
roles:
- admin
users: false
description: QXL 32MB
heads: 1
id: qxl32
model: qxl
name: QXL 32MB
ram: 32768
vram: 32768
```
# Conocer las ips y los registros
Para mapear el rethink sin tener el puerto abierto en el server:
```
ssh`tusuario@isardvdi.com -p 9022 -L 8080:localhost:8080
`` `
Entonces te vas a http://localhost:8080 y accedes al db
Tenemos una tabla de registration, se autoregistra y cogemos su ip (para luego poderla geolocalizar), el último acceso que hizo y el identificador que se queda en la tabla de config de israd en cada instalación
```
r.db("resources").table("registrations")
```
Con esta consulta puedes sacar las ips desde donde se conectan las instalaciones
```
r.db("resources").table("registrations").pluck("ip")("ip").distinct()
```
script para sacar la info geolocalizada:
```
```
l = ['2.35.111.234', '90.175.240.92', '90.175.255.162', '80.37.32.103', '90.175.242.223', '90.175.240.92', '90.175.255.162', '90.175.240.92', '90.175.255.162', '80.37.32.103', '89.118.117.175', '64.103.40.26', '90.175.255.162', '178.139.73.230', '184.105.178.72', '37.223.124.39', '90.71.181.100', '90.175.255.162', '80.37.32.103', '64.103.40.17', '90.175.255.162', '77.209.171.232', '80.37.32.103', '80.37.32.103', '90.175.240.92', '106.14.201.114', '79.62.35.162', '90.71.181.100', '90.175.255.162', '88.23.251.99', '90.175.255.162', '2.35.111.234', '37.223.124.39', '77.210.246.129', '2.35.111.234', '80.37.32.103', '178.139.73.230', '62.83.148.228', '203.154.47.81', '90.71.181.100', '90.175.255.162', '62.83.148.228', '62.83.148.228', '90.175.242.223', '91.144.172.117', '88.23.248.102', '80.37.32.103', '90.175.255.162', '64.103.40.18', '2.35.111.234', '90.175.240.92', '90.175.255.162', '203.154.59.27', '24.154.117.149', '136.243.197.10', '64.103.40.22', '88.23.251.99', '90.175.255.162', '88.23.251.99', '80.37.32.103', '85.53.56.68', '79.62.35.162', '62.83.148.228', '90.175.242.223', '79.150.40.192', '37.223.124.39', '177.72.120.10', '90.175.255.162', '90.175.240.92', '62.83.148.228', '151.216.139.14', '80.37.32.103', '80.37.32.103', '2.35.111.234', '62.83.148.228', '2.35.111.234', '90.175.255.162', '90.175.255.162', '80.37.32.103', '159.89.206.157', '203.154.89.108', '80.37.32.103', '110.87.123.118', '62.83.148.228', '37.223.124.39', '85.53.56.68', '88.23.250.196', '37.223.124.39', '62.83.148.228', '90.175.240.92', '90.175.255.162', '87.164.31.82', '80.37.32.103', '81.37.77.156', '62.83.148.228', '90.175.255.162', '90.175.255.162', '90.175.255.162', '62.83.148.228', '24.154.117.149', '90.175.240.92', '90.175.255.162', '88.23.248.102', '90.175.242.223', '90.175.240.92', '80.37.32.103', '90.175.242.223', '37.223.124.39', '37.223.124.39', '90.175.240.92', '37.223.124.39', '2.35.111.234', '112.91.128.50', '73.252.198.196', '90.175.240.92', '185.157.12.66', '109.254.86.82', '80.37.32.103', '2.35.111.234', '90.175.242.223', '80.37.32.103', '62.83.148.228', '80.37.32.103', '37.223.118.191', '80.37.32.103', '90.175.240.92', '90.175.255.162', '141.135.49.31', '80.37.32.103', '90.175.255.162', '88.23.250.196', '37.223.124.39', '80.37.32.103', '90.175.255.162', '157.88.125.179', '62.83.148.228', '90.175.255.162', '203.154.158.158', '90.175.255.162', '90.175.240.92', '90.175.255.162', '37.223.124.39', '37.223.124.39', '77.210.246.129', '93.176.167.27', '37.223.124.39', '90.175.255.162', '24.154.3.82', '80.37.32.103', '2.35.111.234', '203.154.59.27', '90.175.255.162', '90.175.240.92', '58.246.194.226', '37.223.124.39', '81.242.129.106', '80.37.32.103', '64.103.40.26', '90.175.242.223', '80.37.32.103', '2.35.111.234', '64.103.40.17', '88.23.250.196', '88.23.251.99', '80.37.32.103', '80.37.32.103', '90.175.255.162', '62.83.148.228', '77.210.246.129', '62.83.148.228', '90.175.255.162', '138.38.56.167', '85.53.56.68', '62.83.148.228', '90.175.255.162', '90.175.255.162', '88.23.251.99', '90.175.240.92', '37.223.124.39', '24.154.3.82', '203.154.59.26', '88.23.251.99', '88.23.248.102', '90.175.255.162', '80.37.32.103', '90.175.255.162', '88.23.251.99', '90.175.242.223', '24.154.117.149', '37.223.124.39', '62.83.148.228', '88.23.251.99', '90.175.255.162', '178.128.185.77', '203.150.51.45', '62.83.148.228', '90.175.242.223', '90.175.255.162', '62.83.148.228', '62.83.148.228', '203.154.89.108', '77.210.246.129', '90.175.255.162', '62.83.148.228', '80.37.32.103', '203.154.59.14', '88.23.251.99', '59.38.63.0', '64.103.40.29', '90.175.255.162', '80.37.32.103', '90.175.242.223', '91.144.172.117', '80.37.32.103', '90.175.240.92', '80.37.32.103', '136.243.197.10', '2.35.111.234', '90.175.255.162', '24.154.117.149', '37.223.124.39', '90.175.240.92', '62.83.148.228', '77.210.246.129', '90.175.240.92', '37.223.124.39', '64.103.40.28', '2.35.111.234', '80.37.32.103', '88.23.251.99', '90.175.240.92', '37.223.124.39', '62.83.148.228', '157.88.125.176', '77.209.171.232', '90.175.242.223', '90.175.255.162', '157.88.125.179', '90.175.240.92', '80.37.32.103', '109.128.83.196', '90.175.255.162', '37.223.124.39', '62.83.148.228', '90.71.181.100', '80.37.32.103', '62.83.148.228', '88.23.250.196', '37.223.124.39', '84.73.125.174', '88.23.251.99', '109.128.83.196', '90.175.240.92', '90.175.242.223', '113.140.248.64', '62.83.148.228', '80.37.32.103', '71.219.77.92', '81.37.77.156', '80.37.32.103', '88.23.251.99', '90.175.255.162', '64.103.40.27', '62.83.148.228', '37.223.124.39', '62.83.148.228', '24.154.117.149', '90.175.255.162', '80.37.32.103', '90.175.240.92', '90.175.242.223', '64.103.40.25', '88.23.251.99', '90.175.242.223', '62.83.148.228', '64.103.40.18', '85.53.56.68', '64.103.40.25', '90.175.255.162', '64.103.40.21', '80.37.32.103', '90.175.240.92', '90.175.255.162', '80.37.32.103', '90.175.240.92', '62.83.148.228', '90.175.242.223', '62.83.148.228', '80.37.32.103', '62.83.148.228', '93.156.61.207', '90.175.240.92', '62.83.148.228', '64.103.40.21', '80.37.32.103', '90.175.240.92', '13.231.230.58', '90.175.255.162', '80.37.32.103', '77.210.246.129', '88.23.251.51', '62.83.148.228', '80.37.32.103', '80.37.32.103', '85.53.56.68', '88.23.250.196', '80.37.32.103', '90.175.255.162', '106.14.201.114', '80.37.32.103', '64.103.40.28', '90.175.255.162', '62.83.148.228', '113.140.248.64', '80.37.32.103', '90.175.255.162', '24.154.117.149', '80.37.32.103', '90.175.255.162', '37.223.124.39', '80.37.32.103', '90.175.255.162', '80.37.32.103', '64.103.40.18', '90.175.242.223', '90.175.240.92', '64.103.40.27', '24.154.117.149', '90.175.240.92', '62.83.148.228', '90.175.240.92', '85.53.56.68', '62.83.148.228', '64.103.40.26', '90.175.240.92', '90.175.255.162', '62.83.148.228', '80.37.32.103', '80.37.32.103', '37.223.124.39', '24.154.3.82', '106.14.201.114', '62.83.148.228', '64.103.40.17', '37.223.118.191', '62.83.148.228', '64.103.40.26', '90.175.255.162', '62.83.148.228', '106.14.201.114', '80.37.32.103', '110.87.123.118', '90.175.255.162', '62.83.148.228', '90.175.255.162', '80.37.32.103', '80.37.32.103', '90.175.255.162', '64.103.40.30', '90.175.240.92', '62.83.148.228', '90.175.240.92', '90.175.240.92']
from pprint import pprint
from collections import Counter
from geolite2 import geolite2
reader = geolite2.reader()
l_geo = [reader.get(a) for a in l]
d_countries = dict(Counter([a['country']['names']['es'] for a in l_geo]))
l_countries = [(k,v) for k,v in d_countries.items()]
pprint(sorted(l_countries, key = lambda i: i[1],reverse=True) )
d_cities = dict(Counter([(a['country']['names']['es'],a['city']['names']['en'] if a.get('city',False) else 'Unknown') for a in l_geo]))
l_cities = [(k,v) for k,v in d_cities.items()]
pprint(sorted(l_cities, key = lambda i: i[0][0]))
```