flnews_post_proc 1.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,377 @@
1
+ =======================
2
+ flnews_post_proc
3
+ =======================
4
+ ------------------------------------------
5
+ Post-Traitement pour flnews
6
+ ------------------------------------------
7
+
8
+ SYNOPSIS
9
+ =======================
10
+
11
+ Un article est envoyé au logiciel de post-traitement via STDIN. Ceci se passe
12
+ automatiquement, quand la variable « post_proc » dans le fichier de
13
+ configuration de flnews a la valeur *flnews_post_proc*.
14
+
15
+ Si un article a été sauvegardé dans un fichier, il peut servir pour tester le
16
+ fonctionnement de flnews_post_proc, en lançant une commande comme :
17
+
18
+ **flnews_post_proc < article.txt**
19
+
20
+ ou si vous préférez l'équivalent :
21
+
22
+ **cat article.txt | flnews_post_proc**
23
+
24
+ DESCRIPTION
25
+ =======================
26
+
27
+ Le lecteur de news **flnews** est suffisant pour l'accès au Usenet, c'est à
28
+ dire pour lire les articles et pour les rédiger et les envoyer aux newsgroups
29
+ de votre choix.
30
+
31
+ Quand vous comparez les clients pour les news, vous allez toujours identifier
32
+ le logiciel qui correspond à vos attentes et vos habitudes. Flnews, comme un
33
+ logiciel basique, vous offre la possibilité d'influencer comment il fonctionne
34
+ et aussi de manipuler directement les articles qu'il produit, juste avant qu'ils
35
+ soient envoyés au serveur nntp.
36
+
37
+ Ce post-traitement peut servir à ajouter et à modifier des détails du message
38
+ d'une manière qui n'est actuellement pas possible avec seulement flnews. Comme
39
+ le logiciel est configurable, il peut probablement répondre aux besoins de
40
+ quelques utilisateurs du Usenet. Quand même, vous devez le comprendre comme un
41
+ exemple pour ce qui est possible et pour inspiration, afin de créer vos propres
42
+ solutions.
43
+
44
+ Les limites d'un lecteur basique de news – ce qui peut faire flnews_post_proc
45
+ -----------------------------------------------------------------------------
46
+
47
+ Bien que les articles qui sont créés avec flnews sont complets et prêt pour
48
+ l'envoi, certains utilisateurs ne seront pas toujours d'accord avec le résultat
49
+ et ce pour des raisons arbitraires :
50
+
51
+ * Il peut y avoir des inconvénients quand vous communiquez dans de groupes
52
+ diverses en plusieurs langues. La ligne d'introduction qui fait référence à
53
+ un article précédent, ne peut être configurée qu'une seule fois pour flnews.
54
+ La conséquence peut être une introduction en Anglais quand vous postez dans
55
+ un groupe français.
56
+
57
+ Avec mon logiciel de post-traitement vous pouvez imposer des introductions
58
+ spécifiques, à chaque fois pour une ou plusieurs newsgroups.
59
+
60
+ * Le même conflit se produit quand vous avez défini une signature mais voudriez
61
+ la remplacer contre une autre, selon le groupe dans lequel vous êtes en train
62
+ de poster.
63
+
64
+ flnews_post_proc peut faire exactement ça, quand vous avez configuré quel
65
+ signature doit apparaître dans quel newsgroup ou liste de newsgroups.
66
+
67
+ * Quelques entêtes supplémentaires peuvent servir à transmettre des informations
68
+ aux lecteurs intéressés, comme l'ID de votre clé GnuPG, vos connaissances en
69
+ langues ou pareil. Il se trouve que la signature est mieux pour ça, mais vous
70
+ êtes libres. Je veux mentionner « face » et « x-face » mais préfère que vous
71
+ ne vous en souvenez pas.
72
+
73
+ Ces entêtes, – Custom-Headers – peuvent être définis dans la configuration
74
+ du logiciel et vont être utilisées dans chaque article sortant.
75
+
76
+ * L'entête « X-No-Archive » est parfois utilisé afin d'éviter l'archivage
77
+ d'un article. Il ne devrait par conséquence pas être trouvé par les moteurs
78
+ de recherche ( Google notamment ). Les articles dans les groupes de test, par
79
+ exemple, ne valent probablement pas qu'on les trouve parmi les résultats des
80
+ recherches.
81
+
82
+ Avec flnews_post_proc vous pouvez décider et imposer que vos articles dans
83
+ certains newsgroups contiendront d'office une entête **X-No-Archive: Yes**.
84
+
85
+ **ATTN** Depuis l'année 2024, cet entête n'a probablement plus de fonction.
86
+
87
+ * Certains messages mentionnent d'autres articles ou des URLs de pages Web.
88
+ S'ils sont nombreux, ces références peuvent déranger la lecture à cause de
89
+ leur syntaxe spécifique.
90
+
91
+ Mon logiciel est capable d'identifier des fragments de text marqué – pas
92
+ seulement des références – et les transformer en notes en bas de page. Vous
93
+ pouvez imaginer ça comme le fonctionnement de la balise <ref/> de Wikipedia,
94
+ mais vous pouvez définir votre propre séparateur pour marquer les fragments
95
+ de text dans le fichier de configuration.
96
+
97
+ Exemple ( avec séparateur **%=** ) :
98
+ « Ceci est un objet %=et ceci devient la note en bas de page, qui décrit
99
+ l'objet plus précisement=% »
100
+
101
+ Dialogue pour désactiver des options
102
+ ------------------------------------
103
+ Juste avant d'entrer en action, flnews_post_proc peut afficher un dialogue, qui
104
+ vous laisse **désactiver** des options fixées dans la configuration. Sous
105
+ condition qu'un des outils YAD, Zenity, Whiptail ou seulement xterm est
106
+ disponible, vous pouvez choisir dans les options suivantes, ceux que vous
107
+ voulez ignorer pour l'article en préparation. Vous **ne pouvez pas** activer
108
+ des options, qui ne l'ont pas été auparavant :
109
+
110
+ * Signatures, comme définis dans la configuration **peuvent être ignorées**.
111
+ Soit une signature par défaut sera appliquée, si prévue, ou aucune.
112
+
113
+ * Entêtes supplémentaires, si définis, peuvent rester absentes de l'article.
114
+
115
+ * L'entête X-No-Archive, si prévu pour le newsgroup choisi, peut être ignoré.
116
+
117
+ * L'auto correction de URLs et références à d'autres articles peut être
118
+ désactivé.
119
+
120
+ * L'écriture d'un protocole peut être arrêtée.
121
+
122
+ En tapant Esc ou en poussant le bouton « Annuler » du dialogue, vous pouvez
123
+ interrompre le processus, flnews ne vas pas envoyer l'article.
124
+
125
+ Vous pouvez même désactiver le dialogue, ce qui assure que toutes les options
126
+ configurées seront appliquées sans plus d'interaction ( à voir dessous : optoin
127
+ OVERRIDE_CONFIG ).
128
+
129
+ CONFIGURATION
130
+ =============
131
+ La première fois que vous exécutez le logiciel, une copie de la configuration
132
+ par défaut sera écrit dans */home/[utilisateur]/.flnews_post_proc.conf* C'est
133
+ ce fichier qui sera désormais utilisé. Si vous l'effacez, il sera recréé à la
134
+ prochaine occasion, mais vos modifications seront perdues.
135
+
136
+ Le fichier de configuration est en format YAML et plein d'explications. Les
137
+ variables définis dans ce fichier peuvent être classées en deux catégories :
138
+
139
+ * Variables qui décrivent des valeurs déterminées par flnews. Ils peuvent être
140
+ utiilisées ou remplacées. Les composants importants sont normalement
141
+ spécifiés dans une « capture group ».
142
+
143
+ * Variables qui définissent du nouveau contenu ou des changements dans le
144
+ contenu.
145
+
146
+ **FUP_NAME**
147
+ Une « expression régulière » ( “regular expression” ) décrivant la chaîne de
148
+ caractères qui contient le nom de l'auteur d'un article précédent, qu'on veut
149
+ citer en partie. Cet élément est reconnu dans l'article d'origine et peut
150
+ être utilisé à la place de l'élément correspondant dans *GROUP_INTRO* ( à voir
151
+ plus bas ). Le format de l'expression est celui de la classe Regexp dans Ruby.
152
+ Veillez de masquer le backslash '\\' avec un autre, comme dans l'exemple. Un
153
+ « capture group » '()' sert à extraire le nom du résultat de la comparaison.
154
+
155
+ Laissez ce champs vide afin de maintenir le comportement configuré pour flnews.
156
+
157
+ CONTENU : L'équivalent d'une regular expression en chaîne de caractères.
158
+
159
+ PAR DÉFAUT : Vide
160
+
161
+ EXEMPLE 1 : "On \\\\d+.\\\\d+.\\\\d{2,4} at \\\\d+:\\\\d+ **(.*)** wrote:"
162
+
163
+ EXEMPLE 2 : "**(.*)** wrote:"
164
+
165
+ **FUP_GROUP**
166
+ Une « expression régulière » ( “regular expression” ) décrivant la chaîne de
167
+ caractères qui contient le newsgroup où a été publié l'article précédent à qui nous
168
+ faisons référence dans un « followup ».
169
+
170
+ Laissez ce champs vide afin d'ignorer le groupe précis.
171
+
172
+ CONTENU : l'équivalent d'une regular expression en chaîne de caractères.
173
+
174
+ PAR DÉFAUT : Vide
175
+
176
+ EXEMPLE : "wrote in **(.*)**:"
177
+
178
+ **GROUP_INTROS**
179
+ Des introductions qui font référence à l'auteur de l'article précédent que
180
+ nous souhaitons citer. Si vous avez trouvé le newsgroup où l'article a été
181
+ publié ( à voir : FUP_GROUP, ci-dessus ), et le nom de son auteur
182
+ ( FUP_NAME ), vous pouvez utiliser ces valeurs ici.
183
+
184
+ Jusqu'à prochaine ordre, seulement %fup_name% est %fup_group% sont reproduit
185
+ dans l'introduction resultant.
186
+
187
+ | CONTENU : Un newsgroup ou regexp par ligne, suivi de deux points, un espace et
188
+ | une chaîne de caractères.
189
+
190
+ PAR DÉFAUT : Comme configuré dans flnews.
191
+
192
+ | EXEMPLE ( un groupe et une hiérarchie ) :
193
+ | alt.test: "Thus spoke %fup_name% in %fup_group%"
194
+ | fr\\.*: "C'était dans %fup_group%, que %fup_name% c'est exprimé ainsi"
195
+
196
+ **GROUP_SIGS**
197
+ Une signature par newsgroup ou expression.
198
+ ATTN! Vous devez noter \\r\\n pour les sautes de lignes, si une signature
199
+ s'étend sur plusieurs lignes.
200
+
201
+ CONTENU : un newsgroup ou expression par ligne, suivi de deux poins, un espace
202
+ et une chaîne de caractères.
203
+
204
+ PAR DÉFAUT : Comme configuré dans flnews.
205
+
206
+ EXEMPLE : fr.test: "Signature pour alt.test\\r\\nseconde ligne"
207
+
208
+ **CUSTOM_HEADERS**
209
+ Entêtes supplémentaires pour l'article sortant.
210
+
211
+ CONTENU : 1 ligne par entête : un trait d'union, un espace, puis une chaîne de
212
+ caractères comprenant le nom de l'entête, puis deux points et la valeur de
213
+ l'entête.
214
+
215
+ PAR DÉFAUT : Vide ( pas défini )
216
+
217
+ | EXEMPLE ( 2 entêtes ) :
218
+ | - 'X-My-Header: nothing fancy'
219
+ | - 'X-Another-Header: care not!'
220
+
221
+ **XNAY_GROUPS**
222
+ Les newsgroups, où une entête X-No-Arcive: YES doit être présent.
223
+ **ATTN** Depuis l'année 2024, cet entête n'a probablement plus de fonction.
224
+
225
+ CONTENU : Un trait d'union et un espace, puis une chaîne de caractères,
226
+ contenant le nom du groupe ou une expression.
227
+
228
+ PAR DÉFAUT : Vide
229
+
230
+ | EXEMPLE ( 1 groupe, 1 hiérarchie ) :
231
+ | - "alt.test"
232
+ | - "^news.*"
233
+
234
+
235
+ **DEBUG_LOG**
236
+ Le nom d'un fichier, qui va servir comme protocol. Si le nom d'un fichier
237
+ valide est donné, le protocol est activé. Laissez vide pour désactiver le
238
+ protocol.
239
+
240
+ | CONTENU : Le nom d'un fichier dont les droits permettent l'écriture.
241
+ | Il sera créé s'il n'existe pas encore et remplacé à chaque exécution
242
+ | du logiciel.
243
+
244
+ PAR DÉFAUT : Vide
245
+
246
+ EXEMPLE : '/tmp/a_log-file.txt'
247
+
248
+ **LOG LEVEL**
249
+ Un de debug, fatal, error, info, warn
250
+
251
+ | EXEMPLE :
252
+ | LOG_LEVEL: 'debug'
253
+
254
+ **REFERENCES_SEPARATOR**
255
+ Un symbole ou une séquence de symboles qui marquent la fin du corps du message
256
+ et le début d'une liste de « références » ou « notes de pied de page ». Il
257
+ apparaîtra seulement, si le message contient du text marqué pour servir comme
258
+ note de pied de page. À voir *REFERENCES_DELIMITER* ci-dessous.
259
+
260
+ Si l'option n'est pas défini ou vide, la liste suit à la dernière ligne du
261
+ corps du message, sans séparation supplémentaire.
262
+
263
+ CONTENU : Un symbol ou séquence de symboles entre guillemets " " ou ' '.
264
+
265
+ PAR DÉFAUT : Vide
266
+
267
+ EXEMPLE : '---------'
268
+
269
+ **REFERENCES_DELIMITER**
270
+ Une séquence d'au moins deux symboles qui marque le début d'un text qui sera
271
+ transformé en note de pied de page ( ou référence ). La **séquence inversée**
272
+ doit marquer la fin du même fragment de text. La présence de cette séquence
273
+ dans le message d'origine, a comme conséquence que le text marqué sera déplacé
274
+ vers la fin, au-dessous du corps du message.
275
+ Si *REFERENCES_SEPARATOR* ( option ci-dessus ) est défini, il va séparer le message
276
+ de la liste des notes du pied de page.
277
+
278
+ Laissez ce champs vide pour éviter la création des noted du pied de page.
279
+
280
+ CONTENU : Une séquence de symboles entre guillemets ( '' )
281
+
282
+ PAR DÉFAUT : Vide
283
+
284
+ EXEMPLE: '%?'
285
+
286
+ **REFERENCE_FORMAT**
287
+ Une chaîne de formatage, contenant %s pour représenter une nombre, qui
288
+ remplace le texte d'une future note du pied de page dans le corps du message.
289
+
290
+ PAR DÉFAUT : " %s)" -> devient 1) ... 2) ... 3)
291
+
292
+ EXEMPLE : "(%s)" -> devient (1) ... (2) ... (3)
293
+
294
+ **VFY_URLS**
295
+ Une constante booléen. Elle détermine si le programme doit essayer de corriger
296
+ des URIs. Même si les URIs sont identifiables, seulement quelques manipulations
297
+ sont temptées :
298
+
299
+ * '<' et '>' sont ajoutés, si manquants
300
+ * "news:" est ajouté au début des références à d'autres articles
301
+ * Des slashes sont insérés, s'ils manquent après "http(s):"
302
+
303
+ ATTN! Le programme ne peut pas différencier entre "mailto:" et "news:". Si ni l'un
304
+ ni l'autre est donné, mais '@' est présent, "news:" est ajouté automatiquement.
305
+
306
+ Si la variable n'est pas défini, la valeur 'yes' est présumée.
307
+
308
+ CONTENU: Un de YES, yes, NO, no, et autres tels variations
309
+
310
+ PAR DÉFAUT: yes
311
+
312
+ EXEMPLE: No
313
+
314
+ **OVERRIDE_CONFIG**
315
+ Une constante booléenne. Vous pouvez décider d'ignorer les options
316
+ suivantes avant qu'un article est posté :
317
+ GROUP_SIGS, XNAY_GROUPS, CUSTOM_HEADERS, VFY_URLS et DEBUG_LOG.
318
+ Un dialogue peut être affiché, qui permet la désactivation de chacune de ces
319
+ options. Les valeurs par défaut, définis pour flnews, vont donc prévaloir.
320
+
321
+ ATTN ! En poussant Esc ou le bouton « Annuler » du dialogue, vous interrompez
322
+ le programme et flnews ne va rien envoyer.
323
+
324
+ Notez la valeur 'no', 'NO' ou pareil pour désactiver le dialogue.
325
+
326
+ PAR DÉFAUT : yes
327
+
328
+ EXEMPLE: No
329
+
330
+ Autres Informations
331
+ ===================
332
+
333
+ Tester
334
+ ------
335
+ L'effet qu'aura l'exécution du programme peut être vérifié de deux manières :
336
+
337
+ 1. En fournissant un article, sauvegardé auparavant dans un fichier :
338
+
339
+ **:~$ /usr/local/bin/[post-processor] < [test-article]**
340
+
341
+ Ceci va vous présenter la nouvelle version de l'article sur l'écran, mais
342
+ vous pouvez aussi diriger le résultat dans un autre fichier. C'est une
343
+ excellente technique pour tester un logiciel pendant le développement ou
344
+ votre configuration avant que vous vous en servez.
345
+
346
+ 2. En envoyant un message directement dans un groupe de test ( comme alt.test,
347
+ fr.test ou similaires ).
348
+ Ceci est obligatoire avant que vous postez dans des groupes thématiques et
349
+ si les réglages du post-traitement vont modifier l'article.
350
+
351
+ Code source
352
+ -----------
353
+ Le fichier flnews_post_proc.gem, que vous recevez à l'aide de l'outil *gem* ou
354
+ directement du site *rubygems.org*, contient tout le code source du logiciel et
355
+ de la documentation ( cette page notamment ). Pour lire le code du logiciel,
356
+ vous devez
357
+
358
+ 1. utiliser *tar -xf flnews_post_proc-[version].gem*
359
+ 2. décomprimer l'archive data.gz : *gunzip data.gz*
360
+ 3. Extraire le contenu du fichier résultant « data.tar » :
361
+ *tar -xf data.tar*
362
+
363
+ À la fin les répertoires bin, doc et lib seront créés.
364
+
365
+ License
366
+ -------
367
+ flnews_post_proc est distribué sous les conditions de la WTFPL-2.0 ou plus
368
+ récent ( À voir http://www.wtfpl.net/txt/copying/ ou license-text dans le
369
+ répertoire « doc » de la gem ).
370
+
371
+ Auteur
372
+ ------
373
+ | flnews_post_proc a été développé par
374
+ | Michael Uplawski <michael.uplawski@uplawski.eu>
375
+
376
+ Ω
377
+ ==
@@ -0,0 +1,170 @@
1
+ #!/bin/env ruby
2
+ #encoding: UTF-8
3
+ =begin
4
+ /***************************************************************************
5
+ * 2023-2024, Michael Uplawski <michael.uplawski@uplawski.eu> *
6
+ * This program is free software; you can redistribute it and/or modify *
7
+ * it under the terms of the WTFPL 2.0 or later, see *
8
+ * http://www.wtfpl.net/about/ *
9
+ * *
10
+ * This program is distributed in the hope that it will be useful, *
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
13
+ * *
14
+ ***************************************************************************/
15
+ =end
16
+
17
+ #
18
+ # Simplified logging.
19
+ # See example code at the bottom of this file.
20
+ # Execute this file to see the output.
21
+ module BasicLogging
22
+
23
+ DEBUG = 0
24
+ INFO = 1
25
+ WARN = 2
26
+ ERROR = 3
27
+ FATAL = 4
28
+ UNKNOWN = nil
29
+
30
+ # this is mainly for the translation of method calls into log levels
31
+ Levels = {:debug => DEBUG, :info => INFO, :warn => WARN, :error => ERROR,
32
+ :fatal => FATAL, :unknown => UNKNOWN}
33
+
34
+ @@log_level = UNKNOWN
35
+ @@target = STDOUT
36
+ @@muted = []
37
+
38
+ # do not log, if caller is obj (class or instance)
39
+ def self.mute(obj)
40
+ name = obj.class == Class ? obj.name.dup : obj.class.name
41
+ @@muted << name
42
+ end
43
+
44
+ def self.is_muted?(obj)
45
+ name = obj.class == Class ? obj.name.dup : obj.class.name
46
+ @@muted.include?(name)
47
+ end
48
+
49
+ # set the log level
50
+ def set_level(lv)
51
+ if lv.respond_to?(:to_str)
52
+ lv = Levels[lv.to_sym]
53
+ end
54
+
55
+ if(!lv || (lv.respond_to?(:to_int) && lv >= DEBUG && lv <= FATAL) )
56
+ @@log_level = lv
57
+ else
58
+ STDERR.puts __FILE__.dup << ": ERROR : invalid log level \"" << lv.to_s << "\""
59
+ STDERR.puts "Keepinng old log level " << Levels.keys.detect {| k| Levels[k] == @@log_level}.to_s
60
+ end
61
+ end
62
+
63
+ # set the log target
64
+ def set_target(tg)
65
+ if !tg || tg.strip.empty?
66
+ @@target = nil
67
+ elsif tg.respond_to?(:to_io)
68
+ @@target = tg
69
+ elsif(!File::exist?(tg) || ( File.file?(tg) && File.writable?(tg) ) )
70
+ @@target = File.open(tg, 'w+')
71
+ else
72
+ STDERR.puts __FILE__.dup << ': ERROR : target ' << tg << ' cannot be set'
73
+ STDERR.puts "Keeping old target " << @@target.inspect
74
+ return
75
+ end
76
+ end
77
+
78
+ # Output of log messages, depending on the log level set for the calling class
79
+ # and the name of the alias method which is actually called.
80
+ def log(message)
81
+ if !BasicLogging.is_muted?(self)
82
+ # how has this method been called?
83
+ mlevel = __callee__
84
+ if Levels.has_key?(mlevel) && Levels[mlevel] <= FATAL
85
+ # output only for levels equal or above the value that corresponds to
86
+ # the calling alias.
87
+ format_log( message, mlevel) if @@log_level && Levels[mlevel] >= @@log_level
88
+ else
89
+ STDERR.puts __FILE__.dup << ": ERROR : invalid log level \"" << mlevel.to_s << "\""
90
+ end
91
+ end
92
+ end
93
+
94
+ alias :debug :log
95
+ alias :info :log
96
+ alias :warn :log
97
+ alias :error :log
98
+ alias :fatal :log
99
+
100
+ attr_reader :target, :log_level
101
+
102
+ private
103
+
104
+ # 1 format_log for all loggers.
105
+ def format_log(message, mlevel)
106
+ if @@target
107
+ # indicate if a registered class or the registered object of a class is calling.
108
+ name = self.class == Class ? self.name.dup << ' [class]' : self.class.name
109
+ @@target.puts '' << name << ' ' << mlevel.to_s << ' ' << Time.now.strftime("%H:%M:%S:%6N") << ': ' << message.gsub("\n", "\n |")
110
+ end
111
+ end
112
+ end
113
+ #---------test: execute file----------
114
+ if $0 == __FILE__
115
+ Array.extend(BasicLogging)
116
+ Array.set_level(BasicLogging::INFO)
117
+ Array.info('TEST')
118
+ ar = Array.new
119
+ ar.extend(BasicLogging)
120
+ # --- no output :
121
+ l = __LINE__
122
+ ar.debug(l.next.to_s << ': debug-test 0')
123
+ # output
124
+ ar.set_level(BasicLogging::DEBUG)
125
+ l = __LINE__
126
+ ar.debug(l.next.to_s << ': debug-test 1')
127
+
128
+ obj = Object.new
129
+ obj.extend(BasicLogging)
130
+ obj.set_level(BasicLogging::DEBUG)
131
+ puts "--------debug-----------"
132
+ obj.debug('debug')
133
+ obj.info('info')
134
+ obj.warn('warn')
135
+ obj.error('error')
136
+ obj.fatal('fatal')
137
+ puts "--------info-----------"
138
+ obj.set_level("info")
139
+ obj.debug('debug')
140
+ obj.info('info')
141
+ obj.warn('warn')
142
+ obj.error('error')
143
+ obj.fatal('fatal')
144
+ puts "--------fatal-----------"
145
+ obj.set_level("fatal")
146
+ obj.debug('debug')
147
+ obj.info('info')
148
+ obj.warn('warn')
149
+ obj.error('error')
150
+ obj.fatal('fatal')
151
+ puts "--------UNKNOWN-----------"
152
+ obj.set_level(nil)
153
+ obj.debug('debug')
154
+ obj.info('info')
155
+ obj.warn('warn')
156
+ obj.error('error')
157
+ obj.fatal('fatal')
158
+ puts " ------ Output into file ----"
159
+ obj.set_target "/tmp/test_log.log"
160
+ puts " ------ INFO -----------"
161
+ obj.set_level BasicLogging::INFO
162
+ obj.info('info output')
163
+
164
+ obj.info('info output 2')
165
+ puts "---------- invalid -------"
166
+ obj.set_target "/dev/sr0"
167
+ obj.set_level "power"
168
+ end
169
+
170
+ # EOF