framework_gem 0.1.0

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.
Files changed (872) hide show
  1. checksums.yaml +7 -0
  2. data/lib/EXECUTION_ENGINE.md +282 -0
  3. data/lib/Gemfile +12 -0
  4. data/lib/README.md +138 -0
  5. data/lib/User_Lib/helpers/helpers.rb +13 -0
  6. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_black_rois.rb +7 -0
  7. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_color_rois.rb +9 -0
  8. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_image_rois.rb +7 -0
  9. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_rois.rb +23 -0
  10. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_text_rois.rb +48 -0
  11. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_video_rois.rb +11 -0
  12. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_black_rois.rb +7 -0
  13. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_color_rois.rb +7 -0
  14. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_image_rois.rb +7 -0
  15. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_rois.rb +23 -0
  16. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_text_rois.rb +7 -0
  17. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_video_rois.rb +11 -0
  18. data/lib/User_Lib/rois/apple_tv/apple_tv_black_rois.rb +7 -0
  19. data/lib/User_Lib/rois/apple_tv/apple_tv_color_rois.rb +7 -0
  20. data/lib/User_Lib/rois/apple_tv/apple_tv_image_rois.rb +7 -0
  21. data/lib/User_Lib/rois/apple_tv/apple_tv_rois.rb +23 -0
  22. data/lib/User_Lib/rois/apple_tv/apple_tv_text_rois.rb +7 -0
  23. data/lib/User_Lib/rois/apple_tv/apple_tv_video_rois.rb +7 -0
  24. data/lib/User_Lib/rois/black_rois.rb +33 -0
  25. data/lib/User_Lib/rois/color_rois.rb +38 -0
  26. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_black_rois.rb +8 -0
  27. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_color_rois.rb +8 -0
  28. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_image_rois.rb +8 -0
  29. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_rois.rb +26 -0
  30. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_text_rois.rb +8 -0
  31. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_video_rois.rb +8 -0
  32. data/lib/User_Lib/rois/dta/dta_720/dta_720_black_rois.rb +8 -0
  33. data/lib/User_Lib/rois/dta/dta_720/dta_720_color_rois.rb +8 -0
  34. data/lib/User_Lib/rois/dta/dta_720/dta_720_image_rois.rb +8 -0
  35. data/lib/User_Lib/rois/dta/dta_720/dta_720_rois.rb +26 -0
  36. data/lib/User_Lib/rois/dta/dta_720/dta_720_text_rois.rb +8 -0
  37. data/lib/User_Lib/rois/dta/dta_720/dta_720_video_rois.rb +8 -0
  38. data/lib/User_Lib/rois/dta/dta_black_rois.rb +9 -0
  39. data/lib/User_Lib/rois/dta/dta_color_rois.rb +9 -0
  40. data/lib/User_Lib/rois/dta/dta_image_rois.rb +9 -0
  41. data/lib/User_Lib/rois/dta/dta_rois.rb +26 -0
  42. data/lib/User_Lib/rois/dta/dta_text_rois.rb +9 -0
  43. data/lib/User_Lib/rois/dta/dta_video_rois.rb +9 -0
  44. data/lib/User_Lib/rois/image_rois.rb +38 -0
  45. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_black_rois.rb +8 -0
  46. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_color_rois.rb +8 -0
  47. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_image_rois.rb +8 -0
  48. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_rois.rb +26 -0
  49. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_text_rois.rb +8 -0
  50. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_video_rois.rb +8 -0
  51. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_black_rois.rb +8 -0
  52. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_color_rois.rb +8 -0
  53. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_image_rois.rb +8 -0
  54. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_rois.rb +26 -0
  55. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_text_rois.rb +8 -0
  56. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_video_rois.rb +8 -0
  57. data/lib/User_Lib/rois/mdn/mdn_black_rois.rb +9 -0
  58. data/lib/User_Lib/rois/mdn/mdn_color_rois.rb +9 -0
  59. data/lib/User_Lib/rois/mdn/mdn_image_rois.rb +9 -0
  60. data/lib/User_Lib/rois/mdn/mdn_rois.rb +26 -0
  61. data/lib/User_Lib/rois/mdn/mdn_text_rois.rb +13 -0
  62. data/lib/User_Lib/rois/mdn/mdn_video_rois.rb +9 -0
  63. data/lib/User_Lib/rois/mobile/android/android_black_rois.rb +8 -0
  64. data/lib/User_Lib/rois/mobile/android/android_color_rois.rb +8 -0
  65. data/lib/User_Lib/rois/mobile/android/android_image_rois.rb +8 -0
  66. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_black_rois.rb +8 -0
  67. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_color_rois.rb +8 -0
  68. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_image_rois.rb +43 -0
  69. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_rois.rb +22 -0
  70. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_text_rois.rb +8 -0
  71. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_video_rois.rb +8 -0
  72. data/lib/User_Lib/rois/mobile/android/android_rois.rb +22 -0
  73. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_black_rois.rb +8 -0
  74. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_color_rois.rb +8 -0
  75. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_image_rois.rb +54 -0
  76. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_rois.rb +22 -0
  77. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_text_rois.rb +8 -0
  78. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_video_rois.rb +8 -0
  79. data/lib/User_Lib/rois/mobile/android/android_text_rois.rb +8 -0
  80. data/lib/User_Lib/rois/mobile/android/android_video_rois.rb +8 -0
  81. data/lib/User_Lib/rois/mobile/ios/ios_black_rois.rb +8 -0
  82. data/lib/User_Lib/rois/mobile/ios/ios_color_rois.rb +8 -0
  83. data/lib/User_Lib/rois/mobile/ios/ios_image_rois.rb +8 -0
  84. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_black_rois.rb +8 -0
  85. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_color_rois.rb +8 -0
  86. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_image_rois.rb +8 -0
  87. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_rois.rb +22 -0
  88. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_text_rois.rb +8 -0
  89. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_video_rois.rb +8 -0
  90. data/lib/User_Lib/rois/mobile/ios/ios_rois.rb +22 -0
  91. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_black_rois.rb +8 -0
  92. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_color_rois.rb +8 -0
  93. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_image_rois.rb +8 -0
  94. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_rois.rb +22 -0
  95. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_text_rois.rb +8 -0
  96. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_video_rois.rb +8 -0
  97. data/lib/User_Lib/rois/mobile/ios/ios_text_rois.rb +8 -0
  98. data/lib/User_Lib/rois/mobile/ios/ios_video_rois.rb +8 -0
  99. data/lib/User_Lib/rois/mobile/mobile_black_rois.rb +8 -0
  100. data/lib/User_Lib/rois/mobile/mobile_color_rois.rb +12 -0
  101. data/lib/User_Lib/rois/mobile/mobile_image_rois.rb +38 -0
  102. data/lib/User_Lib/rois/mobile/mobile_rois.rb +22 -0
  103. data/lib/User_Lib/rois/mobile/mobile_text_rois.rb +8 -0
  104. data/lib/User_Lib/rois/mobile/mobile_video_rois.rb +8 -0
  105. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_black_rois.rb +7 -0
  106. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_color_rois.rb +9 -0
  107. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_image_rois.rb +7 -0
  108. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_rois.rb +23 -0
  109. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_text_rois.rb +8 -0
  110. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_video_rois.rb +8 -0
  111. data/lib/User_Lib/rois/passport/passport_720/passport_720_black_rois.rb +7 -0
  112. data/lib/User_Lib/rois/passport/passport_720/passport_720_color_rois.rb +7 -0
  113. data/lib/User_Lib/rois/passport/passport_720/passport_720_image_rois.rb +7 -0
  114. data/lib/User_Lib/rois/passport/passport_720/passport_720_rois.rb +23 -0
  115. data/lib/User_Lib/rois/passport/passport_720/passport_720_text_rois.rb +7 -0
  116. data/lib/User_Lib/rois/passport/passport_720/passport_720_video_rois.rb +7 -0
  117. data/lib/User_Lib/rois/passport/passport_black_rois.rb +7 -0
  118. data/lib/User_Lib/rois/passport/passport_color_rois.rb +7 -0
  119. data/lib/User_Lib/rois/passport/passport_image_rois.rb +7 -0
  120. data/lib/User_Lib/rois/passport/passport_rois.rb +23 -0
  121. data/lib/User_Lib/rois/passport/passport_text_rois.rb +7 -0
  122. data/lib/User_Lib/rois/passport/passport_video_rois.rb +7 -0
  123. data/lib/User_Lib/rois/rois.rb +22 -0
  124. data/lib/User_Lib/rois/roku/roku_720/roku_720_black_rois.rb +37 -0
  125. data/lib/User_Lib/rois/roku/roku_720/roku_720_color_rois.rb +336 -0
  126. data/lib/User_Lib/rois/roku/roku_720/roku_720_image_rois.rb +235 -0
  127. data/lib/User_Lib/rois/roku/roku_720/roku_720_rois.rb +23 -0
  128. data/lib/User_Lib/rois/roku/roku_720/roku_720_text_rois.rb +1523 -0
  129. data/lib/User_Lib/rois/roku/roku_720/roku_720_video_rois.rb +32 -0
  130. data/lib/User_Lib/rois/roku/roku_black_rois.rb +14 -0
  131. data/lib/User_Lib/rois/roku/roku_color_rois.rb +9 -0
  132. data/lib/User_Lib/rois/roku/roku_image_rois.rb +13 -0
  133. data/lib/User_Lib/rois/roku/roku_rois.rb +23 -0
  134. data/lib/User_Lib/rois/roku/roku_text_rois.rb +9 -0
  135. data/lib/User_Lib/rois/roku/roku_video_rois.rb +9 -0
  136. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_black_rois.rb +12 -0
  137. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_color_rois.rb +11 -0
  138. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_image_rois.rb +12 -0
  139. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_rois.rb +23 -0
  140. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_text_rois.rb +12 -0
  141. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_video_rois.rb +12 -0
  142. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_black_rois.rb +12 -0
  143. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_color_rois.rb +12 -0
  144. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_image_rois.rb +12 -0
  145. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_rois.rb +23 -0
  146. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_text_rois.rb +12 -0
  147. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_video_rois.rb +12 -0
  148. data/lib/User_Lib/rois/roku_tv/roku_tv_black_rois.rb +12 -0
  149. data/lib/User_Lib/rois/roku_tv/roku_tv_color_rois.rb +12 -0
  150. data/lib/User_Lib/rois/roku_tv/roku_tv_image_rois.rb +12 -0
  151. data/lib/User_Lib/rois/roku_tv/roku_tv_rois.rb +23 -0
  152. data/lib/User_Lib/rois/roku_tv/roku_tv_text_rois.rb +12 -0
  153. data/lib/User_Lib/rois/roku_tv/roku_tv_video_rois.rb +12 -0
  154. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_black_rois.rb +13 -0
  155. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_color_rois.rb +29 -0
  156. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_image_rois.rb +9 -0
  157. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_rois.rb +23 -0
  158. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_text_rois.rb +92 -0
  159. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_video_rois.rb +11 -0
  160. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_black_rois.rb +9 -0
  161. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_color_rois.rb +9 -0
  162. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_image_rois.rb +9 -0
  163. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_rois.rb +23 -0
  164. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_text_rois.rb +12 -0
  165. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_video_rois.rb +11 -0
  166. data/lib/User_Lib/rois/samsung_tv/samsung_tv_black_rois.rb +9 -0
  167. data/lib/User_Lib/rois/samsung_tv/samsung_tv_color_rois.rb +9 -0
  168. data/lib/User_Lib/rois/samsung_tv/samsung_tv_image_rois.rb +9 -0
  169. data/lib/User_Lib/rois/samsung_tv/samsung_tv_rois.rb +23 -0
  170. data/lib/User_Lib/rois/samsung_tv/samsung_tv_text_rois.rb +12 -0
  171. data/lib/User_Lib/rois/samsung_tv/samsung_tv_video_rois.rb +9 -0
  172. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_black_rois.rb +8 -0
  173. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_color_rois.rb +8 -0
  174. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_image_rois.rb +8 -0
  175. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_rois.rb +26 -0
  176. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_text_rois.rb +8 -0
  177. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_video_rois.rb +8 -0
  178. data/lib/User_Lib/rois/sara/sara_720/sara_720_black_rois.rb +8 -0
  179. data/lib/User_Lib/rois/sara/sara_720/sara_720_color_rois.rb +8 -0
  180. data/lib/User_Lib/rois/sara/sara_720/sara_720_image_rois.rb +8 -0
  181. data/lib/User_Lib/rois/sara/sara_720/sara_720_rois.rb +26 -0
  182. data/lib/User_Lib/rois/sara/sara_720/sara_720_text_rois.rb +8 -0
  183. data/lib/User_Lib/rois/sara/sara_720/sara_720_video_rois.rb +8 -0
  184. data/lib/User_Lib/rois/sara/sara_black_rois.rb +9 -0
  185. data/lib/User_Lib/rois/sara/sara_color_rois.rb +9 -0
  186. data/lib/User_Lib/rois/sara/sara_image_rois.rb +9 -0
  187. data/lib/User_Lib/rois/sara/sara_rois.rb +26 -0
  188. data/lib/User_Lib/rois/sara/sara_text_rois.rb +9 -0
  189. data/lib/User_Lib/rois/sara/sara_video_rois.rb +9 -0
  190. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_black_rois.rb +9 -0
  191. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_color_rois.rb +17 -0
  192. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_image_rois.rb +19 -0
  193. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_rois.rb +23 -0
  194. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_text_rois.rb +47 -0
  195. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_video_rois.rb +23 -0
  196. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_black_rois.rb +9 -0
  197. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_color_rois.rb +9 -0
  198. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_image_rois.rb +9 -0
  199. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_rois.rb +23 -0
  200. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_text_rois.rb +17 -0
  201. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_video_rois.rb +11 -0
  202. data/lib/User_Lib/rois/stb/iguide/iguide_black_rois.rb +9 -0
  203. data/lib/User_Lib/rois/stb/iguide/iguide_color_rois.rb +9 -0
  204. data/lib/User_Lib/rois/stb/iguide/iguide_image_rois.rb +9 -0
  205. data/lib/User_Lib/rois/stb/iguide/iguide_rois.rb +23 -0
  206. data/lib/User_Lib/rois/stb/iguide/iguide_text_rois.rb +9 -0
  207. data/lib/User_Lib/rois/stb/iguide/iguide_video_rois.rb +9 -0
  208. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_black_rois.rb +8 -0
  209. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_color_rois.rb +8 -0
  210. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_image_rois.rb +12 -0
  211. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_rois.rb +23 -0
  212. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_text_rois.rb +23 -0
  213. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_video_rois.rb +11 -0
  214. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_black_rois.rb +46 -0
  215. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_color_rois.rb +142 -0
  216. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_image_rois.rb +103 -0
  217. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_black_rois.rb +6 -0
  218. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_color_rois.rb +6 -0
  219. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_image_rois.rb +6 -0
  220. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_rois.rb +23 -0
  221. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_text_rois.rb +7 -0
  222. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_video_rois.rb +7 -0
  223. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_rois.rb +23 -0
  224. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_black_rois.rb +6 -0
  225. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_color_rois.rb +6 -0
  226. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_image_rois.rb +6 -0
  227. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_rois.rb +23 -0
  228. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_text_rois.rb +7 -0
  229. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_video_rois.rb +7 -0
  230. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_black_rois.rb +6 -0
  231. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_color_rois.rb +77 -0
  232. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_image_rois.rb +67 -0
  233. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_rois.rb +23 -0
  234. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_text_rois.rb +159 -0
  235. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_video_rois.rb +17 -0
  236. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_text_rois.rb +221 -0
  237. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_video_rois.rb +26 -0
  238. data/lib/User_Lib/rois/stb/odn/odn_black_rois.rb +10 -0
  239. data/lib/User_Lib/rois/stb/odn/odn_color_rois.rb +10 -0
  240. data/lib/User_Lib/rois/stb/odn/odn_image_rois.rb +58 -0
  241. data/lib/User_Lib/rois/stb/odn/odn_rois.rb +23 -0
  242. data/lib/User_Lib/rois/stb/odn/odn_text_rois.rb +70 -0
  243. data/lib/User_Lib/rois/stb/odn/odn_video_rois.rb +19 -0
  244. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_black_rois.rb +16 -0
  245. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_color_rois.rb +373 -0
  246. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_black_rois.rb +7 -0
  247. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_color_rois.rb +7 -0
  248. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_image_rois.rb +7 -0
  249. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_rois.rb +23 -0
  250. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_text_rois.rb +7 -0
  251. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_video_rois.rb +7 -0
  252. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_black_rois.rb +8 -0
  253. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_color_rois.rb +8 -0
  254. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_image_rois.rb +8 -0
  255. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_rois.rb +26 -0
  256. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_text_rois.rb +8 -0
  257. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_video_rois.rb +8 -0
  258. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_black_rois.rb +8 -0
  259. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_color_rois.rb +8 -0
  260. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_image_rois.rb +8 -0
  261. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_rois.rb +26 -0
  262. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_text_rois.rb +8 -0
  263. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_video_rois.rb +8 -0
  264. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_black_rois.rb +8 -0
  265. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_color_rois.rb +8 -0
  266. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_image_rois.rb +8 -0
  267. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_rois.rb +26 -0
  268. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_text_rois.rb +8 -0
  269. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_video_rois.rb +8 -0
  270. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_image_rois.rb +1592 -0
  271. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_black_rois.rb +7 -0
  272. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_color_rois.rb +7 -0
  273. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_image_rois.rb +7 -0
  274. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_rois.rb +23 -0
  275. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_text_rois.rb +7 -0
  276. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_video_rois.rb +7 -0
  277. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_rois.rb +23 -0
  278. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_text_rois.rb +2489 -0
  279. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_video_rois.rb +64 -0
  280. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_black_rois.rb +7 -0
  281. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_color_rois.rb +63 -0
  282. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_black_rois.rb +8 -0
  283. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_color_rois.rb +8 -0
  284. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_image_rois.rb +8 -0
  285. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_rois.rb +26 -0
  286. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_text_rois.rb +8 -0
  287. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_video_rois.rb +8 -0
  288. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_black_rois.rb +8 -0
  289. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_color_rois.rb +8 -0
  290. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_image_rois.rb +8 -0
  291. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_rois.rb +26 -0
  292. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_text_rois.rb +8 -0
  293. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_video_rois.rb +8 -0
  294. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_black_rois.rb +8 -0
  295. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_color_rois.rb +8 -0
  296. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_image_rois.rb +8 -0
  297. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_rois.rb +26 -0
  298. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_text_rois.rb +8 -0
  299. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_video_rois.rb +8 -0
  300. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_image_rois.rb +117 -0
  301. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_rois.rb +23 -0
  302. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_text_rois.rb +84 -0
  303. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_video_rois.rb +35 -0
  304. data/lib/User_Lib/rois/stb/spectrum/spectrum_black_rois.rb +9 -0
  305. data/lib/User_Lib/rois/stb/spectrum/spectrum_color_rois.rb +17 -0
  306. data/lib/User_Lib/rois/stb/spectrum/spectrum_image_rois.rb +49 -0
  307. data/lib/User_Lib/rois/stb/spectrum/spectrum_rois.rb +23 -0
  308. data/lib/User_Lib/rois/stb/spectrum/spectrum_text_rois.rb +51 -0
  309. data/lib/User_Lib/rois/stb/spectrum/spectrum_video_rois.rb +9 -0
  310. data/lib/User_Lib/rois/stb/stb_black_rois.rb +9 -0
  311. data/lib/User_Lib/rois/stb/stb_color_rois.rb +9 -0
  312. data/lib/User_Lib/rois/stb/stb_image_rois.rb +9 -0
  313. data/lib/User_Lib/rois/stb/stb_rois.rb +23 -0
  314. data/lib/User_Lib/rois/stb/stb_text_rois.rb +9 -0
  315. data/lib/User_Lib/rois/stb/stb_video_rois.rb +9 -0
  316. data/lib/User_Lib/rois/template.txt +23 -0
  317. data/lib/User_Lib/rois/text_rois.rb +36 -0
  318. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_black_rois.rb +7 -0
  319. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_color_rois.rb +9 -0
  320. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_image_rois.rb +7 -0
  321. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_rois.rb +23 -0
  322. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_text_rois.rb +9 -0
  323. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_video_rois.rb +7 -0
  324. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_black_rois.rb +7 -0
  325. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_color_rois.rb +7 -0
  326. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_image_rois.rb +7 -0
  327. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_rois.rb +23 -0
  328. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_text_rois.rb +7 -0
  329. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_video_rois.rb +7 -0
  330. data/lib/User_Lib/rois/tivo/tivo_black_rois.rb +7 -0
  331. data/lib/User_Lib/rois/tivo/tivo_color_rois.rb +7 -0
  332. data/lib/User_Lib/rois/tivo/tivo_image_rois.rb +7 -0
  333. data/lib/User_Lib/rois/tivo/tivo_rois.rb +23 -0
  334. data/lib/User_Lib/rois/tivo/tivo_text_rois.rb +7 -0
  335. data/lib/User_Lib/rois/tivo/tivo_video_rois.rb +7 -0
  336. data/lib/User_Lib/rois/video_rois.rb +33 -0
  337. data/lib/User_Lib/screen/apple_tv/apple_tv_dvr.rb +25 -0
  338. data/lib/User_Lib/screen/apple_tv/apple_tv_guide.rb +25 -0
  339. data/lib/User_Lib/screen/apple_tv/apple_tv_library.rb +25 -0
  340. data/lib/User_Lib/screen/apple_tv/apple_tv_live_tv.rb +17 -0
  341. data/lib/User_Lib/screen/apple_tv/apple_tv_login.rb +24 -0
  342. data/lib/User_Lib/screen/apple_tv/apple_tv_main_menu.rb +25 -0
  343. data/lib/User_Lib/screen/apple_tv/apple_tv_mini_guide.rb +25 -0
  344. data/lib/User_Lib/screen/apple_tv/apple_tv_movies.rb +25 -0
  345. data/lib/User_Lib/screen/apple_tv/apple_tv_on_demand.rb +25 -0
  346. data/lib/User_Lib/screen/apple_tv/apple_tv_parental_controls.rb +25 -0
  347. data/lib/User_Lib/screen/apple_tv/apple_tv_product_page.rb +25 -0
  348. data/lib/User_Lib/screen/apple_tv/apple_tv_screen.rb +23 -0
  349. data/lib/User_Lib/screen/apple_tv/apple_tv_search.rb +31 -0
  350. data/lib/User_Lib/screen/apple_tv/apple_tv_settings.rb +25 -0
  351. data/lib/User_Lib/screen/apple_tv/apple_tv_tv_shows.rb +25 -0
  352. data/lib/User_Lib/screen/apple_tv/apple_tv_video_store.rb +25 -0
  353. data/lib/User_Lib/screen/dta/dta_dvr.rb +26 -0
  354. data/lib/User_Lib/screen/dta/dta_guide.rb +26 -0
  355. data/lib/User_Lib/screen/dta/dta_library.rb +26 -0
  356. data/lib/User_Lib/screen/dta/dta_live_tv.rb +26 -0
  357. data/lib/User_Lib/screen/dta/dta_log_in.rb +26 -0
  358. data/lib/User_Lib/screen/dta/dta_main_menu.rb +26 -0
  359. data/lib/User_Lib/screen/dta/dta_mini_guide.rb +26 -0
  360. data/lib/User_Lib/screen/dta/dta_movies.rb +26 -0
  361. data/lib/User_Lib/screen/dta/dta_on_demand.rb +26 -0
  362. data/lib/User_Lib/screen/dta/dta_parental_controls.rb +26 -0
  363. data/lib/User_Lib/screen/dta/dta_product_page.rb +26 -0
  364. data/lib/User_Lib/screen/dta/dta_screen.rb +24 -0
  365. data/lib/User_Lib/screen/dta/dta_search.rb +26 -0
  366. data/lib/User_Lib/screen/dta/dta_settings.rb +26 -0
  367. data/lib/User_Lib/screen/dta/dta_tv_shows.rb +26 -0
  368. data/lib/User_Lib/screen/dta/dta_video_store.rb +26 -0
  369. data/lib/User_Lib/screen/mdn/mdn_dvr.rb +26 -0
  370. data/lib/User_Lib/screen/mdn/mdn_guide.rb +26 -0
  371. data/lib/User_Lib/screen/mdn/mdn_library.rb +26 -0
  372. data/lib/User_Lib/screen/mdn/mdn_live_tv.rb +26 -0
  373. data/lib/User_Lib/screen/mdn/mdn_log_in.rb +26 -0
  374. data/lib/User_Lib/screen/mdn/mdn_main_menu.rb +26 -0
  375. data/lib/User_Lib/screen/mdn/mdn_mini_guide.rb +26 -0
  376. data/lib/User_Lib/screen/mdn/mdn_movies.rb +26 -0
  377. data/lib/User_Lib/screen/mdn/mdn_on_demand.rb +26 -0
  378. data/lib/User_Lib/screen/mdn/mdn_parental_controls.rb +26 -0
  379. data/lib/User_Lib/screen/mdn/mdn_product_page.rb +26 -0
  380. data/lib/User_Lib/screen/mdn/mdn_screen.rb +24 -0
  381. data/lib/User_Lib/screen/mdn/mdn_search.rb +26 -0
  382. data/lib/User_Lib/screen/mdn/mdn_settings.rb +26 -0
  383. data/lib/User_Lib/screen/mdn/mdn_tv_shows.rb +26 -0
  384. data/lib/User_Lib/screen/mdn/mdn_video_store.rb +26 -0
  385. data/lib/User_Lib/screen/mobile/android/android_devices.rb +35 -0
  386. data/lib/User_Lib/screen/mobile/android/android_dvr.rb +337 -0
  387. data/lib/User_Lib/screen/mobile/android/android_favorites.rb +164 -0
  388. data/lib/User_Lib/screen/mobile/android/android_guide.rb +256 -0
  389. data/lib/User_Lib/screen/mobile/android/android_live_tv.rb +372 -0
  390. data/lib/User_Lib/screen/mobile/android/android_login.rb +111 -0
  391. data/lib/User_Lib/screen/mobile/android/android_main_menu.rb +53 -0
  392. data/lib/User_Lib/screen/mobile/android/android_on_demand.rb +402 -0
  393. data/lib/User_Lib/screen/mobile/android/android_parental_controls.rb +73 -0
  394. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_dvr.rb +31 -0
  395. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_guide.rb +39 -0
  396. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_live_tv.rb +104 -0
  397. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_main_menu.rb +27 -0
  398. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_on_demand.rb +35 -0
  399. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_product_page.rb +7 -0
  400. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_search.rb +26 -0
  401. data/lib/User_Lib/screen/mobile/android/android_privacy_legal.rb +54 -0
  402. data/lib/User_Lib/screen/mobile/android/android_product_page.rb +484 -0
  403. data/lib/User_Lib/screen/mobile/android/android_screen.rb +56 -0
  404. data/lib/User_Lib/screen/mobile/android/android_search.rb +39 -0
  405. data/lib/User_Lib/screen/mobile/android/android_settings.rb +90 -0
  406. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_dvr.rb +58 -0
  407. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_guide.rb +24 -0
  408. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_live_tv.rb +24 -0
  409. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_main_menu.rb +19 -0
  410. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_on_demand.rb +16 -0
  411. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_product_page.rb +45 -0
  412. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_search.rb +14 -0
  413. data/lib/User_Lib/screen/mobile/devices_mobile.rb +53 -0
  414. data/lib/User_Lib/screen/mobile/dvr_mobile.rb +5 -0
  415. data/lib/User_Lib/screen/mobile/favorites_mobile.rb +5 -0
  416. data/lib/User_Lib/screen/mobile/guide_mobile.rb +5 -0
  417. data/lib/User_Lib/screen/mobile/ios/ios_devices.rb +43 -0
  418. data/lib/User_Lib/screen/mobile/ios/ios_dvr.rb +231 -0
  419. data/lib/User_Lib/screen/mobile/ios/ios_favorites.rb +79 -0
  420. data/lib/User_Lib/screen/mobile/ios/ios_guide.rb +53 -0
  421. data/lib/User_Lib/screen/mobile/ios/ios_live_tv.rb +413 -0
  422. data/lib/User_Lib/screen/mobile/ios/ios_login.rb +76 -0
  423. data/lib/User_Lib/screen/mobile/ios/ios_main_menu.rb +38 -0
  424. data/lib/User_Lib/screen/mobile/ios/ios_on_demand.rb +371 -0
  425. data/lib/User_Lib/screen/mobile/ios/ios_parental_controls.rb +104 -0
  426. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_dvr.rb +14 -0
  427. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_live_tv.rb +36 -0
  428. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_main_menu.rb +7 -0
  429. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_on_demand.rb +7 -0
  430. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_search.rb +13 -0
  431. data/lib/User_Lib/screen/mobile/ios/ios_privacy_legal.rb +56 -0
  432. data/lib/User_Lib/screen/mobile/ios/ios_product_page.rb +441 -0
  433. data/lib/User_Lib/screen/mobile/ios/ios_screen.rb +60 -0
  434. data/lib/User_Lib/screen/mobile/ios/ios_search.rb +145 -0
  435. data/lib/User_Lib/screen/mobile/ios/ios_settings.rb +34 -0
  436. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_live_tv.rb +34 -0
  437. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_main_menu.rb +7 -0
  438. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_on_demand.rb +7 -0
  439. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_search.rb +13 -0
  440. data/lib/User_Lib/screen/mobile/live_tv_mobile.rb +73 -0
  441. data/lib/User_Lib/screen/mobile/login_mobile.rb +5 -0
  442. data/lib/User_Lib/screen/mobile/main_menu_mobile.rb +83 -0
  443. data/lib/User_Lib/screen/mobile/mobile_screen.rb +232 -0
  444. data/lib/User_Lib/screen/mobile/on_demand_mobile.rb +70 -0
  445. data/lib/User_Lib/screen/mobile/parental_controls_mobile.rb +5 -0
  446. data/lib/User_Lib/screen/mobile/privacy_legal_mobile.rb +5 -0
  447. data/lib/User_Lib/screen/mobile/product_page_mobile.rb +5 -0
  448. data/lib/User_Lib/screen/mobile/search_mobile.rb +5 -0
  449. data/lib/User_Lib/screen/mobile/settings_mobile.rb +33 -0
  450. data/lib/User_Lib/screen/passport/passport_dvr.rb +25 -0
  451. data/lib/User_Lib/screen/passport/passport_guide.rb +37 -0
  452. data/lib/User_Lib/screen/passport/passport_library.rb +25 -0
  453. data/lib/User_Lib/screen/passport/passport_live_tv.rb +17 -0
  454. data/lib/User_Lib/screen/passport/passport_main_menu.rb +25 -0
  455. data/lib/User_Lib/screen/passport/passport_mini_guide.rb +25 -0
  456. data/lib/User_Lib/screen/passport/passport_movies.rb +25 -0
  457. data/lib/User_Lib/screen/passport/passport_on_demand.rb +25 -0
  458. data/lib/User_Lib/screen/passport/passport_parental_controls.rb +25 -0
  459. data/lib/User_Lib/screen/passport/passport_product_page.rb +25 -0
  460. data/lib/User_Lib/screen/passport/passport_screen.rb +23 -0
  461. data/lib/User_Lib/screen/passport/passport_search.rb +25 -0
  462. data/lib/User_Lib/screen/passport/passport_settings.rb +25 -0
  463. data/lib/User_Lib/screen/passport/passport_tv_shows.rb +25 -0
  464. data/lib/User_Lib/screen/passport/passport_video_store.rb +25 -0
  465. data/lib/User_Lib/screen/roku/brs/roku_guide_brs.rb +12 -0
  466. data/lib/User_Lib/screen/roku/brs/roku_home_brs.rb +12 -0
  467. data/lib/User_Lib/screen/roku/brs/roku_live_tv_brs.rb +12 -0
  468. data/lib/User_Lib/screen/roku/brs/roku_login_brs.rb +103 -0
  469. data/lib/User_Lib/screen/roku/brs/roku_main_menu_brs.rb +46 -0
  470. data/lib/User_Lib/screen/roku/brs/roku_on_demand_brs.rb +12 -0
  471. data/lib/User_Lib/screen/roku/brs/roku_product_page_brs.rb +12 -0
  472. data/lib/User_Lib/screen/roku/brs/roku_screen_brs.rb +9 -0
  473. data/lib/User_Lib/screen/roku/brs/roku_search_brs.rb +12 -0
  474. data/lib/User_Lib/screen/roku/brs/roku_settings_brs.rb +42 -0
  475. data/lib/User_Lib/screen/roku/brs/roku_watch_later_brs.rb +12 -0
  476. data/lib/User_Lib/screen/roku/brs/roku_welcome_brs.rb +12 -0
  477. data/lib/User_Lib/screen/roku/roku_dvr.rb +7 -0
  478. data/lib/User_Lib/screen/roku/roku_guide.rb +590 -0
  479. data/lib/User_Lib/screen/roku/roku_home.rb +346 -0
  480. data/lib/User_Lib/screen/roku/roku_library.rb +26 -0
  481. data/lib/User_Lib/screen/roku/roku_live_tv.rb +210 -0
  482. data/lib/User_Lib/screen/roku/roku_login.rb +795 -0
  483. data/lib/User_Lib/screen/roku/roku_main_menu.rb +425 -0
  484. data/lib/User_Lib/screen/roku/roku_mini_guide.rb +7 -0
  485. data/lib/User_Lib/screen/roku/roku_on_demand.rb +479 -0
  486. data/lib/User_Lib/screen/roku/roku_product_page.rb +483 -0
  487. data/lib/User_Lib/screen/roku/roku_screen.rb +85 -0
  488. data/lib/User_Lib/screen/roku/roku_search.rb +229 -0
  489. data/lib/User_Lib/screen/roku/roku_settings.rb +304 -0
  490. data/lib/User_Lib/screen/roku/roku_watch_later.rb +51 -0
  491. data/lib/User_Lib/screen/roku/roku_welcome.rb +10 -0
  492. data/lib/User_Lib/screen/roku_tv/roku_tv_dvr.rb +14 -0
  493. data/lib/User_Lib/screen/roku_tv/roku_tv_guide.rb +14 -0
  494. data/lib/User_Lib/screen/roku_tv/roku_tv_home.rb +14 -0
  495. data/lib/User_Lib/screen/roku_tv/roku_tv_library.rb +14 -0
  496. data/lib/User_Lib/screen/roku_tv/roku_tv_live_tv.rb +14 -0
  497. data/lib/User_Lib/screen/roku_tv/roku_tv_login.rb +14 -0
  498. data/lib/User_Lib/screen/roku_tv/roku_tv_main_menu.rb +14 -0
  499. data/lib/User_Lib/screen/roku_tv/roku_tv_mini_guide.rb +14 -0
  500. data/lib/User_Lib/screen/roku_tv/roku_tv_on_demand.rb +26 -0
  501. data/lib/User_Lib/screen/roku_tv/roku_tv_product_page.rb +14 -0
  502. data/lib/User_Lib/screen/roku_tv/roku_tv_screen.rb +7 -0
  503. data/lib/User_Lib/screen/roku_tv/roku_tv_search.rb +14 -0
  504. data/lib/User_Lib/screen/roku_tv/roku_tv_settings.rb +14 -0
  505. data/lib/User_Lib/screen/roku_tv/roku_tv_watch_later.rb +14 -0
  506. data/lib/User_Lib/screen/roku_tv/roku_tv_welcome.rb +14 -0
  507. data/lib/User_Lib/screen/samsung_tv/samsung_tv_dvr.rb +24 -0
  508. data/lib/User_Lib/screen/samsung_tv/samsung_tv_guide.rb +24 -0
  509. data/lib/User_Lib/screen/samsung_tv/samsung_tv_library.rb +24 -0
  510. data/lib/User_Lib/screen/samsung_tv/samsung_tv_live_tv.rb +21 -0
  511. data/lib/User_Lib/screen/samsung_tv/samsung_tv_login.rb +13 -0
  512. data/lib/User_Lib/screen/samsung_tv/samsung_tv_main_menu.rb +64 -0
  513. data/lib/User_Lib/screen/samsung_tv/samsung_tv_mini_guide.rb +24 -0
  514. data/lib/User_Lib/screen/samsung_tv/samsung_tv_movies.rb +140 -0
  515. data/lib/User_Lib/screen/samsung_tv/samsung_tv_on_demand.rb +76 -0
  516. data/lib/User_Lib/screen/samsung_tv/samsung_tv_parental_controls.rb +24 -0
  517. data/lib/User_Lib/screen/samsung_tv/samsung_tv_product_page.rb +24 -0
  518. data/lib/User_Lib/screen/samsung_tv/samsung_tv_screen.rb +74 -0
  519. data/lib/User_Lib/screen/samsung_tv/samsung_tv_search.rb +29 -0
  520. data/lib/User_Lib/screen/samsung_tv/samsung_tv_settings.rb +189 -0
  521. data/lib/User_Lib/screen/samsung_tv/samsung_tv_tv_shows.rb +24 -0
  522. data/lib/User_Lib/screen/samsung_tv/samsung_tv_video_store.rb +24 -0
  523. data/lib/User_Lib/screen/sara/sara_dvr.rb +26 -0
  524. data/lib/User_Lib/screen/sara/sara_guide.rb +43 -0
  525. data/lib/User_Lib/screen/sara/sara_library.rb +26 -0
  526. data/lib/User_Lib/screen/sara/sara_live_tv.rb +26 -0
  527. data/lib/User_Lib/screen/sara/sara_log_in.rb +26 -0
  528. data/lib/User_Lib/screen/sara/sara_main_menu.rb +26 -0
  529. data/lib/User_Lib/screen/sara/sara_mini_guide.rb +26 -0
  530. data/lib/User_Lib/screen/sara/sara_movies.rb +26 -0
  531. data/lib/User_Lib/screen/sara/sara_on_demand.rb +26 -0
  532. data/lib/User_Lib/screen/sara/sara_parental_controls.rb +26 -0
  533. data/lib/User_Lib/screen/sara/sara_product_page.rb +26 -0
  534. data/lib/User_Lib/screen/sara/sara_screen.rb +24 -0
  535. data/lib/User_Lib/screen/sara/sara_search.rb +26 -0
  536. data/lib/User_Lib/screen/sara/sara_settings.rb +26 -0
  537. data/lib/User_Lib/screen/sara/sara_tv_shows.rb +26 -0
  538. data/lib/User_Lib/screen/sara/sara_video_store.rb +26 -0
  539. data/lib/User_Lib/screen/stb/iguide/iguide_devices.rb +10 -0
  540. data/lib/User_Lib/screen/stb/iguide/iguide_dvr.rb +10 -0
  541. data/lib/User_Lib/screen/stb/iguide/iguide_favorites.rb +10 -0
  542. data/lib/User_Lib/screen/stb/iguide/iguide_guide.rb +39 -0
  543. data/lib/User_Lib/screen/stb/iguide/iguide_home.rb +10 -0
  544. data/lib/User_Lib/screen/stb/iguide/iguide_library.rb +10 -0
  545. data/lib/User_Lib/screen/stb/iguide/iguide_live_tv.rb +59 -0
  546. data/lib/User_Lib/screen/stb/iguide/iguide_login.rb +10 -0
  547. data/lib/User_Lib/screen/stb/iguide/iguide_main_menu.rb +10 -0
  548. data/lib/User_Lib/screen/stb/iguide/iguide_mini_guide.rb +10 -0
  549. data/lib/User_Lib/screen/stb/iguide/iguide_movies.rb +10 -0
  550. data/lib/User_Lib/screen/stb/iguide/iguide_on_demand.rb +531 -0
  551. data/lib/User_Lib/screen/stb/iguide/iguide_parental_controls.rb +10 -0
  552. data/lib/User_Lib/screen/stb/iguide/iguide_privacy_legal.rb +10 -0
  553. data/lib/User_Lib/screen/stb/iguide/iguide_product_page.rb +10 -0
  554. data/lib/User_Lib/screen/stb/iguide/iguide_quick_menu.rb +7 -0
  555. data/lib/User_Lib/screen/stb/iguide/iguide_screen.rb +21 -0
  556. data/lib/User_Lib/screen/stb/iguide/iguide_search.rb +10 -0
  557. data/lib/User_Lib/screen/stb/iguide/iguide_settings.rb +10 -0
  558. data/lib/User_Lib/screen/stb/iguide/iguide_tv_shows.rb +10 -0
  559. data/lib/User_Lib/screen/stb/iguide/iguide_video_store.rb +10 -0
  560. data/lib/User_Lib/screen/stb/login_stb.rb +5 -0
  561. data/lib/User_Lib/screen/stb/odn/odn_dvr.rb +59 -0
  562. data/lib/User_Lib/screen/stb/odn/odn_favorites.rb +8 -0
  563. data/lib/User_Lib/screen/stb/odn/odn_guide.rb +177 -0
  564. data/lib/User_Lib/screen/stb/odn/odn_live_tv.rb +115 -0
  565. data/lib/User_Lib/screen/stb/odn/odn_login.rb +8 -0
  566. data/lib/User_Lib/screen/stb/odn/odn_main_menu.rb +175 -0
  567. data/lib/User_Lib/screen/stb/odn/odn_on_demand.rb +1170 -0
  568. data/lib/User_Lib/screen/stb/odn/odn_on_demand_kids.rb +23 -0
  569. data/lib/User_Lib/screen/stb/odn/odn_on_demand_left_menu.rb +180 -0
  570. data/lib/User_Lib/screen/stb/odn/odn_parental_controls.rb +9 -0
  571. data/lib/User_Lib/screen/stb/odn/odn_product_page.rb +8 -0
  572. data/lib/User_Lib/screen/stb/odn/odn_screen.rb +111 -0
  573. data/lib/User_Lib/screen/stb/odn/odn_search.rb +167 -0
  574. data/lib/User_Lib/screen/stb/odn/odn_settings.rb +142 -0
  575. data/lib/User_Lib/screen/stb/spectrum/spectrum_diagnostics.rb +27 -0
  576. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/screen_spectrum_docsis.rb +12 -0
  577. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_guide.rb +10 -0
  578. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_main_menu.rb +10 -0
  579. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_settings.rb +10 -0
  580. data/lib/User_Lib/screen/stb/spectrum/spectrum_dvr.rb +1781 -0
  581. data/lib/User_Lib/screen/stb/spectrum/spectrum_guide.rb +841 -0
  582. data/lib/User_Lib/screen/stb/spectrum/spectrum_library.rb +384 -0
  583. data/lib/User_Lib/screen/stb/spectrum/spectrum_live_tv.rb +259 -0
  584. data/lib/User_Lib/screen/stb/spectrum/spectrum_main_menu.rb +223 -0
  585. data/lib/User_Lib/screen/stb/spectrum/spectrum_mini_guide.rb +404 -0
  586. data/lib/User_Lib/screen/stb/spectrum/spectrum_movies.rb +420 -0
  587. data/lib/User_Lib/screen/stb/spectrum/spectrum_netflix.rb +37 -0
  588. data/lib/User_Lib/screen/stb/spectrum/spectrum_on_demand.rb +2137 -0
  589. data/lib/User_Lib/screen/stb/spectrum/spectrum_parental_controls.rb +528 -0
  590. data/lib/User_Lib/screen/stb/spectrum/spectrum_pay_per_view.rb +26 -0
  591. data/lib/User_Lib/screen/stb/spectrum/spectrum_product_page.rb +58 -0
  592. data/lib/User_Lib/screen/stb/spectrum/spectrum_screen.rb +48 -0
  593. data/lib/User_Lib/screen/stb/spectrum/spectrum_search.rb +92 -0
  594. data/lib/User_Lib/screen/stb/spectrum/spectrum_settings.rb +1657 -0
  595. data/lib/User_Lib/screen/stb/spectrum/spectrum_tv_shows.rb +1532 -0
  596. data/lib/User_Lib/screen/stb/spectrum/spectrum_video_store.rb +1598 -0
  597. data/lib/User_Lib/screen/stb/stb_screen.rb +7 -0
  598. data/lib/User_Lib/screen/tivo/tivo_dvr.rb +25 -0
  599. data/lib/User_Lib/screen/tivo/tivo_guide.rb +25 -0
  600. data/lib/User_Lib/screen/tivo/tivo_library.rb +25 -0
  601. data/lib/User_Lib/screen/tivo/tivo_live_tv.rb +17 -0
  602. data/lib/User_Lib/screen/tivo/tivo_login.rb +25 -0
  603. data/lib/User_Lib/screen/tivo/tivo_main_menu.rb +25 -0
  604. data/lib/User_Lib/screen/tivo/tivo_mini_guide.rb +25 -0
  605. data/lib/User_Lib/screen/tivo/tivo_movies.rb +25 -0
  606. data/lib/User_Lib/screen/tivo/tivo_on_demand.rb +25 -0
  607. data/lib/User_Lib/screen/tivo/tivo_parental_controls.rb +25 -0
  608. data/lib/User_Lib/screen/tivo/tivo_product_page.rb +25 -0
  609. data/lib/User_Lib/screen/tivo/tivo_screen.rb +20 -0
  610. data/lib/User_Lib/screen/tivo/tivo_search.rb +31 -0
  611. data/lib/User_Lib/screen/tivo/tivo_settings.rb +25 -0
  612. data/lib/User_Lib/screen/tivo/tivo_tv_shows.rb +25 -0
  613. data/lib/User_Lib/screen/tivo/tivo_video_store.rb +25 -0
  614. data/lib/config/ConfigParams.xml +96 -0
  615. data/lib/config/ImageROI.xml +45 -0
  616. data/lib/config/ROI.xml +150 -0
  617. data/lib/config/Userlog4j.xml +62 -0
  618. data/lib/config/schema-docs/mode.xsd +12 -0
  619. data/lib/config/schema-docs/processTestJobs.xsd +63 -0
  620. data/lib/config/schema-docs/rackip.xsd +24 -0
  621. data/lib/copy_ref_images.rb +199 -0
  622. data/lib/copy_repo.rb +136 -0
  623. data/lib/diagnostics/conductor/conductor_checkup.tmc +24 -0
  624. data/lib/diagnostics/db/mad_db_check.tmc +56 -0
  625. data/lib/diagnostics/db/mas_db_checkup.tmc +24 -0
  626. data/lib/diagnostics/db/mas_db_checkup_gem.tmc +20 -0
  627. data/lib/diagnostics/db/mas_db_checkup_jar.tmc +50 -0
  628. data/lib/diagnostics/iguide/iguide_nvram_reset.tmc +23 -0
  629. data/lib/diagnostics/iguide/iguide_prepare_stb.tmc +33 -0
  630. data/lib/diagnostics/iguide/iguide_prepare_stb_and_health_check.tmc +63 -0
  631. data/lib/diagnostics/iguide/iguide_stb_health_check.tmc +54 -0
  632. data/lib/diagnostics/prepare_stb.tmc +30 -0
  633. data/lib/diagnostics/prepare_stb_and_health_check.tmc +56 -0
  634. data/lib/diagnostics/script_options/options_checkup.tmc +145 -0
  635. data/lib/diagnostics/server_components_check.tmc +62 -0
  636. data/lib/diagnostics/ssh/dncs_checkup.tmc +24 -0
  637. data/lib/diagnostics/ssh/mas_checkup.tmc +24 -0
  638. data/lib/diagnostics/stb_health_check.tmc +46 -0
  639. data/lib/diagnostics/stb_ip_check.tmc +120 -0
  640. data/lib/diagnostics/webservices/mas_rest_services_checkup.tmc +24 -0
  641. data/lib/diagnostics/webservices/mas_soap_services_checkup.tmc +24 -0
  642. data/lib/dsllib/common/dncs/dncs_utils.rb +449 -0
  643. data/lib/dsllib/common/mas_db/mas_conductor.rb +1328 -0
  644. data/lib/dsllib/common/mas_db/mas_db.rb +154 -0
  645. data/lib/dsllib/common/mas_db/mas_publish.rb +2349 -0
  646. data/lib/dsllib/common/mas_db/mas_rest_services.rb +75 -0
  647. data/lib/dsllib/common/mas_db/mas_soap_services.rb +540 -0
  648. data/lib/dsllib/common/mas_db/mas_utils.rb +422 -0
  649. data/lib/dsllib/common/remote_diagnostics/mdn_remote_diagnostics.rb +1335 -0
  650. data/lib/dsllib/common/remote_diagnostics/odn_web_server.rb +269 -0
  651. data/lib/dsllib/common/utils/excel_export.rb +273 -0
  652. data/lib/dsllib/common/utils/excel_module.rb +890 -0
  653. data/lib/dsllib/common/utils/server_components_utils.rb +130 -0
  654. data/lib/dsllib/common/utils/stb_health_check_utils.rb +92 -0
  655. data/lib/dsllib/common/utils/sword_utils.rb +393 -0
  656. data/lib/dsllib/common/utils/tmc_utils.rb +2944 -0
  657. data/lib/dsllib/common/utils/virtual_keyboard_navigator.rb +208 -0
  658. data/lib/dsllib/common/utils/virtual_keyboard_vp_navigator.rb +195 -0
  659. data/lib/dsllib/performance/DTA/roi.rb +214 -0
  660. data/lib/dsllib/performance/DTA/utils.rb +96 -0
  661. data/lib/dsllib/performance/iguide_concurrent_test/ROI.rb +236 -0
  662. data/lib/dsllib/performance/iguide_concurrent_test/utils.rb +533 -0
  663. data/lib/dsllib/performance/measure_tune.rb +438 -0
  664. data/lib/dsllib/performance/perf_lib.rb +660 -0
  665. data/lib/end_iteration.rb +4 -0
  666. data/lib/lib/data_services/channel.rb +39 -0
  667. data/lib/lib/data_services/data_services.rb +14 -0
  668. data/lib/lib/data_services/guide.rb +104 -0
  669. data/lib/lib/data_services/lineup.rb +114 -0
  670. data/lib/lib/data_services/program.rb +48 -0
  671. data/lib/lib/data_services/schedule.rb +18 -0
  672. data/lib/lib/data_services/splunk_connector.rb +135 -0
  673. data/lib/lib/data_services/splunk_data_reader.rb +77 -0
  674. data/lib/lib/element/element.rb +79 -0
  675. data/lib/lib/extensions/array_extensions.rb +32 -0
  676. data/lib/lib/extensions/datetime_extensions.rb +8 -0
  677. data/lib/lib/extensions/extensions.rb +51 -0
  678. data/lib/lib/extensions/file_extensions.rb +32 -0
  679. data/lib/lib/extensions/float_extensions.rb +32 -0
  680. data/lib/lib/extensions/integer_extensions.rb +39 -0
  681. data/lib/lib/extensions/nethttp_extensions.rb +11 -0
  682. data/lib/lib/extensions/object_extensions.rb +7 -0
  683. data/lib/lib/extensions/string_extensions.rb +35 -0
  684. data/lib/lib/helpers/tmc_helpers/csv_helper/csv_helper.rb +85 -0
  685. data/lib/lib/helpers/tmc_helpers/email_helper/email_helper.rb +71 -0
  686. data/lib/lib/helpers/tmc_helpers/http_helper/http_helper.rb +133 -0
  687. data/lib/lib/helpers/tmc_helpers/roi_helper/roi_helper.rb +17 -0
  688. data/lib/lib/helpers/tmc_helpers/snmp_helper/snmp_helper.rb +71 -0
  689. data/lib/lib/helpers/tmc_helpers/ssh_helper/ssh_helper.rb +337 -0
  690. data/lib/lib/helpers/tmc_helpers/tmc_helpers.rb +1260 -0
  691. data/lib/lib/keyboard/apple_tv/apple_tv_password_keyboard.rb +102 -0
  692. data/lib/lib/keyboard/apple_tv/apple_tv_search_keyboard.rb +103 -0
  693. data/lib/lib/keyboard/apple_tv/apple_tv_username_keyboard.rb +105 -0
  694. data/lib/lib/keyboard/keyboard.rb +504 -0
  695. data/lib/lib/keyboard/keyboard_layout.rb +51 -0
  696. data/lib/lib/keyboard/roku/roku_reset_pin_keyboard.rb +12 -0
  697. data/lib/lib/keyboard/roku/roku_rsg_search_keyboard.rb +67 -0
  698. data/lib/lib/keyboard/roku/roku_rsg_signin_keyboard.rb +106 -0
  699. data/lib/lib/keyboard/roku/roku_search_keyboard.rb +10 -0
  700. data/lib/lib/keyboard/roku/roku_signin_keyboard.rb +42 -0
  701. data/lib/lib/keyboard/samsung_tv/samsung_tv_search_keyboard.rb +50 -0
  702. data/lib/lib/keyboard/samsung_tv/samsung_tv_signin_keyboard.rb +52 -0
  703. data/lib/lib/keyboard/stb/odn/odn_on_demand_search_keyboard.rb +10 -0
  704. data/lib/lib/keyboard/stb/odn/odn_search_keyboard.rb +10 -0
  705. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_email_keyboard.rb +50 -0
  706. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_keyboard.rb +43 -0
  707. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_name_keyboard.rb +16 -0
  708. data/lib/lib/keyboard/stb/spectrum/spectrum_search_keyboard.rb +32 -0
  709. data/lib/lib/keyboard/tivo/tivo_password_keyboard.rb +0 -0
  710. data/lib/lib/keyboard/tivo/tivo_search_keyboard.rb +0 -0
  711. data/lib/lib/keyboard/tivo/tivo_username_keyboard.rb +0 -0
  712. data/lib/lib/keys/apple_tv/apple_tv_keys.rb +26 -0
  713. data/lib/lib/keys/base_keys.rb +14 -0
  714. data/lib/lib/keys/dta/dta_keys.rb +60 -0
  715. data/lib/lib/keys/mdn/mdn_keys.rb +60 -0
  716. data/lib/lib/keys/passport/passport_keys.rb +59 -0
  717. data/lib/lib/keys/roku/roku_keys.rb +31 -0
  718. data/lib/lib/keys/roku_tv/roku_tv_keys.rb +32 -0
  719. data/lib/lib/keys/samsung_tv/samsung_tv_keys.rb +58 -0
  720. data/lib/lib/keys/sara/sara_keys.rb +60 -0
  721. data/lib/lib/keys/stb/iguide/iguide_keys.rb +56 -0
  722. data/lib/lib/keys/stb/odn/odn_keys.rb +63 -0
  723. data/lib/lib/keys/stb/spectrum/spectrum_keys.rb +59 -0
  724. data/lib/lib/keys/stb/stb_keys.rb +13 -0
  725. data/lib/lib/keys/tivo/tivo_keys.rb +26 -0
  726. data/lib/lib/logger/multi_io.rb +14 -0
  727. data/lib/lib/logger/tmc_dut_logger.rb +251 -0
  728. data/lib/lib/logger/tmc_logger.rb +30 -0
  729. data/lib/lib/mixins/assignable.rb +19 -0
  730. data/lib/lib/mixins/can_have_special_methods.rb +50 -0
  731. data/lib/lib/mixins/enumish.rb +16 -0
  732. data/lib/lib/new_platform.rb +302 -0
  733. data/lib/lib/new_sub_platform.rb +90 -0
  734. data/lib/lib/platform/apple_tv/apple_tv.rb +33 -0
  735. data/lib/lib/platform/apple_tv/apple_tv_1080/apple_tv_1080.rb +54 -0
  736. data/lib/lib/platform/apple_tv/apple_tv_720/apple_tv_720.rb +14 -0
  737. data/lib/lib/platform/dta/dta.rb +35 -0
  738. data/lib/lib/platform/dta/dta_1080/dta_1080.rb +15 -0
  739. data/lib/lib/platform/dta/dta_720/dta_720.rb +15 -0
  740. data/lib/lib/platform/mdn/mdn.rb +35 -0
  741. data/lib/lib/platform/mdn/mdn_1080/mdn_1080.rb +15 -0
  742. data/lib/lib/platform/mdn/mdn_720/mdn_720.rb +15 -0
  743. data/lib/lib/platform/mobile/android/android.rb +23 -0
  744. data/lib/lib/platform/mobile/android/android_phone/android_phone.rb +23 -0
  745. data/lib/lib/platform/mobile/android/android_tablet/android_tablet.rb +23 -0
  746. data/lib/lib/platform/mobile/ios/ios.rb +23 -0
  747. data/lib/lib/platform/mobile/ios/ios_phone/ios_phone.rb +23 -0
  748. data/lib/lib/platform/mobile/ios/ios_tablet/ios_tablet.rb +23 -0
  749. data/lib/lib/platform/mobile/mobile.rb +102 -0
  750. data/lib/lib/platform/passport/passport.rb +41 -0
  751. data/lib/lib/platform/passport/passport1080/passport_1080.rb +15 -0
  752. data/lib/lib/platform/passport/passport_720/passport_720.rb +14 -0
  753. data/lib/lib/platform/platform.rb +884 -0
  754. data/lib/lib/platform/roku/roku.rb +96 -0
  755. data/lib/lib/platform/roku/roku_720/roku_720.rb +16 -0
  756. data/lib/lib/platform/roku_tv/roku_tv.rb +33 -0
  757. data/lib/lib/platform/roku_tv/roku_tv_1080/roku_tv_1080.rb +14 -0
  758. data/lib/lib/platform/roku_tv/roku_tv_720/roku_tv_720.rb +14 -0
  759. data/lib/lib/platform/samsung_tv/samsung_tv.rb +31 -0
  760. data/lib/lib/platform/samsung_tv/samsung_tv_1080/samsung_tv_1080.rb +14 -0
  761. data/lib/lib/platform/samsung_tv/samsung_tv_720/samsung_tv_720.rb +14 -0
  762. data/lib/lib/platform/sara/sara.rb +42 -0
  763. data/lib/lib/platform/sara/sara_1080/sara_1080.rb +15 -0
  764. data/lib/lib/platform/sara/sara_720/sara_720.rb +15 -0
  765. data/lib/lib/platform/stb/iguide/iguide.rb +18 -0
  766. data/lib/lib/platform/stb/iguide/iguide_1080/iguide_1080.rb +14 -0
  767. data/lib/lib/platform/stb/iguide/iguide_720/iguide_720.rb +14 -0
  768. data/lib/lib/platform/stb/odn/odn.rb +480 -0
  769. data/lib/lib/platform/stb/odn/odn_1080/odn_1080.rb +14 -0
  770. data/lib/lib/platform/stb/odn/odn_720/odn_720.rb +14 -0
  771. data/lib/lib/platform/stb/odn/odn_720/odn_720_moto/odn_720_moto.rb +14 -0
  772. data/lib/lib/platform/stb/odn/odn_720/odn_720_sa/odn_720_sa.rb +14 -0
  773. data/lib/lib/platform/stb/odn/odn_720/odn_720_samsung/odn_720_samsung.rb +14 -0
  774. data/lib/lib/platform/stb/spectrum/spectrum.rb +48 -0
  775. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080.rb +14 -0
  776. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis.rb +16 -0
  777. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris.rb +15 -0
  778. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax.rb +15 -0
  779. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch.rb +15 -0
  780. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace.rb +14 -0
  781. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720.rb +14 -0
  782. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris.rb +15 -0
  783. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax.rb +15 -0
  784. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch.rb +15 -0
  785. data/lib/lib/platform/stb/stb.rb +93 -0
  786. data/lib/lib/platform/template.txt +16 -0
  787. data/lib/lib/platform/tivo/tivo.rb +28 -0
  788. data/lib/lib/platform/tivo/tivo_1080/tivo_1080.rb +15 -0
  789. data/lib/lib/platform/tivo/tivo_720/tivo_720.rb +14 -0
  790. data/lib/lib/platform/web/web.rb +51 -0
  791. data/lib/lib/platform_libs/roku/roku_controller.rb +254 -0
  792. data/lib/lib/prereqs/prereqs.rb +17 -0
  793. data/lib/lib/prereqs/prereqs_for_dut.rb +14 -0
  794. data/lib/lib/prereqs/prereqs_for_test.rb +14 -0
  795. data/lib/lib/remotes/remotes.rb +8 -0
  796. data/lib/lib/remotes/stb/spectrum/spectrum_remotes.rb +22 -0
  797. data/lib/lib/roi/black/black_roi.rb +125 -0
  798. data/lib/lib/roi/color/color_roi.rb +138 -0
  799. data/lib/lib/roi/image/image_roi.rb +187 -0
  800. data/lib/lib/roi/roi.rb +1064 -0
  801. data/lib/lib/roi/template_roi.txt +9 -0
  802. data/lib/lib/roi/text/text_roi.rb +187 -0
  803. data/lib/lib/roi/video/video_roi.rb +98 -0
  804. data/lib/lib/screen/screen.rb +183 -0
  805. data/lib/lib/screen/template.txt +7 -0
  806. data/lib/lib/screen/template_screen.txt +10 -0
  807. data/lib/lib/screens/apple_tv/apple_tv_screens.rb +44 -0
  808. data/lib/lib/screens/dta/dta_screens.rb +49 -0
  809. data/lib/lib/screens/mdn/mdn_screens.rb +49 -0
  810. data/lib/lib/screens/mobile/android/android_phone/android_phone_screens.rb +28 -0
  811. data/lib/lib/screens/mobile/android/android_screens.rb +40 -0
  812. data/lib/lib/screens/mobile/android/android_tablet/android_tablet_screens.rb +29 -0
  813. data/lib/lib/screens/mobile/ios/ios_phone/ios_phone_screens.rb +22 -0
  814. data/lib/lib/screens/mobile/ios/ios_screens.rb +39 -0
  815. data/lib/lib/screens/mobile/ios/ios_tablet/ios_tablet_screens.rb +20 -0
  816. data/lib/lib/screens/mobile/mobile_screens.rb +18 -0
  817. data/lib/lib/screens/passport/passport_screens.rb +42 -0
  818. data/lib/lib/screens/roku/roku_screens.rb +72 -0
  819. data/lib/lib/screens/roku_tv/roku_tv_screens.rb +43 -0
  820. data/lib/lib/screens/samsung_tv/samsung_tv_screens.rb +44 -0
  821. data/lib/lib/screens/sara/sara_screens.rb +49 -0
  822. data/lib/lib/screens/screens.rb +23 -0
  823. data/lib/lib/screens/stb/iguide/iguide_1080/iguide_1080_screens.rb +56 -0
  824. data/lib/lib/screens/stb/iguide/iguide_720/iguide_720_screens.rb +56 -0
  825. data/lib/lib/screens/stb/iguide/iguide_screens.rb +54 -0
  826. data/lib/lib/screens/stb/odn/odn_screens.rb +40 -0
  827. data/lib/lib/screens/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_screens.rb +18 -0
  828. data/lib/lib/screens/stb/spectrum/spectrum_screens.rb +48 -0
  829. data/lib/lib/screens/stb/stb_screens.rb +13 -0
  830. data/lib/lib/screens/template.txt +52 -0
  831. data/lib/lib/screens/tivo/tivo_screens.rb +44 -0
  832. data/lib/lib/selenium/appium/appium.rb +388 -0
  833. data/lib/lib/selenium/selenium.rb +466 -0
  834. data/lib/lib/selenium/webdriver/webdriver.rb +254 -0
  835. data/lib/lib/test_case/boilerplate/functional.rb +7 -0
  836. data/lib/lib/test_case/boilerplate/performance.rb +7 -0
  837. data/lib/lib/test_case/ci_test.rb +47 -0
  838. data/lib/lib/test_case/functional_test_case.rb +27 -0
  839. data/lib/lib/test_case/make_boilerplate.rb +32 -0
  840. data/lib/lib/test_case/monitoring/apple_monitor.rb +104 -0
  841. data/lib/lib/test_case/monitoring/base_monitor.rb +140 -0
  842. data/lib/lib/test_case/monitoring/dta_monitor.rb +53 -0
  843. data/lib/lib/test_case/monitoring/iguide_monitor.rb +72 -0
  844. data/lib/lib/test_case/monitoring/mdn_monitor.rb +28 -0
  845. data/lib/lib/test_case/monitoring/monitoring_test.rb +111 -0
  846. data/lib/lib/test_case/monitoring/odn_monitor.rb +137 -0
  847. data/lib/lib/test_case/monitoring/passport_monitor.rb +50 -0
  848. data/lib/lib/test_case/monitoring/report_monitor.rb +178 -0
  849. data/lib/lib/test_case/monitoring/roku_monitor.rb +102 -0
  850. data/lib/lib/test_case/monitoring/sara_monitor.rb +33 -0
  851. data/lib/lib/test_case/monitoring/spec_monitor.rb +154 -0
  852. data/lib/lib/test_case/performance_test_case.rb +29 -0
  853. data/lib/lib/test_case/test_case.rb +1055 -0
  854. data/lib/lib/test_case/test_error.rb +29 -0
  855. data/lib/lib/test_case/test_exception.rb +9 -0
  856. data/lib/lib/test_case/test_status.rb +39 -0
  857. data/lib/lib/test_case/test_step.rb +156 -0
  858. data/lib/lib/test_case/test_trace.rb +80 -0
  859. data/lib/lib/test_data.rb +222 -0
  860. data/lib/lib/test_wrapper.rb +146 -0
  861. data/lib/misc/get_latest_android.sh +14 -0
  862. data/lib/misc/get_latest_ios.sh +14 -0
  863. data/lib/package-lock.json +3 -0
  864. data/lib/run_test.rb +4 -0
  865. data/lib/script_validator.rb +48 -0
  866. data/lib/syntax_eval.rb +151 -0
  867. data/lib/tools/convert_old_scripts.rb +100 -0
  868. data/lib/tools/find_duplicate_rois.rb +27 -0
  869. data/lib/tools/roku/inspector.rb +130 -0
  870. data/lib/tools/syntax_checker.rb +83 -0
  871. data/lib/upload_ref_images.rb +255 -0
  872. metadata +912 -0
@@ -0,0 +1,422 @@
1
+ #Test automation script version# TA-5.5.mdn released time stamp: 12-03-12 14:40:20
2
+
3
+ require './dsllib/common/utils/tmc_utils'
4
+ require './dsllib/common/mas_db/mas_conductor'
5
+
6
+ # Use it to verify whether mas commmand line is working or not
7
+ # * *Returns* :
8
+ # - Returns true if successful, else false
9
+ def mas_command_line_accessible?
10
+ begin
11
+ loginfo2 "Execution mdiags command ...",false
12
+ result = exec_mas_cmd "mdiags"
13
+ return (result.downcase.include?('mystro diagnostics'))
14
+ rescue StandardError => e
15
+ loginfo2 "MAS command error : #{e.message}",false
16
+ return false
17
+ end
18
+ end
19
+
20
+ # Use it to change purchase pin from MAS
21
+ def change_purchase_pin_from_mas (purchase_pin='0000')
22
+ loginfo2 "Changing purchase pin to #{purchase_pin} from MAS"
23
+ mac_address = fetch_stb_mac_address
24
+ exec_mas_cmd "mdiags msg -m #{mac_address} purchasePINUpdate #{purchase_pin}"
25
+ loginfo2 "Purchase pin successfully changed"
26
+ end
27
+
28
+ # Use it to chnage parental control pin from MAS
29
+ def change_parental_control_pin_from_mas (parental_control_pin='0000')
30
+ loginfo2 "Chnaging parental control pin to #{parental_control_pin} from MAS"
31
+ mac_address = fetch_stb_mac_address
32
+ exec_mas_cmd "mdiags msg -m #{mac_address} parentalBlockPINUpdate #{parental_control_pin}"
33
+ loginfo2 "Parental control pin successfully changed"
34
+ end
35
+
36
+ # Use it to reset factory settings from MAS
37
+ def reset_factory_settings_from_mas
38
+ loginfo2 'Resetting factory settings'
39
+ mac_address = fetch_stb_mac_address
40
+ cmd = "mdiags msg -m #{mac_address} resetFactoryDefaults"
41
+ loginfo2 "Executing MAS command: #{cmd}"
42
+ exec_mas_cmd cmd
43
+ loginfo2 "Waiting for 10 minutes to let box boot up."
44
+ sleep 10.min
45
+ press_power_sleep if stb_standby?
46
+ loginfo2 "Box sucessfully reset"
47
+ end
48
+
49
+ # Use it to interrupt a streaming OD session
50
+ def interrupt_od_session_from_mas
51
+ loginfo2 'Interrupting streaming OD session'
52
+ mac_address = fetch_stb_mac_address
53
+ cmd = "mdiags od teardown terminal '#{mac_address}' -02"
54
+ loginfo2 "Executing MAS command: #{cmd}"
55
+ output = exec_mas_cmd(cmd)
56
+ logdebug output
57
+ if output.include?('Destroying sessions by terminal name')
58
+ loginfo2 "Streaming OD session interrupted successfully"
59
+ return true
60
+ end
61
+ return false
62
+ end
63
+
64
+ # Use it to list default items on Enhance Menu
65
+ def list_default_items_available_in_enhanced_menu
66
+ enhanced_menu_items = []
67
+ cmd = "cat /usr/local/mystro/conf/EnhancedMenuTemplate.xml | grep -i nodeName= | cut -f2 -d'=' | cut -f2 -d '\"'"
68
+ loginfo2 "Executing MAS command: #{cmd}"
69
+ result = exec_mas_cmd cmd
70
+ menu_items = result.gsub("\r", '').split("\n")
71
+ # Removed last line from the result as it contains the prompt
72
+ menu_items.pop
73
+ menu_items.each do |item|
74
+ if(item != '')
75
+ enhanced_menu_items.push item
76
+ end
77
+ end
78
+ return enhanced_menu_items
79
+ end
80
+
81
+ # Use it schedule rdvr events for a program
82
+ # * *Args* :
83
+ # - program -> program on which recording should be scheduled
84
+ # - recording_type -> either SERIES or SINGLE
85
+ # - num_of_episodes: [ ONE, THREE, FIVE, SEVEN, ALL ]
86
+ # - save_options: [ SAVE_UNTIL_USER_DELETES, SAVE_UNTIL_SPACE_IS_NEEDED ]
87
+ # - repeat_options:[ ONLY_NEW_AND_SELECTED_AIR_TIME, ALL_EPISODES_AND_SELECTED_AIR_TIME, ONLY_NEW_AND_ALL_AIRINGS, ALL_EPISODES_AND_ALL_AIRINGS ]
88
+ # - priority: [ MIN, MAX ]
89
+ # * *Returns* :
90
+ # - Returns true if successfully scheduled, else false
91
+ def schedule_rdvr_event_from_mas (program, recording_type='SINGLE', number_of_episodes='ONE', save_options='SAVE_UNTIL_SPACE_IS_NEEDED', repeat_options='ALL_EPISODES_AND_ALL_AIRINGS', adjust_start='0', adjust_stop='0', priority='MIN')
92
+ loginfo2 "Scheduling RDVR events from MAS"
93
+ mas_time_zone_diff = mas_conductor_time_zone_diff_in_min
94
+ mac_address = fetch_stb_mac_address
95
+
96
+ program_service_id = program[17]
97
+ program_event_id = program[15]
98
+ program_start_time = (program[2] - (mas_time_zone_diff*60)).to_i
99
+
100
+ cmd = "mdiags rdvr scheduleEvent #{mac_address} #{program_service_id} #{program_event_id} #{program_start_time} #{recording_type} numEpisodes=#{number_of_episodes} saveOptions=#{save_options} repeatOptions=#{repeat_options} adjustStart=#{adjust_start} adjustStop=#{adjust_stop} priority=#{priority}"
101
+ loginfo2 "Executing MAS command: #{cmd}"
102
+ result = exec_mas_cmd cmd
103
+ logdebug "RESULT: #{result}"
104
+ if result.include?('TimeoutException_Exception')
105
+ loginfo2 "Timeout while executing command"
106
+ return false
107
+ end
108
+ success_message = "message=SUCCESS"
109
+ output = /(?:OUTPUT:\s\{\s)(.*)\s\}/.match(result)[1]
110
+
111
+ if output.include? success_message
112
+ loginfo2 'RDVR events scheduled successfully from MAS'
113
+ return true
114
+ else
115
+ loginfo2 "Error occurred in scheduling RDVR events from MAS: #{output}"
116
+ return false
117
+ end
118
+ end
119
+
120
+ # Use it to clear NVRAM from MAS using commnad line
121
+ def clear_nvram_from_mas
122
+ loginfo2 "Clearing NVRAM from MAS"
123
+ mac_address = fetch_stb_mac_address
124
+ cmd = "mdiags msg clearClientNVRAM -m #{mac_address}"
125
+ loginfo2 "Executing MAS command: #{cmd}"
126
+ result = exec_mas_cmd cmd
127
+ sleep 1.min
128
+ loginfo2 "Cleared NVRAM from MAS"
129
+ end
130
+
131
+ # Use it to reset NVRAM from MAS using commnad line
132
+ def reset_nvram_from_mas
133
+ loginfo2 "Resetting NVRAM from MAS"
134
+ mac_address = fetch_stb_mac_address
135
+ cmd = "mdiags msg resetClientNVRAM -m #{mac_address}"
136
+ loginfo2 "Executing MAS command: #{cmd}"
137
+ result = exec_mas_cmd cmd
138
+ loginfo2 "Reseted NVRAM from MAS"
139
+ end
140
+
141
+ # Use it to verify if UMPGatewayRDVR.log has given request and response in last log
142
+ # * *Args* :
143
+ # - request_ary -> Array of requests to be verified
144
+ # - response_ary -> Array of response to be verified
145
+ # * *Returns* :
146
+ # - Returns true if successfully verified, else false
147
+ def mas_umpgatewayrdvr_log_include? request_ary=[], response_ary=[]
148
+ mac = fetch_stb_mac_address.to_s
149
+ mac_address = mac.delete(":")
150
+ loginfo2 "Mac address of this box is #{mac_address}"
151
+ command = "tail -1000 #{fetch_option(:mas_log_folder)}/UMPGatewayRDVR.log | grep #{mac_address} -A 30"
152
+ loginfo2 "Command #{command}."
153
+ mas_string = exec_mas_cmd(command).to_s
154
+ loginfo2 "MAS command output [#{mas_string}]"
155
+ splitted_log = mas_string.split(mac_address)
156
+ if splitted_log.length < 4
157
+ loginfo2 "Failed to get logs for this box"
158
+ return false
159
+ end
160
+ request = splitted_log[-4].downcase
161
+ response = splitted_log[-1].downcase
162
+ logdebug "Request arr : #{request_ary}, Response arr : #{response_ary}"
163
+ loginfo2 "Request string [#{request}], Response string [#{response}]"
164
+ request_ary.each{|req|
165
+ unless request.delete(' ').include?(req.downcase.delete(' '))
166
+ loginfo2 "Failed to verify request include [#{req}]"
167
+ return false
168
+ end
169
+ }
170
+ response_ary.each{|res|
171
+ unless response.delete(' ').include?(res.downcase.delete(' '))
172
+ loginfo2 "Failed to verify request include [#{res}]"
173
+ return false
174
+ end
175
+ }
176
+ loginfo2 "Successfully verified all response and requests"
177
+ return true
178
+ end
179
+
180
+ # Use it to verify if TerminalRegistration.log has last boot time greater than given time
181
+ # * *Args* :
182
+ # - time -> Array of requests to be verified
183
+ # - mac_address -> Array of response to be verified
184
+ # * *Returns* :
185
+ # - Returns true if successfully verified, else false
186
+ def mas_verify_last_reboot_time_greater_than time, mac = fetch_stb_mac_address.to_s
187
+
188
+ if mac.length == 12
189
+ mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
190
+ else
191
+ mac_address = mac
192
+ end
193
+ command = "tail -10000 #{fetch_option(:mas_log_folder)}/TerminalRegistration.log |grep #{mac_address}"
194
+ loginfo2 "Executing mas command [#{command}]"
195
+ mas_string = exec_mas_cmd(command).to_s
196
+ loginfo2 "MAS command output:#{mas_string}"
197
+ last_entry = mas_string.split(mac_address)[-1]
198
+ unless last_entry.include?('REBOOT_TIME')
199
+ loginfo2 'No entry found for this box'
200
+ return false
201
+ end
202
+
203
+ regex = Regexp.new(/(REBOOT_TIME=)(\d\d)(.)(\d\d)(.)(\d{4})(.)(\d\d)(.)(\d\d)(.)(\d\d)/)
204
+ #Regexp for reading date and time
205
+ matchdata = regex.match(last_entry)
206
+ unless matchdata
207
+ loginfo2 'Failed to get date and time of last entry in log'
208
+ return false
209
+ end
210
+ read_time = Time.local(matchdata[6],matchdata[2],matchdata[4],matchdata[8],matchdata[10],matchdata[12])
211
+ logdebug "Read time [#{read_time}], Boot time [#{time}]"
212
+
213
+ unless (read_time-time)>=0
214
+ loginfo2 "Failed to verify if last logged boot time is greater than given time"
215
+ return false
216
+ end
217
+
218
+ loginfo2 "Successfully verified that last logged boot time is greater than given time"
219
+ return true
220
+ end
221
+
222
+ # Use it schedule rdvr events for a program
223
+ # * *Args* :
224
+ # - program -> program on which recording should be scheduled
225
+ # - recording_type -> either SERIES or SINGLE
226
+ # - num_of_episodes: [ ONE, THREE, FIVE, SEVEN, ALL ]
227
+ # - save_options: [ SAVE_UNTIL_USER_DELETES, SAVE_UNTIL_SPACE_IS_NEEDED ]
228
+ # - repeat_options:[ ONLY_NEW_AND_SELECTED_AIR_TIME, ALL_EPISODES_AND_SELECTED_AIR_TIME, ONLY_NEW_AND_ALL_AIRINGS, ALL_EPISODES_AND_ALL_AIRINGS ]
229
+ # - priority: [ MIN, MAX ]
230
+ # * *Returns* :
231
+ # - Returns true if successfully scheduled, else false
232
+ def unschedule_rdvr_event_from_mas (program, recording_type='SINGLE')
233
+ loginfo2 "Scheduling RDVR events from MAS"
234
+ mas_time_zone_diff = mas_conductor_time_zone_diff_in_min
235
+ mac_address = fetch_stb_mac_address
236
+
237
+ program_service_id = program[17]
238
+ program_event_id = program[15]
239
+ program_start_time = (program[2] - (mas_time_zone_diff*60)).to_i
240
+
241
+ cmd = "mdiags rdvr unscheduleEvent #{mac_address} #{program_service_id} #{program_event_id} #{program_start_time} #{recording_type}"
242
+ loginfo2 "Executing MAS command: #{cmd}"
243
+ result = exec_mas_cmd cmd
244
+ logdebug "RESULT: #{result}"
245
+ if result.include?('TimeoutException_Exception')
246
+ loginfo2 "Timeout while executing command"
247
+ return false
248
+ end
249
+ success_message = "message=SUCCESS"
250
+ output = /(?:OUTPUT:\s\{\s)(.*)\s\}/.match(result)[1]
251
+
252
+ if output.include? success_message
253
+ loginfo2 'RDVR event unscheduled from MAS'
254
+ return true
255
+ else
256
+ loginfo2 "Error occurred in unscheduling RDVR events from MAS: #{output}"
257
+ return false
258
+ end
259
+ end
260
+
261
+ # Use it to verify if asset is purchased from mdiags
262
+ # * *Args* :
263
+ # - asset -> OD asset to verify
264
+ # - mac_addresses -> Array of mac address
265
+ # - whole_house_purchase: true if purchase is for all boxes
266
+ # * *Returns* :
267
+ # - Returns true if successfully verified, else false
268
+ def mas_verify_asset_purchased? asset, mac_addresses, whole_house_purchase = true
269
+ asset_id = asset[:id]
270
+ purchase_ids = []
271
+
272
+ mac_addresses.each do |mac|
273
+ if mac.length == 12
274
+ mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
275
+ else
276
+ mac_address = mac
277
+ end
278
+ command = "mdiags od r | grep #{asset_id} | grep #{mac_address}"
279
+ output = exec_mas_cmd(command)
280
+ if output.nil? or output.empty?
281
+ loginfo "The purchase for the asset #{asset[:title]} is not present for stb with mac #{mac}"
282
+ return false
283
+ end
284
+ regexp = /^(\d+)\s+(\d+).+'(.*)'\s+(\d+).*$/
285
+ matched = regexp.match(output)
286
+ if matched.nil?
287
+ loginfo2 "Purchase id not found"
288
+ return false
289
+ end
290
+ purchase_ids.push(matched[4])
291
+ end
292
+
293
+ if whole_house_purchase
294
+ return true if purchase_ids.uniq.length.eql?(1)
295
+ return false
296
+ end
297
+
298
+ return true
299
+ end
300
+
301
+ # Use it to start/stop On demad Application from MAS
302
+ # * *Args* :
303
+ # - +action+ -> start (to start OD application), stop (to stop OD application)
304
+ # * *Returns* :
305
+ # - true if ondemad application started or stopped successfully, false otherwise
306
+ def mas_start_stop_on_demand_application(action = 'start')
307
+ begin
308
+ mas_ip = fetch_option(:mas_server_ip)
309
+ mas_prompt = fetch_option(:mas_server_prompt)
310
+ mas_username = fetch_option(:mas_username)
311
+ mas_password = fetch_option(:mas_password)
312
+ pmclient_prompt = "procmgr>"
313
+
314
+ req_queued_status = lock_resource('MAS', 'OD', LOCK_EXCLUSIVE | LOCK_ONETIME, '', 60.min, 10.min) {
315
+ opened = false
316
+ open_interactive_ssh(mas_ip, 22, mas_prompt, mas_username, mas_password)
317
+ opened = true
318
+
319
+ result1 = exec_interactive_ssh(pmclient_prompt, "pmclient")
320
+ logdebug "MAS Command Result1 : #{result1}"
321
+
322
+ command = "#{action} 20"
323
+ result2 = exec_interactive_ssh(pmclient_prompt, command)
324
+ logdebug "MAS Command Result2 : #{result2}"
325
+ loginfo2 "On Demand Application stopped"
326
+
327
+ result3 = exec_interactive_ssh(mas_prompt, "q")
328
+ logdebug "MAS Command Result3 : #{result3}"
329
+ }
330
+
331
+ if req_queued_status == -1
332
+ loginfo2 "Someone is stuck with OD lock for more than 10 minutes. Aborting..."
333
+ return false
334
+ end
335
+ return true
336
+ rescue StandardError => e
337
+ loginfo2 e.message
338
+ loginfo2 'Unable to start/stop On Demand application'
339
+ return false
340
+ ensure
341
+ close_interactive_ssh if opened
342
+ end
343
+ end
344
+
345
+ # Use it to fetch ODN binary logs from STB on MAS
346
+ # * *Args* :
347
+ # - +ip_addr+ -> ip address of the stb
348
+ # * *Returns* :
349
+ # - true if logs fetched else false
350
+ def mas_fetch_odn_binary_logs_from_stb(ip_addr = fetch_ip)
351
+ begin
352
+ return false if ip_addr.nil?
353
+
354
+ mas_ip = fetch_option(:mas_server_ip)
355
+ mas_prompt = fetch_option(:mas_server_prompt)
356
+ mas_username = fetch_option(:mas_username)
357
+ mas_password = fetch_option(:mas_password)
358
+
359
+ opened = false
360
+ open_interactive_ssh(mas_ip, 22, mas_prompt, mas_username, mas_password)
361
+ opened = true
362
+
363
+ begin
364
+ logdebug "Running script to fetch ODN Binary logs..."
365
+ result3 = exec_interactive_ssh(mas_prompt, "/usr/local/mystro/scripts/ODNscripts/MAS_ODNBinaryLogs #{ip_addr}")
366
+ logdebug "Output: #{result3}"
367
+ rescue StandardError => e
368
+ logdebug e.to_s
369
+ logdebug "Still fetching ODN binary logs..."
370
+ opened = false
371
+ end
372
+ close_interactive_ssh if opened
373
+
374
+ log_fetched = false
375
+ 10.times do
376
+ opened = false
377
+ open_interactive_ssh(mas_ip, 22, mas_prompt, mas_username, mas_password)
378
+ opened = true
379
+ result5 = exec_interactive_ssh(mas_prompt, "ls *#{ip_addr}* | grep -i zip")
380
+ logdebug "Output: #{result5}"
381
+
382
+ unless result5.to_s.include?('ODNBinaryLogs')
383
+ logdebug "Still fetching logs from STB... Will try again in 3 minutes."
384
+ close_interactive_ssh if opened
385
+ sleep 3.min
386
+ else
387
+ logdebug "ODN binary logs fetched from STB"
388
+ log_fetched = true
389
+ break
390
+ end
391
+ end
392
+ return false unless log_fetched
393
+
394
+ result6 = exec_interactive_ssh(mas_prompt, "ls -t | grep '#{ip_addr}'")
395
+ logdebug "Output: #{result6}"
396
+
397
+ start_index = result6.index('ODN')
398
+ end_index = result6.index('zip')
399
+ log_name = result6[start_index..end_index+2]
400
+ logdebug "ODN Binary log file: [#{log_name}]"
401
+ logdebug "Moving log file to directory /tmp"
402
+ result7 = exec_interactive_ssh(mas_prompt, "mv #{log_name} /tmp")
403
+ close_interactive_ssh if opened
404
+ loginfo2 "ODN Binary log file: [#{log_name}] created in /tmp"
405
+ return true
406
+ rescue StandardError => e
407
+ loginfo2 "Unexpected Failure: #{e.message}"
408
+ return false
409
+ ensure
410
+ close_interactive_ssh if opened
411
+ end
412
+ end
413
+
414
+ # Use it to reboot STB (after delay) from MAS
415
+ # * *Args* :
416
+ # - +delay+ -> no. of seconds after which STB will be rebooted
417
+ def mas_reboot_stb_with_delay(delay=0)
418
+ loginfo2 "Rebooting STB after #{delay} seconds from MAS"
419
+ mac_address = fetch_stb_mac_address
420
+ exec_mas_cmd "mdiags msg -m #{mac_address} reboot #{delay}"
421
+ loginfo2 "STB will be rebooted after #{delay} seconds"
422
+ end
@@ -0,0 +1,1335 @@
1
+ #Test automation script version# TA-5.5.mdn released time stamp: 12-03-12 14:40:20
2
+
3
+ require 'rubygems'
4
+ require 'net/telnet'
5
+ require 'nokogiri'
6
+ require 'timeout'
7
+ require './dsllib/common/utils/tmc_utils'
8
+
9
+ # Use it to fetch channel no. of active tuner from its IP address
10
+ # * *Args* :
11
+ # - IP address of MDN STB
12
+ # * *Returns* :
13
+ # - Channel no. on which the active tuner is
14
+ def fetch_active_tuner(ip)
15
+ retries = 0
16
+ stb_ip = ip
17
+ begin
18
+ loginfo2 "Connecting to Remote Diags to fetch active tuner using IP: #{stb_ip}"
19
+ patched_resp = "<HTML><BODY>"
20
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
21
+ loginfo2 'Wait for page to open'
22
+ sleep 5.sec
23
+ loginfo2 "Opening Resource Scheduler"
24
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
25
+ patched_resp << response
26
+ end
27
+ sleep 5.sec
28
+ doc = Nokogiri::HTML(patched_resp)
29
+ active=doc.xpath("//table[1]/tr[2]/td[6]").inner_html
30
+ if active=='TV'
31
+ tuner = doc.xpath("//table[1]/tr[2]/td[4]").inner_html
32
+ else
33
+ tuner = doc.xpath("//table[1]/tr[3]/td[4]").inner_html
34
+ end
35
+ loginfo2 "Tuner is on channel: #{tuner}"
36
+ return tuner
37
+
38
+ rescue Timeout::Error
39
+ loginfo2 'Connection to remote diagnostics Timed Out...'
40
+ retries += 1
41
+ loginfo2 "Retry: #{retries}" if retries < 4
42
+ retry unless retries == 4
43
+ end
44
+ end
45
+
46
+ # Use it to check if active tuner of MDN STB is recording
47
+ # * *Args* :
48
+ # - IP address of MDN STB
49
+ # * *Returns* :
50
+ # - true if active tuner is recording
51
+ def active_tuner_recording?(ip)
52
+ retries = 0
53
+ stb_ip = ip
54
+ begin
55
+ loginfo2 "Connecting to Remote Diags to check recording on active tuner using IP: #{stb_ip}"
56
+ patched_resp = "<HTML><BODY>"
57
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
58
+ loginfo2 'Wait for page to open'
59
+ sleep 5.sec
60
+ loginfo2 "Opening Resource Scheduler"
61
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
62
+ patched_resp << response
63
+ end
64
+ sleep 5.sec
65
+ loginfo2 "Check if active tuner recording"
66
+ doc = Nokogiri::HTML(patched_resp)
67
+ active=doc.xpath("//table[1]/tr[2]/td[6]").inner_html
68
+ if active=='TV'
69
+ is_recording=doc.xpath("//table[1]/tr[2]/td[5]").inner_html
70
+ else
71
+ is_recording=doc.xpath("//table[1]/tr[3]/td[5]").inner_html
72
+ end
73
+ loginfo2 "Value of Is Recording flag from MDN remote diags is: #{is_recording}"
74
+ if is_recording=='1'
75
+ loginfo2 "Active tuner is recording"
76
+ return true
77
+ end
78
+ rescue Timeout::Error
79
+ loginfo2 'Connection to remote diagnostics Timed Out...'
80
+ retries += 1
81
+ loginfo2 "Retry: #{retries}" if retries < 4
82
+ retry unless retries == 4
83
+ loginfo2 'Unable to check if active tuner recording' if retries == 4
84
+ end
85
+ end
86
+
87
+ # Use it to check if standby tuner of MDN STB is recording
88
+ # * *Args* :
89
+ # - IP address of MDN STB
90
+ # * *Returns* :
91
+ # - true if standby tuner is recording
92
+ def standby_tuner_recording?(ip)
93
+ retries = 0
94
+ stb_ip = ip
95
+ begin
96
+ loginfo2 "Connecting to Remote Diags to check recording on standby tuner using IP: #{stb_ip}"
97
+ patched_resp = "<HTML><BODY>"
98
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
99
+ loginfo2 'Wait for page to open'
100
+ sleep 5.sec
101
+ loginfo2 "Opening Resource Scheduler"
102
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
103
+ patched_resp << response
104
+ end
105
+ sleep 5.sec
106
+ loginfo2 "Check if standby tuner recording"
107
+ doc = Nokogiri::HTML(patched_resp)
108
+ active=doc.xpath("//table[1]/tr[2]/td[6]").inner_html
109
+ if active!='TV'
110
+ is_recording=doc.xpath("//table[1]/tr[2]/td[5]").inner_html
111
+ else
112
+ is_recording=doc.xpath("//table[1]/tr[3]/td[5]").inner_html
113
+ end
114
+ loginfo2 "Value of Is Recording flag from MDN remote diags is: #{is_recording}"
115
+ if is_recording=='1'
116
+ loginfo2 "Standby tuner is recording"
117
+ return true
118
+ end
119
+ rescue Timeout::Error
120
+ loginfo2 'Connection to remote diagnostics Timed Out...'
121
+ retries += 1
122
+ loginfo2 "Retry: #{retries}" if retries < 4
123
+ retry unless retries == 4
124
+ loginfo2 'Unable to check if standby tuner recording' if retries == 4
125
+ end
126
+ end
127
+
128
+ # Use it to fetch channel no. of PIP tuner from its IP address
129
+ # * *Args* :
130
+ # - IP address of MDN STB
131
+ # * *Returns* :
132
+ # - Channel no. on which the PIP tuner is
133
+ def fetch_pip_tuner(ip)
134
+ retries = 0
135
+ stb_ip = ip
136
+ begin
137
+ loginfo2 "Connecting to Remote Diags to fetch PIP tuner using IP: #{stb_ip}"
138
+ patched_resp = "<HTML><BODY>"
139
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
140
+ loginfo2 'Wait for page to open'
141
+ sleep 5.sec
142
+ loginfo2 "Opening Resource Scheduler"
143
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
144
+ patched_resp << response
145
+ end
146
+ sleep 5.sec
147
+ doc = Nokogiri::HTML(patched_resp)
148
+ active=doc.xpath("//table[1]/tr[2]/td[6]").inner_html
149
+ standby=doc.xpath("//table[1]/tr[3]/td[6]").inner_html
150
+ if active=='VIDEO_OUT'
151
+ tuner = doc.xpath("//table[1]/tr[2]/td[4]").inner_html
152
+ elsif standby=='VIDEO_OUT'
153
+ tuner = doc.xpath("//table[1]/tr[3]/td[4]").inner_html
154
+ else
155
+ loginfo2 'PIP not turned ON'
156
+ tuner = ''
157
+ end
158
+ loginfo2 "PIP tuner is on channel: #{tuner}"
159
+ return tuner
160
+
161
+ rescue Timeout::Error
162
+ loginfo2 'Connection to remote diagnostics Timed Out...'
163
+ retries += 1
164
+ loginfo2 "Retry: #{retries}" if retries < 4
165
+ retry unless retries == 4
166
+ end
167
+ end
168
+
169
+ # Use it to check if PIP tuner of MDN STB is recording
170
+ # * *Args* :
171
+ # - IP address of MDN STB
172
+ # * *Returns* :
173
+ # - true if PIP tuner is recording
174
+ def pip_tuner_recording?(ip)
175
+ retries = 0
176
+ stb_ip = ip
177
+ begin
178
+ loginfo2 "Connecting to Remote Diags to check recording on PIP tuner using IP: #{stb_ip}"
179
+ patched_resp = "<HTML><BODY>"
180
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
181
+ loginfo2 'Wait for page to open'
182
+ sleep 5.sec
183
+ loginfo2 "Opening Resource Scheduler"
184
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
185
+ patched_resp << response
186
+ end
187
+ sleep 5.sec
188
+ loginfo2 "Check if standby tuner recording"
189
+ doc = Nokogiri::HTML(patched_resp)
190
+ active=doc.xpath("//table[1]/tr[2]/td[6]").inner_html
191
+ if active =='VIDEO_OUT'
192
+ is_recording=doc.xpath("//table[1]/tr[2]/td[5]").inner_html
193
+ else
194
+ is_recording=doc.xpath("//table[1]/tr[3]/td[5]").inner_html
195
+ end
196
+ loginfo2 "Value of Is Recording flag from MDN remote diags is: #{is_recording}"
197
+ if is_recording=='1'
198
+ loginfo2 "PIP tuner is recording"
199
+ return true
200
+ end
201
+ rescue Timeout::Error
202
+ loginfo2 'Connection to remote diagnostics Timed Out...'
203
+ retries += 1
204
+ loginfo2 "Retry: #{retries}" if retries < 4
205
+ retry unless retries == 4
206
+ loginfo2 'Unable to check if PIP tuner recording' if retries == 4
207
+ end
208
+ end
209
+
210
+ # Use it to fetch the tuner no. of the channels from its IP address
211
+ # * *Args* :
212
+ # - IP address of MDN STB and array of active & standby tuner channels
213
+ # * *Returns* :
214
+ # -Array of Tuner number of the active & standby channels
215
+ def fetch_tuner_number(ip, channels)
216
+ retries = 0
217
+ stb_ip = ip
218
+ begin
219
+ loginfo2 "Connecting to Remote Diags to fetch active tuner using IP: #{stb_ip}"
220
+ patched_resp = "<HTML><BODY>"
221
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
222
+ loginfo2 'Wait for page to open'
223
+ sleep 5.sec
224
+ loginfo2 "Opening Resource Scheduler"
225
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
226
+ patched_resp << response
227
+ end
228
+ sleep 5.sec
229
+ doc = Nokogiri::HTML(patched_resp)
230
+ tuner = []
231
+ tuner_0 = doc.xpath("//table[1]/tr[2]/td[4]").inner_html
232
+ tuner_1 = doc.xpath("//table[1]/tr[3]/td[4]").inner_html
233
+ if ((tuner_0 == channels[0].to_s) ||(tuner_1 == channels[1].to_s))
234
+ tuner[0] = channels[0]
235
+ tuner[1] = channels[1]
236
+ elsif ((tuner_0 == channels[1].to_s) ||(tuner_1 == channels[0].to_s))
237
+ tuner[0] = channels[1]
238
+ tuner[1] = channels[0]
239
+ end
240
+ return tuner
241
+
242
+ rescue Timeout::Error
243
+ loginfo2 'Connection to remote diagnostics Timed Out...'
244
+ retries += 1
245
+ loginfo2 "Retry: #{retries}" if retries < 4
246
+ retry unless retries == 4
247
+ end
248
+ end
249
+
250
+ # Use it to fetch the destination of the specified channel from its IP address
251
+ # * *Args* :
252
+ # - IP address of MDN STB
253
+ # - Channel number whose destination is required
254
+ # * *Returns* :
255
+ # - Destination of the channel passed
256
+ def fetch_tuner_destination(ip, channel)
257
+ retries = 0
258
+ stb_ip = ip
259
+ begin
260
+ loginfo2 "Connecting to Remote Diags to fetch active tuner using IP: #{stb_ip}"
261
+ patched_resp = "<HTML><BODY>"
262
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
263
+ loginfo2 'Wait for page to open'
264
+ sleep 5.sec
265
+ loginfo2 "Opening Resource Scheduler"
266
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
267
+ patched_resp << response
268
+ end
269
+ loginfo2 "patched_resp : #{patched_resp}",false
270
+ sleep 5.sec
271
+ destination = ''
272
+ doc = Nokogiri::HTML(patched_resp)
273
+ if channel.to_s == doc.xpath("//table[1]/tr[2]/td[4]").inner_html
274
+ destination = doc.xpath("//table[1]/tr[2]/td[6]").inner_html
275
+ else
276
+ destination = doc.xpath("//table[1]/tr[3]/td[6]").inner_html
277
+ end
278
+ loginfo2 "destination : #{destination}",false
279
+ return destination
280
+
281
+ rescue Timeout::Error
282
+ loginfo2 'Connection to remote diagnostics Timed Out...'
283
+ retries += 1
284
+ loginfo2 "Retry: #{retries}" if retries < 4
285
+ retry unless retries == 4
286
+ end
287
+ end
288
+
289
+ # Private method
290
+ # Use it to fetch the airtime catalog ID's from MDN remote diagnostics
291
+ # * *Args* :
292
+ # * *Returns* :
293
+ # - array of airtime catalog ID's
294
+ def _fetch_mdn_airtime_catalog_id(ip)
295
+ retries = 0
296
+ retries_catalogs = 0
297
+ stb_ip = ip
298
+ begin
299
+ loginfo2 "Connecting to MDN Remote Diags to fetch Airtime catalog ID's using IP: #{stb_ip}"
300
+ for i in 1..4
301
+ patched_resp = "<HTML><BODY>"
302
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
303
+ loginfo2 "Opening disk info and fetching airtime catalogs list"
304
+ options = {
305
+ 'String' => "GET /disk HTTP/1.1\nHost: #{stb_ip}\n",
306
+ 'Match' => /(airtGrp)/,
307
+ 'Timeout' => 180
308
+ }
309
+ server.cmd(options) do |response|
310
+ patched_resp << response
311
+ end
312
+ sleep 5.sec
313
+ doc = Nokogiri::HTML(patched_resp)
314
+ logdebug doc
315
+ data = []
316
+ doc.xpath("//a").each{|e| if e.text.include?('airtGrp'); logdebug "#{e['href']} -> #{e.text.split('-')[1]}"; data.push(e.text.split('-')[1]);end }
317
+ if data.size == 0
318
+ loginfo2 'Unable to fetch airtime catalogs list from MDN remote diagnostics'
319
+ retries_catalogs += 1
320
+ end
321
+ break if data.size != 0
322
+ loginfo2 "Retry for catalogs list: [#{retries_catalogs}]" if retries_catalogs < 4
323
+ end
324
+ return data
325
+ rescue Timeout::Error
326
+ loginfo2 'Connection to remote diagnostics Timed Out...'
327
+ retries += 1
328
+ loginfo2 "Retry: [#{retries}]" if retries < 4
329
+ retry unless retries == 4
330
+ tcinvalid "Web Diagnostics not accessible" if retries == 4
331
+ end
332
+ end
333
+
334
+ # Use it to fetch channel no. of standby tuner(if it is recording) from its IP address
335
+ # * *Args* :
336
+ # - IP address of MDN STB
337
+ # * *Returns* :
338
+ # - Channel no. on which the standby tuner is
339
+ def fetch_recording_standby_tuner(ip)
340
+ retries = 0
341
+ stb_ip = ip
342
+ begin
343
+ loginfo2 "Connecting to Remote Diags to fetch active tuner using IP: #{stb_ip}"
344
+ patched_resp = "<HTML><BODY>"
345
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
346
+ loginfo2 'Wait for page to open'
347
+ sleep 5.sec
348
+ loginfo2 "Opening Resource Scheduler"
349
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
350
+ patched_resp << response
351
+ end
352
+ sleep 5.sec
353
+ doc = Nokogiri::HTML(patched_resp)
354
+
355
+ dest = doc.xpath("//table[1]/tr[2]/td[6]").inner_html
356
+ isRecording = doc.xpath("//table[1]/tr[2]/td[5]").inner_html
357
+ channel = ''
358
+ if dest =='DISK' && isRecording == '1'
359
+ channel = doc.xpath("//table[1]/tr[2]/td[4]").inner_html
360
+ else
361
+ dest = doc.xpath("//table[1]/tr[3]/td[6]").inner_html
362
+ isRecording = doc.xpath("//table[1]/tr[3]/td[5]").inner_html
363
+ if dest =='DISK' && isRecording == '1'
364
+ channel = doc.xpath("//table[1]/tr[3]/td[4]").inner_html
365
+ end
366
+ end
367
+ loginfo2 "Tuner is on channel: #{channel}"
368
+ return channel
369
+
370
+ rescue Timeout::Error
371
+ loginfo2 'Connection to remote diagnostics Timed Out...'
372
+ retries += 1
373
+ loginfo2 "Retry: #{retries}" if retries < 4
374
+ retry unless retries == 4
375
+ loginfo2 "Unable to fetch airtime catalog ID's" if retries == 4
376
+ end
377
+ end
378
+
379
+ # Use it to check if tuner 0 of MDN STB is recording
380
+ # * *Args* :
381
+ # - IP address of MDN STB
382
+ # * *Returns* :
383
+ # - true if tuner 0 is recording
384
+ def tuner_0_recording?(ip)
385
+ retries = 0
386
+ stb_ip = ip
387
+ begin
388
+ loginfo2 "Connecting to Remote Diags to check recording on tuner 0 using IP: #{stb_ip}"
389
+ patched_resp = "<HTML><BODY>"
390
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
391
+ loginfo2 'Wait for page to open'
392
+ sleep 5.sec
393
+ loginfo2 "Opening Resource Scheduler"
394
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
395
+ patched_resp << response
396
+ end
397
+ sleep 5.sec
398
+ loginfo2 "patched_resp : #{patched_resp}",false
399
+ loginfo2 "Check if tuner 0 recording"
400
+ doc = Nokogiri::HTML(patched_resp)
401
+ is_recording=doc.xpath("//table[1]/tr[2]/td[5]").inner_html
402
+ loginfo2 "Value of Is Recording flag from MDN remote diags is: #{is_recording}"
403
+ if is_recording=='1'
404
+ loginfo2 "Tuner 0 is recording"
405
+ return true
406
+ end
407
+ rescue Timeout::Error
408
+ loginfo2 'Connection to remote diagnostics Timed Out...'
409
+ retries += 1
410
+ loginfo2 "Retry: #{retries}" if retries < 4
411
+ retry unless retries == 4
412
+ loginfo2 'Unable to check if standby tuner recording' if retries == 4
413
+ end
414
+ end
415
+
416
+ # Use it to check if tuner 1 of MDN STB is recording
417
+ # * *Args* :
418
+ # - IP address of MDN STB
419
+ # * *Returns* :
420
+ # - true if tuner 1 is recording
421
+ def tuner_1_recording?(ip)
422
+ retries = 0
423
+ stb_ip = ip
424
+ begin
425
+ loginfo2 "Connecting to Remote Diags to check recording on tuner 1 using IP: #{stb_ip}"
426
+ patched_resp = "<HTML><BODY>"
427
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
428
+ loginfo2 'Wait for page to open'
429
+ sleep 5.sec
430
+ loginfo2 "Opening Resource Scheduler"
431
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
432
+ patched_resp << response
433
+ end
434
+ sleep 5.sec
435
+ loginfo2 "patched_resp : #{patched_resp}",false
436
+ loginfo2 "Check if tuner 1 recording"
437
+ doc = Nokogiri::HTML(patched_resp)
438
+ is_recording=doc.xpath("//table[1]/tr[3]/td[5]").inner_html
439
+ loginfo2 "Value of Is Recording flag from MDN remote diags is: #{is_recording}"
440
+ if is_recording=='1'
441
+ loginfo2 "Tuner 0 is recording"
442
+ return true
443
+ end
444
+ rescue Timeout::Error
445
+ loginfo2 'Connection to remote diagnostics Timed Out...'
446
+ retries += 1
447
+ loginfo2 "Retry: #{retries}" if retries < 4
448
+ retry unless retries == 4
449
+ loginfo2 'Unable to check if standby tuner recording' if retries == 4
450
+ end
451
+ end
452
+
453
+ # Use it to fetch app handler name from Atlas Application (remote diags)
454
+ # * *Args* :
455
+ # - IP address of MDN STB
456
+ # * *Returns* :
457
+ # - String app handler name (e.g. set0, ond0, etc)
458
+ def fetch_atlas_applications_focused_app_handler_name(stb_ip = fetch_ip)
459
+ retries = 0
460
+ begin
461
+ loginfo2 "Connecting to Remote Diags to fetch app handler name using IP: #{stb_ip}"
462
+ patched_resp = "<HTML><BODY>"
463
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
464
+ loginfo2 'Wait for page to open'
465
+ sleep 5.sec
466
+ loginfo2 "Opening Atlas Applications"
467
+ server.cmd("GET /apps HTTP/1.1\nHost: #{stb_ip}\n") do |response|
468
+ patched_resp << response
469
+ end
470
+ sleep 5.sec
471
+ loginfo2 "Fethcing app handler name from Atlas Applications"
472
+ doc = Nokogiri::HTML(patched_resp)
473
+ app_handler_name=doc.xpath("/html/body/table[1]/tr[2]/td[2]").inner_text.to_s
474
+ loginfo2 "App handler name : #{app_handler_name}"
475
+ return app_handler_name
476
+ rescue Timeout::Error
477
+ loginfo2 'Connection to remote diagnostics Timed Out...'
478
+ retries += 1
479
+ loginfo2 "Retry: #{retries}" if retries < 4
480
+ retry unless retries == 4
481
+ rescue StandardError => e
482
+ loginfo2 "StandardError : #{e.message}"
483
+ end
484
+
485
+ loginfo2 'Unable to fetch app handler name from Atlas Applications'
486
+ return ""
487
+ end
488
+
489
+ def fetch_link_on_mdn_web_diagnostics(stb_ip)
490
+ links = {}
491
+ retries=0
492
+ begin
493
+ loginfo2 "Connecting to Remote Diags to verify link and its fields using IP: #{stb_ip}"
494
+ patched_resp = "<HTML><BODY>"
495
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
496
+ loginfo2 'Wait for page to open'
497
+ sleep 5.sec
498
+
499
+ loginfo2 "Opening home page info"
500
+ server.cmd("GET /home HTTP/1.1\nHost: #{stb_ip}\n") do |response|
501
+ patched_resp << response
502
+ end
503
+ sleep 5.sec
504
+ doc = Nokogiri::HTML(patched_resp)
505
+ doc.xpath("//a").map{ |e| links[e.text.strip.gsub(/\s/,'_').gsub(/\W/,'').downcase.to_sym]=e['href']}
506
+ return links
507
+ rescue Timeout::Error
508
+ loginfo2 'Connection to remote diagnostics Timed Out...'
509
+ retries += 1
510
+ loginfo2 "Retry: #{retries}" if retries < 4
511
+ retry unless retries == 4
512
+ loginfo2 'Unable to fetch links' if retries == 4
513
+ end
514
+ end
515
+
516
+ def verify_mdn_remote_diagnostic_file_operations(stb_ip)
517
+ retries = 0
518
+ begin
519
+ server=_connect_to_remote_diags(stb_ip)
520
+ return false if server.nil?
521
+ loginfo2 "Opening File Operations link"
522
+ patched_resp = "<HTML><BODY>"
523
+ server.cmd("GET /fo HTTP/1.1\nHost: #{stb_ip}\n") do |response|
524
+ patched_resp << response
525
+ end
526
+ sleep 5.sec
527
+ doc = Nokogiri::HTML(patched_resp)
528
+
529
+ lines=[]
530
+ count=0
531
+ doc.to_s.split("\n").each {|line| lines.push(line)}
532
+
533
+ loginfo2 'Verify Header Information'
534
+ fields = []
535
+ expected_fields=['IB Errors','OOB Errors','Last BFS Read Error','Last Stream Exception','Num pending fileOps']
536
+ fields = lines.find_all{|item| item.include?('File Operations')}[1].to_s.split("<br>").to_a
537
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
538
+ loginfo2 '*************************************'
539
+
540
+ loginfo2 'Verify Columns'
541
+ columns =[]
542
+ expected_columns=['U Handle','I Handle','Path','Owner','Queued State','Size','Priority','Read State']
543
+ (1..8).each {|i| columns.push(doc.xpath("//table[1]/tr[1]/td[#{i}]").inner_html)}
544
+ expected_columns.each{|clm| columns.find_all{|item| if item.include?("#{clm}"); loginfo2 "Table column: #{item} verified"; count+=1; end}}
545
+
546
+ loginfo2 'Verify Back to Main page link'
547
+ doc.xpath("//a").each{|e| if e.text.include?('Back to Main Page'); loginfo2 "#{e['href']} -> #{e.text}"; count+=1;end }
548
+
549
+ loginfo2 'All Header Information and Columns on File operations link verified' if count == 14
550
+ return true if count == 14
551
+ loginfo2 'All Header Information and Columns on File operations link not verified'
552
+ return false
553
+ rescue Timeout::Error
554
+ loginfo2 'Connection to remote diagnostics Timed Out on opening File operations page...'
555
+ retries += 1
556
+ loginfo2 "Retry: #{retries}" if retries < 4
557
+ retry unless retries == 4
558
+ loginfo2 'Unable to verify File operations' if retries == 4
559
+ end
560
+ end
561
+
562
+ #Private method
563
+ def _connect_to_remote_diags(stb_ip)
564
+ server = nil
565
+ retries=0
566
+ begin
567
+ loginfo2 "Connecting to MDN Remote Diags home page using IP: #{stb_ip}"
568
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
569
+ loginfo2 'Wait for page to open'
570
+ sleep 5.sec
571
+ rescue Timeout::Error
572
+ loginfo2 'Connection to remote diagnostics Timed Out...'
573
+ retries += 1
574
+ loginfo2 "Retry: #{retries}" if retries < 4
575
+ retry unless retries == 4
576
+ loginfo2 "Unable to connect to MDN remote diagnostics" if retries == 4
577
+ return nil
578
+ end
579
+ return server
580
+ end
581
+
582
+ def verify_mdn_remote_diagnostic_sdv_information(stb_ip)
583
+ retries = 0
584
+ begin
585
+ server=_connect_to_remote_diags(stb_ip)
586
+ return false if server.nil?
587
+
588
+ loginfo2 "Opening SDV information"
589
+ patched_resp = "<HTML><BODY>"
590
+ server.cmd("GET /sdv HTTP/1.1\nHost: #{stb_ip}\n") do |response|
591
+ patched_resp << response
592
+ end
593
+ sleep 5.sec
594
+ loginfo2 "Verify information on SDV information link"
595
+ doc = Nokogiri::HTML(patched_resp)
596
+
597
+ headers=[]
598
+ doc.xpath("//h2").each{|e| headers.push(e.text)}
599
+ lines=[]
600
+ count=0
601
+ doc.to_s.split("\n").each {|line| lines.push(line)}
602
+
603
+ loginfo2 'Verify CVCT Section Information'
604
+ fields = []
605
+ expected_fields=['version_number','Total number of sections','Total number of channels in MC']
606
+ fields = lines.find_all {|item| item.include?('CVCT Section Information')}[0].to_s.split("</h2>")[1].split("<br>").to_a
607
+ headers.find_all{|item| if item.include?('CVCT Section Information'); loginfo2 "Header: #{item} verified"; count+=1; end}
608
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
609
+ loginfo2 '*************************************'
610
+
611
+ loginfo2 'Verify SDV MiniCarousel Channel Map Table'
612
+ headers.find_all{|item| if item.include?('SDV MiniCarousel Channel Map Table'); loginfo2 "Header: #{item} verified"; count+=1; end}
613
+ loginfo2 'Verify Table Columns'
614
+ columns =[]
615
+ expected_columns=['source_id','program','frequency','modulation']
616
+ (1..4).each {|i| columns.push(doc.xpath("//table[1]/tr[1]/td[#{i}]").inner_html)}
617
+ expected_columns.each{|clm| columns.find_all{|item| if item.include?("#{clm}"); loginfo2 "Table column: #{item} verified"; count+=1; end}}
618
+ loginfo2 '*************************************'
619
+
620
+ loginfo2 'Verify CVCT IP Resource Descriptor'
621
+ fields = []
622
+ expected_fields=['Descriptor_Tag','Descriptor_Length','IP_Port','Primary_IP_Address','Secondary_IP_Address']
623
+ fields = lines.find_all {|item| item.include?('CVCT IP Resource Descriptor')}[0].to_s.split("</h2>")[1].split("<br>").to_a
624
+ headers.find_all{|item| if item.include?('CVCT IP Resource Descriptor'); loginfo2 "Header: #{item} verified"; count+=1; end}
625
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
626
+ loginfo2 '*************************************'
627
+
628
+ loginfo2 'Verify CVCT Client Configuration Parameters Descriptor'
629
+ fields = []
630
+ expected_fields=['Descriptor_Tag','Descriptor_Length','ResendSDBPrgSelectRequest','LuaReportingInterval','ChannelMapReadInterval','MessageResponseTimeOut',
631
+ 'MessageRequestMaxRetriesCount','MessageRequestRetryInterval','BandwidthReclaimUITimeout']
632
+ fields = lines.find_all {|item| item.include?('CVCT Client Configuration Parameters Descriptor')}[0].to_s.split("</h2>")[1].split("<br>").to_a
633
+ headers.find_all{|item| if item.include?('CVCT Client Configuration Parameters Descriptor'); loginfo2 "Header: #{item} verified"; count+=1; end}
634
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
635
+ loginfo2 '*************************************'
636
+
637
+ loginfo2 'Verify SDV Tuner Usage'
638
+ fields = []
639
+ expected_fields=['Tuner1 Status']
640
+ fields = lines.find_all {|item| item.include?('SDV Tuner Usage')}[0].to_s.split('00000">')[1].split("<br>").to_a
641
+ headers.find_all{|item| if item.include?('SDV Tuner Usage'); loginfo2 "Header: #{item} verified"; count+=1; end}
642
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
643
+ loginfo2 '*************************************'
644
+
645
+ loginfo2 'Verify SDV Channel Change Messages'
646
+ headers.find_all{|item| if item.include?('CVCT Client Configuration Parameters Descriptor'); loginfo2 "Header: #{item} verified"; count+=1; end}
647
+ fields = []
648
+ fields = lines.find_all {|item| item.include?('SDV Channel Change Messages')}[0].to_s.split('/h2><table><tr><td><font color="#000000">')[1].to_s.split('<br></font></td></tr><br></table></body></html>')[0].to_s.split('<br></font></td></tr><tr><td><font color="#000000">').to_a
649
+ fields.each{|fld| loginfo2 fld}
650
+ loginfo2 '*************************************'
651
+
652
+ loginfo2 'Verify Back to Main page link'
653
+ doc.xpath("//a").each{|e| if e.text.include?('Back to Main Page'); loginfo2 "Link #{e['href']} -> #{e.text} verified"; count+=1;end }
654
+
655
+ loginfo2 'All information on SDV link verified' if count == 29
656
+ return true if count == 29
657
+ loginfo2 'All information on SDV link not verified'
658
+ return false
659
+
660
+ rescue Timeout::Error
661
+ loginfo2 'Connection to remote diagnostics Timed Out on opening SDV page...'
662
+ retries += 1
663
+ loginfo2 "Retry: #{retries}" if retries < 4
664
+ retry unless retries == 4
665
+ loginfo2 'Unable to verify SDV information' if retries == 4
666
+ end
667
+ end
668
+
669
+ def verify_mdn_remote_diagnostic_resource_scheduler(stb_ip)
670
+ retries = 0
671
+ begin
672
+ server=_connect_to_remote_diags(stb_ip)
673
+ return false if server.nil?
674
+
675
+ loginfo2 "Opening Resource scheduler"
676
+ patched_resp = "<HTML><BODY>"
677
+ server.cmd("GET /rs HTTP/1.1\nHost: #{stb_ip}\n") do |response|
678
+ patched_resp << response
679
+ end
680
+ sleep 5.sec
681
+ loginfo2 "Verify information on Resource Scheduler link"
682
+ doc = Nokogiri::HTML(patched_resp)
683
+
684
+ headers=[]
685
+ doc.xpath("//h2").each{|e| headers.push(e.text)}
686
+
687
+ lines=[]
688
+ count=0
689
+ doc.to_s.split("\n").each {|line| lines.push(line)}
690
+
691
+ loginfo2 'Verify Scheduled Events Table'
692
+ headers.find_all{|item| if item.include?('Scheduled Events'); loginfo2 "Header: #{item} verified"; count+=1; end}
693
+ loginfo2 'Verify Table Columns'
694
+ columns =[]
695
+ expected_columns=['Type','State','StartTime','PreEventTime','Duration','ReqPriority','ServiceID','Freq','CH']
696
+ (1..9).each {|i| columns.push(doc.xpath("//table[3]/tr[1]/td[#{i}]").inner_html)}
697
+ expected_columns.each{|clm| columns.find_all{|item| if item.include?("#{clm}"); loginfo2 "Table column: #{item} verified"; count+=1; end}}
698
+ loginfo2 '*************************************'
699
+
700
+ loginfo2 'Verify Tuner Users Table'
701
+ headers.find_all{|item| if item.include?('Tuner Users'); loginfo2 "Header: #{item} verified"; count+=1; end}
702
+ loginfo2 'Verify Table Columns'
703
+ columns =[]
704
+ expected_columns=['Number','pTvPlayer','Type','ConvertingUser','WaitingToConvertUser','TsbRecorderUser','handle','ID','dest','bDigital','chan','source','freq','mod','prog','affinity Handle','affinity ID']
705
+ (1..17).each {|i| columns.push(doc.xpath("//table[2]/tr[1]/td[#{i}]").inner_html)}
706
+ expected_columns.each{|clm| columns.find_all{|item| if item==clm; loginfo2 "Table column: #{item} verified"; count+=1; end}}
707
+
708
+ loginfo2 'All information on Resource scheduler link verified' if count == 28
709
+ return true if count == 28
710
+ loginfo2 'All information on Resource scheduler link not verified'
711
+ return false
712
+
713
+ rescue Timeout::Error
714
+ loginfo2 'Connection to remote diagnostics Timed Out on opening Resource scheduler page...'
715
+ retries += 1
716
+ loginfo2 "Retry: #{retries}" if retries < 4
717
+ retry unless retries == 4
718
+ loginfo2 'Unable to verify Resource scheduler information' if retries == 4
719
+ end
720
+ end
721
+
722
+ def verify_mdn_remote_diagnostic_ptv_memory_data(stb_ip)
723
+ retries = 0
724
+ begin
725
+ server=_connect_to_remote_diags(stb_ip)
726
+ return false if server.nil?
727
+
728
+ loginfo2 "Opening PTV Memory Data"
729
+ patched_resp = "<HTML><BODY>"
730
+ server.cmd("GET /ptvmemdata HTTP/1.1\nHost: #{stb_ip}\n") do |response|
731
+ patched_resp << response
732
+ end
733
+ sleep 5.sec
734
+ loginfo2 "Verify information on PTV Memory Data link"
735
+ doc = Nokogiri::HTML(patched_resp)
736
+ puts (doc.xpath("//title").inner_html)
737
+
738
+ lines=[]
739
+ count=0
740
+ doc.to_s.split("\n").each {|line| lines.push(line)}
741
+
742
+ loginfo2 'Verify PTVALLOC Table'
743
+ fields = []
744
+ expected_fields=['PTVALLOC','owner','ptr','size(B)']
745
+ fields = lines.find_all {|item| item.include?('PTVALLOC')}[0].to_s.split('<tr><td>')[1].to_s.split('</td></tr>')[0].to_s.split("</td><td>").to_a
746
+ loginfo2 'Verify PTVALLOC Table Columns'
747
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
748
+ loginfo2 '*************************************'
749
+
750
+ loginfo2 'Verify PTVHANDLE Table'
751
+ fields = []
752
+ expected_fields=['PTVHANDLE','owner','ptr','size(B)']
753
+ fields = lines.find_all {|item| item.include?('PTVHANDLE')}[0].to_s.split('<tr><td>')[1].to_s.split('</td></tr>')[0].to_s.split("</td><td>").to_a
754
+ loginfo2 'Verify PTVHANDLE Table Columns'
755
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
756
+ loginfo2 '*************************************'
757
+
758
+ loginfo2 'Verify Condition Table'
759
+ fields = []
760
+ expected_fields=['Condition','Total Free (KB)','Max Free (KB)']
761
+ fields = lines.find_all {|item| item.include?('Condition')}[0].to_s.split('<tr><td>')[1].to_s.split('</td></tr>')[0].to_s.split("</td><td>").to_a
762
+ loginfo2 'Verify Condition Table Columns'
763
+
764
+ expected_fields.each{|fld| fields.find_all{|item| if item.include?("#{fld}"); loginfo2 "Field: #{item} verified"; count+=1; end}}
765
+ loginfo2 '*************************************'
766
+
767
+ loginfo2 'Verify Back to Main page link'
768
+ doc.xpath("//a").each{|e| if e.text.include?('Back to Main Page'); loginfo2 "#{e['href']} -> #{e.text}"; count+=1;end }
769
+
770
+ loginfo2 'All information on PTV Memory Data link verified' if count == 12
771
+ return true if count == 12
772
+ loginfo2 'All information on PTV Memory Data link not verified'
773
+ return false
774
+
775
+ rescue Timeout::Error
776
+ loginfo2 'Connection to remote diagnostics Timed Out on opening PTV memory data page...'
777
+ retries += 1
778
+ loginfo2 "Retry: #{retries}" if retries < 4
779
+ retry unless retries == 4
780
+ loginfo2 'Unable to verify PTV Memory Data information' if retries == 4
781
+ end
782
+ end
783
+
784
+ def verify_mdn_remote_diagnostic_disk_contents(stb_ip)
785
+ retries = 0
786
+ begin
787
+ server=_connect_to_remote_diags(stb_ip)
788
+ return false if server.nil?
789
+
790
+ loginfo2 "Opening Disk contents"
791
+ patched_resp = "<HTML><BODY>"
792
+ server.cmd("GET /disk HTTP/1.1\nHost: #{stb_ip}\n") do |response|
793
+ patched_resp << response
794
+ end
795
+ sleep 5.sec
796
+ loginfo2 "Verify information on Disk contents link"
797
+ doc = Nokogiri::HTML(patched_resp)
798
+
799
+ fields=[]
800
+ doc.xpath("//b").each{|e| fields.push(e.text)}
801
+
802
+ count=0
803
+ fields.each {|item| loginfo2 "Field: #{item} verified"; count+=1}
804
+
805
+ loginfo2 'All information on Disk contents link verified' if count >1
806
+ return true if count >1
807
+ loginfo2 'All information on Disk contents link not verified'
808
+ return false
809
+
810
+ rescue Timeout::Error
811
+ loginfo2 'Connection to remote diagnostics Timed Out on opening Disk contents page...'
812
+ retries += 1
813
+ loginfo2 "Retry: #{retries}" if retries < 4
814
+ retry unless retries == 4
815
+ loginfo2 'Unable to verify Disk contents information' if retries == 4
816
+ end
817
+ end
818
+
819
+ def verify_mdn_remote_diagnostic_circular_buffers(stb_ip)
820
+ retries = 0
821
+ begin
822
+ server=_connect_to_remote_diags(stb_ip)
823
+ return false if server.nil?
824
+
825
+ loginfo2 "Opening Circular Buffers"
826
+ patched_resp = "<HTML><BODY>"
827
+ server.cmd("GET /cb HTTP/1.1\nHost: #{stb_ip}\n") do |response|
828
+ patched_resp << response
829
+ end
830
+ sleep 5.sec
831
+ loginfo2 "Verify information on Circular Buffers link"
832
+ doc = Nokogiri::HTML(patched_resp)
833
+
834
+ fields=[]
835
+ doc.xpath("//a").each{|e| fields.push(e.text)}
836
+
837
+ count=0
838
+ fields.each {|item| loginfo2 "Field: #{item} verified"; count+=1}
839
+
840
+ loginfo2 'All information on Circular Buffers link verified' if count >1
841
+ return true if count >1
842
+ loginfo2 'All information on Circular Buffers link not verified'
843
+ return false
844
+
845
+ rescue Timeout::Error
846
+ loginfo2 'Connection to remote diagnostics Timed Out on opening Circular Buffers page...'
847
+ retries += 1
848
+ loginfo2 "Retry: #{retries}" if retries < 4
849
+ retry unless retries == 4
850
+ loginfo2 'Unable to verify Circular Buffers information' if retries == 4
851
+ end
852
+ end
853
+
854
+ # Private method
855
+ def _mdn_remote_diags_verify_options_on_link stb_ip, link, options
856
+ retries = 0
857
+ begin
858
+ logdebug "Connecting to MDN Remote Diags to verify options on link #{link} for ip #{stb_ip}"
859
+ patched_resp = "<HTML><BODY>"
860
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
861
+ loginfo2 'Wait for page to open'
862
+ sleep 5.sec
863
+ server.cmd("GET #{link} HTTP/1.1\nHost: #{stb_ip}\n") do |response|
864
+ patched_resp << response
865
+ end
866
+ options.each {|option|
867
+ loginfo2 "Verifying option : #{option}"
868
+ unless patched_resp.include?(option)
869
+ loginfo2 "Option '#{option}' is not present"
870
+ return false
871
+ end
872
+ loginfo2 "Option : #{option} is present"
873
+ }
874
+ rescue Timeout::Error
875
+ loginfo2 'Connection to remote diagnostics Timed Out...'
876
+ retries += 1
877
+ loginfo2 "Retry: #{retries}" if retries < 4
878
+ retry unless retries == 4
879
+ end
880
+
881
+ loginfo2 "Verified all options for link #{link}"
882
+ return true
883
+ end
884
+
885
+ def mdn_remote_diags_verify_options option_hash, stb_ip = fetch_ip
886
+ if stb_ip.nil?
887
+ loginfo2 'STB does not have IP '
888
+ return false
889
+ end
890
+
891
+ loginfo2 'Fetching links for all pages'
892
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
893
+ logdebug "Found links : #{options}"
894
+
895
+ option_hash.each {|page, values|
896
+ loginfo2 "Verifying options for page #{page}"
897
+ if options.has_key?(page)
898
+ return false unless _mdn_remote_diags_verify_options_on_link(stb_ip, options[page.to_sym],values)
899
+ else
900
+ loginfo2 "Link for page #{page} not found"
901
+ return false
902
+ end
903
+ }
904
+
905
+ loginfo2 "Verified options on all pages"
906
+ return true
907
+ end
908
+
909
+ # Private method
910
+ def _mdn_remote_diags_get_all_code_from_link link, stb_ip = fetch_ip
911
+ retries = 0
912
+ patched_resp = ""
913
+ begin
914
+ patched_resp = ""
915
+ server = Net::Telnet::new('Host' => "#{stb_ip}", 'Port' => 8080, 'Telnetmode' => false)
916
+ loginfo2 "Wait for page to open [#{link}]"
917
+ sleep 5.sec
918
+ server.cmd("GET #{link} HTTP/1.1\nHost: #{stb_ip}\n") do |response|
919
+ patched_resp << response
920
+ end
921
+ rescue Timeout::Error
922
+ loginfo2 'Connection to remote diagnostics Timed Out...'
923
+ retries += 1
924
+ loginfo2 "Retry: #{retries}" if retries < 4
925
+ retry unless retries == 4
926
+ end
927
+
928
+ return patched_resp
929
+ end
930
+
931
+ # Use it to verify if guide catalog was last to load in file operations
932
+ def mdn_remote_diags_verify_last_catalog catalog_name = 'GUIDE', max_time_in_sec = 500
933
+ bool = false
934
+ last_row = ''
935
+ stb_ip = fetch_ip
936
+
937
+ (max_time_in_sec/5).times do
938
+ loginfo2 'Fetching new page'
939
+ text = _mdn_remote_diags_get_all_code_from_link('/fo',stb_ip)
940
+
941
+ doc = Nokogiri::HTML(text)
942
+ rows = doc.xpath('//tr')
943
+ paths = rows.collect do |row|
944
+ row.at_xpath('td[3]/text()').to_s.strip
945
+ end
946
+
947
+ if paths.length == 1
948
+ break if bool
949
+ else
950
+ bool = true
951
+ last_row = paths[-1]
952
+ end
953
+ logdebug "Last path found : #{last_row}"
954
+
955
+ sleep 5.sec
956
+ end
957
+
958
+ logdebug "Last row's path value is : #{last_row}"
959
+ bool = last_row.include?(catalog_name)
960
+ loginfo2 'Failed to verify if guide was loaded last' unless bool
961
+ return bool
962
+ end
963
+
964
+ # Use it to get source of tv player from mdn diags
965
+ # * *Args* :
966
+ # - +stb_ip+ -> IP address of box
967
+ # * *Returns* :
968
+ # - source number if source was found, nil otherwise
969
+ def mdn_remote_diags_tv_player_source stb_ip = fetch_ip
970
+ text = _mdn_remote_diags_get_all_code_from_link('/rs', stb_ip)
971
+ doc = Nokogiri::HTML(text)
972
+ rows = doc.xpath('//table[2]/tr')
973
+ source = nil
974
+ rows.each do |row|
975
+ col1 = row.at_xpath('td[1]/text()')
976
+ logdebug "Row name : #{col1}"
977
+ unless col1.to_s.include?('er')
978
+ if row.at_xpath('td[3]/text()').to_s.strip.include?('TV_PLAYER')
979
+ source = row.at_xpath('td[12]/text()').to_s
980
+ break
981
+ end
982
+ end
983
+ end
984
+ loginfo2 'Failed to get source' unless source
985
+ loginfo2 "Source found: #{source}" if source
986
+ return source
987
+ end
988
+
989
+ # Use it to get HDD full status from diags
990
+ # * *Args* :
991
+ # - +stb_ip+ -> stb ip
992
+ # - +retries+ -> retries on connection timeout
993
+ # * *Returns* :
994
+ # - HDD status (String) if successful else nil
995
+ def mdn_remote_diags_get_hdd_status stb_ip = fetch_ip, retries=3
996
+ begin
997
+ text = _mdn_remote_diags_get_all_code_from_link('/diags23.html', stb_ip)
998
+ doc = Nokogiri::HTML(text)
999
+ status = doc.at_xpath('//table/tr[3]/td').text.scan(/(\d+)%/)[0][0]
1000
+ return status
1001
+ rescue Timeout::Error
1002
+ retries = retries - 1
1003
+ unless retries.eql?(0)
1004
+ loginfo2 "WARNING: Connection timeout... (trying again)"
1005
+ retry
1006
+ end
1007
+ loginfo2 "WARNING: Connection timeout..."
1008
+ return nil
1009
+ rescue StandardError
1010
+ drive_model = doc.at_xpath('//table/tr[4]/td').text.strip.upcase
1011
+ tcinvalid "Disk error : http://#{stb_ip}:8080/diags.html" if drive_model.eql?("NO DISK")
1012
+ return nil
1013
+ end
1014
+ end
1015
+
1016
+ # Use it to verify whether a tuner numer is on disk
1017
+ # * *Args* :
1018
+ # - +tuner_number+ -> Integer(0/1) tuner number
1019
+ # * *Returns* :
1020
+ # - true and false if given tuner was on disk or not respectively, nil is case of timeout
1021
+ def mdn_remote_diags_verify_tuner_on_disk(tuner_number = 0 )
1022
+ begin
1023
+ text = _mdn_remote_diags_get_all_code_from_link('/rs')
1024
+ doc = Nokogiri::HTML(text)
1025
+ tuner = doc.xpath("//table[1]/tr[#{tuner_number+2}]/td[6]").inner_html
1026
+ loginfo2 "Tuner #{tuner_number} has destination #{tuner}"
1027
+ return tuner.eql?('DISK')
1028
+ rescue Timeout::Error
1029
+ loginfo2 "WARNING: Connection timeout..."
1030
+ return false
1031
+ end
1032
+ end
1033
+
1034
+ def mdn_remote_diags_source_id stb_ip = fetch_ip
1035
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1036
+ source = _mdn_remote_diags_get_all_code_from_link(options[:network_status],stb_ip)
1037
+ sid = /Source ID:<.*>(\d+|No\sPower)<\/FONT><\/TD><\/TR>/.match(source)
1038
+ if sid.nil?
1039
+ loginfo2 "Source ID not found"
1040
+ return nil
1041
+ end
1042
+ return sid[1]
1043
+ end
1044
+
1045
+ def mdn_remote_diags_sdv_frequency stb_ip = fetch_ip
1046
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1047
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1048
+ freq = /SDB Freq<.*>(\d+\.\d+\sMHz)<\/FONT><\/TD><\/TR>/.match(source)
1049
+ if freq.nil?
1050
+ loginfo2 "SDB Freq not found"
1051
+ return nil
1052
+ end
1053
+ return freq[1]
1054
+ end
1055
+
1056
+ def mdn_remode_diags_stb_sdv_capable? stb_ip = fetch_ip
1057
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1058
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1059
+ status = /Authorized<.*>(\w+)<\/FONT><\/TD><\/TR>/.match(source)
1060
+ if status.nil?
1061
+ loginfo2 "Authorized not found"
1062
+ return nil
1063
+ end
1064
+ return status[1].casecmp('Yes')==0
1065
+ end
1066
+
1067
+ def mdn_remote_diags_sdv_packets_sent_recieved stb_ip = fetch_ip
1068
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1069
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1070
+ packets = /Total\sTx-Rx<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1071
+ if packets.nil?
1072
+ loginfo2 "Total packets transfered not found"
1073
+ return nil
1074
+ end
1075
+ return packets[1].delete(' ').split('-')
1076
+ end
1077
+
1078
+ # Use it to verify that each field in diags has a color and that this color is among valid colors
1079
+ # * *Args* :
1080
+ # - +valid_codes+ -> Array valid color codes
1081
+ # - +stb_ip+ -> ip address of stb
1082
+ # * *Returns* :
1083
+ # - true if verified, else false
1084
+ def mdn_remote_diags_verify_color_code_on_each_field valid_codes, stb_ip = fetch_ip
1085
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1086
+ counter = 0
1087
+ options.each_value{|link|
1088
+ source = _mdn_remote_diags_get_all_code_from_link(link,stb_ip)
1089
+ page_info = /page\s(\d+)\sof\s(\d+)/.match(source)
1090
+ loginfo2 "Verifying for page [#{page_info[1]}]"
1091
+ fields = source.scan(/<TR><TH ALIGN=RIGHT>(.+)<\/TH><TD>(.+)<\/TD><\/TR>$/)
1092
+ fields.each{|field|
1093
+ unless field[0].eql?('-')
1094
+ color_code = /<FONT COLOR="#(\w+)">.*<\/FONT>/.match(field[1])
1095
+ if color_code.nil?
1096
+ loginfo2 "No color found for field [#{field[0]}]"
1097
+ return false
1098
+ end
1099
+ unless valid_codes.include?(color_code[1])
1100
+ loginfo2 "Unknown color code [#{color_code[1]}] found for field [#{field[0]}]"
1101
+ return false
1102
+ end
1103
+ end
1104
+ }
1105
+ break if page_info[1].eql?(page_info[2])
1106
+ }
1107
+ return true
1108
+ end
1109
+
1110
+ # Use it to get LUA_Rep_Tx value from remote diags
1111
+ # * *Args* :
1112
+ # - +stb_ip+ -> ip address of stb
1113
+ # * *Returns* :
1114
+ # - string if matched else nil
1115
+ def mdn_remote_diags_sdv_LUA_Rep_Tx_value stb_ip = fetch_ip
1116
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1117
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1118
+ value = /LUA\sRep\sTx<.*>(\d*)<\/FONT><\/TD><\/TR>/.match(source)
1119
+ if value.nil?
1120
+ loginfo2 "LUA Rep Tx not found"
1121
+ return nil
1122
+ end
1123
+ return value[1].to_s
1124
+ end
1125
+
1126
+ # Use it to get SelReq_Tx value from remote diags
1127
+ # * *Args* :
1128
+ # - +stb_ip+ -> ip address of stb
1129
+ # * *Returns* :
1130
+ # - string if matched else nil
1131
+ def mdn_remote_diags_sdv_SelReq_Tx_value stb_ip = fetch_ip
1132
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1133
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1134
+ value = /SelReq\sTx<.*>(\d*)<\/FONT><\/TD><\/TR>/.match(source)
1135
+ if value.nil?
1136
+ loginfo2 "SelReq Tx not found"
1137
+ return nil
1138
+ end
1139
+ return value[1].to_s
1140
+ end
1141
+
1142
+ # Use it to get SelConf_Rx value from remote diags
1143
+ # * *Args* :
1144
+ # - +stb_ip+ -> ip address of stb
1145
+ # * *Returns* :
1146
+ # - string if matched else nil
1147
+ def mdn_remote_diags_sdv_SelConf_Rx_value stb_ip = fetch_ip
1148
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1149
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1150
+ value = /SelConf\sRx<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1151
+ if value.nil?
1152
+ loginfo2 "SelConf Rx not found"
1153
+ return nil
1154
+ end
1155
+ return value[1].to_s
1156
+ end
1157
+
1158
+ #Use it to get current time string from mdn diags from remote diags
1159
+ # * *Args* :
1160
+ # - +stb_ip+ -> ip address of stb
1161
+ # * *Returns* :
1162
+ # - time string if value is matched, else nil
1163
+ def mdn_remote_diags_current_time_string stb_ip = fetch_ip
1164
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1165
+ source = _mdn_remote_diags_get_all_code_from_link(options[:initialization_status],stb_ip)
1166
+ value = /Current\stime:<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1167
+ if value.nil?
1168
+ loginfo2 "Current time not found"
1169
+ return nil
1170
+ end
1171
+ return value[1].to_s
1172
+ end
1173
+
1174
+ #Use it to get time stamp from mdn diags from remote diags
1175
+ # * *Args* :
1176
+ # - +stb_ip+ -> ip address of stb
1177
+ # * *Returns* :
1178
+ # - time string, else nil
1179
+ def mdn_remote_diags_presentation_time_stamp_string stb_ip = fetch_ip
1180
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1181
+ source = _mdn_remote_diags_get_all_code_from_link(options[:mpeg_decoder],stb_ip)
1182
+ value = /Presentation\sTimestamp:<.*>(\d*)<\/FONT><\/TD><\/TR>/.match(source)
1183
+ if value.nil?
1184
+ loginfo2 "Presentation time stamp not found"
1185
+ return nil
1186
+ end
1187
+ return value[1].to_s
1188
+ end
1189
+
1190
+ #Use it to get secs since read from mdn diags from remote diags
1191
+ # * *Args* :
1192
+ # - +stb_ip+ -> ip address of stb
1193
+ # * *Returns* :
1194
+ # - time string, else nil
1195
+ def mdn_remote_diags_secs_since_read_string stb_ip = fetch_ip
1196
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1197
+ source = _mdn_remote_diags_get_all_code_from_link(options[:qam_statistics],stb_ip)
1198
+ value = /Secs\sSince\sRead:<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1199
+ if value.nil?
1200
+ loginfo2 "Secs since read not found"
1201
+ return nil
1202
+ end
1203
+ return value[1].to_s
1204
+ end
1205
+
1206
+ #Use it to get fdc bytes recieved from mdn diags from remote diags
1207
+ # * *Args* :
1208
+ # - +stb_ip+ -> ip address of stb
1209
+ # * *Returns* :
1210
+ # - bytes recieved string, else nil
1211
+ def mdn_remote_diags_fdc_bytes_received_string stb_ip = fetch_ip
1212
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1213
+ source = _mdn_remote_diags_get_all_code_from_link(options[:qpsk_statistics],stb_ip)
1214
+ value = /FDC\sBytes\sReceived:<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1215
+ if value.nil?
1216
+ loginfo2 "FDC bytes recieved not found"
1217
+ return nil
1218
+ end
1219
+ return value[1].to_s
1220
+ end
1221
+
1222
+ # Use it to get SDB_Svc_Group value from remote diags
1223
+ # * *Args* :
1224
+ # - +stb_ip+ -> ip address of stb
1225
+ # * *Returns* :
1226
+ # - string if matched else nil
1227
+ def mdn_remote_diags_sdb_svc_group_value stb_ip = fetch_ip
1228
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1229
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1230
+ value = /SDB\sSvc\sGroup<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1231
+ if value.nil?
1232
+ loginfo2 "SDB Svc Group not found"
1233
+ return nil
1234
+ end
1235
+ return value[1].to_s
1236
+ end
1237
+
1238
+ # Use it to get Registration Time value from remote diags
1239
+ # * *Args* :
1240
+ # - +stb_ip+ -> ip address of stb
1241
+ # * *Returns* :
1242
+ # - string if matched else nil
1243
+ def mdn_remote_diags_registration_time_value stb_ip = fetch_ip
1244
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1245
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1246
+ value = /Registration\sTime<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1247
+ if value.nil?
1248
+ loginfo2 "Registration Time not found"
1249
+ return nil
1250
+ end
1251
+ return value[1].to_s
1252
+ end
1253
+
1254
+ # Use it to get DSMCC SessID value from remote diags
1255
+ # * *Args* :
1256
+ # - +stb_ip+ -> ip address of stb
1257
+ # * *Returns* :
1258
+ # - string if matched else nil
1259
+ def mdn_remote_diags_dsmcc_sessid_value stb_ip = fetch_ip
1260
+ options = fetch_link_on_mdn_web_diagnostics(stb_ip)
1261
+ source = _mdn_remote_diags_get_all_code_from_link(options[:switched_digital_broadcast],stb_ip)
1262
+ value = /DSMCC\sSessID<.*>(.*)<\/FONT><\/TD><\/TR>/.match(source)
1263
+ if value.nil?
1264
+ loginfo2 "DSMCC SessID not found"
1265
+ return nil
1266
+ end
1267
+ return value[1].to_s
1268
+ end
1269
+
1270
+ # Use it to get SDV channel change messages
1271
+ # * *Returns* :
1272
+ # - list of channel change messages
1273
+ # each message is hash that contains index, message_type, data
1274
+ # each data element is hash that contains attribute, value (e.g. svcGrpID: 1, client_version: 0, tunerId: 0)
1275
+ def mdn_remote_diags_sdv_channel_change_messages stb_ip = fetch_ip
1276
+ retries=3 # Max retries
1277
+ begin
1278
+ text = _mdn_remote_diags_get_all_code_from_link('/sdv', stb_ip)
1279
+ doc = Nokogiri::HTML(text)
1280
+ title_node = doc.xpath("//h2['SDV Channel Change Messages']").last
1281
+ loginfo2 "Fetching data for : #{title_node.text}"
1282
+ result_arr = []
1283
+ title_node.next_sibling.text.scan(/(\d+\/\d+)\s*(\d+:\d+:\d+)\s*\[(\d+)\]\s*(\w*)\s*\(([^\)]*)\)/).each do |data|
1284
+ # Fetch data attributes
1285
+ data_hash = {}
1286
+ data[4].split(",").each do |d1|
1287
+ attr = d1.split(":")
1288
+ data_hash[attr[0].strip.to_sym] = attr[1].strip
1289
+ end
1290
+
1291
+ result_arr.push({
1292
+ :index => data[2].to_i,
1293
+ :message_type => data[3],
1294
+ :data => data_hash
1295
+ })
1296
+ end
1297
+ return result_arr
1298
+ rescue Timeout::Error
1299
+ retries = retries - 1
1300
+ unless retries.eql?(0)
1301
+ loginfo2 "WARNING: Connection timeout... (trying again)"
1302
+ retry
1303
+ end
1304
+ loginfo2 "WARNING: Connection timeout..."
1305
+ return nil
1306
+ end
1307
+ end
1308
+
1309
+ # Use it to get sdv tuner usage data
1310
+ # * *Args* :
1311
+ # - +stb_ip+ -> ip address of stb
1312
+ # * *Returns* :
1313
+ # - Array of tuner status for each tuner
1314
+ def mdn_remote_diags_sdv_tuner_usage stb_ip = fetch_ip
1315
+ retries=3 # Max retries
1316
+ begin
1317
+ text = _mdn_remote_diags_get_all_code_from_link('/sdv', stb_ip)
1318
+ doc = Nokogiri::HTML(text)
1319
+ title_node = doc.xpath("//h2").select{|node| node.text == 'SDV Tuner Usage'}[0]
1320
+ loginfo2 "Fetching data for : #{title_node.text}"
1321
+ result_arr = []
1322
+ title_node.next_sibling.text.scan(/Status =(\d+)/).each {|dt|
1323
+ result_arr.push(dt[0].to_i)
1324
+ }
1325
+ return result_arr
1326
+ rescue Timeout::Error
1327
+ retries = retries - 1
1328
+ unless retries.eql?(0)
1329
+ loginfo2 "WARNING: Connection timeout... (trying again)"
1330
+ retry
1331
+ end
1332
+ loginfo2 "WARNING: Connection timeout..."
1333
+ return nil
1334
+ end
1335
+ end