рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд▓реИрдиреЗрдЯрд▓реИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдиреЛрдбреНрд╕ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╢рд╛рдпрдж рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рд╕рдордп рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рджреЗрдЧрд╛ред

рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рджрд╛рдВрд╡ рдкрд░ рд▓рдЧрд╛ рд╣реИред рдкреНрд▓реИрдиреЗрдЯрд▓реИрдм рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдирдИ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдпрд╛ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд▓реИрдиреЗрдЯрд▓реИрдм рдиреЛрдбреНрд╕ (рдЙрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 1024 рд╣реИрдВ) рд╡рд┐рднрд┐рдиреНрди рджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рдЙрди рд╕рдВрд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬреЛ рдкреНрд▓реИрдиреЗрдЯрд▓реИрдм рдиреЛрдбреНрд╕ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рддреЗ рд╣реИрдВред PlanetLab рдкрд░ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд▓реЗрдЦ
рдпрд╣рд╛рдБ рд╣реИ ред
рдпрджрд┐ рдЖрдк рд╡рд┐рддрд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ PlanetLab рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╡рд┐рддрд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдиреЛрдбреНрд╕ (рдиреЛрдбреНрд╕) рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ PlanetLab рдореЗрдВ, рдиреЛрдб рдЕрдХреНрд╕рд░ рдСрдлрд╝рд▓рд╛рдЗрди рдЬрд╛рддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЗрди рдиреЛрдбреНрд╕ рдХреЛ рдЖрдкрдХреЗ рдЦрд╛рддреЗ (рд╕реНрд▓рд╛рдЗрд╕) рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╣реА рдХрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдореИрдВ рднреА рдЗрд╕ рд▓рд┐рдкрд┐ рдХреЛ рдЖрдкрдореЗрдВ рдмрд╛рдБрдЯрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдпрд╣ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред
рд╕рднреА рдкреНрд▓реИрдиреЗрдЯрд▓реИрдм рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг
www.planet-lab.eu/doc/api рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдЦреБрдж рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ред
#! / usr / bin / env рдЕрдЬрдЧрд░рдЖрдпрд╛рдд xmlrpclib
рдЖрдпрд╛рдд sys
plc_host =
'www.planet-lab.eu'рдСрд░реНрдЯ =
{[
AuthMethod ' :
' gpg ' ,)
'рдирд╛рдо' :
'рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо' ,
'рд╣рд╕реНрддрд╛рдХреНрд╖рд░' :
'GnuPG рд╣рд╕реНрддрд╛рдХреНрд╖рд░' ,
}
slice_name =
'tudresdenple_backup'api_url = "
% s : 443 / PLCAPI /"% plc_host
#api_url = "
% s / PLCAPI "% plc_host
plc_api = xmlrpclib.ServerProxy (api_url, allow_none = рд╕рд╣реА)
рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУ
"рдЕрдкрдиреЗ рд╕реНрд▓рд╛рдЗрд╕ рдиреЛрдбреНрд╕ рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:"рдиреЛрдбреНрд╕ = plc_api.GetNodes (рдореМрдЦрд┐рдХ, {}, [
'рдиреЛрдб_рдЖрдИрдбреА' ,
'рд╣реЛрд╕реНрдЯрдирд╛рдо' ,
'рдмреВрдЯ_рд╕реНрдЯреЗрдЯ' ])
рдиреЛрдбреНрд╕ рдХреЗ тЧП рд╡рд┐рдЬреЗрдЯ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ
рд╕рдВрд▓рдЧреНрди_рдиреЛрдбреНрд╕_рд┐рдбреНрд╕ = plc_api.GetSlices (рд╕рд┐рджреНрдзрд╛рдВрдд, [slice_name], [
'node_ids' ]] [0] [
'node_ids' ]
#obtain hostnames, рдЬреЛ {'hostname': ''} рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
рд╕рдВрд▓рдЧреНрди_рдиреЛрдбреНрд╕ = plc_api.GetNodes (рдореМрдЦрд┐рдХ, рд╕рдВрд▓рдЧреНрди_рдиреЛрдбреНрд╕_рдПрдбреНрд╕, [
'рд╣реЛрд╕реНрдЯрдирд╛рдо' ,
'рдмреВрдЯ_рд╕реНрдЯреЗрдЯ' ]]
# рдХрд╕реНрдЯрдо рд╣реЛрд╕реНрдЯрдирд╛рдо рдХреЗрд╡рд▓
have_nodes = []
рд╕рдВрд▓рдЧреНрди_рдиреЛрдбреНрд╕
рдореЗрдВ рдиреЛрдб рдХреЗ
рд▓рд┐рдП :
has_nodes.append (рдиреЛрдб [
'hostname' ])
рдиреЛрдб
рдореЗрдВ has_nodes рдХреЗ рд▓рд┐рдП:
рдиреЛрдб
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ# рдЕрдкрдиреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЛ рдмреВрдЯ рдХрд░реЗрдВ рдЬреЛ рдмреВрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛
"рд╕реНрд▓рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдЧреИрд░-рдмреВрдЯ рдиреЛрдбреНрд╕ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛:"to_delete = []
рд╕рдВрд▓рдЧреНрди_рдиреЛрдбреНрд╕
рдореЗрдВ node_record рдХреЗ
рд▓рд┐рдП :
рдЕрдЧрд░ node_record [
'boot_state' ]! =
'boot' :
to_delete.append (node_record [
'hostname' ])
in_delete рдХреЗ
рд▓рд┐рдП node_record:
рдиреЛрдб_рдХрд╛рд░реНрдб рдХреЛ
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ
# рдЙрди рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
num_of_deleted =
len (to_delete)
рдЕрдЧрд░ num_of_deleted> 0:
рд╕рдлрд▓рддрд╛ = plc_api.DeleteSliceFromNodes (рд╕рд╛рдорд╛рдиреНрдп, slice_name, to_delete)
рдпрджрд┐ рд╕рдлрд▓рддрд╛ == 1:
"рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмреВрдЯ рди тАЛтАЛрдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕" рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВрдФрд░ :
рдкреНрд░рд┐рдВрдЯ "рдЧреИрд░-рдмреВрдЯ рдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ!"sys.exit ()
рдФрд░ :
"рд╣рдЯрд╛рдиреЗ рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ"
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВsys.exit ()
# рд╣рдЯрд╛рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдорд╛рди рд╣реА рдЕрдм рдирдИ рд╕рдВрдЦреНрдпрд╛
"рдирдП рдмреВрдЯ рдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдирд╛"to_add = []
рдиреЛрдбреНрд╕
рдореЗрдВ рдиреЛрдб_рдХрд╛рд░реНрдб рдХреЗ
рд▓рд┐рдП :
рдЕрдЧрд░ num_of_deleted> 0:
num_of_deleted - = num_of_deleted
рдФрд░ :
рдмреНрд░реЗрдХ
рдЕрдЧрд░ (node_record [
'hostname' ] has_nodes
рдореЗрдВ рдирд╣реАрдВ рд╣реИ ) рдФрд░ node_record [
'boot_state' ] ==
'boot' :
to_add.append (node_record [
'hostname' ])
рдЕрдЧрд░ рд▓реЗрди (to_add)> 0:
рд╕рдлрд▓рддрд╛ = plc_api.AddSliceToNodes (рд╕рд╛рдорд╛рдиреНрдп, slice_name, to_add)
рдпрджрд┐ рд╕рдлрд▓рддрд╛ == 1:
рдкреНрд░рд┐рдВрдЯ "рд╕рдлрд▓рддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рдирдИ nbooted рдиреЛрдбреНрд╕"рдФрд░ :
рдкреНрд░рд┐рдВрдЯ "рдмреВрдЯ рдХрд┐рдП рдЧрдП рдиреЛрдбреНрд╕ рдХрд╛ рдирд╢рд╛ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ!"sys.exit ()
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ "рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЛрдб рдЬреЛрдбрд╝реЗ рдЧрдП:"in_add
рдореЗрдВ node_record рдХреЗ рд▓рд┐рдП:
рдиреЛрдб_рдХрд╛рд░реНрдб рдХреЛ
рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ