[c2925f1a] | 1 | import sys |
---|
| 2 | import os |
---|
| 3 | from SystemLib import * |
---|
| 4 | |
---|
| 5 | def ogUcastSyntax(): |
---|
| 6 | PARM = SESSION = SESSIONPARM = MODE = PORTBASE = PERROR = ADDRESS = TOOL = LEVEL = DEVICE = MBUFFER = SYNTAXSERVER = SYNTAXCLIENT = "" |
---|
| 7 | |
---|
| 8 | # Si se solicita, mostrar ayuda. |
---|
| 9 | if "help" in sys.argv or len(sys.argv) > 2 and sys.argv[2] == "help": |
---|
| 10 | ogHelp(f"{FUNCNAME} SENDPARTITION str_sessionSERVER str_device str_tools str_level", |
---|
| 11 | f"{FUNCNAME} RECEIVERPARTITION str_sessionCLIENT str_device str_tools str_level", |
---|
| 12 | f"{FUNCNAME} SENDFILE str_sessionSERVER str_file", |
---|
| 13 | f"{FUNCNAME} RECEIVERFILE str_sessionCLIENT str_file", |
---|
| 14 | "sessionServer syntax: portbase:ipCLIENT-1:ipCLIENT-2:ipCLIENT-N", |
---|
| 15 | "sessionServer example: 8000:172.17.36.11:172.17.36.12", |
---|
| 16 | "sessionClient syntax: portbase:ipMASTER", |
---|
| 17 | "sessionClient example: 8000:172.17.36.249") |
---|
| 18 | return |
---|
| 19 | PERROR = 0 |
---|
| 20 | |
---|
| 21 | # Error si no se reciben $PARM parámetros. |
---|
| 22 | if "PARTITION" in sys.argv[1]: |
---|
| 23 | PARM = 5 |
---|
| 24 | else: |
---|
| 25 | PARM = 3 |
---|
| 26 | if len(sys.argv) != PARM: |
---|
| 27 | ogRaiseError(OG_ERR_FORMAT, "sin parametros") |
---|
| 28 | return |
---|
| 29 | |
---|
| 30 | # 1er param check |
---|
| 31 | if sys.argv[1] not in ["SENDPARTITION", "sendpartition", "RECEIVERPARTITION", "receiverpartition", "SENDFILE", "sendfile", "RECEIVERFILE", "receiverfile"]: |
---|
| 32 | ogRaiseError(OG_ERR_FORMAT, f"1st param: {sys.argv[1]}") |
---|
| 33 | PERROR = 1 |
---|
| 34 | |
---|
| 35 | # 2º param check |
---|
| 36 | if "SEND" in sys.argv[1]: |
---|
| 37 | MODE = "server" |
---|
| 38 | else: |
---|
| 39 | MODE = "client" |
---|
| 40 | |
---|
| 41 | ######### No controlamos el numero de elementos de la session unicast porque en el master es variable en numero |
---|
| 42 | # TODO: diferenciamos los paramatros especificos de la sessión unicast |
---|
| 43 | # SI: controlamos todos los parametros de la sessión unicast. |
---|
| 44 | # [ $MODE == "client" ] && SESSIONPARM=2 || SESSIONPARM=6 |
---|
| 45 | OIFS = IFS |
---|
| 46 | IFS = ':' |
---|
| 47 | SESSION = sys.argv[2].split(':') |
---|
| 48 | IFS = OIFS |
---|
| 49 | |
---|
| 50 | # [[ ${#SESSION[*]} == $SESSIONPARM ]] || ogRaiseError $OG_ERR_FORMAT "parametros session multicast no completa" || PERROR=2# return $? |
---|
| 51 | |
---|
| 52 | # controlamos el PORTBASE de la sesion. Comun.- |
---|
| 53 | PORTBASE = SESSION[0] |
---|
| 54 | if PORTBASE not in ["8000", "8001", "8002", "8003", "8004", "8005"]: |
---|
| 55 | ogRaiseError(OG_ERR_FORMAT, f"McastSession portbase {SESSION[0]}") |
---|
| 56 | PERROR = 3 |
---|
| 57 | |
---|
| 58 | if MODE == "server": |
---|
| 59 | SIZEARRAY = len(SESSION) |
---|
| 60 | for i in range(1, SIZEARRAY): |
---|
| 61 | ADDRESS += f" -O {SESSION[i]}:{PORTBASE}" |
---|
| 62 | # echo " -O ${SESSION[$i]}:$PORTBASE" |
---|
| 63 | else: |
---|
| 64 | ADDRESS = f"{SESSION[1]}:{PORTBASE}" |
---|
| 65 | |
---|
| 66 | # 3er param check - que puede ser un dispositvo o un fichero. |
---|
| 67 | # [ -n "$(ogGetPath "$3")" ] || ogRaiseError $OG_ERR_NOTFOUND " device or file $3" || PERROR=9 #return $? |
---|
| 68 | DEVICE = sys.argv[3] |
---|
| 69 | |
---|
| 70 | # 4 y 5 param check . solo si es sobre particiones. |
---|
| 71 | if PARM == 5: |
---|
| 72 | # 4 param check |
---|
| 73 | if sys.argv[4] not in ["partclone", "PARTCLONE", "partimage", "PARTIMAGE", "ntfsclone", "NTFSCLONE"]: |
---|
| 74 | ogRaiseError(OG_ERR_NOTFOUND, f" herramienta {sys.argv[4]} no soportada") |
---|
| 75 | PERROR = 10 |
---|
| 76 | TOOL = sys.argv[4] |
---|
| 77 | if sys.argv[5] not in ["lzop", "gzip", "LZOP", "GZIP", "0", "1"]: |
---|
| 78 | ogRaiseError(OG_ERR_NOTFOUND, f" compresor {sys.argv[5]} no valido") |
---|
| 79 | PERROR = 11 |
---|
| 80 | |
---|
| 81 | if PERROR != 0: |
---|
| 82 | ogRaiseError(OG_ERR_UCASTSYNTAXT, f" {PERROR}") |
---|
| 83 | return |
---|
| 84 | |
---|
| 85 | # Generamos la instrucción base de unicast -Envio,Recepcion- |
---|
| 86 | SYNTAXSERVER = f"mbuffer {ADDRESS}" |
---|
| 87 | SYNTAXCLIENT = f"mbuffer -I {ADDRESS}" |
---|
| 88 | |
---|
| 89 | if sys.argv[1] == "SENDPARTITION": |
---|
| 90 | PROG1 = ogCreateImageSyntax(DEVICE, " ", TOOL, LEVEL).split("|")[0].split("|")[2].replace(">", "") |
---|
| 91 | print(f"{PROG1} | {SYNTAXSERVER}") |
---|
| 92 | elif sys.argv[1] == "RECEIVERPARTITION": |
---|
| 93 | COMPRESSOR = ogRestoreImageSyntax(" ", DEVICE, TOOL, LEVEL).split("|")[0] |
---|
| 94 | TOOLS = ogRestoreImageSyntax(" ", DEVICE, TOOL, LEVEL).split("|")[-1] |
---|
| 95 | print(f"{SYNTAXCLIENT} | {COMPRESSOR} | {TOOLS}") |
---|
| 96 | elif sys.argv[1] == "SENDFILE": |
---|
| 97 | print(f"{SYNTAXSERVER} -i {sys.argv[3]}") |
---|
| 98 | elif sys.argv[1] == "RECEIVERFILE": |
---|
| 99 | print(f"{SYNTAXCLIENT} -i {sys.argv[3]}") |
---|
| 100 | # |
---|
| 101 | def ogUcastSendPartition(): |
---|
| 102 | # Variables locales |
---|
| 103 | PART = COMMAND = RETVAL = "" |
---|
| 104 | |
---|
| 105 | # Si se solicita, mostrar ayuda. |
---|
| 106 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 107 | ogHelp(f"{FUNCNAME} int_ndisk int_npart SessionUNICAST-SERVER tools compresor", |
---|
| 108 | f"{FUNCNAME} 1 1 8000:172.17.36.11:172.17.36.12 partclone lzop") |
---|
| 109 | return |
---|
| 110 | |
---|
| 111 | # Error si no se reciben 5 parámetros. |
---|
| 112 | if len(sys.argv) != 6: |
---|
| 113 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 114 | return |
---|
| 115 | |
---|
| 116 | # chequeamos la particion. |
---|
| 117 | PART = ogDiskToDev(sys.argv[2], sys.argv[3]) |
---|
| 118 | if not PART: |
---|
| 119 | return |
---|
| 120 | |
---|
| 121 | ogUnmount(sys.argv[2], sys.argv[3]) |
---|
| 122 | |
---|
| 123 | # generamos la instrucción a ejecutar. |
---|
| 124 | COMMAND = ogUcastSyntax("SENDPARTITION", sys.argv[4], PART, sys.argv[5], sys.argv[6]) |
---|
| 125 | RETVAL = 0 |
---|
| 126 | |
---|
| 127 | if RETVAL > 0: |
---|
| 128 | return RETVAL |
---|
| 129 | else: |
---|
| 130 | print(COMMAND) |
---|
| 131 | eval(COMMAND) |
---|
| 132 | if RETVAL > 0: |
---|
| 133 | ogRaiseError(OG_ERR_UCASTSENDPARTITION) |
---|
| 134 | return RETVAL |
---|
| 135 | # |
---|
| 136 | def ogUcastReceiverPartition(): |
---|
| 137 | # Variables locales |
---|
| 138 | PART = COMMAND = RETVAL = "" |
---|
| 139 | |
---|
| 140 | # Si se solicita, mostrar ayuda. |
---|
| 141 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 142 | ogHelp(f"{FUNCNAME} int_ndisk int_npart SessionMulticastCLIENT tools compresor", |
---|
| 143 | f"{FUNCNAME} 1 1 8000:ipMASTER partclone lzop") |
---|
| 144 | return |
---|
| 145 | |
---|
| 146 | # Error si no se reciben 5 parámetros. |
---|
| 147 | if len(sys.argv) != 6: |
---|
| 148 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 149 | return |
---|
| 150 | |
---|
| 151 | # chequeamos la particion. |
---|
| 152 | PART = ogDiskToDev(sys.argv[2], sys.argv[3]) |
---|
| 153 | if not PART: |
---|
| 154 | return |
---|
| 155 | |
---|
| 156 | ogUnmount(sys.argv[2], sys.argv[3]) |
---|
| 157 | |
---|
| 158 | # generamos la instrucción a ejecutar. |
---|
| 159 | COMMAND = ogUcastSyntax("RECEIVERPARTITION", sys.argv[4], PART, sys.argv[5], sys.argv[6]) |
---|
| 160 | RETVAL = 0 |
---|
| 161 | |
---|
| 162 | if RETVAL > 0: |
---|
| 163 | return RETVAL |
---|
| 164 | else: |
---|
| 165 | print(COMMAND) |
---|
| 166 | eval(COMMAND) |
---|
| 167 | if RETVAL > 0: |
---|
| 168 | ogRaiseError(OG_ERR_UCASTRECEIVERPARTITION) |
---|
| 169 | return RETVAL |
---|
| 170 | # |
---|
| 171 | def ogUcastSendFile(): |
---|
| 172 | # Variables locales |
---|
| 173 | ARG = ARGS = SOURCE = TARGET = COMMAND = DEVICE = RETVAL = LOGFILE |
---|
| 174 | |
---|
| 175 | # ARGS usado para controlar ubicación de la sesion multicast |
---|
| 176 | # Si se solicita, mostrar ayuda. |
---|
| 177 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 178 | ogHelp(f"{FUNCNAME} [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast(puerto:ip:ip:ip)", |
---|
| 179 | f"{FUNCNAME} 1 1 /aula1/winxp.img 8000:172.17.36.11:172.17.36.12", |
---|
| 180 | f"{FUNCNAME} REPO /aula1/ubuntu.iso sesionUcast", |
---|
| 181 | f"{FUNCNAME} CACHE /aula1/winxp.img sesionUcast", |
---|
| 182 | f"{FUNCNAME} /opt/opengnsys/images/aula1/hd500.vmx sesionUcast") |
---|
| 183 | return |
---|
| 184 | |
---|
| 185 | ARGS = sys.argv[1:] |
---|
| 186 | if ARGS[0].startswith("/"): |
---|
| 187 | SOURCE = ogGetPath(ARGS[0]) |
---|
| 188 | ARG = 2 |
---|
| 189 | DEVICE = ARGS[0] |
---|
| 190 | elif ARGS[0].isdigit(): |
---|
| 191 | SOURCE = ogGetPath(ARGS[0], ARGS[1], ARGS[2]) |
---|
| 192 | ARG = 4 |
---|
| 193 | DEVICE = f"{ARGS[0]} {ARGS[1]} {ARGS[2]}" |
---|
| 194 | else: |
---|
| 195 | SOURCE = ogGetPath(ARGS[0], ARGS[1]) |
---|
| 196 | ARG = 3 |
---|
| 197 | DEVICE = f"{ARGS[0]} {ARGS[1]}" |
---|
| 198 | |
---|
| 199 | # Error si no se reciben los argumentos ARG necesarios según la opcion. |
---|
| 200 | if len(sys.argv) != ARG: |
---|
| 201 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 202 | return |
---|
| 203 | |
---|
| 204 | # Comprobar fichero origen |
---|
| 205 | if not ogGetPath(SOURCE): |
---|
| 206 | ogRaiseError(OG_ERR_NOTFOUND, f" device or file {DEVICE} not found") |
---|
| 207 | return |
---|
| 208 | |
---|
| 209 | SESSION = sys.argv[ARG] |
---|
| 210 | |
---|
| 211 | # generamos la instrucción a ejecutar. |
---|
| 212 | COMMAND = ogUcastSyntax("SENDFILE", SESSION, SOURCE) |
---|
| 213 | RETVAL = 0 |
---|
| 214 | |
---|
| 215 | if RETVAL > 0: |
---|
| 216 | return RETVAL |
---|
| 217 | else: |
---|
| 218 | print(COMMAND) |
---|
| 219 | eval(COMMAND) |
---|
| 220 | if RETVAL > 0: |
---|
| 221 | ogRaiseError(OG_ERR_UCASTSENDFILE) |
---|
| 222 | return RETVAL |
---|
| 223 | # |
---|
| 224 | def ogMcastSyntax(): |
---|
| 225 | PERROR = 0 |
---|
| 226 | |
---|
| 227 | # Si se solicita, mostrar ayuda. |
---|
| 228 | if "help" in sys.argv or len(sys.argv) > 2 and sys.argv[2] == "help": |
---|
| 229 | ogHelp(f"{FUNCNAME} SENDPARTITION str_sessionSERVER str_device str_tools str_level", |
---|
| 230 | f"{FUNCNAME} RECEIVERPARTITION str_sessionCLIENT str_device str_tools str_level", |
---|
| 231 | f"{FUNCNAME} SENDFILE str_sessionSERVER str_file", |
---|
| 232 | f"{FUNCNAME} RECEIVERFILE str_sessionCLIENT str_file", |
---|
| 233 | "sessionServer syntax: portbase:method:mcastaddress:speed:nclients:ntimeWaitingUntilNclients", |
---|
| 234 | "sessionServer example: 9000:full-duplex|half-duplex|broadcast:239.194.17.36:80M:50:60", |
---|
| 235 | "sessionClient syntax: portbase", |
---|
| 236 | "sessionClient example: 9000", |
---|
| 237 | "sessionClient syntax: portbase:serverIP:TimeOut_session:TimeOut_transmision", |
---|
| 238 | "sessionClient example: 9000:172.17.88.161:40:120") |
---|
| 239 | return |
---|
| 240 | |
---|
| 241 | # BEGIN NUMBERS PARAMETERS CHECK AND SESSION OPTIONS IF CLIENT OR SERVER |
---|
| 242 | if "PARTITION" in sys.argv[1]: |
---|
| 243 | PARM = 5 |
---|
| 244 | else: |
---|
| 245 | PARM = 3 |
---|
| 246 | if len(sys.argv) != PARM: |
---|
| 247 | ogRaiseError(OG_ERR_FORMAT, "sin parametros") |
---|
| 248 | return |
---|
| 249 | |
---|
| 250 | ogCheckStringInGroup(sys.argv[1], "SENDPARTITION sendpartition RECEIVERPARTITION receiverpartition SENDFILE sendfile RECEIVERFILE receiverfile") or ogRaiseError(OG_ERR_FORMAT, f"1st param: {sys.argv[1]}") or PERROR = 1 |
---|
| 251 | |
---|
| 252 | if "SEND" in sys.argv[1]: |
---|
| 253 | MODE = "server" |
---|
| 254 | else: |
---|
| 255 | MODE = "client" |
---|
| 256 | |
---|
| 257 | SESSION = sys.argv[2].split(':') |
---|
| 258 | if MODE == "client": |
---|
| 259 | SESSIONPARM = 1 |
---|
| 260 | else: |
---|
| 261 | SESSIONPARM = 6 |
---|
| 262 | if len(SESSION) != SESSIONPARM: |
---|
| 263 | ogRaiseError(OG_ERR_FORMAT, "parametros session de cliente multicast no completa") or PERROR = 2 |
---|
| 264 | |
---|
| 265 | if MODE == "server": |
---|
| 266 | ogCheckStringInGroup(SESSION[1], "full-duplex FULL-DUPLEX half-duplex HALF-DUPLEX broadcast BROADCAST") or ogRaiseError(OG_ERR_FORMAT, f"McastSession method {SESSION[1]}") or PERROR = 4 |
---|
| 267 | ogCheckIpAddress(SESSION[2]) or ogRaiseError(OG_ERR_FORMAT, f"McastSession address {SESSION[2]}") or PERROR = 5 |
---|
| 268 | ogCheckStringInReg(SESSION[3], "^[0-9]{1,3}\M$") or ogRaiseError(OG_ERR_FORMAT, f"McastSession bitrate {SESSION[3]}") or PERROR = 6 |
---|
| 269 | ogCheckStringInReg(SESSION[4], "^[0-9]{1,10}$") or ogRaiseError(OG_ERR_FORMAT, f"McastSession nclients {SESSION[4]}") or PERROR = 7 |
---|
| 270 | ogCheckStringInReg(SESSION[5], "^[0-9]{1,10}$") or ogRaiseError(OG_ERR_FORMAT, f"McastSession maxtime {SESSION[5]}") or PERROR = 8 |
---|
| 271 | |
---|
| 272 | if PERROR != 0: |
---|
| 273 | ogRaiseError(OG_ERR_MCASTSYNTAXT, f" {PERROR}") |
---|
| 274 | return |
---|
| 275 | # END NUMBERS PARAMETERS CHECK |
---|
| 276 | |
---|
| 277 | # BEGIN SERVER SESSION |
---|
| 278 | if MODE == "server": |
---|
| 279 | PORTBASE = SESSION[0] |
---|
| 280 | METHOD = SESSION[1] |
---|
| 281 | ADDRESS = SESSION[2] |
---|
| 282 | BITRATE = SESSION[3] |
---|
| 283 | NCLIENTS = SESSION[4] |
---|
| 284 | MAXTIME = SESSION[5] |
---|
| 285 | CERROR = "8x8/128" |
---|
| 286 | if "mbuffer" in sys.modules: |
---|
| 287 | MBUFFER = " --pipe 'mbuffer -q -m 20M' " |
---|
| 288 | else: |
---|
| 289 | MBUFFER = "" |
---|
| 290 | SYNTAXSERVER = f"udp-sender {MBUFFER} --nokbd --portbase {PORTBASE} --{METHOD} --mcast-data-address {ADDRESS} --fec {CERROR} --max-bitrate {BITRATE} --ttl 16 --min-clients {NCLIENTS} --max-wait {MAXTIME} --autostart {MAXTIME} --log /tmp/mcast.log" |
---|
| 291 | # END SERVER SESSION |
---|
| 292 | |
---|
| 293 | # BEGIN CLIENT SESSION |
---|
| 294 | if MODE == "client": |
---|
| 295 | PORTBASE = SESSION[0] |
---|
| 296 | if ogCheckIpAddress(SESSION[1]): |
---|
| 297 | SERVERADDRESS = f" --mcast-rdv-address {SESSION[1]}" |
---|
| 298 | else: |
---|
| 299 | REPOIP = ogGetRepoIp() |
---|
| 300 | CLIENTIP = " ".join([addr.split("/")[0] for addr in subprocess.check_output(["ip", "-o", "address", "show", "up"]).decode().splitlines() if "lo" not in addr]) |
---|
| 301 | MASCARA = CLIENTIP.split("/")[1] |
---|
| 302 | CLIENTIP = CLIENTIP.split("/")[0] |
---|
| 303 | RIPBT = "" |
---|
| 304 | IPBT = "" |
---|
| 305 | for i in range(1, 5): |
---|
| 306 | RIP = str(int(REPOIP.split(".")[i-1]) + 256) |
---|
| 307 | RIPB = "" |
---|
| 308 | while RIP > 0: |
---|
| 309 | COCIENTE = RIP // 2 |
---|
| 310 | RESTO = RIP % 2 |
---|
| 311 | RIPB = str(RESTO) + RIPB |
---|
| 312 | RIP = COCIENTE |
---|
| 313 | RIPB = RIPB[1:] |
---|
| 314 | RIPBT += RIPB |
---|
| 315 | IP = str(int(CLIENTIP.split(".")[i-1]) + 256) |
---|
| 316 | IPB = "" |
---|
| 317 | while IP > 0: |
---|
| 318 | COCIENTE = IP // 2 |
---|
| 319 | RESTO = IP % 2 |
---|
| 320 | IPB = str(RESTO) + IPB |
---|
| 321 | IP = COCIENTE |
---|
| 322 | IPB = IPB[1:] |
---|
| 323 | IPBT += IPB |
---|
| 324 | REPOSUBRED = RIPBT[:MASCARA] |
---|
| 325 | CLIENTSUBRED = IPBT[:MASCARA] |
---|
| 326 | if REPOSUBRED == CLIENTSUBRED: |
---|
| 327 | SERVERADDRESS = "" |
---|
| 328 | else: |
---|
| 329 | SERVERADDRESS = f" --mcast-rdv-address {REPOIP}" |
---|
| 330 | if ogCheckStringInReg(SESSION[2], "^[0-9]{1,10}$"): |
---|
| 331 | if SESSION[2] == "0": |
---|
| 332 | STARTTIMEOUT = "" |
---|
| 333 | else: |
---|
| 334 | STARTTIMEOUT = f" --start-timeout {SESSION[2]}" |
---|
| 335 | else: |
---|
| 336 | STARTTIMEOUT = "" |
---|
| 337 | if ogCheckStringInReg(SESSION[3], "^[0-9]{1,10}$"): |
---|
| 338 | if SESSION[3] == "0": |
---|
| 339 | RECEIVERTIMEOUT = "" |
---|
| 340 | else: |
---|
| 341 | RECEIVERTIMEOUT = f" --receive-timeout {SESSION[3]}" |
---|
| 342 | else: |
---|
| 343 | RECEIVERTIMEOUT = "" |
---|
| 344 | if "udp-receiver" not in ISUDPCAST: |
---|
| 345 | STARTTIMEOUT = "" |
---|
| 346 | RECEIVERTIMEOUT = "" |
---|
| 347 | SYNTAXCLIENT = f"udp-receiver {MBUFFER} --portbase {PORTBASE}{SERVERADDRESS}{STARTTIMEOUT}{RECEIVERTIMEOUT} --log /tmp/mcast.log" |
---|
| 348 | # END CLIENT SESSION |
---|
| 349 | |
---|
| 350 | # BEGIN MAIN PROGRAM |
---|
| 351 | if sys.argv[1] == "SENDPARTITION": |
---|
| 352 | PROG1 = ogCreateImageSyntax(DEVICE, " ", TOOL, LEVEL).split("|")[0].split("|")[2].replace(">", "") |
---|
| 353 | print(f"{PROG1} | {SYNTAXSERVER}") |
---|
| 354 | elif sys.argv[1] == "RECEIVERPARTITION": |
---|
| 355 | COMPRESSOR = ogRestoreImageSyntax(" ", DEVICE, TOOL, LEVEL).split("|")[0] |
---|
| 356 | TOOLS = ogRestoreImageSyntax(" ", DEVICE, TOOL, LEVEL).split("|")[-1] |
---|
| 357 | print(f"{SYNTAXCLIENT} | {COMPRESSOR} | {TOOLS}") |
---|
| 358 | elif sys.argv[1] == "SENDFILE": |
---|
| 359 | print(f"{SYNTAXSERVER} --file {sys.argv[3]}") |
---|
| 360 | elif sys.argv[1] == "RECEIVERFILE": |
---|
| 361 | print(f"{SYNTAXCLIENT} --file {sys.argv[3]}") |
---|
| 362 | # END MAIN PROGRAM |
---|
| 363 | # |
---|
| 364 | def ogMcastSendFile(): |
---|
| 365 | # Variables locales |
---|
| 366 | ARGS = ARG = SOURCE = TARGET = COMMAND = DEVICE = RETVAL = LOGFILE |
---|
| 367 | |
---|
| 368 | # LOGFILE = "/tmp/mcast.log" |
---|
| 369 | |
---|
| 370 | # ARGS usado para controlar ubicación de la sesion multicast |
---|
| 371 | # Si se solicita, mostrar ayuda. |
---|
| 372 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 373 | ogHelp(f"{FUNCNAME} [str_REPOSITORY] [int_ndisk int_npart] /Relative_path_file sesionMcast", |
---|
| 374 | f"{FUNCNAME} 1 1 /aula1/winxp.img sesionMcast", |
---|
| 375 | f"{FUNCNAME} REPO /aula1/ubuntu.iso sesionMcast", |
---|
| 376 | f"{FUNCNAME} CACHE /aula1/winxp.img sesionMcast", |
---|
| 377 | f"{FUNCNAME} /opt/opengnsys/images/aula1/hd500.vmx sesionMcast") |
---|
| 378 | return |
---|
| 379 | |
---|
| 380 | ARGS = sys.argv[1:] |
---|
| 381 | if ARGS[0].startswith("/"): |
---|
| 382 | SOURCE = ogGetPath(ARGS[0]) |
---|
| 383 | ARG = 2 |
---|
| 384 | DEVICE = ARGS[0] |
---|
| 385 | elif ARGS[0].isdigit(): |
---|
| 386 | SOURCE = ogGetPath(ARGS[0], ARGS[1], ARGS[2]) |
---|
| 387 | ARG = 4 |
---|
| 388 | DEVICE = f"{ARGS[0]} {ARGS[1]} {ARGS[2]}" |
---|
| 389 | else: |
---|
| 390 | SOURCE = ogGetPath(ARGS[0], ARGS[1]) |
---|
| 391 | ARG = 3 |
---|
| 392 | DEVICE = f"{ARGS[0]} {ARGS[1]}" |
---|
| 393 | |
---|
| 394 | # Error si no se reciben los argumentos ARG necesarios según la opcion. |
---|
| 395 | if len(sys.argv) != ARG: |
---|
| 396 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 397 | return |
---|
| 398 | |
---|
| 399 | # Comprobar fichero origen |
---|
| 400 | if not ogGetPath(SOURCE): |
---|
| 401 | ogRaiseError(OG_ERR_NOTFOUND, f" device or file {DEVICE} not found") |
---|
| 402 | return |
---|
| 403 | |
---|
| 404 | SESSION = sys.argv[ARG] |
---|
| 405 | |
---|
| 406 | # generamos la instrucción a ejecutar. |
---|
| 407 | COMMAND = ogMcastSyntax("SENDFILE", SESSION, SOURCE) |
---|
| 408 | RETVAL = 0 |
---|
| 409 | |
---|
| 410 | if RETVAL > 0: |
---|
| 411 | return RETVAL |
---|
| 412 | else: |
---|
| 413 | print(COMMAND) |
---|
| 414 | eval(COMMAND) |
---|
| 415 | if RETVAL > 0: |
---|
| 416 | ogRaiseError(OG_ERR_MCASTSENDFILE) |
---|
| 417 | return RETVAL |
---|
| 418 | # |
---|
| 419 | def ogMcastReceiverFile(): |
---|
| 420 | # Variables locales |
---|
| 421 | ARGS = ARG = TARGETDIR = TARGETFILE = COMMAND = "" |
---|
| 422 | |
---|
| 423 | # Si se solicita, mostrar ayuda. |
---|
| 424 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 425 | ogHelp(f"{FUNCNAME} [str_portMcast] [[Relative_path_file] | [str_REPOSITORY path_file] | [int_ndisk int_npart path_file]]", |
---|
| 426 | f"{FUNCNAME} 9000 /PS1_PH1.img", |
---|
| 427 | f"{FUNCNAME} 9000 CACHE /aula1/PS2_PH4.img", |
---|
| 428 | f"{FUNCNAME} 9000 1 1 /isos/linux.iso") |
---|
| 429 | return |
---|
| 430 | |
---|
| 431 | ARGS = sys.argv[1:] |
---|
| 432 | if ARGS[1].startswith("/"): |
---|
| 433 | TARGETDIR = ogGetParentPath(ARGS[1]) |
---|
| 434 | ARG = 2 |
---|
| 435 | elif ARGS[1].isdigit(): |
---|
| 436 | TARGETDIR = ogGetParentPath(ARGS[1], ARGS[2], ARGS[3]) |
---|
| 437 | ARG = 4 |
---|
| 438 | else: |
---|
| 439 | TARGETDIR = ogGetParentPath(ARGS[1], ARGS[2]) |
---|
| 440 | ARG = 3 |
---|
| 441 | |
---|
| 442 | # Error si no se reciben los argumentos ARG necesarios según la opcion. |
---|
| 443 | if len(sys.argv) != ARG: |
---|
| 444 | ogRaiseError(OG_ERR_FORMAT, "Parametros no admitidos") |
---|
| 445 | return |
---|
| 446 | |
---|
| 447 | # obtenemos el nombre del fichero a descargar. |
---|
| 448 | TARGETFILE = os.path.basename(ARGS[ARG]) |
---|
| 449 | |
---|
| 450 | # generamos la instrucción a ejecutar. |
---|
| 451 | COMMAND = ogMcastSyntax("RECEIVERFILE", sys.argv[1], f"{TARGETDIR}/{TARGETFILE}") |
---|
| 452 | RETVAL = 0 |
---|
| 453 | |
---|
| 454 | if RETVAL > 0: |
---|
| 455 | return RETVAL |
---|
| 456 | else: |
---|
| 457 | print(COMMAND) |
---|
| 458 | eval(COMMAND) |
---|
| 459 | if RETVAL > 0: |
---|
| 460 | ogRaiseError(OG_ERR_MCASTRECEIVERFILE, TARGETFILE) |
---|
| 461 | return RETVAL |
---|
| 462 | #[ -s "$LOGFILE" ] || return 21 |
---|
| 463 | # |
---|
| 464 | def ogMcastSendPartition(): |
---|
| 465 | # Variables locales |
---|
| 466 | PART = "" |
---|
| 467 | COMMAND = "" |
---|
| 468 | RETVAL = 0 |
---|
| 469 | |
---|
| 470 | # Si se solicita, mostrar ayuda. |
---|
| 471 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 472 | ogHelp(f"{FUNCNAME} int_ndisk int_npart SessionMulticastSERVER tools compresor", |
---|
| 473 | f"{FUNCNAME} 1 1 9000:full-duplex:239.194.37.31:50M:20:2 partclone lzop") |
---|
| 474 | return |
---|
| 475 | |
---|
| 476 | # Error si no se reciben 5 parámetros. |
---|
| 477 | if len(sys.argv) != 6: |
---|
| 478 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 479 | return |
---|
| 480 | |
---|
| 481 | # chequeamos la particion. |
---|
| 482 | PART = ogDiskToDev(sys.argv[2], sys.argv[3]) |
---|
| 483 | if not PART: |
---|
| 484 | return |
---|
| 485 | |
---|
| 486 | ogUnmount(sys.argv[2], sys.argv[3]) |
---|
| 487 | |
---|
| 488 | # generamos la instrucción a ejecutar. |
---|
| 489 | COMMAND = ogMcastSyntax("SENDPARTITION", sys.argv[4], PART, sys.argv[5], sys.argv[6]) |
---|
| 490 | RETVAL = 0 |
---|
| 491 | |
---|
| 492 | if RETVAL > 0: |
---|
| 493 | return RETVAL |
---|
| 494 | else: |
---|
| 495 | print(COMMAND) |
---|
| 496 | eval(COMMAND) |
---|
| 497 | if RETVAL > 0: |
---|
| 498 | ogRaiseError(OG_ERR_MCASTSENDPARTITION) |
---|
| 499 | return RETVAL |
---|
| 500 | # |
---|
| 501 | def ogMcastReceiverPartition(): |
---|
| 502 | # Variables locales |
---|
| 503 | PART = "" |
---|
| 504 | COMMAND = "" |
---|
| 505 | RETVAL = 0 |
---|
| 506 | |
---|
| 507 | # Si se solicita, mostrar ayuda. |
---|
| 508 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 509 | ogHelp(f"{FUNCNAME} int_ndisk int_npart SessionMulticastCLIENT tools compresor", |
---|
| 510 | f"{FUNCNAME} 1 1 9000 partclone lzop") |
---|
| 511 | return |
---|
| 512 | |
---|
| 513 | # Error si no se reciben 5 parámetros. |
---|
| 514 | if len(sys.argv) != 6: |
---|
| 515 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 516 | return |
---|
| 517 | |
---|
| 518 | # chequeamos la particion. |
---|
| 519 | PART = ogDiskToDev(sys.argv[2], sys.argv[3]) |
---|
| 520 | if not PART: |
---|
| 521 | return |
---|
| 522 | |
---|
| 523 | ogUnmount(sys.argv[2], sys.argv[3]) |
---|
| 524 | |
---|
| 525 | # generamos la instrucción a ejecutar. |
---|
| 526 | COMMAND = ogMcastSyntax("RECEIVERPARTITION", sys.argv[4], PART, sys.argv[5], sys.argv[6]) |
---|
| 527 | RETVAL = 0 |
---|
| 528 | |
---|
| 529 | if RETVAL > 0: |
---|
| 530 | return RETVAL |
---|
| 531 | else: |
---|
| 532 | print(COMMAND) |
---|
| 533 | eval(COMMAND) |
---|
| 534 | if RETVAL > 0: |
---|
| 535 | ogRaiseError(OG_ERR_MCASTSENDPARTITION) |
---|
| 536 | return RETVAL |
---|
| 537 | # |
---|
| 538 | def ogMcastRequest(): |
---|
| 539 | # Variables locales |
---|
| 540 | FILE = "" |
---|
| 541 | PROTOOPT = "" |
---|
| 542 | PORT = "" |
---|
| 543 | PORTAUX = "" |
---|
| 544 | REPOIP = "" |
---|
| 545 | REPOPORTAUX = "" |
---|
| 546 | REPEAT = 0 |
---|
| 547 | OGUNIT = "$(df|awk '/ogimages/ {print $1}'|cut -d/ -f5)/" |
---|
| 548 | |
---|
| 549 | # Si se solicita, mostrar ayuda. |
---|
| 550 | if len(sys.argv) > 1 and sys.argv[1] == "help": |
---|
| 551 | ogHelp(f"{FUNCNAME} path_filename str_mcastoptions") |
---|
| 552 | return |
---|
| 553 | |
---|
| 554 | # Error si no se reciben 2 parámetros. |
---|
| 555 | if len(sys.argv) != 3: |
---|
| 556 | ogRaiseError(OG_ERR_FORMAT) |
---|
| 557 | return |
---|
| 558 | |
---|
| 559 | FILE = f"{OGUNIT}{sys.argv[1]}" |
---|
| 560 | PROTOOPT = sys.argv[2] |
---|
| 561 | |
---|
| 562 | # TODO: CONTROL PARAMETROS |
---|
| 563 | |
---|
| 564 | PORT = PROTOOPT.split(":")[0] |
---|
| 565 | PORTAUX = str(int(PORT) + 1) |
---|
| 566 | REPOIP = ogGetRepoIp() |
---|
| 567 | REPOPORTAUX = 2009 |
---|
| 568 | REPEAT = 0 |
---|
| 569 | while not nmap -n -sU -p $PORTAUX $REPOIP | grep open: |
---|
| 570 | REPEAT += 1 |
---|
| 571 | if REPEAT >= 6: |
---|
| 572 | ogRaiseError("session log", OG_ERR_PROTOCOLJOINMASTER, f"MULTICAST {FILE} {PROTOOPT} {FILELIST}") |
---|
| 573 | return |
---|
| 574 | print(f"{MSG_SCRIPTS_TASK_START}: hose {REPOIP} {REPOPORTAUX} --out sh -c 'echo -ne START_MULTICAST {FILE} {PROTOOPT}'") |
---|
| 575 | # update-cache: |
---|
| 576 | hose(REPOIP, REPOPORTAUX, "--out sh -c 'echo -ne START_MULTICAST {FILE} {PROTOOPT}'") |
---|
| 577 | # multicas-direct: hose {REPOIP} 2009 --out sh -c 'echo -ne START_MULTICAST /{IMAGE}.img {OPTPROTOCOLO}' |
---|
| 578 | time.sleep(10) |
---|
| 579 | # |
---|