рддрд╛рдЬ рджреНрд╡рд╛рд░рд╛ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рд░реНрд╡рд░ рдХреНрд▓реЛрдирд┐рдВрдЧ

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди


рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди


рдХрд╛рдо рдбреЗрдмрд┐рдпрди рдЬреАрдПрдирдпреВ / рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рднреМрддрд┐рдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдХреНрд╕рд░ рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдХреНрд▓реЛрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХреНрд▓реЛрди рдХрд░рдирд╛ рдЕрдХреНрд╖рдо рд╣реИред рдиреЛрдЯ: рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рддрд░рдг рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХрд┐рд╕реА рднреА рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░


рдХрд╛рд░реНрдп


рдореБрдХреБрдЯ рджреНрд╡рд╛рд░рд╛ рд▓рдбрд╝рд╛рдХреВ рдорд╢реАрдиреЛрдВ рдХреЛ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдореЗрдВ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдПрдВред

рдХреНрдпрд╛ рд╣реБрдЖ?


virt_server> p2v.py foo full WORKING WITH SERVER: 'foo' READING CONFIG FOR 'foo' CHECKING LOCAL CONFIG CHECKING LOCAL CONFIG FOR 'foo' COMPLETED SUCCESSFULLY CHECKING REMOTE CONFIG CHECKING NODUMP FLAG: "lsattr -d /home/backupman/dumps | egrep '[\\w-]+d[\\w-]+[ ]/data/dumps'" CHECKING REMOTE DUMP: 'sudo /sbin/dump a0f /dev/null /dev/null' CHECKING IF WE ARE ABLE TO SSH TO: "ssh -T backupman@foo 'if [ -d /data/dumps ] ; then exit 0 ; else exit 1 ; fi'" CHECKING REMOTE CONFIG FOR 'foo' COMPLETED SUCCESSFULLY DUMPING FILESYSTEMS GETTING THE DUMPS STOPPING VM: foo2 MAKING FS TYPE: ext3 ON PARTITION: /dev/mapper/foo RESTORING DUMPS FOR: foo INSTALLING BOOTLOADER FOR: foo RESTORING CONFIG FOR: foo STARTING VM: /etc/xen/foo.xm 

рдХреИрд╕реЗ рдХрд┐рдпрд╛


рд▓рдбрд╝рд╛рдИ рд╕рд░реНрд╡рд░ рдХреНрд▓реЛрдирд┐рдВрдЧ


рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдмрд╕реЗ рддреЗрдЬреА рд╕реЗ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рд▓рдбрд╝рд╛рдХреВ рд╕рд░реНрд╡рд░ рдХреЛ рдХреНрд▓реЛрди рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ:

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

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рд░реНрд╡рд░ virt_server , рд╕рд╛рде рд╣реА рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рднреМрддрд┐рдХ рд╕рд░реНрд╡рд░ server1 ред

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, server1 backupman рдкрд░ backupman рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдЙрд╕реЗ backupman sudo dump рдЕрдиреБрдорддрд┐ рджреЗрдВред virt_server рдЖрдкрдХреЛ backupman@server1 рдкрд░ рдореБрдЦреНрдп рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред virt_server рд╣рдо рд╕рдм рдХреБрдЫ рдЬрдбрд╝ рд╕реЗ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдХрдВрд╕реЛрд▓ рд╕реЗ рдХреНрд▓реЛрдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 root@virt_server> xm destroy server1 root@virt_server> ssh backupman@server1 backupman@server1$ sudo dump -a0f /dumps/server1.root / backupman@server1$ for i in var usr home ; do sudo dump a0f /dumps/server1.$i /$i ; done backupman@server1$ exit root@virt_server> scp backupman@server1:/dumps/server1.* /dumps/server1/ root@virt_server> mkfs.ext4 /dev/mapper/server1 root@virt_server> mount /dev/mapper/server1 /mnt/server1 root@virt_server> cd /mnt/server1 root@virt_server> restore -rf /dumps/server1.root root@virt_server> for i in var usr home ; do cd /mnt/$i && restore /dumps/server1.$i ; done root@virt_server> dd if=/usr/share/syslinux/mbr.bin of=/dev/mapper/server1 root@virt_server> extlinux --install /dev/mapper/server1 root@virt_server> scp -R /dumps/server1/cfg/* /mnt/server root@virt_server> xm start server1.xm 

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рди


рдЕрдм рдЬрдм рд╕рд░реНрд╡рд░ рдХреНрд▓реЛрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓реЛрди рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рд░реНрд╡рд░ рдкрд░, рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:

рдХреНрд▓реЛрди рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдкрд░, рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:

рд▓рд┐рдкрд┐ рд╡рд┐рдиреНрдпрд╛рд╕


рдорд╛рдирдХ .ini рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 [server1] vm_config = /etc/xen/server1.xm vm_name = server1 ssh = backupman@server1.site scp = backupman@server1.site dumps_list = /,/var,/usr,/home remote_dumps_dir = /home/bakupman/dumps local_dumps_dir = /dumps/server1 mount_dir = /mnt/server1 partition = /dev/mapper/server1 fs = ext3 

ssh рдФрд░ scp рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрд░рдорд╢рдГ ssh рдФрд░ scp рдХреЙрд▓реНрд╕ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпреЗ рджреЛрдиреЛрдВ рддрдм рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ ssh рдкреЛрд░реНрдЯ рдХреЛ -p рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ scp , рд╕реНрд╡рд┐рдЪ рдХреЛ -P рд╕рд╛рде рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реА


рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рджреЗрдЦрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧреАрдереВрдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╕рд░реНрд╡рд░ рдирд╛рдо, рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреВрд░реНрдг рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдбрдВрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореМрдЬреВрджрд╛ рдбрдВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 def main(): """Main function, calls all other ones""" if len(sys.argv) < 3: sys.exit('Usage: %s <servername> <action> (check|full|dump|get|restore)' % sys.argv[0]) server = sys.argv[1] action = sys.argv[2] print "\nWORKING WITH SERVER: %r\n" % server if action == "check": try: conf=read_config(server) check_config_local(conf) check_config_remote(conf except Exception, e: sys.exit("\nERROR: %r\n" % e) elif action == "full": try: conf=read_config(server) check_config_local(conf) check_config_remote(conf) stop_vm(conf) dump_physical(conf) get_dumps(conf) restore_vm(conf) install_bootloader(conf) restore_config(conf) start_vm(conf) except Exception, e: cleanup(conf) sys.exit("\nERROR: %r\n" % e) <...> 

рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХрд╛рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреВрд░реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕рдмрд╕реЗ "рдХрдард┐рди" рд╣рд┐рд╕реНрд╕рд╛ рдЬрд╛рдБрдЪ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

 def check_config_local(conf): """Checks config by trying to ssh, checking existence of local and remote folders, destination partition, mount point, and remote dump utility""" print "\nCHECKING LOCAL CONFIG\n" # check for ensuring we won't delete accidentaly specified host os parittion if conf['partition'] == "/dev/sda" or conf['partition'] == "/dev/sda1" or \ conf['partition'] == "/dev/sda2" or conf['partition'] == "/dev/sda3" or \ conf['partition'] == "/dev/sda4" or conf['partition'] == "/dev/sda5": raise Exception, "DON'T KILL THE SERVER! %S IS A SYSTEM PARTITION!!" % conf['partition'] 

рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕рд░реНрд╡рд░ рдкрд░ рдореЗрд░рд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЗрди рд╡рд░реНрдЧреЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, LVM рд╕реНрд╡рдпрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд╛рдорд┐рдд рд╡рд┐рднрд╛рдЬрди рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЖрдХрд╕реНрдорд┐рдХ рд╡рд┐рдирд╛рд╢ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рднрд╛рдЬрди рдпрд╣рд╛рдВ рджрд░реНрдЬ рдХрд░реЗрдВред

GitHub


рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдВ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИ: github.com/sistemshik/p2v

Source: https://habr.com/ru/post/In144655/


All Articles