summaryrefslogtreecommitdiff
path: root/init.d/moztmp
blob: 1fbf7fba8c18d715dd61b854197dcee42e4d785d (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/sbin/runscript

depend() {
    # yes - we need 'swap' here
    # if this is omitted, swap will unmount our tmpfs -.-'
    need localmount swap
    after bootmisc
}

MOZ_MOUNT=${MOZ_MOUNT:-YES}
MOZ_MKDIR=${MOZ_MKDIR:-YES}
MOZ_MOUNTDIR=${MOZ_MOUNTDIR:-/tmp/moztmp/}
MOZ_DIR=${MOZ_DIR:-.mozilla}
MOZ_SAVEDIR=${MOZ_SAVEDIR:-.mozilla_save}

# Return the homedir of a user
homedir() {
    echo $(eval echo ~$1)
}

# Return the size needed for the ramdisk
# Adds up the size of the .mozilla dir for each user - or takes 50MB if it does not exist
# Finally doubles the size - just to be on the safe side ;)
get_size() {
    local size=0
    for u in ${MOZ_USERS}; do
        local dir="$(homedir $u)/${MOZ_DIR}"
        if [ -d "$dir" ]; then
            s=$(du -s "$dir" | cut -f 1)
            size=$(( size + s ))
        else 
            if [ -e "$dir" ]; then
                eerror "$dir is not a directory!"            
            else
                # save default: 50 MB
                size=$(( size + 51200 ))
            fi
        fi
    done

    size=$(( size * 2 ))
    veinfo "Taking ${size}k as the size."
    
    echo $size
}

# Move folder to mounted dir for one user
folder_to_mnt() {
    local user=$1
    local mdir="$(homedir $u)/${MOZ_DIR}"
    local sdir="$(homedir $u)/${MOZ_SAVEDIR}"
    local mntdir="${MOZ_MOUNTDIR}/${user}"

    if [ -e "$sdir" ]; then
        eerror "$sdir already existing. Skipping user $user."
        return 1
    else
      
        if [ -e "$mdir" ]; then
            [ ! -d "$mdir" ] && return 1
            mv "$mdir" "$sdir" || return 1
        fi
        
        if ! checkpath -d -o $user "$mntdir"; then
            [ -e "$sdir" ] && mv "$sdir" "$mdir"
            eerror "Creating moztmp directory failed."
            return 1
        fi
        
        if ! ln -s "$mntdir" "$mdir"; then
            rm -f "$mdir"
            [ -e "$sdir" ] && mv "$sdir" "$mdir"
            eerror "Linking failed"
            return 1
        fi
        
        einfo "Rsyncing"
        if ! rsync -qai --delete "$sdir/" "$mntdir" ; then
            rm -f "$mdir"
            [ -e "$sdir" ] && mv "$sdir" "$mdir"
            eerror "RSync failed"
            return 1
        fi

    fi

    return 0
}

# Moves folder from mnt back to the home dir
folder_to_home() {
    local user=$1
    local mdir="$(homedir $u)/$(service_get_value mozdir)"
    local sdir="$(homedir $u)/$(service_get_value mozsavedir)"
    local mntdir="$(service_get_value mountdir)/${user}"

    if [ ! -e "$mdir" ]; then
        eerror "$mdir is not existing. Skipping user $user".
        return 1
    fi

    if [ ! -L "$mdir" ]; then
        eerror "$mdir is not a link. Skipping user $user."
        return 1
    else
        rm "$mdir"
        einfo "Rsyncing"
        rsync -aiq --delete "$mntdir/" "$sdir/" || return 1
        mv "$sdir" "$mdir"
    fi

    return 0
}

stop() {

    local mountdir="$(service_get_value mountdir)"
    local ret=

    for u in $(service_get_value users); do
        ebegin "Deleting moztmp for user $u"
        eindent
        
        folder_to_home $u
        ret=$?

        eoutdent
        eend $ret
    done

    if yesno $(service_get_value mounted); then
        ebegin "Unmounting $mountdir"
        umount "${mountdir}"
        eend $?
    fi

    if yesno $(service_get_value mkdir); then
        rmdir "${mountdir}"
    fi
}

start() {

    local ret=

    # save values to have them during shutdown
    service_set_value users "$MOZ_USERS"
    service_set_value mountdir "$MOZ_MOUNTDIR"
    service_set_value mozdir "$MOZ_DIR"
    service_set_value mozsavedir "$MOZ_SAVEDIR"

    if yesno ${MOZ_MKDIR}; then
        checkpath -d "${MOZ_MOUNTDIR}"
        service_set_value mkdir YES
    else
        service_set_value mkdir NO
    fi

    if yesno ${MOZ_MOUNT} && ! mountinfo -q "${MOZ_MOUNTDIR}"; then
        local size=$(get_size)
        ebegin "Mounting ${MOZ_MOUNTDIR}"
        mount -t tmpfs -o size=${size}k tmpfs "${MOZ_MOUNTDIR}"
        eend $?
        
        service_set_value mounted YES
    else
        service_set_value mounted NO
    fi

    for u in ${MOZ_USERS}; do
        ebegin "Setting moztmp for user $u"
        eindent

        folder_to_mnt $u
        ret=$?
        
        eoutdent
        eend $ret
    done
            
    return 0
}

# vim:ft=gentoo-init-d