summaryrefslogtreecommitdiffstats
path: root/cobbler/action_reposync.py
blob: 80899009d99c15da9f6ae1b6e145f0011f70d659 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
Builds out and synchronizes yum repo mirrors.
Initial support for rsync, perhaps reposync coming later.

Copyright 2006, Red Hat, Inc
Michael DeHaan <mdehaan@redhat.com>

This software may be freely redistributed under the terms of the GNU
general public license.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
"""

import os
import os.path
import shutil
import time
import yaml # Howell-Clark version
import sub_process
import sys

import utils
import cobbler_msg
import cexceptions
import traceback
import errno



class RepoSync:
    """
    Handles conversion of internal state to the tftpboot tree layout
    """

    def __init__(self,config):
        """
        Constructor
        """
        self.verbose  = True
        self.config   = config
        self.distros  = config.distros()
        self.profiles = config.profiles()
        self.systems  = config.systems()
        self.settings = config.settings()
        self.repos    = config.repos()

    def run(self,dryrun=False,verbose=True):
        """
        Syncs the current repo configuration file with the filesystem.
        """

        self.verbose = verbose
        self.dryrun = dryrun
        for repo in self.repos:
            print "considering: %s" % repo
            repo_path = os.path.join(repo.root, repo.name)
            mirror = repo.mirror
            if not os.path.isdir(repo_path):
                try:
                    os.makedirs(repo_path)
                except OSError, oe:
                    if not oe.errno == 17: # already exists, constant for this?
                        raise cexceptions.CobblerException("no_create", repo_path)
            if mirror.startswith("rsync://") or mirror.startswith("ssh://"):
                self.do_rsync_repo(repo)
            else:
                raise cexceptions.CobblerException("no_mirror")

        return True
   
    def do_rsync_repo(self,repo):
        if not repo.keep_updated:
            print "- %s is set to not be updated"
            return True
        print "imagine an rsync happened here, and that it was amazing..."
        dest_path = os.path.join(self.settings.webdir, "repo_mirror", repo.name)
        spacer = ""
        if repo.mirror.find("ssh://") != -1:
            spacer = "-e ssh"
        cmd = "rsync -av %s --exclude=debug/ %s %s" % (spacer, repo.mirror, dest_path)       
        print "executing: %s" % cmd
        rc = sub_process.call(cmd, shell=True)