logo

jupfaf

some stuffs, and some others ...

Retropie et Netflix

Written by julien

La suite de l'article précédent. Pour rappel, j'ai un raspberry pi, retropie installé dessus, le wifi est fonctionnel, je peux accéder au raspberry par ssh et, point le plus important, parce que c’était tout de même le but, je peux jouer :)

Le deuxième but, c’était d'utiliser le rasberry pi pour avoir Netflix sur la télévision, et tant qu'à faire sur retropie pour ne pas avoir à formater la carte sd chaque fois que je veux regarder un film. Retropie étant basé sur Raspbian, ça ne devrait pas trop poser de problème me disais-je bêtement, sauf que ... il n'y a pas grand-chose de prévu pour que Netflix fonctionne sur un raspberry pi. Il y a plein de bidouilles qui fonctionnaient mais qui sont maintenant obsolètes, et d'autres bidouilles qui ont l'air de fonctionner maintenant, mais les explications complètes sont impossibles à trouver. À force de bidouille, ça marche, voici comment.

À noter que j'ai fais pas mal de choses entre le moment où j'ai commencé mes tentatives et le moment où cela à fonctionner, il y a peut être des étapes manquantes ici, mais je pense que ceci est le minimum vital pour que cela fonctionne, j'ai juste la flemme de repartir d'une installation from scratch pour tester.

Dans les bidouilles précédentes, la première consistait à utiliser une version de chromium pour le rasberry pi incluant toutes les librairies nécessaires, mais cela n'a pas été mis à jour avec les nouvelles versions de chromium pour raspberry, donc ça risque juste de casser des trucs sur votre système si vous tentez, mais c'est réparable. La deuxième, c'est d'utiliser un plugin pour kodi version 17, ça aurait pu être bien vu que c'est possible d'installer kodi en version 17 dans les portages de retropie, mais le plugin n'est plus existant. La solution qui fonctionne, pour le moment, ça risque de ne pas être éternel, c'est d'utiliser un plugin pour kodi en version 18. C'est possible de faire en sorte d'avoir kodi 18 en version bêta sur raspbian, donc le plugin devrait fonctionner.

On va commencer par mettre à jour retropie avec le système depuis le script retropie_setup.sh et l'option Update. Il faut ensuite installer une dépendance nécessaire pour le plugin Netflix dans Kodi qui ne va pas s'installer d’elle-même, le module pycryptodomex


sudo apt install python-pip
sudo pip install pycryptodomex
et ajouter le dépôt qui va permettre d'avoir la version bêta de kodi

sudo su
echo "deb http://pipplware.pplware.pt/pipplware/dists/unstable/main/binary /" > /etc/apt/sources.list.d/pipplware_unstable.list
wget -O - http://pipplware.pplware.pt/pipplware/key.asc | sudo apt-key add -
apt update
exit

On retourne dans le script retropie_setup.sh puis dans Manage packages > opt on sélectionne kodi (numéro 312 à ce jour). Une fois l'installation terminée, en retournant dans emulestation, une section Ports a dû apparaître avec kodi disponible. Il est préférable d'avoir une souris connectée pour se balader dans les menus de kodi.

Il faut ensuite télécharger la dernière version du plugin Netflix pour kodi 18 qui se trouve ici et copier le zip quelque part sur votre raspberry pi. Tout se fait ensuite dans kodi.

Dans Settings > Add-Ons, il faut activer les Unknown sources.

Dans Home > Add-ons, cliquer sur la boite du menu en haut et choisir Install from zip file, puis choisir le fichier téléchargé précédemment.

Dans Home > Add-ons > My add-ons, dans VideoPlayer InputStream, vérifier que les options InputStream Adaptive et RTMP Input sont actives.

Et il n'y a plus qu'à lancer le plugin Netflix depuis Home > Add-ons \o/

Les login/mot de passe vont être demandés la première fois, puis la librairie Libwidevine va être installée avant le visionnage de la première vidéo, ça prend 5/10 minutes et il faut au moins 2Go de libre sur la carte sd. Quelques fois, vous aurez le bonheur de devoir mettre à jour la librairie avant un visionnage ..., mais ça fonctionne! Et au final, je préfère l'interface de ce plugin plutôt que l'interface de Netflix depuis un navigateur. Bon flim!

Raspberry Pi et retrogaming

Written by julien

Je me suis fait un cadeau, j'ai acheté un Raspberry Pi modèle 3B+. Le but c'est surtout de faire de l’émulation de console, parce que la super nes me manque, et si possible de pouvoir avoir Netflix sur la télévision, qui ne sert pratiquement qu'à écouter la radio, plutôt que sur mon portable avec son petit écran de 13 pouces. Je l'ai acheté sur The Pi Hut, un bundle retro gaming qui contient le raspberry pi, une alim, une carte sd avec un adaptateur usb, un boîtier et deux manettes style super nes, et j'ai ajouté un dissipateur thermique. C'est arrivé super vite, bien emballé. Bon, il y a sûrement plus près pour commander si vous n’êtes pas vers l’Angleterre.

Je me suis aperçu qu'à part mon portable, je n'avais pas de clavier externe que je pourrai brancher dessus, donc voici comment faire la configuration sans clavier (jusqu’à un certain point, au bout d'un moment j'ai acheté un combo clavier/souris sans fil).

Il faut commencer par choisir une distribution, comme le but principal c'est de jouer, j'ai choisi Retropie. Après avoir téléchargé l'image, on la met sur la carte sd. J'ai fait une première tentative avec dd


sudo dd bs=4M if=retropie.4.4.img of=/dev/sdX conv=fsync

Et quand j'ai mis la carte dans le raspberry, il n'a pas démarré, j'aurai pu retenter en changeant le bs à 1M mais au final j'ai utilisé Etcher et ça fonctionne bien. Avec Retropie, c'est possible de transférer les roms des jeux depuis une clé usb. On formate une clé usb en fat32, on crée un répertoire retropie dedans, on la branche dans le raspberry, et quand elle a fini de clignoter, on peut la rebrancher sur le pc, mettre les roms dans les bons répertoires, puis la rebrancher sur le raspberry, attendre encore une fois la fin du clignotement et c'est fait, mais il y a plus pratique en utilisant ssh. Pour cela, il va falloir configurer le wifi, et sans clavier ... il y a une solution. Il faut reprendre la carte sd, la remettre dans son pc, et dans la partition boot créer un fichier wpa_supplicant.conf. Si votre wifi est protégé en utilisant WAP2, il y a plein d'exemple de ce que le fichier doit contenir, mais je dois configurer avec du WEP (je n'ai pas le choix, et je ne peux pas changer :'( ) et là, il y a un peu moins de documentation, basiquement, le fichier doit ressembler à ça


country=IE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

# RETROPIE CONFIG START
network={
    ssid="VotreNomDeReseau"
	scan_ssid=1
	key_mgmt=NONE
	wep_tx_keyidx=0
	wep_key0=VotreCleWEP
}
# RETROPIE CONFIG END

Il faut aussi ajouter un fichier vide nommé ssh à côté pour que sshd soit démarré au prochain démarrage. Avant de redémarrer le raspberry, on fait un scan des adresses présentes sur le réseau


nmap -sn 192.168.1.0/24

Il suffira ainsi de relancer la commande pour trouver la nouvelle adresse du raspberry une fois qu'il aura démarré. Là, j'ai eu un problème, parce que 2 nouvelles adresses sont arrivées sur le réseau, en fait la deuxième adresse était juste l'imprimante qui a été démarrée en même temps, merci ma mie :) On peut donc se connecter en ssh sur le raspberry


ssh pi@192.168.1.10

le mot de passe par défaut est raspberry.

La première chose à faire est de changer le mot de passe avec la commande passwd, puis de faire en sorte que sshd démarre automatiquement


sudo systemctl enable ssh

Les mises à jour système peuvent être faites depuis le script retropie_setup.sh qui se trouve dans le répertoire Retropie-Setup (Il faut juste choisir Update dans le menu et indiquer qu'on veut faire les mises à jour système quand demandé). Une fois les mises à jour effectuées, il est possible qu'emulestation ne se lance plus automatiquement au démarrage, toujours dans le script retropie_setup.sh, il faut aller dans Configuration / Tools > Autostart, choisir Start Emulation Station at boot, et hop, problème résolu.

Il est maintenant possible d'ajouter des roms depuis son canapé en utilisant sftp. Prochaine étape, Netflix, mais je garde ça pour un prochain article (qui sera plus court du coup) parce que celui-là est beaucoup trop long déjà. Bon jeu!

Flux rss d'une chaîne youtube

Written by julien

Parce que c'est un réseau social comme les autres, même en suivant une chaîne, youtube n'informe pas forcément de la sortie des nouvelles vidéos de cette chaîne, et à la place, propose du contenu cacatesque, qui a fait le buzz ou autre truc polémique ... bref, un algorithme de réseau social. Heureusement, même s'ils sont cachés, les flux rss sont toujours présents sur youtube, et avec eux, dès qu'une chaîne sort une nouvelle vidéo, on est informé.

Pour récupérer les flux rss, il y a besoin de l'identifiant de la chaîne. Avant, c’était un peu compliqué, et il fallait chercher dans le code source de la page d'accueil d'une chaîne pour le trouver. Avec la nouvelle version de youtube, celui-ci peut se trouver directement dans l'url de la chaîne.

Il faut donc aller sur la page d'accueil d'une chaîne youtube, et dans la barre d'adresse de son navigateur, l'url va ressembler à quelque chose comme

https://www.youtube.com/channel/UCabcdef

Ce qui nous intéresse dans cette url, c'est le UCabcdef qui est l'identifiant de la chaîne. Avec celui-ci, dans son lecteur de flux rss préféré, on peut ajouter un nouveau flux, entrer l'adresse suivante

https://www.youtube.com/feeds/videos.xml?channel_id=UCabcdef
et hop, à chaque nouvelle vidéo de la chaîne, votre lecteur de flux vous informera de celle-ci, et suivant le lecteur, c'est même possible de lire la vidéo directement dessus. Mon lecteur de flux est FreshRSS, et il y a un plugin qui permet cela.

Note: ceci n'est valide que jusqu'au prochain changement de règle dans la gestion des urls chez youtube.

openldap with memberOf overlay

Written by julien

I won't present LDAP, just explain how to configure openldap with the memberof overlay on CentOS 7. By default, the memberof overlay is not enable and it is quite useful to know which groups a user is member of when requesting for user information.

First, install the needed packages


sudo yum install -y openldap openldap-clients openldap-servers

Then, copy the samples database from /usr/share/openldap-servers/DB_CONFIG.example to /var/lib/ldap/DB_CONFIG, and update the permission in the /var/lib/ldap folder


sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown ldap:ldap /var/lib/ldap/*

The server can now be started


sudo systemctl start slapd

For ldap server to start automatically when restarting the machine


sudo systemctl enable slapd

Generate a password for the ldap administrator


sudo slappasswd

The server will now be configured for our domain, in this example, it will be dc=jupfaf,dc=net.

The base configuration can be found under /etc/opnldap/slapd.d/cn=config/ (you can have a look at the files olcDatabase={1}monitor.ldif and olcDatabase={2}hdb.ldif). The files in this folder can't be modified directly, changes will be lost when using some ldap commands otherwise, so we will create some ldif files and apply them to modify configuration.

Create a file db.ldif with the following content (adapt to your domain, and change the password with the one returned by the slappasswd command)


dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=jupfaf,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=ldapadm,dc=jupfaf,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}avm/5RsK69rlKEV/Y9LJufW9Nyke2bQe

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=ldapadm,dc=jupfaf,dc=net" read by * none

Send the configuration to the ldap server


sudo ldapmodify -Y EXTERNAL  -H ldapi:/// -f db.ldif

Add the cosine, nis and inetorgperson schema


sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif 
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif  
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

To enable memberOf overlay in the openldap configuration, create 3 files (it can be done with only one file, but I prefer to differenciate the load of the modules, and their configuration)

module.ldif


dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib64/openldap
olcModuleload: memberof.la
olcModuleload: refint.la

memberof.ldif


dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof

refint.ldif


dn: olcOverlay={1}refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: {1}refint
olcRefintAttribute: memberof member manager owner

and send the configuration to the ldap server


sudo ldapadd -Y EXTERNAL -H ldapi:/// -f module.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberof.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f refint.ldif

The server configuration is now done, we need to polulate it with groups and users, start with a base.ldif file which will include the admin user and two organizations: Users and Groups


dn: dc=jupfaf,dc=net
dc: jupfaf
objectClass: top
objectClass: domain

dn: cn=ldapadm,dc=jupfaf,dc=net
objectClass: organizationalRole
cn: ldapadm
description: LDAP Manager

dn: ou=Users,dc=jupfaf,dc=net
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=jupfaf,dc=net
objectClass: organizationalUnit
ou: Groups

and build the directory structure using ldapadd command


sudo ldapadd -x -W -D "cn=ldapadm,dc=jupfaf,dc=net" -f base.ldif

it will ask for the ldapadm user password.

Add a user and a group, create a julien.ldif file


dn: uid=julien,ou=Users,dc=jupfaf,dc=net
objectClass: top
objectClass: organizationalPerson
objectClass: person
objectClass: inetOrgPerson
cn: julien
sn: julien
uid: julien

dn: cn=Writers,ou=Groups,dc=jupfaf,dc=net
objectclass: groupOfNames
cn: Writers
member: uid=julien,ou=Users,dc=jupfaf,dc=net

and send the configuration to the server


sudo ldapadd -x -W -D "cn=ldapadm,dc=jupfaf,dc=net" -f julien.ldif

There is now one user julien who is member of the group Writers, that can be verified by using a ldapsearch command


ldapsearch -LL -Y EXTERNAL -H ldapi:/// "(uid=julien)" -b dc=jupfaf,dc=net memberOf

which should return


SASL/EXTERNAL authentication started
SASL username: gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth
SASL SSF: 0
version: 1

dn: uid=julien,ou=Users,dc=jupfaf,dc=net
memberOf: cn=Writers,ou=Groups,dc=jupfaf,dc=net

memberOf is not a direct attribute of the user, so it has to be requested explicitely. The overlay applies ony for newly created objects, if some objects were created before adding the memberOf overlay in LDAP configuration, they have to be recreated.

Shared folder between two machines

Written by julien

I sometimes need to have a shared folder between some of my test machines. The need is sporadic, so I don't want to setup a NFS server. I found sshfs for this usage which is really handy.

It is using the ssh layer, so one of the machine will be the server, and the other the client. As usual, my test machines are running on CentOS 7.

On the server side:

  • my user is named admin
  • the shared folder is /home/admin/shared
  • ssh server is already configured

On the client side:

  • my user is named user
  • the shared folder is /home/user/shared
  • ssh client is installed
  • I need to install sshfs

The package name is fuse-sshfs, and it can be found in the EPEL repository (so this repository needs to be configured):


user@client:~$ sudo yum install -y sshfs

The shared folder can now be mounted by using the following command:


user@client:~$ sshfs admin@server:/home/admin/shared ~/shared
(it is not recommended to mount the folder as a superuser)

Now the folder is shared and synchronized between the two machines, so if a file is created on the server:


admin@server:~/shared$ touch file.txt
it will be visible from the client:

user@client:~/shared$ ls
file.txt
and vice versa.

Unmount the folder has to be done on the client side, with the command:


user@client:~$ fusermount -u ~/shared

Because it is using the ssh layer, it is possible to configure the connection to use a private key and avoid sshfs asking for your admin@server password. First, the key has to be generated:


user@client:~$ ssh-keygen -t rsa -b 2048
(check for the options to generate a far more secure key)

then sent to the server:


user@client:~$ ssh-copy-id -i /home/user/.ssh/id_rsa admin@server
A config file can be created to not be bothered with connection options:

user@client:~$ cat >> .ssh/config
Host server
        User admin
        IdentityFile /home/user/.ssh/id_rsa
^C
user@client:~$ chmod 600 .ssh/config
The shared folder can now be mounted with the following command:

user@client:~$ sshfs server:/home/admin/shared ~/shared
and no password will be asked.