Aller au contenu

Mon Premier Script


Amsonia

Messages recommandés

Oué enfin bon, "mon premier script" c'est beaucoup dire parce que je n'ai fait que piocher ci et là quelques lignes que j'ai à peine modifiées.

Tellement peu que je n'arrive pas à faire ce que je voudrais alors j'espère un peu d'aide :)

Voici le bouzin :


#!/bin/sh


uptime


R1=`cat /sys/class/net/eth0/statistics/rx_bytes`

T1=`cat /sys/class/net/eth0/statistics/tx_bytes`

sleep 5

R2=`cat /sys/class/net/eth0/statistics/rx_bytes`

T2=`cat /sys/class/net/eth0/statistics/tx_bytes`

TBPS=`expr $T2 - $T1`

RBPS=`expr $R2 - $R1`

TKBPS=`expr $TBPS / 1024 / 5`

RKBPS=`expr $RBPS / 1024 / 5`

echo "D/L: $RKBPS Ko/s • U/L: $TKBPS Ko/s"


echo ""


echo "## CONNEXIONS ACTIVES"

tor=$(netstat -n -t -p|grep -c tor)

bt=$(netstat -n -t -p|grep -c transmission)

ftp=$(netstat -n -t|grep -c 21)

echo "$tor peers TOR" • "$bt peers BT" • "$ftp FTP"


echo ""


echo "## ACTIVITÉ BITTORRENT"

/usr/local/transmission/bin/transmission-remote -l|grep -v "Idle\|Stopped"

/usr/local/transmission/bin/transmission-remote -st

Ce qui me sort quelque chose comme ça :

aLBo8.png

(ça s'affiche en overlay sur mon fond d'écran grâce à GeekTool)

Bref, ce que je voudrais faire c'est :

1/ convertir automatiquement les Ko/s en Mo/s quand TKBPS ou RKBPS est supérieur à 1024.

2/ ne pas afficher les stats TOTAL.

(et dans une deuxième étape afficher qui fait quoi sur le ftp et dans le filestation)

Je pense avoir compris la logique pour y parvenir mais il est clair que je ne suis pas (encore :P) assez doué pour écrire ce qu'il faut :-s

J'ai notamment vu quelque chose qui faisait en sorte que :

tant que TKBPS (et RKBPS) est supérieur à 1024, on divise par 1024 et on echo non pas en Ko/s mais Mo/s.

Quant à ne pas afficher la section TOTAL, on doit utiliser cut ou gawk, non ?

En un mot, help.

Lien vers le commentaire
Partager sur d’autres sites

(NB: je n'ai pas acces a mon syno en shell pour l'instant donc c'est sans garantie, à toi de tester)

1/ convertir automatiquement les Ko/s en Mo/s quand TKBPS ou RKBPS est supérieur à 1024.

Ajoute la fonction suivante au début de ton script


echokos () {

	if [ $1 -gt 1024 ] ; then

		echo "$(( $1 / 1024 )) Mo/s"

	else

		echo "$(( $1  )) Ko/s"

	fi

}

et remplace
echo "D/L: $RKBPS Ko/s • U/L: $TKBPS Ko/s"
par
echo "D/L: $(echokos $RKBPS) • U/L: $(echokos $TKBPS)"
2/ ne pas afficher les stats TOTAL.
Ajoute a la fin de la commande qui affiche TOTAL ("/usr/local/transmission/bin/transmission-remote -st" je suppose)
| sed -e '/^TOTAL/,$d'
Tips: tu peux remplacer les
`<commande>`
par
$(<commande>)
C'est plus lisible, surtout quand tu veux impriquer pareil pour
`expr <expression>`
qui peut être mis sous la forme:
$((<expression>))
Une chtite question pour terminer: pourquoi divises-tu par 5 dans les lignes suivantes?

TKBPS=`expr $TBPS / 1024 / 5`

RKBPS=`expr $RBPS / 1024 / 5`

Lien vers le commentaire
Partager sur d’autres sites

Wow merci CoolRaoul, t'es un chef :)

Maintenant que je lis ce que tu as fait, je me demande pourquoi je ne l'avais pas moi-même trouvé ^^

Ah, heureux par contre de voir que les modifs que j'avais apporté après mon post sont celles de ton tips \o/

Pour ce qui est de la division par 5, c'est juste parce que je fais deux cat, espacés de 5 secondes. Je divise ensuite par 5 pour obtenir une valeur moyenne par seconde.

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait quelques modifs pour afficher le total UP et total DOWN.

Je suis tombé sur une fonction ready-to-go dans l'esprit de la tienne mais en while pour gérer plusieurs cas/divisions. (enfin, je crois…)

(d'ailleurs, une raison à ce que tu aies choisi -gt dans ta fonction et pas -ge ?)

Les deux fonctions sont un peu redondantes quand même.

On peut pas mettre un $1 et un $2 à ma fonction "total" pour sortir un truc du genre de ça ?

echo "D/L: $(total $RKBPS) ($(total $T2)) • U/L: $(total $TKBPS) ($(total $R2))"

#!/bin/sh

uptime

echokos () {

		if [ $1 -ge 1024 ] ; then

				echo "$(( $1 / 1024 )) Mo/s"

		else

				echo "$(( $1  )) Ko/s"

		fi

}

total () {

multiplier="0"

number="$1"

while [ "$number" -ge 1024 ] ; do

  multiplier=$(($multiplier + 1))

  number=$(($number / 1024))

done

case "$multiplier" in

  1)

   echo "$number Ko"

  ;;

  2)

   echo "$number Mo"

  ;;

  3)

   echo "$number Go"

  ;;

  4)

   echo "$number To"

  ;;

  *)

   echo "$1 o"

  ;;

esac

}

R1=$(cat /sys/class/net/eth0/statistics/rx_bytes)

T1=$(cat /sys/class/net/eth0/statistics/tx_bytes)

sleep 5

R2=$(cat /sys/class/net/eth0/statistics/rx_bytes)

T2=$(cat /sys/class/net/eth0/statistics/tx_bytes)

TBPS=$(($T2 - $T1))

RBPS=$(($R2 - $R1))

TKBPS=$(($TBPS / 1024 / 5))

RKBPS=$(($RBPS / 1024 / 5))

echo "D/L: $(echokos $RKBPS) ($(total $T2)) • U/L: $(echokos $TKBPS) ($(total $R2))"

echo ""

echo "## CONNEXIONS ACTIVES"

tor=$(netstat -ntp | grep -c tor)

bt=$(netstat -ntp | grep -c transmission)

ftp=$(netstat -nt | grep -c 4275)

afp=$(netstat -ntp | grep -c afpd)

echo "$tor peers TOR" • "$bt peers BT" • "$ftp FTP • $afp AFP"

echo ""

echo "## ACTIVITÉ BITTORRENT"

/usr/local/transmission/bin/transmission-remote -l | grep -v "Idle\|Stopped"

/usr/local/transmission/bin/transmission-remote -st | sed -e '/^TOTAL/,$d'

[/code]

Modifié par Amsonia
Lien vers le commentaire
Partager sur d’autres sites

une raison à ce que tu aies choisi -gt dans ta fonction et pas -ge

Ben parce que dans ton post tu avait écrit "convertir automatiquement les Ko/s en Mo/s quand TKBPS ou RKBPS est supérieur à 1024"

Et donc, supérieur c'est "-gt" ("-ge" c'est supérieur ou égal)

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

Ben parce que dans ton post tu avait écrit "convertir automatiquement les Ko/s en Mo/s quand TKBPS ou RKBPS est supérieur à 1024"

Et donc, supérieur c'est "-gt" ("-ge" c'est supérieur ou égal)

Oué désolé, je pensais en effet supérieur ou égal. Tu respectes trop bien l'énoncée ^^

Lien vers le commentaire
Partager sur d’autres sites

On peut pas mettre un $1 et un $2 à ma fonction "total" pour sortir un truc du genre de ça ?

Elle m'a l'air tres bien comme ça la fonction "total" (à part pour les valeurs > 1024 To, mais bon on va pas chipoter B) )

Tu peux supprimer "echokos" et n'utiliser plus que total, il me semble.

[EDIT]

Ah oui, compris, pour distinguer "KO/s" et Ko"

ben oui, tu remplace dans total les

   echo "$number Mo"
par
   echo "$number Mo$2"[/code]


et tu termines par

[CODE]echo "D/L: $(total $RKBPS '/sec') ($(total $T2)) ; U/L: $(total $TKBPS '/sec') ($(total $R2))"[/code]

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

Hmm il y a une amélioration indispensable à faire.

La fonction "total" arrondit à l'entier près ! Ce qui fait qu'il s'affichera toujours 2 Mo/s, que j'uploade à 2,1 ou 2,8 Mo/s… :-s

Je doute que ce soit une limitation du NAS (^^) alors, comment faire ?

Lien vers le commentaire
Partager sur d’autres sites

Hmm il y a une amélioration indispensable à faire.

La fonction "total" arrondit à l'entier près ! Ce qui fait qu'il s'affichera toujours 2 Mo/s, que j'uploade à 2,1 ou 2,8 Mo/s… :-s

Je doute que ce soit une limitation du NAS (^^) alors, comment faire ?

C'est une limitation du shell (et ça ne serait pas mieux avec "expr"): les calculs se font en entiers exclusivement.

Il existe plusieurs possibilités, pas toutes forcément très élégantes, comme utiliser awk ou perl juste pour les calculs.

Exemple en remplaçant:

echo "$(( $1 / 1024 )) Mo/s"
par
perl -e "printf (\"%f\n\", $1 / 1000);"[/code]




A mon avis, Le mieux serait de tout récrire en perl (d'autres membres du forum auraient probablement choisi Python)



Je me suis amusé à coder juste la premiere partie du script (pour la partie "transmission" ne ne saurais pas faire, n'utilisant pas cette appli).

Voici ce que ça donne:



[code] #!/usr/bin/perl -w use IO::File; sub getstat { my $statname = shift; my $f = new IO::File("/sys/class/net/eth0/statistics/" . $statname . "_bytes"); $f->getline(); } sub scale { my $value=shift; my @units = qw( o Ko Mo Go To ); my $scale = 0; while ($value >= 1024 && $scale < $#units) { $value /= 1024; $scale +=1; } return sprintf("%.2f %s", $value, $units[$scale]); } $interval=5; $r1=getstat("rx"); $t1=getstat("tx"); sleep $interval; $r2=getstat("rx"); $t2=getstat("tx"); $tbps = ($t2 - $t1) / $interval; $rbps = ($r2 - $r1) / $interval; print "IN: " . scale($rbps) . "/sec (" . scale($r2) . ")"; print " • "; print "OUT: " . scale($tbps) . "/sec (" . scale($t2) . ")"; print "\n"; exit; [/code]

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

Tu es formidable !

Bon, bien sûr, ça marche :-)

Par contre c'étrange que les deux versions n'indiquent pas les mêmes valeurs.

UVprz.png

Serait-ce parce que les scripts ne démarrent pas exactement en même temps et donc font leur moyenne sur des valeurs sensiblement différentes ?

Enfin, je ne comprends pas pourquoi les stats rxbytes et txbytes enregistrées par le NAS se remettent à zéro régulièrement. D'après ce que j'avais compris, elles n'étaient censées se reseter que lors d'un reboot.

Lien vers le commentaire
Partager sur d’autres sites

Par contre c'étrange que les deux versions n'indiquent pas les mêmes valeurs.

UVprz.png

Serait-ce parce que les scripts ne démarrent pas exactement en même temps et donc font leur moyenne sur des valeurs sensiblement différentes ?

Mis a part les erreurs d'arrondi,il y avait un bug dans ton script: inversion de T2 et R2 dans le echo:

echo "D/L: $(echokos $RKBPS) ($(total $T2)) • U/L: $(echokos $TKBPS) ($(total $R2))"[/CODE]

Enfin, je ne comprends pas pourquoi les stats rxbytes et txbytes enregistrées par le NAS se remettent à zéro régulièrement. D'après ce que j'avais compris, elles n'étaient censées se reseter que lors d'un reboot.

Sait pas non plus, doit y avoir un autre mécanisme de remise à zéro des compteurs.

Lien vers le commentaire
Partager sur d’autres sites

Mis a part les erreurs d'arrondi,il y avait un bug dans ton script: inversion de T2 et R2 dans le echo:

echo "D/L: $(echokos $RKBPS) ($(total $T2)) • U/L: $(echokos $TKBPS) ($(total $R2))"
Sait pas non plus, doit y avoir un autre mécanisme de remise à zéro des compteurs.
Je viens de trouver, c'est parce que mon Syno est une archi 32 bits => les compteurs ne peuvent pas dépasser 2^32. Ils se resettent donc à 4 GiB. Mais j'ai trouvé une solution (et je m'amuse un peu, faut le dire :) : vnstat. j'ai vu qu'il y avait plein d'autres solutions, plus élégantes, plus complètes mais pour commencer ça me suffit. bref, je l'ai compilé et installé, ça tourne. Mon seul problème concerne le script de boot. Voici le script qui m'est donné dans les sources, il est root:root en 755 dans /usr/syno/etc/rc.d et s'appelle S99vnstat.sh

#!/bin/sh

. /etc/rc.conf

. /etc/rc.d/functions

PID=`pidof -o %PPID /usr/sbin/vnstatd`

case "$1" in

  start)

	stat_busy "Starting vnStat daemon"

	[ -z "$PID" ] && /usr/sbin/vnstatd -d

	if [ $? -gt 0 ]; then

	  stat_fail

	else

	  add_daemon vnstat

	  stat_done

	fi

	;;

  stop)

	stat_busy "Stopping vnStat daemon"

	[ ! -z "$PID" ] && kill $PID &> /dev/null

	if [ $? -gt 0 ]; then

	  stat_fail

	else

	  rm_daemon vnstat

	  stat_done

	fi

	;;

  reload)

	stat_busy "Reloading vnStat daemon configuration"

	[ ! -z "$PID" ] && kill -HUP $PID &> /dev/null

	if [ $? -gt 0 ]; then

	  stat_fail

	else

	  stat_done

	fi

	;;

  restart)

	$0 stop

	sleep 1

	$0 start

	;;

  *)

	echo "usage: $0 {start|stop|restart|reload}"

esac

exit 0

[/code]




j'imagine que ça doit faire appel à quelque chose qui n'est pas présent sur nos petites machines mais de là à savoir quoi…



J'en profite pour te poser une deuxième question, les tâches cron cette fois. Je n'ai jamais touché à cette bête directement alors j'ai essayé de suivre le schéma des tâches déjà présentes mais je ne voudrais pas me planter :s



Ceci te semble correct ?

[code] #minute hour mday month wday who command 0 0 * * * root /usr/sbin/ntpdate -b pool.ntp.org 21 0 * * 1,4 root /usr/syno/bin/synopkg chkupgradepkg 13 * * * * root /var/packages/Webalizer/target/bin/webalizer -c /var/packages/Webalizer/target/webalizer.conf 06 * * * * root /root/vnstat/src/vnstati -hs -nh -o /volume1/homes/admin/CloudStation/NAS/vnstat/vnstat.png 06 * * * * root /root/vnstat/src/vnstati -hs -nh -o /volume1/web/divers/vnstat.png [/code]

Lien vers le commentaire
Partager sur d’autres sites

Pour commencer, je te conseilles d'éviter au maximum d'installer des choses dans les répertoires système (/usr, /usr/syno/etc/ ...)

A chaque upgrade de firmware tu prend le risque voir disparaitre tes ajouts. Et en plus il vaut mieux aussi de ne pas trop gaspiller l'espace dans le file system root.

La seule exception est tout ce qui est situé sous "/usr/local" que Synology s'engage à sauvegarder et restaurer lors des upgrades (ceci est documenté).

Par exemple, pour ma part je me suis fait un arborescence "/volume1/site" (avec sous répertoires bin, etc, var ... ), pointée par un lien symbolique "/site" ou je met mes petits trucs perso bien à l'abri.

(Il aurait été peut-être préférable de choisir le chemin "/volume1/@site" pour éviter la création auto du partage "site" mais c'est pas si grave)

Pour les scripts de startup/shutdown un bon endroit est "/usr/local/etc/rc.d": tous les scripts situés dans ce répertoire et dont le nom se termine par ".sh" sont automatiquement invoqués au démarrage (avec le parametre "start") et à l'arret (avec le parametre "stop")

Et pour terminer, pour la crontab si il y a une chose à savoir, c'est celle-ci: le cron de DSM est tres pointilleux avec le format du fichier "/etc/crontab". Il est *impératif* que les champ minute, heure, jour du mois, mois, jour de semaine, compte et commande soit séparés *exclusivement* par des tabulations (pas d'espace donc, par contre le contenu du champ "command" lui est de format libre).

Lien vers le commentaire
Partager sur d’autres sites

Je crois que je cherche à courir avant de savoir marcher…

Ce que je voudrais faire, c'est parvenir à être utile ici ; à participer au repo en compilant et maintenant des paquets. Je m'aperçois que de nombreuses choses sont présentes via IPKG mais pas à jour. (pour mon archi du moins)

Et il est certain qu'il me faut des bases alors des posts comme le tiens me sont extrêmement utiles !

Je me suis également récupéré le schéma ci-dessous ; que faudrait-il que je sache d'autre sur GNU/Linux en général et BusyBox by Synology en particulier pour ne pas faire trop de bêtises ?

dirtree.jpg

Lien vers le commentaire
Partager sur d’autres sites

Pour la création des paquets, il y a déja des membres "historiques" du forum qui ont une solide expérience (il sont tous dans la premiere page de la toplist).

Notamment Bud77, Diaoul, PiwiLAbruti (que ceux que j'oublie me pardonnent) qui, entre autres choses, participent à l'administration du dépot de paquet "SynoCommunity"

Dans tous les cas pour crééer des paquets SPK, il est préférable de procéder par cross-compilation sur un Linux quelconque à base architecture Intel (pas forcément 64 bits, une machine virtuelle est un bon choix). Il devient ainsi en plus possible de compiler pour des syno d'autre architecture que le tien.

Pour cela Il faut télécharger et installer le toolchain sur ton serveur linux pour l'architecture cible que tu récupèrera ici: http://sourceforge.n....0 Tool Chains/

Ensuite tu va pouvoir compiler tes applis sur ton serveur Linux et les transférer ensuite sur le Syno pour exécution.

Synology fournit une doc ("Synology DiskStation 3rd-Party Apps Integration Guide") qui détaille comment s'y prendre.

Elle est disponible ici: http://www.synology....nt.php?lang=enu

Toutefois, pour des usages perso, tu peux bien entendu continuer à compiler directement sur ton Syno

Mais alors je ne peux que te conseiller , pour ne pas risquer de faire de dégats, c'est quand tu compile ces applis, de le faire comme je t'ai dis plus haut: à savoir te créer un répertoire dédié dans "/volume1" et le donner comme cible des commandes "configure" comme ceci:

./configure --prefix=<mon rep local perso>[/CODE]

Ca te créera les binaires dans <mon rep local perso>/bin, les config dans <mon rep local perso>/etc, et ainsi de suite/

Ensuite tu peux soit ajouter <mon rep local perso>/bin à ton PATH ou bien faire des liens de <mon rep local perso>/<commande> dans /usr/local/bin.

*PROTIP*

Encore un peu plus propre, pour rendre tes packages plus facilement relogeables:

  • créer un lien symbolique ("/site" pour moi) vers le répertoire des extensions perso (toujours chez moi exemple "/site" -> "/volume1/site")
  • mettre ce dernier en "prefix" dans les commandes "./configure"

ainsi tu pourra toujours déplacer la cible (de volume1 vers volume2 ou n'importe quoi d'autre), suffira juste de refaire le symlink

Modifié par CoolRaoul
Lien vers le commentaire
Partager sur d’autres sites

(Petite parenthèse, le SPKSRC dispo sur github est une solution clé en main pour la compilation, Diaoul et Piwi pourrons expliquer tout çà bien mieux que moi, je ne suis que le porte parole :P)

Connaissais pas, ça a l'air pas mal du tout dis donc!

Tiens je donne lien puisque tu as oublié de le faire -_-

https://github.com/S...ommunity/spksrc

Lien vers le commentaire
Partager sur d’autres sites

Voui bien sûr que je vais git clone spksrc !

Je voulais "juste" savoir avant…ce qu'il faut savoir :P

Je vais relire tout cela avec attention ce soir, faire le ménage comme tu le recommandes et me lancer :-)

S'il s'agit "juste" de faire une (les) compilations en déportées pour (en plus) garder son Syno plus propre, ça va être bien bien bien. #me_ne_sait_pas_ce_qu'il_fait_mais_est_content…

Lien vers le commentaire
Partager sur d’autres sites

Bon, je suis parvenu à faire fonctionner ma crontab et à l'optimiser un poil. Les tabulations étaient correctes mais pas la syntaxe.

J'ai aussi relogé mes scripts de boot dans /usr/local/etc/rc.d/

Par contre, si je comprends l'esprit de tes symlinks, j'avoue ne pas avoir tout suivi concrètement :-s

Le dossier /volume1/@choses est le dossier réel ? Où positionnes-tu le lien ? À la racine du syno ?

Est-ce que l'on doit créer à la main la structure ou ça va se créer à la sortie de la compilation ?

Si oui à tout cela, quelle est précisément l'arbo à mettre en place ? Tu parles de /bin ; /etc ; /var mais y-a-t-il autre chose ?

Et pour être bien sûr, tout cela n'est nécessaire que des executables générés sur le syno lui-même, pas utile si l'on passe par spksrc qui crée un package en bonne et due forme. J'ai bon ?

Ça fait un paquet de questions mais j'apprends là…depuis la méga base.

Lien vers le commentaire
Partager sur d’autres sites

J'ai désormais une Debian (32 bits) dans une VM.

Installé Git et cloné spksrc dans la home de mon user.

J'ai téléchargé les sources d'un premier truc, pour tester (darkstat).

Maintenant, qu'est-ce que je fait concrètement ?

Est-ce qu'il faut que j'installe des choses supplémentaires sur ma VM ?

Bref, il nous/me faudrait un petit guide :-)

Lien vers le commentaire
Partager sur d’autres sites

PS : Si tu veux pas que tes scripts de démarrage saute à la prochaine mise à jour, tu peux les placer dans /volume1/startup (à créer)

Ca te permet en plus l'édition du fichier depuis samba (en activant le fin de ligne en mode unix)

J'ai désormais une Debian (32 bits) dans une VM.

Installé Git et cloné spksrc dans la home de mon user.

J'ai téléchargé les sources d'un premier truc, pour tester (darkstat).

Maintenant, qu'est-ce que je fait concrètement ?

Est-ce qu'il faut que j'installe des choses supplémentaires sur ma VM ?

Bref, il nous/me faudrait un petit guide :-)

Pour un pti guide, poste un nouveau topic dans la partie "synocommunity"

Ca devrait servir à pas mal de monde :)

Lien vers le commentaire
Partager sur d’autres sites

PS : Si tu veux pas que tes scripts de démarrage saute à la prochaine mise à jour, tu peux les placer dans /volume1/startup

/usr/local est "safe" aussi, j'ai entre-temps découvert dans le doc "Synology DiskStation Manager 3rd-Party Apps Developer Guide" de Synology ce qui suit:

"When DSM is being upgraded, the directory /var/packages/[package name] and /usr/local will be backed up and restored automatically"
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.